zenith_session/adapter/
rng.rs1use crate::error::SessionError;
4
5pub trait Rng {
13 fn fill_bytes(&self, buf: &mut [u8]) -> Result<(), SessionError>;
15}
16
17pub struct FakeRng(pub u8);
22
23impl Rng for FakeRng {
24 fn fill_bytes(&self, buf: &mut [u8]) -> Result<(), SessionError> {
25 buf.fill(self.0);
26 Ok(())
27 }
28}
29
30pub struct OsRng;
32
33impl Rng for OsRng {
34 fn fill_bytes(&self, buf: &mut [u8]) -> Result<(), SessionError> {
35 getrandom::fill(buf).map_err(|e| SessionError::new(format!("os entropy failure: {e}")))
36 }
37}
38
39#[cfg(test)]
40mod tests {
41 use super::*;
42
43 #[test]
44 fn fake_rng_fills_all_bytes_with_its_value() {
45 let rng = FakeRng(0xAB);
46 let mut buf = [0u8; 8];
47 rng.fill_bytes(&mut buf).unwrap();
48 assert_eq!(buf, [0xAB; 8]);
49 }
50
51 #[test]
52 fn fake_rng_zero_value() {
53 let rng = FakeRng(0x00);
54 let mut buf = [0xFFu8; 4];
55 rng.fill_bytes(&mut buf).unwrap();
56 assert_eq!(buf, [0x00; 4]);
57 }
58
59 #[test]
60 fn os_rng_smoke() {
61 let result = OsRng.fill_bytes(&mut [0u8; 16]);
62 assert!(result.is_ok());
63 }
64}