use crate::drbg::HmacDrbgSha256;
use noxtls_core::{Error, Result};
use super::{
noxtls_mldsa_generate_keypair_auto, noxtls_mldsa_verify, noxtls_mlkem_decapsulate,
noxtls_mlkem_encapsulate_auto, noxtls_mlkem_generate_keypair_auto,
};
pub fn noxtls_run_pq_self_tests() -> Result<()> {
run_mlkem_self_test()?;
run_mldsa_self_test()?;
Ok(())
}
fn run_mlkem_self_test() -> Result<()> {
let mut drbg =
HmacDrbgSha256::noxtls_new(b"pq-selftest-mlkem-entropy-seed", b"nonce", b"selftest")?;
let (private, public) = noxtls_mlkem_generate_keypair_auto(&mut drbg)?;
let (ciphertext, shared_sender) = noxtls_mlkem_encapsulate_auto(&public, &mut drbg)?;
let shared_receiver = noxtls_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::noxtls_new(b"pq-selftest-mldsa-entropy-seed", b"nonce", b"selftest")?;
let (private, public) = noxtls_mldsa_generate_keypair_auto(&mut drbg)?;
let message = b"pq-selftest-message";
let mut signature = private.sign(message);
noxtls_mldsa_verify(&public, message, &signature)?;
signature[0] ^= 0x01;
if noxtls_mldsa_verify(&public, message, &signature).is_ok() {
return Err(Error::CryptoFailure(
"pq self-test mldsa tamper check unexpectedly passed",
));
}
Ok(())
}