NIST
NIST's Computer Security Resource Center provides a set of
cryptographic standards in their Cryptographic Toolkit, of particular interest
is the Random Number
Generation component.
-
NIST SP 800-22 Rev. 1a
- While focused on the STS, the background
information contains a clear and concise introduction to random number generation.
- NIST
SP 800-90Ar1
-
NIST has published a set of random number generators that are FIPS 140 approved (FIPS 140-2
Annex C: Approved Random Number Generators). It also has a good discussion
of the whole “randomness” thing. There's an implementation below.
These documents and then some can be found with the rest of NIST's Special Publications.
nist_rng_20070927.tgz or on GitHub
This code implements a random number generator based on section 10.2 DRBG
Mechanisms Based on Block Ciphers in NIST
SP 800-90Ar1. More specifically, it implements CTR_DRBG with a derivation function
using AES-256 (see FIPS 197) as the block encryption function.
Security strength, prediction resistance, and the like apply to a higher level interface
than is currently implemented (the algorithm as implemented can be used to support
prediction resistance and a security strength of up to 256).
It gives the same output on i386/OpenBSD,
amd64/FreeBSD and Windows, but without test vectors
one shouldn't say a whole lot more about that output (DIEHARD seems happy, but that could
be true even if things were severely screwed up).
There are known-answer tests included in the kat
directory for the Rijndael
code, but not for CTR_DRBG (I'm still looking for test vectors). Both the VIA padlock
implementation and the default software implementation match the corresponding NIST test
vectors.
A new version of c7random is included that adds a full entropy
NIST CTR_DRBG random number generator (command line option “-N”). The result should be
something along the lines of NIST SP 800-90 Appendix D. It's intended to be
consistent with an “RBG” as described in
D.1.b and D.2.1—minus runtime tests and such decidedly
non-trivial details. For every 16 bytes of output, it consumes at least 18 bytes from the
CPU's entropy source. Should the CPU stop generating entropy output the program will stop
outputting data, but the entropy output is not validated in any way. Have
nist_config.h
include nist_aes_padlock.h
instead of
nist_aes_rijndael.h
to use the CPU's AES hardware (c7random always uses the C3/7's hardware entropy). “c7random
-N
” does not require hardware SHA support, so it works on earlier VIA CPUs that only
have the AES and RNG options.
There are number of things to keep in mind:
- The API should be based on the “envelope” described in chapter 9 and section
F.3.2. So far, only the section 10.2 algorithm is
implemented.
- The RBG code lacks both test vectors and a way to validate them.
- Some basic runtime self-tests need to be implemented (and enforced by the various API
functions).
- The code should be reviewed to make sure it is consistent with SP 800-90
(there are comments throughout the code referencing the relevant parts of SP
800-90).
- The
Makefile
s will likely need some tweaks for anything other than
OpenBSD (there are project files for Microsoft Visual Studio 2005 for building both
32-bit and 64-bit executables).
Linux /dev/random
The Linux /dev/random implementation was written by Theodore Ts'o (now maintained by Matt Mackall). The same
design was adopted by a number of other projects.
-
OpenBSD
-
The current code's closest relative is probably the 1999 Linux version (see
rnd.c
).
-
FreeBSD
-
Used the Ts'o implementation through release 4 (see
kern_random.c
) until it was replaced with Yarrow (see
An implementation of the Yarrow PRNG for FreeBSD).
-
NetBSD
-
Has a home-grown implementation based on Theodore Ts'o's design (in
rnd.c
and
rndpool.c
).
B. Barak and S. Halevi. An architecture
for robust pseudo-random generation and Applications to /dev/random. In ACM,
editor, Proc. Computing and Communication Security (CCS), 2005.
Zvi Gutterman wrote a paper called Holes in the Linux Random
Number Generator. Here's Theodore Ts'o's take: LWN: Re: /dev/random on Linux.
Z. Gutterman, B. Pinkas, and T. Reinman. Analysis of the Linux Random Number
Generator, IEEE Symposium on Security and Privacy, 2006.
VIA PadLock OpenSSL Patch
md_rand.c.diff-20070828.gz
From a software engineering point of view, this is a perfectly evil way of forcing more
entropy into OpenSSL's default random implementation (perhaps there should be a nice API
for doing this?). Most systems simply do not have such an enormous amount of high-quality
entropy as VIA PadLock… Anyhow, even if the hardware goes nuts and starts feeding all
zeros, it will be no worse than without the patch. With working hardware, the generator
should be pretty close to full entropy.
It should work on any recent gcc
. Just make sure that PIC
is
defined when building a shared library (or change the #if
to match whatever is
appropriate on the local platform), otherwise gcc
will complain about the use
of ebx
.
The VIA PadLock support for
Linux page has more information about OpenSSL and VIA PadLock.
Other Links
Here are some links relevant to cryptographic random number generation.
RFC 4086 Randomness Requirements for
Security
RFC 5869 HMAC-based
Extract-and-Expand Key Derivation Function (HKDF)
NIST SP
800-108 Recommendation for Key Derivation Using Pseudorandom Functions
NIST
SP 800-56C Recommendation for Key Derivation through Extraction-then-Expansion
Why
Cryptography Is Harder Than It Looks
Cryptanalytic Attacks on
Pseudorandom Number Generators
Fortuna improves on
Yarrow by not relying on dubious entropy measurements.
This paper suggests some improvements to Fortuna, including the use of a random
permutation instead of a round-robin method to pick the pool: Yevgeniy Dodis and Adi Shamir
and Noah Stephens-Davidowitz and Daniel Wichs. How to Eat Your Entropy and Have it Too -- Optimal
Recovery Strategies for Compromised RNGs, Cryptology ePrint Archive: Report
2014/167.
Jochen Vosss has a Go implementation of Fortuna and
also lists a number of Alternative
Implementations.
Yarrow-160: Notes on the
Design and Analysis of the Yarrow Cryptographic Pseudorandom Number Generator
Peter Gutmann takes a look at many
existing implementations and gives his two cents in Chapter 6: Random Number
Generation.
Hard Truths about the
Hard Business of finding Hard Random Numbers
L. Dorrendorf, Z. Gutterman, and B. Pinkas. Cryptanalysis of the Random Number Generator of the
Windows Operating System, Cryptology ePrint Archive, Report 2007/419, 2007.
Hugo Krawczyk. Cryptographic Extraction
and Key Derivation: The HKDF Scheme, 2010
Dana Dachman-Soled and Rosario Gennaro and Hugo Krawczyk and Tal Malkin. Computational Extractors and
Pseudorandomness, Cryptology ePrint Archive: Report 2011/708, 2011
Yevgeniy Dodis and Krzysztof Pietrzak and Daniel Wichs. Key Derivation Without Entropy Waste,
Cryptology ePrint Archive: Report 2013/708, 2014
Henry Corrigan-Gibbs and Suman Jana.
Recommendations for Randomness in the Operating System, or How to Keep Evil Children out of
Your Pool and Other Random Facts, HotOS XV, 2015.
Mario Cornejo and Sylvain Ruhault. Characterization of Real-Life PRNGs under
Partial State Corruption, Proceedings of the 2014 ACM SIGSAC Conference on
Computer and Communications Security, 2014. 10.1145/2660267.2660377
Yevgeniy Dodis, David Pointcheval, Sylvain Ruhault, Damien Vergnaud, Daniel Wichs.
Security
Analysis of Pseudo-Random Number Generators with Input: /dev/random is not
Robust
Yvonne Cliff and Colin Boyd and Juan Gonzalez Nieto. How to Extract and Expand Randomness: A Summary
and Explanation of Existing Results, Cryptology ePrint Archive: Report 2009/136,
2009
G. Bertoni, J. Daemen, M. Peeters and G. Van Assche. On the security of the keyed sponge
construction, Symmetric Key Encryption Workshop, 2011
Denker, John S., High-Entropy Randomness
Generator, 2005.
S. Kim, K. Umeno, and A. Hasegawa, Corrections of the NIST
statistical test suite for randomness, Cryptology ePrint Archive, Report
2004/018, 2004.
J. S. Coron and D. Naccache, An Accurate Evaluation of Maurer's
Universal Test, Proceedings of SAC '98 (Lecture Notes in Computer Science),
Springer-Verlag, 1998.
B. Ya. Ryabko, V.A. Monarev, Using
Information Theory Approach to Randomness Testing, Journal of Statistical
Planning and Inference, 2005.
Peter Gaži and Stefano Tessaro, Provably Robust Sponge-Based PRNGs and
KDFs, Cryptology ePrint Archive, Report 2016/169, 2016.
There may also be some links of interest here…