Nothing to see here, move along
1use core::arch::x86_64::_rdrand64_step;
2use getrandom::register_custom_getrandom;
3
4fn rdrand_getrandom(buf: &mut [u8]) -> Result<(), getrandom::Error> {
5 buf.chunks_mut(8).try_for_each(|chunk| {
6 let mut val: u64 = 0;
7 let ok = (0..10u8).any(|_| unsafe { _rdrand64_step(&mut val) } == 1);
8 match ok {
9 true => {
10 chunk.copy_from_slice(&val.to_ne_bytes()[..chunk.len()]);
11 Ok(())
12 }
13 false => Err(getrandom::Error::UNSUPPORTED),
14 }
15 })
16}
17
18register_custom_getrandom!(rdrand_getrandom);