Commit 10be715b authored by Matt Caswell's avatar Matt Caswell Committed by Emilia Kasper
Browse files

RT3065: automatically generate a missing EC public key



When d2i_ECPrivateKey reads a private key with a missing (optional) public key,
generate one automatically from the group and private key.

Reviewed-by: default avatarDr Stephen Henson <steve@openssl.org>
(cherry picked from commit ed383f847156940e93f256fed78599873a4a9b28)

Conflicts:
	doc/crypto/EC_KEY_new.pod
parent e87a4a70
Loading
Loading
Loading
Loading
+19 −8
Original line number Diff line number Diff line
@@ -1167,11 +1167,6 @@ EC_KEY *d2i_ECPrivateKey(EC_KEY **a, const unsigned char **in, long len)
		goto err;
		}

	if (priv_key->publicKey)
		{
		const unsigned char *pub_oct;
		size_t pub_oct_len;

	if (ret->pub_key)
		EC_POINT_clear_free(ret->pub_key);
	ret->pub_key = EC_POINT_new(ret->group);
@@ -1180,6 +1175,12 @@ EC_KEY *d2i_ECPrivateKey(EC_KEY **a, const unsigned char **in, long len)
		ECerr(EC_F_D2I_ECPRIVATEKEY, ERR_R_EC_LIB);
		goto err;
		}

	if (priv_key->publicKey)
		{
		const unsigned char *pub_oct;
		size_t pub_oct_len;

		pub_oct     = M_ASN1_STRING_data(priv_key->publicKey);
		pub_oct_len = M_ASN1_STRING_length(priv_key->publicKey);
		/* save the point conversion form */
@@ -1191,6 +1192,16 @@ EC_KEY *d2i_ECPrivateKey(EC_KEY **a, const unsigned char **in, long len)
			goto err;
			}
		}
	else
		{
		if (!EC_POINT_mul(ret->group, ret->pub_key, ret->priv_key, NULL, NULL, NULL))
			{
			ECerr(EC_F_D2I_ECPRIVATEKEY, ERR_R_EC_LIB);
			goto err;
			}
		/* Remember the original private-key-only encoding. */
		ret->enc_flag |= EC_PKEY_NO_PUBKEY;
		}

	ok = 1;
err: