• Jason A. Donenfeld's avatar
    random: opportunistically initialize on /dev/urandom reads · 48bff105
    Jason A. Donenfeld authored
    In 6f98a4bf ("random: block in /dev/urandom"), we tried to make a
    successful try_to_generate_entropy() call *required* if the RNG was not
    already initialized. Unfortunately, weird architectures and old
    userspaces combined in TCG test harnesses, making that change still not
    realistic, so it was reverted in 0313bc27 ("Revert "random: block in
    /dev/urandom"").
    
    However, rather than making a successful try_to_generate_entropy() call
    *required*, we can instead make it *best-effort*.
    
    If try_to_generate_entropy() fails, it fails, and nothing changes from
    the current behavior. If it succeeds, then /dev/urandom becomes safe to
    use for free. This way, we don't risk the regression potential that led
    to us reverting the required-try_to_generate_entropy() call before.
    
    Practically speaking, this means that at least on x86, /dev/urandom
    becomes safe. Probably other architectures with working cycle counters
    will also become safe. And architectures with slow or broken cycle
    counters at least won't be affected at all by this change.
    
    So it may not be the glorious "all things are unified!" change we were
    hoping for initially, but practically speaking, it makes a positive
    impact.
    
    Cc: Theodore Ts'o <tytso@mit.edu>
    Cc: Dominik Brodowski <linux@dominikbrodowski.net>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: default avatarJason A. Donenfeld <Jason@zx2c4.com>
    48bff105
random.c 51.5 KB