Skip to content

Commit cec69ca

Browse files
committed
a bit more test coverage
1 parent 582529c commit cec69ca

File tree

3 files changed

+133
-4
lines changed

3 files changed

+133
-4
lines changed

src/conversion.rs

+92-1
Original file line numberDiff line numberDiff line change
@@ -528,4 +528,95 @@ mod tests {
528528
simple_bit_pack(&r, (1 << 6) - 1, &mut random_bytes);
529529
// no panic is good news
530530
}
531-
}
531+
532+
#[test]
533+
#[should_panic(expected = "Alg 16: b out of range")]
534+
fn test_simple_bit_pack_b_range() {
535+
let w = R0; //([0i32; 256]);
536+
let mut bytes = [0u8; 32];
537+
simple_bit_pack(&w, 0, &mut bytes); // b must be positive
538+
}
539+
540+
#[test]
541+
#[should_panic(expected = "Alg 16: w out of range")]
542+
fn test_simple_bit_pack_w_range() {
543+
let mut w = R0; //([0i32; 256]);
544+
w.0[0] = 5;
545+
let mut bytes = [0u8; 32];
546+
simple_bit_pack(&w, 3, &mut bytes); // w coefficient > b
547+
}
548+
549+
#[test]
550+
#[should_panic(expected = "Alg 16: incorrect size of output bytes")]
551+
fn test_simple_bit_pack_output_size() {
552+
let w = R0; //([0i32; 256]);
553+
let mut bytes = [0u8; 65]; // Wrong output size
554+
simple_bit_pack(&w, 2, &mut bytes);
555+
}
556+
557+
#[test]
558+
#[should_panic(expected = "Alg 17: a out of range")]
559+
fn test_bit_pack_a_range() {
560+
let w = R0; //([0i32; 256]);
561+
let mut bytes = [0u8; 32];
562+
bit_pack(&w, -1, 2, &mut bytes); // a must be non-negative
563+
}
564+
565+
#[test]
566+
#[should_panic(expected = "Alg 17: b out of range")]
567+
fn test_bit_pack_b_range() {
568+
let w = R0; //([0i32; 256]);
569+
let mut bytes = [0u8; 32];
570+
bit_pack(&w, 0, 0, &mut bytes); // b must be positive
571+
}
572+
573+
#[test]
574+
#[should_panic(expected = "Alg 17: w out of range")]
575+
fn test_bit_pack_w_range() {
576+
let mut w = R0; //([0i32; 256]);
577+
w.0[0] = 10;
578+
let mut bytes = [0u8; 32];
579+
bit_pack(&w, 2, 5, &mut bytes); // w coefficient outside [-a,b] range
580+
}
581+
582+
#[test]
583+
#[should_panic(expected = "Alg 18: b out of range")]
584+
fn test_simple_bit_unpack_b_range() {
585+
let bytes = [0u8; 32];
586+
let _unused = simple_bit_unpack(&bytes, 0); // b must be positive
587+
}
588+
589+
#[test]
590+
#[should_panic(expected = "Alg 18: bad output size")]
591+
fn test_simple_bit_unpack_input_size() {
592+
let bytes = [0u8; 65]; // Wrong input size
593+
let _unused = simple_bit_unpack(&bytes, 2);
594+
}
595+
596+
#[test]
597+
#[should_panic(expected = "Alg 20: omega+K out of range")]
598+
fn test_hint_bit_pack_omega_k_range() {
599+
const K: usize = 255;
600+
let h = [R0; K];
601+
let mut y_bytes = [0u8; 256];
602+
hint_bit_pack::<false, K>(2, &h, &mut y_bytes); // omega + K must be < 256
603+
}
604+
605+
#[test]
606+
#[should_panic(expected = "Alg 20: h not 0/1")]
607+
fn test_hint_bit_pack_h_range() {
608+
const K: usize = 2;
609+
let mut h = [R0; K];
610+
h[0].0[0] = 2; // h must contain only 0s and 1s
611+
let mut y_bytes = [0u8; 4];
612+
hint_bit_pack::<false, K>(2, &h, &mut y_bytes);
613+
}
614+
615+
#[test]
616+
#[should_panic(expected = "Alg 21: omega+K too large")]
617+
fn test_hint_bit_unpack_omega_k_range() {
618+
const K: usize = 255;
619+
let y_bytes = [0u8; 256];
620+
let _unused = hint_bit_unpack::<K>(2, &y_bytes); // omega + K must be < 256
621+
}
622+
}

src/helpers.rs

+16-3
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,7 @@ pub(crate) const fn partial_reduce64(a: i64) -> i32 {
4343
res as i32
4444
}
4545

46-
47-
#[allow(dead_code)] // I may come back to this and experiment more
48-
#[allow(clippy::cast_possible_truncation)]
46+
#[allow(dead_code, clippy::cast_possible_truncation)] // I may come back to this and experiment more
4947
pub(crate) const fn partial_reduce64b(a: i64) -> i32 {
5048
const MM: i64 = ((1 << 64) / (Q as i128)) as i64;
5149
debug_assert!(a < (i64::MAX / 64), "partial_reduce64b input"); // actually, works for all 64b inputs!!
@@ -185,3 +183,18 @@ const fn gen_zeta_table_mont() -> [i32; 256] {
185183

186184

187185
pub(crate) static ZETA_TABLE_MONT: [i32; 256] = gen_zeta_table_mont();
186+
187+
188+
#[cfg(test)]
189+
mod tests {
190+
use super::*;
191+
192+
#[test]
193+
fn check_zeta() {
194+
let val = gen_zeta_table_mont();
195+
assert_eq!(val[0], 4193792);
196+
assert_eq!(val[1], 25847);
197+
assert_eq!(val[2], 5771523);
198+
199+
}
200+
}

src/lib.rs

+25
Original file line numberDiff line numberDiff line change
@@ -518,6 +518,31 @@ macro_rules! functionality {
518518
}
519519
assert_eq!(pk.clone().into_bytes(), sk.get_public_key().into_bytes());
520520
}
521+
522+
let (pk, sk) = try_keygen().unwrap();
523+
let sig = sk.try_sign(&message1, &[]).unwrap();
524+
assert!(pk.verify(&message1, &sig, &[]));
525+
assert!(!pk.verify(&message2, &sig, &[]));
526+
assert!(!pk.verify(&message1, &sig, &[0u8; 257]));
527+
assert!(sk.try_sign(&message1, &[0u8; 257]).is_err());
528+
529+
for ph in [Ph::SHA256, Ph::SHA512, Ph::SHAKE128] {
530+
let sig = sk.try_hash_sign(&message1, &[], &ph).unwrap();
531+
let v = pk.hash_verify(&message1, &sig, &[], &ph);
532+
assert!(v);
533+
}
534+
assert_eq!(pk.clone().into_bytes(), sk.get_public_key().into_bytes());
535+
536+
let (pk, _) = KG::keygen_from_seed(&[0x11u8; 32]);
537+
let pk_bytes = pk.into_bytes();
538+
if pk_bytes.len() == 1312 { assert_eq!(pk_bytes[0], 197) }
539+
if pk_bytes.len() == 1952 { assert_eq!(pk_bytes[0], 177) }
540+
if pk_bytes.len() == 2592 { assert_eq!(pk_bytes[0], 16) }
541+
542+
#[cfg(feature = "dudect")]
543+
#[allow(deprecated)] {
544+
assert!(dudect_keygen_sign_with_rng(&mut rng, &[0]).is_ok())
545+
}
521546
}
522547
}
523548

0 commit comments

Comments
 (0)