blob: fba802c14280e12cc0642be49d61d4270ae609f0 [file] [log] [blame]
Eric Biggers7e6b92b2021-04-20 16:48:07 -07001From 5bce943cdb8fc81525257413f174844d644d63c8 Mon Sep 17 00:00:00 2001
2From: Eric Biggers <ebiggers@google.com>
3Date: Tue, 20 Apr 2021 16:48:07 -0700
4Subject: [PATCH] Use /dev/urandom instead of getrandom()
5
6To generate the ahash crate's default hash keys, use /dev/urandom
7instead of getrandom() to avoid blocking boot on systems where the
8entropy pool isn't initialized in time and where the use case of this
9crate doesn't actually require cryptographic randomness.
10
11If opening or reading from /dev/urandom fails, fall back to getrandom().
12
13Note that std::collections::HashMap doesn't block for randomness either,
14for the same reason. So this change just makes ahash work like HashMap.
15
16Bug: 185934601
17Change-Id: Ie81a1f3a893d578348db11aee114d1a8f2d9fac5
18---
19diff --git a/src/random_state.rs b/src/random_state.rs
Thiébaud Weksteenee4f1052021-05-19 15:08:00 +020020index f394cd0..d8280b7 100644
Eric Biggers7e6b92b2021-04-20 16:48:07 -070021--- a/src/random_state.rs
22+++ b/src/random_state.rs
Thiébaud Weksteenee4f1052021-05-19 15:08:00 +020023@@ -34,6 +34,15 @@ use crate::aes_hash::*;
24 #[cfg(not(all(any(target_arch = "x86", target_arch = "x86_64"), target_feature = "aes", not(miri))))]
25 use crate::fallback_hash::*;
Eric Biggers7e6b92b2021-04-20 16:48:07 -070026
27+#[cfg(all(feature = "runtime-rng", not(all(feature = "compile-time-rng", test))))]
28+fn read_urandom(dest: &mut [u8]) -> Result<(), std::io::Error> {
29+ use std::fs::File;
30+ use std::io::Read;
31+
32+ let mut f = File::open("/dev/urandom")?;
33+ f.read_exact(dest)
34+}
35+
36 #[cfg(all(feature = "runtime-rng", not(all(feature = "compile-time-rng", test))))]
Thiébaud Weksteenee4f1052021-05-19 15:08:00 +020037 static SEEDS: OnceBox<[[u64; 4]; 2]> = OnceBox::new();
38
39@@ -59,7 +68,9 @@ pub(crate) fn seeds() -> [u64; 4] {
40 {
41 SEEDS.get_or_init(|| {
42 let mut result: [u8; 64] = [0; 64];
43- getrandom::getrandom(&mut result).expect("getrandom::getrandom() failed.");
44+ if read_urandom(&mut result).is_err() {
45+ getrandom::getrandom(&mut result).expect("getrandom::getrandom() failed.")
46+ }
47 Box::new(result.convert())
48 })[1]
49 }
50@@ -107,7 +118,9 @@ impl RandomState {
51 {
52 let seeds = SEEDS.get_or_init(|| {
53 let mut result: [u8; 64] = [0; 64];
54- getrandom::getrandom(&mut result).expect("getrandom::getrandom() failed.");
55+ if read_urandom(&mut result).is_err() {
56+ getrandom::getrandom(&mut result).expect("getrandom::getrandom() failed.")
57+ }
58 Box::new(result.convert())
59 });
60 RandomState::from_keys(seeds[0], seeds[1])