diff --git a/lib/des/rand.c b/lib/des/rand.c index d50582a75..71fef92de 100644 --- a/lib/des/rand.c +++ b/lib/des/rand.c @@ -43,8 +43,10 @@ RCSID("$Id$"); #include -int -RAND_bytes(void *outdata, size_t size) +const RAND_METHOD *default_meth; + +static int +get_device_fd(void) { static const char *rnd_devices[] = { "/dev/random", @@ -57,15 +59,28 @@ RAND_bytes(void *outdata, size_t size) for(p = rnd_devices; *p; p++) { int fd = open(*p, O_RDONLY | O_NDELAY); - - if(fd >= 0 && read(fd, outdata, size) == size) { - close(fd); - return 1; - } - close(fd); + if(fd >= 0) + return fd; } + return -1; +} - return 0; +int +RAND_bytes(void *outdata, size_t size) +{ + ssize_t ret; + int fd; + + fd = get_device_fd(); + if (fd < 0) + return 0; + + ret = read(fd, outdata, size); + close(fd); + if (size != ret) + return 0; + + return 1; } int @@ -74,3 +89,56 @@ RAND_pseudo_bytes(void *outdata, size_t num) return RAND_bytes(outdata, num); } +void +RAND_seed(const void *indata, size_t size) +{ + int fd = get_device_fd(); + if (fd < 0) + return; + + write(fd, indata, size); + close(fd); +} + +int +RAND_set_rand_method(const RAND_METHOD *meth) +{ + default_meth = meth; + return 1; +} + +const RAND_METHOD * +RAND_get_rand_method(void) +{ + return default_meth; +} + +int +RAND_set_rand_engine(ENGINE *engine) +{ + return 1; +} + +int +RAND_load_file(const char *filename, size_t size) +{ + return 1; +} + +int +RAND_write_file(const char *filename) +{ + return 1; +} + +int +RAND_status(void) +{ + return 1; +} + +int +RAND_egd(const char *filename) +{ + return 1; +} diff --git a/lib/des/rand.h b/lib/des/rand.h index b3418557d..48f3c126e 100644 --- a/lib/des/rand.h +++ b/lib/des/rand.h @@ -1,3 +1,4 @@ + /* * Copyright (c) 2006 Kungliga Tekniska Högskolan * (Royal Institute of Technology, Stockholm, Sweden). @@ -39,16 +40,53 @@ #define _HEIM_RAND_H 1 #include +#include /* symbol renaming */ #define RAND_bytes hc_RAND_bytes #define RAND_pseudo_bytes hc_RAND_pseudo_bytes +#define RAND_seed hc_RAND_seed +#define RAND_set_rand_method hc_RAND_set_rand_method +#define RAND_get_rand_method hc_RAND_get_rand_method +#define RAND_set_rand_engine hc_RAND_set_rand_engine +#define RAND_load_file hc_RAND_load_file +#define RAND_write_file hc_RAND_write_file +#define RAND_status hc_RAND_status +#define RAND_egd hc_RAND_egd /* * */ -int RAND_bytes(void *, size_t num); -int RAND_pseudo_bytes(void *, size_t); +typedef struct RAND_METHOD RAND_METHOD; + +struct RAND_METHOD +{ + void (*seed)(const void *, int); + int (*bytes)(unsigned char *, int); + void (*cleanup)(void); + void (*add)(const void *, int, double); + int (*pseudorand)(unsigned char *, int); + int (*status)(void); +}; + +/* + * + */ + +int RAND_bytes(void *, size_t num); +int RAND_pseudo_bytes(void *, size_t); +void RAND_seed(const void *, size_t); + +int RAND_set_rand_method(const RAND_METHOD *); +const RAND_METHOD * + RAND_get_rand_method(void); +int RAND_set_rand_engine(ENGINE *); + +int RAND_load_file(const char *, size_t); +int RAND_write_file(const char *); +int RAND_status(void); +int RAND_egd(const char *); + #endif /* _HEIM_RAND_H */