sqisign_verify/params/
level3.rs1use super::{Level3, SecurityLevel};
6use hybrid_array::sizes::{U196, U224, U316, U432, U48, U6, U7, U96, U97};
7
8pub const PRIME_LE_BYTES: [u8; 48] = {
13 let mut bytes = [0xffu8; 48];
14 bytes[47] = 0x40;
15 bytes
16};
17
18impl SecurityLevel for Level3 {
19 type FpLimbs = U7;
21 type MpLimbs = U6;
23 type FpEncodedBytes = U48;
25 type Fp2EncodedBytes = U96;
27 type PkLen = U97;
29 type SigLen = U224;
31 type ExpandedSigLen = U316;
33 type CompressedSigLen = U196;
35 type SkLen = U432;
37
38 fn prime_le_bytes() -> &'static [u8] {
39 &PRIME_LE_BYTES
40 }
41
42 const LAMBDA: u32 = 192;
44
45 const F_CHR: u32 = 376;
47 const E_RSP: u32 = 192;
49 const E_CHL: u32 = 192;
51 const HASH_ITERATIONS: u32 = 256;
53 const NWORDS_ORDER: usize = 6;
55 const TORSION_EVEN_POWER: u32 = 376;
57 const P_COFACTOR_FOR_2F_BITLENGTH: usize = 7;
59 const SQISIGN_RESPONSE_LENGTH: u32 = 192;
61}
62
63#[cfg(test)]
64mod tests {
65 use super::*;
66
67 #[test]
68 fn level3_prime_is_correct() {
69 let bytes = Level3::prime_le_bytes();
70 assert_eq!(bytes.len(), 48);
71 for &b in &bytes[..47] {
72 assert_eq!(b, 0xFF, "low 47 bytes of p must all be 0xFF");
73 }
74 assert_eq!(bytes[47], 0x40, "top byte of p must be 0x40");
75 }
76
77 #[test]
78 fn level3_prime_is_3_mod_4() {
79 let bytes = Level3::prime_le_bytes();
80 assert_eq!(bytes[0] & 0b11, 3, "p mod 4 must be 3");
81 }
82
83 const _: () = assert!(Level3::F_CHR > Level3::LAMBDA);
84 const _: () = assert!(Level3::E_RSP > 0);
85
86 #[test]
87 fn level3_protocol_exponents_in_range() {
88 assert_eq!(Level3::LAMBDA, 192);
89 assert_eq!(Level3::F_CHR, 376);
90 assert_eq!(Level3::E_RSP, 192);
91 }
92}