Module Name: src Committed By: tls Date: Wed Sep 5 18:57:34 UTC 2012
Modified Files: src/sys/kern: kern_rndq.c subr_cprng.c src/sys/sys: rnd.h Log Message: Don't wait until the pool *fills* to rekey anything that was keyed with insufficient entropy at boot: key it as soon as it makes any request after we hit the minimum entropy threshold. This too should help avoid predictable output at boot time. To generate a diff of this commit: cvs rdiff -u -r1.4 -r1.5 src/sys/kern/kern_rndq.c cvs rdiff -u -r1.9 -r1.10 src/sys/kern/subr_cprng.c cvs rdiff -u -r1.32 -r1.33 src/sys/sys/rnd.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/kern_rndq.c diff -u src/sys/kern/kern_rndq.c:1.4 src/sys/kern/kern_rndq.c:1.5 --- src/sys/kern/kern_rndq.c:1.4 Wed Sep 5 18:06:52 2012 +++ src/sys/kern/kern_rndq.c Wed Sep 5 18:57:34 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_rndq.c,v 1.4 2012/09/05 18:06:52 tls Exp $ */ +/* $NetBSD: kern_rndq.c,v 1.5 2012/09/05 18:57:34 tls Exp $ */ /*- * Copyright (c) 1997-2011 The NetBSD Foundation, Inc. @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: kern_rndq.c,v 1.4 2012/09/05 18:06:52 tls Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_rndq.c,v 1.5 2012/09/05 18:57:34 tls Exp $"); #include <sys/param.h> #include <sys/ioctl.h> @@ -168,7 +168,7 @@ static void rnd_add_data_ts(krndso uint32_t, uint32_t, uint32_t); int rnd_ready = 0; -static int rnd_have_entropy = 0; +int rnd_initial_entropy = 0; #ifdef DIAGNOSTIC static int rnd_tested = 0; @@ -255,11 +255,11 @@ rnd_wakeup_readers(void) */ if (rndpool_get_entropy_count(&rnd_pool) > RND_ENTROPY_THRESHOLD * 8) { #ifdef RND_VERBOSE - if (!rnd_have_entropy) + if (!rnd_initial_entropy) printf("rnd: have initial entropy (%u)\n", rndpool_get_entropy_count(&rnd_pool)); #endif - rnd_have_entropy = 1; + rnd_initial_entropy = 1; mutex_spin_exit(&rndpool_mtx); } else { mutex_spin_exit(&rndpool_mtx); @@ -447,7 +447,7 @@ rnd_init(void) RND_POOLBITS / 2)); if (rndpool_get_entropy_count(&rnd_pool) > RND_ENTROPY_THRESHOLD * 8) { - rnd_have_entropy = 1; + rnd_initial_entropy = 1; } mutex_spin_exit(&rndpool_mtx); #ifdef RND_VERBOSE @@ -914,7 +914,7 @@ rnd_extract_data_locked(void *p, u_int32 } timed_in++; } - if (__predict_false(!rnd_have_entropy)) { + if (__predict_false(!rnd_initial_entropy)) { u_int32_t c; #ifdef RND_VERBOSE Index: src/sys/kern/subr_cprng.c diff -u src/sys/kern/subr_cprng.c:1.9 src/sys/kern/subr_cprng.c:1.10 --- src/sys/kern/subr_cprng.c:1.9 Sat May 19 16:00:41 2012 +++ src/sys/kern/subr_cprng.c Wed Sep 5 18:57:34 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: subr_cprng.c,v 1.9 2012/05/19 16:00:41 tls Exp $ */ +/* $NetBSD: subr_cprng.c,v 1.10 2012/09/05 18:57:34 tls Exp $ */ /*- * Copyright (c) 2011 The NetBSD Foundation, Inc. @@ -46,7 +46,7 @@ #include <sys/cprng.h> -__KERNEL_RCSID(0, "$NetBSD: subr_cprng.c,v 1.9 2012/05/19 16:00:41 tls Exp $"); +__KERNEL_RCSID(0, "$NetBSD: subr_cprng.c,v 1.10 2012/09/05 18:57:34 tls Exp $"); void cprng_init(void) @@ -171,7 +171,7 @@ cprng_strong_create(const char *const na c->reseed.state = RSTATE_IDLE; c->reseed.cb = cprng_strong_reseed; c->reseed.arg = c; - c->entropy_serial = rnd_filled; + c->entropy_serial = rnd_initial_entropy ? rnd_filled : -1; mutex_init(&c->reseed.mtx, MUTEX_DEFAULT, IPL_VM); strlcpy(c->reseed.name, name, sizeof(c->reseed.name)); @@ -228,8 +228,14 @@ cprng_strong(cprng_strong_t *const c, vo } mutex_enter(&c->mtx); + /* If we were initialized with the pool empty, rekey ASAP */ + if (__predict_false(c->entropy_serial == -1) && rnd_initial_entropy) { + goto rekeyany; /* We have _some_ entropy, use it. */ + } + if (nist_ctr_drbg_generate(&c->drbg, p, len, &cc, sizeof(cc))) { /* A generator failure really means we hit the hard limit. */ +rekeyany: if (c->flags & CPRNG_REKEY_ANY) { uint8_t key[NIST_BLOCK_KEYLEN_BYTES]; Index: src/sys/sys/rnd.h diff -u src/sys/sys/rnd.h:1.32 src/sys/sys/rnd.h:1.33 --- src/sys/sys/rnd.h:1.32 Fri Apr 20 21:57:34 2012 +++ src/sys/sys/rnd.h Wed Sep 5 18:57:33 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: rnd.h,v 1.32 2012/04/20 21:57:34 tls Exp $ */ +/* $NetBSD: rnd.h,v 1.33 2012/09/05 18:57:33 tls Exp $ */ /*- * Copyright (c) 1997 The NetBSD Foundation, Inc. @@ -187,6 +187,7 @@ rnd_add_uint32(krndsource_t *kr, uint32_ extern int rnd_full; extern int rnd_filled; +extern int rnd_initial_entropy; #endif /* _KERNEL */