mirror of
https://github.com/saymrwulf/fips205-source.git
synced 2026-09-04 20:03:45 +00:00
56 lines
1.9 KiB
Rust
56 lines
1.9 KiB
Rust
#![no_main]
|
|
use libfuzzer_sys::fuzz_target;
|
|
use fips205::{
|
|
slh_dsa_sha2_128f, // Using slh_dsa_sha2_128f as example, could test other parameter sets
|
|
traits::{SerDes, Signer, Verifier},
|
|
Ph,
|
|
};
|
|
|
|
fuzz_target!(|data: &[u8]| {
|
|
// Need at least some bytes for our test cases
|
|
if data.len() < 32 {
|
|
return;
|
|
}
|
|
|
|
let ph = match data[0] % 3 {
|
|
0 => Ph::SHA256,
|
|
1 => Ph::SHA512,
|
|
_ => Ph::SHAKE256,
|
|
};
|
|
|
|
// Generate a valid key pair first
|
|
if let Ok((pk, sk)) = slh_dsa_sha2_128f::try_keygen() {
|
|
// Split fuzz data into message and context
|
|
let split_point = data.len() % 255;
|
|
let message = &data[split_point..];
|
|
let context = &data[..split_point];
|
|
|
|
// Test 1: Regular verification with valid signature
|
|
if let Ok(valid_sig) = sk.try_sign(message, context, true) {
|
|
let _ = pk.verify(message, &valid_sig, context);
|
|
}
|
|
|
|
// Test 2: Hash verification with valid signature
|
|
if let Ok(valid_hash_sig) = sk.try_hash_sign(message, context, &ph, true) {
|
|
let _ = pk.hash_verify(message, &valid_hash_sig, context, &ph);
|
|
}
|
|
|
|
// Test 3: Try to deserialize and verify with potentially malformed public key
|
|
if let Ok(maybe_pk) = slh_dsa_sha2_128f::PublicKey::try_from_bytes(
|
|
&pk.clone().into_bytes() // Use valid key bytes but could use fuzzed data instead
|
|
) {
|
|
if let Ok(sig) = sk.try_sign(message, context, true) {
|
|
let _ = maybe_pk.verify(message, &sig, context);
|
|
}
|
|
}
|
|
|
|
// Test 4: Verify with modified message
|
|
if let Ok(sig) = sk.try_sign(message, context, true) {
|
|
let mut modified_message = message.to_vec();
|
|
if !modified_message.is_empty() {
|
|
modified_message[0] ^= 1; // Flip one bit
|
|
let _ = pk.verify(&modified_message, &sig, context);
|
|
}
|
|
}
|
|
}
|
|
});
|