Skip to content

Commit

Permalink
ossl_dh_check_priv_key: Do not fail on private keys without q
Browse files Browse the repository at this point in the history
Fixes #18098

Reviewed-by: Shane Lontis <[email protected]>
Reviewed-by: Paul Dale <[email protected]>
(Merged from openssl/openssl#18099)
  • Loading branch information
dongbeiouba committed Mar 15, 2024
1 parent c0b627e commit 3b4c5ab
Showing 1 changed file with 27 additions and 6 deletions.
33 changes: 27 additions & 6 deletions crypto/dh/dh_check.c
Original file line number Diff line number Diff line change
Expand Up @@ -282,22 +282,43 @@ int ossl_dh_check_priv_key(const DH *dh, const BIGNUM *priv_key, int *ret)
two_powN = BN_new();
if (two_powN == NULL)
return 0;
if (dh->params.q == NULL)
goto err;
upper = dh->params.q;

if (dh->params.q != NULL) {
upper = dh->params.q;
#ifndef FIPS_MODULE
} else if (dh->params.p != NULL) {
/*
* We do not have q so we just check the key is within some
* reasonable range, or the number of bits is equal to dh->length.
*/
int length = dh->length;

if (length == 0) {
length = BN_num_bits(dh->params.p) - 1;
if (BN_num_bits(priv_key) <= length
&& BN_num_bits(priv_key) > 1)
ok = 1;
} else if (BN_num_bits(priv_key) == length) {
ok = 1;
}
goto end;
#endif
} else {
goto end;
}

/* Is it from an approved Safe prime group ?*/
if (DH_get_nid((DH *)dh) != NID_undef && dh->length != 0) {
if (!BN_lshift(two_powN, BN_value_one(), dh->length))
goto err;
goto end;
if (BN_cmp(two_powN, dh->params.q) < 0)
upper = two_powN;
}
if (!ossl_ffc_validate_private_key(upper, priv_key, ret))
goto err;
goto end;

ok = 1;
err:
end:
BN_free(two_powN);
return ok;
}
Expand Down

0 comments on commit 3b4c5ab

Please sign in to comment.