os/security/
entropy_pool.rs

1//! 安全相关模块 - 熵池
2
3#![allow(dead_code)]
4
5/// 熵池的最小种子位数阈值,确保足够的初始熵以安全地生成随机数。
6pub const MIN_SEED_BITS: usize = 128;
7
8/// 定义熵池操作所需的错误类型。
9pub enum EntropyError {
10    /// 熵池未初始化或熵值不足。
11    Unseeded,
12    /// 内部状态或锁定错误。
13    InternalError,
14}
15
16/// 核心熵池(Entropy Pool)的 trait,定义了管理和提供高质量随机数的方法。
17pub trait EntropyPool {
18    ///
19    /// 创建一个新的熵池实例。
20    fn new() -> Self;
21
22    ///
23    /// 尝试从熵池中提取随机字节来填充目标缓冲区。
24    ///
25    /// 这个操作通常会消耗熵池中的熵,并且依赖于内部的 CSPRNG 算法。
26    ///
27    /// # 参数
28    /// * `dest`: 待填充的缓冲区。
29    ///
30    /// # 返回
31    /// 成功时返回填充的字节数(如果是非阻塞模式,可能少于请求的字节数),
32    /// 失败时返回 EntropyError。
33    fn try_fill(&mut self, dest: &mut [u8]) -> Result<usize, EntropyError>;
34
35    ///
36    /// 向熵池注入新的原始熵数据。
37    ///
38    /// 这是外部熵源(如驱动程序、计时器抖动、TRNG)更新熵池的主要方法。
39    ///
40    /// # 参数
41    /// * `data`: 待注入的原始数据。
42    /// * `entropy_bits`: 估计数据中包含的真实熵位数。
43    ///
44    /// # 关键:
45    /// 实现必须负责将数据混合到熵池状态中(例如 SHA-256 哈希或 Gigue 混合函数)。
46    fn add_entropy(&mut self, data: &[u8], entropy_bits: usize);
47
48    ///
49    /// 获取当前估计的熵池中高品质熵的位数。
50    ///
51    /// 用于判断熵池的健康状态和是否可以安全地提供随机数。
52    fn get_entropy_count(&self) -> usize;
53
54    ///
55    /// 检查熵池是否已经收集了足够的初始熵,可以安全地进行操作。
56    fn is_seeded(&self) -> bool {
57        // 默认实现:只要熵位数达到安全阈值即可
58        self.get_entropy_count() >= MIN_SEED_BITS
59    }
60}
61
62/// 一个简单的伪熵池实现。
63pub struct BiogasPoll {
64    biogas: usize,
65}
66
67impl EntropyPool for BiogasPoll {
68    fn new() -> Self {
69        BiogasPoll {
70            biogas: 0x1145141919810,
71        }
72    }
73
74    fn try_fill(&mut self, dest: &mut [u8]) -> Result<usize, EntropyError> {
75        for i in 0..dest.len() {
76            dest[i] = (self.biogas & 0xFF) as u8;
77            self.biogas = self
78                .biogas
79                .wrapping_mul(6364136223846793005)
80                .wrapping_add(1);
81        }
82        Ok(dest.len())
83    }
84
85    fn add_entropy(&mut self, _data: &[u8], _entropy_bits: usize) {
86        // 简单实现不做任何操作
87    }
88
89    fn get_entropy_count(&self) -> usize {
90        114514
91    }
92
93    fn is_seeded(&self) -> bool {
94        true
95    }
96}