33using Hyperledger . Aries . Agents ;
44using Hyperledger . Aries . Storage ;
55using Hyperledger . TestHarness . Mock ;
6+ using LanguageExt ;
67using Microsoft . Extensions . Logging ;
78using Moq ;
89using Moq . Protected ;
910using SD_JWT . Roles . Implementation ;
1011using WalletFramework . Core . Cryptography . Models ;
12+ using WalletFramework . Core . Functional ;
1113using WalletFramework . MdocLib . Device . Abstractions ;
1214using WalletFramework . Oid4Vc . Oid4Vci . Abstractions ;
1315using WalletFramework . Oid4Vc . Oid4Vci . AuthFlow . Abstractions ;
@@ -33,40 +35,41 @@ public class Oid4VpClientServiceTests : IAsyncLifetime
3335 private const string RequestUriResponse =
3436 "eyJ4NWMiOlsiTUlJQ0x6Q0NBZFdnQXdJQkFnSUJCREFLQmdncWhrak9QUVFEQWpCak1Rc3dDUVlEVlFRR0V3SkVSVEVQTUEwR0ExVUVCd3dHUW1WeWJHbHVNUjB3R3dZRFZRUUtEQlJDZFc1a1pYTmtjblZqYTJWeVpXa2dSMjFpU0RFS01BZ0dBMVVFQ3d3QlNURVlNQllHQTFVRUF3d1BTVVIxYm1sdmJpQlVaWE4wSUVOQk1CNFhEVEl6TURnd016QTROREkwTkZvWERUSTRNRGd3TVRBNE5ESTBORm93VlRFTE1Ba0dBMVVFQmhNQ1JFVXhIVEFiQmdOVkJBb01GRUoxYm1SbGMyUnlkV05yWlhKbGFTQkhiV0pJTVFvd0NBWURWUVFMREFGSk1Sc3dHUVlEVlFRRERCSlBjR1Z1U1dRMFZsQWdWbVZ5YVdacFpYSXdXVEFUQmdjcWhrak9QUUlCQmdncWhrak9QUU1CQndOQ0FBUnNoUzVDaVBrSzVXRUN1RHpybmN0SXBwYm1nc1lkOURzT1lEcElFeFpFczFmUWNOeXZrQjVFZU5Xc2MwU0ExUU5xd3dHVzRndUZLZzBJZjFKR0R4VWZvNEdITUlHRU1CMEdBMVVkRGdRV0JCUmZMQVBzeG1Mc3AxblEvRk12RkkzN0MzQmxZREFNQmdOVkhSTUJBZjhFQWpBQU1BNEdBMVVkRHdFQi93UUVBd0lIZ0RBa0JnTlZIUkVFSFRBYmdobDJaWEpwWm1sbGNpNXpjMmt1ZEdseUxtSjFaSEoxTG1SbE1COEdBMVVkSXdRWU1CYUFGRStXNno3YWpUdW1leCtZY0Zib05yVmVDMnRSTUFvR0NDcUdTTTQ5QkFNQ0EwZ0FNRVVDSUNWZURUMnNkZHhySEMrZ0ZJTUVmc3huc0lXRmdIdnZlZnBuWXZrb0RjbHdBaUVBMlFnRVRHV3hIWUVObWxsNDA2VUNwYnFRb1kzMzJPbE9qdDUwWjc2WHBtQT0iLCJNSUlDTFRDQ0FkU2dBd0lCQWdJVU1ZVUhoR0Q5aFUvYzBFbzZtVzhyamplSit0MHdDZ1lJS29aSXpqMEVBd0l3WXpFTE1Ba0dBMVVFQmhNQ1JFVXhEekFOQmdOVkJBY01Ca0psY214cGJqRWRNQnNHQTFVRUNnd1VRblZ1WkdWelpISjFZMnRsY21WcElFZHRZa2d4Q2pBSUJnTlZCQXNNQVVreEdEQVdCZ05WQkFNTUQwbEVkVzVwYjI0Z1ZHVnpkQ0JEUVRBZUZ3MHlNekEzTVRNd09USTFNamhhRncwek16QTNNVEF3T1RJMU1qaGFNR014Q3pBSkJnTlZCQVlUQWtSRk1ROHdEUVlEVlFRSERBWkNaWEpzYVc0eEhUQWJCZ05WQkFvTUZFSjFibVJsYzJSeWRXTnJaWEpsYVNCSGJXSklNUW93Q0FZRFZRUUxEQUZKTVJnd0ZnWURWUVFEREE5SlJIVnVhVzl1SUZSbGMzUWdRMEV3V1RBVEJnY3Foa2pPUFFJQkJnZ3Foa2pPUFFNQkJ3TkNBQVNFSHo4WWpyRnlUTkhHTHZPMTRFQXhtOXloOGJLT2drVXpZV2NDMWN2ckpuNUpnSFlITXhaYk5NTzEzRWgwRXIyNzM4UVFPZ2VSb1pNSVRhb2RrZk5TbzJZd1pEQWRCZ05WSFE0RUZnUVVUNWJyUHRxTk82WjdINWh3VnVnMnRWNExhMUV3SHdZRFZSMGpCQmd3Rm9BVVQ1YnJQdHFOTzZaN0g1aHdWdWcydFY0TGExRXdFZ1lEVlIwVEFRSC9CQWd3QmdFQi93SUJBREFPQmdOVkhROEJBZjhFQkFNQ0FZWXdDZ1lJS29aSXpqMEVBd0lEUndBd1JBSWdZMERlcmRDeHQ0ekdQWW44eU5yRHhJV0NKSHB6cTRCZGpkc1ZOMm8xR1JVQ0lCMEtBN2JHMUZWQjFJaUs4ZDU3UUFMK1BHOVg1bGRLRzdFa29BbWhXVktlIl0sImtpZCI6Ik1Hd3daNlJsTUdNeEN6QUpCZ05WQkFZVEFrUkZNUTh3RFFZRFZRUUhEQVpDWlhKc2FXNHhIVEFiQmdOVkJBb01GRUoxYm1SbGMyUnlkV05yWlhKbGFTQkhiV0pJTVFvd0NBWURWUVFMREFGSk1SZ3dGZ1lEVlFRRERBOUpSSFZ1YVc5dUlGUmxjM1FnUTBFQ0FRUT0iLCJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiJ9.eyJyZXNwb25zZV90eXBlIjoidnBfdG9rZW4iLCJwcmVzZW50YXRpb25fZGVmaW5pdGlvbiI6eyJpZCI6IjE1ZDQwNjU0LWM2NTgtNDkzOC1hYzA3LWVjYjQxYzlhZmIxMCIsImlucHV0X2Rlc2NyaXB0b3JzIjpbeyJpZCI6IjUwYjZlNGYzLTYyMmEtNDk3NC1iMzMwLTVlNzIwZWM5MjJiZiIsImZvcm1hdCI6eyJ2YytzZC1qd3QiOnsicHJvb2ZfdHlwZSI6WyJKc29uV2ViU2lnbmF0dXJlMjAyMCJdfX0sImNvbnN0cmFpbnRzIjp7ImxpbWl0X2Rpc2Nsb3N1cmUiOiJyZXF1aXJlZCIsImZpZWxkcyI6W3sicGF0aCI6WyIkLnR5cGUiXSwiZmlsdGVyIjp7InR5cGUiOiJzdHJpbmciLCJjb25zdCI6IlZlcmlmaWVkRU1haWwifX0seyJwYXRoIjpbIiQuZW1haWwiXX1dfX1dfSwicmVzcG9uc2VfdXJpIjoiaHR0cHM6Ly92ZXJpZmllci5zc2kudGlyLmJ1ZHJ1LmRlL3ByZXNlbnRhdGlvbi9hdXRob3JpemF0aW9uLXJlc3BvbnNlIiwibm9uY2UiOiJZZjg4dGRlZzhZTTkyM3E0aFFBRzlPIiwiY2xpZW50X2lkIjoiaHR0cHM6Ly92ZXJpZmllci5zc2kudGlyLmJ1ZHJ1LmRlL3ByZXNlbnRhdGlvbi9hdXRob3JpemF0aW9uLXJlc3BvbnNlIiwicmVzcG9uc2VfbW9kZSI6ImRpcmVjdF9wb3N0In0.sdeLcG6Ta4ozfbDuHBr2Vq-Ro2WpdUIhJWy3BgazyvrgkQw27uTFGioPWXNCruK5H5E5nvHS420u5tv0671tjg" ;
3537
36- // public Oid4VpClientServiceTests()
37- // {
38- // var holder = new Holder();
39- // var walletRecordService = new DefaultWalletRecordService();
40- // var pexService = new PexService(_agentProviderMock.Object, _mdocStorageMock.Object, _sdJwtVcHolderService!);
41- //
42- // _sdJwtVcHolderService = new SdJwtVcHolderService(holder, _sdJwtSignerService.Object, walletRecordService);
43- // var oid4VpHaipClient = new Oid4VpHaipClient(new AuthorizationRequestService(_httpClientFactoryMock.Object), pexService);
44- // _oid4VpRecordService = new Oid4VpRecordService(walletRecordService);
45- //
46- // _oid4VpClientService = new Oid4VpClientService(
47- // _agentProviderMock.Object,
48- // _httpClientFactoryMock.Object,
49- // _loggerMock.Object,
50- // _mdocAuthenticationService.Object,
51- // oid4VpHaipClient,
52- // _oid4VpRecordService,
53- // _mdocStorageMock.Object,
54- // pexService,
55- // _authFlowSessionStorageMock.Object,
56- // _sdJwtVcHolderService);
57- //
58- // _sdJwtSignerService.Setup(keyStore =>
59- // keyStore.GenerateKbProofOfPossessionAsync(
60- // It.IsAny<KeyId>(),
61- // It.IsAny<string>(),
62- // It.IsAny<string>(),
63- // It.IsAny<string>(),
64- // It.IsAny<string>(),
65- // It.IsAny<string>()
66- // )
67- // )
68- // .ReturnsAsync(KeyBindingJwtMock);
69- // }
38+ public Oid4VpClientServiceTests ( )
39+ {
40+ var holder = new Holder ( ) ;
41+ var walletRecordService = new DefaultWalletRecordService ( ) ;
42+ var pexService = new PexService ( _agentProviderMock . Object , _mdocStorageMock . Object , _sdJwtVcHolderService ! ) ;
43+
44+ _sdJwtVcHolderService = new SdJwtVcHolderService ( holder , _sdJwtSignerService . Object , walletRecordService ) ;
45+ var authRequestService = new AuthorizationRequestService ( _httpClientFactoryMock . Object ) ;
46+ var oid4VpHaipClient = new Oid4VpHaipClient ( pexService ) ;
47+ _oid4VpRecordService = new Oid4VpRecordService ( walletRecordService ) ;
48+
49+ _oid4VpClientService = new Oid4VpClientService (
50+ _agentProviderMock . Object ,
51+ authRequestService ,
52+ _httpClientFactoryMock . Object ,
53+ _loggerMock . Object ,
54+ _mdocAuthenticationService . Object ,
55+ oid4VpHaipClient ,
56+ _oid4VpRecordService ,
57+ _mdocStorageMock . Object ,
58+ pexService ,
59+ _authFlowSessionStorageMock . Object ,
60+ _sdJwtVcHolderService ) ;
61+
62+ _sdJwtSignerService . Setup ( keyStore =>
63+ keyStore . GenerateKbProofOfPossessionAsync (
64+ It . IsAny < KeyId > ( ) ,
65+ It . IsAny < string > ( ) ,
66+ It . IsAny < string > ( ) ,
67+ It . IsAny < string > ( ) ,
68+ It . IsAny < string > ( ) ,
69+ It . IsAny < string > ( ) ,
70+ Option < IEnumerable < string > > . None ) )
71+ . ReturnsAsync ( KeyBindingJwtMock ) ;
72+ }
7073
7174 private readonly Mock < IAgentProvider > _agentProviderMock = new ( ) ;
7275 private readonly Mock < HttpMessageHandler > _httpMessageHandlerMock = new ( ) ;
@@ -86,40 +89,46 @@ public class Oid4VpClientServiceTests : IAsyncLifetime
8689 private MockAgent ? _agent1 ;
8790
8891 [ Fact ]
89- // public async Task CanExecuteOpenId4VpFlow()
90- // {
91- // //Arrange
92- // SetupHttpClient(RequestUriResponse);
93- //
94- // var sdJwt = new SdJwtRecord();
95- //
96- // await _sdJwtVcHolderService.AddAsync(_agent1!.Context, sdJwt);
97- //
98- // //Act
99- // var (authorizationRequest, credentials) =
100- // await _oid4VpClientService.ProcessAuthorizationRequestAsync(new Uri(AuthRequestWithRequestUri));
101- //
102- // var selectedCandidates = new SelectedCredential
103- // {
104- // InputDescriptorId = credentials.First().InputDescriptorId,
105- // Credential = credentials.First().CredentialSetCandidates.First().Credentials.First()
106- // };
107- //
108- // SetupHttpClient(
109- // "{'redirect_uri':'https://client.example.org/cb#response_code=091535f699ea575c7937fa5f0f454aee'}"
110- // );
111- //
112- // var response = await _oid4VpClientService.SendAuthorizationResponseAsync(
113- // authorizationRequest,
114- // new[] { selectedCandidates });
115- //
116- // // Assert
117- // credentials.Length().Should().Be(1);
118- //
119- // response.Should().BeEquivalentTo(new Uri(ExpectedRedirectUrl));
120- //
121- // (await _oid4VpRecordService.ListAsync(_agent1.Context)).Count.Should().Be(1);
122- // }
92+ public async Task CanExecuteOpenId4VpFlow ( )
93+ {
94+ //Arrange
95+ SetupHttpClient ( RequestUriResponse ) ;
96+
97+ var sdJwt = new SdJwtRecord ( ) ;
98+
99+ await _sdJwtVcHolderService . AddAsync ( _agent1 ! . Context , sdJwt ) ;
100+
101+ var uri = AuthorizationRequestUri
102+ . FromUri ( new Uri ( AuthRequestWithRequestUri ) )
103+ . UnwrapOrThrow ( ) ;
104+
105+ //Act
106+ var authRequestCandidates =
107+ ( await _oid4VpClientService . ProcessAuthorizationRequestUri ( uri ) ) . UnwrapOrThrow ( ) ;
108+ var ( authorizationRequest , credentials ) =
109+ ( authRequestCandidates . AuthorizationRequest , authRequestCandidates . Candidates . UnwrapOrThrow ( ) ) ;
110+
111+ var selectedCandidates = new SelectedCredential
112+ {
113+ InputDescriptorId = credentials . First ( ) . InputDescriptorId ,
114+ Credential = credentials . First ( ) . CredentialSetCandidates . First ( ) . Credentials . First ( )
115+ } ;
116+
117+ SetupHttpClient (
118+ "{'redirect_uri':'https://client.example.org/cb#response_code=091535f699ea575c7937fa5f0f454aee'}"
119+ ) ;
120+
121+ var response = await _oid4VpClientService . AcceptAuthorizationRequest (
122+ authorizationRequest ,
123+ [ selectedCandidates ] ) ;
124+
125+ // Assert
126+ credentials . Length ( ) . Should ( ) . Be ( 1 ) ;
127+
128+ response . UnwrapOrThrow ( ) . Should ( ) . BeEquivalentTo ( new Uri ( ExpectedRedirectUrl ) ) ;
129+
130+ ( await _oid4VpRecordService . ListAsync ( _agent1 . Context ) ) . Count . Should ( ) . Be ( 1 ) ;
131+ }
123132
124133 public async Task DisposeAsync ( )
125134 {
0 commit comments