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