X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/985bb670b4e07d35cb1580780253ded2524a342e..ed8e4373ca22966011827552d0cb7dff531539cd:/lib/random.c diff --git a/lib/random.c b/lib/random.c index d6be3d9..ee53a9a 100644 --- a/lib/random.c +++ b/lib/random.c @@ -29,32 +29,32 @@ #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