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