RT3065: ec_private_key_dont_crash

This change saves several EC routines from crashing when an EC_KEY is
missing a public key. The public key is optional in the EC private key
format and, without this patch, running the following through `openssl
ec` causes a crash:

-----BEGIN EC PRIVATE KEY-----
MBkCAQEECAECAwQFBgcIoAoGCCqGSM49AwEH
-----END EC PRIVATE KEY-----

Reviewed-by: Dr Stephen Henson <steve@openssl.org>
(cherry picked from commit b391570bdeb386d4fd325917c248d593d3c43930)
This commit is contained in:
Adam Langley 2013-04-23 15:12:36 -04:00 committed by Emilia Kasper
parent dc5c3d7370
commit 1f2b943254
2 changed files with 10 additions and 7 deletions

View file

@ -457,14 +457,16 @@ static int do_EC_KEY_print(BIO *bp, const EC_KEY *x, int off, int ktype)
if (ktype > 0) if (ktype > 0)
{ {
public_key = EC_KEY_get0_public_key(x); public_key = EC_KEY_get0_public_key(x);
if ((pub_key = EC_POINT_point2bn(group, public_key, if (public_key != NULL)
EC_KEY_get_conv_form(x), NULL, ctx)) == NULL)
{ {
reason = ERR_R_EC_LIB; if ((pub_key = EC_POINT_point2bn(group, public_key,
goto err; EC_KEY_get_conv_form(x), NULL, ctx)) == NULL)
} {
if (pub_key) reason = ERR_R_EC_LIB;
goto err;
}
buf_len = (size_t)BN_num_bytes(pub_key); buf_len = (size_t)BN_num_bytes(pub_key);
}
} }
if (ktype == 2) if (ktype == 2)

View file

@ -1230,7 +1230,8 @@ int i2d_ECPrivateKey(EC_KEY *a, unsigned char **out)
size_t buf_len=0, tmp_len; size_t buf_len=0, tmp_len;
EC_PRIVATEKEY *priv_key=NULL; EC_PRIVATEKEY *priv_key=NULL;
if (a == NULL || a->group == NULL || a->priv_key == NULL) if (a == NULL || a->group == NULL || a->priv_key == NULL ||
(!(a->enc_flag & EC_PKEY_NO_PUBKEY) && a->pub_key == NULL))
{ {
ECerr(EC_F_I2D_ECPRIVATEKEY, ECerr(EC_F_I2D_ECPRIVATEKEY,
ERR_R_PASSED_NULL_PARAMETER); ERR_R_PASSED_NULL_PARAMETER);