pub fn magic_sequence() -> [u8; 256] {
let mut seq = [0u8; 256];
let mut seed: u32 = 1;
for byte in seq.iter_mut() {
seed = seed.wrapping_mul(0x343FD).wrapping_add(0x269EC3);
*byte = (seed >> 16) as u8;
}
seq
}
pub fn adler32_checksum(seed: u32, data: &[u8]) -> u32 {
let mut sum1 = seed & 0xFFFF;
let mut sum2 = seed >> 16;
for chunk in data.chunks(5552) {
for &byte in chunk {
sum1 += byte as u32;
sum2 += sum1;
}
sum1 %= 0xFFF1;
sum2 %= 0xFFF1;
}
(sum2 << 16) | sum1
}
pub fn compression_padding(length: usize) -> usize {
0x1F - (length + 0x1F) % 0x20
}
pub fn apply_mask(buffer: &mut [u8], stream_position: u64) {
let mask_value = 0x4164536Bu32 ^ (stream_position as u32);
let mask = mask_value.to_le_bytes();
let mut i = 0;
while i + 4 <= buffer.len() {
buffer[i] ^= mask[0];
buffer[i + 1] ^= mask[1];
buffer[i + 2] ^= mask[2];
buffer[i + 3] ^= mask[3];
i += 4;
}
}
pub fn apply_magic_sequence(buffer: &mut [u8]) {
let seq = magic_sequence();
for (i, byte) in buffer.iter_mut().enumerate() {
*byte ^= seq[i % 256];
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_magic_sequence_deterministic() {
let seq1 = magic_sequence();
let seq2 = magic_sequence();
assert_eq!(seq1, seq2);
}
#[test]
fn test_magic_sequence_first_bytes() {
let seq = magic_sequence();
assert_eq!(seq[0], 0x29);
assert_ne!(seq[1], 0);
}
#[test]
fn test_adler32_empty() {
assert_eq!(adler32_checksum(1, &[]), 1);
}
#[test]
fn test_adler32_basic() {
let result = adler32_checksum(1, b"Wikipedia");
assert_eq!(result, 0x11E60398);
}
#[test]
fn test_compression_padding() {
assert_eq!(compression_padding(0), 0);
assert_eq!(compression_padding(1), 31);
assert_eq!(compression_padding(32), 0);
assert_eq!(compression_padding(33), 31);
}
#[test]
fn test_apply_mask_roundtrip() {
let original = vec![0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08];
let mut masked = original.clone();
apply_mask(&mut masked, 0);
assert_ne!(masked, original);
apply_mask(&mut masked, 0);
assert_eq!(masked, original);
}
#[test]
fn test_apply_magic_sequence_roundtrip() {
let original = vec![0xAA; 100];
let mut encrypted = original.clone();
apply_magic_sequence(&mut encrypted);
assert_ne!(encrypted, original);
apply_magic_sequence(&mut encrypted);
assert_eq!(encrypted, original);
}
}