Commit 12e45a2a authored by Jason A. Donenfeld's avatar Jason A. Donenfeld

random: credit architectural init the exact amount

RDRAND and RDSEED can fail sometimes, which is fine. We currently
initialize the RNG with 512 bits of RDRAND/RDSEED. We only need 256 bits
of those to succeed in order to initialize the RNG. Instead of the
current "all or nothing" approach, actually credit these contributions
the amount that is actually contributed.
Reviewed-by: default avatarDominik Brodowski <linux@dominikbrodowski.net>
Signed-off-by: default avatarJason A. Donenfeld <Jason@zx2c4.com>
parent 2f14062b
...@@ -927,9 +927,8 @@ static struct notifier_block pm_notifier = { .notifier_call = random_pm_notifica ...@@ -927,9 +927,8 @@ static struct notifier_block pm_notifier = { .notifier_call = random_pm_notifica
*/ */
int __init random_init(const char *command_line) int __init random_init(const char *command_line)
{ {
size_t i;
ktime_t now = ktime_get_real(); ktime_t now = ktime_get_real();
bool arch_init = true; unsigned int i, arch_bytes;
unsigned long rv; unsigned long rv;
#if defined(LATENT_ENTROPY_PLUGIN) #if defined(LATENT_ENTROPY_PLUGIN)
...@@ -937,11 +936,12 @@ int __init random_init(const char *command_line) ...@@ -937,11 +936,12 @@ int __init random_init(const char *command_line)
_mix_pool_bytes(compiletime_seed, sizeof(compiletime_seed)); _mix_pool_bytes(compiletime_seed, sizeof(compiletime_seed));
#endif #endif
for (i = 0; i < BLAKE2S_BLOCK_SIZE; i += sizeof(rv)) { for (i = 0, arch_bytes = BLAKE2S_BLOCK_SIZE;
i < BLAKE2S_BLOCK_SIZE; i += sizeof(rv)) {
if (!arch_get_random_seed_long_early(&rv) && if (!arch_get_random_seed_long_early(&rv) &&
!arch_get_random_long_early(&rv)) { !arch_get_random_long_early(&rv)) {
rv = random_get_entropy(); rv = random_get_entropy();
arch_init = false; arch_bytes -= sizeof(rv);
} }
_mix_pool_bytes(&rv, sizeof(rv)); _mix_pool_bytes(&rv, sizeof(rv));
} }
...@@ -952,8 +952,8 @@ int __init random_init(const char *command_line) ...@@ -952,8 +952,8 @@ int __init random_init(const char *command_line)
if (crng_ready()) if (crng_ready())
crng_reseed(); crng_reseed();
else if (arch_init && trust_cpu) else if (trust_cpu)
credit_init_bits(BLAKE2S_BLOCK_SIZE * 8); credit_init_bits(arch_bytes * 8);
WARN_ON(register_pm_notifier(&pm_notifier)); WARN_ON(register_pm_notifier(&pm_notifier));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment