hopr_crypto_random/
lib.rs1use generic_array::{ArrayLength, GenericArray};
10use rand::CryptoRng;
11
12pub use rand::{Rng, RngCore};
13
14pub const MAX_RANDOM_INTEGER: u64 = 9007199254740991;
17
18#[cfg(all(debug_assertions, feature = "fixed_rng"))]
24#[inline]
25pub fn rng() -> impl RngCore + CryptoRng {
26 use rand::SeedableRng;
27 rand::rngs::StdRng::from_seed([
28 0x5f, 0x57, 0xce, 0x2a, 0x84, 0x14, 0x7e, 0x88, 0x43, 0x56, 0x44, 0x56, 0x7f, 0x90, 0x4f, 0xb2, 0x04, 0x6b,
29 0x18, 0x42, 0x75, 0x69, 0xbe, 0x53, 0xb2, 0x29, 0x78, 0xbd, 0xf3, 0x0a, 0xda, 0xba,
30 ])
31}
32
33#[cfg(any(not(debug_assertions), not(feature = "fixed_rng")))]
35#[inline]
36pub fn rng() -> impl RngCore + CryptoRng {
37 rand::rngs::OsRng
38}
39
40#[inline]
44pub const fn is_rng_fixed() -> bool {
45 cfg!(debug_assertions) && cfg!(feature = "fixed_rng")
46}
47
48#[inline]
50pub fn random_float() -> f64 {
51 rng().gen()
52}
53
54#[inline]
56pub fn random_float_in_range(range: std::ops::Range<f64>) -> f64 {
57 rng().gen_range(range)
58}
59
60pub fn random_integer(start: u64, end: Option<u64>) -> u64 {
64 let real_end = end.unwrap_or(MAX_RANDOM_INTEGER);
65
66 assert!(
67 real_end > start && real_end <= MAX_RANDOM_INTEGER,
68 "bounds must be 0 < {start} < {real_end} <= {MAX_RANDOM_INTEGER}"
69 );
70
71 let bound = real_end - start;
72 start + rng().gen_range(0..bound)
73}
74
75#[inline]
77pub fn random_fill(buffer: &mut [u8]) {
78 rng().fill_bytes(buffer);
79}
80
81pub fn random_bytes<const T: usize>() -> [u8; T] {
83 let mut ret = [0u8; T];
84 random_fill(&mut ret);
85 ret
86}
87
88pub fn random_array<L: ArrayLength<u8>>() -> GenericArray<u8, L> {
90 let mut ret = GenericArray::default();
91 random_fill(&mut ret);
92 ret
93}
94
95#[cfg(test)]
96mod tests {
97 use super::*;
98
99 #[test]
100 fn test_random_integer() {
101 assert!(random_integer(10, None) > 10);
102
103 let bounded = random_integer(10, Some(20));
104 assert!((10..20).contains(&bounded));
105 }
106
107 #[test]
108 fn test_random_float() {
109 let f = random_float();
110 assert!((0.0..1.0).contains(&f));
111 }
112
113 #[test]
114 fn test_random_fill() {
115 let mut buffer = [0u8; 10];
116 random_fill(&mut buffer[2..9]);
118 assert_eq!(0, buffer[0]);
119 assert_eq!(0, buffer[1]);
120 assert_eq!(0, buffer[9]);
121 }
122}