From 24e912636a8ef1d71ef1562368888d14b97ed407 Mon Sep 17 00:00:00 2001 From: Roman Date: Wed, 13 May 2026 10:25:55 +0800 Subject: [PATCH] fix: cross key signature validation --- fuzz/fuzz_targets/fuzz_signature_verification.rs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/fuzz/fuzz_targets/fuzz_signature_verification.rs b/fuzz/fuzz_targets/fuzz_signature_verification.rs index fe56b51..83c3221 100644 --- a/fuzz/fuzz_targets/fuzz_signature_verification.rs +++ b/fuzz/fuzz_targets/fuzz_signature_verification.rs @@ -8,7 +8,7 @@ //! 2. **No panics** — random (possibly invalid) signatures and public keys must never cause a //! panic in `is_valid_for`. //! 3. **Cross-key soundness** — signing with key A and verifying against key B must not panic -//! (the result may be `false` or, with negligible probability, accidentally `true`). +//! (the result must be `false`; if it is `true` that is a security invariant violation). use arbitrary::{Arbitrary, Unstructured}; use fuzz_props::arbitrary_types::{ArbPrivateKey, ArbPublicKey, ArbSignature}; @@ -41,15 +41,22 @@ fuzz_target!(|data: &[u8]| { let _ = sig_wrap.0.is_valid_for(&msg, &pk_wrap.0); } - // ── 3. Cross-key verification must not panic ─────────────────────────────── + // ── 3. Cross-key soundness: different keys must never cross-verify ───────── if let (Ok(key_a_wrap), Ok(key_b_wrap)) = ( ArbPrivateKey::arbitrary(&mut u), ArbPrivateKey::arbitrary(&mut u), ) { + let public_a = PublicKey::new_from_private_key(&key_a_wrap.0); let public_b = PublicKey::new_from_private_key(&key_b_wrap.0); let msg: [u8; 32] = u.arbitrary().unwrap_or_default(); let sig_from_a = Signature::new(&key_a_wrap.0, &msg); - // Must not panic regardless of key mismatch. - let _ = sig_from_a.is_valid_for(&msg, &public_b); + + if public_a != public_b { + assert!( + !sig_from_a.is_valid_for(&msg, &public_b), + "INVARIANT VIOLATION: signature created with key_a verified successfully \ + against key_b where key_a != key_b (cross-key forgery / broken verification)" + ); + } } });