summaryrefslogtreecommitdiffstats
path: root/crypto/dh
diff options
context:
space:
mode:
authorDr. Stephen Henson <steve@openssl.org>2002-03-09 18:25:03 +0000
committerDr. Stephen Henson <steve@openssl.org>2002-03-09 18:25:03 +0000
commit0c372b94f77bebed947b6a5d217a141a3259b3ed (patch)
tree11484ae0861431320e02ea15ed47b2620b91abd5 /crypto/dh
parent26e123738028da5e767cbf7e71c6af114cab6ec3 (diff)
Make {RSA,DSA,DH}_new_method obtain and release an ENGINE
functional reference in all cases.
Diffstat (limited to 'crypto/dh')
-rw-r--r--crypto/dh/dh.h2
-rw-r--r--crypto/dh/dh_err.c2
-rw-r--r--crypto/dh/dh_lib.c19
3 files changed, 17 insertions, 6 deletions
diff --git a/crypto/dh/dh.h b/crypto/dh/dh.h
index 9bc1d319f9..15cf70de0b 100644
--- a/crypto/dh/dh.h
+++ b/crypto/dh/dh.h
@@ -195,7 +195,7 @@ void ERR_load_DH_strings(void);
#define DH_F_DH_COMPUTE_KEY 102
#define DH_F_DH_GENERATE_KEY 103
#define DH_F_DH_GENERATE_PARAMETERS 104
-#define DH_F_DH_NEW 105
+#define DH_F_DH_NEW_METHOD 105
/* Reason codes. */
#define DH_R_NO_PRIVATE_VALUE 100
diff --git a/crypto/dh/dh_err.c b/crypto/dh/dh_err.c
index 86764a3e84..225779336c 100644
--- a/crypto/dh/dh_err.c
+++ b/crypto/dh/dh_err.c
@@ -71,7 +71,7 @@ static ERR_STRING_DATA DH_str_functs[]=
{ERR_PACK(0,DH_F_DH_COMPUTE_KEY,0), "DH_compute_key"},
{ERR_PACK(0,DH_F_DH_GENERATE_KEY,0), "DH_generate_key"},
{ERR_PACK(0,DH_F_DH_GENERATE_PARAMETERS,0), "DH_generate_parameters"},
-{ERR_PACK(0,DH_F_DH_NEW,0), "DH_new"},
+{ERR_PACK(0,DH_F_DH_NEW_METHOD,0), "DH_new_method"},
{0,NULL}
};
diff --git a/crypto/dh/dh_lib.c b/crypto/dh/dh_lib.c
index 367c19dfe9..7adf48e6a2 100644
--- a/crypto/dh/dh_lib.c
+++ b/crypto/dh/dh_lib.c
@@ -107,20 +107,29 @@ DH *DH_new_method(ENGINE *engine)
ret=(DH *)OPENSSL_malloc(sizeof(DH));
if (ret == NULL)
{
- DHerr(DH_F_DH_NEW,ERR_R_MALLOC_FAILURE);
+ DHerr(DH_F_DH_NEW_METHOD,ERR_R_MALLOC_FAILURE);
return(NULL);
}
ret->meth = DH_get_default_method();
- ret->engine = engine;
- if(!ret->engine)
+ if (engine)
+ {
+ if (!ENGINE_init(engine))
+ {
+ DSAerr(DH_F_DH_NEW_METHOD, ERR_R_ENGINE_LIB);
+ OPENSSL_free(ret);
+ return NULL;
+ }
+ ret->engine = engine;
+ }
+ else
ret->engine = ENGINE_get_default_DH();
if(ret->engine)
{
ret->meth = ENGINE_get_DH(ret->engine);
if(!ret->meth)
{
- DHerr(DH_F_DH_NEW,ERR_R_ENGINE_LIB);
+ DHerr(DH_F_DH_NEW_METHOD,ERR_R_ENGINE_LIB);
ENGINE_finish(ret->engine);
OPENSSL_free(ret);
return NULL;
@@ -145,6 +154,8 @@ DH *DH_new_method(ENGINE *engine)
CRYPTO_new_ex_data(CRYPTO_EX_INDEX_DH, ret, &ret->ex_data);
if ((ret->meth->init != NULL) && !ret->meth->init(ret))
{
+ if (ret->engine)
+ ENGINE_finish(ret->engine);
CRYPTO_free_ex_data(CRYPTO_EX_INDEX_DH, ret, &ret->ex_data);
OPENSSL_free(ret);
ret=NULL;