Skip to content

Commit 9a3d448

Browse files
authored
Intercede FIDO md2 new TOC root cert (#225)
The FIDO Alliance have recently changed the root certificate for their Metadata Service table of contents (TOC). The certificates in the TOC certificate chain have also changed from being ECC to RSA. This branch contains the new TOC root certificate and support for RSA in addition to ECC keys in the intermediate and signing certificates within the X5c data.
1 parent 0fa7bb4 commit 9a3d448

File tree

2 files changed

+69
-16
lines changed

2 files changed

+69
-16
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using System;
2+
using System.Runtime.Serialization;
3+
4+
namespace Fido2NetLib
5+
{
6+
[Serializable]
7+
public class Fido2MetadataException : Exception
8+
{
9+
public Fido2MetadataException()
10+
{
11+
}
12+
13+
public Fido2MetadataException(string message) : base(message)
14+
{
15+
}
16+
17+
public Fido2MetadataException(string message, Exception innerException) : base(message, innerException)
18+
{
19+
}
20+
21+
protected Fido2MetadataException(SerializationInfo info, StreamingContext context) : base(info, context)
22+
{
23+
}
24+
}
25+
}

Src/Fido2/Metadata/Fido2MetadataServiceRepository.cs

Lines changed: 44 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.IdentityModel.Tokens.Jwt;
34
using System.Linq;
45
using System.Net;
@@ -14,21 +15,26 @@ namespace Fido2NetLib
1415
{
1516
public class Fido2MetadataServiceRepository : IMetadataRepository
1617
{
17-
//var rootFile = client.DownloadData("https://mds.fidoalliance.org/Root.cer");
18-
protected const string ROOT_CERT =
19-
"MIICQzCCAcigAwIBAgIORqmxkzowRM99NQZJurcwCgYIKoZIzj0EAwMwUzELMAkG" +
20-
"A1UEBhMCVVMxFjAUBgNVBAoTDUZJRE8gQWxsaWFuY2UxHTAbBgNVBAsTFE1ldGFk" +
21-
"YXRhIFRPQyBTaWduaW5nMQ0wCwYDVQQDEwRSb290MB4XDTE1MDYxNzAwMDAwMFoX" +
22-
"DTQ1MDYxNzAwMDAwMFowUzELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUZJRE8gQWxs" +
23-
"aWFuY2UxHTAbBgNVBAsTFE1ldGFkYXRhIFRPQyBTaWduaW5nMQ0wCwYDVQQDEwRS" +
24-
"b290MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEFEoo+6jdxg6oUuOloqPjK/nVGyY+" +
25-
"AXCFz1i5JR4OPeFJs+my143ai0p34EX4R1Xxm9xGi9n8F+RxLjLNPHtlkB3X4ims" +
26-
"rfIx7QcEImx1cMTgu5zUiwxLX1ookVhIRSoso2MwYTAOBgNVHQ8BAf8EBAMCAQYw" +
27-
"DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU0qUfC6f2YshA1Ni9udeO0VS7vEYw" +
28-
"HwYDVR0jBBgwFoAU0qUfC6f2YshA1Ni9udeO0VS7vEYwCgYIKoZIzj0EAwMDaQAw" +
29-
"ZgIxAKulGbSFkDSZusGjbNkAhAkqTkLWo3GrN5nRBNNk2Q4BlG+AvM5q9wa5WciW" +
30-
"DcMdeQIxAMOEzOFsxX9Bo0h4LOFE5y5H8bdPFYW+l5gy1tQiJv+5NUyM2IBB55XU" +
31-
"YjdBz56jSA==";
18+
protected const string ROOT_CERT =
19+
"MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G" +
20+
"A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp" +
21+
"Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4" +
22+
"MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG" +
23+
"A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI" +
24+
"hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8" +
25+
"RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT" +
26+
"gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm" +
27+
"KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd" +
28+
"QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ" +
29+
"XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw" +
30+
"DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o" +
31+
"LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU" +
32+
"RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp" +
33+
"jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK" +
34+
"6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX" +
35+
"mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs" +
36+
"Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH" +
37+
"WD9f";
3238

3339
protected readonly string _token;
3440
protected readonly string _tocUrl;
@@ -151,7 +157,29 @@ protected async Task<MetadataTOCPayload> DeserializeAndValidateToc(string rawToc
151157

152158
var rootCert = GetX509Certificate(ROOT_CERT);
153159
var tocCerts = keyStrings.Select(o => GetX509Certificate(o)).ToArray();
154-
var tocPublicKeys = keyStrings.Select(o => GetECDsaPublicKey(o)).ToArray();
160+
161+
var keys = new List<SecurityKey>();
162+
163+
foreach (var certString in keyStrings)
164+
{
165+
var cert = GetX509Certificate(certString);
166+
167+
var ecdsaPublicKey = cert.GetECDsaPublicKey();
168+
if (ecdsaPublicKey != null)
169+
{
170+
keys.Add(new ECDsaSecurityKey(ecdsaPublicKey));
171+
continue;
172+
}
173+
174+
var rsaPublicKey = cert.GetRSAPublicKey();
175+
if (rsaPublicKey != null)
176+
{
177+
keys.Add(new RsaSecurityKey(rsaPublicKey));
178+
continue;
179+
}
180+
throw new Fido2MetadataException("Unknown certificate algorithm");
181+
}
182+
var tocPublicKeys = keys.ToArray();
155183

156184
var certChain = new X509Chain();
157185
certChain.ChainPolicy.ExtraStore.Add(rootCert);

0 commit comments

Comments
 (0)