Commit 31360957 authored by Dr. Stephen Henson's avatar Dr. Stephen Henson
Browse files

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.
parent d80399a3
Loading
Loading
Loading
Loading
+15 −2
Original line number Diff line number Diff line
@@ -166,9 +166,22 @@ 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 (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;
			}
		}

	{
		BIGNUM local_prk;
+6 −1
Original line number Diff line number Diff line
@@ -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;