diff options
Diffstat (limited to 'src/lib/libcrypto/dh/dh_lib.c')
-rw-r--r-- | src/lib/libcrypto/dh/dh_lib.c | 72 |
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); | |||
122 | DH * | 122 | DH * |
123 | DH_new_method(ENGINE *engine) | 123 | DH_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 | } |
181 | LCRYPTO_ALIAS(DH_new_method); | 167 | LCRYPTO_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); |