s6-linux-utils: the rngseed program
Keywords: s6 linux administration root utilities rngseed random pool entropy getrandom seedrng secure random number generator

s6-linux-utils
Software
skarnet.org

# The `rngseed` program

`rngseed` manipulates the Linux kernel's entropy pool. It can seed the kernel's random number generator from a file, save a new seed into a file, wait until the entropy pool is full, and so on. Please read the options list carefully in order to use it in a secure way.

`rngseed` can only be run as root.

## Interface

         rngseed [ -r | -R ] [ -N | -n ] [ -w | -W ] [ -d dir ] [ -v verbosity ]

The behaviour of rngseed depends on what options it is given. By default, it just waits until the entropy pool is full, then exits 0.

## Options

### Configuration options

- `-v verbosity` : be more or less verbose. Default is `1`, meaning rngseed will print warning and error messages. `0` will make it only print error messages, not warnings. `2` or more will make it add informational messages.
- `-d dir` : use dir as the directory where the seed file is located (for reading as well as writing). dir must be located on a writable, permanent filesystem. Default is `/var/lib/rngseed`.

### Behaviour options

- `-r` : read from a seed file. rngseed will attempt to read some bits from `dir/seed` and seed the kernel's RNG with the data. dir must be on a writable filesystem, because the seed file will be unlinked (the same data must not be used to seed the RNG twice). `rngseed -r` is typically used at boot time, in init scripts, right after mounting the filesystem where the seed has been saved.
- `-R` : read from a seed file, ignoring creditability. Behaves like `-r`, but will not increase the entropy count of the kernel RNG even if the seed file is marked as creditable.
- `-w` : write to a seed file. rngseed will save some random bits into `dir/seed`, marking the seed as creditable if the RNG's entropy pool is fully initialized. `rngseed -w` is typically used at shutdown time, right before unmounting filesystems; the point is to store a seed on disk so it can be reused on next boot by `rngseed -r`.
- `-W` : write to a seed file, without registering creditability. Behaves like `-w`, but does not mark the new seed file as creditable.
- `-N` : block. After reading a seed file if required, and before writing a new seed file if required, rngseed will wait until the entropy pool is ready. This ensures that future readings of the kernel RNG will be cryptographically secure, and that new seed files will be creditable. This is the default.
- `-n` : do not block. Immediately proceed even if the entropy pool is not ready. This may make a new seed file non-creditable.

## Creditability

A seed is said to be creditable if it has been obtained through a cryptographically secure RNG. This means it is safe from replay attacks, and safe to use to count towards the entropy pool when seeding the kernel RNG. `rngseed -w` will normally always create a creditable seed file, especially if used at shutdown time: by then, the kernel's entropy pool should have been initialized for a while.

An uncreditable seed can be used to add to the random pool, but should not increment the entropy count, because it is not safe from replay attacks. `rngseed -r` will do the right thing if the seed it reads is uncreditable.

`rngseed` uses the seed file's permissions to mark creditability. An uncreditable seed has rights 0600; a creditable seed has rights 0400.

## Exit codes

- 0: success
- 100: wrong usage
- 111: system call failure

## Notes

- `rngseed -N` replaces the old `s6-fillurandompool` program, that only waited for the entropy pool to get ready, but did not include any seed file management.
- The options are named `r` and `w` from the seed file's point of view. `rngseed -r` reads from the file (and unlinks it) and writes to the kernel RNG. `rngseed -w` reads from the kernel RNG and writes to the file.
- `rngseed` is inspired by Jason Donenfeld's seedrng program. It is, however, an independent implementation of the same concept.