lpc55_hal/drivers/
rng.rs

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            // get 4 bytes
17            let random_word: u32 = self.get_random_u32();
18            let bytes: [u8; 4] = random_word.to_ne_bytes();
19
20            // copy to buffer as needed
21            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> {}