Skip to main content

ferritls_rustls/
random.rs

1//! `SecureRandom` 适配:rustls 的握手随机数需求桥接到 ferritls-core。
2//!
3//! - [`SYSTEM_RANDOM`]:OS 熵直读(getrandom),默认模式使用;
4//! - [`FIPS_RANDOM`]:边界内 CTR-DRBG(懒实例化 + 上电自检守卫),每次
5//!   读取以 128 位 OS 熵作 additional input(Go FIPS 模块策略),批准
6//!   模式 provider 使用。
7
8use std::sync::Mutex;
9
10use rustls::crypto::{GetRandomFailed, SecureRandom};
11
12/// ferritls 的 `SecureRandom` 实现(OS 熵直读)。
13#[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(lib.rs“fips() 语义”)。
23        false
24    }
25}
26
27/// 单例引用(填入 `CryptoProvider::secure_random`)。
28pub static SYSTEM_RANDOM: &dyn SecureRandom = &SystemRandom;
29
30/// 批准模式随机源:进程级 CTR-DRBG(懒实例化)。
31#[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(lib.rs“fips() 语义”)。
52        false
53    }
54}
55
56/// 批准模式单例引用。
57pub static FIPS_RANDOM: &dyn SecureRandom = &FipsRandom;