use crypto_bigint::U256;
use lib_q_prf::PrfError;
use lib_q_prf::keys::validate_key_u256;
fn modulus() -> U256 {
U256::from_be_hex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1")
}
#[test]
fn zero_key_rejected() {
let p = modulus();
assert_eq!(
validate_key_u256(&U256::ZERO, &p),
Err(PrfError::InvalidKey)
);
}
#[test]
fn key_equal_to_or_above_modulus_rejected() {
let p = modulus();
assert_eq!(validate_key_u256(&p, &p), Err(PrfError::InvalidKey));
let above = p.wrapping_add(&U256::ONE);
assert_eq!(validate_key_u256(&above, &p), Err(PrfError::InvalidKey));
}
#[test]
fn in_range_key_accepted() {
let p = modulus();
assert!(validate_key_u256(&U256::ONE, &p).is_ok());
let just_below = p.wrapping_sub(&U256::ONE);
assert!(validate_key_u256(&just_below, &p).is_ok());
}
#[test]
fn nonzero_key_with_a_single_set_word_at_any_position_is_accepted() {
let p = modulus();
for byte_idx in (0..32usize).step_by(4) {
let mut bytes = [0u8; 32];
bytes[byte_idx] = 0x01;
let k = U256::from_le_slice(&bytes);
assert!(
validate_key_u256(&k, &p).is_ok(),
"key with only the word at byte offset {byte_idx} set was rejected as invalid"
);
}
}