diff --git a/.idea/lib_um_crypto.iml b/.idea/lib_um_crypto.iml
index b1d8e6c..2a9d528 100644
--- a/.idea/lib_um_crypto.iml
+++ b/.idea/lib_um_crypto.iml
@@ -7,6 +7,7 @@
+
diff --git a/Cargo.lock b/Cargo.lock
index 06fb395..f39033c 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -152,6 +152,17 @@ version = "1.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0"
+[[package]]
+name = "getrandom"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "wasi",
+]
+
[[package]]
name = "heck"
version = "0.5.0"
@@ -182,6 +193,12 @@ dependencies = [
"wasm-bindgen",
]
+[[package]]
+name = "libc"
+version = "0.2.158"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439"
+
[[package]]
name = "log"
version = "0.4.22"
@@ -204,6 +221,15 @@ version = "1.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
+[[package]]
+name = "ppv-lite86"
+version = "0.2.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04"
+dependencies = [
+ "zerocopy",
+]
+
[[package]]
name = "proc-macro2"
version = "1.0.86"
@@ -222,6 +248,36 @@ dependencies = [
"proc-macro2",
]
+[[package]]
+name = "rand"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
+dependencies = [
+ "libc",
+ "rand_chacha",
+ "rand_core",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
+dependencies = [
+ "ppv-lite86",
+ "rand_core",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
+dependencies = [
+ "getrandom",
+]
+
[[package]]
name = "same-file"
version = "1.0.6"
@@ -260,6 +316,16 @@ dependencies = [
"unicode-ident",
]
+[[package]]
+name = "tc_tea"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cab26285e70ee5cbec8582c76b8124dfe65b564b43dad14b9caca6fd127d66d2"
+dependencies = [
+ "rand",
+ "rand_chacha",
+]
+
[[package]]
name = "thiserror"
version = "1.0.63"
@@ -288,6 +354,7 @@ dependencies = [
"clap",
"umc_kuwo",
"umc_qmc",
+ "umc_utils",
]
[[package]]
@@ -307,9 +374,9 @@ name = "umc_kuwo"
version = "0.1.0"
dependencies = [
"anyhow",
- "base64",
"itertools",
"thiserror",
+ "umc_utils",
]
[[package]]
@@ -317,10 +384,18 @@ name = "umc_qmc"
version = "0.1.0"
dependencies = [
"anyhow",
- "base64",
"byteorder",
"itertools",
+ "tc_tea",
"thiserror",
+ "umc_utils",
+]
+
+[[package]]
+name = "umc_utils"
+version = "0.1.0"
+dependencies = [
+ "base64",
]
[[package]]
@@ -345,6 +420,12 @@ dependencies = [
"winapi-util",
]
+[[package]]
+name = "wasi"
+version = "0.11.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+
[[package]]
name = "wasm-bindgen"
version = "0.2.93"
@@ -538,3 +619,24 @@ name = "windows_x86_64_msvc"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
+
+[[package]]
+name = "zerocopy"
+version = "0.7.35"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
+dependencies = [
+ "byteorder",
+ "zerocopy-derive",
+]
+
+[[package]]
+name = "zerocopy-derive"
+version = "0.7.35"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
diff --git a/um_crypto/kuwo/Cargo.toml b/um_crypto/kuwo/Cargo.toml
index 24ec27d..680d3a0 100644
--- a/um_crypto/kuwo/Cargo.toml
+++ b/um_crypto/kuwo/Cargo.toml
@@ -4,7 +4,7 @@ version = "0.1.0"
edition = "2021"
[dependencies]
-base64 = "0.22.1"
-itertools = "0.13.0"
anyhow = "1.0.86"
+itertools = "0.13.0"
thiserror = "1.0.63"
+umc_utils = { path = "../utils" }
diff --git a/um_crypto/kuwo/src/des/mod.rs b/um_crypto/kuwo/src/des/mod.rs
index be903db..998fb0d 100644
--- a/um_crypto/kuwo/src/des/mod.rs
+++ b/um_crypto/kuwo/src/des/mod.rs
@@ -1,22 +1,14 @@
use anyhow::Result;
-use base64::alphabet;
-use base64::engine::{DecodePaddingMode, GeneralPurpose as Base64Engine, GeneralPurposeConfig};
-use base64::prelude::*;
mod constants;
mod core;
mod helper;
use core::{KuwoDes, Mode};
-
-/// Don't add padding when encoding, and require no padding when decoding.
-const B64: Base64Engine = Base64Engine::new(
- &alphabet::STANDARD,
- GeneralPurposeConfig::new().with_decode_padding_mode(DecodePaddingMode::Indifferent),
-);
+use umc_utils::base64;
/// Decrypt string content
pub fn decrypt_ksing(data: &str, key: &[u8; 8]) -> Result {
- let mut decoded = B64.decode(data)?;
+ let mut decoded = base64::decode(data)?;
let des = KuwoDes::new(key, Mode::Decrypt);
des.transform(&mut decoded[..])?;
@@ -35,7 +27,7 @@ pub fn encrypt_ksing>(data: T, key: &[u8; 8]) -> Result {
let des = KuwoDes::new(key, Mode::Encrypt);
des.transform(&mut data[..])?;
- Ok(B64.encode(data))
+ Ok(base64::encode(data))
}
pub fn decode_ekey(data: &str, key: &[u8; 8]) -> Result {
diff --git a/um_crypto/utils/Cargo.toml b/um_crypto/utils/Cargo.toml
new file mode 100644
index 0000000..71b9d4a
--- /dev/null
+++ b/um_crypto/utils/Cargo.toml
@@ -0,0 +1,7 @@
+[package]
+name = "umc_utils"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
+base64 = "0.22.1"
diff --git a/um_crypto/utils/src/base64.rs b/um_crypto/utils/src/base64.rs
new file mode 100644
index 0000000..5d38f52
--- /dev/null
+++ b/um_crypto/utils/src/base64.rs
@@ -0,0 +1,22 @@
+use base64::engine::{DecodePaddingMode, GeneralPurpose as Base64Engine, GeneralPurposeConfig};
+use base64::{alphabet, DecodeError, Engine};
+
+/// Don't add padding when encoding, and require no padding when decoding.
+pub const ENGINE: Base64Engine = Base64Engine::new(
+ &alphabet::STANDARD,
+ GeneralPurposeConfig::new().with_decode_padding_mode(DecodePaddingMode::Indifferent),
+);
+
+pub fn encode(data: T) -> String
+where
+ T: AsRef<[u8]>,
+{
+ ENGINE.encode(data)
+}
+
+pub fn decode(data: T) -> Result, DecodeError>
+where
+ T: AsRef<[u8]>,
+{
+ ENGINE.decode(data)
+}
diff --git a/um_crypto/utils/src/lib.rs b/um_crypto/utils/src/lib.rs
new file mode 100644
index 0000000..39abdce
--- /dev/null
+++ b/um_crypto/utils/src/lib.rs
@@ -0,0 +1 @@
+pub mod base64;