| use crate::arch::x86_64::{_rdrand16_step, _rdrand32_step, _rdrand64_step}; |
| |
| const RETRIES: u32 = 10; |
| |
| fn fail() -> ! { |
| panic!("failed to generate random data"); |
| } |
| |
| fn rdrand64() -> u64 { |
| unsafe { |
| let mut ret: u64 = 0; |
| for _ in 0..RETRIES { |
| if _rdrand64_step(&mut ret) == 1 { |
| return ret; |
| } |
| } |
| |
| fail(); |
| } |
| } |
| |
| fn rdrand32() -> u32 { |
| unsafe { |
| let mut ret: u32 = 0; |
| for _ in 0..RETRIES { |
| if _rdrand32_step(&mut ret) == 1 { |
| return ret; |
| } |
| } |
| |
| fail(); |
| } |
| } |
| |
| fn rdrand16() -> u16 { |
| unsafe { |
| let mut ret: u16 = 0; |
| for _ in 0..RETRIES { |
| if _rdrand16_step(&mut ret) == 1 { |
| return ret; |
| } |
| } |
| |
| fail(); |
| } |
| } |
| |
| pub fn fill_bytes(bytes: &mut [u8]) { |
| let mut chunks = bytes.array_chunks_mut(); |
| for chunk in &mut chunks { |
| *chunk = rdrand64().to_ne_bytes(); |
| } |
| |
| let mut chunks = chunks.into_remainder().array_chunks_mut(); |
| for chunk in &mut chunks { |
| *chunk = rdrand32().to_ne_bytes(); |
| } |
| |
| let mut chunks = chunks.into_remainder().array_chunks_mut(); |
| for chunk in &mut chunks { |
| *chunk = rdrand16().to_ne_bytes(); |
| } |
| |
| if let [byte] = chunks.into_remainder() { |
| *byte = rdrand16() as u8; |
| } |
| } |