use crate::errors::{CrabError, CrabResult};
pub fn secure_bytes(len: usize) -> CrabResult<Vec<u8>> {
let mut buf = vec![0u8; len];
getrandom::fill(&mut buf)
.map_err(|e| CrabError::random_error(format!("Failed to generate random bytes: {}", e)))?;
Ok(buf)
}
pub fn fill_secure_bytes(buf: &mut [u8]) -> CrabResult<()> {
getrandom::fill(buf).map_err(|e| {
CrabError::random_error(format!("Failed to fill buffer with random bytes: {}", e))
})?;
Ok(())
}
pub fn generate_key_256() -> CrabResult<Vec<u8>> {
secure_bytes(32)
}
pub fn generate_key_128() -> CrabResult<Vec<u8>> {
secure_bytes(16)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_secure_bytes() {
let bytes = secure_bytes(32).unwrap();
assert_eq!(bytes.len(), 32);
let bytes2 = secure_bytes(32).unwrap();
assert_ne!(bytes, bytes2);
}
#[test]
fn test_fill_secure_bytes() {
let mut buf = [0u8; 64];
fill_secure_bytes(&mut buf).unwrap();
assert_ne!(buf, [0u8; 64]);
}
#[test]
fn test_generate_key_256() {
let key = generate_key_256().unwrap();
assert_eq!(key.len(), 32);
}
#[test]
fn test_generate_key_128() {
let key = generate_key_128().unwrap();
assert_eq!(key.len(), 16);
}
#[test]
fn test_randomness_quality() {
let bytes = secure_bytes(1000).unwrap();
let first = bytes[0];
let all_same = bytes.iter().all(|&b| b == first);
assert!(!all_same, "Random bytes should not all be identical");
}
}