use dstu_core::hazmat::strumok::{Strumok256, Strumok512};
struct SplitMix64(u64);
impl SplitMix64 {
fn next_u64(&mut self) -> u64 {
self.0 = self.0.wrapping_add(0x9E37_79B9_7F4A_7C15);
let mut z = self.0;
z = (z ^ (z >> 30)).wrapping_mul(0xBF58_476D_1CE4_E5B9);
z = (z ^ (z >> 27)).wrapping_mul(0x94D0_49BB_1331_11EB);
z ^ (z >> 31)
}
fn fill(&mut self, buf: &mut [u8]) {
for chunk in buf.chunks_mut(8) {
let word = self.next_u64().to_le_bytes();
chunk.copy_from_slice(&word[..chunk.len()]);
}
}
fn range(&mut self, max_inclusive: usize) -> usize {
(self.next_u64() as usize) % (max_inclusive + 1)
}
}
fn to_hex(bytes: &[u8]) -> String {
bytes.iter().map(|b| format!("{b:02X}")).collect()
}
fn main() {
let count: usize = std::env::args()
.nth(1)
.and_then(|s| s.parse().ok())
.unwrap_or(200);
let mut rng = SplitMix64(0x5354_524D_4F4B_3831);
for _ in 0..count {
let mut key256 = [0u8; 32];
rng.fill(&mut key256);
let mut iv = [0u8; 32];
rng.fill(&mut iv);
let len = 1 + rng.range(299);
let mut buf = vec![0u8; len];
Strumok256::new(&key256, &iv).apply_keystream(&mut buf);
println!("256 {} {} {}", to_hex(&key256), to_hex(&iv), to_hex(&buf));
let mut key512 = [0u8; 64];
rng.fill(&mut key512);
rng.fill(&mut iv);
let len = 1 + rng.range(299);
let mut buf = vec![0u8; len];
Strumok512::new(&key512, &iv).apply_keystream(&mut buf);
println!("512 {} {} {}", to_hex(&key512), to_hex(&iv), to_hex(&buf));
}
}