• Jason A. Donenfeld's avatar
    random: vary jitter iterations based on cycle counter speed · 78c768e6
    Jason A. Donenfeld authored
    Currently, we do the jitter dance if two consecutive reads to the cycle
    counter return different values. If they do, then we consider the cycle
    counter to be fast enough that one trip through the scheduler will yield
    one "bit" of credited entropy. If those two reads return the same value,
    then we assume the cycle counter is too slow to show meaningful
    differences.
    
    This methodology is flawed for a variety of reasons, one of which Eric
    posted a patch to fix in [1]. The issue that patch solves is that on a
    system with a slow counter, you might be [un]lucky and read the counter
    _just_ before it changes, so that the second cycle counter you read
    differs from the first, even though there's usually quite a large period
    of time in between the two. For example:
    
    | real time | cycle counter |
    | --------- | ------------- |
    | 3         | 5             |
    | 4         | 5             |
    | 5         | 5             |
    | 6         | 5             |
    | 7         | 5             | <--- a
    | 8         | 6             | <--- b
    | 9         | 6             | <--- c
    
    If we read the counter at (a) and compare it to (b), we might be fooled
    into thinking that it's a fast counter, when in reality it is not. The
    solution in [1] is to also compare counter (b) to counter (c), on the
    theory that if the counter is _actually_ slow, and (a)!=(b), then
    certainly (b)==(c).
    
    This helps solve this particular issue, in one sense, but in another
    sense, it mostly functions to disallow jitter entropy on these systems,
    rather than simply taking more samples in that case.
    
    Instead, this patch takes a different approach. Right now we assume that
    a difference in one set of consecutive samples means one "bit" of
    credited entropy per scheduler trip. We can extend this so that a
    difference in two sets of consecutive samples means one "bit" of
    credited entropy per /two/ scheduler trips, and three for three, and
    four for four. In other words, we can increase the amount of jitter
    "work" we require for each "bit", depending on how slow the cycle
    counter is.
    
    So this patch takes whole bunch of samples, sees how many of them are
    different, and divides to find the amount of work required per "bit",
    and also requires that at least some minimum of them are different in
    order to attempt any jitter entropy.
    
    Note that this approach is still far from perfect. It's not a real
    statistical estimate on how much these samples vary; it's not a
    real-time analysis of the relevant input data. That remains a project
    for another time. However, it makes the same (partly flawed) assumptions
    as the code that's there now, so it's probably not worse than the status
    quo, and it handles the issue Eric mentioned in [1]. But, again, it's
    probably a far cry from whatever a really robust version of this would
    be.
    
    [1] https://lore.kernel.org/lkml/20220421233152.58522-1-ebiggers@kernel.org/
        https://lore.kernel.org/lkml/20220421192939.250680-1-ebiggers@kernel.org/
    
    Cc: Eric Biggers <ebiggers@google.com>
    Cc: Theodore Ts'o <tytso@mit.edu>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: default avatarJason A. Donenfeld <Jason@zx2c4.com>
    78c768e6
random.c 52 KB