use std::sync::Mutex;
use rustls::crypto::{GetRandomFailed, SecureRandom};
#[derive(Debug)]
pub struct SystemRandom;
impl SecureRandom for SystemRandom {
fn fill(&self, buf: &mut [u8]) -> Result<(), GetRandomFailed> {
ferritls_core::entropy::fill(buf).map_err(|_| GetRandomFailed)
}
fn fips(&self) -> bool {
false
}
}
pub static SYSTEM_RANDOM: &dyn SecureRandom = &SystemRandom;
#[derive(Debug)]
pub struct FipsRandom;
static FIPS_DRBG: Mutex<Option<ferritls_core::drbg::CtrDrbg>> = Mutex::new(None);
impl SecureRandom for FipsRandom {
fn fill(&self, buf: &mut [u8]) -> Result<(), GetRandomFailed> {
let mut guard = FIPS_DRBG.lock().map_err(|_| GetRandomFailed)?;
let drbg = match guard.as_mut() {
Some(d) => d,
None => {
let d = ferritls_core::drbg::CtrDrbg::instantiate_from_os(b"ferritls-tls-random")
.map_err(|_| GetRandomFailed)?;
guard.insert(d)
}
};
drbg.generate_mixed(buf).map_err(|_| GetRandomFailed)
}
fn fips(&self) -> bool {
false
}
}
pub static FIPS_RANDOM: &dyn SecureRandom = &FipsRandom;