use std::sync::Once;
#[derive(Debug, thiserror::Error)]
pub enum CryptoProviderError {
#[error("failed to install FIPS crypto provider - another provider is already installed")]
FipsProviderConflict,
}
static INSTALLED: Once = Once::new();
pub fn init_crypto_provider() -> Result<(), CryptoProviderError> {
let mut result = Ok(());
INSTALLED.call_once(|| {
#[cfg(feature = "fips")]
{
if rustls::crypto::default_fips_provider()
.install_default()
.is_err()
{
result = Err(CryptoProviderError::FipsProviderConflict);
return;
}
tracing::info!("FIPS-140-3 crypto provider installed (AWS-LC FIPS module)");
}
#[cfg(not(feature = "fips"))]
{
let _ = rustls::crypto::aws_lc_rs::default_provider().install_default();
}
});
result
}