use crate::c2pa_cbor::decode;
struct Rng(u64);
impl Rng {
fn next(&mut self) -> u64 {
let mut x = self.0;
x ^= x >> 12;
x ^= x << 25;
x ^= x >> 27;
self.0 = x;
x.wrapping_mul(0x2545F4914F6CDD1D)
}
fn bytes(&mut self, len: usize) -> Vec<u8> {
let mut v = Vec::with_capacity(len);
while v.len() < len {
v.extend_from_slice(&self.next().to_le_bytes());
}
v.truncate(len);
v
}
}
#[test]
fn decoder_never_panics_on_random_bytes() {
let mut rng = Rng(0x1234_5678_9ABC_DEF0);
for _ in 0..5000 {
let len = (rng.next() % 1024) as usize;
let _ = decode(&rng.bytes(len));
}
}
#[test]
fn decoder_rejects_deep_nesting_without_stack_overflow() {
let mut data = vec![0x9f; 10_000]; data.extend(std::iter::repeat_n(0xff, 10_000));
assert!(decode(&data).is_err());
}
#[test]
fn decoder_rejects_hostile_length_prefixes() {
let cases: &[Vec<u8>] = &[
vec![0x5a, 0xFF, 0xFF, 0xFF, 0xFF],
vec![0x7b, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF],
vec![0x9a, 0xFF, 0xFF, 0xFF, 0xFF],
vec![0xbb, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF],
vec![0x18],
vec![0x9f],
];
for c in cases {
let _ = decode(c);
}
}
#[test]
fn decoder_handles_all_single_byte_inputs() {
for b in 0u16..=255 {
let _ = decode(&[b as u8]);
}
}