summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/dh/dh_lib.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/dh/dh_lib.c')
-rw-r--r--src/lib/libcrypto/dh/dh_lib.c72
1 files changed, 29 insertions, 43 deletions
diff --git a/src/lib/libcrypto/dh/dh_lib.c b/src/lib/libcrypto/dh/dh_lib.c
index 987f0b1f7a..6e53df9177 100644
--- a/src/lib/libcrypto/dh/dh_lib.c
+++ b/src/lib/libcrypto/dh/dh_lib.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: dh_lib.c,v 1.39 2023/07/08 15:29:03 beck Exp $ */ 1/* $OpenBSD: dh_lib.c,v 1.40 2023/08/12 06:14:36 tb Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -122,61 +122,47 @@ LCRYPTO_ALIAS(DH_new);
122DH * 122DH *
123DH_new_method(ENGINE *engine) 123DH_new_method(ENGINE *engine)
124{ 124{
125 DH *ret; 125 DH *dh;
126 126
127 ret = malloc(sizeof(DH)); 127 if ((dh = calloc(1, sizeof(*dh))) == NULL) {
128 if (ret == NULL) {
129 DHerror(ERR_R_MALLOC_FAILURE); 128 DHerror(ERR_R_MALLOC_FAILURE);
130 return NULL; 129 goto err;
131 } 130 }
132 131
133 ret->meth = DH_get_default_method(); 132 dh->meth = DH_get_default_method();
133 dh->flags = dh->meth->flags & ~DH_FLAG_NON_FIPS_ALLOW;
134 dh->references = 1;
135
134#ifndef OPENSSL_NO_ENGINE 136#ifndef OPENSSL_NO_ENGINE
135 if (engine) { 137 if (engine != NULL) {
136 if (!ENGINE_init(engine)) { 138 if (!ENGINE_init(engine)) {
137 DHerror(ERR_R_ENGINE_LIB); 139 DHerror(ERR_R_ENGINE_LIB);
138 free(ret); 140 goto err;
139 return NULL;
140 } 141 }
141 ret->engine = engine; 142 dh->engine = engine;
142 } else 143 } else
143 ret->engine = ENGINE_get_default_DH(); 144 dh->engine = ENGINE_get_default_DH();
144 if(ret->engine) { 145 if (dh->engine != NULL) {
145 ret->meth = ENGINE_get_DH(ret->engine); 146 if ((dh->meth = ENGINE_get_DH(dh->engine)) == NULL) {
146 if (ret->meth == NULL) {
147 DHerror(ERR_R_ENGINE_LIB); 147 DHerror(ERR_R_ENGINE_LIB);
148 ENGINE_finish(ret->engine); 148 goto err;
149 free(ret);
150 return NULL;
151 } 149 }
150 dh->flags = dh->meth->flags & ~DH_FLAG_NON_FIPS_ALLOW;
152 } 151 }
153#endif 152#endif
154 153
155 ret->pad = 0; 154 if (!CRYPTO_new_ex_data(CRYPTO_EX_INDEX_DH, dh, &dh->ex_data))
156 ret->version = 0; 155 goto err;
157 ret->p = NULL; 156
158 ret->g = NULL; 157 if (dh->meth->init != NULL && !dh->meth->init(dh))
159 ret->length = 0; 158 goto err;
160 ret->pub_key = NULL; 159
161 ret->priv_key = NULL; 160 return dh;
162 ret->q = NULL; 161
163 ret->j = NULL; 162 err:
164 ret->seed = NULL; 163 DH_free(dh);
165 ret->seedlen = 0; 164
166 ret->counter = NULL; 165 return NULL;
167 ret->method_mont_p=NULL;
168 ret->references = 1;
169 ret->flags = ret->meth->flags & ~DH_FLAG_NON_FIPS_ALLOW;
170 CRYPTO_new_ex_data(CRYPTO_EX_INDEX_DH, ret, &ret->ex_data);
171 if (ret->meth->init != NULL && !ret->meth->init(ret)) {
172#ifndef OPENSSL_NO_ENGINE
173 ENGINE_finish(ret->engine);
174#endif
175 CRYPTO_free_ex_data(CRYPTO_EX_INDEX_DH, ret, &ret->ex_data);
176 free(ret);
177 ret = NULL;
178 }
179 return ret;
180} 166}
181LCRYPTO_ALIAS(DH_new_method); 167LCRYPTO_ALIAS(DH_new_method);
182 168
@@ -191,7 +177,7 @@ DH_free(DH *r)
191 if (i > 0) 177 if (i > 0)
192 return; 178 return;
193 179
194 if (r->meth->finish) 180 if (r->meth != NULL && r->meth->finish != NULL)
195 r->meth->finish(r); 181 r->meth->finish(r);
196#ifndef OPENSSL_NO_ENGINE 182#ifndef OPENSSL_NO_ENGINE
197 ENGINE_finish(r->engine); 183 ENGINE_finish(r->engine);