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.
This commit is contained in:
parent
d80399a357
commit
31360957fb
2 changed files with 21 additions and 3 deletions
|
@ -166,8 +166,21 @@ static int generate_key(DH *dh)
|
|||
|
||||
if (generate_new_key)
|
||||
{
|
||||
l = dh->length ? dh->length : BN_num_bits(dh->p)-1; /* secret exponent length */
|
||||
if (!BN_rand(priv_key, l, 0, 0)) goto err;
|
||||
if (dh->q)
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
|
|
|
@ -276,7 +276,8 @@ void *DSA_get_ex_data(DSA *d, int idx)
|
|||
DH *DSA_dup_DH(const DSA *r)
|
||||
{
|
||||
/* 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;
|
||||
|
@ -290,7 +291,11 @@ DH *DSA_dup_DH(const DSA *r)
|
|||
if ((ret->p = BN_dup(r->p)) == NULL)
|
||||
goto err;
|
||||
if (r->q != NULL)
|
||||
{
|
||||
ret->length = BN_num_bits(r->q);
|
||||
if ((ret->q = BN_dup(r->q)) == NULL)
|
||||
goto err;
|
||||
}
|
||||
if (r->g != NULL)
|
||||
if ((ret->g = BN_dup(r->g)) == NULL)
|
||||
goto err;
|
||||
|
|
Loading…
Reference in a new issue