Skip to content

Commit 8b3de53

Browse files
authored
When failing to parse SANs or IANs, include which it was that failed (#11785)
1 parent b7721e2 commit 8b3de53

File tree

5 files changed

+46
-2
lines changed

5 files changed

+46
-2
lines changed

docs/development/test-vectors.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -544,6 +544,8 @@ Custom X.509 Vectors
544544
This is an invalid certificate per CA/B 7.1.2.7.6.
545545
* ``empty-eku.pem`` - A leaf certificate containing an empty EKU extension.
546546
This is an invalid certificate per :rfc:`5280` 4.2.1.12.
547+
* ``malformed-san.pem`` - A certificate with a malformed SAN.
548+
* ``malformed-ian.pem`` - A certificate with a malformed IAN.
547549

548550
Custom X.509 Request Vectors
549551
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

src/rust/src/x509/certificate.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -737,14 +737,18 @@ pub fn parse_cert_ext<'p>(
737737
) -> CryptographyResult<Option<pyo3::Bound<'p, pyo3::PyAny>>> {
738738
match ext.extn_id {
739739
oid::SUBJECT_ALTERNATIVE_NAME_OID => {
740-
let gn_seq = ext.value::<SubjectAlternativeName<'_>>()?;
740+
let gn_seq = ext.value::<SubjectAlternativeName<'_>>().map_err(|e| {
741+
e.add_location(asn1::ParseLocation::Field("subject_alternative_name"))
742+
})?;
741743
let sans = x509::parse_general_names(py, &gn_seq)?;
742744
Ok(Some(
743745
types::SUBJECT_ALTERNATIVE_NAME.get(py)?.call1((sans,))?,
744746
))
745747
}
746748
oid::ISSUER_ALTERNATIVE_NAME_OID => {
747-
let gn_seq = ext.value::<IssuerAlternativeName<'_>>()?;
749+
let gn_seq = ext.value::<IssuerAlternativeName<'_>>().map_err(|e| {
750+
e.add_location(asn1::ParseLocation::Field("issuer_alternative_name"))
751+
})?;
748752
let ians = x509::parse_general_names(py, &gn_seq)?;
749753
Ok(Some(
750754
types::ISSUER_ALTERNATIVE_NAME.get(py)?.call1((ians,))?,

tests/x509/test_x509_ext.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2324,6 +2324,14 @@ def test_uri(self, backend):
23242324
x509.UniformResourceIdentifier("http://path.to.root/root.crt"),
23252325
]
23262326

2327+
def test_malformed(self):
2328+
cert = _load_cert(
2329+
os.path.join("x509", "custom", "malformed-ian.pem"),
2330+
x509.load_pem_x509_certificate,
2331+
)
2332+
with pytest.raises(ValueError, match="issuer_alternative_name"):
2333+
cert.extensions
2334+
23272335

23282336
class TestCRLNumber:
23292337
def test_eq(self):
@@ -2709,6 +2717,14 @@ def test_certbuilder(self, rsa_key_2048: rsa.RSAPrivateKey, backend):
27092717
]
27102718
assert result == sans
27112719

2720+
def test_malformed(self):
2721+
cert = _load_cert(
2722+
os.path.join("x509", "custom", "malformed-san.pem"),
2723+
x509.load_pem_x509_certificate,
2724+
)
2725+
with pytest.raises(ValueError, match="subject_alternative_name"):
2726+
cert.extensions
2727+
27122728

27132729
class TestExtendedKeyUsageExtension:
27142730
def test_eku(self, backend):
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIBlDCB/qADAgECAgo/X5syqzQbiVZiMA0GCSqGSIb3DQEBBQUAMAAwHhcNMTIw
3+
OTI3MTEyNDQzWhcNMTcwOTI3MTEyNDQzWjAAMIGfMA0GCSqGSIb3DQEBAQUAA4GN
4+
ADCBiQKBgQDEyUkICYplDtDRdLjZV0nF5oK5tBjoXWPxnfx6Msg5Ywvxjh4jq8Jf
5+
FRwn9oLYpFmnhPYaVNWO7fykCrYz8O6mMtYInUbodvIPniZXjoTlYOPUmLj/XcU0
6+
iGhUmdo8yquPoe7TC9DDeSfaAwoLMDZjJoQjlBuRk+qTmfySJCNZrQIDAQABoxYw
7+
FDASBgNVHRIECzAJoAcGA1UEAwwAMA0GCSqGSIb3DQEBBQUAA4GBAD5jUyH8eLrZ
8+
tJtEJIVH/cvjtATXWwUnPX5NUGrgIBFwKx1f4csOFe6MIhA7j0VwSJ/iOd4xszLA
9+
r8/2ijoBc+cPbThPSHLdOvOrGJsdrywOUYzGHRh/zoMEnT/FN9p7YbYnQIwFGqx1
10+
HUFnXljOXCezE5ytzEcpQ/43EvT4u74O
11+
-----END CERTIFICATE-----
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIBlDCB/qADAgECAgo/X5syqzQbiVZiMA0GCSqGSIb3DQEBBQUAMAAwHhcNMTIw
3+
OTI3MTEyNDQzWhcNMTcwOTI3MTEyNDQzWjAAMIGfMA0GCSqGSIb3DQEBAQUAA4GN
4+
ADCBiQKBgQDEyUkICYplDtDRdLjZV0nF5oK5tBjoXWPxnfx6Msg5Ywvxjh4jq8Jf
5+
FRwn9oLYpFmnhPYaVNWO7fykCrYz8O6mMtYInUbodvIPniZXjoTlYOPUmLj/XcU0
6+
iGhUmdo8yquPoe7TC9DDeSfaAwoLMDZjJoQjlBuRk+qTmfySJCNZrQIDAQABoxYw
7+
FDASBgNVHREECzAJoAcGA1UEAwwAMA0GCSqGSIb3DQEBBQUAA4GBAD5jUyH8eLrZ
8+
tJtEJIVH/cvjtATXWwUnPX5NUGrgIBFwKx1f4csOFe6MIhA7j0VwSJ/iOd4xszLA
9+
r8/2ijoBc+cPbThPSHLdOvOrGJsdrywOUYzGHRh/zoMEnT/FN9p7YbYnQIwFGqx1
10+
HUFnXljOXCezE5ytzEcpQ/43EvT4u74O
11+
-----END CERTIFICATE-----

0 commit comments

Comments
 (0)