DH keys have an (until now) unused 'q' parameter. When creating from DSA copy
q across and if q present generate DH key in the correct range. (from HEAD)
This commit is contained in:
parent
f69e5d6a19
commit
5999d45a5d
@ -154,8 +154,21 @@ static int generate_key(DH *dh)
|
|||||||
|
|
||||||
if (generate_new_key)
|
if (generate_new_key)
|
||||||
{
|
{
|
||||||
l = dh->length ? dh->length : BN_num_bits(dh->p)-1; /* secret exponent length */
|
if (dh->q)
|
||||||
if (!BN_rand(priv_key, l, 0, 0)) goto err;
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (!BN_rand_range(priv_key, dh->q))
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
while (BN_is_zero(priv_key) || BN_is_one(priv_key));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* secret exponent length */
|
||||||
|
l = dh->length ? dh->length : BN_num_bits(dh->p)-1;
|
||||||
|
if (!BN_rand(priv_key, l, 0, 0)) goto err;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -289,7 +289,8 @@ void *DSA_get_ex_data(DSA *d, int idx)
|
|||||||
DH *DSA_dup_DH(const DSA *r)
|
DH *DSA_dup_DH(const DSA *r)
|
||||||
{
|
{
|
||||||
/* DSA has p, q, g, optional pub_key, optional priv_key.
|
/* DSA has p, q, g, optional pub_key, optional priv_key.
|
||||||
* DH has p, optional length, g, optional pub_key, optional priv_key.
|
* DH has p, optional length, g, optional pub_key, optional priv_key,
|
||||||
|
* optional q.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
DH *ret = NULL;
|
DH *ret = NULL;
|
||||||
@ -303,7 +304,11 @@ DH *DSA_dup_DH(const DSA *r)
|
|||||||
if ((ret->p = BN_dup(r->p)) == NULL)
|
if ((ret->p = BN_dup(r->p)) == NULL)
|
||||||
goto err;
|
goto err;
|
||||||
if (r->q != NULL)
|
if (r->q != NULL)
|
||||||
|
{
|
||||||
ret->length = BN_num_bits(r->q);
|
ret->length = BN_num_bits(r->q);
|
||||||
|
if ((ret->q = BN_dup(r->q)) == NULL)
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
if (r->g != NULL)
|
if (r->g != NULL)
|
||||||
if ((ret->g = BN_dup(r->g)) == NULL)
|
if ((ret->g = BN_dup(r->g)) == NULL)
|
||||||
goto err;
|
goto err;
|
||||||
|
Loading…
Reference in New Issue
Block a user