diff options
author | Geoff Thorpe <geoff@openssl.org> | 2001-09-25 20:23:40 +0000 |
---|---|---|
committer | Geoff Thorpe <geoff@openssl.org> | 2001-09-25 20:23:40 +0000 |
commit | cb78486d97328121add07df466b7578076650a90 (patch) | |
tree | 44de53e7516cf07786dcfaa9add109319fad16ac /crypto/rand | |
parent | 9c9aa4f145588500cd2d734d1901a31039f145b9 (diff) |
This commits changes to various parts of libcrypto required by the recent
ENGINE surgery. DH, DSA, RAND, and RSA now use *both* "method" and ENGINE
pointers to manage their hooking with ENGINE. Previously their use of
"method" pointers was replaced by use of ENGINE references. See
crypto/engine/README for details.
Also, remove the ENGINE iterations from evp_test - even when the
cipher/digest code is committed in, this functionality would require a
different set of API calls.
Diffstat (limited to 'crypto/rand')
-rw-r--r-- | crypto/rand/rand.h | 8 | ||||
-rw-r--r-- | crypto/rand/rand_lib.c | 69 |
2 files changed, 51 insertions, 26 deletions
diff --git a/crypto/rand/rand.h b/crypto/rand/rand.h index 0bfccac18f..30e39c3545 100644 --- a/crypto/rand/rand.h +++ b/crypto/rand/rand.h @@ -60,6 +60,7 @@ #define HEADER_RAND_H #include <stdlib.h> +#include <openssl/types.h> #ifdef __cplusplus extern "C" { @@ -79,10 +80,9 @@ typedef struct rand_meth_st extern int rand_predictable; #endif -struct engine_st; - -int RAND_set_rand_method(struct engine_st *meth); -const RAND_METHOD *RAND_get_rand_method(void ); +int RAND_set_rand_method(const RAND_METHOD *meth); +const RAND_METHOD *RAND_get_rand_method(void); +int RAND_set_rand_engine(ENGINE *engine); RAND_METHOD *RAND_SSLeay(void); void RAND_cleanup(void ); int RAND_bytes(unsigned char *buf,int num); diff --git a/crypto/rand/rand_lib.c b/crypto/rand/rand_lib.c index adbae32ce3..5cf5dc1188 100644 --- a/crypto/rand/rand_lib.c +++ b/crypto/rand/rand_lib.c @@ -62,37 +62,61 @@ #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; - } -#else -int RAND_set_rand_method(ENGINE *engine) - { - ENGINE *mtmp; - mtmp = rand_engine; - if (engine && !ENGINE_init(engine)) - return 0; - rand_engine = engine; - /* SHOULD ERROR CHECK THIS!!! */ - if(mtmp) - ENGINE_finish(mtmp); + if(funct_ref) + { + ENGINE_finish(funct_ref); + funct_ref = NULL; + } + default_RAND_meth = meth; return 1; } -#endif const RAND_METHOD *RAND_get_rand_method(void) { - if (rand_engine == NULL - && (rand_engine = ENGINE_get_default_RAND()) == NULL) + 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; + } + +int RAND_set_rand_engine(ENGINE *engine) + { + const RAND_METHOD *tmp_meth = NULL; + if(engine) { - RANDerr(RAND_F_RAND_GET_RAND_METHOD,ERR_LIB_ENGINE); - return NULL; + if(!ENGINE_init(engine)) + return 0; + tmp_meth = ENGINE_get_RAND(engine); + if(!tmp_meth) + { + ENGINE_finish(engine); + return 0; + } } - return ENGINE_get_RAND(rand_engine); + /* 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) @@ -100,6 +124,7 @@ void RAND_cleanup(void) 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) |