vdf_proof.rs (1371B)
1 #![no_main] 2 3 use iuna::domain::verify_vdf; 4 use libfuzzer_sys::fuzz_target; 5 6 const HEX: &[u8; 16] = b"0123456789abcdef"; 7 8 fuzz_target!(|data: &[u8]| { 9 if data.is_empty() { 10 return; 11 } 12 13 let mut proof = [0u8; 200]; 14 let hex_data = data.strip_suffix(b"\n").unwrap_or(data); 15 if hex_data.len() == proof.len() * 2 { 16 for (output, encoded) in proof.iter_mut().zip(hex_data.chunks_exact(2)) { 17 let Some(high) = decode_nibble(encoded[0]) else { 18 return; 19 }; 20 let Some(low) = decode_nibble(encoded[1]) else { 21 return; 22 }; 23 *output = high << 4 | low; 24 } 25 } else { 26 let copied = data.len().min(proof.len()); 27 proof[..copied].copy_from_slice(&data[..copied]); 28 } 29 30 let mut encoded = String::with_capacity(30 + proof.len() * 2); 31 encoded.push_str("classgroup-wesolowski-bqfc-v1:"); 32 for byte in proof { 33 encoded.push(HEX[usize::from(byte >> 4)] as char); 34 encoded.push(HEX[usize::from(byte & 0x0f)] as char); 35 } 36 37 let _ = verify_vdf("BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", 300, &encoded); 38 }); 39 40 fn decode_nibble(byte: u8) -> Option<u8> { 41 match byte { 42 b'0'..=b'9' => Some(byte - b'0'), 43 b'a'..=b'f' => Some(byte - b'a' + 10), 44 b'A'..=b'F' => Some(byte - b'A' + 10), 45 _ => None, 46 } 47 }