diff --git a/lms/Cargo.toml b/lms/Cargo.toml index 26e85f6b..ff659d6c 100644 --- a/lms/Cargo.toml +++ b/lms/Cargo.toml @@ -25,3 +25,4 @@ zeroize = "1.8.1" [dev-dependencies] hex = "0.4.3" hex-literal = "0.4.1" +paste = "1.0" diff --git a/lms/src/lms/mod.rs b/lms/src/lms/mod.rs index c5de9cdb..f9921a85 100644 --- a/lms/src/lms/mod.rs +++ b/lms/src/lms/mod.rs @@ -20,7 +20,9 @@ mod tests { use super::*; - use crate::{lms::SigningKey, ots::LmsOtsSha256N32W4}; + use crate::ots::{ + LmsOtsSha256N32W1, LmsOtsSha256N32W2, LmsOtsSha256N32W4, LmsOtsSha256N32W8, + }; fn test_sign_and_verify() { let mut rng = rand::rng(); @@ -39,9 +41,33 @@ mod tests { 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::>(); + // Macro to generate exhaustive tests for all LMS and OTS mode combinations + macro_rules! generate_lms_tests { + ( + $(($lms_mode:ident, $ots_mode:ident)),+ $(,)? + ) => { + $( + paste::paste! { + #[test] + fn []() { + test_sign_and_verify::<$lms_mode<$ots_mode>>(); + } + } + )+ + }; + } + + // Generate tests for all feasible combinations of LMS and OTS modes + // Note: H15, H20, H25 modes are excluded as they use too much memory and overflow the stack + generate_lms_tests! { + (LmsSha256M32H5, LmsOtsSha256N32W1), + (LmsSha256M32H5, LmsOtsSha256N32W2), + (LmsSha256M32H5, LmsOtsSha256N32W4), + (LmsSha256M32H5, LmsOtsSha256N32W8), + + (LmsSha256M32H10, LmsOtsSha256N32W1), + (LmsSha256M32H10, LmsOtsSha256N32W2), + (LmsSha256M32H10, LmsOtsSha256N32W4), + (LmsSha256M32H10, LmsOtsSha256N32W8), } }