Path: blob/main/crates/wasi-common/src/random.rs
1691 views
use cap_rand::RngCore;12/// Implement `WasiRandom` using a deterministic cycle of bytes.3pub struct Deterministic {4cycle: std::iter::Cycle<std::vec::IntoIter<u8>>,5}67impl Deterministic {8pub fn new(bytes: Vec<u8>) -> Self {9Deterministic {10cycle: bytes.into_iter().cycle(),11}12}13}1415impl RngCore for Deterministic {16fn next_u32(&mut self) -> u32 {17let b0 = self.cycle.next().expect("infinite sequence");18let b1 = self.cycle.next().expect("infinite sequence");19let b2 = self.cycle.next().expect("infinite sequence");20let b3 = self.cycle.next().expect("infinite sequence");21((b0 as u32) << 24) + ((b1 as u32) << 16) + ((b2 as u32) << 8) + (b3 as u32)22}23fn next_u64(&mut self) -> u64 {24let w0 = self.next_u32();25let w1 = self.next_u32();26((w0 as u64) << 32) + (w1 as u64)27}28fn fill_bytes(&mut self, buf: &mut [u8]) {29for b in buf.iter_mut() {30*b = self.cycle.next().expect("infinite sequence");31}32}33fn try_fill_bytes(&mut self, buf: &mut [u8]) -> Result<(), cap_rand::Error> {34self.fill_bytes(buf);35Ok(())36}37}3839#[cfg(test)]40mod test {41use super::*;42#[test]43fn deterministic() {44let mut det = Deterministic::new(vec![1, 2, 3, 4]);45let mut buf = vec![0; 1024];46det.try_fill_bytes(&mut buf).expect("get randomness");47for (ix, b) in buf.iter().enumerate() {48assert_eq!(*b, (ix % 4) as u8 + 1)49}50}51}525354