1use crate::traits::{rand_core, wg::blocking::rng};
2
3use crate::typestates::init_state;
4
5use crate::Rng;
6
7#[derive(Debug)]
8pub enum Error {}
9
10impl rng::Read for Rng<init_state::Enabled> {
11 type Error = Error;
12
13 fn read(&mut self, buffer: &mut [u8]) -> Result<(), Self::Error> {
14 let mut i = 0usize;
15 while i < buffer.len() {
16 let random_word: u32 = self.get_random_u32();
18 let bytes: [u8; 4] = random_word.to_ne_bytes();
19
20 let n = core::cmp::min(4, buffer.len() - i);
22 buffer[i..i + n].copy_from_slice(&bytes[..n]);
23 i += n;
24 }
25
26 Ok(())
27 }
28}
29
30impl rand_core::RngCore for Rng<init_state::Enabled> {
31 fn next_u32(&mut self) -> u32 {
32 self.get_random_u32()
33 }
34
35 fn next_u64(&mut self) -> u64 {
36 rand_core::impls::next_u64_via_u32(self)
37 }
38
39 fn fill_bytes(&mut self, dest: &mut [u8]) {
40 rand_core::impls::fill_bytes_via_next(self, dest)
41 }
42
43 fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), rand_core::Error> {
44 self.fill_bytes(dest);
45 Ok(())
46 }
47}
48
49impl rand_core::CryptoRng for Rng<init_state::Enabled> {}