use super::{Level1, SecurityLevel};
use hybrid_array::sizes::{U129, U148, U212, U288, U32, U4, U5, U64, U65};
pub const PRIME_LE_BYTES: [u8; 32] = {
let mut bytes = [0xffu8; 32];
bytes[31] = 0x04;
bytes
};
impl SecurityLevel for Level1 {
type FpLimbs = U5;
type MpLimbs = U4;
type FpEncodedBytes = U32;
type Fp2EncodedBytes = U64;
type PkLen = U65;
type SigLen = U148;
type ExpandedSigLen = U212;
type CompressedSigLen = U129;
type SkLen = U288;
fn prime_le_bytes() -> &'static [u8] {
&PRIME_LE_BYTES
}
const LAMBDA: u32 = 128;
const F_CHR: u32 = 248;
const E_RSP: u32 = 126;
const E_CHL: u32 = 128;
const HASH_ITERATIONS: u32 = 64;
const NWORDS_ORDER: usize = 4;
const TORSION_EVEN_POWER: u32 = 248;
const P_COFACTOR_FOR_2F_BITLENGTH: usize = 3;
const SQISIGN_RESPONSE_LENGTH: u32 = 126;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn level1_prime_is_correct() {
let bytes = Level1::prime_le_bytes();
assert_eq!(bytes.len(), 32);
for &b in &bytes[..31] {
assert_eq!(b, 0xFF, "low 31 bytes of p must all be 0xFF");
}
assert_eq!(bytes[31], 0x04, "top byte of p must be 0x04");
}
#[test]
fn level1_prime_is_3_mod_4() {
let bytes = Level1::prime_le_bytes();
assert_eq!(bytes[0] & 0b11, 3, "p mod 4 must be 3");
}
const _: () = assert!(Level1::F_CHR > Level1::LAMBDA);
const _: () = assert!(Level1::E_RSP > 0);
#[test]
fn level1_protocol_exponents_in_range() {
assert_eq!(Level1::LAMBDA, 128);
assert_eq!(Level1::F_CHR, 248);
assert_eq!(Level1::E_RSP, 126);
}
}