#[derive(Debug, Clone)]
pub enum Obfuscation {
Xor {
key: Vec<u8>,
},
}
pub(crate) fn obfuscate_payload<P: AsRef<[u8]>>(
payload_data: P,
obfuscation: Obfuscation,
) -> Vec<u8> {
match obfuscation {
Obfuscation::Xor { key } => xor_payload(payload_data, &key),
}
}
pub(crate) fn deobfuscate_payload<P: AsRef<[u8]>>(
payload_data: P,
obfuscation: Obfuscation,
) -> Vec<u8> {
match obfuscation {
Obfuscation::Xor { key } => xor_payload(payload_data, &key),
}
}
pub(crate) fn xor_payload<P: AsRef<[u8]>, K: AsRef<[u8]>>(payload_data: P, key: K) -> Vec<u8> {
if key.as_ref().is_empty() {
return payload_data.as_ref().to_vec();
}
payload_data
.as_ref()
.iter()
.zip(key.as_ref().iter().cycle())
.map(|(byte, key_byte)| byte ^ key_byte)
.collect()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_xor_payload_basic() {
let payload = b"Hello, World!";
let key = b"key";
let result = xor_payload(payload, key);
let decrypted = xor_payload(&result, key);
assert_eq!(decrypted, payload);
}
#[test]
fn test_xor_payload_empty_payload() {
let payload = b"";
let key = b"key";
let result = xor_payload(payload, key);
assert_eq!(result, Vec::<u8>::new());
}
#[test]
fn test_xor_payload_empty_key() {
let payload = b"payload";
let key = b"";
let result = xor_payload(payload, key);
assert_eq!(&result, payload);
}
#[test]
fn test_xor_payload_single_byte_key() {
let payload = b"test";
let key = b"x";
let result = xor_payload(payload, key);
let expected: Vec<u8> = payload.iter().map(|&b| b ^ b'x').collect();
assert_eq!(result, expected);
let decrypted = xor_payload(&result, key);
assert_eq!(decrypted, payload);
}
#[test]
fn test_xor_payload_key_longer_than_payload() {
let payload = b"hi";
let key = b"verylongkey";
let result = xor_payload(payload, key);
let expected = vec![b'h' ^ b'v', b'i' ^ b'e'];
assert_eq!(result, expected);
let decrypted = xor_payload(&result, key);
assert_eq!(decrypted, payload);
}
#[test]
fn test_xor_payload_key_shorter_than_payload() {
let payload = b"verylongpayload";
let key = b"ab";
let result = xor_payload(payload, key);
let expected: Vec<u8> = payload
.iter()
.enumerate()
.map(|(i, &byte)| byte ^ key[i % key.len()])
.collect();
assert_eq!(result, expected);
let decrypted = xor_payload(&result, key);
assert_eq!(decrypted, payload);
}
#[test]
fn test_xor_payload_zero_key() {
let payload = b"test";
let key = b"\x00\x00\x00\x00";
let result = xor_payload(payload, key);
assert_eq!(result, payload);
}
#[test]
fn test_xor_payload_binary_data() {
let payload = vec![0x00, 0xFF, 0x55, 0xAA, 0x33];
let key = vec![0x11, 0x22];
let result = xor_payload(&payload, &key);
let expected = vec![
0x11, 0xFF ^ 0x22, 0x55 ^ 0x11, 0xAA ^ 0x22, 0x33 ^ 0x11, ];
assert_eq!(result, expected);
let decrypted = xor_payload(&result, &key);
assert_eq!(decrypted, payload);
}
#[test]
fn test_xor_payload_same_data_and_key() {
let data = b"same";
let result = xor_payload(data, data);
let expected = vec![0u8; data.len()];
assert_eq!(result, expected);
}
#[test]
fn test_xor_payload_large_data() {
let payload = vec![0x42; 1000]; let key = b"secretkey";
let result = xor_payload(&payload, key);
for (i, &byte) in result.iter().enumerate() {
let expected = 0x42 ^ key[i % key.len()];
assert_eq!(byte, expected);
}
let decrypted = xor_payload(&result, key);
assert_eq!(decrypted, payload);
}
}