@sphereon/ssi-sdk.siopv2-oid4vp-op-auth 0.34.1-feature.SSISDK.45.94 → 0.34.1-feature.SSISDK.46.40
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.
- package/dist/index.cjs +1095 -573
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +111 -709
- package/dist/index.d.ts +111 -709
- package/dist/index.js +1043 -521
- package/dist/index.js.map +1 -1
- package/package.json +25 -24
- package/src/agent/DidAuthSiopOpAuthenticator.ts +144 -9
- package/src/index.ts +1 -2
- package/src/machine/Siopv2Machine.ts +4 -4
- package/src/services/Siopv2MachineService.ts +265 -133
- package/src/session/OID4VP.ts +299 -310
- package/src/session/OpSession.ts +114 -22
- package/src/types/IDidAuthSiopOpAuthenticator.ts +58 -5
- package/src/types/identifier/index.ts +4 -0
- package/src/types/siop-service/index.ts +3 -1
- package/src/utils/CredentialUtils.ts +39 -1
- package/src/utils/dcql.ts +19 -21
package/dist/index.js
CHANGED
|
@@ -35,340 +35,344 @@ var require_nl = __commonJS({
|
|
|
35
35
|
});
|
|
36
36
|
|
|
37
37
|
// plugin.schema.json
|
|
38
|
-
var
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
38
|
+
var require_plugin_schema = __commonJS({
|
|
39
|
+
"plugin.schema.json"(exports, module) {
|
|
40
|
+
module.exports = {
|
|
41
|
+
IDidAuthSiopOpAuthenticator: {
|
|
42
|
+
components: {
|
|
43
|
+
schemas: {
|
|
44
|
+
IGetSiopSessionArgs: {
|
|
45
|
+
type: "object",
|
|
46
|
+
properties: {
|
|
47
|
+
sessionId: {
|
|
48
|
+
type: "string"
|
|
49
|
+
},
|
|
50
|
+
additionalProperties: false
|
|
51
|
+
},
|
|
52
|
+
required: ["sessionId"],
|
|
53
|
+
description: "Arguments needed for {@link DidAuthSiopOpAuthenticator.getSessionForSiop } "
|
|
47
54
|
},
|
|
48
|
-
|
|
49
|
-
},
|
|
50
|
-
required: ["sessionId"],
|
|
51
|
-
description: "Arguments needed for {@link DidAuthSiopOpAuthenticator.getSessionForSiop } "
|
|
52
|
-
},
|
|
53
|
-
IRegisterSiopSessionArgs: {
|
|
54
|
-
type: "object",
|
|
55
|
-
properties: {
|
|
56
|
-
identifier: {
|
|
55
|
+
IRegisterSiopSessionArgs: {
|
|
57
56
|
type: "object",
|
|
58
57
|
properties: {
|
|
59
|
-
|
|
58
|
+
identifier: {
|
|
59
|
+
type: "object",
|
|
60
|
+
properties: {
|
|
61
|
+
did: {
|
|
62
|
+
type: "string"
|
|
63
|
+
},
|
|
64
|
+
alias: {
|
|
65
|
+
type: "string"
|
|
66
|
+
},
|
|
67
|
+
provider: {
|
|
68
|
+
type: "string"
|
|
69
|
+
},
|
|
70
|
+
controllerKeyId: {
|
|
71
|
+
type: "string"
|
|
72
|
+
},
|
|
73
|
+
keys: {
|
|
74
|
+
type: "array",
|
|
75
|
+
items: {
|
|
76
|
+
type: "object",
|
|
77
|
+
properties: {
|
|
78
|
+
additionalProperties: true
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
services: {
|
|
83
|
+
type: "array",
|
|
84
|
+
items: {
|
|
85
|
+
type: "object",
|
|
86
|
+
properties: {
|
|
87
|
+
additionalProperties: true
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
additionalProperties: false,
|
|
93
|
+
required: ["did", "provider", "keys", "services"]
|
|
94
|
+
},
|
|
95
|
+
sessionId: {
|
|
60
96
|
type: "string"
|
|
61
97
|
},
|
|
62
|
-
|
|
98
|
+
expiresIn: {
|
|
99
|
+
type: "number"
|
|
100
|
+
},
|
|
101
|
+
additionalProperties: false
|
|
102
|
+
},
|
|
103
|
+
required: ["identifier"],
|
|
104
|
+
description: "Arguments needed for {@link DidAuthSiopOpAuthenticator.registerSessionForSiop } "
|
|
105
|
+
},
|
|
106
|
+
IRemoveSiopSessionArgs: {
|
|
107
|
+
type: "object",
|
|
108
|
+
properties: {
|
|
109
|
+
sessionId: {
|
|
63
110
|
type: "string"
|
|
64
111
|
},
|
|
65
|
-
|
|
112
|
+
additionalProperties: false
|
|
113
|
+
},
|
|
114
|
+
required: ["sessionId"],
|
|
115
|
+
description: "Arguments needed for {@link DidAuthSiopOpAuthenticator.removeSessionForSiop } "
|
|
116
|
+
},
|
|
117
|
+
IAuthenticateWithSiopArgs: {
|
|
118
|
+
type: "object",
|
|
119
|
+
properties: {
|
|
120
|
+
sessionId: {
|
|
66
121
|
type: "string"
|
|
67
122
|
},
|
|
68
|
-
|
|
123
|
+
stateId: {
|
|
69
124
|
type: "string"
|
|
70
125
|
},
|
|
71
|
-
|
|
72
|
-
type: "
|
|
73
|
-
items: {
|
|
74
|
-
type: "object",
|
|
75
|
-
properties: {
|
|
76
|
-
additionalProperties: true
|
|
77
|
-
}
|
|
78
|
-
}
|
|
126
|
+
redirectUrl: {
|
|
127
|
+
type: "string"
|
|
79
128
|
},
|
|
80
|
-
|
|
81
|
-
type: "array",
|
|
82
|
-
items: {
|
|
83
|
-
type: "object",
|
|
84
|
-
properties: {
|
|
85
|
-
additionalProperties: true
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
}
|
|
129
|
+
additionalProperties: false
|
|
89
130
|
},
|
|
90
|
-
|
|
91
|
-
|
|
131
|
+
required: ["sessionId", "stateId", "redirectUrl"],
|
|
132
|
+
description: "Arguments needed for {@link DidAuthSiopOpAuthenticator.authenticateWithSiop } "
|
|
92
133
|
},
|
|
93
|
-
|
|
94
|
-
type: "string"
|
|
95
|
-
},
|
|
96
|
-
expiresIn: {
|
|
97
|
-
type: "number"
|
|
98
|
-
},
|
|
99
|
-
additionalProperties: false
|
|
100
|
-
},
|
|
101
|
-
required: ["identifier"],
|
|
102
|
-
description: "Arguments needed for {@link DidAuthSiopOpAuthenticator.registerSessionForSiop } "
|
|
103
|
-
},
|
|
104
|
-
IRemoveSiopSessionArgs: {
|
|
105
|
-
type: "object",
|
|
106
|
-
properties: {
|
|
107
|
-
sessionId: {
|
|
108
|
-
type: "string"
|
|
109
|
-
},
|
|
110
|
-
additionalProperties: false
|
|
111
|
-
},
|
|
112
|
-
required: ["sessionId"],
|
|
113
|
-
description: "Arguments needed for {@link DidAuthSiopOpAuthenticator.removeSessionForSiop } "
|
|
114
|
-
},
|
|
115
|
-
IAuthenticateWithSiopArgs: {
|
|
116
|
-
type: "object",
|
|
117
|
-
properties: {
|
|
118
|
-
sessionId: {
|
|
119
|
-
type: "string"
|
|
120
|
-
},
|
|
121
|
-
stateId: {
|
|
122
|
-
type: "string"
|
|
123
|
-
},
|
|
124
|
-
redirectUrl: {
|
|
125
|
-
type: "string"
|
|
126
|
-
},
|
|
127
|
-
additionalProperties: false
|
|
128
|
-
},
|
|
129
|
-
required: ["sessionId", "stateId", "redirectUrl"],
|
|
130
|
-
description: "Arguments needed for {@link DidAuthSiopOpAuthenticator.authenticateWithSiop } "
|
|
131
|
-
},
|
|
132
|
-
IResponse: {
|
|
133
|
-
type: "object",
|
|
134
|
-
properties: {
|
|
135
|
-
status: {
|
|
136
|
-
type: "number"
|
|
137
|
-
},
|
|
138
|
-
additionalProperties: true
|
|
139
|
-
},
|
|
140
|
-
required: ["status"],
|
|
141
|
-
description: "Result of {@link DidAuthSiopOpAuthenticator.authenticateWithSiop & DidAuthSiopOpAuthenticator.sendSiopAuthenticationResponse } "
|
|
142
|
-
},
|
|
143
|
-
IGetSiopAuthenticationRequestFromRpArgs: {
|
|
144
|
-
type: "object",
|
|
145
|
-
properties: {
|
|
146
|
-
sessionId: {
|
|
147
|
-
type: "string"
|
|
148
|
-
},
|
|
149
|
-
stateId: {
|
|
150
|
-
type: "string"
|
|
151
|
-
},
|
|
152
|
-
redirectUrl: {
|
|
153
|
-
type: "string"
|
|
154
|
-
},
|
|
155
|
-
additionalProperties: false
|
|
156
|
-
},
|
|
157
|
-
required: ["sessionId", "stateId", "redirectUrl"],
|
|
158
|
-
description: "Arguments needed for {@link DidAuthSiopOpAuthenticator.getSiopAuthenticationRequestFromRP } "
|
|
159
|
-
},
|
|
160
|
-
ParsedAuthenticationRequestURI: {
|
|
161
|
-
type: "object",
|
|
162
|
-
properties: {
|
|
163
|
-
jwt: {
|
|
164
|
-
type: "string"
|
|
165
|
-
},
|
|
166
|
-
requestPayload: {
|
|
134
|
+
IResponse: {
|
|
167
135
|
type: "object",
|
|
168
136
|
properties: {
|
|
137
|
+
status: {
|
|
138
|
+
type: "number"
|
|
139
|
+
},
|
|
169
140
|
additionalProperties: true
|
|
170
|
-
}
|
|
141
|
+
},
|
|
142
|
+
required: ["status"],
|
|
143
|
+
description: "Result of {@link DidAuthSiopOpAuthenticator.authenticateWithSiop & DidAuthSiopOpAuthenticator.sendSiopAuthenticationResponse } "
|
|
171
144
|
},
|
|
172
|
-
|
|
145
|
+
IGetSiopAuthenticationRequestFromRpArgs: {
|
|
173
146
|
type: "object",
|
|
174
147
|
properties: {
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
148
|
+
sessionId: {
|
|
149
|
+
type: "string"
|
|
150
|
+
},
|
|
151
|
+
stateId: {
|
|
152
|
+
type: "string"
|
|
153
|
+
},
|
|
154
|
+
redirectUrl: {
|
|
155
|
+
type: "string"
|
|
156
|
+
},
|
|
157
|
+
additionalProperties: false
|
|
158
|
+
},
|
|
159
|
+
required: ["sessionId", "stateId", "redirectUrl"],
|
|
160
|
+
description: "Arguments needed for {@link DidAuthSiopOpAuthenticator.getSiopAuthenticationRequestFromRP } "
|
|
188
161
|
},
|
|
189
|
-
|
|
162
|
+
ParsedAuthenticationRequestURI: {
|
|
190
163
|
type: "object",
|
|
191
164
|
properties: {
|
|
192
|
-
|
|
193
|
-
|
|
165
|
+
jwt: {
|
|
166
|
+
type: "string"
|
|
167
|
+
},
|
|
168
|
+
requestPayload: {
|
|
169
|
+
type: "object",
|
|
170
|
+
properties: {
|
|
171
|
+
additionalProperties: true
|
|
172
|
+
}
|
|
173
|
+
},
|
|
174
|
+
registration: {
|
|
175
|
+
type: "object",
|
|
176
|
+
properties: {
|
|
177
|
+
additionalProperties: true
|
|
178
|
+
}
|
|
179
|
+
},
|
|
180
|
+
additionalProperties: false
|
|
181
|
+
},
|
|
182
|
+
required: ["jwt", "requestPayload", "registration"],
|
|
183
|
+
description: "Result of {@link DidAuthSiopOpAuthenticator.getSiopAuthenticationRequestFromRP } "
|
|
194
184
|
},
|
|
195
|
-
|
|
185
|
+
IGetSiopAuthenticationRequestDetailsArgs: {
|
|
196
186
|
type: "object",
|
|
197
187
|
properties: {
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
}
|
|
188
|
+
sessionId: {
|
|
189
|
+
type: "string"
|
|
190
|
+
},
|
|
191
|
+
verifiedAuthenticationRequest: {
|
|
192
|
+
type: "object",
|
|
193
|
+
properties: {
|
|
194
|
+
additionalProperties: true
|
|
195
|
+
}
|
|
196
|
+
},
|
|
197
|
+
credentialFilter: {
|
|
198
|
+
type: "object",
|
|
199
|
+
properties: {
|
|
200
|
+
additionalProperties: true
|
|
201
|
+
}
|
|
202
|
+
},
|
|
203
|
+
additionalProperties: false
|
|
204
|
+
},
|
|
205
|
+
required: ["sessionId", "verifiedAuthenticationRequest"],
|
|
206
|
+
description: "Arguments needed for {@link DidAuthSiopOpAuthenticator.getSiopAuthenticationRequestDetails } "
|
|
217
207
|
},
|
|
218
|
-
|
|
208
|
+
IAuthRequestDetails: {
|
|
219
209
|
type: "object",
|
|
220
210
|
properties: {
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
211
|
+
id: {
|
|
212
|
+
type: "string"
|
|
213
|
+
},
|
|
214
|
+
alsoKnownAs: {
|
|
215
|
+
type: "array",
|
|
216
|
+
items: {
|
|
217
|
+
type: "string"
|
|
218
|
+
}
|
|
219
|
+
},
|
|
220
|
+
vpResponseOpts: {
|
|
221
|
+
type: "object",
|
|
222
|
+
properties: {
|
|
223
|
+
additionalProperties: true
|
|
224
|
+
}
|
|
225
|
+
},
|
|
226
|
+
additionalProperties: false
|
|
227
|
+
},
|
|
228
|
+
required: ["id", "vpResponseOpts"],
|
|
229
|
+
description: "Result of {@link DidAuthSiopOpAuthenticator.getSiopAuthenticationRequestDetails } "
|
|
234
230
|
},
|
|
235
|
-
|
|
231
|
+
IVerifySiopAuthenticationRequestUriArgs: {
|
|
236
232
|
type: "object",
|
|
237
233
|
properties: {
|
|
238
|
-
|
|
239
|
-
|
|
234
|
+
sessionId: {
|
|
235
|
+
type: "string"
|
|
236
|
+
},
|
|
237
|
+
ParsedAuthenticationRequestURI: {
|
|
238
|
+
type: "object",
|
|
239
|
+
properties: {
|
|
240
|
+
additionalProperties: true
|
|
241
|
+
}
|
|
242
|
+
},
|
|
243
|
+
additionalProperties: false
|
|
244
|
+
},
|
|
245
|
+
required: ["sessionId", "ParsedAuthenticationRequestURI"],
|
|
246
|
+
description: "Arguments needed for {@link DidAuthSiopOpAuthenticator.verifySiopAuthenticationRequestURI } "
|
|
240
247
|
},
|
|
241
|
-
|
|
242
|
-
},
|
|
243
|
-
required: ["sessionId", "ParsedAuthenticationRequestURI"],
|
|
244
|
-
description: "Arguments needed for {@link DidAuthSiopOpAuthenticator.verifySiopAuthenticationRequestURI } "
|
|
245
|
-
},
|
|
246
|
-
VerifiedAuthorizationRequest: {
|
|
247
|
-
type: "object",
|
|
248
|
-
properties: {
|
|
249
|
-
payload: {
|
|
248
|
+
VerifiedAuthorizationRequest: {
|
|
250
249
|
type: "object",
|
|
251
250
|
properties: {
|
|
252
|
-
|
|
253
|
-
|
|
251
|
+
payload: {
|
|
252
|
+
type: "object",
|
|
253
|
+
properties: {
|
|
254
|
+
additionalProperties: true
|
|
255
|
+
}
|
|
256
|
+
},
|
|
257
|
+
presentationDefinitions: {
|
|
258
|
+
type: "object",
|
|
259
|
+
properties: {
|
|
260
|
+
additionalProperties: true
|
|
261
|
+
}
|
|
262
|
+
},
|
|
263
|
+
verifyOpts: {
|
|
264
|
+
type: "object",
|
|
265
|
+
properties: {
|
|
266
|
+
additionalProperties: true
|
|
267
|
+
}
|
|
268
|
+
},
|
|
269
|
+
additionalProperties: false
|
|
270
|
+
},
|
|
271
|
+
required: ["payload", "verifyOpts"],
|
|
272
|
+
description: "Result of {@link DidAuthSiopOpAuthenticator.verifySiopAuthenticationRequestURI } "
|
|
254
273
|
},
|
|
255
|
-
|
|
274
|
+
ISendSiopAuthenticationResponseArgs: {
|
|
256
275
|
type: "object",
|
|
257
276
|
properties: {
|
|
258
|
-
|
|
259
|
-
|
|
277
|
+
sessionId: {
|
|
278
|
+
type: "string"
|
|
279
|
+
},
|
|
280
|
+
verifiedAuthenticationRequest: {
|
|
281
|
+
type: "object",
|
|
282
|
+
properties: {
|
|
283
|
+
additionalProperties: true
|
|
284
|
+
}
|
|
285
|
+
},
|
|
286
|
+
verifiablePresentationResponse: {
|
|
287
|
+
type: "object",
|
|
288
|
+
properties: {
|
|
289
|
+
additionalProperties: true
|
|
290
|
+
}
|
|
291
|
+
},
|
|
292
|
+
additionalProperties: false
|
|
293
|
+
},
|
|
294
|
+
required: ["sessionId", "verifiedAuthenticationRequest"],
|
|
295
|
+
description: "Arguments needed for {@link DidAuthSiopOpAuthenticator.sendSiopAuthenticationResponse } "
|
|
296
|
+
}
|
|
297
|
+
},
|
|
298
|
+
methods: {
|
|
299
|
+
getSessionForSiop: {
|
|
300
|
+
description: "Get SIOP session",
|
|
301
|
+
arguments: {
|
|
302
|
+
$ref: "#/components/schemas/IGetSiopSessionArgs"
|
|
303
|
+
},
|
|
304
|
+
returnType: "object"
|
|
260
305
|
},
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
306
|
+
registerSessionForSiop: {
|
|
307
|
+
description: "Register SIOP session",
|
|
308
|
+
arguments: {
|
|
309
|
+
$ref: "#/components/schemas/IRegisterSiopSessionArgs"
|
|
310
|
+
},
|
|
311
|
+
returnType: "object"
|
|
312
|
+
},
|
|
313
|
+
removeSessionForSiop: {
|
|
314
|
+
description: "Remove SIOP session",
|
|
315
|
+
arguments: {
|
|
316
|
+
$ref: "#/components/schemas/IRemoveSiopSessionArgs"
|
|
317
|
+
},
|
|
318
|
+
returnType: "boolean"
|
|
319
|
+
},
|
|
320
|
+
authenticateWithSiop: {
|
|
321
|
+
description: "Authenticate using DID Auth SIOP",
|
|
322
|
+
arguments: {
|
|
323
|
+
$ref: "#/components/schemas/IAuthenticateWithSiopArgs"
|
|
324
|
+
},
|
|
325
|
+
returnType: {
|
|
326
|
+
$ref: "#/components/schemas/Response"
|
|
265
327
|
}
|
|
266
328
|
},
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
sessionId: {
|
|
276
|
-
type: "string"
|
|
329
|
+
getSiopAuthenticationRequestFromRP: {
|
|
330
|
+
description: "Get authentication request from RP",
|
|
331
|
+
arguments: {
|
|
332
|
+
$ref: "#/components/schemas/IGetSiopAuthenticationRequestFromRpArgs"
|
|
333
|
+
},
|
|
334
|
+
returnType: {
|
|
335
|
+
$ref: "#/components/schemas/ParsedAuthenticationRequestURI"
|
|
336
|
+
}
|
|
277
337
|
},
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
338
|
+
getSiopAuthenticationRequestDetails: {
|
|
339
|
+
description: "Get authentication request details",
|
|
340
|
+
arguments: {
|
|
341
|
+
$ref: "#/components/schemas/IGetSiopAuthenticationRequestDetailsArgs"
|
|
342
|
+
},
|
|
343
|
+
returnType: {
|
|
344
|
+
$ref: "#/components/schemas/IAuthRequestDetails"
|
|
282
345
|
}
|
|
283
346
|
},
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
347
|
+
verifySiopAuthenticationRequestURI: {
|
|
348
|
+
description: "Verify authentication request URI",
|
|
349
|
+
arguments: {
|
|
350
|
+
$ref: "#/components/schemas/IVerifySiopAuthenticationRequestUriArgs"
|
|
351
|
+
},
|
|
352
|
+
returnType: {
|
|
353
|
+
$ref: "#/components/schemas/VerifiedAuthorizationRequest"
|
|
288
354
|
}
|
|
289
355
|
},
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
arguments: {
|
|
300
|
-
$ref: "#/components/schemas/IGetSiopSessionArgs"
|
|
301
|
-
},
|
|
302
|
-
returnType: "object"
|
|
303
|
-
},
|
|
304
|
-
registerSessionForSiop: {
|
|
305
|
-
description: "Register SIOP session",
|
|
306
|
-
arguments: {
|
|
307
|
-
$ref: "#/components/schemas/IRegisterSiopSessionArgs"
|
|
308
|
-
},
|
|
309
|
-
returnType: "object"
|
|
310
|
-
},
|
|
311
|
-
removeSessionForSiop: {
|
|
312
|
-
description: "Remove SIOP session",
|
|
313
|
-
arguments: {
|
|
314
|
-
$ref: "#/components/schemas/IRemoveSiopSessionArgs"
|
|
315
|
-
},
|
|
316
|
-
returnType: "boolean"
|
|
317
|
-
},
|
|
318
|
-
authenticateWithSiop: {
|
|
319
|
-
description: "Authenticate using DID Auth SIOP",
|
|
320
|
-
arguments: {
|
|
321
|
-
$ref: "#/components/schemas/IAuthenticateWithSiopArgs"
|
|
322
|
-
},
|
|
323
|
-
returnType: {
|
|
324
|
-
$ref: "#/components/schemas/Response"
|
|
325
|
-
}
|
|
326
|
-
},
|
|
327
|
-
getSiopAuthenticationRequestFromRP: {
|
|
328
|
-
description: "Get authentication request from RP",
|
|
329
|
-
arguments: {
|
|
330
|
-
$ref: "#/components/schemas/IGetSiopAuthenticationRequestFromRpArgs"
|
|
331
|
-
},
|
|
332
|
-
returnType: {
|
|
333
|
-
$ref: "#/components/schemas/ParsedAuthenticationRequestURI"
|
|
334
|
-
}
|
|
335
|
-
},
|
|
336
|
-
getSiopAuthenticationRequestDetails: {
|
|
337
|
-
description: "Get authentication request details",
|
|
338
|
-
arguments: {
|
|
339
|
-
$ref: "#/components/schemas/IGetSiopAuthenticationRequestDetailsArgs"
|
|
340
|
-
},
|
|
341
|
-
returnType: {
|
|
342
|
-
$ref: "#/components/schemas/IAuthRequestDetails"
|
|
343
|
-
}
|
|
344
|
-
},
|
|
345
|
-
verifySiopAuthenticationRequestURI: {
|
|
346
|
-
description: "Verify authentication request URI",
|
|
347
|
-
arguments: {
|
|
348
|
-
$ref: "#/components/schemas/IVerifySiopAuthenticationRequestUriArgs"
|
|
349
|
-
},
|
|
350
|
-
returnType: {
|
|
351
|
-
$ref: "#/components/schemas/VerifiedAuthorizationRequest"
|
|
352
|
-
}
|
|
353
|
-
},
|
|
354
|
-
sendSiopAuthenticationResponse: {
|
|
355
|
-
description: "Send authentication response",
|
|
356
|
-
arguments: {
|
|
357
|
-
$ref: "#/components/schemas/ISendSiopAuthenticationResponseArgs"
|
|
358
|
-
},
|
|
359
|
-
returnType: {
|
|
360
|
-
$ref: "#/components/schemas/IRequiredContext"
|
|
356
|
+
sendSiopAuthenticationResponse: {
|
|
357
|
+
description: "Send authentication response",
|
|
358
|
+
arguments: {
|
|
359
|
+
$ref: "#/components/schemas/ISendSiopAuthenticationResponseArgs"
|
|
360
|
+
},
|
|
361
|
+
returnType: {
|
|
362
|
+
$ref: "#/components/schemas/IRequiredContext"
|
|
363
|
+
}
|
|
364
|
+
}
|
|
361
365
|
}
|
|
362
366
|
}
|
|
363
367
|
}
|
|
364
|
-
}
|
|
368
|
+
};
|
|
365
369
|
}
|
|
366
|
-
};
|
|
370
|
+
});
|
|
367
371
|
|
|
368
372
|
// src/agent/DidAuthSiopOpAuthenticator.ts
|
|
369
|
-
import { decodeUriAsJson } from "@sphereon/did-auth-siop";
|
|
370
|
-
import { ConnectionType as ConnectionType2, CorrelationIdentifierType, IdentityOrigin } from "@sphereon/ssi-sdk.data-store";
|
|
371
|
-
import { Loggers as Loggers4
|
|
373
|
+
import { decodeUriAsJson, SupportedVersion as SupportedVersion3 } from "@sphereon/did-auth-siop";
|
|
374
|
+
import { ConnectionType as ConnectionType2, CorrelationIdentifierType, CredentialDocumentFormat, CredentialRole as CredentialRole2, DocumentType, IdentityOrigin } from "@sphereon/ssi-sdk.data-store";
|
|
375
|
+
import { Loggers as Loggers4 } from "@sphereon/ssi-types";
|
|
372
376
|
import { v4 as uuidv4 } from "uuid";
|
|
373
377
|
|
|
374
378
|
// src/session/functions.ts
|
|
@@ -524,15 +528,104 @@ function getSigningAlgo(type) {
|
|
|
524
528
|
}
|
|
525
529
|
__name(getSigningAlgo, "getSigningAlgo");
|
|
526
530
|
|
|
531
|
+
// src/session/OID4VP.ts
|
|
532
|
+
import { PresentationExchange } from "@sphereon/did-auth-siop";
|
|
533
|
+
import { Status } from "@sphereon/pex";
|
|
534
|
+
import { isManagedIdentifierDidResult, isOID4VCIssuerIdentifier } from "@sphereon/ssi-sdk-ext.identifier-resolution";
|
|
535
|
+
import { defaultHasher } from "@sphereon/ssi-sdk.core";
|
|
536
|
+
import { verifiableCredentialForRoleFilter } from "@sphereon/ssi-sdk.credential-store";
|
|
537
|
+
|
|
538
|
+
// src/types/IDidAuthSiopOpAuthenticator.ts
|
|
539
|
+
var LOGGER_NAMESPACE = "sphereon:siopv2-oid4vp:op-auth";
|
|
540
|
+
var events = /* @__PURE__ */ (function(events2) {
|
|
541
|
+
events2["DID_SIOP_AUTHENTICATED"] = "didSiopAuthenticated";
|
|
542
|
+
return events2;
|
|
543
|
+
})({});
|
|
544
|
+
var DEFAULT_JWT_PROOF_TYPE = "JwtProof2020";
|
|
545
|
+
|
|
546
|
+
// src/types/siop-service/index.ts
|
|
547
|
+
var Siopv2HolderEvent = /* @__PURE__ */ (function(Siopv2HolderEvent2) {
|
|
548
|
+
Siopv2HolderEvent2["CONTACT_IDENTITY_CREATED"] = "contact_identity_created";
|
|
549
|
+
Siopv2HolderEvent2["IDENTIFIER_CREATED"] = "identifier_created";
|
|
550
|
+
return Siopv2HolderEvent2;
|
|
551
|
+
})({});
|
|
552
|
+
var SupportedLanguage = /* @__PURE__ */ (function(SupportedLanguage2) {
|
|
553
|
+
SupportedLanguage2["ENGLISH"] = "en";
|
|
554
|
+
SupportedLanguage2["DUTCH"] = "nl";
|
|
555
|
+
return SupportedLanguage2;
|
|
556
|
+
})({});
|
|
557
|
+
|
|
558
|
+
// src/types/machine/index.ts
|
|
559
|
+
var Siopv2MachineStates = /* @__PURE__ */ (function(Siopv2MachineStates2) {
|
|
560
|
+
Siopv2MachineStates2["createConfig"] = "createConfig";
|
|
561
|
+
Siopv2MachineStates2["getSiopRequest"] = "getSiopRequest";
|
|
562
|
+
Siopv2MachineStates2["getSelectableCredentials"] = "getSelectableCredentials";
|
|
563
|
+
Siopv2MachineStates2["retrieveContact"] = "retrieveContact";
|
|
564
|
+
Siopv2MachineStates2["transitionFromSetup"] = "transitionFromSetup";
|
|
565
|
+
Siopv2MachineStates2["addContact"] = "addContact";
|
|
566
|
+
Siopv2MachineStates2["addContactIdentity"] = "addContactIdentity";
|
|
567
|
+
Siopv2MachineStates2["selectCredentials"] = "selectCredentials";
|
|
568
|
+
Siopv2MachineStates2["sendResponse"] = "sendResponse";
|
|
569
|
+
Siopv2MachineStates2["handleError"] = "handleError";
|
|
570
|
+
Siopv2MachineStates2["aborted"] = "aborted";
|
|
571
|
+
Siopv2MachineStates2["declined"] = "declined";
|
|
572
|
+
Siopv2MachineStates2["error"] = "error";
|
|
573
|
+
Siopv2MachineStates2["done"] = "done";
|
|
574
|
+
return Siopv2MachineStates2;
|
|
575
|
+
})({});
|
|
576
|
+
var Siopv2MachineAddContactStates = /* @__PURE__ */ (function(Siopv2MachineAddContactStates2) {
|
|
577
|
+
Siopv2MachineAddContactStates2["idle"] = "idle";
|
|
578
|
+
Siopv2MachineAddContactStates2["executing"] = "executing";
|
|
579
|
+
Siopv2MachineAddContactStates2["next"] = "next";
|
|
580
|
+
return Siopv2MachineAddContactStates2;
|
|
581
|
+
})({});
|
|
582
|
+
var Siopv2MachineEvents = /* @__PURE__ */ (function(Siopv2MachineEvents2) {
|
|
583
|
+
Siopv2MachineEvents2["NEXT"] = "NEXT";
|
|
584
|
+
Siopv2MachineEvents2["PREVIOUS"] = "PREVIOUS";
|
|
585
|
+
Siopv2MachineEvents2["DECLINE"] = "DECLINE";
|
|
586
|
+
Siopv2MachineEvents2["SET_CONTACT_ALIAS"] = "SET_CONTACT_ALIAS";
|
|
587
|
+
Siopv2MachineEvents2["SET_CONTACT_CONSENT"] = "SET_CONTACT_CONSENT";
|
|
588
|
+
Siopv2MachineEvents2["CREATE_CONTACT"] = "CREATE_CONTACT";
|
|
589
|
+
Siopv2MachineEvents2["SET_SELECTED_CREDENTIALS"] = "SET_SELECTED_CREDENTIALS";
|
|
590
|
+
return Siopv2MachineEvents2;
|
|
591
|
+
})({});
|
|
592
|
+
var Siopv2MachineGuards = /* @__PURE__ */ (function(Siopv2MachineGuards2) {
|
|
593
|
+
Siopv2MachineGuards2["hasNoContactGuard"] = "Siopv2HasNoContactGuard";
|
|
594
|
+
Siopv2MachineGuards2["createContactGuard"] = "Siopv2CreateContactGuard";
|
|
595
|
+
Siopv2MachineGuards2["hasContactGuard"] = "Siopv2HasContactGuard";
|
|
596
|
+
Siopv2MachineGuards2["hasAuthorizationRequestGuard"] = "Siopv2HasAuthorizationRequestGuard";
|
|
597
|
+
Siopv2MachineGuards2["hasSelectableCredentialsAndContactGuard"] = "Siopv2HasSelectableCredentialsAndContactGuard";
|
|
598
|
+
Siopv2MachineGuards2["hasSelectedRequiredCredentialsGuard"] = "Siopv2HasSelectedRequiredCredentialsGuard";
|
|
599
|
+
Siopv2MachineGuards2["siopOnlyGuard"] = "Siopv2IsSiopOnlyGuard";
|
|
600
|
+
Siopv2MachineGuards2["siopWithOID4VPGuard"] = "Siopv2IsSiopWithOID4VPGuard";
|
|
601
|
+
return Siopv2MachineGuards2;
|
|
602
|
+
})({});
|
|
603
|
+
var Siopv2MachineServices = /* @__PURE__ */ (function(Siopv2MachineServices2) {
|
|
604
|
+
Siopv2MachineServices2["getSiopRequest"] = "getSiopRequest";
|
|
605
|
+
Siopv2MachineServices2["getSelectableCredentials"] = "getSelectableCredentials";
|
|
606
|
+
Siopv2MachineServices2["retrieveContact"] = "retrieveContact";
|
|
607
|
+
Siopv2MachineServices2["addContactIdentity"] = "addContactIdentity";
|
|
608
|
+
Siopv2MachineServices2["sendResponse"] = "sendResponse";
|
|
609
|
+
Siopv2MachineServices2["createConfig"] = "createConfig";
|
|
610
|
+
return Siopv2MachineServices2;
|
|
611
|
+
})({});
|
|
612
|
+
|
|
613
|
+
// src/types/identifier/index.ts
|
|
614
|
+
var DID_PREFIX = "did";
|
|
615
|
+
|
|
527
616
|
// src/session/OID4VP.ts
|
|
528
617
|
var OID4VP = class _OID4VP {
|
|
529
618
|
static {
|
|
530
619
|
__name(this, "OID4VP");
|
|
531
620
|
}
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
621
|
+
session;
|
|
622
|
+
allIdentifiers;
|
|
623
|
+
hasher;
|
|
535
624
|
constructor(args) {
|
|
625
|
+
const { session, allIdentifiers, hasher = defaultHasher } = args;
|
|
626
|
+
this.session = session;
|
|
627
|
+
this.allIdentifiers = allIdentifiers ?? [];
|
|
628
|
+
this.hasher = hasher;
|
|
536
629
|
}
|
|
537
630
|
static async init(session, allIdentifiers, hasher) {
|
|
538
631
|
return new _OID4VP({
|
|
@@ -541,14 +634,184 @@ var OID4VP = class _OID4VP {
|
|
|
541
634
|
hasher
|
|
542
635
|
});
|
|
543
636
|
}
|
|
637
|
+
async getPresentationDefinitions() {
|
|
638
|
+
const definitions = await this.session.getPresentationDefinitions();
|
|
639
|
+
if (definitions) {
|
|
640
|
+
PresentationExchange.assertValidPresentationDefinitionWithLocations(definitions);
|
|
641
|
+
}
|
|
642
|
+
return definitions;
|
|
643
|
+
}
|
|
644
|
+
getPresentationExchange(args) {
|
|
645
|
+
const { verifiableCredentials, allIdentifiers, hasher } = args;
|
|
646
|
+
return new PresentationExchange({
|
|
647
|
+
allDIDs: allIdentifiers ?? this.allIdentifiers,
|
|
648
|
+
allVerifiableCredentials: verifiableCredentials,
|
|
649
|
+
hasher: hasher ?? this.hasher
|
|
650
|
+
});
|
|
651
|
+
}
|
|
652
|
+
async createVerifiablePresentations(credentialRole, credentialsWithDefinitions, opts) {
|
|
653
|
+
return await Promise.all(credentialsWithDefinitions.map((cred) => this.createVerifiablePresentation(credentialRole, cred, opts)));
|
|
654
|
+
}
|
|
655
|
+
async createVerifiablePresentation(credentialRole, selectedVerifiableCredentials, opts) {
|
|
656
|
+
const { subjectIsHolder, holder, forceNoCredentialsInVP = false } = {
|
|
657
|
+
...opts
|
|
658
|
+
};
|
|
659
|
+
if (subjectIsHolder && holder) {
|
|
660
|
+
throw Error("Cannot both have subject is holder and a holderDID value at the same time (programming error)");
|
|
661
|
+
}
|
|
662
|
+
if (forceNoCredentialsInVP) {
|
|
663
|
+
selectedVerifiableCredentials.credentials = [];
|
|
664
|
+
} else if (!selectedVerifiableCredentials?.credentials || selectedVerifiableCredentials.credentials.length === 0) {
|
|
665
|
+
throw Error("No verifiable verifiableCredentials provided for presentation definition");
|
|
666
|
+
}
|
|
667
|
+
const proofOptions = {
|
|
668
|
+
...opts?.proofOpts,
|
|
669
|
+
challenge: opts?.proofOpts?.nonce ?? opts?.proofOpts?.challenge ?? this.session.nonce,
|
|
670
|
+
domain: opts?.proofOpts?.domain ?? await this.session.getRedirectUri()
|
|
671
|
+
};
|
|
672
|
+
let idOpts2 = opts?.idOpts;
|
|
673
|
+
if (!idOpts2) {
|
|
674
|
+
if (opts?.subjectIsHolder) {
|
|
675
|
+
if (forceNoCredentialsInVP) {
|
|
676
|
+
return Promise.reject(Error(`Cannot have subject is holder, when force no credentials is being used, as we could never determine the holder then. Please provide holderDID`));
|
|
677
|
+
}
|
|
678
|
+
const firstUniqueDC = selectedVerifiableCredentials.credentials[0];
|
|
679
|
+
if (typeof firstUniqueDC !== "object" || !("digitalCredential" in firstUniqueDC)) {
|
|
680
|
+
return Promise.reject(Error("If no opts provided, credentials should be of type UniqueDigitalCredential"));
|
|
681
|
+
}
|
|
682
|
+
idOpts2 = isOID4VCIssuerIdentifier(firstUniqueDC.digitalCredential.kmsKeyRef) ? await this.session.context.agent.identifierManagedGetByIssuer({
|
|
683
|
+
identifier: firstUniqueDC.digitalCredential.kmsKeyRef
|
|
684
|
+
}) : await this.session.context.agent.identifierManagedGetByKid({
|
|
685
|
+
identifier: firstUniqueDC.digitalCredential.kmsKeyRef,
|
|
686
|
+
kmsKeyRef: firstUniqueDC.digitalCredential.kmsKeyRef
|
|
687
|
+
});
|
|
688
|
+
} else if (opts?.holder) {
|
|
689
|
+
idOpts2 = {
|
|
690
|
+
identifier: opts.holder
|
|
691
|
+
};
|
|
692
|
+
}
|
|
693
|
+
}
|
|
694
|
+
const vcs = forceNoCredentialsInVP ? selectedVerifiableCredentials : opts?.applyFilter ? await this.filterCredentials(credentialRole, selectedVerifiableCredentials.definition, {
|
|
695
|
+
restrictToFormats: opts?.restrictToFormats,
|
|
696
|
+
restrictToDIDMethods: opts?.restrictToDIDMethods,
|
|
697
|
+
filterOpts: {
|
|
698
|
+
verifiableCredentials: selectedVerifiableCredentials.credentials
|
|
699
|
+
}
|
|
700
|
+
}) : {
|
|
701
|
+
definition: selectedVerifiableCredentials.definition,
|
|
702
|
+
credentials: selectedVerifiableCredentials.credentials
|
|
703
|
+
};
|
|
704
|
+
if (!idOpts2) {
|
|
705
|
+
return Promise.reject(Error(`No identifier options present at this point`));
|
|
706
|
+
}
|
|
707
|
+
const signCallback = await createOID4VPPresentationSignCallback({
|
|
708
|
+
presentationSignCallback: this.session.options.presentationSignCallback,
|
|
709
|
+
idOpts: idOpts2,
|
|
710
|
+
context: this.session.context,
|
|
711
|
+
domain: proofOptions.domain,
|
|
712
|
+
challenge: proofOptions.challenge,
|
|
713
|
+
format: opts?.restrictToFormats ?? selectedVerifiableCredentials.definition.definition.format,
|
|
714
|
+
skipDidResolution: opts?.skipDidResolution ?? false
|
|
715
|
+
});
|
|
716
|
+
const identifier = await this.session.context.agent.identifierManagedGet(idOpts2);
|
|
717
|
+
const verifiableCredentials = vcs.credentials.map((credential) => typeof credential === "object" && "digitalCredential" in credential ? credential.originalVerifiableCredential : credential);
|
|
718
|
+
const presentationResult = await this.getPresentationExchange({
|
|
719
|
+
verifiableCredentials,
|
|
720
|
+
allIdentifiers: this.allIdentifiers,
|
|
721
|
+
hasher: opts?.hasher
|
|
722
|
+
}).createVerifiablePresentation(vcs.definition.definition, verifiableCredentials, signCallback, {
|
|
723
|
+
proofOptions,
|
|
724
|
+
// fixme: Update to newer siop-vp to not require dids here. But when Veramo is creating the VP it's still looking at this field to pass into didManagerGet
|
|
725
|
+
...identifier && isManagedIdentifierDidResult(identifier) && {
|
|
726
|
+
holderDID: identifier.did
|
|
727
|
+
}
|
|
728
|
+
});
|
|
729
|
+
const verifiablePresentations = presentationResult.verifiablePresentations.map((verifiablePresentation) => typeof verifiablePresentation !== "string" && "proof" in verifiablePresentation && "jwt" in verifiablePresentation.proof && verifiablePresentation.proof.jwt ? verifiablePresentation.proof.jwt : verifiablePresentation);
|
|
730
|
+
return {
|
|
731
|
+
...presentationResult,
|
|
732
|
+
verifiablePresentations,
|
|
733
|
+
verifiableCredentials,
|
|
734
|
+
definition: selectedVerifiableCredentials.definition,
|
|
735
|
+
idOpts: idOpts2
|
|
736
|
+
};
|
|
737
|
+
}
|
|
738
|
+
async filterCredentialsAgainstAllDefinitions(credentialRole, opts) {
|
|
739
|
+
const defs = await this.getPresentationDefinitions();
|
|
740
|
+
const result = [];
|
|
741
|
+
if (defs) {
|
|
742
|
+
for (const definition of defs) {
|
|
743
|
+
result.push(await this.filterCredentials(credentialRole, definition, opts));
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
return result;
|
|
747
|
+
}
|
|
748
|
+
async filterCredentials(credentialRole, presentationDefinition, opts) {
|
|
749
|
+
const udcMap = /* @__PURE__ */ new Map();
|
|
750
|
+
opts?.filterOpts?.verifiableCredentials?.forEach((credential) => {
|
|
751
|
+
if (typeof credential === "object" && "digitalCredential" in credential) {
|
|
752
|
+
udcMap.set(credential.originalVerifiableCredential, credential);
|
|
753
|
+
} else {
|
|
754
|
+
udcMap.set(credential, credential);
|
|
755
|
+
}
|
|
756
|
+
});
|
|
757
|
+
const credentials = (await this.filterCredentialsWithSelectionStatus(credentialRole, presentationDefinition, {
|
|
758
|
+
...opts,
|
|
759
|
+
filterOpts: {
|
|
760
|
+
verifiableCredentials: opts?.filterOpts?.verifiableCredentials?.map((credential) => {
|
|
761
|
+
if (typeof credential === "object" && "digitalCredential" in credential) {
|
|
762
|
+
return credential.originalVerifiableCredential;
|
|
763
|
+
} else {
|
|
764
|
+
return credential;
|
|
765
|
+
}
|
|
766
|
+
})
|
|
767
|
+
}
|
|
768
|
+
})).verifiableCredential;
|
|
769
|
+
return {
|
|
770
|
+
definition: presentationDefinition,
|
|
771
|
+
credentials: credentials?.map((vc) => udcMap.get(vc)) ?? []
|
|
772
|
+
};
|
|
773
|
+
}
|
|
774
|
+
async filterCredentialsWithSelectionStatus(credentialRole, presentationDefinition, opts) {
|
|
775
|
+
const selectionResults = await this.getPresentationExchange({
|
|
776
|
+
verifiableCredentials: await this.getCredentials(credentialRole, opts?.filterOpts)
|
|
777
|
+
}).selectVerifiableCredentialsForSubmission(presentationDefinition.definition, opts);
|
|
778
|
+
if (selectionResults.errors && selectionResults.errors.length > 0) {
|
|
779
|
+
throw Error(JSON.stringify(selectionResults.errors));
|
|
780
|
+
} else if (selectionResults.areRequiredCredentialsPresent === Status.ERROR) {
|
|
781
|
+
throw Error(`Not all required credentials are available to satisfy the relying party's request`);
|
|
782
|
+
}
|
|
783
|
+
const matches = selectionResults.matches;
|
|
784
|
+
if (!matches || matches.length === 0 || !selectionResults.verifiableCredential || selectionResults.verifiableCredential.length === 0) {
|
|
785
|
+
throw Error(JSON.stringify(selectionResults.errors));
|
|
786
|
+
}
|
|
787
|
+
return selectionResults;
|
|
788
|
+
}
|
|
789
|
+
async getCredentials(credentialRole, filterOpts) {
|
|
790
|
+
if (filterOpts?.verifiableCredentials && filterOpts.verifiableCredentials.length > 0) {
|
|
791
|
+
return filterOpts.verifiableCredentials;
|
|
792
|
+
}
|
|
793
|
+
const filter = verifiableCredentialForRoleFilter(credentialRole, filterOpts?.filter);
|
|
794
|
+
const uniqueCredentials = await this.session.context.agent.crsGetUniqueCredentials({
|
|
795
|
+
filter
|
|
796
|
+
});
|
|
797
|
+
return uniqueCredentials.map((uniqueVC) => {
|
|
798
|
+
const vc = uniqueVC.uniformVerifiableCredential;
|
|
799
|
+
const proof = Array.isArray(vc.proof) ? vc.proof : [
|
|
800
|
+
vc.proof
|
|
801
|
+
];
|
|
802
|
+
const jwtProof = proof.find((p) => p?.type === DEFAULT_JWT_PROOF_TYPE);
|
|
803
|
+
return jwtProof ? jwtProof.jwt : vc;
|
|
804
|
+
});
|
|
805
|
+
}
|
|
544
806
|
};
|
|
545
807
|
|
|
546
808
|
// src/session/OpSession.ts
|
|
547
809
|
import { OP as OP2, URI } from "@sphereon/did-auth-siop";
|
|
548
810
|
import { getAgentDIDMethods, getAgentResolver } from "@sphereon/ssi-sdk-ext.did-utils";
|
|
549
811
|
import { encodeBase64url } from "@sphereon/ssi-sdk.core";
|
|
550
|
-
import { parseDid } from "@sphereon/ssi-types";
|
|
812
|
+
import { CredentialMapper, parseDid } from "@sphereon/ssi-types";
|
|
551
813
|
import { v4 } from "uuid";
|
|
814
|
+
import { PEX } from "@sphereon/pex";
|
|
552
815
|
import { Loggers } from "@sphereon/ssi-types";
|
|
553
816
|
var logger = Loggers.DEFAULT.get("sphereon:oid4vp:OpSession");
|
|
554
817
|
var OpSession = class _OpSession {
|
|
@@ -563,11 +826,13 @@ var OpSession = class _OpSession {
|
|
|
563
826
|
verifiedAuthorizationRequest;
|
|
564
827
|
_nonce;
|
|
565
828
|
_state;
|
|
829
|
+
_providedPresentationDefinitions;
|
|
566
830
|
constructor(options) {
|
|
567
831
|
this.id = options.sessionId;
|
|
568
832
|
this.options = options.op;
|
|
569
833
|
this.context = options.context;
|
|
570
834
|
this.requestJwtOrUri = options.requestJwtOrUri;
|
|
835
|
+
this._providedPresentationDefinitions = options.providedPresentationDefinitions;
|
|
571
836
|
}
|
|
572
837
|
static async init(options) {
|
|
573
838
|
return new _OpSession(options);
|
|
@@ -665,7 +930,7 @@ var OpSession = class _OpSession {
|
|
|
665
930
|
subjectSyntaxTypesSupported
|
|
666
931
|
]).map((method) => convertDidMethod(method, opts.didPrefix));
|
|
667
932
|
}
|
|
668
|
-
const isEBSI = rpMethods.length === 0 && (authReq.issuer?.includes(".ebsi.eu") || authReq.authorizationRequest.getMergedProperty("client_id")?.includes(".ebsi.eu"));
|
|
933
|
+
const isEBSI = rpMethods.length === 0 && (authReq.issuer?.includes(".ebsi.eu") || (await authReq.authorizationRequest.getMergedProperty("client_id"))?.includes(".ebsi.eu"));
|
|
669
934
|
let codecName = void 0;
|
|
670
935
|
if (isEBSI && (!aud || !aud.startsWith("http"))) {
|
|
671
936
|
logger.debug(`EBSI detected, adding did:key to supported DID methods for RP`);
|
|
@@ -720,9 +985,51 @@ var OpSession = class _OpSession {
|
|
|
720
985
|
async getRedirectUri() {
|
|
721
986
|
return Promise.resolve(this.verifiedAuthorizationRequest.responseURI);
|
|
722
987
|
}
|
|
988
|
+
async hasPresentationDefinitions() {
|
|
989
|
+
const defs = this._providedPresentationDefinitions ?? (await this.getAuthorizationRequest()).presentationDefinitions;
|
|
990
|
+
return defs !== void 0 && defs.length > 0;
|
|
991
|
+
}
|
|
992
|
+
async getPresentationDefinitions() {
|
|
993
|
+
if (!await this.hasPresentationDefinitions()) {
|
|
994
|
+
throw Error(`No presentation definitions found`);
|
|
995
|
+
}
|
|
996
|
+
return this._providedPresentationDefinitions ?? (await this.getAuthorizationRequest()).presentationDefinitions;
|
|
997
|
+
}
|
|
723
998
|
async getOID4VP(args) {
|
|
724
999
|
return await OID4VP.init(this, args.allIdentifiers ?? [], args.hasher);
|
|
725
1000
|
}
|
|
1001
|
+
createPresentationVerificationCallback(context) {
|
|
1002
|
+
async function presentationVerificationCallback(args, presentationSubmission) {
|
|
1003
|
+
let result;
|
|
1004
|
+
if (CredentialMapper.isSdJwtEncoded(args)) {
|
|
1005
|
+
try {
|
|
1006
|
+
const sdJwtResult = await context.agent.verifySdJwtPresentation({
|
|
1007
|
+
presentation: args
|
|
1008
|
+
});
|
|
1009
|
+
result = {
|
|
1010
|
+
verified: "header" in sdJwtResult,
|
|
1011
|
+
error: "header" in sdJwtResult ? void 0 : {
|
|
1012
|
+
message: "could not verify SD JWT presentation"
|
|
1013
|
+
}
|
|
1014
|
+
};
|
|
1015
|
+
} catch (error) {
|
|
1016
|
+
result = {
|
|
1017
|
+
verified: false,
|
|
1018
|
+
error: {
|
|
1019
|
+
message: error.message
|
|
1020
|
+
}
|
|
1021
|
+
};
|
|
1022
|
+
}
|
|
1023
|
+
} else {
|
|
1024
|
+
result = await context.agent.verifyPresentation({
|
|
1025
|
+
presentation: args
|
|
1026
|
+
});
|
|
1027
|
+
}
|
|
1028
|
+
return result;
|
|
1029
|
+
}
|
|
1030
|
+
__name(presentationVerificationCallback, "presentationVerificationCallback");
|
|
1031
|
+
return presentationVerificationCallback;
|
|
1032
|
+
}
|
|
726
1033
|
async createJarmResponseCallback({ responseOpts }) {
|
|
727
1034
|
const agent = this.context.agent;
|
|
728
1035
|
return /* @__PURE__ */ __name(async function jarmResponse(opts) {
|
|
@@ -749,7 +1056,6 @@ var OpSession = class _OpSession {
|
|
|
749
1056
|
}, "jarmResponse");
|
|
750
1057
|
}
|
|
751
1058
|
async sendAuthorizationResponse(args) {
|
|
752
|
-
const { responseSignerOpts, dcqlResponse, isFirstParty } = args;
|
|
753
1059
|
const resolveOpts = this.options.resolveOpts ?? {
|
|
754
1060
|
resolver: getAgentResolver(this.context, {
|
|
755
1061
|
uniresolverResolution: true,
|
|
@@ -760,7 +1066,23 @@ var OpSession = class _OpSession {
|
|
|
760
1066
|
if (!resolveOpts.subjectSyntaxTypesSupported || resolveOpts.subjectSyntaxTypesSupported.length === 0) {
|
|
761
1067
|
resolveOpts.subjectSyntaxTypesSupported = await this.getSupportedDIDMethods(true);
|
|
762
1068
|
}
|
|
1069
|
+
const verification = {
|
|
1070
|
+
presentationVerificationCallback: this.createPresentationVerificationCallback(this.context)
|
|
1071
|
+
};
|
|
763
1072
|
const request = await this.getAuthorizationRequest();
|
|
1073
|
+
const hasDefinitions = await this.hasPresentationDefinitions();
|
|
1074
|
+
if (hasDefinitions) {
|
|
1075
|
+
const totalInputDescriptors = request.presentationDefinitions?.reduce((sum, pd) => {
|
|
1076
|
+
return sum + pd.definition.input_descriptors.length;
|
|
1077
|
+
}, 0);
|
|
1078
|
+
const totalVCs = args.verifiablePresentations ? this.countVCsInAllVPs(args.verifiablePresentations, args.hasher) : 0;
|
|
1079
|
+
if (!request.presentationDefinitions || !args.verifiablePresentations || totalVCs !== totalInputDescriptors) {
|
|
1080
|
+
throw Error(`Amount of presentations ${args.verifiablePresentations?.length}, doesn't match expected ${request.presentationDefinitions?.length}`);
|
|
1081
|
+
} else if (!args.presentationSubmission) {
|
|
1082
|
+
throw Error(`Presentation submission is required when verifiable presentations are required`);
|
|
1083
|
+
}
|
|
1084
|
+
}
|
|
1085
|
+
const verifiablePresentations = args.verifiablePresentations ? args.verifiablePresentations.map((vp) => CredentialMapper.storedPresentationToOriginalFormat(vp)) : [];
|
|
764
1086
|
const op = await createOP({
|
|
765
1087
|
opOptions: {
|
|
766
1088
|
...this.options,
|
|
@@ -772,16 +1094,23 @@ var OpSession = class _OpSession {
|
|
|
772
1094
|
wellknownDIDVerifyCallback: this.options.wellknownDIDVerifyCallback,
|
|
773
1095
|
supportedVersions: request.versions
|
|
774
1096
|
},
|
|
775
|
-
idOpts: responseSignerOpts,
|
|
1097
|
+
idOpts: args.responseSignerOpts,
|
|
776
1098
|
context: this.context
|
|
777
1099
|
});
|
|
778
|
-
let issuer = responseSignerOpts.issuer;
|
|
1100
|
+
let issuer = args.responseSignerOpts.issuer;
|
|
779
1101
|
const responseOpts = {
|
|
1102
|
+
verification,
|
|
780
1103
|
issuer,
|
|
781
|
-
...isFirstParty && {
|
|
782
|
-
isFirstParty
|
|
1104
|
+
...args.isFirstParty && {
|
|
1105
|
+
isFirstParty: args.isFirstParty
|
|
783
1106
|
},
|
|
784
|
-
|
|
1107
|
+
...args.verifiablePresentations && {
|
|
1108
|
+
presentationExchange: {
|
|
1109
|
+
verifiablePresentations,
|
|
1110
|
+
presentationSubmission: args.presentationSubmission
|
|
1111
|
+
}
|
|
1112
|
+
},
|
|
1113
|
+
dcqlQuery: args.dcqlResponse
|
|
785
1114
|
};
|
|
786
1115
|
const authResponse = await op.createAuthorizationResponse(request, responseOpts);
|
|
787
1116
|
const response = await op.submitAuthorizationResponse(authResponse, await this.createJarmResponseCallback({
|
|
@@ -793,6 +1122,24 @@ var OpSession = class _OpSession {
|
|
|
793
1122
|
return response;
|
|
794
1123
|
}
|
|
795
1124
|
}
|
|
1125
|
+
countVCsInAllVPs(verifiablePresentations, hasher) {
|
|
1126
|
+
return verifiablePresentations.reduce((sum, vp) => {
|
|
1127
|
+
if (CredentialMapper.isMsoMdocDecodedPresentation(vp) || CredentialMapper.isMsoMdocOid4VPEncoded(vp)) {
|
|
1128
|
+
return sum + 1;
|
|
1129
|
+
}
|
|
1130
|
+
const uvp = CredentialMapper.toUniformPresentation(vp, {
|
|
1131
|
+
hasher: hasher ?? this.options.hasher
|
|
1132
|
+
});
|
|
1133
|
+
if (uvp.verifiableCredential?.length) {
|
|
1134
|
+
return sum + uvp.verifiableCredential?.length;
|
|
1135
|
+
}
|
|
1136
|
+
const isSdJWT = CredentialMapper.isSdJwtDecodedCredential(uvp);
|
|
1137
|
+
if (isSdJWT || uvp.verifiableCredential && !PEX.allowMultipleVCsPerPresentation(uvp.verifiableCredential)) {
|
|
1138
|
+
return sum + 1;
|
|
1139
|
+
}
|
|
1140
|
+
return sum;
|
|
1141
|
+
}, 0);
|
|
1142
|
+
}
|
|
796
1143
|
};
|
|
797
1144
|
function convertDidMethod(didMethod, didPrefix) {
|
|
798
1145
|
if (didPrefix === false) {
|
|
@@ -802,79 +1149,10 @@ function convertDidMethod(didMethod, didPrefix) {
|
|
|
802
1149
|
}
|
|
803
1150
|
__name(convertDidMethod, "convertDidMethod");
|
|
804
1151
|
|
|
805
|
-
// src/
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
// src/types/siop-service/index.ts
|
|
810
|
-
var Siopv2HolderEvent = /* @__PURE__ */ function(Siopv2HolderEvent2) {
|
|
811
|
-
Siopv2HolderEvent2["CONTACT_IDENTITY_CREATED"] = "contact_identity_created";
|
|
812
|
-
Siopv2HolderEvent2["IDENTIFIER_CREATED"] = "identifier_created";
|
|
813
|
-
return Siopv2HolderEvent2;
|
|
814
|
-
}({});
|
|
815
|
-
var SupportedLanguage = /* @__PURE__ */ function(SupportedLanguage2) {
|
|
816
|
-
SupportedLanguage2["ENGLISH"] = "en";
|
|
817
|
-
SupportedLanguage2["DUTCH"] = "nl";
|
|
818
|
-
return SupportedLanguage2;
|
|
819
|
-
}({});
|
|
820
|
-
|
|
821
|
-
// src/types/machine/index.ts
|
|
822
|
-
var Siopv2MachineStates = /* @__PURE__ */ function(Siopv2MachineStates2) {
|
|
823
|
-
Siopv2MachineStates2["createConfig"] = "createConfig";
|
|
824
|
-
Siopv2MachineStates2["getSiopRequest"] = "getSiopRequest";
|
|
825
|
-
Siopv2MachineStates2["getSelectableCredentials"] = "getSelectableCredentials";
|
|
826
|
-
Siopv2MachineStates2["retrieveContact"] = "retrieveContact";
|
|
827
|
-
Siopv2MachineStates2["transitionFromSetup"] = "transitionFromSetup";
|
|
828
|
-
Siopv2MachineStates2["addContact"] = "addContact";
|
|
829
|
-
Siopv2MachineStates2["addContactIdentity"] = "addContactIdentity";
|
|
830
|
-
Siopv2MachineStates2["selectCredentials"] = "selectCredentials";
|
|
831
|
-
Siopv2MachineStates2["sendResponse"] = "sendResponse";
|
|
832
|
-
Siopv2MachineStates2["handleError"] = "handleError";
|
|
833
|
-
Siopv2MachineStates2["aborted"] = "aborted";
|
|
834
|
-
Siopv2MachineStates2["declined"] = "declined";
|
|
835
|
-
Siopv2MachineStates2["error"] = "error";
|
|
836
|
-
Siopv2MachineStates2["done"] = "done";
|
|
837
|
-
return Siopv2MachineStates2;
|
|
838
|
-
}({});
|
|
839
|
-
var Siopv2MachineAddContactStates = /* @__PURE__ */ function(Siopv2MachineAddContactStates2) {
|
|
840
|
-
Siopv2MachineAddContactStates2["idle"] = "idle";
|
|
841
|
-
Siopv2MachineAddContactStates2["executing"] = "executing";
|
|
842
|
-
Siopv2MachineAddContactStates2["next"] = "next";
|
|
843
|
-
return Siopv2MachineAddContactStates2;
|
|
844
|
-
}({});
|
|
845
|
-
var Siopv2MachineEvents = /* @__PURE__ */ function(Siopv2MachineEvents2) {
|
|
846
|
-
Siopv2MachineEvents2["NEXT"] = "NEXT";
|
|
847
|
-
Siopv2MachineEvents2["PREVIOUS"] = "PREVIOUS";
|
|
848
|
-
Siopv2MachineEvents2["DECLINE"] = "DECLINE";
|
|
849
|
-
Siopv2MachineEvents2["SET_CONTACT_ALIAS"] = "SET_CONTACT_ALIAS";
|
|
850
|
-
Siopv2MachineEvents2["SET_CONTACT_CONSENT"] = "SET_CONTACT_CONSENT";
|
|
851
|
-
Siopv2MachineEvents2["CREATE_CONTACT"] = "CREATE_CONTACT";
|
|
852
|
-
Siopv2MachineEvents2["SET_SELECTED_CREDENTIALS"] = "SET_SELECTED_CREDENTIALS";
|
|
853
|
-
return Siopv2MachineEvents2;
|
|
854
|
-
}({});
|
|
855
|
-
var Siopv2MachineGuards = /* @__PURE__ */ function(Siopv2MachineGuards2) {
|
|
856
|
-
Siopv2MachineGuards2["hasNoContactGuard"] = "Siopv2HasNoContactGuard";
|
|
857
|
-
Siopv2MachineGuards2["createContactGuard"] = "Siopv2CreateContactGuard";
|
|
858
|
-
Siopv2MachineGuards2["hasContactGuard"] = "Siopv2HasContactGuard";
|
|
859
|
-
Siopv2MachineGuards2["hasAuthorizationRequestGuard"] = "Siopv2HasAuthorizationRequestGuard";
|
|
860
|
-
Siopv2MachineGuards2["hasSelectableCredentialsAndContactGuard"] = "Siopv2HasSelectableCredentialsAndContactGuard";
|
|
861
|
-
Siopv2MachineGuards2["hasSelectedRequiredCredentialsGuard"] = "Siopv2HasSelectedRequiredCredentialsGuard";
|
|
862
|
-
Siopv2MachineGuards2["siopOnlyGuard"] = "Siopv2IsSiopOnlyGuard";
|
|
863
|
-
Siopv2MachineGuards2["siopWithOID4VPGuard"] = "Siopv2IsSiopWithOID4VPGuard";
|
|
864
|
-
return Siopv2MachineGuards2;
|
|
865
|
-
}({});
|
|
866
|
-
var Siopv2MachineServices = /* @__PURE__ */ function(Siopv2MachineServices2) {
|
|
867
|
-
Siopv2MachineServices2["getSiopRequest"] = "getSiopRequest";
|
|
868
|
-
Siopv2MachineServices2["getSelectableCredentials"] = "getSelectableCredentials";
|
|
869
|
-
Siopv2MachineServices2["retrieveContact"] = "retrieveContact";
|
|
870
|
-
Siopv2MachineServices2["addContactIdentity"] = "addContactIdentity";
|
|
871
|
-
Siopv2MachineServices2["sendResponse"] = "sendResponse";
|
|
872
|
-
Siopv2MachineServices2["createConfig"] = "createConfig";
|
|
873
|
-
return Siopv2MachineServices2;
|
|
874
|
-
}({});
|
|
875
|
-
|
|
876
|
-
// src/types/identifier/index.ts
|
|
877
|
-
var DID_PREFIX = "did";
|
|
1152
|
+
// src/agent/DidAuthSiopOpAuthenticator.ts
|
|
1153
|
+
import { PEX as PEX3, Status as Status2 } from "@sphereon/pex";
|
|
1154
|
+
import { computeEntryHash } from "@veramo/utils";
|
|
1155
|
+
import { DcqlQuery as DcqlQuery2 } from "dcql";
|
|
878
1156
|
|
|
879
1157
|
// src/machine/Siopv2Machine.ts
|
|
880
1158
|
import { assign, createMachine, interpret } from "xstate";
|
|
@@ -943,7 +1221,7 @@ var Siopv2HasSelectableCredentialsAndContactGuard = /* @__PURE__ */ __name((_ctx
|
|
|
943
1221
|
if (!contact) {
|
|
944
1222
|
throw new Error("Missing contact request data in context");
|
|
945
1223
|
}
|
|
946
|
-
return authorizationRequestData.
|
|
1224
|
+
return authorizationRequestData.presentationDefinitions !== void 0;
|
|
947
1225
|
}, "Siopv2HasSelectableCredentialsAndContactGuard");
|
|
948
1226
|
var Siopv2CreateContactGuard = /* @__PURE__ */ __name((_ctx, _event) => {
|
|
949
1227
|
const { contactAlias, hasContactConsent } = _ctx;
|
|
@@ -954,7 +1232,7 @@ var Siopv2HasSelectedRequiredCredentialsGuard = /* @__PURE__ */ __name((_ctx, _e
|
|
|
954
1232
|
if (authorizationRequestData === void 0) {
|
|
955
1233
|
throw new Error("Missing authorization request data in context");
|
|
956
1234
|
}
|
|
957
|
-
if (authorizationRequestData.
|
|
1235
|
+
if (authorizationRequestData.presentationDefinitions === void 0 || authorizationRequestData.presentationDefinitions.length === 0) {
|
|
958
1236
|
throw Error("No presentation definitions present");
|
|
959
1237
|
}
|
|
960
1238
|
return _ctx.selectedCredentials.length > 0;
|
|
@@ -964,7 +1242,7 @@ var Siopv2IsSiopOnlyGuard = /* @__PURE__ */ __name((_ctx, _event) => {
|
|
|
964
1242
|
if (authorizationRequestData === void 0) {
|
|
965
1243
|
throw new Error("Missing authorization request data in context");
|
|
966
1244
|
}
|
|
967
|
-
return authorizationRequestData.
|
|
1245
|
+
return authorizationRequestData.presentationDefinitions === void 0;
|
|
968
1246
|
}, "Siopv2IsSiopOnlyGuard");
|
|
969
1247
|
var Siopv2IsSiopWithOID4VPGuard = /* @__PURE__ */ __name((_ctx, _event) => {
|
|
970
1248
|
const { authorizationRequestData, selectableCredentialsMap } = _ctx;
|
|
@@ -974,7 +1252,7 @@ var Siopv2IsSiopWithOID4VPGuard = /* @__PURE__ */ __name((_ctx, _event) => {
|
|
|
974
1252
|
if (!selectableCredentialsMap) {
|
|
975
1253
|
throw new Error("Missing selectableCredentialsMap in context");
|
|
976
1254
|
}
|
|
977
|
-
return authorizationRequestData.
|
|
1255
|
+
return authorizationRequestData.presentationDefinitions !== void 0;
|
|
978
1256
|
}, "Siopv2IsSiopWithOID4VPGuard");
|
|
979
1257
|
var createSiopv2Machine = /* @__PURE__ */ __name((opts) => {
|
|
980
1258
|
const { url, idOpts: idOpts2 } = opts;
|
|
@@ -1290,57 +1568,114 @@ var Siopv2Machine = class {
|
|
|
1290
1568
|
|
|
1291
1569
|
// src/services/Siopv2MachineService.ts
|
|
1292
1570
|
import { SupportedVersion as SupportedVersion2 } from "@sphereon/did-auth-siop";
|
|
1293
|
-
import {
|
|
1294
|
-
import {
|
|
1295
|
-
import {
|
|
1296
|
-
import { CredentialRole } from "@sphereon/ssi-
|
|
1297
|
-
import { CredentialMapper as
|
|
1298
|
-
import {
|
|
1571
|
+
import { PEX as PEX2 } from "@sphereon/pex";
|
|
1572
|
+
import { isOID4VCIssuerIdentifier as isOID4VCIssuerIdentifier2 } from "@sphereon/ssi-sdk-ext.identifier-resolution";
|
|
1573
|
+
import { verifiableCredentialForRoleFilter as verifiableCredentialForRoleFilter2 } from "@sphereon/ssi-sdk.credential-store";
|
|
1574
|
+
import { ConnectionType, CredentialRole } from "@sphereon/ssi-sdk.data-store";
|
|
1575
|
+
import { CredentialMapper as CredentialMapper4, Loggers as Loggers3 } from "@sphereon/ssi-types";
|
|
1576
|
+
import { getOrCreatePrimaryIdentifier, SupportedDidMethodEnum } from "@sphereon/ssi-sdk-ext.did-utils";
|
|
1577
|
+
import { defaultHasher as defaultHasher2, encodeJoseBlob } from "@sphereon/ssi-sdk.core";
|
|
1299
1578
|
import { DcqlPresentation, DcqlQuery } from "dcql";
|
|
1300
1579
|
|
|
1301
1580
|
// src/utils/dcql.ts
|
|
1302
|
-
import { CredentialMapper as
|
|
1303
|
-
import { Dcql } from "@sphereon/did-auth-siop";
|
|
1581
|
+
import { CredentialMapper as CredentialMapper3 } from "@sphereon/ssi-types";
|
|
1304
1582
|
|
|
1305
1583
|
// src/utils/CredentialUtils.ts
|
|
1306
|
-
import { CredentialMapper } from "@sphereon/ssi-types";
|
|
1584
|
+
import { CredentialMapper as CredentialMapper2 } from "@sphereon/ssi-types";
|
|
1585
|
+
var getOriginalVerifiableCredential = /* @__PURE__ */ __name((credential) => {
|
|
1586
|
+
if (isUniqueDigitalCredential(credential)) {
|
|
1587
|
+
if (!credential.originalVerifiableCredential) {
|
|
1588
|
+
throw new Error("originalVerifiableCredential is not defined in UniqueDigitalCredential");
|
|
1589
|
+
}
|
|
1590
|
+
return getCredentialFromProofOrWrapped(credential.originalVerifiableCredential);
|
|
1591
|
+
}
|
|
1592
|
+
return getCredentialFromProofOrWrapped(credential);
|
|
1593
|
+
}, "getOriginalVerifiableCredential");
|
|
1594
|
+
var getCredentialFromProofOrWrapped = /* @__PURE__ */ __name((cred, hasher) => {
|
|
1595
|
+
if (typeof cred === "object" && "proof" in cred && "jwt" in cred.proof && CredentialMapper2.isSdJwtEncoded(cred.proof.jwt)) {
|
|
1596
|
+
return cred.proof.jwt;
|
|
1597
|
+
}
|
|
1598
|
+
return CredentialMapper2.toWrappedVerifiableCredential(cred, {
|
|
1599
|
+
hasher
|
|
1600
|
+
}).original;
|
|
1601
|
+
}, "getCredentialFromProofOrWrapped");
|
|
1307
1602
|
var isUniqueDigitalCredential = /* @__PURE__ */ __name((credential) => {
|
|
1308
1603
|
return credential.digitalCredential !== void 0;
|
|
1309
1604
|
}, "isUniqueDigitalCredential");
|
|
1310
1605
|
|
|
1311
1606
|
// src/utils/dcql.ts
|
|
1312
1607
|
function convertToDcqlCredentials(credential, hasher) {
|
|
1313
|
-
let
|
|
1608
|
+
let payload;
|
|
1314
1609
|
if (isUniqueDigitalCredential(credential)) {
|
|
1315
1610
|
if (!credential.originalVerifiableCredential) {
|
|
1316
1611
|
throw new Error("originalVerifiableCredential is not defined in UniqueDigitalCredential");
|
|
1317
1612
|
}
|
|
1318
|
-
|
|
1613
|
+
payload = CredentialMapper3.decodeVerifiableCredential(credential.originalVerifiableCredential, hasher);
|
|
1319
1614
|
} else {
|
|
1320
|
-
|
|
1615
|
+
payload = CredentialMapper3.decodeVerifiableCredential(credential, hasher);
|
|
1321
1616
|
}
|
|
1322
|
-
if (!
|
|
1617
|
+
if (!payload) {
|
|
1323
1618
|
throw new Error("No payload found");
|
|
1324
1619
|
}
|
|
1325
|
-
if (
|
|
1326
|
-
|
|
1327
|
-
}
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1620
|
+
if ("decodedPayload" in payload && payload.decodedPayload) {
|
|
1621
|
+
payload = payload.decodedPayload;
|
|
1622
|
+
}
|
|
1623
|
+
if ("vct" in payload) {
|
|
1624
|
+
return {
|
|
1625
|
+
vct: payload.vct,
|
|
1626
|
+
claims: payload,
|
|
1627
|
+
credential_format: "vc+sd-jwt"
|
|
1628
|
+
};
|
|
1629
|
+
} else if ("docType" in payload && "namespaces" in payload) {
|
|
1630
|
+
return {
|
|
1631
|
+
docType: payload.docType,
|
|
1632
|
+
namespaces: payload.namespaces,
|
|
1633
|
+
claims: payload
|
|
1634
|
+
};
|
|
1635
|
+
} else {
|
|
1636
|
+
return {
|
|
1637
|
+
claims: payload,
|
|
1638
|
+
credential_format: "jwt_vc_json"
|
|
1639
|
+
};
|
|
1333
1640
|
}
|
|
1334
|
-
throw Error(`Unable to map credential to DCQL credential. Credential: ${JSON.stringify(originalVerifiableCredential)}`);
|
|
1335
1641
|
}
|
|
1336
1642
|
__name(convertToDcqlCredentials, "convertToDcqlCredentials");
|
|
1337
1643
|
|
|
1338
1644
|
// src/services/Siopv2MachineService.ts
|
|
1339
|
-
import { getOrCreatePrimaryIdentifier, SupportedDidMethodEnum } from "@sphereon/ssi-sdk-ext.did-utils";
|
|
1340
1645
|
var logger3 = Loggers3.DEFAULT.get(LOGGER_NAMESPACE);
|
|
1646
|
+
var createEbsiIdentifier = /* @__PURE__ */ __name(async (agentContext) => {
|
|
1647
|
+
logger3.log(`No EBSI key present yet. Creating a new one...`);
|
|
1648
|
+
const { result: newIdentifier, created } = await getOrCreatePrimaryIdentifier(agentContext, {
|
|
1649
|
+
method: SupportedDidMethodEnum.DID_KEY,
|
|
1650
|
+
createOpts: {
|
|
1651
|
+
options: {
|
|
1652
|
+
codecName: "jwk_jcs-pub",
|
|
1653
|
+
type: "Secp256r1"
|
|
1654
|
+
}
|
|
1655
|
+
}
|
|
1656
|
+
});
|
|
1657
|
+
logger3.log(`EBSI key created: ${newIdentifier.did}`);
|
|
1658
|
+
if (created) {
|
|
1659
|
+
await agentContext.agent.emit(Siopv2HolderEvent.IDENTIFIER_CREATED, {
|
|
1660
|
+
result: newIdentifier
|
|
1661
|
+
});
|
|
1662
|
+
}
|
|
1663
|
+
return await agentContext.agent.identifierManagedGetByDid({
|
|
1664
|
+
identifier: newIdentifier.did
|
|
1665
|
+
});
|
|
1666
|
+
}, "createEbsiIdentifier");
|
|
1667
|
+
var hasEbsiClient = /* @__PURE__ */ __name(async (authorizationRequest) => {
|
|
1668
|
+
const clientId = await authorizationRequest.getMergedProperty("client_id");
|
|
1669
|
+
const redirectUri = await authorizationRequest.getMergedProperty("redirect_uri");
|
|
1670
|
+
return clientId?.toLowerCase().includes(".ebsi.eu") || redirectUri?.toLowerCase().includes(".ebsi.eu");
|
|
1671
|
+
}, "hasEbsiClient");
|
|
1341
1672
|
var siopSendAuthorizationResponse = /* @__PURE__ */ __name(async (connectionType, args, context) => {
|
|
1342
1673
|
const { agent } = context;
|
|
1343
|
-
const
|
|
1674
|
+
const agentContext = {
|
|
1675
|
+
...context,
|
|
1676
|
+
agent: context.agent
|
|
1677
|
+
};
|
|
1678
|
+
let { idOpts: idOpts2, isFirstParty, hasher = defaultHasher2 } = args;
|
|
1344
1679
|
if (connectionType !== ConnectionType.SIOPv2_OpenID4VP) {
|
|
1345
1680
|
return Promise.reject(Error(`No supported authentication provider for type: ${connectionType}`));
|
|
1346
1681
|
}
|
|
@@ -1348,148 +1683,252 @@ var siopSendAuthorizationResponse = /* @__PURE__ */ __name(async (connectionType
|
|
|
1348
1683
|
sessionId: args.sessionId
|
|
1349
1684
|
});
|
|
1350
1685
|
const request = await session.getAuthorizationRequest();
|
|
1351
|
-
const aud = request.authorizationRequest.getMergedProperty("aud");
|
|
1686
|
+
const aud = await request.authorizationRequest.getMergedProperty("aud");
|
|
1352
1687
|
logger3.debug(`AUD: ${aud}`);
|
|
1353
1688
|
logger3.debug(JSON.stringify(request.authorizationRequest));
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1689
|
+
let presentationsAndDefs;
|
|
1690
|
+
let presentationSubmission;
|
|
1691
|
+
if (await session.hasPresentationDefinitions()) {
|
|
1692
|
+
const oid4vp = await session.getOID4VP({
|
|
1693
|
+
hasher
|
|
1694
|
+
});
|
|
1695
|
+
const credentialsAndDefinitions = args.verifiableCredentialsWithDefinition ? args.verifiableCredentialsWithDefinition : await oid4vp.filterCredentialsAgainstAllDefinitions(CredentialRole.HOLDER);
|
|
1696
|
+
const domain = await request.authorizationRequest.getMergedProperty("client_id") ?? request.issuer ?? (request.versions.includes(SupportedVersion2.JWT_VC_PRESENTATION_PROFILE_v1) ? "https://self-issued.me/v2/openid-vc" : "https://self-issued.me/v2");
|
|
1697
|
+
logger3.log(`NONCE: ${session.nonce}, domain: ${domain}`);
|
|
1698
|
+
const firstUniqueDC = credentialsAndDefinitions[0].credentials[0];
|
|
1699
|
+
if (typeof firstUniqueDC !== "object" || !("digitalCredential" in firstUniqueDC)) {
|
|
1700
|
+
return Promise.reject(Error("SiopMachine only supports UniqueDigitalCredentials for now"));
|
|
1701
|
+
}
|
|
1702
|
+
let identifier;
|
|
1703
|
+
const digitalCredential = firstUniqueDC.digitalCredential;
|
|
1704
|
+
const firstVC = firstUniqueDC.uniformVerifiableCredential;
|
|
1705
|
+
const holder = CredentialMapper4.isSdJwtDecodedCredential(firstVC) ? firstVC.decodedPayload.cnf?.jwk ? (
|
|
1706
|
+
//doesn't apply to did:jwk only, as you can represent any DID key as a JWK. So whenever you encounter a JWK it doesn't mean it had to come from a did:jwk in the system. It just can always be represented as a did:jwk
|
|
1707
|
+
`did:jwk:${encodeJoseBlob(firstVC.decodedPayload.cnf?.jwk)}#0`
|
|
1708
|
+
) : firstVC.decodedPayload.sub : Array.isArray(firstVC.credentialSubject) ? firstVC.credentialSubject[0].id : firstVC.credentialSubject.id;
|
|
1709
|
+
if (!digitalCredential.kmsKeyRef) {
|
|
1710
|
+
if (!holder) {
|
|
1711
|
+
return Promise.reject(`No holder found and no kmsKeyRef in DB. Cannot determine identifier to use`);
|
|
1712
|
+
}
|
|
1713
|
+
try {
|
|
1714
|
+
identifier = await session.context.agent.identifierManagedGet({
|
|
1715
|
+
identifier: holder
|
|
1716
|
+
});
|
|
1717
|
+
} catch (e) {
|
|
1718
|
+
logger3.debug(`Holder DID not found: ${holder}`);
|
|
1719
|
+
throw e;
|
|
1720
|
+
}
|
|
1721
|
+
} else if (isOID4VCIssuerIdentifier2(digitalCredential.kmsKeyRef)) {
|
|
1722
|
+
identifier = await session.context.agent.identifierManagedGetByOID4VCIssuer({
|
|
1723
|
+
identifier: firstUniqueDC.digitalCredential.kmsKeyRef
|
|
1374
1724
|
});
|
|
1375
|
-
}
|
|
1376
|
-
|
|
1377
|
-
|
|
1725
|
+
} else {
|
|
1726
|
+
switch (digitalCredential.subjectCorrelationType) {
|
|
1727
|
+
case "DID":
|
|
1728
|
+
identifier = await session.context.agent.identifierManagedGetByDid({
|
|
1729
|
+
identifier: digitalCredential.subjectCorrelationId ?? holder,
|
|
1730
|
+
kmsKeyRef: digitalCredential.kmsKeyRef
|
|
1731
|
+
});
|
|
1732
|
+
break;
|
|
1733
|
+
// TODO other implementations?
|
|
1734
|
+
default:
|
|
1735
|
+
if (digitalCredential.subjectCorrelationId?.startsWith("did:") || holder?.startsWith("did:")) {
|
|
1736
|
+
identifier = await session.context.agent.identifierManagedGetByDid({
|
|
1737
|
+
identifier: digitalCredential.subjectCorrelationId ?? holder,
|
|
1738
|
+
kmsKeyRef: digitalCredential.kmsKeyRef
|
|
1739
|
+
});
|
|
1740
|
+
} else {
|
|
1741
|
+
identifier = await session.context.agent.identifierManagedGetByKid({
|
|
1742
|
+
identifier: digitalCredential.subjectCorrelationId ?? holder ?? digitalCredential.kmsKeyRef,
|
|
1743
|
+
kmsKeyRef: digitalCredential.kmsKeyRef
|
|
1744
|
+
});
|
|
1745
|
+
}
|
|
1746
|
+
}
|
|
1747
|
+
}
|
|
1748
|
+
if (identifier === void 0 && idOpts2 !== void 0 && await hasEbsiClient(request.authorizationRequest)) {
|
|
1749
|
+
identifier = await createEbsiIdentifier(agentContext);
|
|
1378
1750
|
}
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1751
|
+
logger3.debug(`Identifier`, identifier);
|
|
1752
|
+
presentationsAndDefs = await oid4vp.createVerifiablePresentations(CredentialRole.HOLDER, credentialsAndDefinitions, {
|
|
1753
|
+
idOpts: identifier,
|
|
1754
|
+
proofOpts: {
|
|
1755
|
+
nonce: session.nonce,
|
|
1756
|
+
domain
|
|
1757
|
+
}
|
|
1382
1758
|
});
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
identifier: digitalCredential.subjectCorrelationId ?? holder,
|
|
1388
|
-
kmsKeyRef: digitalCredential.kmsKeyRef
|
|
1389
|
-
});
|
|
1390
|
-
break;
|
|
1391
|
-
// TODO other implementations?
|
|
1392
|
-
default:
|
|
1393
|
-
identifier = await session.context.agent.identifierManagedGetByKid({
|
|
1394
|
-
identifier: digitalCredential.subjectCorrelationId ?? holder ?? digitalCredential.kmsKeyRef,
|
|
1395
|
-
kmsKeyRef: digitalCredential.kmsKeyRef
|
|
1396
|
-
});
|
|
1759
|
+
if (!presentationsAndDefs || presentationsAndDefs.length === 0) {
|
|
1760
|
+
throw Error("No verifiable presentations could be created");
|
|
1761
|
+
} else if (presentationsAndDefs.length > 1) {
|
|
1762
|
+
throw Error(`Only one verifiable presentation supported for now. Got ${presentationsAndDefs.length}`);
|
|
1397
1763
|
}
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1764
|
+
idOpts2 = presentationsAndDefs[0].idOpts;
|
|
1765
|
+
presentationSubmission = presentationsAndDefs[0].presentationSubmission;
|
|
1766
|
+
logger3.log(`Definitions and locations:`, JSON.stringify(presentationsAndDefs?.[0]?.verifiablePresentations, null, 2));
|
|
1767
|
+
logger3.log(`Presentation Submission:`, JSON.stringify(presentationSubmission, null, 2));
|
|
1768
|
+
const mergedVerifiablePresentations = presentationsAndDefs?.flatMap((pd) => pd.verifiablePresentations) || [];
|
|
1769
|
+
return await session.sendAuthorizationResponse({
|
|
1770
|
+
...presentationsAndDefs && {
|
|
1771
|
+
verifiablePresentations: mergedVerifiablePresentations
|
|
1772
|
+
},
|
|
1773
|
+
...presentationSubmission && {
|
|
1774
|
+
presentationSubmission
|
|
1775
|
+
},
|
|
1776
|
+
// todo: Change issuer value in case we do not use identifier. Use key.meta.jwkThumbprint then
|
|
1777
|
+
responseSignerOpts: idOpts2,
|
|
1778
|
+
isFirstParty
|
|
1779
|
+
});
|
|
1780
|
+
} else if (request.dcqlQuery) {
|
|
1781
|
+
if (args.verifiableCredentialsWithDefinition !== void 0 && args.verifiableCredentialsWithDefinition !== null) {
|
|
1782
|
+
const vcs = args.verifiableCredentialsWithDefinition.flatMap((vcd) => vcd.credentials);
|
|
1783
|
+
const domain = await request.authorizationRequest.getMergedProperty("client_id") ?? request.issuer ?? (request.versions.includes(SupportedVersion2.JWT_VC_PRESENTATION_PROFILE_v1) ? "https://self-issued.me/v2/openid-vc" : "https://self-issued.me/v2");
|
|
1784
|
+
logger3.debug(`NONCE: ${session.nonce}, domain: ${domain}`);
|
|
1785
|
+
const firstUniqueDC = vcs[0];
|
|
1786
|
+
if (typeof firstUniqueDC !== "object" || !("digitalCredential" in firstUniqueDC)) {
|
|
1787
|
+
return Promise.reject(Error("SiopMachine only supports UniqueDigitalCredentials for now"));
|
|
1415
1788
|
}
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1789
|
+
let identifier;
|
|
1790
|
+
const digitalCredential = firstUniqueDC.digitalCredential;
|
|
1791
|
+
const firstVC = firstUniqueDC.uniformVerifiableCredential;
|
|
1792
|
+
const holder = CredentialMapper4.isSdJwtDecodedCredential(firstVC) ? firstVC.decodedPayload.cnf?.jwk ? (
|
|
1793
|
+
//doesn't apply to did:jwk only, as you can represent any DID key as a JWK. So whenever you encounter a JWK it doesn't mean it had to come from a did:jwk in the system. It just can always be represented as a did:jwk
|
|
1794
|
+
`did:jwk:${encodeJoseBlob(firstVC.decodedPayload.cnf?.jwk)}#0`
|
|
1795
|
+
) : firstVC.decodedPayload.sub : Array.isArray(firstVC.credentialSubject) ? firstVC.credentialSubject[0].id : firstVC.credentialSubject.id;
|
|
1796
|
+
if (!digitalCredential.kmsKeyRef) {
|
|
1797
|
+
if (!holder) {
|
|
1798
|
+
return Promise.reject(`No holder found and no kmsKeyRef in DB. Cannot determine identifier to use`);
|
|
1799
|
+
}
|
|
1800
|
+
try {
|
|
1801
|
+
identifier = await session.context.agent.identifierManagedGet({
|
|
1802
|
+
identifier: holder
|
|
1803
|
+
});
|
|
1804
|
+
} catch (e) {
|
|
1805
|
+
logger3.debug(`Holder DID not found: ${holder}`);
|
|
1806
|
+
throw e;
|
|
1807
|
+
}
|
|
1808
|
+
} else if (isOID4VCIssuerIdentifier2(digitalCredential.kmsKeyRef)) {
|
|
1809
|
+
identifier = await session.context.agent.identifierManagedGetByOID4VCIssuer({
|
|
1810
|
+
identifier: firstUniqueDC.digitalCredential.kmsKeyRef
|
|
1811
|
+
});
|
|
1812
|
+
} else {
|
|
1813
|
+
switch (digitalCredential.subjectCorrelationType) {
|
|
1814
|
+
case "DID":
|
|
1815
|
+
identifier = await session.context.agent.identifierManagedGetByDid({
|
|
1816
|
+
identifier: digitalCredential.subjectCorrelationId ?? holder,
|
|
1817
|
+
kmsKeyRef: digitalCredential.kmsKeyRef
|
|
1818
|
+
});
|
|
1819
|
+
break;
|
|
1820
|
+
// TODO other implementations?
|
|
1821
|
+
default:
|
|
1822
|
+
identifier = await session.context.agent.identifierManagedGetByKid({
|
|
1823
|
+
identifier: digitalCredential.subjectCorrelationId ?? holder ?? digitalCredential.kmsKeyRef,
|
|
1824
|
+
kmsKeyRef: digitalCredential.kmsKeyRef
|
|
1825
|
+
});
|
|
1826
|
+
}
|
|
1419
1827
|
}
|
|
1420
|
-
|
|
1421
|
-
|
|
1828
|
+
console.log(`Identifier`, identifier);
|
|
1829
|
+
const dcqlRepresentations = [];
|
|
1830
|
+
vcs.forEach((vc) => {
|
|
1831
|
+
const rep = convertToDcqlCredentials(vc, args.hasher);
|
|
1832
|
+
if (rep) {
|
|
1833
|
+
dcqlRepresentations.push(rep);
|
|
1834
|
+
}
|
|
1835
|
+
});
|
|
1836
|
+
const queryResult = DcqlQuery.query(request.dcqlQuery, dcqlRepresentations);
|
|
1837
|
+
const presentation = {};
|
|
1838
|
+
for (const [key, value] of Object.entries(queryResult.credential_matches)) {
|
|
1839
|
+
const allMatches = Array.isArray(value) ? value : [
|
|
1840
|
+
value
|
|
1841
|
+
];
|
|
1842
|
+
allMatches.forEach((match) => {
|
|
1843
|
+
if (match.success) {
|
|
1844
|
+
const originalCredential = getOriginalVerifiableCredential(vcs[match.input_credential_index]);
|
|
1845
|
+
if (!originalCredential) {
|
|
1846
|
+
throw new Error(`Index ${match.input_credential_index} out of range in credentials array`);
|
|
1847
|
+
}
|
|
1848
|
+
presentation[key] = originalCredential["compactSdJwtVc"] !== void 0 ? originalCredential.compactSdJwtVc : originalCredential;
|
|
1849
|
+
}
|
|
1850
|
+
});
|
|
1422
1851
|
}
|
|
1852
|
+
const response = session.sendAuthorizationResponse({
|
|
1853
|
+
responseSignerOpts: identifier,
|
|
1854
|
+
...{
|
|
1855
|
+
dcqlQuery: {
|
|
1856
|
+
dcqlPresentation: DcqlPresentation.parse(presentation)
|
|
1857
|
+
}
|
|
1858
|
+
}
|
|
1859
|
+
});
|
|
1860
|
+
logger3.debug(`Response: `, response);
|
|
1861
|
+
return response;
|
|
1423
1862
|
}
|
|
1424
1863
|
}
|
|
1425
|
-
|
|
1426
|
-
const response = session.sendAuthorizationResponse({
|
|
1427
|
-
responseSignerOpts: identifier,
|
|
1428
|
-
dcqlResponse: {
|
|
1429
|
-
dcqlPresentation
|
|
1430
|
-
}
|
|
1431
|
-
});
|
|
1432
|
-
logger3.debug(`Response: `, response);
|
|
1433
|
-
return response;
|
|
1864
|
+
throw Error("Presentation Definition or DCQL is required");
|
|
1434
1865
|
}, "siopSendAuthorizationResponse");
|
|
1435
|
-
|
|
1436
|
-
return
|
|
1437
|
-
|
|
1438
|
-
|
|
1866
|
+
function buildPartialPD(inputDescriptor, presentationDefinition) {
|
|
1867
|
+
return {
|
|
1868
|
+
...presentationDefinition,
|
|
1869
|
+
input_descriptors: [
|
|
1870
|
+
inputDescriptor
|
|
1871
|
+
]
|
|
1872
|
+
};
|
|
1873
|
+
}
|
|
1874
|
+
__name(buildPartialPD, "buildPartialPD");
|
|
1875
|
+
var getSelectableCredentials = /* @__PURE__ */ __name(async (presentationDefinition, context) => {
|
|
1439
1876
|
const agentContext = {
|
|
1440
1877
|
...context,
|
|
1441
1878
|
agent: context.agent
|
|
1442
1879
|
};
|
|
1443
1880
|
const { agent } = agentContext;
|
|
1881
|
+
const pex = new PEX2();
|
|
1444
1882
|
const uniqueVerifiableCredentials = await agent.crsGetUniqueCredentials({
|
|
1445
|
-
filter:
|
|
1883
|
+
filter: verifiableCredentialForRoleFilter2(CredentialRole.HOLDER)
|
|
1446
1884
|
});
|
|
1447
|
-
const
|
|
1448
|
-
const dcqlCredentialsWithCredentials = new Map(uniqueVerifiableCredentials.map((vc) => [
|
|
1449
|
-
convertToDcqlCredentials(vc),
|
|
1450
|
-
vc
|
|
1451
|
-
]));
|
|
1452
|
-
const queryResult = DcqlQuery.query(dcqlQuery, Array.from(dcqlCredentialsWithCredentials.keys()));
|
|
1453
|
-
const uniqueCredentials = Array.from(dcqlCredentialsWithCredentials.values());
|
|
1885
|
+
const credentialBranding = await agent.ibGetCredentialBranding();
|
|
1454
1886
|
const selectableCredentialsMap = /* @__PURE__ */ new Map();
|
|
1455
|
-
for (const
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1887
|
+
for (const inputDescriptor of presentationDefinition.input_descriptors) {
|
|
1888
|
+
const partialPD = buildPartialPD(inputDescriptor, presentationDefinition);
|
|
1889
|
+
const originalCredentials = uniqueVerifiableCredentials.map((uniqueVC) => {
|
|
1890
|
+
return CredentialMapper4.storedCredentialToOriginalFormat(uniqueVC.originalVerifiableCredential);
|
|
1891
|
+
});
|
|
1892
|
+
const selectionResults = pex.selectFrom(partialPD, originalCredentials);
|
|
1893
|
+
const selectableCredentials = [];
|
|
1894
|
+
for (const selectedCredential of selectionResults.verifiableCredential || []) {
|
|
1895
|
+
const filteredUniqueVC = uniqueVerifiableCredentials.find((uniqueVC) => {
|
|
1896
|
+
const proof = uniqueVC.uniformVerifiableCredential.proof;
|
|
1897
|
+
return Array.isArray(proof) ? proof.some((proofItem) => proofItem.jwt === selectedCredential) : proof.jwt === selectedCredential;
|
|
1898
|
+
});
|
|
1899
|
+
if (filteredUniqueVC) {
|
|
1900
|
+
const filteredCredentialBrandings = credentialBranding.filter((cb) => cb.vcHash === filteredUniqueVC.hash);
|
|
1901
|
+
const issuerPartyIdentity = await agent.cmGetContacts({
|
|
1902
|
+
filter: [
|
|
1903
|
+
{
|
|
1904
|
+
identities: {
|
|
1905
|
+
identifier: {
|
|
1906
|
+
correlationId: filteredUniqueVC.uniformVerifiableCredential.issuerDid
|
|
1907
|
+
}
|
|
1468
1908
|
}
|
|
1469
1909
|
}
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
|
|
1910
|
+
]
|
|
1911
|
+
});
|
|
1912
|
+
const subjectPartyIdentity = await agent.cmGetContacts({
|
|
1913
|
+
filter: [
|
|
1914
|
+
{
|
|
1915
|
+
identities: {
|
|
1916
|
+
identifier: {
|
|
1917
|
+
correlationId: filteredUniqueVC.uniformVerifiableCredential.subjectDid
|
|
1918
|
+
}
|
|
1479
1919
|
}
|
|
1480
1920
|
}
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
}
|
|
1490
|
-
}
|
|
1491
|
-
|
|
1492
|
-
selectableCredentialsMap.set(key, selectableCredentials);
|
|
1921
|
+
]
|
|
1922
|
+
});
|
|
1923
|
+
selectableCredentials.push({
|
|
1924
|
+
credential: filteredUniqueVC,
|
|
1925
|
+
credentialBranding: filteredCredentialBrandings[0]?.localeBranding,
|
|
1926
|
+
issuerParty: issuerPartyIdentity?.[0],
|
|
1927
|
+
subjectParty: subjectPartyIdentity?.[0]
|
|
1928
|
+
});
|
|
1929
|
+
}
|
|
1930
|
+
}
|
|
1931
|
+
selectableCredentialsMap.set(inputDescriptor.id, selectableCredentials);
|
|
1493
1932
|
}
|
|
1494
1933
|
return selectableCredentialsMap;
|
|
1495
1934
|
}, "getSelectableCredentials");
|
|
@@ -1530,7 +1969,7 @@ var DidAuthSiopOpAuthenticator = class {
|
|
|
1530
1969
|
static {
|
|
1531
1970
|
__name(this, "DidAuthSiopOpAuthenticator");
|
|
1532
1971
|
}
|
|
1533
|
-
schema =
|
|
1972
|
+
schema = schema.IDidAuthSiopOpAuthenticator;
|
|
1534
1973
|
methods = {
|
|
1535
1974
|
siopGetOPSession: this.siopGetOPSession.bind(this),
|
|
1536
1975
|
siopRegisterOPSession: this.siopRegisterOPSession.bind(this),
|
|
@@ -1673,7 +2112,7 @@ var DidAuthSiopOpAuthenticator = class {
|
|
|
1673
2112
|
const url = verifiedAuthorizationRequest.responseURI ?? (args.url.includes("request_uri") ? decodeURIComponent(args.url.split("?request_uri=")[1].trim()) : verifiedAuthorizationRequest.issuer ?? verifiedAuthorizationRequest.registrationMetadataPayload?.client_id);
|
|
1674
2113
|
const uri = url.includes("://") ? new URL(url) : void 0;
|
|
1675
2114
|
const correlationId = uri?.hostname ?? await this.determineCorrelationId(uri, verifiedAuthorizationRequest, clientName, context);
|
|
1676
|
-
const clientId = verifiedAuthorizationRequest.authorizationRequest.getMergedProperty("client_id");
|
|
2115
|
+
const clientId = await verifiedAuthorizationRequest.authorizationRequest.getMergedProperty("client_id");
|
|
1677
2116
|
return {
|
|
1678
2117
|
issuer: verifiedAuthorizationRequest.issuer,
|
|
1679
2118
|
correlationId,
|
|
@@ -1681,6 +2120,7 @@ var DidAuthSiopOpAuthenticator = class {
|
|
|
1681
2120
|
uri,
|
|
1682
2121
|
name: clientName,
|
|
1683
2122
|
clientId,
|
|
2123
|
+
presentationDefinitions: await verifiedAuthorizationRequest.authorizationRequest.containsResponseType("vp_token") || verifiedAuthorizationRequest.versions.every((version) => version <= SupportedVersion3.JWT_VC_PRESENTATION_PROFILE_v1) && verifiedAuthorizationRequest.presentationDefinitions && verifiedAuthorizationRequest.presentationDefinitions.length > 0 ? verifiedAuthorizationRequest.presentationDefinitions : void 0,
|
|
1684
2124
|
dcqlQuery: verifiedAuthorizationRequest.dcqlQuery
|
|
1685
2125
|
};
|
|
1686
2126
|
}
|
|
@@ -1757,14 +2197,75 @@ var DidAuthSiopOpAuthenticator = class {
|
|
|
1757
2197
|
if (authorizationRequestData === void 0) {
|
|
1758
2198
|
return Promise.reject(Error("Missing authorization request data in context"));
|
|
1759
2199
|
}
|
|
2200
|
+
const pex = new PEX3({
|
|
2201
|
+
hasher: this.hasher
|
|
2202
|
+
});
|
|
2203
|
+
const verifiableCredentialsWithDefinition = [];
|
|
2204
|
+
const dcqlCredentialsWithCredentials = /* @__PURE__ */ new Map();
|
|
2205
|
+
if (Array.isArray(authorizationRequestData.presentationDefinitions) && authorizationRequestData?.presentationDefinitions.length > 0) {
|
|
2206
|
+
try {
|
|
2207
|
+
authorizationRequestData.presentationDefinitions?.forEach((presentationDefinition) => {
|
|
2208
|
+
const { areRequiredCredentialsPresent, verifiableCredential: verifiableCredentials } = pex.selectFrom(presentationDefinition.definition, selectedCredentials.map((udc) => udc.originalVerifiableCredential));
|
|
2209
|
+
if (areRequiredCredentialsPresent !== Status2.ERROR && verifiableCredentials) {
|
|
2210
|
+
let uniqueDigitalCredentials = [];
|
|
2211
|
+
uniqueDigitalCredentials = verifiableCredentials.map((vc) => {
|
|
2212
|
+
const hash = typeof vc === "string" ? computeEntryHash(vc.split("~"[0])) : computeEntryHash(vc);
|
|
2213
|
+
const udc = selectedCredentials.find((udc2) => udc2.hash == hash || udc2.originalVerifiableCredential == vc);
|
|
2214
|
+
if (!udc) {
|
|
2215
|
+
throw Error(`UniqueDigitalCredential could not be found in store. Either the credential is not present in the store or the hash is not correct.`);
|
|
2216
|
+
}
|
|
2217
|
+
return udc;
|
|
2218
|
+
});
|
|
2219
|
+
verifiableCredentialsWithDefinition.push({
|
|
2220
|
+
definition: presentationDefinition,
|
|
2221
|
+
credentials: uniqueDigitalCredentials
|
|
2222
|
+
});
|
|
2223
|
+
}
|
|
2224
|
+
});
|
|
2225
|
+
} catch (e) {
|
|
2226
|
+
return Promise.reject(e);
|
|
2227
|
+
}
|
|
2228
|
+
if (verifiableCredentialsWithDefinition.length === 0) {
|
|
2229
|
+
return Promise.reject(Error("None of the selected credentials match any of the presentation definitions."));
|
|
2230
|
+
}
|
|
2231
|
+
} else if (authorizationRequestData.dcqlQuery) {
|
|
2232
|
+
if (this.hasMDocCredentials(selectedCredentials) || this.hasSdJwtCredentials(selectedCredentials)) {
|
|
2233
|
+
try {
|
|
2234
|
+
selectedCredentials.forEach((vc) => {
|
|
2235
|
+
if (this.isSdJwtCredential(vc)) {
|
|
2236
|
+
const payload = vc.originalVerifiableCredential.decodedPayload;
|
|
2237
|
+
const result = {
|
|
2238
|
+
claims: payload,
|
|
2239
|
+
vct: payload.vct,
|
|
2240
|
+
credential_format: "vc+sd-jwt"
|
|
2241
|
+
};
|
|
2242
|
+
dcqlCredentialsWithCredentials.set(result, vc);
|
|
2243
|
+
} else {
|
|
2244
|
+
throw Error(`Invalid credential format: ${vc.digitalCredential.documentFormat}`);
|
|
2245
|
+
}
|
|
2246
|
+
});
|
|
2247
|
+
} catch (e) {
|
|
2248
|
+
return Promise.reject(e);
|
|
2249
|
+
}
|
|
2250
|
+
const dcqlPresentationRecord = {};
|
|
2251
|
+
const queryResult = DcqlQuery2.query(authorizationRequestData.dcqlQuery, Array.from(dcqlCredentialsWithCredentials.keys()));
|
|
2252
|
+
for (const [key, value] of Object.entries(queryResult.credential_matches)) {
|
|
2253
|
+
if (value.success) {
|
|
2254
|
+
dcqlPresentationRecord[key] = this.retrieveEncodedCredential(dcqlCredentialsWithCredentials.get(value.output));
|
|
2255
|
+
}
|
|
2256
|
+
}
|
|
2257
|
+
}
|
|
2258
|
+
}
|
|
1760
2259
|
const response = await siopSendAuthorizationResponse(ConnectionType2.SIOPv2_OpenID4VP, {
|
|
1761
2260
|
sessionId: didAuthConfig.sessionId,
|
|
1762
2261
|
...args.idOpts && {
|
|
1763
2262
|
idOpts: args.idOpts
|
|
1764
2263
|
},
|
|
2264
|
+
...authorizationRequestData.presentationDefinitions !== void 0 && {
|
|
2265
|
+
verifiableCredentialsWithDefinition
|
|
2266
|
+
},
|
|
1765
2267
|
isFirstParty,
|
|
1766
|
-
hasher: this.hasher
|
|
1767
|
-
credentials: selectedCredentials
|
|
2268
|
+
hasher: this.hasher
|
|
1768
2269
|
}, context);
|
|
1769
2270
|
const contentType = response.headers.get("content-type") || "";
|
|
1770
2271
|
let responseBody = null;
|
|
@@ -1778,12 +2279,30 @@ var DidAuthSiopOpAuthenticator = class {
|
|
|
1778
2279
|
queryParams: decodeUriAsJson(response?.url)
|
|
1779
2280
|
};
|
|
1780
2281
|
}
|
|
2282
|
+
hasMDocCredentials = /* @__PURE__ */ __name((credentials) => {
|
|
2283
|
+
return credentials.some(this.isMDocCredential);
|
|
2284
|
+
}, "hasMDocCredentials");
|
|
2285
|
+
isMDocCredential = /* @__PURE__ */ __name((credential) => {
|
|
2286
|
+
return credential.digitalCredential.documentFormat === CredentialDocumentFormat.MSO_MDOC && credential.digitalCredential.documentType === DocumentType.VC;
|
|
2287
|
+
}, "isMDocCredential");
|
|
2288
|
+
hasSdJwtCredentials = /* @__PURE__ */ __name((credentials) => {
|
|
2289
|
+
return credentials.some(this.isSdJwtCredential);
|
|
2290
|
+
}, "hasSdJwtCredentials");
|
|
2291
|
+
isSdJwtCredential = /* @__PURE__ */ __name((credential) => {
|
|
2292
|
+
return credential.digitalCredential.documentFormat === CredentialDocumentFormat.SD_JWT && credential.digitalCredential.documentType === DocumentType.VC;
|
|
2293
|
+
}, "isSdJwtCredential");
|
|
2294
|
+
retrieveEncodedCredential = /* @__PURE__ */ __name((credential) => {
|
|
2295
|
+
return credential.originalVerifiableCredential !== void 0 && credential.originalVerifiableCredential !== null && credential?.originalVerifiableCredential?.compactSdJwtVc !== void 0 && credential?.originalVerifiableCredential?.compactSdJwtVc !== null ? credential.originalVerifiableCredential.compactSdJwtVc : credential.originalVerifiableCredential;
|
|
2296
|
+
}, "retrieveEncodedCredential");
|
|
1781
2297
|
async siopGetSelectableCredentials(args, context) {
|
|
1782
2298
|
const { authorizationRequestData } = args;
|
|
1783
|
-
if (!authorizationRequestData
|
|
1784
|
-
return Promise.reject(Error("Missing required
|
|
2299
|
+
if (!authorizationRequestData || !authorizationRequestData.presentationDefinitions || authorizationRequestData.presentationDefinitions.length === 0) {
|
|
2300
|
+
return Promise.reject(Error("Missing required fields in arguments or context"));
|
|
2301
|
+
}
|
|
2302
|
+
if (authorizationRequestData.presentationDefinitions.length > 1) {
|
|
2303
|
+
return Promise.reject(Error("Multiple presentation definitions present"));
|
|
1785
2304
|
}
|
|
1786
|
-
return getSelectableCredentials(authorizationRequestData
|
|
2305
|
+
return getSelectableCredentials(authorizationRequestData.presentationDefinitions[0].definition, context);
|
|
1787
2306
|
}
|
|
1788
2307
|
};
|
|
1789
2308
|
|
|
@@ -1869,6 +2388,9 @@ var Siopv2OID4VPLinkHandler = class extends LinkHandlerAdapter {
|
|
|
1869
2388
|
}
|
|
1870
2389
|
}
|
|
1871
2390
|
};
|
|
2391
|
+
|
|
2392
|
+
// src/index.ts
|
|
2393
|
+
var schema = require_plugin_schema();
|
|
1872
2394
|
export {
|
|
1873
2395
|
DEFAULT_JWT_PROOF_TYPE,
|
|
1874
2396
|
DID_PREFIX,
|
|
@@ -1886,14 +2408,14 @@ export {
|
|
|
1886
2408
|
Siopv2MachineStates,
|
|
1887
2409
|
Siopv2OID4VPLinkHandler,
|
|
1888
2410
|
SupportedLanguage,
|
|
1889
|
-
convertToDcqlCredentials,
|
|
1890
2411
|
createJwtCallbackWithIdOpts,
|
|
1891
2412
|
createJwtCallbackWithOpOpts,
|
|
1892
2413
|
createOID4VPPresentationSignCallback,
|
|
1893
2414
|
createOP,
|
|
1894
2415
|
createOPBuilder,
|
|
1895
2416
|
didAuthSiopOpAuthenticatorMethods,
|
|
2417
|
+
events,
|
|
1896
2418
|
getSigningAlgo,
|
|
1897
|
-
|
|
2419
|
+
schema
|
|
1898
2420
|
};
|
|
1899
2421
|
//# sourceMappingURL=index.js.map
|