Typed but unhandled extensions preserve DER via public_bytes()

This commit is contained in:
2026-10-26 12:06:16 +08:00
parent 1032b10c49
commit bd352051e0
2 changed files with 34 additions and 3 deletions
@@ -793,11 +793,11 @@ def _netscape_to_spec(ext: x509.Extension) -> Optional[Dict[str, Any]]:
return spec
def _raw_value(ext: x509.Extension) -> Optional[bytes]:
def _raw_value(ext: x509.Extension) -> bytes:
value = ext.value
if isinstance(value, x509.UnrecognizedExtension):
return value.value
return None
return value.public_bytes()
def extension_specs(extensions: Iterable[x509.Extension]) -> Dict[str, Any]:
@@ -892,7 +892,7 @@ def extension_specs(extensions: Iterable[x509.Extension]) -> Dict[str, Any]:
{
"oid": oid,
"critical": ext.critical,
"der_hex": (value.value if isinstance(value, x509.UnrecognizedExtension) else b"").hex(),
"der_hex": _raw_value(ext).hex(),
}
)
if netscape:
@@ -82,6 +82,37 @@ class ExtensionTest(unittest.TestCase):
self.assertEqual(exts[0].oid.dotted_string, "1.2.3.4")
self.assertTrue(exts[0].critical)
def test_unhandled_typed_extension_roundtrip(self) -> None:
value = x509.SubjectInformationAccess(
[
x509.AccessDescription(
x509.oid.AuthorityInformationAccessOID.OCSP,
x509.UniformResourceIdentifier("http://ocsp.example.com"),
)
]
)
ext = x509.Extension(
oid=x509.oid.ExtensionOID.SUBJECT_INFORMATION_ACCESS,
critical=True,
value=value,
)
spec = extension_specs([ext])
self.assertEqual(
spec["raw"],
[
{
"oid": ext.oid.dotted_string,
"critical": True,
"der_hex": value.public_bytes().hex(),
}
],
)
rebuilt = build_extensions(spec, public_key=None)
self.assertEqual(len(rebuilt), 1)
self.assertEqual(rebuilt[0].value.public_bytes(), value.public_bytes())
class KeyTest(unittest.TestCase):
def test_all_types(self) -> None: