Skip to content

Commit

Permalink
random: credit architectural init the exact amount
Browse files Browse the repository at this point in the history
commit 12e45a2 upstream.

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: Dominik Brodowski <linux@dominikbrodowski.net>
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
zx2c4 authored and gregkh committed May 30, 2022
1 parent 5123cc6 commit 04d61b9
Showing 1 changed file with 6 additions and 6 deletions.
12 changes: 6 additions & 6 deletions drivers/char/random.c
Original file line number Diff line number Diff line change
Expand Up @@ -896,21 +896,21 @@ early_param("random.trust_bootloader", parse_trust_bootloader);
*/
int __init random_init(const char *command_line)
{
size_t i;
ktime_t now = ktime_get_real();
bool arch_init = true;
unsigned int i, arch_bytes;
unsigned long rv;

#if defined(LATENT_ENTROPY_PLUGIN)
static const u8 compiletime_seed[BLAKE2S_BLOCK_SIZE] __initconst __latent_entropy;
_mix_pool_bytes(compiletime_seed, sizeof(compiletime_seed));
#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) &&
!arch_get_random_long_early(&rv)) {
rv = random_get_entropy();
arch_init = false;
arch_bytes -= sizeof(rv);
}
_mix_pool_bytes(&rv, sizeof(rv));
}
Expand All @@ -921,8 +921,8 @@ int __init random_init(const char *command_line)

if (crng_ready())
crng_reseed();
else if (arch_init && trust_cpu)
credit_init_bits(BLAKE2S_BLOCK_SIZE * 8);
else if (trust_cpu)
credit_init_bits(arch_bytes * 8);

return 0;
}
Expand Down

0 comments on commit 04d61b9

Please sign in to comment.