Skip to content

Commit ccf1bde

Browse files
author
Mackinnon Buck
committed
Add more PQC certs + update test
1 parent 49c3942 commit ccf1bde

File tree

62 files changed

+7749
-198
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

62 files changed

+7749
-198
lines changed

src/Servers/Kestrel/Core/src/Internal/Certificates/CertificateConfigLoader.cs

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,20 @@ private static X509Certificate2 LoadCertificateKey(X509Certificate2 certificate,
9898
const string DSAOid = "1.2.840.10040.4.1";
9999
const string ECDsaOid = "1.2.840.10045.2.1";
100100
const string MLDSA44Oid = "2.16.840.1.101.3.4.3.17";
101+
const string MLDSA65Oid = "2.16.840.1.101.3.4.3.18";
102+
const string MLDSA87Oid = "2.16.840.1.101.3.4.3.19";
103+
const string SLHDSASHA2128sOid = "2.16.840.1.101.3.4.3.20";
104+
const string SLHDSASHA2128fOid = "2.16.840.1.101.3.4.3.21";
105+
const string SLHDSASHA2192sOid = "2.16.840.1.101.3.4.3.22";
106+
const string SLHDSASHA2192fOid = "2.16.840.1.101.3.4.3.23";
107+
const string SLHDSASHA2256sOid = "2.16.840.1.101.3.4.3.24";
108+
const string SLHDSASHA2256fOid = "2.16.840.1.101.3.4.3.25";
109+
const string SLHDSASHAKE128sOid = "2.16.840.1.101.3.4.3.26";
110+
const string SLHDSASHAKE128fOid = "2.16.840.1.101.3.4.3.27";
111+
const string SLHDSASHAKE192sOid = "2.16.840.1.101.3.4.3.28";
112+
const string SLHDSASHAKE192fOid = "2.16.840.1.101.3.4.3.29";
113+
const string SLHDSASHAKE256sOid = "2.16.840.1.101.3.4.3.30";
114+
const string SLHDSASHAKE256fOid = "2.16.840.1.101.3.4.3.31";
101115

102116
// Duplication is required here because there are separate CopyWithPrivateKey methods for each algorithm.
103117
var keyText = File.ReadAllText(keyPath);
@@ -146,6 +160,8 @@ private static X509Certificate2 LoadCertificateKey(X509Certificate2 certificate,
146160
}
147161
}
148162
case MLDSA44Oid:
163+
case MLDSA65Oid:
164+
case MLDSA87Oid:
149165
{
150166
#pragma warning disable SYSLIB5006 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed.
151167
using var mlDsa = ImportMLDsaKeyFromFile(keyText, password);
@@ -158,8 +174,32 @@ private static X509Certificate2 LoadCertificateKey(X509Certificate2 certificate,
158174
{
159175
throw CreateErrorGettingPrivateKeyException(keyPath, ex);
160176
}
161-
#pragma warning restore SYSLIB5006 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed.
162177
}
178+
case SLHDSASHA2128sOid:
179+
case SLHDSASHA2128fOid:
180+
case SLHDSASHA2192sOid:
181+
case SLHDSASHA2192fOid:
182+
case SLHDSASHA2256sOid:
183+
case SLHDSASHA2256fOid:
184+
case SLHDSASHAKE128sOid:
185+
case SLHDSASHAKE128fOid:
186+
case SLHDSASHAKE192sOid:
187+
case SLHDSASHAKE192fOid:
188+
case SLHDSASHAKE256sOid:
189+
case SLHDSASHAKE256fOid:
190+
{
191+
using var slhDsa = ImportSlhDsaKeyFromFile(keyText, password);
192+
193+
try
194+
{
195+
return certificate.CopyWithPrivateKey(slhDsa);
196+
}
197+
catch (Exception ex)
198+
{
199+
throw CreateErrorGettingPrivateKeyException(keyPath, ex);
200+
}
201+
}
202+
#pragma warning restore SYSLIB5006 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed.
163203
default:
164204
throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, CoreStrings.UnrecognizedCertificateKeyOid, certificate.PublicKey.Oid.Value));
165205
}
@@ -205,6 +245,19 @@ private static MLDsa ImportMLDsaKeyFromFile(string keyText, string? password)
205245
}
206246
}
207247

248+
[Experimental("SYSLIB5006")]
249+
private static SlhDsa ImportSlhDsaKeyFromFile(string keyText, string? password)
250+
{
251+
if (password == null)
252+
{
253+
return SlhDsa.ImportFromPem(keyText);
254+
}
255+
else
256+
{
257+
return SlhDsa.ImportFromEncryptedPem(keyText, password);
258+
}
259+
}
260+
208261
private static X509Certificate2 LoadFromStoreCert(CertificateConfig certInfo)
209262
{
210263
var subject = certInfo.Subject!;

src/Servers/Kestrel/Kestrel/test/KestrelConfigurationLoaderTests.cs

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -696,10 +696,66 @@ public void ConfigureEndpoint_ThrowsWhen_The_KeyIsPublic()
696696
[InlineData("https-dsa.pem", "https-dsa-protected.key", "test")]
697697
[InlineData("https-dsa.crt", "https-dsa.key", null)]
698698
[InlineData("https-dsa.crt", "https-dsa-protected.key", "test")]
699-
[InlineData("https-mldsa44.pem", "https-mldsa44.key", "aspnetcore")]
699+
[InlineData("https-mldsa44.pem", "https-mldsa44.key", null)]
700700
[InlineData("https-mldsa44.pem", "https-mldsa44-protected.key", "aspnetcore")]
701-
[InlineData("https-mldsa44.crt", "https-mldsa44.key", "aspnetcore")]
701+
[InlineData("https-mldsa44.crt", "https-mldsa44.key", null)]
702702
[InlineData("https-mldsa44.crt", "https-mldsa44-protected.key", "aspnetcore")]
703+
[InlineData("https-mldsa65.pem", "https-mldsa65.key", null)]
704+
[InlineData("https-mldsa65.pem", "https-mldsa65-protected.key", "aspnetcore")]
705+
[InlineData("https-mldsa65.crt", "https-mldsa65.key", null)]
706+
[InlineData("https-mldsa65.crt", "https-mldsa65-protected.key", "aspnetcore")]
707+
[InlineData("https-mldsa87.pem", "https-mldsa87.key", null)]
708+
[InlineData("https-mldsa87.pem", "https-mldsa87-protected.key", "aspnetcore")]
709+
[InlineData("https-mldsa87.crt", "https-mldsa87.key", null)]
710+
[InlineData("https-mldsa87.crt", "https-mldsa87-protected.key", "aspnetcore")]
711+
[InlineData("https-slhdsa-sha2-128s.pem", "https-slhdsa-sha2-128s.key", null)]
712+
[InlineData("https-slhdsa-sha2-128s.pem", "https-slhdsa-sha2-128s-protected.key", "aspnetcore")]
713+
[InlineData("https-slhdsa-sha2-128s.crt", "https-slhdsa-sha2-128s.key", null)]
714+
[InlineData("https-slhdsa-sha2-128s.crt", "https-slhdsa-sha2-128s-protected.key", "aspnetcore")]
715+
[InlineData("https-slhdsa-sha2-128f.pem", "https-slhdsa-sha2-128f.key", null)]
716+
[InlineData("https-slhdsa-sha2-128f.pem", "https-slhdsa-sha2-128f-protected.key", "aspnetcore")]
717+
[InlineData("https-slhdsa-sha2-128f.crt", "https-slhdsa-sha2-128f.key", null)]
718+
[InlineData("https-slhdsa-sha2-128f.crt", "https-slhdsa-sha2-128f-protected.key", "aspnetcore")]
719+
[InlineData("https-slhdsa-sha2-192s.pem", "https-slhdsa-sha2-192s.key", null)]
720+
[InlineData("https-slhdsa-sha2-192s.pem", "https-slhdsa-sha2-192s-protected.key", "aspnetcore")]
721+
[InlineData("https-slhdsa-sha2-192s.crt", "https-slhdsa-sha2-192s.key", null)]
722+
[InlineData("https-slhdsa-sha2-192s.crt", "https-slhdsa-sha2-192s-protected.key", "aspnetcore")]
723+
[InlineData("https-slhdsa-sha2-192f.pem", "https-slhdsa-sha2-192f.key", null)]
724+
[InlineData("https-slhdsa-sha2-192f.pem", "https-slhdsa-sha2-192f-protected.key", "aspnetcore")]
725+
[InlineData("https-slhdsa-sha2-192f.crt", "https-slhdsa-sha2-192f.key", null)]
726+
[InlineData("https-slhdsa-sha2-192f.crt", "https-slhdsa-sha2-192f-protected.key", "aspnetcore")]
727+
[InlineData("https-slhdsa-sha2-256s.pem", "https-slhdsa-sha2-256s.key", null)]
728+
[InlineData("https-slhdsa-sha2-256s.pem", "https-slhdsa-sha2-256s-protected.key", "aspnetcore")]
729+
[InlineData("https-slhdsa-sha2-256s.crt", "https-slhdsa-sha2-256s.key", null)]
730+
[InlineData("https-slhdsa-sha2-256s.crt", "https-slhdsa-sha2-256s-protected.key", "aspnetcore")]
731+
[InlineData("https-slhdsa-sha2-256f.pem", "https-slhdsa-sha2-256f.key", null)]
732+
[InlineData("https-slhdsa-sha2-256f.pem", "https-slhdsa-sha2-256f-protected.key", "aspnetcore")]
733+
[InlineData("https-slhdsa-sha2-256f.crt", "https-slhdsa-sha2-256f.key", null)]
734+
[InlineData("https-slhdsa-sha2-256f.crt", "https-slhdsa-sha2-256f-protected.key", "aspnetcore")]
735+
[InlineData("https-slhdsa-shake-128s.pem", "https-slhdsa-shake-128s.key", null)]
736+
[InlineData("https-slhdsa-shake-128s.pem", "https-slhdsa-shake-128s-protected.key", "aspnetcore")]
737+
[InlineData("https-slhdsa-shake-128s.crt", "https-slhdsa-shake-128s.key", null)]
738+
[InlineData("https-slhdsa-shake-128s.crt", "https-slhdsa-shake-128s-protected.key", "aspnetcore")]
739+
[InlineData("https-slhdsa-shake-128f.pem", "https-slhdsa-shake-128f.key", null)]
740+
[InlineData("https-slhdsa-shake-128f.pem", "https-slhdsa-shake-128f-protected.key", "aspnetcore")]
741+
[InlineData("https-slhdsa-shake-128f.crt", "https-slhdsa-shake-128f.key", null)]
742+
[InlineData("https-slhdsa-shake-128f.crt", "https-slhdsa-shake-128f-protected.key", "aspnetcore")]
743+
[InlineData("https-slhdsa-shake-192s.pem", "https-slhdsa-shake-192s.key", null)]
744+
[InlineData("https-slhdsa-shake-192s.pem", "https-slhdsa-shake-192s-protected.key", "aspnetcore")]
745+
[InlineData("https-slhdsa-shake-192s.crt", "https-slhdsa-shake-192s.key", null)]
746+
[InlineData("https-slhdsa-shake-192s.crt", "https-slhdsa-shake-192s-protected.key", "aspnetcore")]
747+
[InlineData("https-slhdsa-shake-192f.pem", "https-slhdsa-shake-192f.key", null)]
748+
[InlineData("https-slhdsa-shake-192f.pem", "https-slhdsa-shake-192f-protected.key", "aspnetcore")]
749+
[InlineData("https-slhdsa-shake-192f.crt", "https-slhdsa-shake-192f.key", null)]
750+
[InlineData("https-slhdsa-shake-192f.crt", "https-slhdsa-shake-192f-protected.key", "aspnetcore")]
751+
[InlineData("https-slhdsa-shake-256s.pem", "https-slhdsa-shake-256s.key", null)]
752+
[InlineData("https-slhdsa-shake-256s.pem", "https-slhdsa-shake-256s-protected.key", "aspnetcore")]
753+
[InlineData("https-slhdsa-shake-256s.crt", "https-slhdsa-shake-256s.key", null)]
754+
[InlineData("https-slhdsa-shake-256s.crt", "https-slhdsa-shake-256s-protected.key", "aspnetcore")]
755+
[InlineData("https-slhdsa-shake-256f.pem", "https-slhdsa-shake-256f.key", null)]
756+
[InlineData("https-slhdsa-shake-256f.pem", "https-slhdsa-shake-256f-protected.key", "aspnetcore")]
757+
[InlineData("https-slhdsa-shake-256f.crt", "https-slhdsa-shake-256f.key", null)]
758+
[InlineData("https-slhdsa-shake-256f.crt", "https-slhdsa-shake-256f-protected.key", "aspnetcore")]
703759
public void ConfigureEndpoint_CanLoadPemCertificates(string certificateFile, string certificateKey, string password)
704760
{
705761
var serverOptions = CreateServerOptions();
Lines changed: 58 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,60 @@
11
-----BEGIN ENCRYPTED PRIVATE KEY-----
2-
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
59-
bqtv6TQqYLVX
2+
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
59+
wOaxVZJTGMRJ
6060
-----END ENCRYPTED PRIVATE KEY-----
-1.37 KB
Binary file not shown.

0 commit comments

Comments
 (0)