From 0b3f0859595df9154de5685e08522aa68be094b8 Mon Sep 17 00:00:00 2001 From: Kevin Jones Date: Thu, 23 Jul 2026 15:58:29 -0400 Subject: [PATCH] Add ML-KEM and ML-DSA to well-known OID lookups --- .../src/System/Formats/Asn1/WellKnownOids.cs | 22 ++++++++++-- .../tests/Reader/ReadObjectIdentifier.cs | 17 +++++++++ .../tests/Writer/WriteObjectIdentifier.cs | 36 +++++++++++++++++++ 3 files changed, 73 insertions(+), 2 deletions(-) diff --git a/src/libraries/System.Formats.Asn1/src/System/Formats/Asn1/WellKnownOids.cs b/src/libraries/System.Formats.Asn1/src/System/Formats/Asn1/WellKnownOids.cs index 215dbe5eb846f1..42c31586f743a6 100644 --- a/src/libraries/System.Formats.Asn1/src/System/Formats/Asn1/WellKnownOids.cs +++ b/src/libraries/System.Formats.Asn1/src/System/Formats/Asn1/WellKnownOids.cs @@ -107,6 +107,12 @@ internal static class WellKnownOids [ 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, ] => "2.16.840.1.101.3.4.2.1", [ 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02, ] => "2.16.840.1.101.3.4.2.2", [ 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03, ] => "2.16.840.1.101.3.4.2.3", + [ 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x11, ] => "2.16.840.1.101.3.4.3.17", + [ 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x12, ] => "2.16.840.1.101.3.4.3.18", + [ 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x13, ] => "2.16.840.1.101.3.4.3.19", + [ 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x04, 0x01, ] => "2.16.840.1.101.3.4.4.1", + [ 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x04, 0x02, ] => "2.16.840.1.101.3.4.4.2", + [ 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x04, 0x03, ] => "2.16.840.1.101.3.4.4.3", [ 0x67, 0x81, 0x0C, 0x01, 0x02, 0x01, ] => "2.23.140.1.2.1", [ 0x67, 0x81, 0x0C, 0x01, 0x02, 0x02, ] => "2.23.140.1.2.2", _ => null, @@ -214,6 +220,12 @@ internal static ReadOnlySpan GetContents(ReadOnlySpan value) 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, // Sha256 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02, // Sha384 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03, // Sha512 + 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x11, // MLDsa44 + 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x12, // MLDsa65 + 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x13, // MLDsa87 + 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x04, 0x01, // MlKem512 + 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x04, 0x02, // MlKem768 + 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x04, 0x03, // MlKem1024 0x67, 0x81, 0x0C, 0x01, 0x02, 0x01, // CabForumDV 0x67, 0x81, 0x0C, 0x01, 0x02, 0x02, // CabForumOV ]; @@ -317,8 +329,14 @@ internal static ReadOnlySpan GetContents(ReadOnlySpan value) "2.16.840.1.101.3.4.2.1" => data.Slice(740, 9), // Sha256 "2.16.840.1.101.3.4.2.2" => data.Slice(749, 9), // Sha384 "2.16.840.1.101.3.4.2.3" => data.Slice(758, 9), // Sha512 - "2.23.140.1.2.1" => data.Slice(767, 6), // CabForumDV - "2.23.140.1.2.2" => data.Slice(773, 6), // CabForumOV + "2.16.840.1.101.3.4.3.17" => data.Slice(767, 9), // MLDsa44 + "2.16.840.1.101.3.4.3.18" => data.Slice(776, 9), // MLDsa65 + "2.16.840.1.101.3.4.3.19" => data.Slice(785, 9), // MLDsa87 + "2.16.840.1.101.3.4.4.1" => data.Slice(794, 9), // MlKem512 + "2.16.840.1.101.3.4.4.2" => data.Slice(803, 9), // MlKem768 + "2.16.840.1.101.3.4.4.3" => data.Slice(812, 9), // MlKem1024 + "2.23.140.1.2.1" => data.Slice(821, 6), // CabForumDV + "2.23.140.1.2.2" => data.Slice(827, 6), // CabForumOV _ => ReadOnlySpan.Empty }; } diff --git a/src/libraries/System.Formats.Asn1/tests/Reader/ReadObjectIdentifier.cs b/src/libraries/System.Formats.Asn1/tests/Reader/ReadObjectIdentifier.cs index 33a890b9bf4c96..6c0392f3dcadf5 100644 --- a/src/libraries/System.Formats.Asn1/tests/Reader/ReadObjectIdentifier.cs +++ b/src/libraries/System.Formats.Asn1/tests/Reader/ReadObjectIdentifier.cs @@ -233,6 +233,23 @@ public void ExpectedTag_IgnoresConstructed( public static class ReadObjectIdentifierDecoderTests { + [Theory] + [InlineData("0609608648016503040311", "2.16.840.1.101.3.4.3.17")] + [InlineData("0609608648016503040312", "2.16.840.1.101.3.4.3.18")] + [InlineData("0609608648016503040313", "2.16.840.1.101.3.4.3.19")] + [InlineData("0609608648016503040401", "2.16.840.1.101.3.4.4.1")] + [InlineData("0609608648016503040402", "2.16.840.1.101.3.4.4.2")] + [InlineData("0609608648016503040403", "2.16.840.1.101.3.4.4.3")] + public static void ReadWellKnownObjectIdentifier(string inputHex, string expectedValue) + { + byte[] input = inputHex.HexToByteArray(); + + string oid = AsnDecoder.ReadObjectIdentifier(input, AsnEncodingRules.DER, out int consumed); + + Assert.Equal(expectedValue, oid); + Assert.Equal(input.Length, consumed); + } + [Theory] [InlineData(AsnEncodingRules.BER)] [InlineData(AsnEncodingRules.CER)] diff --git a/src/libraries/System.Formats.Asn1/tests/Writer/WriteObjectIdentifier.cs b/src/libraries/System.Formats.Asn1/tests/Writer/WriteObjectIdentifier.cs index e0fa32c7f6b1bb..5c42afdf675e83 100644 --- a/src/libraries/System.Formats.Asn1/tests/Writer/WriteObjectIdentifier.cs +++ b/src/libraries/System.Formats.Asn1/tests/Writer/WriteObjectIdentifier.cs @@ -196,6 +196,42 @@ public void VerifyWriteObjectIdentifier_ConstructedIgnored(AsnEncodingRules rule "06092A864886F70D01010A", }, new object[] + { + AsnEncodingRules.BER, + "2.16.840.1.101.3.4.3.17", + "0609608648016503040311", + }, + new object[] + { + AsnEncodingRules.CER, + "2.16.840.1.101.3.4.3.18", + "0609608648016503040312", + }, + new object[] + { + AsnEncodingRules.DER, + "2.16.840.1.101.3.4.3.19", + "0609608648016503040313", + }, + new object[] + { + AsnEncodingRules.BER, + "2.16.840.1.101.3.4.4.1", + "0609608648016503040401", + }, + new object[] + { + AsnEncodingRules.CER, + "2.16.840.1.101.3.4.4.2", + "0609608648016503040402", + }, + new object[] + { + AsnEncodingRules.DER, + "2.16.840.1.101.3.4.4.3", + "0609608648016503040403", + }, + new object[] { // Using the rules of ITU-T-REC-X.667-201210 for 2.25.{UUID} unregistered arcs, and // their sample value of f81d4fae-7dec-11d0-a765-00a0c91e6bf6