iuna

iuna

iuna - experimental mainnet-candidate protocol
git clone https://getiuna.org/git/iuna.git
Log | Files | Refs | README | LICENSE

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 }