use super::{Level3, SecurityLevel};
use hybrid_array::sizes::{U196, U224, U316, U432, U48, U6, U7, U96, U97};
pub const PRIME_LE_BYTES: [u8; 48] = {
let mut bytes = [0xffu8; 48];
bytes[47] = 0x40;
bytes
};
impl SecurityLevel for Level3 {
type FpLimbs = U7;
type MpLimbs = U6;
type FpEncodedBytes = U48;
type Fp2EncodedBytes = U96;
type PkLen = U97;
type SigLen = U224;
type ExpandedSigLen = U316;
type CompressedSigLen = U196;
type SkLen = U432;
fn prime_le_bytes() -> &'static [u8] {
&PRIME_LE_BYTES
}
const LAMBDA: u32 = 192;
const F_CHR: u32 = 376;
const E_RSP: u32 = 192;
const E_CHL: u32 = 192;
const HASH_ITERATIONS: u32 = 256;
const NWORDS_ORDER: usize = 6;
const TORSION_EVEN_POWER: u32 = 376;
const P_COFACTOR_FOR_2F_BITLENGTH: usize = 7;
const SQISIGN_RESPONSE_LENGTH: u32 = 192;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn level3_prime_is_correct() {
let bytes = Level3::prime_le_bytes();
assert_eq!(bytes.len(), 48);
for &b in &bytes[..47] {
assert_eq!(b, 0xFF, "low 47 bytes of p must all be 0xFF");
}
assert_eq!(bytes[47], 0x40, "top byte of p must be 0x40");
}
#[test]
fn level3_prime_is_3_mod_4() {
let bytes = Level3::prime_le_bytes();
assert_eq!(bytes[0] & 0b11, 3, "p mod 4 must be 3");
}
const _: () = assert!(Level3::F_CHR > Level3::LAMBDA);
const _: () = assert!(Level3::E_RSP > 0);
#[test]
fn level3_protocol_exponents_in_range() {
assert_eq!(Level3::LAMBDA, 192);
assert_eq!(Level3::F_CHR, 376);
assert_eq!(Level3::E_RSP, 192);
}
}