RDRAND is an instruction available on Intel processors for which CPUID sets bit 30 of the ECX register high (starting with Ivy Bridge). It is available at all privilege levels, and generates 16-, 32- or 64-bit random integer values (64-bit only in long mode). Its single operand is the (general-purpose) destination register. It sets the CF bit of EFLAGS to 1 if the destination register has been successfully set. Bull Mountain (the DRNG hardware + RDRAND instruction) is said to leverage "NIST SP800-90, FIPS-140-2, and ANSI X9.82." The Bull Mountain hardware is per-processor package. H. Peter Anvin added support to the Linux kernel 2011-07-29. It is expected to soon be used by OpenSSL.
- A "nondeterministic hardware process" provides a 3Gbps entropy source as paired 256-bit values...
- "Online Health Tests" test the entropy source against mathematical models per-sample and at a 64k window
- Each seed requires at least two healthy values (per-sample result)
- "In the rare event a DRNG fails at runtime, it will cease to issue random numbers"
- There seems no way to detect this situation save executing RDRAND and seeing CF unset.
- "Built-in Self Tests"
- DRNG is run for 256 samples of OHT validation before being made available to software
- OHT is provided known-bad data and must identify it as "unhealthy"
- Deterministic values are played through the conditioner, and results are verified
"The one use case that it is cryptographically insufficient for is to seed a new PRNG, which probably means it is unsuitable for being fed as-is into /dev/random." - H. Peter Anvin, 2011-06-14
- Intel's Bull Mountain Software Implementation Guide
- IEEE Spectrum's September 2011 article, "Behind Intel's New Random-Number Generator"
- David Johnston of Intel corrected me on 2011-09-15: "RDRAND is not an AVX instruction. It is a normal instruction." Thanks, David!