mirror of
https://github.com/openssl/openssl.git
synced 2024-12-13 03:53:44 +08:00
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 <viktor@openssl.org>
This commit is contained in:
parent
d911097d7c
commit
2986ecdc08
@ -507,6 +507,11 @@ DH *DHparams_dup(DH *dh)
|
|||||||
|
|
||||||
static int dh_copy_parameters(EVP_PKEY *to, const EVP_PKEY *from)
|
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,
|
return int_dh_param_copy(to->pkey.dh, from->pkey.dh,
|
||||||
from->ameth == &dhx_asn1_meth);
|
from->ameth == &dhx_asn1_meth);
|
||||||
}
|
}
|
||||||
|
@ -364,6 +364,12 @@ static int dsa_copy_parameters(EVP_PKEY *to, const EVP_PKEY *from)
|
|||||||
{
|
{
|
||||||
BIGNUM *a;
|
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)
|
if ((a = BN_dup(from->pkey.dsa->p)) == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
BN_free(to->pkey.dsa->p);
|
BN_free(to->pkey.dsa->p);
|
||||||
|
@ -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));
|
EC_GROUP *group = EC_GROUP_dup(EC_KEY_get0_group(from->pkey.ec));
|
||||||
if (group == NULL)
|
if (group == NULL)
|
||||||
return 0;
|
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)
|
if (EC_KEY_set_group(to->pkey.ec, group) == 0)
|
||||||
return 0;
|
return 0;
|
||||||
EC_GROUP_free(group);
|
EC_GROUP_free(group);
|
||||||
|
@ -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)
|
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);
|
EVPerr(EVP_F_EVP_PKEY_COPY_PARAMETERS, EVP_R_DIFFERENT_KEY_TYPES);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user