Our computers are not really good at providing random numbers because they are quite deterministic (unless you count these pesky random bugs that make working on a computer so “enjoyable”). So we created different ways to generate pseudo-random numbers of various qualities depending on the use. For cryptography, it is paramount to have excellent random numbers, or an attacker could predict our next move!
Getting unpredictable is a difficult task, Linux tries to provide it by collecting environmental noise (e.g. disk seek time, mouse movement, etc.) in a first entropy pool which feeds a first Cryptographically Secure Pseudo-Random Number Generator (CSPRNG) which then output “sanitised” random numbers to different pools, one for each of the kernel output random device: /dev/random and /dev/urandom.
Our goal is to help our Raspberry Pi to have more entropy, so we will provide it with a new entropy collector based on its on-board hardware random number generator (HW RNG).
I have already presented quickly why you need entropy (and good one), and also a quick way of having more source for the Linux kernel entropy pool for the Raspberry Pi using Raspbian “Wheezy” or for any computer having a TPM chip on board.
This article is an update for all of you who upgraded their Raspbian to Jessie (Debian 8). The new system uses SystemD for the init process rather than Upstart for previous release.
The Raspberry Pi has an integrated hardware random number generator (HW RNG) which Linux can use to feed its entropy pool. The implication of using such HW RNG is debatable and I will discuss it in a coming article. But here is how to activate it.
It is still possible to load the kernel module using $ sudo modprobe bcm2708-rng
. But I know recommend using the Raspberry Pi boot configuration, as it is more future proof: if there is a newer module for the BCM2709 in the Raspberry Pi 2 (or any newer model), using Raspberry Pi Device Tree (DT) overlays should always work. DT are a mean to set-up your Raspberry Pi for certain tasks by selecting automatically the right modules (or drivers) to load. It is possible to activate the HW RNG using this methods.
Actually, we do not need to load any DT overlays, but only to set the random
parameter to ‘on
‘. You can achieve this by editing the file /boot/config.txt
, find the line starting with ‘dtparam=(...)
‘ or add a new one starting with it. The value of dtparam is a comma separated list of parameters and value (e.g random=on,audio=on
), see part 3 of the Raspberry Pi documentation for further info. So at least, you should have:
dtparam=random=on
With this method, you have to reboot so that the bootloader can pick-up automatically the right module for you.
Now install the rng-tools (the service should be automatically activated and started, default configuration is fine, but you can tweak/amend it in /etc/default/rng-tools
), and set it to be enable at next boot:
$ sudo apt-get install rng-tools $ sudo systemctl enable rng-tools
After awhile you can check the level of entropy in your pool and some stats on the rng-tools service:
$ echo $(cat /proc/sys/kernel/random/entropy_avail)/$(cat /proc/sys/kernel/random/poolsize) 1925/4096 $ sudo pkill -USR1 rngd; sudo systemctl -n 15 status rng-tools rngd[7231]: stats: bits received from HRNG source: 100064 rngd[7231]: stats: bits sent to kernel pool: 40512 rngd[7231]: stats: entropy added to kernel pool: 40512 rngd[7231]: stats: FIPS 140-2 successes: 5 rngd[7231]: stats: FIPS 140-2 failures: 0 rngd[7231]: stats: FIPS 140-2(2001-10-10) Monobit: 0 rngd[7231]: stats: FIPS 140-2(2001-10-10) Poker: 0 rngd[7231]: stats: FIPS 140-2(2001-10-10) Runs: 0 rngd[7231]: stats: FIPS 140-2(2001-10-10) Long run: 0 rngd[7231]: stats: FIPS 140-2(2001-10-10) Continuous run: 0 rngd[7231]: stats: HRNG source speed: (min=824.382; avg=1022.108; max=1126.435)Kibits/s rngd[7231]: stats: FIPS tests speed: (min=6.459; avg=8.161; max=9.872)Mibits/s rngd[7231]: stats: Lowest ready-buffers level: 2 rngd[7231]: stats: Entropy starvations: 0 rngd[7231]: stats: Time spent starving for entropy: (min=0; avg=0.000; max=0)us
Source: