rustls/
rand.rs

1//! The single place where we generate random material for our own use.
2
3use alloc::vec;
4use alloc::vec::Vec;
5
6use crate::crypto::SecureRandom;
7
8/// Make a [`Vec<u8>`] of the given size containing random material.
9pub(crate) fn random_vec(
10    secure_random: &dyn SecureRandom,
11    len: usize,
12) -> Result<Vec<u8>, GetRandomFailed> {
13    let mut v = vec![0; len];
14    secure_random.fill(&mut v)?;
15    Ok(v)
16}
17
18/// Return a uniformly random [`u32`].
19pub(crate) fn random_u32(secure_random: &dyn SecureRandom) -> Result<u32, GetRandomFailed> {
20    let mut buf = [0u8; 4];
21    secure_random.fill(&mut buf)?;
22    Ok(u32::from_be_bytes(buf))
23}
24
25/// Return a uniformly random [`u16`].
26pub(crate) fn random_u16(secure_random: &dyn SecureRandom) -> Result<u16, GetRandomFailed> {
27    let mut buf = [0u8; 2];
28    secure_random.fill(&mut buf)?;
29    Ok(u16::from_be_bytes(buf))
30}
31
32/// Random material generation failed.
33#[derive(Debug)]
34pub struct GetRandomFailed;