From 2986ecdc08016de978f1134315623778420b51e5 Mon Sep 17 00:00:00 2001 From: "Dr. Stephen Henson" Date: Sun, 13 Dec 2015 17:28:40 +0000 Subject: [PATCH] Extend EVP_PKEY_copy_parameters() Make EVP_PKEY_copy_parameters() work if the destination has no type (e.g. if obtained from EVP_PKEY_new()) or the underlying key is NULL. This is useful where we want to copy the parameters from an existing key to a new key. Reviewed-by: Viktor Dukhovni --- crypto/dh/dh_ameth.c | 5 +++++ crypto/dsa/dsa_ameth.c | 6 ++++++ crypto/ec/ec_ameth.c | 5 +++++ crypto/evp/p_lib.c | 5 ++++- 4 files changed, 20 insertions(+), 1 deletion(-) diff --git a/crypto/dh/dh_ameth.c b/crypto/dh/dh_ameth.c index 43cba87a1e..7a3d9235cf 100644 --- a/crypto/dh/dh_ameth.c +++ b/crypto/dh/dh_ameth.c @@ -507,6 +507,11 @@ DH *DHparams_dup(DH *dh) static int dh_copy_parameters(EVP_PKEY *to, const EVP_PKEY *from) { + if (to->pkey.dh == NULL) { + to->pkey.dh = DH_new(); + if (to->pkey.dh == NULL) + return 0; + } return int_dh_param_copy(to->pkey.dh, from->pkey.dh, from->ameth == &dhx_asn1_meth); } diff --git a/crypto/dsa/dsa_ameth.c b/crypto/dsa/dsa_ameth.c index d1d32c6959..92976bc3d5 100644 --- a/crypto/dsa/dsa_ameth.c +++ b/crypto/dsa/dsa_ameth.c @@ -364,6 +364,12 @@ static int dsa_copy_parameters(EVP_PKEY *to, const EVP_PKEY *from) { BIGNUM *a; + if (to->pkey.dsa == NULL) { + to->pkey.dsa = DSA_new(); + if (to->pkey.dsa == NULL) + return 0; + } + if ((a = BN_dup(from->pkey.dsa->p)) == NULL) return 0; BN_free(to->pkey.dsa->p); diff --git a/crypto/ec/ec_ameth.c b/crypto/ec/ec_ameth.c index 19932d541c..fb07262466 100644 --- a/crypto/ec/ec_ameth.c +++ b/crypto/ec/ec_ameth.c @@ -402,6 +402,11 @@ static int ec_copy_parameters(EVP_PKEY *to, const EVP_PKEY *from) EC_GROUP *group = EC_GROUP_dup(EC_KEY_get0_group(from->pkey.ec)); if (group == NULL) return 0; + if (to->pkey.ec == NULL) { + to->pkey.ec = EC_KEY_new(); + if (to->pkey.ec == NULL) + return 0; + } if (EC_KEY_set_group(to->pkey.ec, group) == 0) return 0; EC_GROUP_free(group); diff --git a/crypto/evp/p_lib.c b/crypto/evp/p_lib.c index f07d7e5e4f..01f8a728be 100644 --- a/crypto/evp/p_lib.c +++ b/crypto/evp/p_lib.c @@ -129,7 +129,10 @@ int EVP_PKEY_save_parameters(EVP_PKEY *pkey, int mode) int EVP_PKEY_copy_parameters(EVP_PKEY *to, const EVP_PKEY *from) { - if (to->type != from->type) { + if (to->type == EVP_PKEY_NONE) { + if (EVP_PKEY_set_type(to, from->type) == 0) + return 0; + } else if (to->type != from->type) { EVPerr(EVP_F_EVP_PKEY_COPY_PARAMETERS, EVP_R_DIFFERENT_KEY_TYPES); goto err; } -- 2.34.1