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}