Note the caveat: "if the underlying primitive is correctly implemented".<br><br><div>FreeBSD dragon.lan 10.1-RELEASE FreeBSD 10.1-RELEASE #0 r274401: Tue Nov 11 21:02:49 UTC 2014     root@releng1.nyi.freebsd.org:/usr/obj/usr/src/sys/GENERIC  amd64</div><div>[jlouis@dragon ~]$ ls -l /dev/*random</div><div>crw-rw-rw-  1 root  wheel  0xc Dec 25 17:28 /dev/random</div><div>lrwxr-xr-x  1 root  wheel    6 Dec 25 17:28 /dev/urandom -> random</div><div><br></div><div>On FreeBSD, the randomness refers to the same source for a reason. Because there is no way you can "run out of random entropy". As such, there are no difference between "strong" and "normal" random bytes at all. Both sources are backed by the Yarrow generator. On Linux, you can, but Linux presents an appallingly bad interface :)</div><div><br></div><div>On OpenBSD, you have an even better option:</div><div><br></div><div><a href="http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man2/getentropy.2">http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man2/getentropy.2</a><br></div><div><br></div><div>which lets you source entropy to use for your own CSPRNG in the user space of the process (OpenBSD uses a solution based on chacha20 currently). It has the advantage that you can't attack it with file descriptor exhaustion and other such shenanigans since it is a syscall.</div><div><br></div><div>It was so useful, the Linux guys have added it:</div><div><br></div><div><a href="http://lists.openwall.net/linux-kernel/2014/07/17/235">http://lists.openwall.net/linux-kernel/2014/07/17/235</a><br></div><div><br></div>You unfortunately can't get rid of the API semantics in Erlang since some older systems will definitely fail this. In case of an older system, the right approach is to crash. And probably never to call strong_rand_bytes ever on sane systems :)<div><br><div class="gmail_quote">On Wed Jan 07 2015 at 4:26:43 PM Sverker Eriksson <<a href="mailto:sverker.eriksson@ericsson.com" target="_blank">sverker.eriksson@ericsson.com</a>> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On 12/23/2014 03:56 PM, Jesper Louis Andersen wrote:<br>
> 3. ... The 'strong_rand_bytes/1' function can<br>
> return 'low_entropy' which is outright wrong and preposterous on modern<br>
> machines. It never will, if the underlying random primitive is correctly<br>
> implemented. The whole idea of "running out of entropy" is false.<br>
><br>
<br>
'low_entropy' from strong_rand_bytes/1 is a direct mapping to RAND_bytes<br>
returning error, which OpenSSL docs say can happen "... if the PRNG has not<br>
been seeded with enough randomness to ensure an unpredictable byte<br>
sequence."<br>
<br>
And the Linux man page for /dev/random and /dev/urandom says things like:<br>
"When the entropy pool is empty, reads from /dev/random will block<br>
until additional environmental  noise is gathered.".<br>
<br>
So, it seems to me that "running out of entropy" is at least a valid<br>
concept.<br>
And doing "cat /dev/random" on my Linux machine sure do block<br>
after a few hundred bytes of output.<br>
<br>
<br>
/Sverker<br>
<br>
<br>
</blockquote></div></div>