miden-crypto/src/dsa/rpo_falcon512/keys/mod.rs
src/dsa/rpo_falcon512/keys/mod.rsRaw
1use super::{
2 math::{FalconFelt, Polynomial},
3 ByteReader, ByteWriter, Deserializable, DeserializationError, Felt, Serializable, Signature,
4 Word,
5};
6
7mod public_key;
8pub use public_key::{PubKeyPoly, PublicKey};
9
10mod secret_key;
11pub use secret_key::SecretKey;
12
13// TESTS
14// ================================================================================================
15
16#[cfg(test)]
17mod tests {
18 use rand::SeedableRng;
19 use rand_chacha::ChaCha20Rng;
20 use winter_math::FieldElement;
21 use winter_utils::{Deserializable, Serializable};
22
23 use crate::{dsa::rpo_falcon512::SecretKey, Word, ONE};
24
25 #[test]
26 fn test_falcon_verification() {
27 let seed = [0_u8; 32];
28 let mut rng = ChaCha20Rng::from_seed(seed);
29
30 // generate random keys
31 let sk = SecretKey::with_rng(&mut rng);
32 let pk = sk.public_key();
33
34 // test secret key serialization/deserialization
35 let mut buffer = vec![];
36 sk.write_into(&mut buffer);
37 let sk_deserialized = SecretKey::read_from_bytes(&buffer).unwrap();
38 assert_eq!(sk.short_lattice_basis(), sk_deserialized.short_lattice_basis());
39
40 // sign a random message
41 let message: Word = [ONE; 4];
42 let signature = sk.sign_with_rng(message, &mut rng);
43
44 // make sure the signature verifies correctly
45 assert!(pk.verify(message, &signature));
46
47 // a signature should not verify against a wrong message
48 let message2: Word = [ONE.double(); 4];
49 assert!(!pk.verify(message2, &signature));
50
51 // a signature should not verify against a wrong public key
52 let sk2 = SecretKey::with_rng(&mut rng);
53 assert!(!sk2.public_key().verify(message, &signature))
54 }
55}