summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/ec/ec_key.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/lib/libcrypto/ec/ec_key.c28
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
209int 209int
210EC_KEY_generate_key(EC_KEY * eckey) 210EC_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);