Skip to content

Commit 0bb0e56

Browse files
[cryptography] Add More Edge Case Testing (#951)
1 parent dacd6bb commit 0bb0e56

2 files changed

Lines changed: 69 additions & 0 deletions

File tree

cryptography/src/ed25519/scheme.rs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -727,4 +727,41 @@ mod tests {
727727
));
728728
assert!(!batch.verify(&mut rand::thread_rng()));
729729
}
730+
731+
#[test]
732+
fn test_zero_signature_fails() {
733+
let (_, public_key, message, _) = vector_1();
734+
let zero_sig = Signature::decode(vec![0u8; Signature::SIZE].as_ref()).unwrap();
735+
assert!(!Ed25519::verify(None, &message, &public_key, &zero_sig));
736+
}
737+
738+
#[test]
739+
fn test_high_s_fails() {
740+
let (_, public_key, message, signature) = vector_1();
741+
let mut bad_signature = signature.to_vec();
742+
bad_signature[63] |= 0x80; // make S non-canonical
743+
let bad_signature = Signature::decode(bad_signature.as_ref()).unwrap();
744+
assert!(!Ed25519::verify(
745+
None,
746+
&message,
747+
&public_key,
748+
&bad_signature
749+
));
750+
}
751+
752+
#[test]
753+
fn test_invalid_r_fails() {
754+
let (_, public_key, message, signature) = vector_1();
755+
let mut bad_signature = signature.to_vec();
756+
for b in bad_signature.iter_mut().take(32) {
757+
*b = 0xff; // invalid R component
758+
}
759+
let bad_signature = Signature::decode(bad_signature.as_ref()).unwrap();
760+
assert!(!Ed25519::verify(
761+
None,
762+
&message,
763+
&public_key,
764+
&bad_signature
765+
));
766+
}
730767
}

cryptography/src/secp256r1/scheme.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -495,6 +495,38 @@ mod tests {
495495
);
496496
}
497497

498+
#[test]
499+
fn test_decode_zero_signature_fails() {
500+
let result = Signature::decode(vec![0u8; SIGNATURE_LENGTH].as_ref());
501+
assert!(result.is_err());
502+
}
503+
504+
#[test]
505+
fn test_decode_high_s_signature_fails() {
506+
let (private_key, _) = vector_keypair_1();
507+
let message = b"edge";
508+
let mut signer = <Secp256r1 as CommonwareSigner>::from(private_key).unwrap();
509+
let signature = signer.sign(None, message);
510+
let mut bad_signature = signature.to_vec();
511+
bad_signature[32] |= 0x80; // force S into upper range
512+
assert!(Signature::decode(bad_signature.as_ref()).is_err());
513+
}
514+
515+
#[test]
516+
fn test_decode_zero_r_signature_fails() {
517+
let (private_key, _) = vector_keypair_1();
518+
let message = b"edge";
519+
let mut signer = <Secp256r1 as CommonwareSigner>::from(private_key).unwrap();
520+
let signature = signer.sign(None, message);
521+
let mut bad_signature = signature.to_vec();
522+
for b in bad_signature.iter_mut().take(32) {
523+
*b = 0x00;
524+
}
525+
// ensure S component is non-zero
526+
bad_signature[32] = 1;
527+
assert!(Signature::decode(bad_signature.as_ref()).is_err());
528+
}
529+
498530
// Ensure RFC6979 compliance (should also be tested by underlying library)
499531
#[test]
500532
fn test_rfc6979() {

0 commit comments

Comments
 (0)