• D
    RAND_add()/RAND_seed(): fix failure on short input or low entropy · d597a9a8
    Dr. Matthias St. Pierre 提交于
    Commit 5b4cb385c18a (#7382) introduced a bug which had the effect
    that RAND_add()/RAND_seed() failed for buffer sizes less than
    32 bytes. The reason was that now the added random data was used
    exlusively as entropy source for reseeding. When the random input
    was too short or contained not enough entropy, the DRBG failed
    without querying the available entropy sources.
    
    This commit makes drbg_add() act smarter: it checks the entropy
    requirements explicitely. If the random input fails this check,
    it won't be added as entropy input, but only as additional data.
    More precisely, the behaviour depends on whether an os entropy
    source was configured (which is the default on most os):
    
    - If an os entropy source is avaible then we declare the buffer
      content as additional data by setting randomness to zero and
      trigger a regular   reseeding.
    
    - If no os entropy source is available, a reseeding will fail
      inevitably. So drbg_add() uses a trick to mix the buffer contents
      into the DRBG state without forcing a reseeding: it generates a
      dummy random byte, using the buffer content as additional data.
    
    Related-to: #7449
    Reviewed-by: NPaul Dale <paul.dale@oracle.com>
    (Merged from https://github.com/openssl/openssl/pull/7456)
    
    (cherry picked from commit 8817215d5c52a76f2b184b624bde4df8556dee6d)
    d597a9a8
drbg_lib.c 32.4 KB