1
1
using System ;
2
+ using System . Collections . Generic ;
2
3
using System . IdentityModel . Tokens . Jwt ;
3
4
using System . Linq ;
4
5
using System . Net ;
@@ -14,21 +15,26 @@ namespace Fido2NetLib
14
15
{
15
16
public class Fido2MetadataServiceRepository : IMetadataRepository
16
17
{
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" ;
32
38
33
39
protected readonly string _token ;
34
40
protected readonly string _tocUrl ;
@@ -151,7 +157,29 @@ protected async Task<MetadataTOCPayload> DeserializeAndValidateToc(string rawToc
151
157
152
158
var rootCert = GetX509Certificate ( ROOT_CERT ) ;
153
159
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 ( ) ;
155
183
156
184
var certChain = new X509Chain ( ) ;
157
185
certChain . ChainPolicy . ExtraStore . Add ( rootCert ) ;
0 commit comments