ferritls_rustls/
random.rs1use std::sync::Mutex;
9
10use rustls::crypto::{GetRandomFailed, SecureRandom};
11
12#[derive(Debug)]
14pub struct SystemRandom;
15
16impl SecureRandom for SystemRandom {
17 fn fill(&self, buf: &mut [u8]) -> Result<(), GetRandomFailed> {
18 ferritls_core::entropy::fill(buf).map_err(|_| GetRandomFailed)
19 }
20
21 fn fips(&self) -> bool {
22 false
24 }
25}
26
27pub static SYSTEM_RANDOM: &dyn SecureRandom = &SystemRandom;
29
30#[derive(Debug)]
32pub struct FipsRandom;
33
34static FIPS_DRBG: Mutex<Option<ferritls_core::drbg::CtrDrbg>> = Mutex::new(None);
35
36impl SecureRandom for FipsRandom {
37 fn fill(&self, buf: &mut [u8]) -> Result<(), GetRandomFailed> {
38 let mut guard = FIPS_DRBG.lock().map_err(|_| GetRandomFailed)?;
39 let drbg = match guard.as_mut() {
40 Some(d) => d,
41 None => {
42 let d = ferritls_core::drbg::CtrDrbg::instantiate_from_os(b"ferritls-tls-random")
43 .map_err(|_| GetRandomFailed)?;
44 guard.insert(d)
45 }
46 };
47 drbg.generate_mixed(buf).map_err(|_| GetRandomFailed)
48 }
49
50 fn fips(&self) -> bool {
51 false
53 }
54}
55
56pub static FIPS_RANDOM: &dyn SecureRandom = &FipsRandom;