192f3ab15Sopenharmony_ci//! Utilities for secure random number generation. 292f3ab15Sopenharmony_ci//! 392f3ab15Sopenharmony_ci//! # Examples 492f3ab15Sopenharmony_ci//! 592f3ab15Sopenharmony_ci//! To generate a buffer with cryptographically strong bytes: 692f3ab15Sopenharmony_ci//! 792f3ab15Sopenharmony_ci//! ``` 892f3ab15Sopenharmony_ci//! use openssl::rand::rand_bytes; 992f3ab15Sopenharmony_ci//! 1092f3ab15Sopenharmony_ci//! let mut buf = [0; 256]; 1192f3ab15Sopenharmony_ci//! rand_bytes(&mut buf).unwrap(); 1292f3ab15Sopenharmony_ci//! ``` 1392f3ab15Sopenharmony_ciuse libc::c_int; 1492f3ab15Sopenharmony_ci 1592f3ab15Sopenharmony_ciuse crate::error::ErrorStack; 1692f3ab15Sopenharmony_ciuse crate::{cvt, LenType}; 1792f3ab15Sopenharmony_ciuse openssl_macros::corresponds; 1892f3ab15Sopenharmony_ci 1992f3ab15Sopenharmony_ci/// Fill buffer with cryptographically strong pseudo-random bytes. 2092f3ab15Sopenharmony_ci/// 2192f3ab15Sopenharmony_ci/// # Examples 2292f3ab15Sopenharmony_ci/// 2392f3ab15Sopenharmony_ci/// To generate a buffer with cryptographically strong random bytes: 2492f3ab15Sopenharmony_ci/// 2592f3ab15Sopenharmony_ci/// ``` 2692f3ab15Sopenharmony_ci/// use openssl::rand::rand_bytes; 2792f3ab15Sopenharmony_ci/// 2892f3ab15Sopenharmony_ci/// let mut buf = [0; 256]; 2992f3ab15Sopenharmony_ci/// rand_bytes(&mut buf).unwrap(); 3092f3ab15Sopenharmony_ci/// ``` 3192f3ab15Sopenharmony_ci#[corresponds(RAND_bytes)] 3292f3ab15Sopenharmony_cipub fn rand_bytes(buf: &mut [u8]) -> Result<(), ErrorStack> { 3392f3ab15Sopenharmony_ci unsafe { 3492f3ab15Sopenharmony_ci ffi::init(); 3592f3ab15Sopenharmony_ci assert!(buf.len() <= c_int::max_value() as usize); 3692f3ab15Sopenharmony_ci cvt(ffi::RAND_bytes(buf.as_mut_ptr(), buf.len() as LenType)).map(|_| ()) 3792f3ab15Sopenharmony_ci } 3892f3ab15Sopenharmony_ci} 3992f3ab15Sopenharmony_ci 4092f3ab15Sopenharmony_ci/// Controls random device file descriptor behavior. 4192f3ab15Sopenharmony_ci/// 4292f3ab15Sopenharmony_ci/// Requires OpenSSL 1.1.1 or newer. 4392f3ab15Sopenharmony_ci#[corresponds(RAND_keep_random_devices_open)] 4492f3ab15Sopenharmony_ci#[cfg(ossl111)] 4592f3ab15Sopenharmony_cipub fn keep_random_devices_open(keep: bool) { 4692f3ab15Sopenharmony_ci unsafe { 4792f3ab15Sopenharmony_ci ffi::RAND_keep_random_devices_open(keep as LenType); 4892f3ab15Sopenharmony_ci } 4992f3ab15Sopenharmony_ci} 5092f3ab15Sopenharmony_ci 5192f3ab15Sopenharmony_ci#[cfg(test)] 5292f3ab15Sopenharmony_cimod tests { 5392f3ab15Sopenharmony_ci use super::rand_bytes; 5492f3ab15Sopenharmony_ci 5592f3ab15Sopenharmony_ci #[test] 5692f3ab15Sopenharmony_ci fn test_rand_bytes() { 5792f3ab15Sopenharmony_ci let mut buf = [0; 32]; 5892f3ab15Sopenharmony_ci rand_bytes(&mut buf).unwrap(); 5992f3ab15Sopenharmony_ci } 6092f3ab15Sopenharmony_ci} 61