Eric Biggers | 7e6b92b | 2021-04-20 16:48:07 -0700 | [diff] [blame] | 1 | From 5bce943cdb8fc81525257413f174844d644d63c8 Mon Sep 17 00:00:00 2001 |
| 2 | From: Eric Biggers <ebiggers@google.com> |
| 3 | Date: Tue, 20 Apr 2021 16:48:07 -0700 |
| 4 | Subject: [PATCH] Use /dev/urandom instead of getrandom() |
| 5 | |
| 6 | To generate the ahash crate's default hash keys, use /dev/urandom |
| 7 | instead of getrandom() to avoid blocking boot on systems where the |
| 8 | entropy pool isn't initialized in time and where the use case of this |
| 9 | crate doesn't actually require cryptographic randomness. |
| 10 | |
| 11 | If opening or reading from /dev/urandom fails, fall back to getrandom(). |
| 12 | |
| 13 | Note that std::collections::HashMap doesn't block for randomness either, |
| 14 | for the same reason. So this change just makes ahash work like HashMap. |
| 15 | |
| 16 | Bug: 185934601 |
| 17 | Change-Id: Ie81a1f3a893d578348db11aee114d1a8f2d9fac5 |
| 18 | --- |
| 19 | diff --git a/src/random_state.rs b/src/random_state.rs |
Thiébaud Weksteen | ee4f105 | 2021-05-19 15:08:00 +0200 | [diff] [blame] | 20 | index f394cd0..d8280b7 100644 |
Eric Biggers | 7e6b92b | 2021-04-20 16:48:07 -0700 | [diff] [blame] | 21 | --- a/src/random_state.rs |
| 22 | +++ b/src/random_state.rs |
Thiébaud Weksteen | ee4f105 | 2021-05-19 15:08:00 +0200 | [diff] [blame] | 23 | @@ -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 Biggers | 7e6b92b | 2021-04-20 16:48:07 -0700 | [diff] [blame] | 26 | |
| 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 Weksteen | ee4f105 | 2021-05-19 15:08:00 +0200 | [diff] [blame] | 37 | 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]) |