use crate::error::{PqcError, Result};
#[cfg(any(feature = "ml-kem", feature = "ml-dsa"))]
use crate::state::check_operational;
#[cfg(feature = "ml-kem")]
use crate::{KyberSecretKey, KyberSharedSecret};
#[cfg(feature = "ml-dsa")]
use crate::DilithiumSigningKey;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CspExportPolicy {
AllowPlaintext,
BlockPlaintext,
}
pub fn get_csp_export_policy() -> CspExportPolicy {
#[cfg(feature = "fips_140_3")]
{
CspExportPolicy::BlockPlaintext
}
#[cfg(not(feature = "fips_140_3"))]
{
CspExportPolicy::AllowPlaintext
}
}
fn export_blocked() -> Result<()> {
if matches!(get_csp_export_policy(), CspExportPolicy::BlockPlaintext) {
Err(PqcError::CspExportBlocked)
} else {
Ok(())
}
}
#[cfg(feature = "ml-kem")]
pub fn guard_kyber_sk_export(_sk: &KyberSecretKey) -> Result<&[u8]> {
check_operational()?;
export_blocked()?;
unreachable!()
}
#[cfg(feature = "ml-dsa")]
pub fn guard_dilithium_sk_export(_sk: &DilithiumSigningKey) -> Result<&[u8]> {
check_operational()?;
export_blocked()?;
unreachable!()
}
#[cfg(feature = "ml-kem")]
pub fn guard_shared_secret_export(_ss: &KyberSharedSecret) -> Result<&[u8]> {
check_operational()?;
export_blocked()?;
unreachable!()
}