mirror of
https://git.um-react.app/um/lib_um_crypto_rust.git
synced 2026-03-08 04:29:54 +00:00
chore: bump tc_tea version
This commit is contained in:
@@ -7,6 +7,7 @@ edition = "2021"
|
||||
anyhow = "1.0.86"
|
||||
byteorder = "1.5.0"
|
||||
itertools = "0.13.0"
|
||||
tc_tea = { version = "0.1.4", default-features = false, features = [] }
|
||||
lazy_static = "1.5.0"
|
||||
tc_tea = { version = "0.2.0", default-features = false }
|
||||
thiserror = "1.0.63"
|
||||
umc_utils = { path = "../utils" }
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
use anyhow::Result;
|
||||
use itertools::Itertools;
|
||||
use lazy_static::lazy_static;
|
||||
use std::ops::Mul;
|
||||
use tc_tea::TcTeaError;
|
||||
use thiserror::Error;
|
||||
use umc_utils::base64;
|
||||
|
||||
@@ -13,14 +15,18 @@ const EKEY_V2_KEY2: [u8; 16] = [
|
||||
0x2A, 0x2A, 0x23, 0x21, 0x28, 0x23, 0x24, 0x25, 0x26, 0x5E, 0x61, 0x31, 0x63, 0x5A, 0x2C, 0x54,
|
||||
];
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Error)]
|
||||
lazy_static! {
|
||||
static ref EKEY_SIMPLE_KEY: [u8; 8] = make_simple_key::<8>();
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq, Error)]
|
||||
pub enum EKeyDecryptError {
|
||||
#[error("EKey is too short for decryption")]
|
||||
EKeyTooShort,
|
||||
#[error("Error when decrypting ekey v1")]
|
||||
FailDecryptV1,
|
||||
#[error("Error when decrypting ekey v2")]
|
||||
FailDecryptV2,
|
||||
#[error("Error when decrypting ekey v1: {0}")]
|
||||
FailDecryptV1(TcTeaError),
|
||||
#[error("Error when decrypting ekey v2: {0}")]
|
||||
FailDecryptV2(TcTeaError),
|
||||
}
|
||||
|
||||
fn make_simple_key<const N: usize>() -> [u8; N] {
|
||||
@@ -44,21 +50,21 @@ pub fn decrypt_v1(ekey: &[u8]) -> Result<Box<[u8]>> {
|
||||
let ekey = base64::decode(ekey)?;
|
||||
let (header, cipher) = ekey.split_at(8);
|
||||
|
||||
let simple_key = make_simple_key::<8>();
|
||||
let tea_key = simple_key
|
||||
// tea_key: interleave a byte from each stream
|
||||
let tea_key = EKEY_SIMPLE_KEY
|
||||
.iter()
|
||||
.zip(header)
|
||||
.flat_map(|(&simple_part, &header_part)| [simple_part, header_part])
|
||||
.collect::<Vec<_>>();
|
||||
.flat_map(|(&simple_key_part, &header_part)| [simple_key_part, header_part])
|
||||
.collect_vec();
|
||||
|
||||
let plaintext = tc_tea::decrypt(cipher, tea_key).ok_or(EKeyDecryptError::FailDecryptV1)?;
|
||||
let plaintext = tc_tea::decrypt(cipher, tea_key).map_err(EKeyDecryptError::FailDecryptV1)?;
|
||||
Ok([header, &plaintext].concat().into())
|
||||
}
|
||||
|
||||
pub fn decrypt_v2(ekey: &[u8]) -> Result<Box<[u8]>> {
|
||||
let ekey = base64::decode(ekey)?;
|
||||
let ekey = tc_tea::decrypt(ekey, EKEY_V2_KEY1).ok_or(EKeyDecryptError::FailDecryptV2)?;
|
||||
let ekey = tc_tea::decrypt(ekey, EKEY_V2_KEY2).ok_or(EKeyDecryptError::FailDecryptV2)?;
|
||||
let ekey = tc_tea::decrypt(ekey, EKEY_V2_KEY1).map_err(EKeyDecryptError::FailDecryptV2)?;
|
||||
let ekey = tc_tea::decrypt(ekey, EKEY_V2_KEY2).map_err(EKeyDecryptError::FailDecryptV2)?;
|
||||
let ekey = ekey.iter().take_while(|&&b| b != 0).copied().collect_vec();
|
||||
|
||||
decrypt_v1(&ekey)
|
||||
|
||||
Reference in New Issue
Block a user