11using System ;
2+ using System . Collections . Generic ;
23using System . IdentityModel . Tokens . Jwt ;
34using System . Linq ;
45using 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