X-Git-Url: https://git.openssl.org/?p=openssl.git;a=blobdiff_plain;f=crypto%2Frand%2Frand_lib.c;h=513e3389859e9f4a504cbd0796d1df3b88315cd7;hp=6bea09211cee76baf85fcac841b88a6fed92018b;hb=6343829a391df59e46e513c84b6264ee71ad9518;hpb=bf5dcd135fb77dc23d8566b6456317a10e806b7d diff --git a/crypto/rand/rand_lib.c b/crypto/rand/rand_lib.c index 6bea09211c..513e338985 100644 --- a/crypto/rand/rand_lib.c +++ b/crypto/rand/rand_lib.c @@ -57,47 +57,120 @@ */ #include -#include #include -#include "rand.h" +#include "cryptlib.h" +#include +#ifndef OPENSSL_NO_ENGINE +#include +#endif + +#ifndef OPENSSL_NO_ENGINE +/* non-NULL if default_RAND_meth is ENGINE-provided */ +static ENGINE *funct_ref =NULL; +#endif +static const RAND_METHOD *default_RAND_meth = NULL; -#ifdef NO_RAND -static RAND_METHOD *rand_meth=NULL; -#else -extern RAND_METHOD rand_ssleay_meth; -static RAND_METHOD *rand_meth= &rand_ssleay_meth; +int RAND_set_rand_method(const RAND_METHOD *meth) + { +#ifndef OPENSSL_NO_ENGINE + if(funct_ref) + { + ENGINE_finish(funct_ref); + funct_ref = NULL; + } #endif + default_RAND_meth = meth; + return 1; + } -void RAND_set_rand_method(meth) -RAND_METHOD *meth; +const RAND_METHOD *RAND_get_rand_method(void) { - rand_meth=meth; + if (!default_RAND_meth) + { +#ifndef OPENSSL_NO_ENGINE + 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 +#endif + default_RAND_meth = RAND_SSLeay(); + } + return default_RAND_meth; } -RAND_METHOD *RAND_get_rand_method() +#ifndef OPENSSL_NO_ENGINE +int RAND_set_rand_engine(ENGINE *engine) { - return(rand_meth); + 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; } +#endif -void RAND_cleanup() +void RAND_cleanup(void) { - if (rand_meth != NULL) - rand_meth->cleanup(); + const RAND_METHOD *meth = RAND_get_rand_method(); + if (meth && meth->cleanup) + meth->cleanup(); + RAND_set_rand_method(NULL); } -void RAND_seed(buf,num) -const void *buf; -int num; +void RAND_seed(const void *buf, int num) { - if (rand_meth != NULL) - rand_meth->seed(buf,num); + const RAND_METHOD *meth = RAND_get_rand_method(); + if (meth && meth->seed) + meth->seed(buf,num); } -void RAND_bytes(buf,num) -unsigned char *buf; -int num; +void RAND_add(const void *buf, int num, double entropy) { - if (rand_meth != NULL) - rand_meth->bytes(buf,num); + 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) + { + const RAND_METHOD *meth = RAND_get_rand_method(); + if (meth && meth->bytes) + return meth->bytes(buf,num); + return(-1); + } + +int RAND_pseudo_bytes(unsigned char *buf, int num) + { + const RAND_METHOD *meth = RAND_get_rand_method(); + if (meth && meth->pseudorand) + return meth->pseudorand(buf,num); + return(-1); + } + +int RAND_status(void) + { + const RAND_METHOD *meth = RAND_get_rand_method(); + if (meth && meth->status) + return meth->status(); + return 0; + }