|
16 | 16 | using Moq;
|
17 | 17 |
|
18 | 18 | using NSec.Cryptography;
|
19 |
| - |
| 19 | +using Test; |
20 | 20 | using static Fido2NetLib.AuthenticatorAttestationResponse;
|
21 | 21 |
|
22 | 22 | namespace fido2_net_lib.Test;
|
@@ -76,6 +76,17 @@ static Fido2Tests()
|
76 | 76 | ];
|
77 | 77 | }
|
78 | 78 |
|
| 79 | + private TestMetadataService CreateMetadataService(string cacheDir) |
| 80 | + { |
| 81 | + var repos = new List<IMetadataRepository> |
| 82 | + { |
| 83 | + new FileSystemMetadataRepository(cacheDir) |
| 84 | + }; |
| 85 | + var simpleService = new TestMetadataService(repos); |
| 86 | + simpleService.InitializeAsync().Wait(); |
| 87 | + return simpleService; |
| 88 | + } |
| 89 | + |
79 | 90 | private async Task<T> GetAsync<T>(string filename)
|
80 | 91 | {
|
81 | 92 | return JsonSerializer.Deserialize<T>(await File.ReadAllTextAsync(filename));
|
@@ -536,6 +547,56 @@ public async Task TestU2FAttestationAsync()
|
536 | 547 | await o.VerifyAsync(options, _config, (x, cancellationToken) => Task.FromResult(true), _metadataService, null, CancellationToken.None);
|
537 | 548 | }
|
538 | 549 |
|
| 550 | + [Fact] |
| 551 | + public async Task TestPackedttestationAsyncFailTrustAnchorOnRootCertInTrustPath() |
| 552 | + { |
| 553 | + var targetGuid = new Guid("42383245-4437-3343-3846-423445354132"); |
| 554 | + var metadataService = CreateMetadataService("./metadata"); |
| 555 | + metadataService.ChangeEntryGuid(new Guid("00000000-0000-0000-0000-000000000004"), targetGuid); |
| 556 | + var jsonPost = JsonSerializer.Deserialize<AuthenticatorAttestationRawResponse>(await File.ReadAllTextAsync("./attestationResultsPacked.json")); |
| 557 | + var options = JsonSerializer.Deserialize<CredentialCreateOptions>(await File.ReadAllTextAsync("./attestationOptionsPacked.json")); |
| 558 | + var o = AuthenticatorAttestationResponse.Parse(jsonPost); |
| 559 | + CborArray X5c = o.AttestationObject.AttStmt["x5c"] as CborArray; |
| 560 | + var entry = await metadataService.GetEntryAsync(targetGuid); |
| 561 | + foreach (var attRootCert in entry.MetadataStatement.AttestationRootCertificates) |
| 562 | + X5c.Add(Encoding.UTF8.GetBytes(attRootCert)); |
| 563 | + |
| 564 | + await Assert.ThrowsAsync<Fido2VerificationException>(() => o.VerifyAsync(options, _config, (x, cancellationToken) => Task.FromResult(true), metadataService, null, CancellationToken.None)); |
| 565 | + } |
| 566 | + |
| 567 | + [Fact] |
| 568 | + public async Task TestU2FAttestationAsyncFailTrustAnchorBasicFull() |
| 569 | + { |
| 570 | + var metadataService = CreateMetadataService("./metadata"); |
| 571 | + metadataService.ChangeEntryGuid(new Guid("00000000-0000-0000-0000-000000000001"), new Guid("00000000-0000-0000-0000-000000000000")); |
| 572 | + var jsonPost = JsonSerializer.Deserialize<AuthenticatorAttestationRawResponse>(await File.ReadAllTextAsync("./attestationResultsU2F.json")); |
| 573 | + var options = JsonSerializer.Deserialize<CredentialCreateOptions>(await File.ReadAllTextAsync("./attestationOptionsU2F.json")); |
| 574 | + var o = AuthenticatorAttestationResponse.Parse(jsonPost); |
| 575 | + await Assert.ThrowsAsync<Fido2VerificationException>(() => o.VerifyAsync(options, _config, (x, cancellationToken) => Task.FromResult(true), metadataService, null, CancellationToken.None)); |
| 576 | + } |
| 577 | + |
| 578 | + [Fact] |
| 579 | + public async Task TestU2FAttestationAsyncCantFailTrustAnchorAnonca() |
| 580 | + { |
| 581 | + var metadataService = CreateMetadataService("./metadata"); |
| 582 | + metadataService.ChangeEntryGuid(new Guid("00000000-0000-0000-0000-000000000002"), new Guid("00000000-0000-0000-0000-000000000000")); |
| 583 | + var jsonPost = JsonSerializer.Deserialize<AuthenticatorAttestationRawResponse>(await File.ReadAllTextAsync("./attestationResultsU2F.json")); |
| 584 | + var options = JsonSerializer.Deserialize<CredentialCreateOptions>(await File.ReadAllTextAsync("./attestationOptionsU2F.json")); |
| 585 | + var o = AuthenticatorAttestationResponse.Parse(jsonPost); |
| 586 | + await o.VerifyAsync(options, _config, (x, cancellationToken) => Task.FromResult(true), metadataService, null, CancellationToken.None); |
| 587 | + } |
| 588 | + |
| 589 | + [Fact] |
| 590 | + public async Task TestU2FAttestationAsyncFailTrustAnchorBasicSurrogate() |
| 591 | + { |
| 592 | + var metadataService = CreateMetadataService("./metadata"); |
| 593 | + metadataService.ChangeEntryGuid(new Guid("00000000-0000-0000-0000-000000000003"), new Guid("00000000-0000-0000-0000-000000000000")); |
| 594 | + var jsonPost = JsonSerializer.Deserialize<AuthenticatorAttestationRawResponse>(await File.ReadAllTextAsync("./attestationResultsU2F.json")); |
| 595 | + var options = JsonSerializer.Deserialize<CredentialCreateOptions>(await File.ReadAllTextAsync("./attestationOptionsU2F.json")); |
| 596 | + var o = AuthenticatorAttestationResponse.Parse(jsonPost); |
| 597 | + await Assert.ThrowsAsync<Fido2VerificationException>(() => o.VerifyAsync(options, _config, (x, cancellationToken) => Task.FromResult(true), metadataService, null, CancellationToken.None)); |
| 598 | + } |
| 599 | + |
539 | 600 | [Fact]
|
540 | 601 | public async Task TestPackedAttestationAsync()
|
541 | 602 | {
|
|
0 commit comments