30 lines
875 B
Rust
30 lines
875 B
Rust
use crate::msgs::codec;
|
|
/// The single place where we generate random material
|
|
/// for our own use. These functions never fail,
|
|
/// they panic on error.
|
|
use ring::rand::{SecureRandom, SystemRandom};
|
|
|
|
/// Fill the whole slice with random material.
|
|
pub(crate) fn fill_random(bytes: &mut [u8]) -> Result<(), GetRandomFailed> {
|
|
SystemRandom::new()
|
|
.fill(bytes)
|
|
.map_err(|_| GetRandomFailed)
|
|
}
|
|
|
|
/// Make a Vec<u8> of the given size
|
|
/// containing random material.
|
|
pub(crate) fn random_vec(len: usize) -> Result<Vec<u8>, GetRandomFailed> {
|
|
let mut v = vec![0; len];
|
|
fill_random(&mut v)?;
|
|
Ok(v)
|
|
}
|
|
|
|
/// Return a uniformly random u32.
|
|
pub(crate) fn random_u32() -> Result<u32, GetRandomFailed> {
|
|
let mut buf = [0u8; 4];
|
|
fill_random(&mut buf)?;
|
|
codec::decode_u32(&buf).ok_or(GetRandomFailed)
|
|
}
|
|
|
|
#[derive(Debug)]
|
|
pub struct GetRandomFailed;
|