From f2d0daf60deac64f32b4d74adf26421b52a8f71d Mon Sep 17 00:00:00 2001 From: mokurin000 <1348292515a@gmail.com> Date: Thu, 31 Jul 2025 12:36:59 +0800 Subject: [PATCH] perf: add back zero-copy decode for mai 1.50 --- sdgb-api/src/title/encryption/mod.rs | 25 ++++++------------------- sdgb-api/src/title/mod.rs | 2 +- 2 files changed, 7 insertions(+), 20 deletions(-) diff --git a/sdgb-api/src/title/encryption/mod.rs b/sdgb-api/src/title/encryption/mod.rs index 4ea02d7..fc33094 100644 --- a/sdgb-api/src/title/encryption/mod.rs +++ b/sdgb-api/src/title/encryption/mod.rs @@ -12,8 +12,8 @@ use crate::error::ApiError; use crate::title::{MaiVersion, MaiVersionExt, Sdgb1_40, Sdgb1_50}; impl MaiVersionExt for Sdgb1_40 { - fn decode(data: impl AsRef<[u8]>) -> Result, ApiError> { - let mut decompressed = decompress(data.as_ref()); + fn decode(mut data: impl AsMut<[u8]>) -> Result, ApiError> { + let mut decompressed = decompress(data.as_mut()); if decompressed.is_empty() { return Err(ApiError::EmptyResponse); } @@ -41,19 +41,13 @@ impl MaiVersionExt for Sdgb1_40 { } impl MaiVersionExt for Sdgb1_50 { - fn decode(data: impl AsRef<[u8]>) -> Result, ApiError> { - let mut data = data.as_ref().to_vec(); - if data.is_empty() { + fn decode(mut data: impl AsMut<[u8]>) -> Result, ApiError> { + if data.as_mut().is_empty() { return Err(ApiError::EmptyResponse); } - if data.len() % 16 != 0 { - let pad = 16 - (data.len() % 16); - data.resize(data.len() + pad, pad as _); - } - - debug!("data size: {}", data.len()); - let decrypted = decrypt_vec(&data, Self::AES_KEY, Self::AES_IV)?; + debug!("data size: {}", data.as_mut().len()); + let decrypted = decrypt(&mut data, Self::AES_KEY, Self::AES_IV)?; Ok(decompress(decrypted)) } @@ -111,13 +105,6 @@ fn decrypt<'ct>( Ok(result) } -fn decrypt_vec(data: impl AsRef<[u8]>, key: &[u8; 32], iv: &[u8; 16]) -> Result, ApiError> { - let key = GenericArray::from_slice(key); - let iv = GenericArray::from_slice(iv); - let decryptor = Aes256CbcDec::new(key, iv); - Ok(decryptor.decrypt_padded_vec_mut::(data.as_ref())?) -} - #[cfg(test)] mod _tests { diff --git a/sdgb-api/src/title/mod.rs b/sdgb-api/src/title/mod.rs index eb5a66f..619eda0 100644 --- a/sdgb-api/src/title/mod.rs +++ b/sdgb-api/src/title/mod.rs @@ -25,7 +25,7 @@ pub trait MaiVersion { pub trait MaiVersionExt: MaiVersion { fn encode(data: impl AsRef<[u8]>) -> Result, ApiError>; - fn decode(data: impl AsRef<[u8]>) -> Result, ApiError>; + fn decode(data: impl AsMut<[u8]>) -> Result, ApiError>; fn api_hash(api: APIMethod) -> String { let api_name: &str = api.into();