blob: 587068b0d664194211397ebad4603fe3ba1e4f37 [file] [log] [blame]
//! Random data from `/dev/urandom`
//!
//! Before `getentropy` was standardized in 2024, UNIX didn't have a standardized
//! way of getting random data, so systems just followed the precedent set by
//! Linux and exposed random devices at `/dev/random` and `/dev/urandom`. Thus,
//! for the few systems that support neither `arc4random_buf` nor `getentropy`
//! yet, we just read from the file.
use crate::fs::File;
use crate::io::Read;
use crate::sync::OnceLock;
static DEVICE: OnceLock<File> = OnceLock::new();
pub fn fill_bytes(bytes: &mut [u8]) {
DEVICE
.get_or_try_init(|| File::open("/dev/urandom"))
.and_then(|mut dev| dev.read_exact(bytes))
.expect("failed to generate random data");
}