linux-stable/include/crypto
Nicolai Stange ab62f0f9d3 crypto: drbg - make reseeding from get_random_bytes() synchronous
commit 074bcd4000 upstream.

get_random_bytes() usually hasn't full entropy available by the time DRBG
instances are first getting seeded from it during boot. Thus, the DRBG
implementation registers random_ready_callbacks which would in turn
schedule some work for reseeding the DRBGs once get_random_bytes() has
sufficient entropy available.

For reference, the relevant history around handling DRBG (re)seeding in
the context of a not yet fully seeded get_random_bytes() is:

  commit 16b369a91d ("random: Blocking API for accessing
                        nonblocking_pool")
  commit 4c7879907e ("crypto: drbg - add async seeding operation")

  commit 205a525c33 ("random: Add callback API for random pool
                        readiness")
  commit 57225e6797 ("crypto: drbg - Use callback API for random
                        readiness")
  commit c2719503f5 ("random: Remove kernel blocking API")

However, some time later, the initialization state of get_random_bytes()
has been made queryable via rng_is_initialized() introduced with commit
9a47249d44 ("random: Make crng state queryable"). This primitive now
allows for streamlining the DRBG reseeding from get_random_bytes() by
replacing that aforementioned asynchronous work scheduling from
random_ready_callbacks with some simpler, synchronous code in
drbg_generate() next to the related logic already present therein. Apart
from improving overall code readability, this change will also enable DRBG
users to rely on wait_for_random_bytes() for ensuring that the initial
seeding has completed, if desired.

The previous patches already laid the grounds by making drbg_seed() to
record at each DRBG instance whether it was being seeded at a time when
rng_is_initialized() still had been false as indicated by
->seeded == DRBG_SEED_STATE_PARTIAL.

All that remains to be done now is to make drbg_generate() check for this
condition, determine whether rng_is_initialized() has flipped to true in
the meanwhile and invoke a reseed from get_random_bytes() if so.

Make this move:
- rename the former drbg_async_seed() work handler, i.e. the one in charge
  of reseeding a DRBG instance from get_random_bytes(), to
  "drbg_seed_from_random()",
- change its signature as appropriate, i.e. make it take a struct
  drbg_state rather than a work_struct and change its return type from
  "void" to "int" in order to allow for passing error information from
  e.g. its __drbg_seed() invocation onwards to callers,
- make drbg_generate() invoke this drbg_seed_from_random() once it
  encounters a DRBG instance with ->seeded == DRBG_SEED_STATE_PARTIAL by
  the time rng_is_initialized() has flipped to true and
- prune everything related to the former, random_ready_callback based
  mechanism.

As drbg_seed_from_random() is now getting invoked from drbg_generate() with
the ->drbg_mutex being held, it must not attempt to recursively grab it
once again. Remove the corresponding mutex operations from what is now
drbg_seed_from_random(). Furthermore, as drbg_seed_from_random() can now
report errors directly to its caller, there's no need for it to temporarily
switch the DRBG's ->seeded state to DRBG_SEED_STATE_UNSEEDED so that a
failure of the subsequently invoked __drbg_seed() will get signaled to
drbg_generate(). Don't do it then.

Signed-off-by: Nicolai Stange <nstange@suse.de>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
[Jason: for stable, undid the modifications for the backport of 5acd3548.]
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2022-06-25 11:45:16 +02:00
..
internal crypto: blake2s - adjust include guard naming 2022-06-25 11:45:04 +02:00
ablk_helper.h
aead.h
aes.h
akcipher.h
algapi.h
authenc.h
b128ops.h
blake2s.h crypto: blake2s - adjust include guard naming 2022-06-25 11:45:04 +02:00
blowfish.h
cast5.h
cast6.h
cast_common.h
chacha20.h crypto: chacha20 - Fix chacha20_block() keystream alignment (again) 2022-06-25 11:45:05 +02:00
cryptd.h
crypto_wq.h
ctr.h
des.h
dh.h
drbg.h crypto: drbg - make reseeding from get_random_bytes() synchronous 2022-06-25 11:45:16 +02:00
ecdh.h
engine.h crypto: engine - permit to enqueue ashash_request 2016-09-07 21:08:27 +08:00
gf128mul.h
ghash.h crypto: ghash-generic - move common definitions to a new header file 2016-10-02 22:26:40 +08:00
hash.h crypto: hash - prevent using keyed hashes without setting key 2018-02-25 11:05:44 +01:00
hash_info.h
if_alg.h crypto: af_alg - fix use-after-free in af_alg_accept() due to bh_lock_sock() 2020-07-09 09:35:55 +02:00
kpp.h
lrw.h
mcryptd.h crypto: mcryptd - protect the per-CPU queue with a lock 2017-12-29 17:42:58 +01:00
md5.h
null.h
padlock.h
pcrypt.h
pkcs7.h
poly1305.h crypto: poly1305 - remove ->setkey() method 2018-02-17 13:21:15 +01:00
public_key.h crypto: public_key: fix overflow during implicit conversion 2021-09-22 11:43:03 +02:00
rng.h
scatterwalk.h
serpent.h
sha.h
sha1_base.h
sha3.h
sha256_base.h
sha512_base.h
skcipher.h
twofish.h
xts.h