arnaucube
arnaucube/miden-cryptoPublic Self-hosted repository
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 crate::{dsa::rpo_falcon512::SecretKey, Word, ONE};
19    use rand::SeedableRng;
20    use rand_chacha::ChaCha20Rng;
21    use winter_math::FieldElement;
22    use winter_utils::{Deserializable, Serializable};
23
24    #[test]
25    fn test_falcon_verification() {
26        let seed = [0_u8; 32];
27        let mut rng = ChaCha20Rng::from_seed(seed);
28
29        // generate random keys
30        let sk = SecretKey::with_rng(&mut rng);
31        let pk = sk.public_key();
32
33        // test secret key serialization/deserialization
34        let mut buffer = vec![];
35        sk.write_into(&mut buffer);
36        let sk_deserialized = SecretKey::read_from_bytes(&buffer).unwrap();
37        assert_eq!(sk.short_lattice_basis(), sk_deserialized.short_lattice_basis());
38
39        // sign a random message
40        let message: Word = [ONE; 4];
41        let signature = sk.sign_with_rng(message, &mut rng);
42
43        // make sure the signature verifies correctly
44        assert!(pk.verify(message, &signature));
45
46        // a signature should not verify against a wrong message
47        let message2: Word = [ONE.double(); 4];
48        assert!(!pk.verify(message2, &signature));
49
50        // a signature should not verify against a wrong public key
51        let sk2 = SecretKey::with_rng(&mut rng);
52        assert!(!sk2.public_key().verify(message, &signature))
53    }
54}