use crate::drbg::HmacDrbgSha256;
use noxtls_core::{Error, Result};
use super::{
mldsa_generate_keypair_auto, mldsa_verify, mlkem_decapsulate, mlkem_encapsulate_auto,
mlkem_generate_keypair_auto,
};
pub fn run_pq_self_tests() -> Result<()> {
run_mlkem_self_test()?;
run_mldsa_self_test()?;
Ok(())
}
fn run_mlkem_self_test() -> Result<()> {
let mut drbg = HmacDrbgSha256::new(b"pq-selftest-mlkem-entropy-seed", b"nonce", b"selftest")?;
let (private, public) = mlkem_generate_keypair_auto(&mut drbg)?;
let (ciphertext, shared_sender) = mlkem_encapsulate_auto(&public, &mut drbg)?;
let shared_receiver = mlkem_decapsulate(&private, &ciphertext)?;
if shared_sender != shared_receiver {
return Err(Error::CryptoFailure(
"pq self-test mlkem shared secret mismatch",
));
}
Ok(())
}
fn run_mldsa_self_test() -> Result<()> {
let mut drbg = HmacDrbgSha256::new(b"pq-selftest-mldsa-entropy-seed", b"nonce", b"selftest")?;
let (private, public) = mldsa_generate_keypair_auto(&mut drbg)?;
let message = b"pq-selftest-message";
let mut signature = private.sign(message);
mldsa_verify(&public, message, &signature)?;
signature[0] ^= 0x01;
if mldsa_verify(&public, message, &signature).is_ok() {
return Err(Error::CryptoFailure(
"pq self-test mldsa tamper check unexpectedly passed",
));
}
Ok(())
}