Enhance DH dup functions.

Make DHparams_dup work properly with X9.42 DH parameters.
This commit is contained in:
Dr. Stephen Henson 2013-07-20 21:25:50 +01:00
parent c9577ab5ea
commit d3cc91eee2
2 changed files with 62 additions and 24 deletions

View file

@ -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)

View file

@ -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.
*/