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 of the given size /// containing random material. pub(crate) fn random_vec(len: usize) -> Result, GetRandomFailed> { let mut v = vec![0; len]; fill_random(&mut v)?; Ok(v) } /// Return a uniformly random u32. pub(crate) fn random_u32() -> Result { let mut buf = [0u8; 4]; fill_random(&mut buf)?; codec::decode_u32(&buf).ok_or(GetRandomFailed) } #[derive(Debug)] pub struct GetRandomFailed;