> > Is it worth reposting my thoughts with your suggested wording changes?
>
> OK. Off-list or on. This stuff is important.
Reposting.
My thoughts.
Randomness should be whitened. Anything feed into an randomness pool, should
be mixed in and run through SHA256.
pool = SHA256(pool || new-randomness)
The current read and write file routines, and the current routine RAND_poll,
etc., will add to that global pool. The idea of cascading pools is neat. We
need at least one per thread, using our existing thread-local-storage API. The
current “lazy evaluation” will work fine, we don’t need a create-thread API.
We do need fork/exec protection which is the point of
https://github.com/openssl/openssl/pull/3754
Each pool should have an atomic counter that is incremented when randomness is
added. Descendant pools can compare counters and mix in their parent when the
counters don’t match. Then when RAND_poll is called, or perhaps a new routine
RAND_poll_system, it goes into the global pool and eventually all other pools
will get it (whitened with their current state). RAND_poll isn’t documented.
Per-thread pools don’t need a lock. The global and other pools do. Putting a
pool in the SSL_CTX is probably reasonable. I seriously doubt the SSL object
needs it because the number of random bytes to generate keys is pretty small –
we’ll expose things through AES misused first ? But adding it to the SSL
object is simple so we might as well.
Then to generate random bytes use ChaCha. See, for example,
http://gitweb.dragonflybsd.org/dragonfly.git/blob/2aa3f894bd9b5b8f58a1526adb26663405b91679:/sys/kern/subr_csprng.c
My first thoughts on reading that code were, wow, is it really that easy?
We want to be able to save the current global state – write to a BIO – and
restore it – read from a BIO. This will let us reasonably work in
low-randomness situations like system boot.
We want to provide a platform-neutral API that makes its best effort attempt to
get randomness from the system and merge it into the global pool. That should
be a new API; I suggested RAND_poll_system above, but don’t really care.
Does this make sense? Are there holes?
--
openssl-dev mailing list
To unsubscribe: https://mta.openssl.org/mailman/listinfo/openssl-dev