1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#[macro_export]
macro_rules! ed25519_tests {
($signer:ident, $verifier:ident) => {
use $crate::{
ed25519::{self, SIGNATURE_SIZE, TEST_VECTORS},
error::ErrorKind,
Ed25519PublicKey, Ed25519Seed, Ed25519Signature, Signature,
};
#[test]
fn sign_rfc8032_test_vectors() {
for vector in TEST_VECTORS {
let seed = Ed25519Seed::from_bytes(vector.sk).unwrap();
let signer = $signer::from(&seed);
assert_eq!(
ed25519::sign(&signer, vector.msg).unwrap().as_ref(),
vector.sig
);
}
}
#[test]
fn verify_rfc8032_test_vectors() {
for vector in TEST_VECTORS {
let pk = Ed25519PublicKey::from_bytes(vector.pk).unwrap();
let verifier = $verifier::from(&pk);
let sig = Ed25519Signature::from_bytes(vector.sig).unwrap();
assert!(
ed25519::verify(&verifier, vector.msg, &sig).is_ok(),
"expected signature to verify"
);
}
}
#[test]
fn rejects_tweaked_rfc8032_test_vectors() {
for vector in TEST_VECTORS {
let pk = Ed25519PublicKey::from_bytes(vector.pk).unwrap();
let verifier = $verifier::from(&pk);
let mut tweaked_sig = [0u8; SIGNATURE_SIZE];
tweaked_sig.copy_from_slice(vector.sig);
tweaked_sig[0] ^= 0x42;
let result = ed25519::verify(
&verifier,
vector.msg,
&Ed25519Signature::from_bytes(&tweaked_sig[..]).unwrap(),
);
assert!(
result.is_err(),
"expected signature verification failure but it succeeded"
);
match result.err().unwrap().kind() {
ErrorKind::SignatureInvalid => (),
other => panic!("expected ErrorKind::SignatureInvalid, got {:?}", other),
}
}
}
};
}