crypto: algif_rng - add random number generator support
authorStephan Mueller <smueller@chronox.de>
Thu, 25 Dec 2014 22:00:06 +0000 (23:00 +0100)
committerHerbert Xu <herbert@gondor.apana.org.au>
Mon, 29 Dec 2014 10:37:59 +0000 (21:37 +1100)
commit5afdfd22e6ba2260129a2a7113ab0916339c4205
treee933e679e4b3e278ec48b73495b4d5843002808e
parentad202c8c1563da4dda9416ca0ea1e0b94430f759
crypto: algif_rng - add random number generator support

This patch adds the random number generator support for AF_ALG.

A random number generator's purpose is to generate data without
requiring the caller to provide any data. Therefore, the AF_ALG
interface handler for RNGs only implements a callback handler for
recvmsg.

The following parameters provided with a recvmsg are processed by the
RNG callback handler:

* sock - to resolve the RNG context data structure accessing the
  RNG instance private to the socket

* len - this parameter allows userspace callers to specify how
  many random bytes the RNG shall produce and return. As the
  kernel context for the RNG allocates a buffer of 128 bytes to
  store random numbers before copying them to userspace, the len
  parameter is checked that it is not larger than 128. If a
  caller wants more random numbers, a new request for recvmsg
  shall be made.

The size of 128 bytes is chose because of the following considerations:

* to increase the memory footprint of the kernel too much (note,
  that would be 128 bytes per open socket)

* 128 is divisible by any typical cryptographic block size an
  RNG may have

* A request for random numbers typically only shall supply small
  amount of data like for keys or IVs that should only require
  one invocation of the recvmsg function.

Note, during instantiation of the RNG, the code checks whether the RNG
implementation requires seeding. If so, the RNG is seeded with output
from get_random_bytes.

A fully working example using all aspects of the RNG interface is
provided at http://www.chronox.de/libkcapi.html

Signed-off-by: Stephan Mueller <smueller@chronox.de>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
crypto/algif_rng.c [new file with mode: 0644]