#[cfg(any(feature = "ml-kem", feature = "ml-dsa"))]
use crate::error::{PqcError, Result};
#[cfg(feature = "ml-kem")]
use crate::{
kyber_decapsulate_internal, kyber_encapsulate_internal, KyberPrivateKey, KyberPublicKey,
};
#[cfg(feature = "ml-dsa")]
use crate::{
dilithium_sign_internal, dilithium_verify_internal, DilithiumSigningKey, DilithiumVerifyingKey,
FIPS_CONTEXT,
};
#[cfg(feature = "ml-kem")]
pub fn kyber_pct(pk: &KyberPublicKey, sk: &KyberPrivateKey) -> Result<()> {
let randomness = [0x55u8; 32];
let (ct, ss1) = kyber_encapsulate_internal(pk, randomness);
let ss2 = kyber_decapsulate_internal(sk, &ct);
if ss1 == ss2 {
Ok(())
} else {
Err(PqcError::PairwiseConsistencyTestFailure)
}
}
#[cfg(feature = "ml-dsa")]
pub fn dilithium_pct(pk: &DilithiumVerifyingKey, sk: &DilithiumSigningKey) -> Result<()> {
let randomness = [0x77u8; 32];
let msg = b"FIPS 140-3 PCT";
let sig = dilithium_sign_internal(sk, msg, FIPS_CONTEXT, randomness)
.map_err(|_| PqcError::PairwiseConsistencyTestFailure)?;
dilithium_verify_internal(pk, msg, FIPS_CONTEXT, &sig)
.map_err(|_| PqcError::PairwiseConsistencyTestFailure)
}