]> andersk Git - openssh.git/blobdiff - openbsd-compat/bsd-arc4random.c
- markus@cvs.openbsd.org 2002/06/08 05:07:56
[openssh.git] / openbsd-compat / bsd-arc4random.c
index c45459f59df12db9bf5bdfea439874392157217d..25a559be006bf2d55b800b5783926b0f2895e941 100644 (file)
  */
 
 #include "includes.h"
+#include "log.h"
+
+RCSID("$Id$");
 
 #ifndef HAVE_ARC4RANDOM
 
 #include <openssl/rand.h>
 #include <openssl/rc4.h>
+#include <openssl/err.h>
 
 /* Size of key to use */
 #define SEED_SIZE 20
@@ -41,10 +45,15 @@ static RC4_KEY rc4;
 unsigned int arc4random(void)
 {
        unsigned int r = 0;
+       static int first_time = 1;
 
-       if (rc4_ready <= 0)
+       if (rc4_ready <= 0) {
+               if (first_time)
+                       seed_rng();
+               first_time = 0;
                arc4random_stir();
-       
+       }
+
        RC4(&rc4, sizeof(r), (unsigned char *)&r, (unsigned char *)&r);
 
        rc4_ready -= sizeof(r);
@@ -55,17 +64,14 @@ unsigned int arc4random(void)
 void arc4random_stir(void)
 {
        unsigned char rand_buf[SEED_SIZE];
-       
-       memset(&rc4, 0, sizeof(rc4));
-
-       seed_rng();
 
-       RAND_bytes(rand_buf, sizeof(rand_buf));
-       
+       memset(&rc4, 0, sizeof(rc4));
+       if (!RAND_bytes(rand_buf, sizeof(rand_buf)))
+               fatal("Couldn't obtain random bytes (error %ld)",
+                   ERR_get_error());
        RC4_set_key(&rc4, sizeof(rand_buf), rand_buf);
-
        memset(rand_buf, 0, sizeof(rand_buf));
-       
+
        rc4_ready = REKEY_BYTES;
 }
 #endif /* !HAVE_ARC4RANDOM */
This page took 0.052741 seconds and 4 git commands to generate.