diff options
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/libcrypto/ec/ec_ameth.c | 14 | ||||
-rw-r--r-- | src/lib/libcrypto/ec/ec_asn1.c | 28 |
2 files changed, 27 insertions, 15 deletions
diff --git a/src/lib/libcrypto/ec/ec_ameth.c b/src/lib/libcrypto/ec/ec_ameth.c index 8d0cdb733b..0932f1e3c9 100644 --- a/src/lib/libcrypto/ec/ec_ameth.c +++ b/src/lib/libcrypto/ec/ec_ameth.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ec_ameth.c,v 1.18 2017/01/29 17:49:23 beck Exp $ */ | 1 | /* $OpenBSD: ec_ameth.c,v 1.19 2018/03/12 13:14:21 inoguchi Exp $ */ |
2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
3 | * project 2006. | 3 | * project 2006. |
4 | */ | 4 | */ |
@@ -433,13 +433,15 @@ do_EC_KEY_print(BIO * bp, const EC_KEY * x, int off, int ktype) | |||
433 | } | 433 | } |
434 | if (ktype > 0) { | 434 | if (ktype > 0) { |
435 | public_key = EC_KEY_get0_public_key(x); | 435 | public_key = EC_KEY_get0_public_key(x); |
436 | if ((pub_key = EC_POINT_point2bn(group, public_key, | 436 | if (public_key != NULL) { |
437 | if ((pub_key = EC_POINT_point2bn(group, public_key, | ||
437 | EC_KEY_get_conv_form(x), NULL, ctx)) == NULL) { | 438 | EC_KEY_get_conv_form(x), NULL, ctx)) == NULL) { |
438 | reason = ERR_R_EC_LIB; | 439 | reason = ERR_R_EC_LIB; |
439 | goto err; | 440 | goto err; |
441 | } | ||
442 | if (pub_key) | ||
443 | buf_len = (size_t) BN_num_bytes(pub_key); | ||
440 | } | 444 | } |
441 | if (pub_key) | ||
442 | buf_len = (size_t) BN_num_bytes(pub_key); | ||
443 | } | 445 | } |
444 | if (ktype == 2) { | 446 | if (ktype == 2) { |
445 | priv_key = EC_KEY_get0_private_key(x); | 447 | priv_key = EC_KEY_get0_private_key(x); |
diff --git a/src/lib/libcrypto/ec/ec_asn1.c b/src/lib/libcrypto/ec/ec_asn1.c index b64b7e14d3..381addfcf6 100644 --- a/src/lib/libcrypto/ec/ec_asn1.c +++ b/src/lib/libcrypto/ec/ec_asn1.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ec_asn1.c,v 1.24 2017/05/26 16:32:14 jsing Exp $ */ | 1 | /* $OpenBSD: ec_asn1.c,v 1.25 2018/03/12 13:14:21 inoguchi Exp $ */ |
2 | /* | 2 | /* |
3 | * Written by Nils Larsch for the OpenSSL project. | 3 | * Written by Nils Larsch for the OpenSSL project. |
4 | */ | 4 | */ |
@@ -1380,17 +1380,18 @@ d2i_ECPrivateKey(EC_KEY ** a, const unsigned char **in, long len) | |||
1380 | goto err; | 1380 | goto err; |
1381 | } | 1381 | } |
1382 | 1382 | ||
1383 | if (ret->pub_key) | ||
1384 | EC_POINT_clear_free(ret->pub_key); | ||
1385 | ret->pub_key = EC_POINT_new(ret->group); | ||
1386 | if (ret->pub_key == NULL) { | ||
1387 | ECerror(ERR_R_EC_LIB); | ||
1388 | goto err; | ||
1389 | } | ||
1390 | |||
1383 | if (priv_key->publicKey) { | 1391 | if (priv_key->publicKey) { |
1384 | const unsigned char *pub_oct; | 1392 | const unsigned char *pub_oct; |
1385 | size_t pub_oct_len; | 1393 | size_t pub_oct_len; |
1386 | 1394 | ||
1387 | EC_POINT_clear_free(ret->pub_key); | ||
1388 | ret->pub_key = EC_POINT_new(ret->group); | ||
1389 | if (ret->pub_key == NULL) { | ||
1390 | ECerror(ERR_R_EC_LIB); | ||
1391 | goto err; | ||
1392 | } | ||
1393 | |||
1394 | pub_oct = ASN1_STRING_data(priv_key->publicKey); | 1395 | pub_oct = ASN1_STRING_data(priv_key->publicKey); |
1395 | pub_oct_len = ASN1_STRING_length(priv_key->publicKey); | 1396 | pub_oct_len = ASN1_STRING_length(priv_key->publicKey); |
1396 | if (pub_oct == NULL || pub_oct_len <= 0) { | 1397 | if (pub_oct == NULL || pub_oct_len <= 0) { |
@@ -1405,6 +1406,14 @@ d2i_ECPrivateKey(EC_KEY ** a, const unsigned char **in, long len) | |||
1405 | ECerror(ERR_R_EC_LIB); | 1406 | ECerror(ERR_R_EC_LIB); |
1406 | goto err; | 1407 | goto err; |
1407 | } | 1408 | } |
1409 | } else { | ||
1410 | if (!EC_POINT_mul(ret->group, ret->pub_key, ret->priv_key, | ||
1411 | NULL, NULL, NULL)) { | ||
1412 | ECerror(ERR_R_EC_LIB); | ||
1413 | goto err; | ||
1414 | } | ||
1415 | /* Remember the original private-key-only encoding. */ | ||
1416 | ret->enc_flag |= EC_PKEY_NO_PUBKEY; | ||
1408 | } | 1417 | } |
1409 | 1418 | ||
1410 | EC_PRIVATEKEY_free(priv_key); | 1419 | EC_PRIVATEKEY_free(priv_key); |
@@ -1429,7 +1438,8 @@ i2d_ECPrivateKey(EC_KEY * a, unsigned char **out) | |||
1429 | size_t buf_len = 0, tmp_len; | 1438 | size_t buf_len = 0, tmp_len; |
1430 | EC_PRIVATEKEY *priv_key = NULL; | 1439 | EC_PRIVATEKEY *priv_key = NULL; |
1431 | 1440 | ||
1432 | if (a == NULL || a->group == NULL || a->priv_key == NULL) { | 1441 | if (a == NULL || a->group == NULL || a->priv_key == NULL || |
1442 | (!(a->enc_flag & EC_PKEY_NO_PUBKEY) && a->pub_key == NULL)) { | ||
1433 | ECerror(ERR_R_PASSED_NULL_PARAMETER); | 1443 | ECerror(ERR_R_PASSED_NULL_PARAMETER); |
1434 | goto err; | 1444 | goto err; |
1435 | } | 1445 | } |