blob: 2db14e062b2abe6a0ca60994258117a19c292b3f [file] [log] [blame]
.. _module-pw_random:
=========
pw_random
=========
Pigweed's ``pw_random`` module provides a generic interface for random number
generators, as well as some practical embedded-friendly implementations. While
this module does not provide drivers for hardware random number generators, it
acts as a user-friendly layer that can be used to abstract away such hardware.
Embedded systems have the propensity to be more deterministic than your typical
PC. Sometimes this is a good thing. Other times, it's valuable to have some
random numbers that aren't predictable. In security contexts or areas where
things must be marked with a unique ID, this is especially important. Depending
on the project, true hardware random number generation peripherals may or may
not be available. Even if RNG hardware is present, it might not always be active
or accessible. ``pw_random`` provides libraries that make these situations
easier to manage.
---------------------
Using RandomGenerator
---------------------
There's two sides to a RandomGenerator; the input, and the output. The outputs
are relatively straightforward; ``GetInt(T&)`` randomizes the passed integer
reference, ``GetInt(T&, T exclusive_upper_bound)`` produces a random integer
less than ``exclusive_upper_bound``, and ``Get()`` dumps random values into the
passed span. The inputs are in the form of the ``InjectEntropy*()`` functions.
These functions are used to "seed" the random generator. In some
implementations, this can simply be resetting the seed of a PRNG, while in
others it might directly populate a limited buffer of random data. In all cases,
entropy injection is used to improve the randomness of calls to ``Get*()``.
It might not be easy to find sources of entropy in a system, but in general a
few bits of noise from ADCs or other highly variable inputs can be accumulated
in a RandomGenerator over time to improve randomness. Such an approach might
not be sufficient for security, but it could help for less strict uses.
-------------
API reference
-------------
.. doxygennamespace:: pw::random
:members:
-----------
Future Work
-----------
A simple "entropy pool" implementation could buffer incoming entropy later use
instead of requiring an application to directly poll the hardware RNG peripheral
when the random data is needed. This would let a device collect entropy when
idling, improving the latency of potentially performance-sensitive areas where
random numbers are needed.