Enhance DH dup functions.
Make DHparams_dup work properly with X9.42 DH parameters.
This commit is contained in:
parent
c9577ab5ea
commit
d3cc91eee2
2 changed files with 62 additions and 24 deletions
|
@ -458,34 +458,77 @@ static int dh_cmp_parameters(const EVP_PKEY *a, const EVP_PKEY *b)
|
|||
return 1;
|
||||
}
|
||||
|
||||
static int dh_copy_parameters(EVP_PKEY *to, const EVP_PKEY *from)
|
||||
static int int_dh_bn_cpy(BIGNUM **dst, const BIGNUM *src)
|
||||
{
|
||||
BIGNUM *a;
|
||||
|
||||
if ((a=BN_dup(from->pkey.dh->p)) == NULL)
|
||||
return 0;
|
||||
if (to->pkey.dh->p != NULL)
|
||||
BN_free(to->pkey.dh->p);
|
||||
to->pkey.dh->p=a;
|
||||
|
||||
if ((a=BN_dup(from->pkey.dh->g)) == NULL)
|
||||
return 0;
|
||||
if (to->pkey.dh->g != NULL)
|
||||
BN_free(to->pkey.dh->g);
|
||||
to->pkey.dh->g=a;
|
||||
if (from->ameth == &dhx_asn1_meth)
|
||||
if (src)
|
||||
{
|
||||
a = BN_dup(from->pkey.dh->q);
|
||||
a = BN_dup(src);
|
||||
if (!a)
|
||||
return 0;
|
||||
if (to->pkey.dh->q)
|
||||
BN_free(to->pkey.dh->q);
|
||||
to->pkey.dh->q = a;
|
||||
}
|
||||
|
||||
else
|
||||
a = NULL;
|
||||
if (*dst)
|
||||
BN_free(*dst);
|
||||
*dst = a;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int int_dh_param_copy(DH *to, const DH *from, int is_x942)
|
||||
{
|
||||
if (is_x942 == -1)
|
||||
is_x942 = !!from->q;
|
||||
if (!int_dh_bn_cpy(&to->p, from->p))
|
||||
return 0;
|
||||
if (!int_dh_bn_cpy(&to->g, from->g))
|
||||
return 0;
|
||||
if (is_x942)
|
||||
{
|
||||
if (!int_dh_bn_cpy(&to->q, from->q))
|
||||
return 0;
|
||||
if (!int_dh_bn_cpy(&to->j, from->j))
|
||||
return 0;
|
||||
if(to->seed)
|
||||
{
|
||||
OPENSSL_free(to->seed);
|
||||
to->seed = NULL;
|
||||
to->seedlen = 0;
|
||||
}
|
||||
if (from->seed)
|
||||
{
|
||||
to->seed = BUF_memdup(from->seed, from->seedlen);
|
||||
if (!to->seed)
|
||||
return 0;
|
||||
to->seedlen = from->seedlen;
|
||||
}
|
||||
}
|
||||
else
|
||||
to->length = from->length;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
DH *DHparams_dup(DH *dh)
|
||||
{
|
||||
DH *ret;
|
||||
ret = DH_new();
|
||||
if (!ret)
|
||||
return NULL;
|
||||
if (!int_dh_param_copy(ret, dh, -1))
|
||||
{
|
||||
DH_free(ret);
|
||||
return NULL;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int dh_copy_parameters(EVP_PKEY *to, const EVP_PKEY *from)
|
||||
{
|
||||
return int_dh_param_copy(to->pkey.dh, from->pkey.dh,
|
||||
from->ameth == &dhx_asn1_meth);
|
||||
}
|
||||
|
||||
static int dh_missing_parameters(const EVP_PKEY *a)
|
||||
{
|
||||
if (!a->pkey.dh->p || !a->pkey.dh->g)
|
||||
|
|
|
@ -87,11 +87,6 @@ ASN1_SEQUENCE_cb(DHparams, dh_cb) = {
|
|||
|
||||
IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(DH, DHparams, DHparams)
|
||||
|
||||
DH *DHparams_dup(DH *dh)
|
||||
{
|
||||
return ASN1_item_dup(ASN1_ITEM_rptr(DHparams), dh);
|
||||
}
|
||||
|
||||
/* Internal only structures for handling X9.42 DH: this gets translated
|
||||
* to or from a DH structure straight away.
|
||||
*/
|
||||
|
|
Loading…
Reference in a new issue