Skip to content

Commit d20eea8

Browse files
authored
raise ValueError if DH parameter numbers are invalid (#12373)
1 parent 9b59bb6 commit d20eea8

File tree

3 files changed

+17
-9
lines changed

3 files changed

+17
-9
lines changed

docs/hazmat/primitives/asymmetric/dh.rst

+2
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,8 @@ Numbers
314314

315315
:returns: A new instance of :class:`DHParameters`.
316316

317+
:raises ValueError: If the parameters are invalid.
318+
317319
.. class:: DHPrivateNumbers(x, public_numbers)
318320

319321
.. versionadded:: 0.8

src/rust/src/backend/dh.rs

+7-9
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,13 @@ fn dh_parameters_from_numbers(
119119
.transpose()?;
120120
let g = utils::py_int_to_bn(py, numbers.g.bind(py))?;
121121

122-
Ok(openssl::dh::Dh::from_pqg(p, q, g)?)
122+
let dh = openssl::dh::Dh::from_pqg(p, q, g)?;
123+
if !dh.check_key()? {
124+
return Err(CryptographyError::from(
125+
pyo3::exceptions::PyValueError::new_err("Invalid DH parameters"),
126+
));
127+
}
128+
Ok(dh)
123129
}
124130

125131
fn clone_dh<T: openssl::pkey::HasParams>(
@@ -415,14 +421,6 @@ impl DHPrivateNumbers {
415421
let priv_key = utils::py_int_to_bn(py, self.x.bind(py))?;
416422

417423
let dh = dh.set_key(pub_key, priv_key)?;
418-
if !dh.check_key()? {
419-
return Err(CryptographyError::from(
420-
pyo3::exceptions::PyValueError::new_err(
421-
"DH private numbers did not pass safety checks.",
422-
),
423-
));
424-
}
425-
426424
let pkey = openssl::pkey::PKey::from_dh(dh)?;
427425
Ok(DHPrivateKey { pkey })
428426
}

tests/hazmat/primitives/test_dh.py

+8
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,14 @@ def test_dh_parameternumbers():
7272
dh.DHParameterNumbers(P_1536, 2, "hello") # type: ignore[arg-type]
7373

7474

75+
@pytest.mark.skip_fips(reason="RHEL8 FIPS doesn't like this")
76+
def test_dh_invalid_parameter_numbers():
77+
# invalid q
78+
params = dh.DHParameterNumbers(P_1536, 2, 12345)
79+
with pytest.raises(ValueError):
80+
params.parameters()
81+
82+
7583
def test_dh_numbers():
7684
params = dh.DHParameterNumbers(P_1536, 2)
7785

0 commit comments

Comments
 (0)