mirror of
https://git.um-react.app/um/lib_um_crypto_rust.git
synced 2026-03-08 04:29:54 +00:00
refactor: unify qmc2 decrypt api
This commit is contained in:
@@ -1,5 +1,9 @@
|
||||
use crate::v2_map::QMC2Map;
|
||||
use crate::v2_rc4::cipher::QMC2RC4;
|
||||
use anyhow::Result;
|
||||
use thiserror::Error;
|
||||
|
||||
pub mod ekey;
|
||||
pub mod footer;
|
||||
pub mod v1;
|
||||
pub mod v2_map;
|
||||
@@ -11,6 +15,36 @@ pub enum QmcCryptoError {
|
||||
QMCV2MapKeyEmpty,
|
||||
}
|
||||
|
||||
pub enum QMCv2Cipher {
|
||||
MapL(QMC2Map),
|
||||
RC4(QMC2RC4),
|
||||
}
|
||||
|
||||
impl QMCv2Cipher {
|
||||
pub fn new<T>(key: T) -> Result<Self>
|
||||
where
|
||||
T: AsRef<[u8]>,
|
||||
{
|
||||
let key = key.as_ref();
|
||||
let cipher = match key.len() {
|
||||
0 => Err(QmcCryptoError::QMCV2MapKeyEmpty)?,
|
||||
..=300 => QMCv2Cipher::MapL(QMC2Map::new(key)?),
|
||||
_ => QMCv2Cipher::RC4(QMC2RC4::new(key)),
|
||||
};
|
||||
Ok(cipher)
|
||||
}
|
||||
|
||||
pub fn decrypt<T>(&self, data: &mut T, offset: usize)
|
||||
where
|
||||
T: AsMut<[u8]> + ?Sized,
|
||||
{
|
||||
match self {
|
||||
QMCv2Cipher::MapL(cipher) => cipher.decrypt(data, offset),
|
||||
QMCv2Cipher::RC4(cipher) => cipher.decrypt(data, offset),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
pub fn generate_key(len: usize) -> Vec<u8> {
|
||||
|
||||
Reference in New Issue
Block a user