Use random_read() for small urandom_read() calls
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 4 Feb 2016 23:33:17 +0000 (18:33 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 4 Feb 2016 23:33:17 +0000 (18:33 -0500)
urandom_read() starts with a random 8 byte seed.  If we need less than
that, we can (probably) just go with those bytes, as if we called
random_read() directly.

This also exposes random_read() and urandom_read() to external callers.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/drivers/dev/random.c
kern/include/ns.h

index 4e54c03..bba11d8 100644 (file)
@@ -47,7 +47,7 @@ void random_add(void *xp)
 /*
  *  consume random bytes
  */
-static uint32_t _randomread(void *xp, uint32_t n)
+uint32_t random_read(void *xp, uint32_t n)
 {
        ERRSTACK(1);
 
@@ -69,17 +69,18 @@ static uint32_t _randomread(void *xp, uint32_t n)
 /**
  * Fast random generator
  **/
-uint32_t urandomread(void *xp, uint32_t n)
+uint32_t urandom_read(void *xp, uint32_t n)
 {
-       ERRSTACK(1);
        uint64_t seed[16];
        uint8_t *e, *p;
        uint32_t x = 0;
        uint64_t s0;
        uint64_t s1;
 
+       if (n <= sizeof(seed))
+               return random_read(xp, n);
        // The initial seed is from a good random pool.
-       _randomread(seed, sizeof(seed));
+       random_read(seed, sizeof(seed));
        p = xp;
        for (e = p + n; p < e;) {
                s0 = seed[x];
@@ -157,9 +158,9 @@ static long randomread(struct chan *c, void *va, long n, int64_t ignored)
                        return devdirread(c, va, n, randomdir,
                                          ARRAY_SIZE(randomdir), devgen);
                case Qrandom:
-                       return _randomread(va, n);
+                       return random_read(va, n);
                case Qurandom:
-                       return urandomread(va, n);
+                       return urandom_read(va, n);
                default:
                        panic("randomread: qid %d is impossible", c->qid.path);
        }
index c0e715f..3f22c8e 100644 (file)
@@ -793,6 +793,8 @@ char *nextelem(char *unused_char_p_t, char *);
 struct cname *newcname(char *unused_char_p_t);
 void notkilled(void);
 int nrand(int);
+uint32_t random_read(void *xp, uint32_t n);
+uint32_t urandom_read(void *xp, uint32_t n);
 uint64_t ns2fastticks(uint64_t);
 int okaddr(uint32_t, uint32_t, int);
 int omode_to_rwx(int);