diff options
author | Daniel Borkmann <dborkman@redhat.com> | 2013-06-04 13:22:56 +0200 |
---|---|---|
committer | Daniel Borkmann <dborkman@redhat.com> | 2013-06-04 13:22:56 +0200 |
commit | 85726b6a6d53f6c3a2c18ba3412ee5b14ee4d6f3 (patch) | |
tree | 4a76b6b0e85127135eaa30e6478cfdc18847702a /rnd.c | |
parent | 26b173d328e36e423ff7765df5b3fc75abb6a1d9 (diff) |
rnd: add gen_key_bytes to generate key from good entropy source
Make this a function and do not have this in curvetun hard coded.
Signed-off-by: Daniel Borkmann <dborkman@redhat.com>
Diffstat (limited to 'rnd.c')
-rw-r--r-- | rnd.c | 37 |
1 files changed, 30 insertions, 7 deletions
@@ -4,17 +4,20 @@ #include <unistd.h> #include "rnd.h" +#include "die.h" +#include "ioexact.h" +#include "ioops.h" -static int fd_rnd = -1; +static int fdw = -1; -static void randombytes(unsigned char *x, unsigned long long xlen) +static void randombytes_weak(unsigned char *x, unsigned long long xlen) { int ret; - if (fd_rnd == -1) { + if (fdw == -1) { for (;;) { - fd_rnd = open(LOW_ENTROPY_SOURCE, O_RDONLY); - if (fd_rnd != -1) + fdw = open(LOW_ENTROPY_SOURCE, O_RDONLY); + if (fdw != -1) break; sleep(1); } @@ -26,7 +29,7 @@ static void randombytes(unsigned char *x, unsigned long long xlen) else ret = 1048576; - ret = read(fd_rnd, x, ret); + ret = read(fdw, x, ret); if (ret < 1) { sleep(1); continue; @@ -37,9 +40,29 @@ static void randombytes(unsigned char *x, unsigned long long xlen) } } +static void randombytes_strong(unsigned char *x, unsigned long long xlen) +{ + int fds, ret; + + fds = open_or_die(HIG_ENTROPY_SOURCE, O_RDONLY); + + ret = read_exact(fds, x, xlen, 0); + if (ret != xlen) + panic("Error reading from entropy source!\n"); + + close(fds); +} + int secrand(void) { int ret; - randombytes((void *) &ret, sizeof(ret)); + + randombytes_weak((void *) &ret, sizeof(ret)); + return ret; } + +void gen_key_bytes(unsigned char *area, size_t len) +{ + randombytes_strong(area, len); +} |