| use crate::sync::atomic::Ordering::Relaxed; | |
| use crate::sync::atomic::{Atomic, AtomicBool}; | |
| static RNG_INIT: Atomic<bool> = AtomicBool::new(false); | |
| pub fn fill_bytes(mut bytes: &mut [u8]) { | |
| while !RNG_INIT.load(Relaxed) { | |
| let ret = unsafe { libc::randSecure() }; | |
| if ret < 0 { | |
| panic!("failed to generate random data"); | |
| } else if ret > 0 { | |
| RNG_INIT.store(true, Relaxed); | |
| break; | |
| } | |
| unsafe { libc::usleep(10) }; | |
| } | |
| while !bytes.is_empty() { | |
| let len = bytes.len().try_into().unwrap_or(libc::c_int::MAX); | |
| let ret = unsafe { libc::randABytes(bytes.as_mut_ptr(), len) }; | |
| assert!(ret >= 0, "failed to generate random data"); | |
| bytes = &mut bytes[len as usize..]; | |
| } | |
| } |