Pointer to BN_MONT_CTX could be used uninitialized.
[openssl.git] / crypto / dh / dh_key.c
index ad026cb861cc1d2380fd653d8f337c2533a92e3a..9148f179f7d725404a4bc6c85a75c7dfa9fe43bd 100644 (file)
@@ -104,7 +104,7 @@ static int generate_key(DH *dh)
        int generate_new_key=0;
        unsigned l;
        BN_CTX *ctx;
-       BN_MONT_CTX *mont;
+       BN_MONT_CTX *mont=NULL;
        BIGNUM *pub_key=NULL,*priv_key=NULL;
 
        ctx = BN_CTX_new();
@@ -127,13 +127,14 @@ static int generate_key(DH *dh)
        else
                pub_key=dh->pub_key;
 
-       if ((dh->method_mont_p == NULL) && (dh->flags & DH_FLAG_CACHE_MONT_P))
+
+       if (dh->flags & DH_FLAG_CACHE_MONT_P)
                {
-               if ((dh->method_mont_p=(char *)BN_MONT_CTX_new()) != NULL)
-                       if (!BN_MONT_CTX_set((BN_MONT_CTX *)dh->method_mont_p,
-                               dh->p,ctx)) goto err;
+               mont = BN_MONT_CTX_set_locked(&dh->method_mont_p,
+                               CRYPTO_LOCK_DH, dh->p, ctx);
+               if (!mont)
+                       goto err;
                }
-       mont=(BN_MONT_CTX *)dh->method_mont_p;
 
        if (generate_new_key)
                {
@@ -159,7 +160,7 @@ err:
 static int compute_key(unsigned char *key, const BIGNUM *pub_key, DH *dh)
        {
        BN_CTX *ctx;
-       BN_MONT_CTX *mont;
+       BN_MONT_CTX *mont=NULL;
        BIGNUM *tmp;
        int ret= -1;
 
@@ -173,14 +174,15 @@ static int compute_key(unsigned char *key, const BIGNUM *pub_key, DH *dh)
                DHerr(DH_F_COMPUTE_KEY,DH_R_NO_PRIVATE_VALUE);
                goto err;
                }
-       if ((dh->method_mont_p == NULL) && (dh->flags & DH_FLAG_CACHE_MONT_P))
+
+       if (dh->flags & DH_FLAG_CACHE_MONT_P)
                {
-               if ((dh->method_mont_p=(char *)BN_MONT_CTX_new()) != NULL)
-                       if (!BN_MONT_CTX_set((BN_MONT_CTX *)dh->method_mont_p,
-                               dh->p,ctx)) goto err;
+               mont = BN_MONT_CTX_set_locked(&dh->method_mont_p,
+                               CRYPTO_LOCK_DH, dh->p, ctx);
+               if (!mont)
+                       goto err;
                }
 
-       mont=(BN_MONT_CTX *)dh->method_mont_p;
        if (!dh->meth->bn_mod_exp(dh, tmp, pub_key, dh->priv_key,dh->p,ctx,mont))
                {
                DHerr(DH_F_COMPUTE_KEY,ERR_R_BN_LIB);
@@ -218,6 +220,6 @@ static int dh_init(DH *dh)
 static int dh_finish(DH *dh)
        {
        if(dh->method_mont_p)
-               BN_MONT_CTX_free((BN_MONT_CTX *)dh->method_mont_p);
+               BN_MONT_CTX_free(dh->method_mont_p);
        return(1);
        }