lms_signature/lms/
mod.rs

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
//! Everything related to LMS (and not LM-OTS)

pub mod error;
mod keypair;
pub(crate) mod modes;
mod private;
mod public;
pub mod signature;

pub use modes::{
    LmsMode, LmsSha256M32H10, LmsSha256M32H15, LmsSha256M32H20, LmsSha256M32H25, LmsSha256M32H5,
};
pub use private::SigningKey;
pub use public::VerifyingKey;
pub use signature::Signature;

#[cfg(test)]
mod tests {
    use ::signature::{RandomizedSignerMut, Verifier};

    use super::*;

    use crate::{lms::SigningKey, ots::LmsOtsSha256N32W4};

    fn test_sign_and_verify<Mode: LmsMode>() {
        let mut rng = rand::thread_rng();

        // Generate a fresh keypair
        let mut sk = SigningKey::<Mode>::new(&mut rng);
        let pk = sk.public();

        let msg = "this is a test message".as_bytes();

        // Sign the message
        let sig = sk.try_sign_with_rng(&mut rng, msg);
        let sig = sig.unwrap();

        // Verify the signature
        assert!(pk.verify(msg, &sig).is_ok());
    }

    // TODO: macro-generate these exhaustively
    #[test]
    fn test_sign_and_verify_lms_sha256_m32_h5_lmsots_sha256_n32_w4() {
        test_sign_and_verify::<LmsSha256M32H5<LmsOtsSha256N32W4>>();
    }
}