From 9d2e56ad06e5b663a113ca21c5d6efd0935d6323 Mon Sep 17 00:00:00 2001 From: Adam Wick Date: Thu, 7 Mar 2019 16:00:27 -0700 Subject: [PATCH] Add code to run the DSA tests ... which still need fixin'. --- src/dsa/private.rs | 62 +++++++++++++++++++++++++++++++++++++++++++++- src/dsa/public.rs | 61 ++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 121 insertions(+), 2 deletions(-) diff --git a/src/dsa/private.rs b/src/dsa/private.rs index 6d27f3d..326333b 100644 --- a/src/dsa/private.rs +++ b/src/dsa/private.rs @@ -116,4 +116,64 @@ macro_rules! privkey_impls { privkey_impls!(L1024N160, U1024, U192, U384, U448, U896); privkey_impls!(L2048N224, U2048, U256, U512, U576, U1152); privkey_impls!(L2048N256, U2048, U256, U512, U576, U1152); -privkey_impls!(L3072N256, U3072, U256, U512, U576, U1152); \ No newline at end of file +privkey_impls!(L3072N256, U3072, U256, U512, U576, U1152); + +macro_rules! generate_tests { + ( $( ($mod: ident, $params: ident, $lt: ident, $nt: ident) ),* ) => { + $( + #[cfg(test)] + #[allow(non_snake_case)] + mod $mod { + use cryptonum::unsigned::Decoder; + use super::*; + use testing::run_test; + use sha2::{Sha224,Sha256,Sha384,Sha512}; + + #[test] + fn verify() { + let fname = format!("testdata/dsa/sign{}.test", stringify!($params)); + run_test(fname.to_string(), 9, |case| { + let (neg0, pbytes) = case.get("p").unwrap(); + let (neg1, qbytes) = case.get("q").unwrap(); + let (neg2, gbytes) = case.get("g").unwrap(); + let (neg3, _bytes) = case.get("y").unwrap(); + let (neg4, xbytes) = case.get("x").unwrap(); + let (neg5, mbytes) = case.get("m").unwrap(); + let (neg6, hbytes) = case.get("h").unwrap(); + let (neg7, rbytes) = case.get("r").unwrap(); + let (neg8, sbytes) = case.get("s").unwrap(); + + assert!(!neg0 && !neg1 && !neg2 && !neg3 && !neg4 && + !neg5 && !neg6 && !neg7 && !neg8); + let p = $lt::from_bytes(pbytes); + let q = $nt::from_bytes(qbytes); + let g = $lt::from_bytes(gbytes); + let x = $nt::from_bytes(xbytes); + //let y = $lt::from_bytes(ybytes); + let h = usize::from($nt::from_bytes(hbytes)); + let r = $nt::from_bytes(rbytes); + let s = $nt::from_bytes(sbytes); + + let params = $params::new(p,g,q); + let private = DSAPrivKey::<$params,$nt>::new(params, x); + let sig = match h { + 224 => private.sign::(mbytes), + 256 => private.sign::(mbytes), + 384 => private.sign::(mbytes), + 512 => private.sign::(mbytes), + _ => panic!("Unexpected hash {}", h) + }; + assert_eq!(r, sig.r); + assert_eq!(s, sig.s); + }); + } + } + )* + } +} + +generate_tests!( (DSA1024N160, L1024N160, U1024, U192), + (DSA2048N224, L2048N224, U2048, U256), + (DSA2048N256, L2048N256, U2048, U256), + (DSA3072N256, L3072N256, U3072, U256) + ); \ No newline at end of file diff --git a/src/dsa/public.rs b/src/dsa/public.rs index 6379cf0..16916e7 100644 --- a/src/dsa/public.rs +++ b/src/dsa/public.rs @@ -97,4 +97,63 @@ macro_rules! pubkey_impls { pubkey_impls!(L1024N160, U1024, U192, U384, U2048); pubkey_impls!(L2048N224, U2048, U256, U512, U4096); pubkey_impls!(L2048N256, U2048, U256, U512, U4096); -pubkey_impls!(L3072N256, U3072, U256, U512, U6144); \ No newline at end of file +pubkey_impls!(L3072N256, U3072, U256, U512, U6144); + +macro_rules! generate_tests { + ( $( ($mod: ident, $params: ident, $lt: ident, $nt: ident) ),* ) => { + $( + #[cfg(test)] + #[allow(non_snake_case)] + mod $mod { + use cryptonum::unsigned::Decoder; + use super::*; + use testing::run_test; + use sha2::{Sha224,Sha256,Sha384,Sha512}; + + #[test] + fn verify() { + let fname = format!("testdata/dsa/sign{}.test", stringify!($params)); + run_test(fname.to_string(), 9, |case| { + let (neg0, pbytes) = case.get("p").unwrap(); + let (neg1, qbytes) = case.get("q").unwrap(); + let (neg2, gbytes) = case.get("g").unwrap(); + let (neg3, ybytes) = case.get("y").unwrap(); + let (neg4, _bytes) = case.get("x").unwrap(); + let (neg5, mbytes) = case.get("m").unwrap(); + let (neg6, hbytes) = case.get("h").unwrap(); + let (neg7, rbytes) = case.get("r").unwrap(); + let (neg8, sbytes) = case.get("s").unwrap(); + + assert!(!neg0 && !neg1 && !neg2 && !neg3 && !neg4 && + !neg5 && !neg6 && !neg7 && !neg8); + let p = $lt::from_bytes(pbytes); + let q = $nt::from_bytes(qbytes); + let g = $lt::from_bytes(gbytes); + //let x = $lt::from_bytes(xbytes); + let y = $lt::from_bytes(ybytes); + let h = usize::from($nt::from_bytes(hbytes)); + let r = $nt::from_bytes(rbytes); + let s = $nt::from_bytes(sbytes); + + let params = $params::new(p,g,q); + let public = DSAPubKey::<$params,$lt>::new(params, y); + let sig = DSASignature::<$nt>::new(r, s); + match h { + 224 => assert!(public.verify::(mbytes, &sig)), + 256 => assert!(public.verify::(mbytes, &sig)), + 384 => assert!(public.verify::(mbytes, &sig)), + 512 => assert!(public.verify::(mbytes, &sig)), + _ => panic!("Unexpected hash {}", h) + } + }); + } + } + )* + } +} + +generate_tests!( (DSA1024N160, L1024N160, U1024, U192), + (DSA2048N224, L2048N224, U2048, U256), + (DSA2048N256, L2048N256, U2048, U256), + (DSA3072N256, L3072N256, U3072, U256) + ); \ No newline at end of file