Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/share/man/man9 Rework cprng(9) man page to reflect the curre...



details:   https://anonhg.NetBSD.org/src/rev/bc2a6a5217d0
branches:  trunk
changeset: 788706:bc2a6a5217d0
user:      riastradh <riastradh%NetBSD.org@localhost>
date:      Thu Jul 18 14:35:30 2013 +0000

description:
Rework cprng(9) man page to reflect the current state of affairs.

- Remove defunct cprng_strong_getflags/setflags.
- Remove defunct cprng_strong_ready.
- Document CPRNG_HARD.
- Omit cprng_strong structure, which is now opaque.
- Specify what can sleep and under what conditions.
- Be a little more consistent about some markup.

This is not the whole story (select/kqueue stuff for /dev/random is
still omitted), and I plan to change it some more (to split
cprng_strong into one routine that unconditionally guarantees as many
bytes as you asked, and another routine that may block or return
partial reads), but this will do until I find the time for those.

diffstat:

 share/man/man9/cprng.9 |  249 ++++++++++++++++++++++++++----------------------
 1 files changed, 135 insertions(+), 114 deletions(-)

diffs (truncated from 370 to 300 lines):

diff -r ef0b56d46e9a -r bc2a6a5217d0 share/man/man9/cprng.9
--- a/share/man/man9/cprng.9    Thu Jul 18 14:14:00 2013 +0000
+++ b/share/man/man9/cprng.9    Thu Jul 18 14:35:30 2013 +0000
@@ -1,10 +1,10 @@
-.\"    $NetBSD: cprng.9,v 1.7 2013/06/23 02:39:32 riastradh Exp $
+.\"    $NetBSD: cprng.9,v 1.8 2013/07/18 14:35:30 riastradh Exp $
 .\"
-.\" Copyright (c) 2011 The NetBSD Foundation, Inc.
+.\" Copyright (c) 2011-2013 The NetBSD Foundation, Inc.
 .\" All rights reserved.
 .\"
 .\" This code is derived from software contributed to The NetBSD Foundation
-.\" by Thor Lancelot Simon.
+.\" by Thor Lancelot Simon and Taylor R. Campbell.
 .\"
 .\" Redistribution and use in source and binary forms, with or without
 .\" modification, are permitted provided that the following conditions
@@ -27,75 +27,52 @@
 .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 .\" POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd December 17, 2011
+.Dd July 18, 2013
 .Dt CPRNG 9
 .Os
 .Sh NAME
 .Nm cprng ,
 .Nm cprng_strong_create ,
+.Nm cprng_strong_destroy ,
 .Nm cprng_strong ,
 .Nm cprng_strong32 ,
 .Nm cprng_strong64 ,
-.Nm cprng_strong_getflags ,
-.Nm cprng_strong_setflags ,
-.Nm cprng_strong_ready ,
-.Nm cprng_strong_destroy ,
 .Nm cprng_fast ,
 .Nm cprng_fast32 ,
 .Nm cprng_fast64 ,
-.Nd cryptographic pseudo-random number generators
+.Nd cryptographic pseudorandom number generators
 .Sh SYNOPSIS
 .In sys/cprng.h
 .Ft cprng_strong_t *
-.Fn cprng_strong_create "const char *const name" "int ipl" "int flags"
+.Fn cprng_strong_create "const char *name" "int ipl" "int flags"
 .Ft void
 .Fn cprng_strong_destroy "cprng_strong_t *cprng"
 .Ft size_t
-.Fn cprng_strong "cprng_strong_t *const cprng" "void *buf" "size_t len" "int blocking"
-.Ft size_t
-.Fn cprng_fast "void *buf" "size_t len"
+.Fn cprng_strong "cprng_strong_t *cprng" "void *buf" "size_t len" "int flags"
 .Ft uint32_t
 .Fn cprng_strong32 "void"
 .Ft uint64_t
 .Fn cprng_strong64 "void"
+.Ft size_t
+.Fn cprng_fast "void *buf" "size_t len"
 .Ft uint32_t
 .Fn cprng_fast32 "void"
 .Ft uint32_t
 .Fn cprng_fast64 "void"
-.Ft int
-.Fn cprng_strong_getflags "cprng_strong_t *const cprng"
-.Ft void
-.Fn cprng_strong_setflags "cprng_strong_t *const cprng" "int flags"
 .Bd -literal
 #define CPRNG_MAX_LEN   524288
-
-typedef struct _cprng_strong {
-        kmutex_t       mtx;
-        kcondvar_t     cv;
-       struct selinfo  selq;
-        NIST_CTR_DRBG  drbg;
-        int            flags;
-        char           name[16];
-        int            reseed_pending;
-        rndsink_t      reseed;
-} cprng_strong_t;
 .Ed
 .Sh DESCRIPTION
 The
 .Nm
-family of functions supply randomness to callers within the
-.Nx
-kernel.
+family of functions provide cryptographic pseudorandom number
+generators automatically seeded from the kernel entropy pool.
 They replace the
 .Xr arc4random 9
 and
 .Xr rnd_extract_data 9
 functions for this purpose.
 The
-.Nm
-functions provide stream generators automatically keyed (and if
-necessary rekeyed) from the kernel entropy pool.
-The
 .Nx
 kernel no longer supports direct reading from the kernel entropy pool; all
 access is mediated by the
@@ -104,136 +81,181 @@
 .Pp
 The
 .Dq strong
-family of functions supply cryptographically strong random numbers
-suitable for keying crypto systems and similar purposes.
+family of functions use cryptographically strong pseudorandom number
+generators suitable for keying crypto systems and similar purposes.
 Calls to
 .Xr rnd_extract_data 9
-should be replaced with calls to
-.Nm cprng_strong .
+should be replaced by calls to
+.Fn cprng_strong .
 .Pp
 The
 .Dq fast
-family of functions supply less strong random numbers, suitable for
-initialization vectors, nonces in certain protocols, and other
-similar purposes, using a faster but less secure stream-cipher generator.
+family of functions use cryptographically weaker pseudorandom number
+generators suitable for initialization vectors, nonces in certain
+protocols, and other similar purposes, using a faster but less secure
+stream-cipher-based generator.
 Calls to
 .Xr arc4random 9
-should be replaced with calls to
-.Nm cprng_fast32 ,
+should be replaced by calls to
+.Fn cprng_fast32 ,
 and calls to
 .Xr arc4randbytes 9
-should be replaced with calls to
-.Nm cprng_fast .
+should be replaced by calls to
+.Fn cprng_fast .
 .Pp
-A single instance of the
-.Nm cprng_fast
-generator serves the entire kernel.
-A single, well-known instance of the
-.Nm cprng_strong
-generator,
+A single instance of the fast generator serves the entire kernel.
+A well-known instance of the strong generator,
 .Dv kern_cprng ,
-may be used by any in-kernel caller, but
-new separately-keyed instances of the
-.Nm cprng_strong
-generator can also be created by calling
-.Nm cprng_strong_create .
+may be used by any in-kernel caller, but separately seeded instances of
+the strong generator can also be created by calling
+.Fn cprng_strong_create .
 .Sh FUNCTIONS
 .Bl -tag -width abcd
 .It Fn cprng_strong_create "name" "ipl" "flags"
+Create an instance of the cprng_strong generator.
+This generator implements the NIST SP 800-90 CTR_DRBG with AES128 as
+the block transform.
 .Pp
-Create an instance of the cprng_strong generator.
-This generator
-implements the NIST SP 800-90 CTR_DRBG with AES128 as the block transform.
 The
 .Fa name
-argument is used to "personalize" the CTR_DRBG according to the standard,
-so that its initial state will depend both on keying material from the
-entropy pool and also on the personalization string (name).
+argument is used to
+.Dq personalize
+the CTR_DRBG according to the standard, so that its initial state will
+depend both on seed material from the entropy pool and also on the
+personalization string (name).
+.Pp
 The
 .Fa ipl
-argument specifies the interrupt priority level for the mutex which will
-serialize access to the new instance of the generator (see
-.Xr spl 9 ) .
+argument specifies the interrupt priority level for the mutex which
+will serialize access to the new instance of the generator (see
+.Xr spl 9 ) ,
+and must be no higher than
+.Dv IPL_VM .
+.Pp
 The
 .Fa flags
 argument controls the behavior of the generator:
 .Bl -tag -width CPRNG_REKEY_ANY
 .It Dv CPRNG_INIT_ANY
-Perform initial keying of the generator from the entropy pool even if
-the current estimate of entropy in the pool is less than the required
-number of key bits for the generator.
+Suppress a warning message to the console if, during
+.Fn cprng_strong_create ,
+only partial entropy for the generator is available from the entropy
+pool.
 .It Dv CPRNG_REKEY_ANY
-When rekeying of the generator is required, key the generator from the
-entropy pool even if the current estimate of entropy in the pool is less
-than the required number of key bits for the generator.
+Suppress a warning message to the console if, during
+.Fn cprng_strong
+after the generator has been exhausted and must be reseeded, only
+partial entropy for the generator is available from the entropy pool.
 .It Dv CPRNG_USE_CV
-Perform a
-.Xr cv_broadcast 9
-operation on the "cv" member of the returned cprng_strong_t each time
-the generator is successfully rekeyed.
-.Em If this flag is set, the generator will sleep when rekeying is needed,
-.Em and will therefore always return the requested number of bytes.
+Make
+.Fn cprng_strong
+sleep if the generator has not been seeded with full entropy until full
+entropy is available.
+Otherwise,
+.Fn cprng_strong
+will never sleep when passed this generator.
+.It Dv CPRNG_HARD
+Limit the number of bits of output from the generator before reseeding
+to the number of bits in its seed, so that it approximates the
+information-theoretic entropy of its seed.
+Otherwise, the generator may provide many more bits of output than it
+was seeded with.
 .El
 .Pp
-Creation will succeed even if key material for the generator is not
+Creation will succeed even if full entropy for the generator is not
 available.
-In this case, the first request to read from the generator
-may cause rekeying.
+In this case, the first request to read from the generator may cause
+reseeding.
+.Pp
+.Fn cprng_strong_create
+may sleep to allocate memory.
 .It Fn cprng_strong_destroy "cprng"
+Destroy
+.Fa cprng .
 .Pp
-Destroy an instance of the cprng_strong generator.
-.It Fn cprng_strong "cprng" "buf" "len" "blocking"
-.Pp
+.Fn cprng_strong_destroy
+may sleep.
+.It Fn cprng_strong "cprng" "buf" "len" "flags"
 Fill memory location
 .Fa buf
-with
+with up to
 .Fa len
 bytes from the generator
-.Fa cprng .
-The
-.Fa blocking
-argument controls the blocking/non-blocking behavior of the
-generator: if it is set to
-.Dv FNONBLOCK ,
-the generator may return less than
+.Fa cprng ,
+and return the number of bytes.
 .Fa len
-bytes if it requires rekeying.
-If the
+must be at most
+.Dv CPRNG_MAX_LEN .
+.Pp
+If
+.Fa cprng
+was created with the
 .Dv CPRNG_USE_CV
-flag is set on the generator, the caller can wait on
-.Dv cprng->cv
-for notification that the generator can again supply bytes.
-A maximum of
-.Dv CPRNG_MAX_LEN
-bytes may be requested at once; this is a restriction of the
-CTR_DRBG specification.
+flag and has been exhausted, then
+.Fn cprng_strong
+may sleep until full entropy can be obtained from the entropy pool to
+reseed it.
+However, if
+.Fa flags
+includes the
+.Dv FNONBLOCK
+flag, then
+.Fn cprng_strong
+will immediately return zero in this case instead.
+.Pp
+If
+.Fa cprng
+was created with the
+.Dv CPRNG_HARD
+flag, then
+.Fn cprng_strong



Home | Main Index | Thread Index | Old Index