/ firmware / src / hardware / crypto.rs
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 {}