On Fri, Oct 23, 2015 at 03:38:51pm +0200, Tomas Mraz wrote:
> On Pá, 2015-10-23 at 15:22 +0200, Alessandro Ghedini wrote:
> ...
> > BoringSSL started using the system RNG (e.g. /dev/urandom) for every call to
> > RAND_bytes(). Additionally, if the RDRAND instruction is available, the 
> > output
> > of RDRAND is mixed with the output of the system RNG using ChaCha20. This 
> > uses
> > thread-local storage to keep the global RNG state.
> ...
> > The BoringSSL method is very simple but it needs a read from /dev/urandom 
> > for
> > every call to RAND_bytes() which can be slow (though, BoringSSL's 
> > RAND_bytes()
> > seems to implement some sort of buffering for /dev/urandom so the cost may 
> > be
> > lower).
> > 
> > On the other hand, LibreSSL replaced the whole RAND_* API with calls to
> > OpenBSD's arc4random(). This is a nice and simple scheme that uses ChaCha20 
> > to
> > mix the internal RNG state, which is regularly reseeded from the system RNG.
> > The core logic of this (excluding ChaCha20 and platform-specific bits) is
> > implemented in less than 200 lines of code and, at least in theory, it's the
> > one that provides the best performance/simplicity trade-off (ChaCha20 can be
> > pretty fast even for non-asm platform-generic implementations).
> > 
> > Both of these methods are robust and mostly platform-indipendent (e.g. none 
> > of
> > them uses the system time, PID or uninitilized buffers to seed the RNG 
> > state)
> > and have simple implementations, so I think OpenSSL can benefit a lot from
> > adopting one of them. The astute readers may point out that OpenSSL doesn't
> > support ChaCha20 yet, but that's hopefully coming soon.
> 
> How these libraries handle generation of random numbers after the
> fork()? The mixing in of the system time & PID before pulling bytes from
> RNG prevents sharing two identical streams of random numbers among
> forked processes. If there is a buffering of data pulled from the kernel
> RNG it is not sufficient to just say that all the data are pulled from
> the kernel and thus unique.

So, it seems that BoringSSL's /dev/urandom buffering is disabled by default and
needs to be explicitly enabled by calling RAND_enable_fork_unsafe_buffering().

arc4random() detects forks by registering a pthread_atfork() handler and/or by
checking changes in getpid() output before returning any randomness. When a
fork is detected, the internal state is automatically re-seeded with the system
RNG.

Cheers

Attachment: signature.asc
Description: PGP signature

_______________________________________________
openssl-dev mailing list
To unsubscribe: https://mta.openssl.org/mailman/listinfo/openssl-dev

Reply via email to