diff options
Diffstat (limited to 'lib/libssl/src/crypto/rand/rand_lib.c')
-rw-r--r-- | lib/libssl/src/crypto/rand/rand_lib.c | 82 |
1 files changed, 56 insertions, 26 deletions
diff --git a/lib/libssl/src/crypto/rand/rand_lib.c b/lib/libssl/src/crypto/rand/rand_lib.c index 57eff0f1329..5cf5dc11886 100644 --- a/lib/libssl/src/crypto/rand/rand_lib.c +++ b/lib/libssl/src/crypto/rand/rand_lib.c @@ -58,62 +58,92 @@ #include <stdio.h> #include <time.h> +#include "cryptlib.h" #include <openssl/rand.h> #include <openssl/engine.h> -static ENGINE *rand_engine=NULL; +/* non-NULL if default_RAND_meth is ENGINE-provided */ +static ENGINE *funct_ref =NULL; +static const RAND_METHOD *default_RAND_meth = NULL; -#if 0 -void RAND_set_rand_method(RAND_METHOD *meth) +int RAND_set_rand_method(const RAND_METHOD *meth) { - rand_meth=meth; + if(funct_ref) + { + ENGINE_finish(funct_ref); + funct_ref = NULL; + } + default_RAND_meth = meth; + return 1; } -#else -int RAND_set_rand_method(ENGINE *engine) + +const RAND_METHOD *RAND_get_rand_method(void) { - ENGINE *mtmp; - mtmp = rand_engine; - if (!ENGINE_init(engine)) - return 0; - rand_engine = engine; - /* SHOULD ERROR CHECK THIS!!! */ - ENGINE_finish(mtmp); - return 1; + if (!default_RAND_meth) + { + ENGINE *e = ENGINE_get_default_RAND(); + if(e) + { + default_RAND_meth = ENGINE_get_RAND(e); + if(!default_RAND_meth) + { + ENGINE_finish(e); + e = NULL; + } + } + if(e) + funct_ref = e; + else + default_RAND_meth = RAND_SSLeay(); + } + return default_RAND_meth; } -#endif -RAND_METHOD *RAND_get_rand_method(void) +int RAND_set_rand_engine(ENGINE *engine) { - if (rand_engine == NULL - && (rand_engine = ENGINE_get_default_RAND()) == NULL) - return NULL; - return ENGINE_get_RAND(rand_engine); + const RAND_METHOD *tmp_meth = NULL; + if(engine) + { + if(!ENGINE_init(engine)) + return 0; + tmp_meth = ENGINE_get_RAND(engine); + if(!tmp_meth) + { + ENGINE_finish(engine); + return 0; + } + } + /* This function releases any prior ENGINE so call it first */ + RAND_set_rand_method(tmp_meth); + funct_ref = engine; + return 1; } void RAND_cleanup(void) { - RAND_METHOD *meth = RAND_get_rand_method(); + const RAND_METHOD *meth = RAND_get_rand_method(); if (meth && meth->cleanup) meth->cleanup(); + RAND_set_rand_method(NULL); } void RAND_seed(const void *buf, int num) { - RAND_METHOD *meth = RAND_get_rand_method(); + const RAND_METHOD *meth = RAND_get_rand_method(); if (meth && meth->seed) meth->seed(buf,num); } void RAND_add(const void *buf, int num, double entropy) { - RAND_METHOD *meth = RAND_get_rand_method(); + const RAND_METHOD *meth = RAND_get_rand_method(); if (meth && meth->add) meth->add(buf,num,entropy); } int RAND_bytes(unsigned char *buf, int num) { - RAND_METHOD *meth = RAND_get_rand_method(); + const RAND_METHOD *meth = RAND_get_rand_method(); if (meth && meth->bytes) return meth->bytes(buf,num); return(-1); @@ -121,7 +151,7 @@ int RAND_bytes(unsigned char *buf, int num) int RAND_pseudo_bytes(unsigned char *buf, int num) { - RAND_METHOD *meth = RAND_get_rand_method(); + const RAND_METHOD *meth = RAND_get_rand_method(); if (meth && meth->pseudorand) return meth->pseudorand(buf,num); return(-1); @@ -129,7 +159,7 @@ int RAND_pseudo_bytes(unsigned char *buf, int num) int RAND_status(void) { - RAND_METHOD *meth = RAND_get_rand_method(); + const RAND_METHOD *meth = RAND_get_rand_method(); if (meth && meth->status) return meth->status(); return 0; |