From 02cb790b9e346032e8d4112b5d3dac9e01941df4 Mon Sep 17 00:00:00 2001 From: Daniel Borkmann Date: Mon, 28 Jan 2013 17:55:43 +0100 Subject: [PATCH] xio: add nacl's randombyte function Signed-off-by: Daniel Borkmann --- xio.c | 41 +++++++++++++++++++++++++++++++++++++++++ xio.h | 6 +----- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/xio.c b/xio.c index df922134..bb5fe387 100644 --- a/xio.c +++ b/xio.c @@ -156,3 +156,44 @@ ssize_t write_exact(int fd, void *buf, size_t len, int mayexit) return num; } + +static int fd_rnd = -1; + +static void randombytes(unsigned char *x, unsigned long long xlen) +{ + int ret; + + if (fd_rnd < 0) { + for (;;) { + fd_rnd = open("/dev/urandom", O_RDONLY); + if (fd_rnd < 0) + break; + sleep(1); + } + } + + while (xlen > 0) { + if (xlen < 1048576) + ret = xlen; + else + ret = 1048576; + + ret = read(fd_rnd, x, ret); + if (ret < 1) { + sleep(1); + continue; + } + + x += ret; + xlen -= ret; + } +} + +int secrand(void) +{ + int ret; + + randombytes((void *) &ret, sizeof(ret)); + + return ret; +} diff --git a/xio.h b/xio.h index cdda6b88..a144da22 100644 --- a/xio.h +++ b/xio.h @@ -17,10 +17,6 @@ extern ssize_t read_or_die(int fd, void *buf, size_t count); extern ssize_t write_or_die(int fd, const void *buf, size_t count); extern ssize_t read_exact(int fd, void *buf, size_t len, int mayexit); extern ssize_t write_exact(int fd, void *buf, size_t len, int mayexit); - -static inline int secrand(void) -{ - return rand(); -} +extern int secrand(void); #endif /* XIO_H */ -- 2.11.4.GIT