std\sys\random/
windows.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
use crate::sys::c;

#[cfg(not(target_vendor = "win7"))]
#[inline]
pub fn fill_bytes(bytes: &mut [u8]) {
    let ret = unsafe { c::ProcessPrng(bytes.as_mut_ptr(), bytes.len()) };
    // ProcessPrng is documented as always returning `TRUE`.
    // https://learn.microsoft.com/en-us/windows/win32/seccng/processprng#return-value
    debug_assert_eq!(ret, c::TRUE);
}

#[cfg(target_vendor = "win7")]
pub fn fill_bytes(mut bytes: &mut [u8]) {
    while !bytes.is_empty() {
        let len = bytes.len().try_into().unwrap_or(u32::MAX);
        let ret = unsafe { c::RtlGenRandom(bytes.as_mut_ptr().cast(), len) };
        assert_ne!(ret, 0, "failed to generate random data");
        bytes = &mut bytes[len as usize..];
    }
}