use std::{fmt::Display, io::Read};
use aes::{
Aes256,
cipher::{BlockDecryptMut, KeyIvInit, block_padding::NoPadding},
};
use byteorder::{BigEndian, ByteOrder};
use cbc::Decryptor;
use flate2::read::ZlibDecoder;
use crate::EncryptionMethod;
type Aes256Cbc = Decryptor<Aes256>;
#[derive(Debug, Clone)]
pub enum DecryptionError {
InvalidKey,
InvalidData,
UnknownMethod,
InternalError {
message: String,
},
}
impl Display for DecryptionError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
DecryptionError::InvalidKey => write!(f, "Invalid decryption key provided"),
DecryptionError::InvalidData => write!(
f,
"Invalid data provided. It does not follow the expected binary structure."
),
DecryptionError::UnknownMethod => write!(f, "Unknown or unsupported encryption method"),
DecryptionError::InternalError { message } => write!(f, "{}", message),
}
}
}
pub fn decrypt(data: &[u8], key: &[u8]) -> Result<Vec<u8>, DecryptionError> {
if data.is_empty() {
return Ok(vec![0; 0]);
}
if data.len() < 2 {
return Err(DecryptionError::InvalidData);
}
let method_u16 = BigEndian::read_u16(&data[0..2]);
let method = match EncryptionMethod::from_u16(method_u16) {
Ok(m) => m,
Err(_) => {
return Err(DecryptionError::UnknownMethod);
}
};
match method {
EncryptionMethod::Aes256Zip => decrypt_aes_cbc_zip(data, key),
EncryptionMethod::Aes256Flat => decrypt_aes_cbc_flat(data, key),
}
}
const AES_IV_SIZE: usize = 16;
const EXPECTED_DECRYPTED_DATA_MIN_SIZE: usize = 2 + 4 + AES_IV_SIZE + 1;
fn decrypt_aes_cbc_flat(data: &[u8], key: &[u8]) -> Result<Vec<u8>, DecryptionError> {
if key.len() != 32 {
return Err(DecryptionError::InvalidKey);
}
if data.len() < EXPECTED_DECRYPTED_DATA_MIN_SIZE {
return Err(DecryptionError::InvalidData);
}
let pre_encoded_data_length = BigEndian::read_u32(&data[2..6]) as usize;
let iv = &data[6..6 + AES_IV_SIZE];
let cipher_text = &data[6 + AES_IV_SIZE..];
if pre_encoded_data_length > cipher_text.len() {
return Err(DecryptionError::InvalidData);
}
let cypher = Aes256Cbc::new(key.into(), iv.into());
let mut plain_text = cipher_text.to_vec();
if let Err(e) = cypher.decrypt_padded_mut::<NoPadding>(&mut plain_text) {
return Err(DecryptionError::InternalError {
message: e.to_string(),
});
}
Ok(plain_text[0..pre_encoded_data_length].to_vec())
}
fn decrypt_aes_cbc_zip(data: &[u8], key: &[u8]) -> Result<Vec<u8>, DecryptionError> {
if key.len() != 32 {
return Err(DecryptionError::InvalidKey);
}
if data.len() < EXPECTED_DECRYPTED_DATA_MIN_SIZE {
return Err(DecryptionError::InvalidData);
}
let pre_encoded_data_length = BigEndian::read_u32(&data[2..6]) as usize;
let iv = &data[6..6 + AES_IV_SIZE];
let cipher_text = &data[6 + AES_IV_SIZE..];
if pre_encoded_data_length > cipher_text.len() {
return Err(DecryptionError::InvalidData);
}
let cypher = Aes256Cbc::new(key.into(), iv.into());
let mut plain_text = cipher_text.to_vec();
if let Err(e) = cypher.decrypt_padded_mut::<NoPadding>(&mut plain_text) {
return Err(DecryptionError::InternalError {
message: e.to_string(),
});
}
plain_text = plain_text[0..pre_encoded_data_length].to_vec();
let mut decompressor = ZlibDecoder::new(plain_text.as_slice());
let mut decompressed_data: Vec<u8> = Vec::new();
if let Err(e) = decompressor.read_to_end(&mut decompressed_data) {
return Err(DecryptionError::InternalError {
message: e.to_string(),
});
}
Ok(decompressed_data)
}
#[cfg(test)]
mod tests {
use base64::{Engine, prelude::BASE64_STANDARD};
use super::*;
#[test]
fn test_decryption_flat() {
let key: &[u8] = &[0x01; 32];
let data = get_big_data();
let encrypted = get_big_data_encrypted_flat();
let decrypted = decrypt(&encrypted, key).unwrap();
assert_eq!(decrypted.as_slice(), data.as_slice());
}
#[test]
fn test_decryption_zip() {
let key: &[u8] = &[0x01; 32];
let data = get_big_data();
let encrypted = get_big_data_encrypted_zip();
let decrypted = decrypt(&encrypted, key).unwrap();
assert_eq!(decrypted.as_slice(), data.as_slice());
}
fn get_big_data() -> Vec<u8> {
BASE64_STANDARD
.decode(
[
"CkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNj",
"aW5nIGVsaXQuIE1vcmJpIG5vbiBtaSBlbGl0LiBQcm9pbiBzdXNjaXBpdCBsZWN0",
"dXMgc2l0IGFtZXQgc2VtIHB1bHZpbmFyIHRpbmNpZHVudC4gRG9uZWMgaW4gbWV0",
"dXMgdXQgbnVuYyBjb25kaW1lbnR1bSBwb3J0dGl0b3Igdml0YWUgZXQgbGFjdXMu",
"IFZlc3RpYnVsdW0gZWdldCBkaWFtIHNlZCBwdXJ1cyB0ZW1wb3IgcG9ydHRpdG9y",
"LiBEb25lYyBzY2VsZXJpc3F1ZSB2aXRhZSBlcm9zIGVnZXQgZ3JhdmlkYS4gQWxp",
"cXVhbSB0ZW1wb3IgbnVsbGEgc2l0IGFtZXQgdHJpc3RpcXVlIHJob25jdXMuIE51",
"bGxhbSBzY2VsZXJpc3F1ZSBudW5jIGF0IG1heGltdXMgbWF0dGlzLiBQaGFzZWxs",
"dXMgYWxpcXVldCwgb2RpbyBpZCB0ZW1wdXMgY3Vyc3VzLCB0b3J0b3IgbGVvIGlt",
"cGVyZGlldCBlc3QsIG5vbiBhY2N1bXNhbiBtYXNzYSBsZWN0dXMgZWdldCBxdWFt",
"LiBTZWQgdXQgYmxhbmRpdCBtYWduYSwgcXVpcyBlZ2VzdGFzIHB1cnVzLiBOdWxs",
"YW0gbW9sZXN0aWUgdnVscHV0YXRlIHB1bHZpbmFyLiBJbnRlZ2VyIHZpdmVycmEg",
"ZXJvcyB2dWxwdXRhdGUgaXBzdW0gcGhhcmV0cmEgZ3JhdmlkYS4gU2VkIHF1aXMg",
"ZXJvcyB1dCBvZGlvIHVsdHJpY2llcyBsYWNpbmlhIGlkIHV0IG51bmMuIFF1aXNx",
"dWUgYXQgc2VtcGVyIHVybmEsIG5lYyB0cmlzdGlxdWUgZXJhdC4gRXRpYW0gc2l0",
"IGFtZXQgY29uc2VjdGV0dXIgbWkuIEN1cmFiaXR1ciB2YXJpdXMgcXVhbSBpbiBl",
"Z2VzdGFzIHBsYWNlcmF0LgoKUHJvaW4gcGxhY2VyYXQsIG1pIGZyaW5naWxsYSB0",
"ZW1wdXMgZGFwaWJ1cywgZWxpdCBtYWduYSBzY2VsZXJpc3F1ZSBmZWxpcywgc2Vk",
"IGFsaXF1ZXQgdG9ydG9yIG5lcXVlIGV0IG9kaW8uIEN1cmFiaXR1ciB2aXRhZSBu",
"dW5jIGZyaW5naWxsYSwgaW1wZXJkaWV0IG51bGxhIGltcGVyZGlldCwgZ3Jhdmlk",
"YSB0ZWxsdXMuIENyYXMgYmliZW5kdW0gbG9ib3J0aXMgdG9ydG9yIGVnZXQgbWF0",
"dGlzLiBNYWVjZW5hcyBlZ2V0IG1heGltdXMgbWFnbmEuIE51bGxhIGZhY2lsaXNp",
"LiBEb25lYyBkdWkgbmliaCwgY29tbW9kbyBldCBsZWN0dXMgYXQsIHJob25jdXMg",
"cGxhY2VyYXQgbGliZXJvLiBQZWxsZW50ZXNxdWUgdmVoaWN1bGEsIGVsaXQgaW4g",
"YXVjdG9yIGZlcm1lbnR1bSwgYXVndWUgbWFnbmEgdWxsYW1jb3JwZXIgZGlhbSwg",
"ZWdldCB2b2x1dHBhdCB0dXJwaXMgbmVxdWUgZXQgbWV0dXMuIFF1aXNxdWUgdmVs",
"IGZpbmlidXMgc2FwaWVuLiBOdWxsYW0gZmluaWJ1cyB2ZWwgc2FwaWVuIHV0IHVs",
"dHJpY2llcy4gU2VkIGNvbnNlY3RldHVyLCBtZXR1cyBhIGltcGVyZGlldCBzZW1w",
"ZXIsIGlwc3VtIGV4IHRyaXN0aXF1ZSB2ZWxpdCwgaWQgdmFyaXVzIG9yY2kgb2Rp",
"byB0ZW1wb3IgZW5pbS4gRG9uZWMgY29uZ3VlIHVsdHJpY2VzIG5lcXVlLCB1dCBj",
"b21tb2RvIGxlbyBkaWN0dW0gZXUuIFF1aXNxdWUgZWdldCBsZW8gYmxhbmRpdCwg",
"c3VzY2lwaXQgZXJhdCBhdCwgZmV1Z2lhdCBleC4gSW50ZWdlciBzb2RhbGVzIHB1",
"cnVzIGF0IGR1aSB2aXZlcnJhIGFsaXF1ZXQuIFN1c3BlbmRpc3NlIHJob25jdXMs",
"IG51bmMgc2VkIGZhdWNpYnVzIGxhb3JlZXQsIGF1Z3VlIGRpYW0gYmliZW5kdW0g",
"dG9ydG9yLCBxdWlzIG1vbGVzdGllIHB1cnVzIG9yY2kgZXQgZXguIFBlbGxlbnRl",
"c3F1ZSBtb2xsaXMgdGVsbHVzIGV4LCBhY2N1bXNhbiBvcm5hcmUgbWkgZWdlc3Rh",
"cyBhdC4gTnVsbGEgZmFjaWxpc2kuCgpJbiBpbiBzdXNjaXBpdCBudWxsYSwgZXUg",
"ZWZmaWNpdHVyIGVuaW0uIFBoYXNlbGx1cyBzYWdpdHRpcyBhdWN0b3IgY29udmFs",
"bGlzLiBWaXZhbXVzIHNlZCBkaWduaXNzaW0gcHVydXMuIFF1aXNxdWUgaWQgaW1w",
"ZXJkaWV0IG1ldHVzLiBTdXNwZW5kaXNzZSBwdWx2aW5hciBsb3JlbSBzZW0sIGV0",
"IGNvbmd1ZSBwdXJ1cyB2b2x1dHBhdCBldC4gTnVsbGEgdXQgbWFzc2EgZXUgbnVu",
"YyBjdXJzdXMgY29uc2VxdWF0IHZlbCB2dWxwdXRhdGUgbG9yZW0uIFZpdmFtdXMg",
"ZGlhbSBtYXNzYSwgY29uc2VxdWF0IG5lYyByaXN1cyBldCwgc2VtcGVyIGZlcm1l",
"bnR1bSBmZWxpcy4gTmFtIHNlZCBkdWkgdmVsIHNhcGllbiBjb21tb2RvIGNvbmd1",
"ZSBub24gYXQgdG9ydG9yLiBOYW0gc29sbGljaXR1ZGluIHNlbSBxdWlzIGVuaW0g",
"ZmFjaWxpc2lzIGZlcm1lbnR1bS4KCkludGVnZXIgYWNjdW1zYW4gbGliZXJvIHVy",
"bmEsIHZpdGFlIGNvbmRpbWVudHVtIGRvbG9yIHRpbmNpZHVudCBldC4gTWF1cmlz",
"IGRhcGlidXMgdmVsIG1ldHVzIGluIGFsaXF1ZXQuIER1aXMgc3VzY2lwaXQgYXJj",
"dSB2ZWwgZXJvcyB2ZWhpY3VsYSBhbGlxdWFtLiBBbGlxdWFtIGVmZmljaXR1ciwg",
"YW50ZSBpbiB2b2x1dHBhdCBzZW1wZXIsIGxpZ3VsYSBudW5jIG1vbGVzdGllIGVs",
"aXQsIGEgc3VzY2lwaXQgZXJhdCBsaWd1bGEgc2l0IGFtZXQgbnVuYy4gRHVpcyBl",
"dSBsZWN0dXMgZXUgbWFzc2Egc2NlbGVyaXNxdWUgdml2ZXJyYS4gQ3VyYWJpdHVy",
"IHZhcml1cywgdXJuYSBldCBkaWN0dW0gZ3JhdmlkYSwgbWV0dXMgZHVpIGZpbmli",
"dXMgc2VtLCB1dCB2YXJpdXMgZXggbWkgaWQgdGVsbHVzLiBGdXNjZSB1bHRyaWNl",
"cyB0ZWxsdXMgcHVydXMsIHNpdCBhbWV0IHB1bHZpbmFyIGFyY3UgZmF1Y2lidXMg",
"bm9uLiBNb3JiaSBtYWxlc3VhZGEgYSBhbnRlIGlkIG1vbGxpcy4gSW50ZXJkdW0g",
"ZXQgbWFsZXN1YWRhIGZhbWVzIGFjIGFudGUgaXBzdW0gcHJpbWlzIGluIGZhdWNp",
"YnVzLgoKTWFlY2VuYXMgZXUgbmlzaSBlcmF0LiBJbiBuZXF1ZSBvZGlvLCBhbGlx",
"dWV0IHF1aXMgcGhhcmV0cmEgdXQsIGxhY2luaWEgbm9uIG1hdXJpcy4gVml2YW11",
"cyBzaXQgYW1ldCBlcm9zIHV0IG5pc2kgdGVtcG9yIGNvbnNlcXVhdC4gU3VzcGVu",
"ZGlzc2UgcnV0cnVtIHNlZCBleCBzaXQgYW1ldCBldWlzbW9kLiBEb25lYyBldWlz",
"bW9kLCBhbnRlIGF0IHJ1dHJ1bSBjb25zZXF1YXQsIGlwc3VtIGF1Z3VlIG1vbGVz",
"dGllIG9yY2ksIGluIHBvc3VlcmUgb3JjaSBuZXF1ZSBldSBzZW0uIEV0aWFtIGFs",
"aXF1ZXQsIGlwc3VtIGNvbmd1ZSBkaWN0dW0gcGxhY2VyYXQsIG1hdXJpcyBpcHN1",
"bSBjdXJzdXMganVzdG8sIG5vbiBwdWx2aW5hciB0ZWxsdXMgbWFzc2EgZXUgbGVj",
"dHVzLiBQcmFlc2VudCBlbGVpZmVuZCB0b3J0b3IgdG9ydG9yLCBub24gb3JuYXJl",
"IHVybmEgZmFjaWxpc2lzIHNpdCBhbWV0LiBTZWQgcG9ydHRpdG9yLCBlbmltIG9y",
"bmFyZSBlbGVtZW50dW0gcHVsdmluYXIsIGVzdCBtYXNzYSB1bGxhbWNvcnBlciBs",
"aWJlcm8sIGFjIGZhY2lsaXNpcyBhdWd1ZSBvZGlvIG5vbiBhbnRlLiAKCQ==",
]
.concat(),
)
.unwrap()
}
fn get_big_data_encrypted_flat() -> Vec<u8> {
BASE64_STANDARD
.decode(
[
"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",
"Mia6rbH8t+BmBQDALE3/0ZUZmHYFEA==",
]
.concat(),
)
.unwrap()
}
fn get_big_data_encrypted_zip() -> Vec<u8> {
BASE64_STANDARD
.decode(
[
"AAEAAAUjOhw82+rVIl1I1InUAcpvc2SSuoS/Mce8KGZNGppsMn8b/wWWviXSM+U2",
"Ap6ROkFhRkocOBA69xmY9VMBahzIZeeUBE1N8Mlph2SXw/IuYv9767eivwAohQR+",
"R7RRuMyh5Ng9pK48d8vqHdEY8K12ZyTULUr55DH4vLvnKrAqPQPbRCAUOl+fBN0w",
"MGqNOUaAQirpVlWRhlonwETtLQknllimbz30CV67KUL3xrz7kJU5HfuxNZUiA8+4",
"aBehbVQUqCpwUyktg6VBkEOFQkSbVpWBPzIPS7TEmY9+mE4zliWJdLq6NGsRRD3z",
"5+CrzBQhdNwN8jVVo10eI85nZMOqGpiNLUXK27kYCCWhoMsug3Tft6I/5R7Nu/kk",
"ABSEe1Qv1MBMooJ1LRibHSc300yWNEGtZ+NCBTZbivJPczIs+7LPrHGuK2Rys2YF",
"W9vj5XQg3fnLzrZdcO+Lr9JUbXg8czylzyZZBtmGgzEfGvrxJiP5pzzGfiMuTM2/",
"U7+c4c0iiXPYf8Y0M/+jJbVtIBQGR+3NFI9iC7wG9D3O+sRMq4hwzDq57aPetwCc",
"2Bv2cWUChpWqU0X0LdTIU1mnP9KRceTGVySCqsaTglqsg+B3bKNkk3sNx5TlIui3",
"u4/z6EQa67DrBlAXyAx4KZ6Rn8fizpqPTC/P0o2Ea94FZsbC7AM5rrkYjXaxYaWD",
"1n7rm1ElUpUUPy2w+d9d2Pm2Bh7RuvK5u50AUPR+lZjypIVEXh/mbDaw211IE/Wz",
"Dek2GZzK99agzsizxSDEF70CAI37DTPr446W5eYPZZJOKv6AzDRtXZeTHH4BfFZG",
"DSZKGhXq3HZlVjhRbLDOdlEPTf6WcKEXJ8p6kRGjUexDM9fYV/luf2OSAc5NzvwL",
"woeyLuq5oOAIuQ9+xZkBU91Ir0E4ajsRCW5PhxySS12uigjDDCExLE6e5Gv1KlA1",
"4BB061XXlDL1XI0gY2R22LtUk7nYfbPVG+cM5x8lwhUMqKBIxdwhKPe7wjKmpnFP",
"e5BPjyP9yzJ0p1tkRyjtKxPReA2IK0JRy8Cgw0EwMVuhPiW3EWoQn6r09BTCtXtk",
"UzTV683cSZIW50Oa8uhoL+822ZvVykBrfMzRkHLLbSsGRKJBS2uWjrFaSEYhg0c1",
"F+xV2eZFl4dLiOISfZFjSo904RjDDCjEww5esalv3kNdzfkfg8dZ0gQX0E3Yyt9O",
"NKZL82abHD48TiITvBud1xz2w+wk7GQGxZdYLLZ5UpQywOPU7GOSVktNVvH2Q0hi",
"rwCVy4FlHng/IQanvnyaxVQsTMsN8ZYIkAOgG64hgXNLKodqAm+Fo0TFc0Zhs0Mw",
"M5Ab1aObeeyFffQI9Fa5oKC6X47t99isp1rGbS4bj1dX+kwzSxXuh+mWZXaW6G3z",
"1OoCjEkw/rf2ehtOULmdhJI3gVv03/CbKQTfBGL29ZYPwLf382uQefvf+mMt26Nr",
"3w6u0/yh7ve3lSmTulfZt0AY2m/9w7jnbInoirnwo4tSJsXS2zbDSYwJD4ub+hqX",
"w19pe+jObpLlczYPBZZTwNJHluBMWgTYTL+C7Yt70WNVGgNIMQqPxRYNEsAwQf6B",
"d93ideqTLu5Ti2mC+MxxqgBhdNfhKjiQWqODKnBRSysEs6FV7C+oNsb1D+/G8B+Q",
"flKfBfXDHi++yTYpa2iZOyQyC2AR5XXgOiBZ7IMS+Ic+5mkfQjVuRIn4BQMLNeW/",
"Y+ORdNIie9hZWqjhXgRpMQLxBafjAKLPki/wb+E1HprVVnH1GJfNOxDjPP9CVMPW",
"lEJzqETc",
]
.concat(),
)
.unwrap()
}
}