crypto.rs
1 use esp_hal::rng::Rng; 2 3 /// ESP32-S3 hardware RNG wrapped to satisfy `rand::CryptoRng`. 4 /// The hardware RNG produces true random numbers from thermal noise. 5 pub struct CryptoRng(pub Rng); 6 7 impl rand::RngCore for CryptoRng { 8 fn next_u32(&mut self) -> u32 { 9 self.0.random() 10 } 11 12 fn next_u64(&mut self) -> u64 { 13 (u64::from(self.0.random()) << 32) | u64::from(self.0.random()) 14 } 15 16 fn fill_bytes(&mut self, dest: &mut [u8]) { 17 for chunk in dest.chunks_mut(4) { 18 let r = self.0.random().to_le_bytes(); 19 chunk.copy_from_slice(&r[..chunk.len()]); 20 } 21 } 22 23 fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), rand::Error> { 24 self.fill_bytes(dest); 25 Ok(()) 26 } 27 } 28 29 impl rand::CryptoRng for CryptoRng {}