chiark / gitweb /
lib/: Use Salsa20/8 for random bits, rather than RC4.
[disorder] / lib / random.c
index d6be3d9f47ec27614f8a536f8a5c88a104b9b63a..ee53a9acc0fcf5206fe0d1dcfce8374cb19d9f88 100644 (file)
 
 #include "random.h"
 #include "log.h"
-#include "arcfour.h"
+#include "salsa208.h"
 #include "basen.h"
 #include "mem.h"
 
 static int random_count;
 static int random_fd = -1;
-static arcfour_context random_ctx[1];
+static salsa208_context random_ctx[1];
 
 /** @brief Rekey the RNG
  *
  * Resets the RNG's key to a random one read from /dev/urandom
  */
 static void random__rekey(void) {
-  char key[128];
+  char key[32];
   int n;
 
   if(random_fd < 0) {
     if((random_fd = open("/dev/urandom", O_RDONLY)) < 0)
-      fatal(errno, "opening /dev/urandom");
+      disorder_fatal(errno, "opening /dev/urandom");
   }
   if((n = read(random_fd, key, sizeof key)) < 0)
-    fatal(errno, "reading from /dev/urandom");
+    disorder_fatal(errno, "reading from /dev/urandom");
   if((size_t)n < sizeof key)
-    fatal(0, "reading from /dev/urandom: short read");
-  arcfour_setkey(random_ctx, key, sizeof key);
-  random_count = 8 * 1024 * 1024;
+    disorder_fatal(0, "reading from /dev/urandom: short read");
+  salsa208_setkey(random_ctx, key, sizeof key);
+  random_count = 256 * 1024 * 1024;
 }
 
 /** @brief Get random bytes
@@ -64,9 +64,7 @@ static void random__rekey(void) {
 void random_get(void *ptr, size_t bytes) {
   if(random_count == 0)
     random__rekey();
-  /* Encrypting 0s == just returning the keystream */
-  memset(ptr, 0, bytes);
-  arcfour_stream(random_ctx, (char *)ptr, (char *)ptr, bytes);
+  salsa208_stream(random_ctx, 0, ptr, bytes);
   if(bytes > (size_t)random_count)
     random_count = 0;
   else