• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #[cfg(soong)]
2 use bssl_ffi as ffi;
3 use kmr_common::crypto;
4 
5 /// [`crypto::Rng`] implementation based on BoringSSL.
6 #[derive(Default)]
7 pub struct BoringRng;
8 
9 impl crypto::Rng for BoringRng {
add_entropy(&mut self, data: &[u8])10     fn add_entropy(&mut self, data: &[u8]) {
11         #[cfg(soong)]
12         unsafe {
13             // Safety: `data` is a valid slice.
14             ffi::RAND_seed(data.as_ptr() as *const libc::c_void, data.len() as libc::c_int);
15         }
16         #[cfg(not(soong))]
17         unsafe {
18             // Safety: `data` is a valid slice.
19             ffi::RAND_add(
20                 data.as_ptr() as *const libc::c_void,
21                 data.len() as libc::c_int,
22                 data.len() as f64,
23             );
24         }
25     }
fill_bytes(&mut self, dest: &mut [u8])26     fn fill_bytes(&mut self, dest: &mut [u8]) {
27         openssl::rand::rand_bytes(dest).unwrap(); // safe: BoringSSL's RAND_bytes() never fails
28     }
29 }
30