feat: abstract method to perform action
This commit is contained in:
@@ -3,6 +3,7 @@ use std::io::{Read, Write as _};
|
||||
use aes::cipher::{
|
||||
BlockDecryptMut, BlockEncryptMut, BlockSizeUser, KeyIvInit, block_padding::Pkcs7,
|
||||
};
|
||||
|
||||
use digest::generic_array::GenericArray;
|
||||
use flate2::write::ZlibEncoder;
|
||||
use flate2::{Compression, read::ZlibDecoder};
|
||||
@@ -12,6 +13,20 @@ use crate::title::{MaiVersion, MaiVersionExt, Sdgb1_40, Sdgb1_50, error::ApiErro
|
||||
impl MaiVersionExt for Sdgb1_40 {
|
||||
fn decode(mut data: impl AsMut<[u8]>) -> Result<Vec<u8>, ApiError> {
|
||||
let mut decompressed = decompress(data.as_mut());
|
||||
if decompressed.is_empty() {
|
||||
return Err(ApiError::EmptyResponse);
|
||||
}
|
||||
|
||||
let orig_len = decompressed.len();
|
||||
|
||||
let remain = 16 - decompressed.len() % 16;
|
||||
|
||||
if
|
||||
// weird but nessacary for Rust Pkcs7
|
||||
remain != 16 {
|
||||
decompressed.resize(remain + orig_len, remain as _);
|
||||
}
|
||||
|
||||
let unpad_size = decrypt(&mut decompressed, Self::AES_KEY, Self::AES_IV)?.len();
|
||||
decompressed.truncate(unpad_size);
|
||||
Ok(decompressed)
|
||||
@@ -26,6 +41,10 @@ impl MaiVersionExt for Sdgb1_40 {
|
||||
|
||||
impl MaiVersionExt for Sdgb1_50 {
|
||||
fn decode(mut data: impl AsMut<[u8]>) -> Result<Vec<u8>, ApiError> {
|
||||
if data.as_mut().is_empty() {
|
||||
return Err(ApiError::EmptyResponse);
|
||||
}
|
||||
|
||||
let decrypted = decrypt(&mut data, Self::AES_KEY, Self::AES_IV)?;
|
||||
let decompressed = decompress(decrypted);
|
||||
Ok(decompressed)
|
||||
|
||||
Reference in New Issue
Block a user