From 75ebe1e63173939643e94cc9bf4927f6dc143426 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=B2=81=E6=A0=91=E4=BA=BA?= Date: Mon, 16 Sep 2024 21:03:46 +0100 Subject: [PATCH] [kwm] refactor: move Decipher new fn under struct --- um_crypto/kuwo/src/lib.rs | 37 +++++++++++++++++-------------------- um_wasm/src/exports/kuwo.rs | 6 +++--- 2 files changed, 20 insertions(+), 23 deletions(-) diff --git a/um_crypto/kuwo/src/lib.rs b/um_crypto/kuwo/src/lib.rs index 13f93d4..4a1e3d2 100644 --- a/um_crypto/kuwo/src/lib.rs +++ b/um_crypto/kuwo/src/lib.rs @@ -43,19 +43,32 @@ impl fmt::Display for HeaderMagicBytes { pub const DATA_START_OFFSET: usize = 0x400; -pub enum Cipher { +pub enum Decipher { V1(CipherV1), V2(CipherV2), } -impl Cipher { +impl Decipher { + pub fn new>(header: &Header, ekey: Option) -> Result { + let cipher = match header.version { + 1 => Decipher::V1(CipherV1::new(header.resource_id)), + 2 => match ekey { + Some(ekey) => Decipher::V2(CipherV2::new_from_ekey(ekey)?), + None => Err(KuwoCryptoError::V2EKeyRequired)?, + }, + version => Err(KuwoCryptoError::UnsupportedVersion(version as usize))?, + }; + + Ok(cipher) + } + pub fn decrypt(&self, data: &mut T, offset: usize) where T: AsMut<[u8]> + ?Sized, { match self { - Cipher::V1(cipher) => cipher.decrypt(data, offset), - Cipher::V2(cipher) => cipher.decrypt(data, offset), + Decipher::V1(cipher) => cipher.decrypt(data, offset), + Decipher::V2(cipher) => cipher.decrypt(data, offset), } } } @@ -105,22 +118,6 @@ impl Header { }) } - pub fn get_decipher(&self, ekey: Option) -> Result - where - T: AsRef<[u8]>, - { - let cipher = match self.version { - 1 => Cipher::V1(CipherV1::new(self.resource_id)), - 2 => match ekey { - Some(ekey) => Cipher::V2(CipherV2::new_from_ekey(ekey)?), - None => Err(KuwoCryptoError::V2EKeyRequired)?, - }, - version => Err(KuwoCryptoError::UnsupportedVersion(version as usize))?, - }; - - Ok(cipher) - } - /// Get the quality id /// Used for matching Android MMKV id. pub fn get_quality_id(&self) -> u32 { diff --git a/um_wasm/src/exports/kuwo.rs b/um_wasm/src/exports/kuwo.rs index 1e9d875..49f129a 100644 --- a/um_wasm/src/exports/kuwo.rs +++ b/um_wasm/src/exports/kuwo.rs @@ -1,7 +1,7 @@ use crate::errors::map_js_error; use crate::exports::qmc::JsQMC2; use umc_kuwo::kwm_v1::CipherV1; -use umc_kuwo::{Cipher, Header}; +use umc_kuwo::{Decipher, Header}; use wasm_bindgen::prelude::wasm_bindgen; use wasm_bindgen::JsError; @@ -27,7 +27,7 @@ impl JsKuwoHeader { /// Create an instance of cipher (decipher) for decryption #[wasm_bindgen(js_name=makeDecipher)] pub fn make_decipher(&self, ekey: Option) -> Result { - let cipher = self.0.get_decipher(ekey).map_err(map_js_error)?; + let cipher = Decipher::new(&self.0, ekey).map_err(map_js_error)?; Ok(JsCipher(cipher)) } } @@ -59,7 +59,7 @@ pub fn js_kuwo_v2_cipher_factory(ekey: &str) -> Result { /// Common V1/V2 wrapper interface, derived from `KuwoHeader.makeCipher` #[wasm_bindgen(js_name=KWMCipher)] -pub struct JsCipher(Cipher); +pub struct JsCipher(Decipher); #[wasm_bindgen(js_class=KWMCipher)] impl JsCipher {