From 0256eb27e6830b3c37b115ff71982cb59422bf15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Love=20H=C3=B6rnquist=20=C3=85strand?= Date: Mon, 17 Apr 2006 13:19:05 +0000 Subject: [PATCH] Split out unix /dev/random to a RAND_METHOD git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@17098 ec53bebd-3082-4978-b11e-865c3cabbd6b --- lib/des/rand.c | 179 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 128 insertions(+), 51 deletions(-) diff --git a/lib/des/rand.c b/lib/des/rand.c index 586a6d732..305c85187 100644 --- a/lib/des/rand.c +++ b/lib/des/rand.c @@ -43,74 +43,56 @@ RCSID("$Id$"); #include -const RAND_METHOD *default_meth; +static RAND_METHOD builtin_rand; +static const RAND_METHOD *selected_meth = &builtin_rand; -static int -get_device_fd(int flags) +void +RAND_seed(const void *indata, size_t size) { - static const char *rnd_devices[] = { - "/dev/random", - "/dev/srandom", - "/dev/urandom", - "/dev/arandom", - NULL - }; - const char **p; - - for(p = rnd_devices; *p; p++) { - int fd = open(*p, flags | O_NDELAY); - if(fd >= 0) - return fd; - } - return -1; + (*selected_meth->seed)(indata, size); } int RAND_bytes(void *outdata, size_t size) { - ssize_t ret; - int fd; - - fd = get_device_fd(O_RDONLY); - if (fd < 0) - return 0; - - ret = read(fd, outdata, size); - close(fd); - if (size != ret) - return 0; - - return 1; -} - -int -RAND_pseudo_bytes(void *outdata, size_t num) -{ - return RAND_bytes(outdata, num); + return (*selected_meth->bytes)(outdata, size); } void -RAND_seed(const void *indata, size_t size) +RAND_cleanup(void) { - int fd = get_device_fd(O_WRONLY); - if (fd < 0) - return; + (*selected_meth->cleanup)(); +} - write(fd, indata, size); - close(fd); +void +RAND_add(const void *indata, size_t size, double entropi) +{ + (*selected_meth->add)(indata, size, entropi); +} + +int +RAND_pseudo_bytes(void *outdata, size_t size) +{ + return (*selected_meth->pseudorand)(outdata, size); +} + +int +RAND_status(void) +{ + return (*selected_meth->status)(); } int RAND_set_rand_method(const RAND_METHOD *meth) { - default_meth = meth; + selected_meth = meth; return 1; } const RAND_METHOD * RAND_get_rand_method(void) { - return default_meth; + return selected_meth; } int @@ -131,14 +113,109 @@ RAND_write_file(const char *filename) return 1; } -int -RAND_status(void) -{ - return 1; -} - int RAND_egd(const char *filename) { return 1; } + +/* + * Unix /dev/random + */ + +static int +get_device_fd(int flags) +{ + static const char *rnd_devices[] = { + "/dev/random", + "/dev/srandom", + "/dev/urandom", + "/dev/arandom", + NULL + }; + const char **p; + + for(p = rnd_devices; *p; p++) { + int fd = open(*p, flags | O_NDELAY); + if(fd >= 0) + return fd; + } + return -1; +} + +static void +unix_seed(const void *indata, int size) +{ + int fd; + + if (size <= 0) + return; + + fd = get_device_fd(O_WRONLY); + if (fd < 0) + return; + + write(fd, indata, size); + close(fd); + +} + +static int +unix_bytes(unsigned char *outdata, int size) +{ + ssize_t ret; + int fd; + + if (size <= 0) + return 0; + + fd = get_device_fd(O_RDONLY); + if (fd < 0) + return 0; + + ret = read(fd, outdata, size); + close(fd); + if (size != ret) + return 0; + + return 1; +} + +static void +unix_cleanup(void) +{ +} + +static void +unix_add(const void *indata, int size, double entropi) +{ + unix_seed(indata, size); +} + +static int +unix_pseudorand(unsigned char *outdata, int size) +{ + return unix_bytes(outdata, size); +} + +static int +unix_status(void) +{ + int fd; + + fd = get_device_fd(O_RDONLY); + if (fd < 0) + return 0; + close(fd); + + return 1; +} + +static RAND_METHOD builtin_rand = { + unix_seed, + unix_bytes, + unix_cleanup, + unix_add, + unix_pseudorand, + unix_status +};