use core::ffi::c_void;
use vck_common::{rng::RandomSource, VckError, VckResult};
use wdk_sys::NTSTATUS;
const BCRYPT_USE_SYSTEM_PREFERRED_RNG: u32 = 0x0000_0002;
extern "system" {
fn BCryptGenRandom(
h_algorithm: *mut c_void,
pb_buffer: *mut u8,
cb_buffer: u32,
dw_flags: u32,
) -> NTSTATUS;
}
pub struct KernelRng;
impl RandomSource for KernelRng {
fn fill(&self, buf: &mut [u8]) -> VckResult<()> {
let status = unsafe {
BCryptGenRandom(
core::ptr::null_mut(),
buf.as_mut_ptr(),
buf.len() as u32,
BCRYPT_USE_SYSTEM_PREFERRED_RNG,
)
};
if status < 0 {
return Err(VckError::CryptoFailed("BCryptGenRandom failed"));
}
Ok(())
}
}
pub static KERNEL_RNG: KernelRng = KernelRng;