diff options
Diffstat (limited to '')
-rw-r--r-- | src/lib/libcrypto/ec/ec_key.c | 28 |
1 files changed, 12 insertions, 16 deletions
diff --git a/src/lib/libcrypto/ec/ec_key.c b/src/lib/libcrypto/ec/ec_key.c index d1b8e8fcc1..966ebab4a5 100644 --- a/src/lib/libcrypto/ec/ec_key.c +++ b/src/lib/libcrypto/ec/ec_key.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ec_key.c,v 1.17 2018/07/15 16:27:39 tb Exp $ */ | 1 | /* $OpenBSD: ec_key.c,v 1.18 2018/11/05 23:50:05 tb Exp $ */ |
2 | /* | 2 | /* |
3 | * Written by Nils Larsch for the OpenSSL project. | 3 | * Written by Nils Larsch for the OpenSSL project. |
4 | */ | 4 | */ |
@@ -207,12 +207,12 @@ EC_KEY_up_ref(EC_KEY * r) | |||
207 | } | 207 | } |
208 | 208 | ||
209 | int | 209 | int |
210 | EC_KEY_generate_key(EC_KEY * eckey) | 210 | EC_KEY_generate_key(EC_KEY *eckey) |
211 | { | 211 | { |
212 | int ok = 0; | 212 | int ok = 0; |
213 | BN_CTX *ctx = NULL; | 213 | BN_CTX *ctx = NULL; |
214 | BIGNUM *priv_key = NULL, *order = NULL; | 214 | BIGNUM *priv_key = eckey->priv_key, *order = NULL; |
215 | EC_POINT *pub_key = NULL; | 215 | EC_POINT *pub_key = eckey->pub_key; |
216 | 216 | ||
217 | if (!eckey || !eckey->group) { | 217 | if (!eckey || !eckey->group) { |
218 | ECerror(ERR_R_PASSED_NULL_PARAMETER); | 218 | ECerror(ERR_R_PASSED_NULL_PARAMETER); |
@@ -223,12 +223,10 @@ EC_KEY_generate_key(EC_KEY * eckey) | |||
223 | if ((ctx = BN_CTX_new()) == NULL) | 223 | if ((ctx = BN_CTX_new()) == NULL) |
224 | goto err; | 224 | goto err; |
225 | 225 | ||
226 | if (eckey->priv_key == NULL) { | 226 | if (priv_key == NULL) { |
227 | priv_key = BN_new(); | 227 | if ((priv_key = BN_new()) == NULL) |
228 | if (priv_key == NULL) | ||
229 | goto err; | 228 | goto err; |
230 | } else | 229 | } |
231 | priv_key = eckey->priv_key; | ||
232 | 230 | ||
233 | if (!EC_GROUP_get_order(eckey->group, order, ctx)) | 231 | if (!EC_GROUP_get_order(eckey->group, order, ctx)) |
234 | goto err; | 232 | goto err; |
@@ -238,12 +236,10 @@ EC_KEY_generate_key(EC_KEY * eckey) | |||
238 | goto err; | 236 | goto err; |
239 | while (BN_is_zero(priv_key)); | 237 | while (BN_is_zero(priv_key)); |
240 | 238 | ||
241 | if (eckey->pub_key == NULL) { | 239 | if (pub_key == NULL) { |
242 | pub_key = EC_POINT_new(eckey->group); | 240 | if ((pub_key = EC_POINT_new(eckey->group)) == NULL) |
243 | if (pub_key == NULL) | ||
244 | goto err; | 241 | goto err; |
245 | } else | 242 | } |
246 | pub_key = eckey->pub_key; | ||
247 | 243 | ||
248 | if (!EC_POINT_mul(eckey->group, pub_key, priv_key, NULL, NULL, ctx)) | 244 | if (!EC_POINT_mul(eckey->group, pub_key, priv_key, NULL, NULL, ctx)) |
249 | goto err; | 245 | goto err; |
@@ -255,9 +251,9 @@ EC_KEY_generate_key(EC_KEY * eckey) | |||
255 | 251 | ||
256 | err: | 252 | err: |
257 | BN_free(order); | 253 | BN_free(order); |
258 | if (pub_key != NULL && eckey->pub_key == NULL) | 254 | if (eckey->pub_key == NULL) |
259 | EC_POINT_free(pub_key); | 255 | EC_POINT_free(pub_key); |
260 | if (priv_key != NULL && eckey->priv_key == NULL) | 256 | if (eckey->priv_key == NULL) |
261 | BN_free(priv_key); | 257 | BN_free(priv_key); |
262 | BN_CTX_free(ctx); | 258 | BN_CTX_free(ctx); |
263 | return (ok); | 259 | return (ok); |