Author: markm
Date: Sun Oct 13 00:10:48 2013
New Revision: 256412
URL: http://svnweb.freebsd.org/changeset/base/256412

Log:
  There is an issue (not seen in our testing) where "yarrow" and
  "dummy" switch priorities, and the users are left with no usable
  /dev/random. The fix assigns priories to these and gives the users
  what they want. The override tuneable has a stupid name (blame me!)
  and this fixes it to be something that 'sysctl kern.random' emits
  and is the right thing to set.
  
  Approved by:  re (gjb)
  Approved by:  secteam (cperciva)

Modified:
  head/sys/dev/random/dummy_rng.c
  head/sys/dev/random/random_adaptors.c
  head/sys/dev/random/randomdev.h
  head/sys/dev/random/randomdev_soft.c
Directory Properties:
  head/sys/   (props changed)

Modified: head/sys/dev/random/dummy_rng.c
==============================================================================
--- head/sys/dev/random/dummy_rng.c     Sat Oct 12 23:51:00 2013        
(r256411)
+++ head/sys/dev/random/dummy_rng.c     Sun Oct 13 00:10:48 2013        
(r256412)
@@ -102,6 +102,7 @@ struct random_adaptor dummy_random = {
        .read = (random_read_func_t *)random_null_func,
        .reseed = (random_reseed_func_t *)random_null_func,
        .seeded = 0, /* This device can never be seeded */
+       .priority = 1, /* Bottom priority, so goes to last position */
 };
 
 static int

Modified: head/sys/dev/random/random_adaptors.c
==============================================================================
--- head/sys/dev/random/random_adaptors.c       Sat Oct 12 23:51:00 2013        
(r256411)
+++ head/sys/dev/random/random_adaptors.c       Sun Oct 13 00:10:48 2013        
(r256412)
@@ -104,12 +104,13 @@ void
 random_adaptor_choose(struct random_adaptor **adaptor)
 {
        char                     rngs[128], *token, *cp;
-       struct random_adaptors  *rpp;
+       struct random_adaptors  *rppi, *ramax;
+       unsigned                 primax;
 
        KASSERT(adaptor != NULL, ("pre-conditions failed"));
 
        *adaptor = NULL;
-       if (TUNABLE_STR_FETCH("rngs_want", rngs, sizeof(rngs))) {
+       if (TUNABLE_STR_FETCH("kern.random.active_adaptor", rngs, 
sizeof(rngs))) {
                cp = rngs;
 
                while ((token = strsep(&cp, ",")) != NULL)
@@ -120,16 +121,23 @@ random_adaptor_choose(struct random_adap
                                    " skipping\n", token);
        }
 
+       primax = 0U;
        if (*adaptor == NULL) {
                /*
-                * Fallback to the first thing that's on the list of
-                * available RNGs.
+                * Fall back to the highest priority item on the available
+                * RNG list.
                 */
                sx_slock(&adaptors_lock);
 
-               rpp = LIST_FIRST(&adaptors);
-               if (rpp != NULL)
-                       *adaptor = rpp->rsp;
+               ramax = NULL;
+               LIST_FOREACH(rppi, &adaptors, entries) {
+                       if (rppi->rsp->priority >= primax) {
+                               ramax = rppi;
+                               primax = rppi->rsp->priority;
+                       }
+               }
+               if (ramax != NULL)
+                       *adaptor = ramax->rsp;
 
                sx_sunlock(&adaptors_lock);
 

Modified: head/sys/dev/random/randomdev.h
==============================================================================
--- head/sys/dev/random/randomdev.h     Sat Oct 12 23:51:00 2013        
(r256411)
+++ head/sys/dev/random/randomdev.h     Sun Oct 13 00:10:48 2013        
(r256412)
@@ -44,6 +44,7 @@ struct random_adaptor {
        struct selinfo          rsel;
        const char              *ident;
        int                     seeded;
+       unsigned                priority;
        random_init_func_t      *init;
        random_deinit_func_t    *deinit;
        random_block_func_t     *block;

Modified: head/sys/dev/random/randomdev_soft.c
==============================================================================
--- head/sys/dev/random/randomdev_soft.c        Sat Oct 12 23:51:00 2013        
(r256411)
+++ head/sys/dev/random/randomdev_soft.c        Sun Oct 13 00:10:48 2013        
(r256412)
@@ -84,6 +84,7 @@ static struct random_adaptor random_cont
        .poll = randomdev_poll,
        .reseed = randomdev_flush_reseed,
        .seeded = 0, /* This will be seeded during entropy processing */
+       .priority = 90, /* High priority, so top of the list. Fortuna may still 
win. */
 };
 #define RANDOM_MODULE_NAME     yarrow
 #define RANDOM_CSPRNG_NAME     "yarrow"
@@ -99,6 +100,7 @@ static struct random_adaptor random_cont
        .poll = randomdev_poll,
        .reseed = randomdev_flush_reseed,
        .seeded = 0, /* This will be excplicitly seeded at startup when secured 
*/
+       .priority = 100, /* High priority, so top of the list. Beat Yarrow. */
 };
 #define RANDOM_MODULE_NAME     fortuna
 #define RANDOM_CSPRNG_NAME     "fortuna"
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to