svn commit: r339789 - head/sys/dev/random

Conrad Meyer cem at FreeBSD.org
Fri Oct 26 21:00:27 UTC 2018


Author: cem
Date: Fri Oct 26 21:00:26 2018
New Revision: 339789
URL: https://svnweb.freebsd.org/changeset/base/339789

Log:
  fortuna: Drop global lock to zero stack variables
  
  Also drop explicit zeroing of hash context -- hash finish() operation is
  expected to do this.
  
  PR:		230877
  Suggested by:	delphij@
  Reviewed by:	delphij, markm
  Approved by:	secteam (delphij)
  Sponsored by:	Dell EMC Isilon
  Differential Revision:	https://reviews.freebsd.org/D16986

Modified:
  head/sys/dev/random/fortuna.c

Modified: head/sys/dev/random/fortuna.c
==============================================================================
--- head/sys/dev/random/fortuna.c	Fri Oct 26 20:55:01 2018	(r339788)
+++ head/sys/dev/random/fortuna.c	Fri Oct 26 21:00:26 2018	(r339789)
@@ -374,47 +374,50 @@ random_fortuna_pre_read(void)
 	now = getsbinuptime();
 #endif
 
-	if (fortuna_state.fs_pool[0].fsp_length >= fortuna_state.fs_minpoolsize
+	if (fortuna_state.fs_pool[0].fsp_length < fortuna_state.fs_minpoolsize
 #ifdef _KERNEL
 	    /* FS&K - Use 'getsbinuptime()' to prevent reseed-spamming. */
-	    && (now - fortuna_state.fs_lasttime > SBT_1S/10)
+	    || (now - fortuna_state.fs_lasttime <= SBT_1S/10)
 #endif
 	) {
+		RANDOM_RESEED_UNLOCK();
+		return;
+	}
+
 #ifdef _KERNEL
-		fortuna_state.fs_lasttime = now;
+	fortuna_state.fs_lasttime = now;
 #endif
 
-		/* FS&K - ReseedCNT = ReseedCNT + 1 */
-		fortuna_state.fs_reseedcount++;
-		/* s = \epsilon at start */
-		for (i = 0; i < RANDOM_FORTUNA_NPOOLS; i++) {
-			/* FS&K - if Divides(ReseedCnt, 2^i) ... */
-			if ((fortuna_state.fs_reseedcount % (1 << i)) == 0) {
-				/*-
-				 * FS&K - temp = (P_i)
-				 *      - P_i = \epsilon
-				 *      - s = s|H(temp)
-				 */
-				randomdev_hash_finish(&fortuna_state.fs_pool[i].fsp_hash, temp);
-				randomdev_hash_init(&fortuna_state.fs_pool[i].fsp_hash);
-				fortuna_state.fs_pool[i].fsp_length = 0;
-				randomdev_hash_init(&context);
-				randomdev_hash_iterate(&context, temp, RANDOM_KEYSIZE);
-				randomdev_hash_finish(&context, s + i*RANDOM_KEYSIZE_WORDS);
-			} else
-				break;
-		}
+	/* FS&K - ReseedCNT = ReseedCNT + 1 */
+	fortuna_state.fs_reseedcount++;
+	/* s = \epsilon at start */
+	for (i = 0; i < RANDOM_FORTUNA_NPOOLS; i++) {
+		/* FS&K - if Divides(ReseedCnt, 2^i) ... */
+		if ((fortuna_state.fs_reseedcount % (1 << i)) == 0) {
+			/*-
+			    * FS&K - temp = (P_i)
+			    *      - P_i = \epsilon
+			    *      - s = s|H(temp)
+			    */
+			randomdev_hash_finish(&fortuna_state.fs_pool[i].fsp_hash, temp);
+			randomdev_hash_init(&fortuna_state.fs_pool[i].fsp_hash);
+			fortuna_state.fs_pool[i].fsp_length = 0;
+			randomdev_hash_init(&context);
+			randomdev_hash_iterate(&context, temp, RANDOM_KEYSIZE);
+			randomdev_hash_finish(&context, s + i*RANDOM_KEYSIZE_WORDS);
+		} else
+			break;
+	}
 #ifdef _KERNEL
-		SDT_PROBE2(random, fortuna, event_processor, debug, fortuna_state.fs_reseedcount, fortuna_state.fs_pool);
+	SDT_PROBE2(random, fortuna, event_processor, debug, fortuna_state.fs_reseedcount, fortuna_state.fs_pool);
 #endif
-		/* FS&K */
-		random_fortuna_reseed_internal(s, i);
-		/* Clean up and secure */
-		explicit_bzero(s, sizeof(s));
-		explicit_bzero(temp, sizeof(temp));
-		explicit_bzero(&context, sizeof(context));
-	}
+	/* FS&K */
+	random_fortuna_reseed_internal(s, i);
 	RANDOM_RESEED_UNLOCK();
+
+	/* Clean up and secure */
+	explicit_bzero(s, sizeof(s));
+	explicit_bzero(temp, sizeof(temp));
 }
 
 /*-


More information about the svn-src-all mailing list