]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
random: credit architectural init the exact amount
authorJason A. Donenfeld <Jason@zx2c4.com>
Thu, 12 May 2022 13:32:26 +0000 (15:32 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 30 May 2022 07:24:07 +0000 (09:24 +0200)
commit 12e45a2a6308105469968951e6d563e8f4fea187 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>
drivers/char/random.c

index 095f1899b1052d4a8f287b14c94382451bf193fa..8a7250f0938d3cfef6069776e3bc6b113ec14da7 100644 (file)
@@ -899,9 +899,8 @@ 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)
@@ -909,11 +908,12 @@ int __init random_init(const char *command_line)
        _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));
        }
@@ -924,8 +924,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;
 }