Using FIPS-capable OpenSSL on an embedded system with low entropy
collection rates. Several processes startup during system startup, each
loading libcrypto. Per latest IGs, modified to run self-tests on library
load, requiring OPENSSL_init() call and, hence, DRBG instantiation. It is
possible that insufficient entropy has been collected by the kernel as the
last few of these processes startup, causing the seeding of the FIPS DRBG
to fail during FIPS_drbg_instantiation().

The FIPS DRBG is seeded with calls to ssleay_rand_bytes(), so the problem
is really that the default DRBG (rand_ssleay_meth) did not collect enough
entropy from /dev/random.

The default DRBG can be seeded "later" with additional entropy using
RAND_add/RAND_seed, but I have not seen an existing method for then seeding
the FIPS DRBG with good (read: properly seeded default DRBG bytes)
"entropy". It seems that some additional code is needed to call directly
the FIPS_drbg_reseed().

The problem, I suppose, is knowing when to do this reseed. If, at some
later time, a RAND_status() call indicates a bad DRBG (whether it is
calling the rand_ssleay_meth or the rand_drbg_meth status() version), then
that caller could try to read sufficient bytes from /dev/random; if
successful, add that to the default DRBG with RAND_add(); and, then call
FIPS_drbg_reseed() to properly seed the FIPS DRBG. This depends of course
on enough entropy being collected to read enough (32 bytes) from
/dev/random to successfully seed the default DRBG.

 The easiest answer, and one I see in multiple places here, is to boost the
initial entropy collection rate so there is sure to be enough to seed every
instance of the default DRBG at the first try. Alternatively (or
concurrently), to reduce the drain on collected entropy during startup by
ensuring only essential processes are consuming /dev/[u]random bytes.

Interested in whether anyone has experienced situations where the
rate-boost and/or drain-limit approach was still not enough to dependably
get all DRBGs seeded, and how that was worked around to re-seed after more
entropy had time to collect. Or if the consensus is "don't do that -
FIPS_drbg_reseed() is only there for the self-tests to use...".

Thanks,
Kevin

Reply via email to