@credo-ts/openid4vc 0.6.0-pr-2195-20250226100854 → 0.6.0-pr-2195-20250321180923

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/build/openid4vc-holder/OpenId4VcHolderApi.d.ts +29 -29
  2. package/build/openid4vc-holder/OpenId4VcHolderApi.js +16 -16
  3. package/build/openid4vc-holder/OpenId4VcHolderApi.js.map +1 -1
  4. package/build/openid4vc-holder/OpenId4VcHolderModule.js +2 -2
  5. package/build/openid4vc-holder/OpenId4VcHolderModule.js.map +1 -1
  6. package/build/openid4vc-holder/OpenId4VciHolderService.d.ts +2 -2
  7. package/build/openid4vc-holder/OpenId4VciHolderService.js +6 -6
  8. package/build/openid4vc-holder/OpenId4VciHolderService.js.map +1 -1
  9. package/build/openid4vc-holder/OpenId4VciHolderServiceOptions.d.ts +1 -1
  10. package/build/openid4vc-holder/{OpenId4vcSiopHolderService.d.ts → OpenId4vpHolderService.d.ts} +21 -22
  11. package/build/openid4vc-holder/OpenId4vpHolderService.js +317 -0
  12. package/build/openid4vc-holder/OpenId4vpHolderService.js.map +1 -0
  13. package/build/openid4vc-holder/OpenId4vpHolderServiceOptions.d.ts +81 -0
  14. package/build/openid4vc-holder/{OpenId4vcSiopHolderServiceOptions.js → OpenId4vpHolderServiceOptions.js} +1 -1
  15. package/build/openid4vc-holder/OpenId4vpHolderServiceOptions.js.map +1 -0
  16. package/build/openid4vc-holder/index.d.ts +2 -2
  17. package/build/openid4vc-holder/index.js +2 -2
  18. package/build/openid4vc-holder/index.js.map +1 -1
  19. package/build/openid4vc-issuer/OpenId4VcIssuerEvents.d.ts +1 -1
  20. package/build/openid4vc-issuer/OpenId4VcIssuerModule.d.ts +1 -1
  21. package/build/openid4vc-issuer/OpenId4VcIssuerModuleConfig.d.ts +1 -1
  22. package/build/openid4vc-issuer/OpenId4VcIssuerService.d.ts +2 -3
  23. package/build/openid4vc-issuer/OpenId4VcIssuerService.js +13 -16
  24. package/build/openid4vc-issuer/OpenId4VcIssuerService.js.map +1 -1
  25. package/build/openid4vc-issuer/OpenId4VcIssuerServiceOptions.d.ts +8 -8
  26. package/build/openid4vc-issuer/repository/OpenId4VcIssuanceSessionRecord.d.ts +11 -1
  27. package/build/openid4vc-issuer/repository/OpenId4VcIssuanceSessionRecord.js +3 -0
  28. package/build/openid4vc-issuer/repository/OpenId4VcIssuanceSessionRecord.js.map +1 -1
  29. package/build/openid4vc-issuer/repository/OpenId4VcIssuanceSessionRepository.d.ts +1 -1
  30. package/build/openid4vc-issuer/repository/OpenId4VcIssuerRecord.d.ts +1 -1
  31. package/build/openid4vc-issuer/repository/OpenId4VcIssuerRecord.js +1 -1
  32. package/build/openid4vc-issuer/repository/OpenId4VcIssuerRecord.js.map +1 -1
  33. package/build/openid4vc-issuer/repository/OpenId4VcIssuerRepository.d.ts +1 -1
  34. package/build/openid4vc-issuer/router/accessTokenEndpoint.d.ts +2 -2
  35. package/build/openid4vc-issuer/router/authorizationChallengeEndpoint.js.map +1 -1
  36. package/build/openid4vc-issuer/router/credentialEndpoint.d.ts +1 -1
  37. package/build/openid4vc-issuer/router/credentialEndpoint.js +1 -0
  38. package/build/openid4vc-issuer/router/credentialEndpoint.js.map +1 -1
  39. package/build/openid4vc-issuer/router/credentialOfferEndpoint.d.ts +1 -1
  40. package/build/openid4vc-issuer/router/credentialOfferEndpoint.js +15 -0
  41. package/build/openid4vc-issuer/router/credentialOfferEndpoint.js.map +1 -1
  42. package/build/openid4vc-issuer/router/jwksEndpoint.d.ts +1 -1
  43. package/build/openid4vc-issuer/router/nonceEndpoint.d.ts +1 -1
  44. package/build/openid4vc-issuer/util/txCode.d.ts +1 -1
  45. package/build/openid4vc-verifier/OpenId4VcVerifierApi.d.ts +13 -26
  46. package/build/openid4vc-verifier/OpenId4VcVerifierApi.js +16 -25
  47. package/build/openid4vc-verifier/OpenId4VcVerifierApi.js.map +1 -1
  48. package/build/openid4vc-verifier/OpenId4VcVerifierEvents.d.ts +1 -1
  49. package/build/openid4vc-verifier/OpenId4VcVerifierModule.d.ts +1 -1
  50. package/build/openid4vc-verifier/OpenId4VcVerifierModule.js +4 -4
  51. package/build/openid4vc-verifier/OpenId4VcVerifierModule.js.map +1 -1
  52. package/build/openid4vc-verifier/OpenId4VcVerifierModuleConfig.d.ts +30 -7
  53. package/build/openid4vc-verifier/OpenId4VcVerifierModuleConfig.js +16 -12
  54. package/build/openid4vc-verifier/OpenId4VcVerifierModuleConfig.js.map +1 -1
  55. package/build/openid4vc-verifier/{OpenId4VcSiopVerifierService.d.ts → OpenId4VpVerifierService.d.ts} +17 -33
  56. package/build/openid4vc-verifier/OpenId4VpVerifierService.js +765 -0
  57. package/build/openid4vc-verifier/OpenId4VpVerifierService.js.map +1 -0
  58. package/build/openid4vc-verifier/OpenId4VpVerifierServiceOptions.d.ts +146 -0
  59. package/build/openid4vc-verifier/{OpenId4VcSiopVerifierServiceOptions.js → OpenId4VpVerifierServiceOptions.js} +1 -1
  60. package/build/openid4vc-verifier/OpenId4VpVerifierServiceOptions.js.map +1 -0
  61. package/build/openid4vc-verifier/index.d.ts +2 -2
  62. package/build/openid4vc-verifier/index.js +2 -2
  63. package/build/openid4vc-verifier/index.js.map +1 -1
  64. package/build/openid4vc-verifier/repository/OpenId4VcVerificationSessionRecord.d.ts +25 -9
  65. package/build/openid4vc-verifier/repository/OpenId4VcVerificationSessionRecord.js +21 -2
  66. package/build/openid4vc-verifier/repository/OpenId4VcVerificationSessionRecord.js.map +1 -1
  67. package/build/openid4vc-verifier/repository/OpenId4VcVerificationSessionRepository.d.ts +1 -1
  68. package/build/openid4vc-verifier/repository/OpenId4VcVerifierRecord.d.ts +3 -3
  69. package/build/openid4vc-verifier/repository/OpenId4VcVerifierRepository.d.ts +1 -1
  70. package/build/openid4vc-verifier/router/authorizationEndpoint.d.ts +2 -10
  71. package/build/openid4vc-verifier/router/authorizationEndpoint.js +94 -7
  72. package/build/openid4vc-verifier/router/authorizationEndpoint.js.map +1 -1
  73. package/build/openid4vc-verifier/router/authorizationRequestEndpoint.d.ts +2 -10
  74. package/build/openid4vc-verifier/router/authorizationRequestEndpoint.js +18 -6
  75. package/build/openid4vc-verifier/router/authorizationRequestEndpoint.js.map +1 -1
  76. package/build/shared/callbacks.d.ts +2 -2
  77. package/build/shared/callbacks.js +10 -7
  78. package/build/shared/callbacks.js.map +1 -1
  79. package/build/shared/models/index.d.ts +4 -4
  80. package/build/shared/models/index.js.map +1 -1
  81. package/build/shared/router/context.d.ts +2 -2
  82. package/build/shared/router/context.js +9 -5
  83. package/build/shared/router/context.js.map +1 -1
  84. package/build/shared/router/express.js +1 -2
  85. package/build/shared/router/express.js.map +1 -1
  86. package/build/shared/transactionData.d.ts +5 -0
  87. package/build/shared/transactionData.js +22 -0
  88. package/build/shared/transactionData.js.map +1 -0
  89. package/build/shared/utils.d.ts +1 -1
  90. package/build/shared/utils.js +3 -3
  91. package/build/shared/utils.js.map +1 -1
  92. package/package.json +7 -6
  93. package/build/openid4vc-holder/OpenId4vcSiopHolderService.js +0 -306
  94. package/build/openid4vc-holder/OpenId4vcSiopHolderService.js.map +0 -1
  95. package/build/openid4vc-holder/OpenId4vcSiopHolderServiceOptions.d.ts +0 -54
  96. package/build/openid4vc-holder/OpenId4vcSiopHolderServiceOptions.js.map +0 -1
  97. package/build/openid4vc-verifier/OpenId4VcSiopVerifierService.js +0 -806
  98. package/build/openid4vc-verifier/OpenId4VcSiopVerifierService.js.map +0 -1
  99. package/build/openid4vc-verifier/OpenId4VcSiopVerifierServiceOptions.d.ts +0 -93
  100. package/build/openid4vc-verifier/OpenId4VcSiopVerifierServiceOptions.js.map +0 -1
@@ -0,0 +1,317 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.OpenId4VpHolderService = void 0;
13
+ const core_1 = require("@credo-ts/core");
14
+ const openid4vp_1 = require("@openid4vc/openid4vp");
15
+ const callbacks_1 = require("../shared/callbacks");
16
+ let OpenId4VpHolderService = class OpenId4VpHolderService {
17
+ constructor(presentationExchangeService, dcqlService) {
18
+ this.presentationExchangeService = presentationExchangeService;
19
+ this.dcqlService = dcqlService;
20
+ }
21
+ getOpenid4vpClient(agentContext, trustedCertificates) {
22
+ const callbacks = (0, callbacks_1.getOid4vcCallbacks)(agentContext, trustedCertificates);
23
+ return new openid4vp_1.Openid4vpClient({ callbacks });
24
+ }
25
+ async handlePresentationExchangeRequest(agentContext, _presentationDefinition, transactionData) {
26
+ const presentationDefinition = _presentationDefinition;
27
+ this.presentationExchangeService.validatePresentationDefinition(presentationDefinition);
28
+ const presentationExchange = {
29
+ definition: presentationDefinition,
30
+ credentialsForRequest: await this.presentationExchangeService.getCredentialsForRequest(agentContext, presentationDefinition),
31
+ };
32
+ const availableCredentialIds = presentationExchange.credentialsForRequest.requirements.flatMap((requirement) => requirement.submissionEntry.map((entry) => entry.inputDescriptorId));
33
+ // for each transaction data entry, get all credentials that can be used to sign the respective transaction
34
+ const matchedTransactionData = transactionData?.map((entry) => ({
35
+ entry,
36
+ matchedCredentialIds: entry.transactionData.credential_ids.filter((credentialId) => availableCredentialIds.includes(credentialId)),
37
+ }));
38
+ return { pex: presentationExchange, matchedTransactionData };
39
+ }
40
+ async handleDcqlRequest(agentContext, dcql, transactionData) {
41
+ const dcqlQuery = this.dcqlService.validateDcqlQuery(dcql);
42
+ const dcqlQueryResult = await this.dcqlService.getCredentialsForRequest(agentContext, dcqlQuery);
43
+ // for each transaction data entry, get all credentials that can be used to sign the respective transaction
44
+ const matchedTransactionData = transactionData?.map((entry) => ({
45
+ entry,
46
+ matchedCredentialIds: entry.transactionData.credential_ids.filter((credentialId) => dcqlQueryResult.credential_matches[credentialId].success),
47
+ }));
48
+ return { dcql: { queryResult: dcqlQueryResult }, matchedTransactionData };
49
+ }
50
+ async resolveAuthorizationRequest(agentContext,
51
+ /**
52
+ * Can be:
53
+ * - JWT
54
+ * - URI containing request or request_uri param
55
+ * - Request payload
56
+ */
57
+ authorizationRequest, options) {
58
+ const openid4vpClient = this.getOpenid4vpClient(agentContext, options?.trustedCertificates);
59
+ const { params } = openid4vpClient.parseOpenid4vpAuthorizationRequest({ authorizationRequest });
60
+ const verifiedAuthorizationRequest = await openid4vpClient.resolveOpenId4vpAuthorizationRequest({
61
+ authorizationRequestPayload: params,
62
+ origin: options?.origin,
63
+ });
64
+ const { client, pex, transactionData, dcql } = verifiedAuthorizationRequest;
65
+ if (client.scheme !== 'x509_san_dns' && client.scheme !== 'did' && client.scheme !== 'web-origin') {
66
+ throw new core_1.CredoError(`Client scheme '${client.scheme}' is not supported`);
67
+ }
68
+ const pexResult = pex?.presentation_definition
69
+ ? await this.handlePresentationExchangeRequest(agentContext, pex.presentation_definition, transactionData)
70
+ : undefined;
71
+ const dcqlResult = dcql?.query ? await this.handleDcqlRequest(agentContext, dcql.query, transactionData) : undefined;
72
+ agentContext.config.logger.debug('verified Authorization Request');
73
+ agentContext.config.logger.debug(`request '${authorizationRequest}'`);
74
+ return {
75
+ authorizationRequestPayload: verifiedAuthorizationRequest.authorizationRequestPayload,
76
+ transactionData: pexResult?.matchedTransactionData ?? dcqlResult?.matchedTransactionData,
77
+ presentationExchange: pexResult?.pex,
78
+ dcql: dcqlResult?.dcql,
79
+ origin: options?.origin,
80
+ };
81
+ }
82
+ extendCredentialsWithTransactionDataHashes(
83
+ // Either PEX or DCQL
84
+ selectedCredentials, transactionData, selectedTransactionDataCredentials) {
85
+ // TODO: it would make sense for oid4vc to also handle this validation logic, but it would require
86
+ // knowledge of PEX / DCQL...
87
+ if (!transactionData && !selectedTransactionDataCredentials)
88
+ return selectedCredentials;
89
+ if (!selectedTransactionDataCredentials) {
90
+ throw new core_1.CredoError('Autohrization request contains transaction data entries, but no credential ids to sign transaction data hashes provided in acceptAuthorizationRequest method.');
91
+ }
92
+ if (!transactionData) {
93
+ throw new core_1.CredoError('Autohrization request doe not contains transaction data entries, but credentail ids were provided to sign transaction data hashes in acceptAuthorizationRequest method.');
94
+ }
95
+ if (transactionData.length !== selectedTransactionDataCredentials.length) {
96
+ throw new core_1.CredoError('Credential ids to sign transaction data hashes provided in acceptAuthorizationRequest method, but the length does not match the number of transaction data entries from the authorization request.');
97
+ }
98
+ const credentialsToTransactionData = {};
99
+ for (const transactionDataIndex in transactionData) {
100
+ const transactionDataEntry = transactionData[transactionDataIndex];
101
+ const { credentialId } = selectedTransactionDataCredentials[transactionDataIndex];
102
+ if (!transactionDataEntry.transactionData.credential_ids.includes(credentialId)) {
103
+ throw new core_1.CredoError(`Credential id '${credentialId}' selected to sign transaction data with index '${transactionDataIndex}' is not present in allowed credential ids for transaction. Allowed credential ids are ${transactionDataEntry.transactionData.credential_ids.join(', ')}`);
104
+ }
105
+ if (!selectedCredentials[credentialId]) {
106
+ throw new core_1.CredoError(`Credential id '${credentialId}' selected to sign transaction data with index '${transactionDataIndex}', but credential is not included in the credentials for the presentation.`);
107
+ }
108
+ // NOTE: in the next releaes of DCQL this will also be an array, so this code can soon be simplified
109
+ const credentialsForId = Array.isArray(selectedCredentials[credentialId])
110
+ ? selectedCredentials[credentialId]
111
+ : [selectedCredentials[credentialId]];
112
+ const unsupportedFormats = credentialsForId
113
+ .filter((c) => c.claimFormat !== core_1.ClaimFormat.SdJwtVc)
114
+ .map((c) => c.claimFormat);
115
+ if (unsupportedFormats.length > 0) {
116
+ throw new core_1.CredoError(`Credential id '${credentialId}' selected to sign transaction data with index '${transactionDataIndex}' unsupported format(s) ${unsupportedFormats.join(', ')}. Only '${core_1.ClaimFormat.SdJwtVc}' is supported for transaction data signing in Credo at the moment.`);
117
+ }
118
+ if (!credentialsToTransactionData[credentialId]) {
119
+ credentialsToTransactionData[credentialId] = [];
120
+ }
121
+ credentialsToTransactionData[credentialId].push(transactionDataEntry);
122
+ }
123
+ const updatedCredentials = {
124
+ ...selectedCredentials,
125
+ };
126
+ for (const [credentialId, entries] of Object.entries(credentialsToTransactionData)) {
127
+ const allowedHashAlgs = entries.reduce((allowedHashValues, entry) => (entry.transactionData.transaction_data_hashes_alg ?? ['sha-256']).filter((value) => !allowedHashValues || allowedHashValues.includes(value)), undefined);
128
+ if (!allowedHashAlgs || allowedHashAlgs.length === 0) {
129
+ throw new core_1.CredoError(`Unable to determine hash alg for credential with id '${credentialId}' and transaction data indexes ${entries.map((e) => e.transactionDataIndex).join(' ')}, no common 'transaction_data_hashes_alg' value found.`);
130
+ }
131
+ const supportedHashAlgs = ['sha-1', 'sha-256'];
132
+ const supportedAllowedHashAlgs = supportedHashAlgs.filter((alg) => allowedHashAlgs.includes(alg));
133
+ if (supportedAllowedHashAlgs.length === 0) {
134
+ throw new core_1.CredoError(`Unable to create transaction data hash for credential with id '${credentialId}' and transaction data indexes ${entries.map((e) => e.transactionDataIndex).join(' ')}. None of the common allowed hash algorithms is supported by Credo: ${allowedHashAlgs.join(', ')}. Supported hash algs are ${supportedHashAlgs.join(', ')}.`);
135
+ }
136
+ // Not required, but we include it by default as otherwise we need to look at all entries to
137
+ // see if any specified an alg array
138
+ const [transactionDataHahsesAlg] = supportedAllowedHashAlgs;
139
+ const transactionDataHashes = entries.map((entry) => core_1.TypedArrayEncoder.toBase64URL(core_1.Hasher.hash(entry.encoded, transactionDataHahsesAlg)));
140
+ const credentialsForId = Array.isArray(updatedCredentials[credentialId])
141
+ ? updatedCredentials[credentialId]
142
+ : [updatedCredentials[credentialId]];
143
+ const updatedCredentialsForId = credentialsForId.map((credential) => {
144
+ if (credential.claimFormat !== core_1.ClaimFormat.SdJwtVc) {
145
+ // We already verified this above
146
+ throw new core_1.CredoError(`Unexpected claim format '${credential.claimFormat}' for transaction data, expected '${core_1.ClaimFormat.SdJwtVc}'`);
147
+ }
148
+ return {
149
+ ...credential,
150
+ additionalPayload: {
151
+ ...(credential.additionalPayload ?? {}),
152
+ transaction_data_hashes: transactionDataHashes,
153
+ transaction_data_hashes_alg: transactionDataHahsesAlg,
154
+ },
155
+ };
156
+ });
157
+ // Will soon be simplified once DCQL also uses array
158
+ updatedCredentials[credentialId] = Array.isArray(updatedCredentials[credentialId])
159
+ ? updatedCredentialsForId
160
+ : updatedCredentialsForId[0];
161
+ }
162
+ return updatedCredentials;
163
+ }
164
+ async acceptAuthorizationRequest(agentContext, options) {
165
+ const { authorizationRequestPayload, presentationExchange, dcql, transactionData } = options;
166
+ const openid4vpClient = this.getOpenid4vpClient(agentContext);
167
+ const authorizationResponseNonce = await agentContext.wallet.generateNonce();
168
+ const { nonce } = authorizationRequestPayload;
169
+ const parsedClientId = (0, openid4vp_1.getOpenid4vpClientId)({ authorizationRequestPayload, origin: options.origin });
170
+ // If client_id_scheme was used we need to use the legacy client id.
171
+ const clientId = parsedClientId.legacyClientId ?? parsedClientId.clientId;
172
+ let openid4vpOptions;
173
+ if ((0, openid4vp_1.isOpenid4vpAuthorizationRequestDcApi)(authorizationRequestPayload)) {
174
+ if (!options.origin) {
175
+ throw new core_1.CredoError('Missing required parameter `origin` parameter for accepting openid4vp dc api requests.');
176
+ }
177
+ openid4vpOptions = { type: 'openId4VpDcApi', clientId, origin: options.origin, verifierGeneratedNonce: nonce };
178
+ }
179
+ else {
180
+ const responseUri = authorizationRequestPayload.response_uri ?? authorizationRequestPayload.redirect_uri;
181
+ if (!responseUri) {
182
+ throw new core_1.CredoError('Missing required parameter `response_uri` or `redirect_uri` in the authorization request.');
183
+ }
184
+ openid4vpOptions = {
185
+ type: 'openId4Vp',
186
+ mdocGeneratedNonce: authorizationResponseNonce,
187
+ responseUri,
188
+ clientId,
189
+ verifierGeneratedNonce: nonce,
190
+ };
191
+ }
192
+ let vpToken;
193
+ let presentationSubmission = undefined;
194
+ const parsedTransactionData = authorizationRequestPayload.transaction_data
195
+ ? (0, openid4vp_1.parseTransactionData)({
196
+ transactionData: authorizationRequestPayload.transaction_data,
197
+ })
198
+ : undefined;
199
+ // Handle presentation exchange part
200
+ if (authorizationRequestPayload.presentation_definition || presentationExchange) {
201
+ if (!presentationExchange) {
202
+ throw new core_1.CredoError('Authorization request included presentation definition. `presentationExchange` MUST be supplied to accept authorization requests.');
203
+ }
204
+ if (!authorizationRequestPayload.presentation_definition) {
205
+ throw new core_1.CredoError('`presentationExchange` was supplied, but no presentation definition was found in the presentation request.');
206
+ }
207
+ const credentialsWithTransactionData = this.extendCredentialsWithTransactionDataHashes(presentationExchange.credentials, parsedTransactionData, transactionData);
208
+ const { presentationSubmission: _presentationSubmission, encodedVerifiablePresentations } = await this.presentationExchangeService.createPresentation(agentContext, {
209
+ credentialsForInputDescriptor: credentialsWithTransactionData,
210
+ presentationDefinition: authorizationRequestPayload.presentation_definition,
211
+ challenge: nonce,
212
+ domain: clientId,
213
+ presentationSubmissionLocation: core_1.DifPresentationExchangeSubmissionLocation.EXTERNAL,
214
+ openid4vp: openid4vpOptions,
215
+ });
216
+ vpToken =
217
+ encodedVerifiablePresentations.length === 1 && _presentationSubmission?.descriptor_map[0]?.path === '$'
218
+ ? encodedVerifiablePresentations[0]
219
+ : encodedVerifiablePresentations;
220
+ presentationSubmission = _presentationSubmission;
221
+ }
222
+ else if (authorizationRequestPayload.dcql_query || dcql) {
223
+ if (!authorizationRequestPayload.dcql_query) {
224
+ throw new core_1.CredoError(`'dcql' was supplied, but no dcql request was found in the presentation request.`);
225
+ }
226
+ if (!dcql) {
227
+ throw new core_1.CredoError(`Authorization request included dcql request. 'dcql' MUST be supplied to accept authorization requests.`);
228
+ }
229
+ const credentialsWithTransactionData = this.extendCredentialsWithTransactionDataHashes(dcql.credentials, parsedTransactionData, transactionData);
230
+ const { encodedDcqlPresentation } = await this.dcqlService.createPresentation(agentContext, {
231
+ credentialQueryToCredential: credentialsWithTransactionData,
232
+ challenge: nonce,
233
+ domain: clientId,
234
+ openid4vp: openid4vpOptions,
235
+ });
236
+ vpToken = encodedDcqlPresentation;
237
+ }
238
+ else {
239
+ throw new core_1.CredoError('Either pex or dcql must be provided');
240
+ }
241
+ const response = await openid4vpClient.createOpenid4vpAuthorizationResponse({
242
+ authorizationRequestPayload,
243
+ authorizationResponsePayload: {
244
+ vp_token: vpToken,
245
+ presentation_submission: presentationSubmission,
246
+ },
247
+ jarm: authorizationRequestPayload.response_mode && (0, openid4vp_1.isJarmResponseMode)(authorizationRequestPayload.response_mode)
248
+ ? {
249
+ encryption: { nonce: authorizationResponseNonce },
250
+ serverMetadata: {
251
+ authorization_signing_alg_values_supported: [],
252
+ authorization_encryption_alg_values_supported: ['ECDH-ES'],
253
+ authorization_encryption_enc_values_supported: ['A128GCM', 'A256GCM', 'A128CBC-HS256'],
254
+ },
255
+ }
256
+ : undefined,
257
+ });
258
+ const authorizationResponsePayload = response.authorizationResponsePayload;
259
+ const authorizationResponse = response.jarm?.responseJwt
260
+ ? { response: response.jarm.responseJwt }
261
+ : authorizationResponsePayload;
262
+ // TODO: we should include more typing here that the user
263
+ // still needs to submit the response. or as we discussed, split
264
+ // this method up in create and submit
265
+ if ((0, openid4vp_1.isOpenid4vpAuthorizationRequestDcApi)(authorizationRequestPayload)) {
266
+ return {
267
+ ok: true,
268
+ authorizationResponse,
269
+ authorizationResponsePayload,
270
+ };
271
+ }
272
+ // TODO: parse response in openi4vp library so we can have typed error
273
+ // as well as typed response (with redirect_uri/presentation_during_issuance_session)
274
+ const result = await openid4vpClient.submitOpenid4vpAuthorizationResponse({
275
+ authorizationRequestPayload,
276
+ authorizationResponsePayload: response.authorizationResponsePayload,
277
+ jarm: response.jarm ? { responseJwt: response.jarm.responseJwt } : undefined,
278
+ });
279
+ const responseText = await result.response
280
+ .clone()
281
+ .text()
282
+ .catch(() => null);
283
+ const responseJson = (await result.response
284
+ .clone()
285
+ .json()
286
+ .catch(() => null));
287
+ if (!result.response.ok) {
288
+ return {
289
+ ok: false,
290
+ serverResponse: {
291
+ status: result.response.status,
292
+ body: responseJson ?? responseText,
293
+ },
294
+ authorizationResponse,
295
+ authorizationResponsePayload,
296
+ };
297
+ }
298
+ return {
299
+ ok: true,
300
+ serverResponse: {
301
+ status: result.response.status,
302
+ body: responseJson ?? {},
303
+ },
304
+ authorizationResponse,
305
+ authorizationResponsePayload,
306
+ redirectUri: responseJson?.redirect_uri,
307
+ presentationDuringIssuanceSession: responseJson?.presentation_during_issuance_session,
308
+ };
309
+ }
310
+ };
311
+ exports.OpenId4VpHolderService = OpenId4VpHolderService;
312
+ exports.OpenId4VpHolderService = OpenId4VpHolderService = __decorate([
313
+ (0, core_1.injectable)(),
314
+ __metadata("design:paramtypes", [core_1.DifPresentationExchangeService,
315
+ core_1.DcqlService])
316
+ ], OpenId4VpHolderService);
317
+ //# sourceMappingURL=OpenId4vpHolderService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpenId4vpHolderService.js","sourceRoot":"","sources":["../../src/openid4vc-holder/OpenId4vpHolderService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ import type { DcqlCredentialsForRequest, DcqlQueryResult, DifPexCredentialsForRequest, DifPexInputDescriptorToCredentials, DifPresentationExchangeDefinition, EncodedX509Certificate } from '@credo-ts/core';
2
+ import { ResolvedOpenid4vpAuthorizationRequest } from '@openid4vc/openid4vp';
3
+ import type { OpenId4VpAuthorizationRequestPayload } from '../shared';
4
+ export type ParsedTransactionDataEntry = NonNullable<ResolvedOpenid4vpAuthorizationRequest['transactionData']>[number];
5
+ export interface ResolveOpenId4VpAuthorizationRequestOptions {
6
+ trustedCertificates?: EncodedX509Certificate[];
7
+ origin?: string;
8
+ }
9
+ export interface OpenId4VpResolvedAuthorizationRequest {
10
+ /**
11
+ * Parameters related to DIF Presentation Exchange. Only defined when
12
+ * the request included
13
+ */
14
+ presentationExchange?: {
15
+ definition: DifPresentationExchangeDefinition;
16
+ credentialsForRequest: DifPexCredentialsForRequest;
17
+ };
18
+ dcql?: {
19
+ queryResult: DcqlQueryResult;
20
+ };
21
+ /**
22
+ * The transaction data entries, with the matched credential ids.
23
+ * - For Presentation Exchange the id refers to the presentation exchange id
24
+ * - For DCQL the id refers to the credential query id
25
+ *
26
+ * If no matches were found the `matchedCredentialIds` will be empty and means
27
+ * the presetnation cannot be satisfied.
28
+ *
29
+ * The entries have the same order as the transaction data entries from the request
30
+ */
31
+ transactionData?: Array<{
32
+ entry: ParsedTransactionDataEntry;
33
+ matchedCredentialIds: string[];
34
+ }>;
35
+ /**
36
+ * The authorization request payload
37
+ */
38
+ authorizationRequestPayload: OpenId4VpAuthorizationRequestPayload;
39
+ /**
40
+ * Origin of the request, to be used with Digital Credentials API
41
+ */
42
+ origin?: string;
43
+ }
44
+ export interface OpenId4VpAcceptAuthorizationRequestOptions {
45
+ /**
46
+ * Parameters related to DIF Presentation Exchange. MUST be present when the resolved
47
+ * authorization request included a `presentationExchange` parameter.
48
+ */
49
+ presentationExchange?: {
50
+ credentials: DifPexInputDescriptorToCredentials;
51
+ };
52
+ /**
53
+ * Parameters related to Dcql. MUST be present when the resolved
54
+ * authorization request included a `dcql` parameter.
55
+ */
56
+ dcql?: {
57
+ credentials: DcqlCredentialsForRequest;
58
+ };
59
+ /**
60
+ * The credentials to use for the transaction data hashes in the presentation. The length
61
+ * of the array MUST be the same length as the transaction data entries in the authorization
62
+ * request, and follow the same order (meaning the first entry in this array matches the first
63
+ * entry in the transaction data from the request).
64
+ *
65
+ * - For Presentation Exchange the id refers to the presentation exchange id
66
+ * - For DCQL the id refers to the credential query id
67
+ *
68
+ */
69
+ transactionData?: Array<{
70
+ credentialId: string;
71
+ }>;
72
+ /**
73
+ * The authorization request payload
74
+ */
75
+ authorizationRequestPayload: OpenId4VpAuthorizationRequestPayload;
76
+ /**
77
+ * The origin of the verifier that is making the request.
78
+ * Required in combination with the DC Api
79
+ */
80
+ origin?: string;
81
+ }
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=OpenId4vcSiopHolderServiceOptions.js.map
3
+ //# sourceMappingURL=OpenId4vpHolderServiceOptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpenId4vpHolderServiceOptions.js","sourceRoot":"","sources":["../../src/openid4vc-holder/OpenId4vpHolderServiceOptions.ts"],"names":[],"mappings":""}
@@ -2,5 +2,5 @@ export * from './OpenId4VcHolderApi';
2
2
  export * from './OpenId4VcHolderModule';
3
3
  export * from './OpenId4VciHolderService';
4
4
  export * from './OpenId4VciHolderServiceOptions';
5
- export * from './OpenId4vcSiopHolderService';
6
- export * from './OpenId4vcSiopHolderServiceOptions';
5
+ export * from './OpenId4vpHolderService';
6
+ export * from './OpenId4vpHolderServiceOptions';
@@ -18,6 +18,6 @@ __exportStar(require("./OpenId4VcHolderApi"), exports);
18
18
  __exportStar(require("./OpenId4VcHolderModule"), exports);
19
19
  __exportStar(require("./OpenId4VciHolderService"), exports);
20
20
  __exportStar(require("./OpenId4VciHolderServiceOptions"), exports);
21
- __exportStar(require("./OpenId4vcSiopHolderService"), exports);
22
- __exportStar(require("./OpenId4vcSiopHolderServiceOptions"), exports);
21
+ __exportStar(require("./OpenId4vpHolderService"), exports);
22
+ __exportStar(require("./OpenId4vpHolderServiceOptions"), exports);
23
23
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/openid4vc-holder/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,uDAAoC;AACpC,0DAAuC;AACvC,4DAAyC;AACzC,mEAAgD;AAChD,+DAA4C;AAC5C,sEAAmD"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/openid4vc-holder/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,uDAAoC;AACpC,0DAAuC;AACvC,4DAAyC;AACzC,mEAAgD;AAChD,2DAAwC;AACxC,kEAA+C"}
@@ -1,6 +1,6 @@
1
+ import type { BaseEvent } from '@credo-ts/core';
1
2
  import type { OpenId4VcIssuanceSessionState } from './OpenId4VcIssuanceSessionState';
2
3
  import type { OpenId4VcIssuanceSessionRecord } from './repository';
3
- import type { BaseEvent } from '@credo-ts/core';
4
4
  export declare enum OpenId4VcIssuerEvents {
5
5
  IssuanceSessionStateChanged = "OpenId4VcIssuer.IssuanceSessionStateChanged"
6
6
  }
@@ -1,5 +1,5 @@
1
- import type { OpenId4VcIssuerModuleConfigOptions } from './OpenId4VcIssuerModuleConfig';
2
1
  import type { AgentContext, DependencyManager, Module } from '@credo-ts/core';
2
+ import type { OpenId4VcIssuerModuleConfigOptions } from './OpenId4VcIssuerModuleConfig';
3
3
  import { OpenId4VcIssuerApi } from './OpenId4VcIssuerApi';
4
4
  import { OpenId4VcIssuerModuleConfig } from './OpenId4VcIssuerModuleConfig';
5
5
  /**
@@ -1,5 +1,5 @@
1
- import type { OpenId4VciCredentialRequestToCredentialMapper, OpenId4VciGetVerificationSessionForIssuanceSessionAuthorization } from './OpenId4VcIssuerServiceOptions';
2
1
  import type { Router } from 'express';
2
+ import type { OpenId4VciCredentialRequestToCredentialMapper, OpenId4VciGetVerificationSessionForIssuanceSessionAuthorization } from './OpenId4VcIssuerServiceOptions';
3
3
  export interface OpenId4VcIssuerModuleConfigOptions {
4
4
  /**
5
5
  * Base url at which the issuer endpoints will be hosted. All endpoints will be exposed with
@@ -1,7 +1,6 @@
1
- import type { OpenId4VciCreateCredentialOfferOptions, OpenId4VciCreateCredentialResponseOptions, OpenId4VciCreateIssuerOptions, OpenId4VciCreateStatelessCredentialOfferOptions } from './OpenId4VcIssuerServiceOptions';
2
1
  import type { OpenId4VciMetadata } from '../shared';
3
- import type { AgentContext, Query, QueryOptions } from '@credo-ts/core';
4
- import { W3cCredentialService } from '@credo-ts/core';
2
+ import type { OpenId4VciCreateCredentialOfferOptions, OpenId4VciCreateCredentialResponseOptions, OpenId4VciCreateIssuerOptions, OpenId4VciCreateStatelessCredentialOfferOptions } from './OpenId4VcIssuerServiceOptions';
3
+ import { AgentContext, Query, QueryOptions, W3cCredentialService } from '@credo-ts/core';
5
4
  import { Oauth2AuthorizationServer, Oauth2Client, Oauth2ResourceServer } from '@openid4vc/oauth2';
6
5
  import { Openid4vciIssuer } from '@openid4vc/openid4vci';
7
6
  import { OpenId4VcIssuanceSessionState } from './OpenId4VcIssuanceSessionState';
@@ -82,10 +82,10 @@ let OpenId4VcIssuerService = class OpenId4VcIssuerService {
82
82
  throw new core_1.CredoError('You need to offer at least one credential.');
83
83
  }
84
84
  // We always use shortened URIs currently
85
+ const credentialOfferId = core_1.utils.uuid();
85
86
  const hostedCredentialOfferUri = (0, core_1.joinUriParts)(issuerMetadata.credentialIssuer.credential_issuer, [
86
87
  this.openId4VcIssuerConfig.credentialOfferEndpointPath,
87
- // It doesn't really matter what the url is, as long as it's unique
88
- core_1.utils.uuid(),
88
+ credentialOfferId,
89
89
  ]);
90
90
  // Check if all the offered credential configuration ids have a scope value. If not, it won't be possible to actually request
91
91
  // issuance of the credential later on. For pre-auth it's not needed to add a scope.
@@ -115,6 +115,7 @@ let OpenId4VcIssuerService = class OpenId4VcIssuerService {
115
115
  const issuanceSession = new repository_1.OpenId4VcIssuanceSessionRecord({
116
116
  credentialOfferPayload: credentialOfferObject,
117
117
  credentialOfferUri: hostedCredentialOfferUri,
118
+ credentialOfferId,
118
119
  issuerId: issuer.issuerId,
119
120
  state: OpenId4VcIssuanceSessionState_1.OpenId4VcIssuanceSessionState.OfferCreated,
120
121
  authorization: credentialOfferObject.grants?.authorization_code?.issuer_state
@@ -634,7 +635,7 @@ let OpenId4VcIssuerService = class OpenId4VcIssuerService {
634
635
  credentials: (await Promise.all(signOptions.credentials.map((credential) => this.signW3cCredential(agentContext, signOptions.format, credential).then((signed) => signed.encoded)))),
635
636
  };
636
637
  }
637
- else if (signOptions.format === core_1.ClaimFormat.SdJwtVc) {
638
+ if (signOptions.format === core_1.ClaimFormat.SdJwtVc) {
638
639
  if (signOptions.format !== requestFormat.format) {
639
640
  throw new core_1.CredoError(`Invalid credential format returned by sign options. Expected '${requestFormat.format}', received '${signOptions.format}'.`);
640
641
  }
@@ -648,7 +649,7 @@ let OpenId4VcIssuerService = class OpenId4VcIssuerService {
648
649
  credentials: await Promise.all(signOptions.credentials.map((credential) => sdJwtVcApi.sign(credential).then((signed) => signed.compact))),
649
650
  };
650
651
  }
651
- else if (signOptions.format === core_1.ClaimFormat.MsoMdoc) {
652
+ if (signOptions.format === core_1.ClaimFormat.MsoMdoc) {
652
653
  if (signOptions.format !== requestFormat.format) {
653
654
  throw new core_1.CredoError(`Invalid credential format returned by sign options. Expected '${requestFormat.format}', received '${signOptions.format}'.`);
654
655
  }
@@ -662,9 +663,7 @@ let OpenId4VcIssuerService = class OpenId4VcIssuerService {
662
663
  credentials: await Promise.all(signOptions.credentials.map((credential) => mdocApi.sign(credential).then((signed) => signed.base64Url))),
663
664
  };
664
665
  }
665
- else {
666
- throw new core_1.CredoError(`Unsupported credential format ${signOptions.format}`);
667
- }
666
+ throw new core_1.CredoError(`Unsupported credential format ${signOptions.format}`);
668
667
  }
669
668
  async signW3cCredential(agentContext, format, options) {
670
669
  const key = await (0, utils_1.getKeyFromDid)(agentContext, options.verificationMethod);
@@ -684,15 +683,13 @@ let OpenId4VcIssuerService = class OpenId4VcIssuerService {
684
683
  alg,
685
684
  });
686
685
  }
687
- else {
688
- const proofType = (0, utils_1.getProofTypeFromKey)(agentContext, key);
689
- return await this.w3cCredentialService.signCredential(agentContext, {
690
- format: core_1.ClaimFormat.LdpVc,
691
- credential: options.credential,
692
- verificationMethod: options.verificationMethod,
693
- proofType: proofType,
694
- });
695
- }
686
+ const proofType = (0, utils_1.getProofTypeFromKey)(agentContext, key);
687
+ return await this.w3cCredentialService.signCredential(agentContext, {
688
+ format: core_1.ClaimFormat.LdpVc,
689
+ credential: options.credential,
690
+ verificationMethod: options.verificationMethod,
691
+ proofType: proofType,
692
+ });
696
693
  }
697
694
  };
698
695
  exports.OpenId4VcIssuerService = OpenId4VcIssuerService;