use crate::error::SessionError;
pub trait Rng {
fn fill_bytes(&self, buf: &mut [u8]) -> Result<(), SessionError>;
}
pub struct FakeRng(pub u8);
impl Rng for FakeRng {
fn fill_bytes(&self, buf: &mut [u8]) -> Result<(), SessionError> {
buf.fill(self.0);
Ok(())
}
}
pub struct OsRng;
impl Rng for OsRng {
fn fill_bytes(&self, buf: &mut [u8]) -> Result<(), SessionError> {
getrandom::fill(buf).map_err(|e| SessionError::new(format!("os entropy failure: {e}")))
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn fake_rng_fills_all_bytes_with_its_value() {
let rng = FakeRng(0xAB);
let mut buf = [0u8; 8];
rng.fill_bytes(&mut buf).unwrap();
assert_eq!(buf, [0xAB; 8]);
}
#[test]
fn fake_rng_zero_value() {
let rng = FakeRng(0x00);
let mut buf = [0xFFu8; 4];
rng.fill_bytes(&mut buf).unwrap();
assert_eq!(buf, [0x00; 4]);
}
#[test]
fn os_rng_smoke() {
let result = OsRng.fill_bytes(&mut [0u8; 16]);
assert!(result.is_ok());
}
}