use crate::error::{Result, SecurityError};
use crate::ffi;
use crate::private::sec_error_message;
pub struct SecureRandom;
impl SecureRandom {
pub fn fill(buffer: &mut [u8]) -> Result<()> {
if buffer.is_empty() {
return Ok(());
}
let status = unsafe {
ffi::SecRandomCopyBytes(
ffi::kSecRandomDefault,
buffer.len(),
buffer.as_mut_ptr().cast(),
)
};
if status == ffi::status::SUCCESS {
Ok(())
} else {
Err(SecurityError::from_status(
"SecRandomCopyBytes",
status,
sec_error_message(status),
))
}
}
pub fn bytes(length: usize) -> Result<Vec<u8>> {
let mut buffer = vec![0_u8; length];
Self::fill(&mut buffer)?;
Ok(buffer)
}
}