@sphereon/ssi-sdk.siopv2-oid4vp-op-auth 0.34.1-next.3 → 0.34.1-next.323
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 +647 -1070
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +723 -118
- package/dist/index.d.ts +723 -118
- package/dist/index.js +607 -1030
- package/dist/index.js.map +1 -1
- package/package.json +24 -24
- package/src/agent/DidAuthSiopOpAuthenticator.ts +10 -145
- package/src/index.ts +2 -1
- package/src/machine/Siopv2Machine.ts +5 -5
- package/src/services/Siopv2MachineService.ts +140 -267
- package/src/session/OID4VP.ts +151 -292
- package/src/session/OpSession.ts +11 -119
- package/src/session/functions.ts +1 -8
- package/src/types/IDidAuthSiopOpAuthenticator.ts +6 -59
- package/src/types/identifier/index.ts +0 -4
- package/src/types/machine/index.ts +1 -1
- package/src/types/siop-service/index.ts +12 -10
- package/src/utils/CredentialUtils.ts +2 -40
- package/src/utils/dcql.ts +26 -19
package/dist/index.js
CHANGED
|
@@ -35,344 +35,340 @@ var require_nl = __commonJS({
|
|
|
35
35
|
});
|
|
36
36
|
|
|
37
37
|
// plugin.schema.json
|
|
38
|
-
var
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
sessionId: {
|
|
48
|
-
type: "string"
|
|
49
|
-
},
|
|
50
|
-
additionalProperties: false
|
|
51
|
-
},
|
|
52
|
-
required: ["sessionId"],
|
|
53
|
-
description: "Arguments needed for {@link DidAuthSiopOpAuthenticator.getSessionForSiop } "
|
|
38
|
+
var plugin_schema_default = {
|
|
39
|
+
IDidAuthSiopOpAuthenticator: {
|
|
40
|
+
components: {
|
|
41
|
+
schemas: {
|
|
42
|
+
IGetSiopSessionArgs: {
|
|
43
|
+
type: "object",
|
|
44
|
+
properties: {
|
|
45
|
+
sessionId: {
|
|
46
|
+
type: "string"
|
|
54
47
|
},
|
|
55
|
-
|
|
48
|
+
additionalProperties: false
|
|
49
|
+
},
|
|
50
|
+
required: ["sessionId"],
|
|
51
|
+
description: "Arguments needed for {@link DidAuthSiopOpAuthenticator.getSessionForSiop } "
|
|
52
|
+
},
|
|
53
|
+
IRegisterSiopSessionArgs: {
|
|
54
|
+
type: "object",
|
|
55
|
+
properties: {
|
|
56
|
+
identifier: {
|
|
56
57
|
type: "object",
|
|
57
58
|
properties: {
|
|
58
|
-
|
|
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: {
|
|
59
|
+
did: {
|
|
96
60
|
type: "string"
|
|
97
61
|
},
|
|
98
|
-
|
|
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: {
|
|
62
|
+
alias: {
|
|
110
63
|
type: "string"
|
|
111
64
|
},
|
|
112
|
-
|
|
113
|
-
},
|
|
114
|
-
required: ["sessionId"],
|
|
115
|
-
description: "Arguments needed for {@link DidAuthSiopOpAuthenticator.removeSessionForSiop } "
|
|
116
|
-
},
|
|
117
|
-
IAuthenticateWithSiopArgs: {
|
|
118
|
-
type: "object",
|
|
119
|
-
properties: {
|
|
120
|
-
sessionId: {
|
|
65
|
+
provider: {
|
|
121
66
|
type: "string"
|
|
122
67
|
},
|
|
123
|
-
|
|
68
|
+
controllerKeyId: {
|
|
124
69
|
type: "string"
|
|
125
70
|
},
|
|
126
|
-
|
|
127
|
-
type: "
|
|
71
|
+
keys: {
|
|
72
|
+
type: "array",
|
|
73
|
+
items: {
|
|
74
|
+
type: "object",
|
|
75
|
+
properties: {
|
|
76
|
+
additionalProperties: true
|
|
77
|
+
}
|
|
78
|
+
}
|
|
128
79
|
},
|
|
129
|
-
|
|
80
|
+
services: {
|
|
81
|
+
type: "array",
|
|
82
|
+
items: {
|
|
83
|
+
type: "object",
|
|
84
|
+
properties: {
|
|
85
|
+
additionalProperties: true
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
130
89
|
},
|
|
131
|
-
|
|
132
|
-
|
|
90
|
+
additionalProperties: false,
|
|
91
|
+
required: ["did", "provider", "keys", "services"]
|
|
92
|
+
},
|
|
93
|
+
sessionId: {
|
|
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"
|
|
133
151
|
},
|
|
134
|
-
|
|
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: {
|
|
135
167
|
type: "object",
|
|
136
168
|
properties: {
|
|
137
|
-
status: {
|
|
138
|
-
type: "number"
|
|
139
|
-
},
|
|
140
169
|
additionalProperties: true
|
|
141
|
-
}
|
|
142
|
-
required: ["status"],
|
|
143
|
-
description: "Result of {@link DidAuthSiopOpAuthenticator.authenticateWithSiop & DidAuthSiopOpAuthenticator.sendSiopAuthenticationResponse } "
|
|
170
|
+
}
|
|
144
171
|
},
|
|
145
|
-
|
|
172
|
+
registration: {
|
|
146
173
|
type: "object",
|
|
147
174
|
properties: {
|
|
148
|
-
|
|
149
|
-
|
|
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 } "
|
|
175
|
+
additionalProperties: true
|
|
176
|
+
}
|
|
161
177
|
},
|
|
162
|
-
|
|
178
|
+
additionalProperties: false
|
|
179
|
+
},
|
|
180
|
+
required: ["jwt", "requestPayload", "registration"],
|
|
181
|
+
description: "Result of {@link DidAuthSiopOpAuthenticator.getSiopAuthenticationRequestFromRP } "
|
|
182
|
+
},
|
|
183
|
+
IGetSiopAuthenticationRequestDetailsArgs: {
|
|
184
|
+
type: "object",
|
|
185
|
+
properties: {
|
|
186
|
+
sessionId: {
|
|
187
|
+
type: "string"
|
|
188
|
+
},
|
|
189
|
+
verifiedAuthenticationRequest: {
|
|
163
190
|
type: "object",
|
|
164
191
|
properties: {
|
|
165
|
-
|
|
166
|
-
|
|
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 } "
|
|
192
|
+
additionalProperties: true
|
|
193
|
+
}
|
|
184
194
|
},
|
|
185
|
-
|
|
195
|
+
credentialFilter: {
|
|
186
196
|
type: "object",
|
|
187
197
|
properties: {
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
}
|
|
202
|
-
},
|
|
203
|
-
additionalProperties: false
|
|
204
|
-
},
|
|
205
|
-
required: ["sessionId", "verifiedAuthenticationRequest"],
|
|
206
|
-
description: "Arguments needed for {@link DidAuthSiopOpAuthenticator.getSiopAuthenticationRequestDetails } "
|
|
198
|
+
additionalProperties: true
|
|
199
|
+
}
|
|
200
|
+
},
|
|
201
|
+
additionalProperties: false
|
|
202
|
+
},
|
|
203
|
+
required: ["sessionId", "verifiedAuthenticationRequest"],
|
|
204
|
+
description: "Arguments needed for {@link DidAuthSiopOpAuthenticator.getSiopAuthenticationRequestDetails } "
|
|
205
|
+
},
|
|
206
|
+
IAuthRequestDetails: {
|
|
207
|
+
type: "object",
|
|
208
|
+
properties: {
|
|
209
|
+
id: {
|
|
210
|
+
type: "string"
|
|
207
211
|
},
|
|
208
|
-
|
|
212
|
+
alsoKnownAs: {
|
|
213
|
+
type: "array",
|
|
214
|
+
items: {
|
|
215
|
+
type: "string"
|
|
216
|
+
}
|
|
217
|
+
},
|
|
218
|
+
vpResponseOpts: {
|
|
209
219
|
type: "object",
|
|
210
220
|
properties: {
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
}
|
|
225
|
-
},
|
|
226
|
-
additionalProperties: false
|
|
227
|
-
},
|
|
228
|
-
required: ["id", "vpResponseOpts"],
|
|
229
|
-
description: "Result of {@link DidAuthSiopOpAuthenticator.getSiopAuthenticationRequestDetails } "
|
|
221
|
+
additionalProperties: true
|
|
222
|
+
}
|
|
223
|
+
},
|
|
224
|
+
additionalProperties: false
|
|
225
|
+
},
|
|
226
|
+
required: ["id", "vpResponseOpts"],
|
|
227
|
+
description: "Result of {@link DidAuthSiopOpAuthenticator.getSiopAuthenticationRequestDetails } "
|
|
228
|
+
},
|
|
229
|
+
IVerifySiopAuthenticationRequestUriArgs: {
|
|
230
|
+
type: "object",
|
|
231
|
+
properties: {
|
|
232
|
+
sessionId: {
|
|
233
|
+
type: "string"
|
|
230
234
|
},
|
|
231
|
-
|
|
235
|
+
ParsedAuthenticationRequestURI: {
|
|
232
236
|
type: "object",
|
|
233
237
|
properties: {
|
|
234
|
-
|
|
235
|
-
|
|
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 } "
|
|
238
|
+
additionalProperties: true
|
|
239
|
+
}
|
|
247
240
|
},
|
|
248
|
-
|
|
241
|
+
additionalProperties: false
|
|
242
|
+
},
|
|
243
|
+
required: ["sessionId", "ParsedAuthenticationRequestURI"],
|
|
244
|
+
description: "Arguments needed for {@link DidAuthSiopOpAuthenticator.verifySiopAuthenticationRequestURI } "
|
|
245
|
+
},
|
|
246
|
+
VerifiedAuthorizationRequest: {
|
|
247
|
+
type: "object",
|
|
248
|
+
properties: {
|
|
249
|
+
payload: {
|
|
249
250
|
type: "object",
|
|
250
251
|
properties: {
|
|
251
|
-
|
|
252
|
-
|
|
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 } "
|
|
252
|
+
additionalProperties: true
|
|
253
|
+
}
|
|
273
254
|
},
|
|
274
|
-
|
|
255
|
+
presentationDefinitions: {
|
|
275
256
|
type: "object",
|
|
276
257
|
properties: {
|
|
277
|
-
|
|
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"
|
|
305
|
-
},
|
|
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"
|
|
258
|
+
additionalProperties: true
|
|
327
259
|
}
|
|
328
260
|
},
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
},
|
|
334
|
-
returnType: {
|
|
335
|
-
$ref: "#/components/schemas/ParsedAuthenticationRequestURI"
|
|
261
|
+
verifyOpts: {
|
|
262
|
+
type: "object",
|
|
263
|
+
properties: {
|
|
264
|
+
additionalProperties: true
|
|
336
265
|
}
|
|
337
266
|
},
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
267
|
+
additionalProperties: false
|
|
268
|
+
},
|
|
269
|
+
required: ["payload", "verifyOpts"],
|
|
270
|
+
description: "Result of {@link DidAuthSiopOpAuthenticator.verifySiopAuthenticationRequestURI } "
|
|
271
|
+
},
|
|
272
|
+
ISendSiopAuthenticationResponseArgs: {
|
|
273
|
+
type: "object",
|
|
274
|
+
properties: {
|
|
275
|
+
sessionId: {
|
|
276
|
+
type: "string"
|
|
346
277
|
},
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
},
|
|
352
|
-
returnType: {
|
|
353
|
-
$ref: "#/components/schemas/VerifiedAuthorizationRequest"
|
|
278
|
+
verifiedAuthenticationRequest: {
|
|
279
|
+
type: "object",
|
|
280
|
+
properties: {
|
|
281
|
+
additionalProperties: true
|
|
354
282
|
}
|
|
355
283
|
},
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
},
|
|
361
|
-
returnType: {
|
|
362
|
-
$ref: "#/components/schemas/IRequiredContext"
|
|
284
|
+
verifiablePresentationResponse: {
|
|
285
|
+
type: "object",
|
|
286
|
+
properties: {
|
|
287
|
+
additionalProperties: true
|
|
363
288
|
}
|
|
364
|
-
}
|
|
289
|
+
},
|
|
290
|
+
additionalProperties: false
|
|
291
|
+
},
|
|
292
|
+
required: ["sessionId", "verifiedAuthenticationRequest"],
|
|
293
|
+
description: "Arguments needed for {@link DidAuthSiopOpAuthenticator.sendSiopAuthenticationResponse } "
|
|
294
|
+
}
|
|
295
|
+
},
|
|
296
|
+
methods: {
|
|
297
|
+
getSessionForSiop: {
|
|
298
|
+
description: "Get SIOP session",
|
|
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"
|
|
365
361
|
}
|
|
366
362
|
}
|
|
367
363
|
}
|
|
368
|
-
}
|
|
364
|
+
}
|
|
369
365
|
}
|
|
370
|
-
}
|
|
366
|
+
};
|
|
371
367
|
|
|
372
368
|
// src/agent/DidAuthSiopOpAuthenticator.ts
|
|
373
|
-
import { decodeUriAsJson
|
|
374
|
-
import { ConnectionType as ConnectionType2, CorrelationIdentifierType,
|
|
375
|
-
import { Loggers as
|
|
369
|
+
import { decodeUriAsJson } from "@sphereon/did-auth-siop";
|
|
370
|
+
import { ConnectionType as ConnectionType2, CorrelationIdentifierType, IdentityOrigin } from "@sphereon/ssi-sdk.data-store-types";
|
|
371
|
+
import { Loggers as Loggers5, CredentialRole as CredentialRole2 } from "@sphereon/ssi-types";
|
|
376
372
|
import { v4 as uuidv4 } from "uuid";
|
|
377
373
|
|
|
378
374
|
// src/session/functions.ts
|
|
@@ -398,10 +394,8 @@ __name(createOID4VPPresentationSignCallback, "createOID4VPPresentationSignCallba
|
|
|
398
394
|
async function createOPBuilder({ opOptions, idOpts: idOpts1, context }) {
|
|
399
395
|
const eventEmitter = opOptions.eventEmitter ?? new EventEmitter();
|
|
400
396
|
const builder = OP.builder().withResponseMode(opOptions.responseMode ?? ResponseMode.DIRECT_POST).withSupportedVersions(opOptions.supportedVersions ?? [
|
|
401
|
-
SupportedVersion.
|
|
402
|
-
SupportedVersion.
|
|
403
|
-
SupportedVersion.SIOPv2_D11,
|
|
404
|
-
SupportedVersion.SIOPv2_D12_OID4VP_D18
|
|
397
|
+
SupportedVersion.OID4VP_v1,
|
|
398
|
+
SupportedVersion.SIOPv2_OID4VP_D28
|
|
405
399
|
]).withExpiresIn(opOptions.expiresIn ?? 300).withEventEmitter(eventEmitter).withRegistration({
|
|
406
400
|
passBy: PassBy.VALUE
|
|
407
401
|
});
|
|
@@ -529,34 +523,29 @@ function getSigningAlgo(type) {
|
|
|
529
523
|
__name(getSigningAlgo, "getSigningAlgo");
|
|
530
524
|
|
|
531
525
|
// src/session/OID4VP.ts
|
|
532
|
-
import {
|
|
533
|
-
import {
|
|
534
|
-
import {
|
|
535
|
-
import {
|
|
536
|
-
import { verifiableCredentialForRoleFilter } from "@sphereon/ssi-sdk.credential-store";
|
|
526
|
+
import { calculateSdHash } from "@sphereon/pex/dist/main/lib/utils/index.js";
|
|
527
|
+
import { isManagedIdentifierDidResult } from "@sphereon/ssi-sdk-ext.identifier-resolution";
|
|
528
|
+
import { defaultGenerateDigest } from "@sphereon/ssi-sdk.sd-jwt";
|
|
529
|
+
import { CredentialMapper, DocumentFormat, Loggers } from "@sphereon/ssi-types";
|
|
537
530
|
|
|
538
531
|
// src/types/IDidAuthSiopOpAuthenticator.ts
|
|
539
532
|
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
533
|
var DEFAULT_JWT_PROOF_TYPE = "JwtProof2020";
|
|
545
534
|
|
|
546
535
|
// src/types/siop-service/index.ts
|
|
547
|
-
var Siopv2HolderEvent = /* @__PURE__ */ function(Siopv2HolderEvent2) {
|
|
536
|
+
var Siopv2HolderEvent = /* @__PURE__ */ (function(Siopv2HolderEvent2) {
|
|
548
537
|
Siopv2HolderEvent2["CONTACT_IDENTITY_CREATED"] = "contact_identity_created";
|
|
549
538
|
Siopv2HolderEvent2["IDENTIFIER_CREATED"] = "identifier_created";
|
|
550
539
|
return Siopv2HolderEvent2;
|
|
551
|
-
}({});
|
|
552
|
-
var SupportedLanguage = /* @__PURE__ */ function(SupportedLanguage2) {
|
|
540
|
+
})({});
|
|
541
|
+
var SupportedLanguage = /* @__PURE__ */ (function(SupportedLanguage2) {
|
|
553
542
|
SupportedLanguage2["ENGLISH"] = "en";
|
|
554
543
|
SupportedLanguage2["DUTCH"] = "nl";
|
|
555
544
|
return SupportedLanguage2;
|
|
556
|
-
}({});
|
|
545
|
+
})({});
|
|
557
546
|
|
|
558
547
|
// src/types/machine/index.ts
|
|
559
|
-
var Siopv2MachineStates = /* @__PURE__ */ function(Siopv2MachineStates2) {
|
|
548
|
+
var Siopv2MachineStates = /* @__PURE__ */ (function(Siopv2MachineStates2) {
|
|
560
549
|
Siopv2MachineStates2["createConfig"] = "createConfig";
|
|
561
550
|
Siopv2MachineStates2["getSiopRequest"] = "getSiopRequest";
|
|
562
551
|
Siopv2MachineStates2["getSelectableCredentials"] = "getSelectableCredentials";
|
|
@@ -572,14 +561,14 @@ var Siopv2MachineStates = /* @__PURE__ */ function(Siopv2MachineStates2) {
|
|
|
572
561
|
Siopv2MachineStates2["error"] = "error";
|
|
573
562
|
Siopv2MachineStates2["done"] = "done";
|
|
574
563
|
return Siopv2MachineStates2;
|
|
575
|
-
}({});
|
|
576
|
-
var Siopv2MachineAddContactStates = /* @__PURE__ */ function(Siopv2MachineAddContactStates2) {
|
|
564
|
+
})({});
|
|
565
|
+
var Siopv2MachineAddContactStates = /* @__PURE__ */ (function(Siopv2MachineAddContactStates2) {
|
|
577
566
|
Siopv2MachineAddContactStates2["idle"] = "idle";
|
|
578
567
|
Siopv2MachineAddContactStates2["executing"] = "executing";
|
|
579
568
|
Siopv2MachineAddContactStates2["next"] = "next";
|
|
580
569
|
return Siopv2MachineAddContactStates2;
|
|
581
|
-
}({});
|
|
582
|
-
var Siopv2MachineEvents = /* @__PURE__ */ function(Siopv2MachineEvents2) {
|
|
570
|
+
})({});
|
|
571
|
+
var Siopv2MachineEvents = /* @__PURE__ */ (function(Siopv2MachineEvents2) {
|
|
583
572
|
Siopv2MachineEvents2["NEXT"] = "NEXT";
|
|
584
573
|
Siopv2MachineEvents2["PREVIOUS"] = "PREVIOUS";
|
|
585
574
|
Siopv2MachineEvents2["DECLINE"] = "DECLINE";
|
|
@@ -588,8 +577,8 @@ var Siopv2MachineEvents = /* @__PURE__ */ function(Siopv2MachineEvents2) {
|
|
|
588
577
|
Siopv2MachineEvents2["CREATE_CONTACT"] = "CREATE_CONTACT";
|
|
589
578
|
Siopv2MachineEvents2["SET_SELECTED_CREDENTIALS"] = "SET_SELECTED_CREDENTIALS";
|
|
590
579
|
return Siopv2MachineEvents2;
|
|
591
|
-
}({});
|
|
592
|
-
var Siopv2MachineGuards = /* @__PURE__ */ function(Siopv2MachineGuards2) {
|
|
580
|
+
})({});
|
|
581
|
+
var Siopv2MachineGuards = /* @__PURE__ */ (function(Siopv2MachineGuards2) {
|
|
593
582
|
Siopv2MachineGuards2["hasNoContactGuard"] = "Siopv2HasNoContactGuard";
|
|
594
583
|
Siopv2MachineGuards2["createContactGuard"] = "Siopv2CreateContactGuard";
|
|
595
584
|
Siopv2MachineGuards2["hasContactGuard"] = "Siopv2HasContactGuard";
|
|
@@ -599,8 +588,8 @@ var Siopv2MachineGuards = /* @__PURE__ */ function(Siopv2MachineGuards2) {
|
|
|
599
588
|
Siopv2MachineGuards2["siopOnlyGuard"] = "Siopv2IsSiopOnlyGuard";
|
|
600
589
|
Siopv2MachineGuards2["siopWithOID4VPGuard"] = "Siopv2IsSiopWithOID4VPGuard";
|
|
601
590
|
return Siopv2MachineGuards2;
|
|
602
|
-
}({});
|
|
603
|
-
var Siopv2MachineServices = /* @__PURE__ */ function(Siopv2MachineServices2) {
|
|
591
|
+
})({});
|
|
592
|
+
var Siopv2MachineServices = /* @__PURE__ */ (function(Siopv2MachineServices2) {
|
|
604
593
|
Siopv2MachineServices2["getSiopRequest"] = "getSiopRequest";
|
|
605
594
|
Siopv2MachineServices2["getSelectableCredentials"] = "getSelectableCredentials";
|
|
606
595
|
Siopv2MachineServices2["retrieveContact"] = "retrieveContact";
|
|
@@ -608,212 +597,131 @@ var Siopv2MachineServices = /* @__PURE__ */ function(Siopv2MachineServices2) {
|
|
|
608
597
|
Siopv2MachineServices2["sendResponse"] = "sendResponse";
|
|
609
598
|
Siopv2MachineServices2["createConfig"] = "createConfig";
|
|
610
599
|
return Siopv2MachineServices2;
|
|
611
|
-
}({});
|
|
600
|
+
})({});
|
|
612
601
|
|
|
613
602
|
// src/types/identifier/index.ts
|
|
614
603
|
var DID_PREFIX = "did";
|
|
615
604
|
|
|
616
605
|
// src/session/OID4VP.ts
|
|
617
|
-
var
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
allIdentifiers;
|
|
623
|
-
hasher;
|
|
624
|
-
constructor(args) {
|
|
625
|
-
const { session, allIdentifiers, hasher = defaultHasher } = args;
|
|
626
|
-
this.session = session;
|
|
627
|
-
this.allIdentifiers = allIdentifiers ?? [];
|
|
628
|
-
this.hasher = hasher;
|
|
629
|
-
}
|
|
630
|
-
static async init(session, allIdentifiers, hasher) {
|
|
631
|
-
return new _OID4VP({
|
|
632
|
-
session,
|
|
633
|
-
allIdentifiers: allIdentifiers ?? await session.getSupportedDIDs(),
|
|
634
|
-
hasher
|
|
635
|
-
});
|
|
606
|
+
var CLOCK_SKEW = 120;
|
|
607
|
+
var logger = Loggers.DEFAULT.get(LOGGER_NAMESPACE);
|
|
608
|
+
function extractOriginalCredential(credential) {
|
|
609
|
+
if (typeof credential === "string") {
|
|
610
|
+
return credential;
|
|
636
611
|
}
|
|
637
|
-
|
|
638
|
-
const
|
|
639
|
-
if (
|
|
640
|
-
|
|
612
|
+
if ("digitalCredential" in credential) {
|
|
613
|
+
const udc = credential;
|
|
614
|
+
if (udc.originalVerifiableCredential) {
|
|
615
|
+
return udc.originalVerifiableCredential;
|
|
641
616
|
}
|
|
642
|
-
return
|
|
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
|
-
});
|
|
617
|
+
return udc.uniformVerifiableCredential;
|
|
651
618
|
}
|
|
652
|
-
|
|
653
|
-
return
|
|
619
|
+
if ("original" in credential) {
|
|
620
|
+
return credential.original;
|
|
654
621
|
}
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
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
|
-
}
|
|
622
|
+
return credential;
|
|
623
|
+
}
|
|
624
|
+
__name(extractOriginalCredential, "extractOriginalCredential");
|
|
625
|
+
function getIdentifierString(identifier) {
|
|
626
|
+
if ("opts" in identifier && "method" in identifier) {
|
|
627
|
+
if (isManagedIdentifierDidResult(identifier)) {
|
|
628
|
+
return identifier.did;
|
|
745
629
|
}
|
|
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
630
|
}
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
631
|
+
return identifier.issuer ?? identifier.kid ?? "";
|
|
632
|
+
}
|
|
633
|
+
__name(getIdentifierString, "getIdentifierString");
|
|
634
|
+
async function createVerifiablePresentationForFormat(credential, identifier, context) {
|
|
635
|
+
const { nonce, audience, agent, clockSkew = CLOCK_SKEW } = context;
|
|
636
|
+
const originalCredential = extractOriginalCredential(credential);
|
|
637
|
+
const documentFormat = CredentialMapper.detectDocumentType(originalCredential);
|
|
638
|
+
logger.debug(`Creating VP for format: ${documentFormat}`);
|
|
639
|
+
switch (documentFormat) {
|
|
640
|
+
case DocumentFormat.SD_JWT_VC: {
|
|
641
|
+
const decodedSdJwt = await CredentialMapper.decodeSdJwtVcAsync(typeof originalCredential === "string" ? originalCredential : originalCredential.compactSdJwtVc, defaultGenerateDigest);
|
|
642
|
+
const hashAlg = decodedSdJwt.signedPayload._sd_alg ?? "sha-256";
|
|
643
|
+
const sdHash = calculateSdHash(decodedSdJwt.compactSdJwtVc, hashAlg, defaultGenerateDigest);
|
|
644
|
+
const kbJwtPayload = {
|
|
645
|
+
iat: Math.floor(Date.now() / 1e3 - clockSkew),
|
|
646
|
+
sd_hash: sdHash,
|
|
647
|
+
nonce,
|
|
648
|
+
aud: audience
|
|
649
|
+
};
|
|
650
|
+
const presentationResult = await agent.createSdJwtPresentation({
|
|
651
|
+
presentation: decodedSdJwt.compactSdJwtVc,
|
|
652
|
+
kb: {
|
|
653
|
+
payload: kbJwtPayload
|
|
654
|
+
}
|
|
655
|
+
});
|
|
656
|
+
return presentationResult.presentation;
|
|
782
657
|
}
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
658
|
+
case DocumentFormat.JSONLD: {
|
|
659
|
+
const vcObject = typeof originalCredential === "string" ? JSON.parse(originalCredential) : originalCredential;
|
|
660
|
+
const vpObject = {
|
|
661
|
+
"@context": [
|
|
662
|
+
"https://www.w3.org/2018/credentials/v1"
|
|
663
|
+
],
|
|
664
|
+
type: [
|
|
665
|
+
"VerifiablePresentation"
|
|
666
|
+
],
|
|
667
|
+
verifiableCredential: [
|
|
668
|
+
vcObject
|
|
669
|
+
]
|
|
670
|
+
};
|
|
671
|
+
return await agent.createVerifiablePresentation({
|
|
672
|
+
presentation: vpObject,
|
|
673
|
+
proofFormat: "lds",
|
|
674
|
+
challenge: nonce,
|
|
675
|
+
domain: audience,
|
|
676
|
+
keyRef: identifier.kmsKeyRef || identifier.kid
|
|
677
|
+
});
|
|
786
678
|
}
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
679
|
+
case DocumentFormat.MSO_MDOC: {
|
|
680
|
+
logger.warning("mso_mdoc format has basic support - production use requires proper mdoc VP token implementation");
|
|
681
|
+
return originalCredential;
|
|
682
|
+
}
|
|
683
|
+
default: {
|
|
684
|
+
const vcJwt = typeof originalCredential === "string" ? originalCredential : JSON.stringify(originalCredential);
|
|
685
|
+
const identifierString = getIdentifierString(identifier);
|
|
686
|
+
const vpPayload = {
|
|
687
|
+
iss: identifierString,
|
|
688
|
+
aud: audience,
|
|
689
|
+
nonce,
|
|
690
|
+
vp: {
|
|
691
|
+
"@context": [
|
|
692
|
+
"https://www.w3.org/2018/credentials/v1"
|
|
693
|
+
],
|
|
694
|
+
type: [
|
|
695
|
+
"VerifiablePresentation"
|
|
696
|
+
],
|
|
697
|
+
holder: identifierString,
|
|
698
|
+
verifiableCredential: [
|
|
699
|
+
vcJwt
|
|
700
|
+
]
|
|
701
|
+
},
|
|
702
|
+
iat: Math.floor(Date.now() / 1e3 - clockSkew),
|
|
703
|
+
exp: Math.floor(Date.now() / 1e3 + 600 + clockSkew)
|
|
704
|
+
};
|
|
705
|
+
const vpJwt = await agent.createVerifiablePresentation({
|
|
706
|
+
presentation: vpPayload.vp,
|
|
707
|
+
proofFormat: "jwt",
|
|
708
|
+
domain: audience,
|
|
709
|
+
challenge: nonce,
|
|
710
|
+
keyRef: identifier.kmsKeyRef || identifier.kid
|
|
711
|
+
});
|
|
712
|
+
return vpJwt.proof?.jwt || vpJwt;
|
|
792
713
|
}
|
|
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
714
|
}
|
|
806
|
-
}
|
|
715
|
+
}
|
|
716
|
+
__name(createVerifiablePresentationForFormat, "createVerifiablePresentationForFormat");
|
|
807
717
|
|
|
808
718
|
// src/session/OpSession.ts
|
|
809
719
|
import { OP as OP2, URI } from "@sphereon/did-auth-siop";
|
|
810
720
|
import { getAgentDIDMethods, getAgentResolver } from "@sphereon/ssi-sdk-ext.did-utils";
|
|
811
721
|
import { encodeBase64url } from "@sphereon/ssi-sdk.core";
|
|
812
|
-
import {
|
|
722
|
+
import { Loggers as Loggers2, parseDid } from "@sphereon/ssi-types";
|
|
813
723
|
import { v4 } from "uuid";
|
|
814
|
-
|
|
815
|
-
import { Loggers } from "@sphereon/ssi-types";
|
|
816
|
-
var logger = Loggers.DEFAULT.get("sphereon:oid4vp:OpSession");
|
|
724
|
+
var logger2 = Loggers2.DEFAULT.get("sphereon:oid4vp:OpSession");
|
|
817
725
|
var OpSession = class _OpSession {
|
|
818
726
|
static {
|
|
819
727
|
__name(this, "OpSession");
|
|
@@ -826,13 +734,11 @@ var OpSession = class _OpSession {
|
|
|
826
734
|
verifiedAuthorizationRequest;
|
|
827
735
|
_nonce;
|
|
828
736
|
_state;
|
|
829
|
-
_providedPresentationDefinitions;
|
|
830
737
|
constructor(options) {
|
|
831
738
|
this.id = options.sessionId;
|
|
832
739
|
this.options = options.op;
|
|
833
740
|
this.context = options.context;
|
|
834
741
|
this.requestJwtOrUri = options.requestJwtOrUri;
|
|
835
|
-
this._providedPresentationDefinitions = options.providedPresentationDefinitions;
|
|
836
742
|
}
|
|
837
743
|
static async init(options) {
|
|
838
744
|
return new _OpSession(options);
|
|
@@ -879,9 +785,9 @@ var OpSession = class _OpSession {
|
|
|
879
785
|
didPrefix,
|
|
880
786
|
agentMethods
|
|
881
787
|
});
|
|
882
|
-
|
|
788
|
+
logger2.debug(`RP supports subject syntax types: ${JSON.stringify(this.getSubjectSyntaxTypesSupported())}`);
|
|
883
789
|
if (rpMethods.dids.length === 0) {
|
|
884
|
-
|
|
790
|
+
logger2.debug(`RP does not support DIDs. Supported: ${JSON.stringify(this.getSubjectSyntaxTypesSupported())}`);
|
|
885
791
|
return [];
|
|
886
792
|
}
|
|
887
793
|
let intersection;
|
|
@@ -899,7 +805,7 @@ var OpSession = class _OpSession {
|
|
|
899
805
|
}
|
|
900
806
|
getAgentDIDMethodsSupported(opts) {
|
|
901
807
|
const agentMethods = this.options.supportedDIDMethods?.map((method) => convertDidMethod(method, opts.didPrefix));
|
|
902
|
-
|
|
808
|
+
logger2.debug(`agent methods: ${JSON.stringify(agentMethods)}`);
|
|
903
809
|
return agentMethods;
|
|
904
810
|
}
|
|
905
811
|
async getSubjectSyntaxTypesSupported() {
|
|
@@ -910,15 +816,15 @@ var OpSession = class _OpSession {
|
|
|
910
816
|
async getRPDIDMethodsSupported(opts) {
|
|
911
817
|
let keyType;
|
|
912
818
|
const agentMethods = (opts.agentMethods ?? this.getAgentDIDMethodsSupported(opts))?.map((method) => convertDidMethod(method, opts.didPrefix)) ?? [];
|
|
913
|
-
|
|
819
|
+
logger2.debug(`agent methods supported: ${JSON.stringify(agentMethods)}`);
|
|
914
820
|
const authReq = await this.getAuthorizationRequest();
|
|
915
821
|
const subjectSyntaxTypesSupported = authReq.registrationMetadataPayload?.subject_syntax_types_supported?.map((method) => convertDidMethod(method, opts.didPrefix)).filter((val) => !val.startsWith("did"));
|
|
916
|
-
|
|
822
|
+
logger2.debug(`subject syntax types supported in rp method supported: ${JSON.stringify(subjectSyntaxTypesSupported)}`);
|
|
917
823
|
const aud = await authReq.authorizationRequest.getMergedProperty("aud");
|
|
918
824
|
let rpMethods = [];
|
|
919
825
|
if (aud && aud.startsWith("did:")) {
|
|
920
826
|
const didMethod = convertDidMethod(parseDid(aud).method, opts.didPrefix);
|
|
921
|
-
|
|
827
|
+
logger2.debug(`aud did method: ${didMethod}`);
|
|
922
828
|
if (subjectSyntaxTypesSupported && subjectSyntaxTypesSupported.length > 0 && !subjectSyntaxTypesSupported.includes("did") && !subjectSyntaxTypesSupported.includes(didMethod)) {
|
|
923
829
|
throw Error(`The aud DID method ${didMethod} is not in the supported types ${subjectSyntaxTypesSupported}`);
|
|
924
830
|
}
|
|
@@ -930,10 +836,10 @@ var OpSession = class _OpSession {
|
|
|
930
836
|
subjectSyntaxTypesSupported
|
|
931
837
|
]).map((method) => convertDidMethod(method, opts.didPrefix));
|
|
932
838
|
}
|
|
933
|
-
const isEBSI = rpMethods.length === 0 && (authReq.issuer?.includes(".ebsi.eu") ||
|
|
839
|
+
const isEBSI = rpMethods.length === 0 && (authReq.issuer?.includes(".ebsi.eu") || authReq.authorizationRequest.getMergedProperty("client_id")?.includes(".ebsi.eu"));
|
|
934
840
|
let codecName = void 0;
|
|
935
841
|
if (isEBSI && (!aud || !aud.startsWith("http"))) {
|
|
936
|
-
|
|
842
|
+
logger2.debug(`EBSI detected, adding did:key to supported DID methods for RP`);
|
|
937
843
|
const didKeyMethod = convertDidMethod("did:key", opts.didPrefix);
|
|
938
844
|
if (!agentMethods?.includes(didKeyMethod)) {
|
|
939
845
|
throw Error(`EBSI detected, but agent did not support did:key. Please reconfigure agent`);
|
|
@@ -952,13 +858,13 @@ var OpSession = class _OpSession {
|
|
|
952
858
|
}
|
|
953
859
|
async getSupportedIdentifiers(opts) {
|
|
954
860
|
const methods = await this.getSupportedDIDMethods(true);
|
|
955
|
-
|
|
861
|
+
logger2.debug(`supported DID methods (did: prefix = true): ${JSON.stringify(methods)}`);
|
|
956
862
|
if (methods.length === 0) {
|
|
957
863
|
throw Error(`No DID methods are supported`);
|
|
958
864
|
}
|
|
959
865
|
const identifiers = await this.context.agent.didManagerFind().then((ids) => ids.filter((id) => methods.includes(id.provider)));
|
|
960
866
|
if (identifiers.length === 0) {
|
|
961
|
-
|
|
867
|
+
logger2.debug(`No identifiers available in agent supporting methods ${JSON.stringify(methods)}`);
|
|
962
868
|
if (opts?.createInCaseNoDIDFound !== false) {
|
|
963
869
|
const { codecName, keyType } = await this.getRPDIDMethodsSupported({
|
|
964
870
|
didPrefix: true,
|
|
@@ -972,11 +878,11 @@ var OpSession = class _OpSession {
|
|
|
972
878
|
type: keyType
|
|
973
879
|
}
|
|
974
880
|
});
|
|
975
|
-
|
|
881
|
+
logger2.debug(`Created a new identifier for the SIOP interaction: ${identifier.did}`);
|
|
976
882
|
identifiers.push(identifier);
|
|
977
883
|
}
|
|
978
884
|
}
|
|
979
|
-
|
|
885
|
+
logger2.debug(`supported identifiers: ${JSON.stringify(identifiers.map((id) => id.did))}`);
|
|
980
886
|
return identifiers;
|
|
981
887
|
}
|
|
982
888
|
async getSupportedDIDs() {
|
|
@@ -985,51 +891,6 @@ var OpSession = class _OpSession {
|
|
|
985
891
|
async getRedirectUri() {
|
|
986
892
|
return Promise.resolve(this.verifiedAuthorizationRequest.responseURI);
|
|
987
893
|
}
|
|
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
|
-
}
|
|
998
|
-
async getOID4VP(args) {
|
|
999
|
-
return await OID4VP.init(this, args.allIdentifiers ?? [], args.hasher);
|
|
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
|
-
}
|
|
1033
894
|
async createJarmResponseCallback({ responseOpts }) {
|
|
1034
895
|
const agent = this.context.agent;
|
|
1035
896
|
return /* @__PURE__ */ __name(async function jarmResponse(opts) {
|
|
@@ -1056,6 +917,7 @@ var OpSession = class _OpSession {
|
|
|
1056
917
|
}, "jarmResponse");
|
|
1057
918
|
}
|
|
1058
919
|
async sendAuthorizationResponse(args) {
|
|
920
|
+
const { responseSignerOpts, dcqlResponse, isFirstParty } = args;
|
|
1059
921
|
const resolveOpts = this.options.resolveOpts ?? {
|
|
1060
922
|
resolver: getAgentResolver(this.context, {
|
|
1061
923
|
uniresolverResolution: true,
|
|
@@ -1066,23 +928,7 @@ var OpSession = class _OpSession {
|
|
|
1066
928
|
if (!resolveOpts.subjectSyntaxTypesSupported || resolveOpts.subjectSyntaxTypesSupported.length === 0) {
|
|
1067
929
|
resolveOpts.subjectSyntaxTypesSupported = await this.getSupportedDIDMethods(true);
|
|
1068
930
|
}
|
|
1069
|
-
const verification = {
|
|
1070
|
-
presentationVerificationCallback: this.createPresentationVerificationCallback(this.context)
|
|
1071
|
-
};
|
|
1072
931
|
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)) : [];
|
|
1086
932
|
const op = await createOP({
|
|
1087
933
|
opOptions: {
|
|
1088
934
|
...this.options,
|
|
@@ -1094,23 +940,16 @@ var OpSession = class _OpSession {
|
|
|
1094
940
|
wellknownDIDVerifyCallback: this.options.wellknownDIDVerifyCallback,
|
|
1095
941
|
supportedVersions: request.versions
|
|
1096
942
|
},
|
|
1097
|
-
idOpts:
|
|
943
|
+
idOpts: responseSignerOpts,
|
|
1098
944
|
context: this.context
|
|
1099
945
|
});
|
|
1100
|
-
let issuer =
|
|
946
|
+
let issuer = responseSignerOpts.issuer;
|
|
1101
947
|
const responseOpts = {
|
|
1102
|
-
verification,
|
|
1103
948
|
issuer,
|
|
1104
|
-
...
|
|
1105
|
-
isFirstParty
|
|
1106
|
-
},
|
|
1107
|
-
...args.verifiablePresentations && {
|
|
1108
|
-
presentationExchange: {
|
|
1109
|
-
verifiablePresentations,
|
|
1110
|
-
presentationSubmission: args.presentationSubmission
|
|
1111
|
-
}
|
|
949
|
+
...isFirstParty && {
|
|
950
|
+
isFirstParty
|
|
1112
951
|
},
|
|
1113
|
-
|
|
952
|
+
dcqlResponse
|
|
1114
953
|
};
|
|
1115
954
|
const authResponse = await op.createAuthorizationResponse(request, responseOpts);
|
|
1116
955
|
const response = await op.submitAuthorizationResponse(authResponse, await this.createJarmResponseCallback({
|
|
@@ -1122,24 +961,6 @@ var OpSession = class _OpSession {
|
|
|
1122
961
|
return response;
|
|
1123
962
|
}
|
|
1124
963
|
}
|
|
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
|
-
}
|
|
1143
964
|
};
|
|
1144
965
|
function convertDidMethod(didMethod, didPrefix) {
|
|
1145
966
|
if (didPrefix === false) {
|
|
@@ -1149,11 +970,6 @@ function convertDidMethod(didMethod, didPrefix) {
|
|
|
1149
970
|
}
|
|
1150
971
|
__name(convertDidMethod, "convertDidMethod");
|
|
1151
972
|
|
|
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";
|
|
1156
|
-
|
|
1157
973
|
// src/machine/Siopv2Machine.ts
|
|
1158
974
|
import { assign, createMachine, interpret } from "xstate";
|
|
1159
975
|
|
|
@@ -1199,8 +1015,8 @@ var Localization = class Localization2 {
|
|
|
1199
1015
|
var translate = Localization.translate;
|
|
1200
1016
|
|
|
1201
1017
|
// src/machine/Siopv2Machine.ts
|
|
1202
|
-
import { Loggers as
|
|
1203
|
-
var
|
|
1018
|
+
import { Loggers as Loggers3 } from "@sphereon/ssi-types";
|
|
1019
|
+
var logger3 = Loggers3.DEFAULT.get(LOGGER_NAMESPACE);
|
|
1204
1020
|
var Siopv2HasNoContactGuard = /* @__PURE__ */ __name((_ctx, _event) => {
|
|
1205
1021
|
const { contact } = _ctx;
|
|
1206
1022
|
return contact === void 0;
|
|
@@ -1221,7 +1037,7 @@ var Siopv2HasSelectableCredentialsAndContactGuard = /* @__PURE__ */ __name((_ctx
|
|
|
1221
1037
|
if (!contact) {
|
|
1222
1038
|
throw new Error("Missing contact request data in context");
|
|
1223
1039
|
}
|
|
1224
|
-
return authorizationRequestData.
|
|
1040
|
+
return authorizationRequestData.dcqlQuery !== void 0;
|
|
1225
1041
|
}, "Siopv2HasSelectableCredentialsAndContactGuard");
|
|
1226
1042
|
var Siopv2CreateContactGuard = /* @__PURE__ */ __name((_ctx, _event) => {
|
|
1227
1043
|
const { contactAlias, hasContactConsent } = _ctx;
|
|
@@ -1232,7 +1048,7 @@ var Siopv2HasSelectedRequiredCredentialsGuard = /* @__PURE__ */ __name((_ctx, _e
|
|
|
1232
1048
|
if (authorizationRequestData === void 0) {
|
|
1233
1049
|
throw new Error("Missing authorization request data in context");
|
|
1234
1050
|
}
|
|
1235
|
-
if (authorizationRequestData.
|
|
1051
|
+
if (authorizationRequestData.dcqlQuery === void 0) {
|
|
1236
1052
|
throw Error("No presentation definitions present");
|
|
1237
1053
|
}
|
|
1238
1054
|
return _ctx.selectedCredentials.length > 0;
|
|
@@ -1242,7 +1058,7 @@ var Siopv2IsSiopOnlyGuard = /* @__PURE__ */ __name((_ctx, _event) => {
|
|
|
1242
1058
|
if (authorizationRequestData === void 0) {
|
|
1243
1059
|
throw new Error("Missing authorization request data in context");
|
|
1244
1060
|
}
|
|
1245
|
-
return authorizationRequestData.
|
|
1061
|
+
return authorizationRequestData.dcqlQuery === void 0;
|
|
1246
1062
|
}, "Siopv2IsSiopOnlyGuard");
|
|
1247
1063
|
var Siopv2IsSiopWithOID4VPGuard = /* @__PURE__ */ __name((_ctx, _event) => {
|
|
1248
1064
|
const { authorizationRequestData, selectableCredentialsMap } = _ctx;
|
|
@@ -1252,7 +1068,7 @@ var Siopv2IsSiopWithOID4VPGuard = /* @__PURE__ */ __name((_ctx, _event) => {
|
|
|
1252
1068
|
if (!selectableCredentialsMap) {
|
|
1253
1069
|
throw new Error("Missing selectableCredentialsMap in context");
|
|
1254
1070
|
}
|
|
1255
|
-
return authorizationRequestData.
|
|
1071
|
+
return authorizationRequestData.dcqlQuery !== void 0;
|
|
1256
1072
|
}, "Siopv2IsSiopWithOID4VPGuard");
|
|
1257
1073
|
var createSiopv2Machine = /* @__PURE__ */ __name((opts) => {
|
|
1258
1074
|
const { url, idOpts: idOpts2 } = opts;
|
|
@@ -1530,7 +1346,7 @@ var Siopv2Machine = class {
|
|
|
1530
1346
|
__name(this, "Siopv2Machine");
|
|
1531
1347
|
}
|
|
1532
1348
|
static newInstance(opts) {
|
|
1533
|
-
|
|
1349
|
+
logger3.info("New Siopv2Machine instance");
|
|
1534
1350
|
const interpreter = interpret(createSiopv2Machine(opts).withConfig({
|
|
1535
1351
|
services: {
|
|
1536
1352
|
...opts?.services
|
|
@@ -1558,7 +1374,7 @@ var Siopv2Machine = class {
|
|
|
1558
1374
|
});
|
|
1559
1375
|
}
|
|
1560
1376
|
interpreter.onTransition((snapshot) => {
|
|
1561
|
-
|
|
1377
|
+
logger3.info("onTransition to new state", snapshot.value);
|
|
1562
1378
|
});
|
|
1563
1379
|
return {
|
|
1564
1380
|
interpreter
|
|
@@ -1567,115 +1383,57 @@ var Siopv2Machine = class {
|
|
|
1567
1383
|
};
|
|
1568
1384
|
|
|
1569
1385
|
// src/services/Siopv2MachineService.ts
|
|
1570
|
-
import { SupportedVersion as SupportedVersion2 } from "@sphereon/did-auth-siop";
|
|
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
1386
|
import { getOrCreatePrimaryIdentifier, SupportedDidMethodEnum } from "@sphereon/ssi-sdk-ext.did-utils";
|
|
1577
|
-
import {
|
|
1387
|
+
import { isOID4VCIssuerIdentifier } from "@sphereon/ssi-sdk-ext.identifier-resolution";
|
|
1388
|
+
import { encodeJoseBlob } from "@sphereon/ssi-sdk.core";
|
|
1389
|
+
import { verifiableCredentialForRoleFilter } from "@sphereon/ssi-sdk.credential-store";
|
|
1390
|
+
import { ConnectionType } from "@sphereon/ssi-sdk.data-store-types";
|
|
1391
|
+
import { CredentialMapper as CredentialMapper4, CredentialRole, Loggers as Loggers4 } from "@sphereon/ssi-types";
|
|
1578
1392
|
import { DcqlPresentation, DcqlQuery } from "dcql";
|
|
1579
1393
|
|
|
1580
1394
|
// src/utils/dcql.ts
|
|
1581
1395
|
import { CredentialMapper as CredentialMapper3 } from "@sphereon/ssi-types";
|
|
1396
|
+
import { Dcql } from "@sphereon/did-auth-siop";
|
|
1582
1397
|
|
|
1583
1398
|
// src/utils/CredentialUtils.ts
|
|
1584
1399
|
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");
|
|
1602
1400
|
var isUniqueDigitalCredential = /* @__PURE__ */ __name((credential) => {
|
|
1603
1401
|
return credential.digitalCredential !== void 0;
|
|
1604
1402
|
}, "isUniqueDigitalCredential");
|
|
1605
1403
|
|
|
1606
1404
|
// src/utils/dcql.ts
|
|
1607
1405
|
function convertToDcqlCredentials(credential, hasher) {
|
|
1608
|
-
let
|
|
1406
|
+
let originalVerifiableCredential;
|
|
1609
1407
|
if (isUniqueDigitalCredential(credential)) {
|
|
1610
1408
|
if (!credential.originalVerifiableCredential) {
|
|
1611
1409
|
throw new Error("originalVerifiableCredential is not defined in UniqueDigitalCredential");
|
|
1612
1410
|
}
|
|
1613
|
-
|
|
1411
|
+
originalVerifiableCredential = CredentialMapper3.decodeVerifiableCredential(credential.originalVerifiableCredential, hasher);
|
|
1614
1412
|
} else {
|
|
1615
|
-
|
|
1413
|
+
originalVerifiableCredential = CredentialMapper3.decodeVerifiableCredential(credential, hasher);
|
|
1616
1414
|
}
|
|
1617
|
-
if (!
|
|
1415
|
+
if (!originalVerifiableCredential) {
|
|
1618
1416
|
throw new Error("No payload found");
|
|
1619
1417
|
}
|
|
1620
|
-
if (
|
|
1621
|
-
|
|
1622
|
-
}
|
|
1623
|
-
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
|
|
1627
|
-
|
|
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
|
-
};
|
|
1418
|
+
if (CredentialMapper3.isJwtDecodedCredential(originalVerifiableCredential)) {
|
|
1419
|
+
return Dcql.toDcqlJwtCredential(CredentialMapper3.toWrappedVerifiableCredential(originalVerifiableCredential));
|
|
1420
|
+
} else if (CredentialMapper3.isSdJwtDecodedCredential(originalVerifiableCredential)) {
|
|
1421
|
+
return Dcql.toDcqlSdJwtCredential(CredentialMapper3.toWrappedVerifiableCredential(originalVerifiableCredential));
|
|
1422
|
+
} else if (CredentialMapper3.isMsoMdocDecodedCredential(originalVerifiableCredential)) {
|
|
1423
|
+
return Dcql.toDcqlMdocCredential(CredentialMapper3.toWrappedVerifiableCredential(originalVerifiableCredential));
|
|
1424
|
+
} else if (CredentialMapper3.isW3cCredential(originalVerifiableCredential)) {
|
|
1425
|
+
return Dcql.toDcqlJsonLdCredential(CredentialMapper3.toWrappedVerifiableCredential(originalVerifiableCredential));
|
|
1640
1426
|
}
|
|
1427
|
+
throw Error(`Unable to map credential to DCQL credential. Credential: ${JSON.stringify(originalVerifiableCredential)}`);
|
|
1641
1428
|
}
|
|
1642
1429
|
__name(convertToDcqlCredentials, "convertToDcqlCredentials");
|
|
1643
1430
|
|
|
1644
1431
|
// src/services/Siopv2MachineService.ts
|
|
1645
|
-
var
|
|
1646
|
-
var
|
|
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");
|
|
1432
|
+
var CLOCK_SKEW2 = 120;
|
|
1433
|
+
var logger4 = Loggers4.DEFAULT.get(LOGGER_NAMESPACE);
|
|
1672
1434
|
var siopSendAuthorizationResponse = /* @__PURE__ */ __name(async (connectionType, args, context) => {
|
|
1673
1435
|
const { agent } = context;
|
|
1674
|
-
const
|
|
1675
|
-
...context,
|
|
1676
|
-
agent: context.agent
|
|
1677
|
-
};
|
|
1678
|
-
let { idOpts: idOpts2, isFirstParty, hasher = defaultHasher2 } = args;
|
|
1436
|
+
const { credentials } = args;
|
|
1679
1437
|
if (connectionType !== ConnectionType.SIOPv2_OpenID4VP) {
|
|
1680
1438
|
return Promise.reject(Error(`No supported authentication provider for type: ${connectionType}`));
|
|
1681
1439
|
}
|
|
@@ -1683,252 +1441,154 @@ var siopSendAuthorizationResponse = /* @__PURE__ */ __name(async (connectionType
|
|
|
1683
1441
|
sessionId: args.sessionId
|
|
1684
1442
|
});
|
|
1685
1443
|
const request = await session.getAuthorizationRequest();
|
|
1686
|
-
const aud =
|
|
1687
|
-
|
|
1688
|
-
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
|
|
1696
|
-
|
|
1697
|
-
|
|
1698
|
-
|
|
1699
|
-
|
|
1700
|
-
|
|
1444
|
+
const aud = request.authorizationRequest.getMergedProperty("aud");
|
|
1445
|
+
logger4.debug(`AUD: ${aud}`);
|
|
1446
|
+
logger4.debug(JSON.stringify(request.authorizationRequest));
|
|
1447
|
+
const domain = await request.authorizationRequest.getMergedProperty("client_id") ?? request.issuer ?? "https://self-issued.me/v2";
|
|
1448
|
+
logger4.debug(`NONCE: ${session.nonce}, domain: ${domain}`);
|
|
1449
|
+
const firstUniqueDC = credentials[0];
|
|
1450
|
+
if (typeof firstUniqueDC !== "object" || !("digitalCredential" in firstUniqueDC)) {
|
|
1451
|
+
return Promise.reject(Error("SiopMachine only supports UniqueDigitalCredentials for now"));
|
|
1452
|
+
}
|
|
1453
|
+
let identifier;
|
|
1454
|
+
const digitalCredential = firstUniqueDC.digitalCredential;
|
|
1455
|
+
const firstVC = firstUniqueDC.uniformVerifiableCredential;
|
|
1456
|
+
let holder;
|
|
1457
|
+
if (CredentialMapper4.isSdJwtDecodedCredential(firstVC)) {
|
|
1458
|
+
holder = firstVC.decodedPayload.cnf?.jwk ? `did:jwk:${encodeJoseBlob(firstVC.decodedPayload.cnf?.jwk)}#0` : firstVC.decodedPayload.sub;
|
|
1459
|
+
} else {
|
|
1460
|
+
holder = Array.isArray(firstVC.credentialSubject) ? firstVC.credentialSubject[0].id : firstVC.credentialSubject.id;
|
|
1461
|
+
}
|
|
1462
|
+
if (!digitalCredential.kmsKeyRef) {
|
|
1463
|
+
if (!holder) {
|
|
1464
|
+
return Promise.reject(`No holder found and no kmsKeyRef in DB. Cannot determine identifier to use`);
|
|
1701
1465
|
}
|
|
1702
|
-
|
|
1703
|
-
|
|
1704
|
-
|
|
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
|
|
1466
|
+
try {
|
|
1467
|
+
identifier = await session.context.agent.identifierManagedGet({
|
|
1468
|
+
identifier: holder
|
|
1724
1469
|
});
|
|
1725
|
-
}
|
|
1726
|
-
|
|
1727
|
-
|
|
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);
|
|
1750
|
-
}
|
|
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
|
-
}
|
|
1758
|
-
});
|
|
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}`);
|
|
1470
|
+
} catch (e) {
|
|
1471
|
+
logger4.debug(`Holder DID not found: ${holder}`);
|
|
1472
|
+
throw e;
|
|
1763
1473
|
}
|
|
1764
|
-
|
|
1765
|
-
|
|
1766
|
-
|
|
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
|
|
1474
|
+
} else if (isOID4VCIssuerIdentifier(digitalCredential.kmsKeyRef)) {
|
|
1475
|
+
identifier = await session.context.agent.identifierManagedGetByOID4VCIssuer({
|
|
1476
|
+
identifier: firstUniqueDC.digitalCredential.kmsKeyRef
|
|
1779
1477
|
});
|
|
1780
|
-
} else
|
|
1781
|
-
|
|
1782
|
-
|
|
1783
|
-
|
|
1784
|
-
|
|
1785
|
-
|
|
1786
|
-
if (typeof firstUniqueDC !== "object" || !("digitalCredential" in firstUniqueDC)) {
|
|
1787
|
-
return Promise.reject(Error("SiopMachine only supports UniqueDigitalCredentials for now"));
|
|
1788
|
-
}
|
|
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
|
|
1478
|
+
} else {
|
|
1479
|
+
switch (digitalCredential.subjectCorrelationType) {
|
|
1480
|
+
case "DID":
|
|
1481
|
+
identifier = await session.context.agent.identifierManagedGetByDid({
|
|
1482
|
+
identifier: digitalCredential.subjectCorrelationId ?? holder,
|
|
1483
|
+
kmsKeyRef: digitalCredential.kmsKeyRef
|
|
1811
1484
|
});
|
|
1812
|
-
|
|
1813
|
-
|
|
1814
|
-
|
|
1815
|
-
|
|
1816
|
-
|
|
1817
|
-
|
|
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
|
-
}
|
|
1827
|
-
}
|
|
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
|
-
}
|
|
1485
|
+
break;
|
|
1486
|
+
// TODO other implementations?
|
|
1487
|
+
default:
|
|
1488
|
+
identifier = await session.context.agent.identifierManagedGetByKid({
|
|
1489
|
+
identifier: digitalCredential.subjectCorrelationId ?? holder ?? digitalCredential.kmsKeyRef,
|
|
1490
|
+
kmsKeyRef: digitalCredential.kmsKeyRef
|
|
1850
1491
|
});
|
|
1492
|
+
}
|
|
1493
|
+
}
|
|
1494
|
+
const dcqlCredentialsWithCredentials = new Map(credentials.map((vc) => [
|
|
1495
|
+
convertToDcqlCredentials(vc),
|
|
1496
|
+
vc
|
|
1497
|
+
]));
|
|
1498
|
+
const queryResult = DcqlQuery.query(request.dcqlQuery, Array.from(dcqlCredentialsWithCredentials.keys()));
|
|
1499
|
+
if (!queryResult.can_be_satisfied) {
|
|
1500
|
+
return Promise.reject(Error("Credentials do not match required query request"));
|
|
1501
|
+
}
|
|
1502
|
+
const presentationContext = {
|
|
1503
|
+
nonce: request.requestObject?.getPayload()?.nonce ?? session.nonce,
|
|
1504
|
+
audience: domain,
|
|
1505
|
+
agent: context.agent,
|
|
1506
|
+
clockSkew: CLOCK_SKEW2,
|
|
1507
|
+
hasher: args.hasher
|
|
1508
|
+
};
|
|
1509
|
+
const presentation = {};
|
|
1510
|
+
const uniqueCredentials = Array.from(dcqlCredentialsWithCredentials.values());
|
|
1511
|
+
for (const [key, value] of Object.entries(queryResult.credential_matches)) {
|
|
1512
|
+
if (value.success) {
|
|
1513
|
+
const matchedCredentials = value.valid_credentials.map((cred) => uniqueCredentials[cred.input_credential_index]);
|
|
1514
|
+
const vc = matchedCredentials[0];
|
|
1515
|
+
if (!vc) {
|
|
1516
|
+
continue;
|
|
1517
|
+
}
|
|
1518
|
+
try {
|
|
1519
|
+
const vp = await createVerifiablePresentationForFormat(vc, identifier, presentationContext);
|
|
1520
|
+
presentation[key] = vp;
|
|
1521
|
+
} catch (error) {
|
|
1522
|
+
logger4.error(`Failed to create VP for credential ${key}:`, error);
|
|
1523
|
+
throw error;
|
|
1851
1524
|
}
|
|
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;
|
|
1862
1525
|
}
|
|
1863
1526
|
}
|
|
1864
|
-
|
|
1527
|
+
const dcqlPresentation = DcqlPresentation.parse(presentation);
|
|
1528
|
+
const response = session.sendAuthorizationResponse({
|
|
1529
|
+
responseSignerOpts: identifier,
|
|
1530
|
+
dcqlResponse: {
|
|
1531
|
+
dcqlPresentation
|
|
1532
|
+
}
|
|
1533
|
+
});
|
|
1534
|
+
logger4.debug(`Response: `, response);
|
|
1535
|
+
return response;
|
|
1865
1536
|
}, "siopSendAuthorizationResponse");
|
|
1866
|
-
|
|
1867
|
-
return {
|
|
1868
|
-
...presentationDefinition,
|
|
1869
|
-
input_descriptors: [
|
|
1870
|
-
inputDescriptor
|
|
1871
|
-
]
|
|
1872
|
-
};
|
|
1873
|
-
}
|
|
1874
|
-
__name(buildPartialPD, "buildPartialPD");
|
|
1875
|
-
var getSelectableCredentials = /* @__PURE__ */ __name(async (presentationDefinition, context) => {
|
|
1537
|
+
var getSelectableCredentials = /* @__PURE__ */ __name(async (dcqlQuery, context) => {
|
|
1876
1538
|
const agentContext = {
|
|
1877
1539
|
...context,
|
|
1878
1540
|
agent: context.agent
|
|
1879
1541
|
};
|
|
1880
1542
|
const { agent } = agentContext;
|
|
1881
|
-
const pex = new PEX2();
|
|
1882
1543
|
const uniqueVerifiableCredentials = await agent.crsGetUniqueCredentials({
|
|
1883
|
-
filter:
|
|
1544
|
+
filter: verifiableCredentialForRoleFilter(CredentialRole.HOLDER)
|
|
1884
1545
|
});
|
|
1885
|
-
const
|
|
1546
|
+
const branding = await agent.ibGetCredentialBranding();
|
|
1547
|
+
const dcqlCredentialsWithCredentials = new Map(uniqueVerifiableCredentials.map((vc) => [
|
|
1548
|
+
convertToDcqlCredentials(vc),
|
|
1549
|
+
vc
|
|
1550
|
+
]));
|
|
1551
|
+
const queryResult = DcqlQuery.query(dcqlQuery, Array.from(dcqlCredentialsWithCredentials.keys()));
|
|
1552
|
+
const uniqueCredentials = Array.from(dcqlCredentialsWithCredentials.values());
|
|
1886
1553
|
const selectableCredentialsMap = /* @__PURE__ */ new Map();
|
|
1887
|
-
for (const
|
|
1888
|
-
|
|
1889
|
-
|
|
1890
|
-
|
|
1891
|
-
|
|
1892
|
-
|
|
1893
|
-
|
|
1894
|
-
|
|
1895
|
-
|
|
1896
|
-
|
|
1897
|
-
|
|
1898
|
-
|
|
1899
|
-
|
|
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
|
-
}
|
|
1554
|
+
for (const [key, value] of Object.entries(queryResult.credential_matches)) {
|
|
1555
|
+
if (!value.valid_credentials) {
|
|
1556
|
+
continue;
|
|
1557
|
+
}
|
|
1558
|
+
const mapSelectableCredentialPromises = value.valid_credentials.map(async (cred) => {
|
|
1559
|
+
const matchedCredential = uniqueCredentials[cred.input_credential_index];
|
|
1560
|
+
const credentialBranding = branding.filter((cb) => cb.vcHash === matchedCredential.hash);
|
|
1561
|
+
const issuerPartyIdentity = await agent.cmGetContacts({
|
|
1562
|
+
filter: [
|
|
1563
|
+
{
|
|
1564
|
+
identities: {
|
|
1565
|
+
identifier: {
|
|
1566
|
+
correlationId: matchedCredential.uniformVerifiableCredential.issuerDid
|
|
1908
1567
|
}
|
|
1909
1568
|
}
|
|
1910
|
-
|
|
1911
|
-
|
|
1912
|
-
|
|
1913
|
-
|
|
1914
|
-
|
|
1915
|
-
|
|
1916
|
-
|
|
1917
|
-
|
|
1918
|
-
|
|
1569
|
+
}
|
|
1570
|
+
]
|
|
1571
|
+
});
|
|
1572
|
+
const subjectPartyIdentity = await agent.cmGetContacts({
|
|
1573
|
+
filter: [
|
|
1574
|
+
{
|
|
1575
|
+
identities: {
|
|
1576
|
+
identifier: {
|
|
1577
|
+
correlationId: matchedCredential.uniformVerifiableCredential.subjectDid
|
|
1919
1578
|
}
|
|
1920
1579
|
}
|
|
1921
|
-
|
|
1922
|
-
|
|
1923
|
-
|
|
1924
|
-
|
|
1925
|
-
|
|
1926
|
-
|
|
1927
|
-
|
|
1928
|
-
|
|
1929
|
-
}
|
|
1930
|
-
}
|
|
1931
|
-
|
|
1580
|
+
}
|
|
1581
|
+
]
|
|
1582
|
+
});
|
|
1583
|
+
return {
|
|
1584
|
+
credential: matchedCredential,
|
|
1585
|
+
credentialBranding: credentialBranding[0]?.localeBranding,
|
|
1586
|
+
issuerParty: issuerPartyIdentity?.[0],
|
|
1587
|
+
subjectParty: subjectPartyIdentity?.[0]
|
|
1588
|
+
};
|
|
1589
|
+
});
|
|
1590
|
+
const selectableCredentials = await Promise.all(mapSelectableCredentialPromises);
|
|
1591
|
+
selectableCredentialsMap.set(key, selectableCredentials);
|
|
1932
1592
|
}
|
|
1933
1593
|
return selectableCredentialsMap;
|
|
1934
1594
|
}, "getSelectableCredentials");
|
|
@@ -1952,7 +1612,7 @@ var translateCorrelationIdToName = /* @__PURE__ */ __name(async (correlationId,
|
|
|
1952
1612
|
}, "translateCorrelationIdToName");
|
|
1953
1613
|
|
|
1954
1614
|
// src/agent/DidAuthSiopOpAuthenticator.ts
|
|
1955
|
-
var
|
|
1615
|
+
var logger5 = Loggers5.DEFAULT.options(LOGGER_NAMESPACE, {}).get(LOGGER_NAMESPACE);
|
|
1956
1616
|
var didAuthSiopOpAuthenticatorMethods = [
|
|
1957
1617
|
"cmGetContacts",
|
|
1958
1618
|
"cmGetContact",
|
|
@@ -1969,7 +1629,7 @@ var DidAuthSiopOpAuthenticator = class {
|
|
|
1969
1629
|
static {
|
|
1970
1630
|
__name(this, "DidAuthSiopOpAuthenticator");
|
|
1971
1631
|
}
|
|
1972
|
-
schema =
|
|
1632
|
+
schema = plugin_schema_default.IDidAuthSiopOpAuthenticator;
|
|
1973
1633
|
methods = {
|
|
1974
1634
|
siopGetOPSession: this.siopGetOPSession.bind(this),
|
|
1975
1635
|
siopRegisterOPSession: this.siopRegisterOPSession.bind(this),
|
|
@@ -2106,13 +1766,13 @@ var DidAuthSiopOpAuthenticator = class {
|
|
|
2106
1766
|
hasher: this.hasher
|
|
2107
1767
|
}
|
|
2108
1768
|
}));
|
|
2109
|
-
|
|
1769
|
+
logger5.debug(`session: ${JSON.stringify(session.id, null, 2)}`);
|
|
2110
1770
|
const verifiedAuthorizationRequest = await session.getAuthorizationRequest();
|
|
2111
1771
|
const clientName = verifiedAuthorizationRequest.registrationMetadataPayload?.client_name;
|
|
2112
1772
|
const url = verifiedAuthorizationRequest.responseURI ?? (args.url.includes("request_uri") ? decodeURIComponent(args.url.split("?request_uri=")[1].trim()) : verifiedAuthorizationRequest.issuer ?? verifiedAuthorizationRequest.registrationMetadataPayload?.client_id);
|
|
2113
|
-
const uri = url
|
|
1773
|
+
const uri = url?.includes("://") ? new URL(url) : void 0;
|
|
2114
1774
|
const correlationId = uri?.hostname ?? await this.determineCorrelationId(uri, verifiedAuthorizationRequest, clientName, context);
|
|
2115
|
-
const clientId =
|
|
1775
|
+
const clientId = verifiedAuthorizationRequest.authorizationRequest.getMergedProperty("client_id");
|
|
2116
1776
|
return {
|
|
2117
1777
|
issuer: verifiedAuthorizationRequest.issuer,
|
|
2118
1778
|
correlationId,
|
|
@@ -2120,7 +1780,6 @@ var DidAuthSiopOpAuthenticator = class {
|
|
|
2120
1780
|
uri,
|
|
2121
1781
|
name: clientName,
|
|
2122
1782
|
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,
|
|
2124
1783
|
dcqlQuery: verifiedAuthorizationRequest.dcqlQuery
|
|
2125
1784
|
};
|
|
2126
1785
|
}
|
|
@@ -2186,7 +1845,7 @@ var DidAuthSiopOpAuthenticator = class {
|
|
|
2186
1845
|
contactId: contact.id,
|
|
2187
1846
|
identity: addedIdentity
|
|
2188
1847
|
});
|
|
2189
|
-
|
|
1848
|
+
logger5.info(`Contact identity created: ${JSON.stringify(addedIdentity)}`);
|
|
2190
1849
|
}
|
|
2191
1850
|
}
|
|
2192
1851
|
async siopSendResponse(args, context) {
|
|
@@ -2197,75 +1856,14 @@ var DidAuthSiopOpAuthenticator = class {
|
|
|
2197
1856
|
if (authorizationRequestData === void 0) {
|
|
2198
1857
|
return Promise.reject(Error("Missing authorization request data in context"));
|
|
2199
1858
|
}
|
|
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
|
-
}
|
|
2259
1859
|
const response = await siopSendAuthorizationResponse(ConnectionType2.SIOPv2_OpenID4VP, {
|
|
2260
1860
|
sessionId: didAuthConfig.sessionId,
|
|
2261
1861
|
...args.idOpts && {
|
|
2262
1862
|
idOpts: args.idOpts
|
|
2263
1863
|
},
|
|
2264
|
-
...authorizationRequestData.presentationDefinitions !== void 0 && {
|
|
2265
|
-
verifiableCredentialsWithDefinition
|
|
2266
|
-
},
|
|
2267
1864
|
isFirstParty,
|
|
2268
|
-
hasher: this.hasher
|
|
1865
|
+
hasher: this.hasher,
|
|
1866
|
+
credentials: selectedCredentials
|
|
2269
1867
|
}, context);
|
|
2270
1868
|
const contentType = response.headers.get("content-type") || "";
|
|
2271
1869
|
let responseBody = null;
|
|
@@ -2279,36 +1877,18 @@ var DidAuthSiopOpAuthenticator = class {
|
|
|
2279
1877
|
queryParams: decodeUriAsJson(response?.url)
|
|
2280
1878
|
};
|
|
2281
1879
|
}
|
|
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");
|
|
2297
1880
|
async siopGetSelectableCredentials(args, context) {
|
|
2298
1881
|
const { authorizationRequestData } = args;
|
|
2299
|
-
if (!authorizationRequestData
|
|
2300
|
-
return Promise.reject(Error("Missing required
|
|
1882
|
+
if (!authorizationRequestData?.dcqlQuery) {
|
|
1883
|
+
return Promise.reject(Error("Missing required dcql query in context"));
|
|
2301
1884
|
}
|
|
2302
|
-
|
|
2303
|
-
return Promise.reject(Error("Multiple presentation definitions present"));
|
|
2304
|
-
}
|
|
2305
|
-
return getSelectableCredentials(authorizationRequestData.presentationDefinitions[0].definition, context);
|
|
1885
|
+
return getSelectableCredentials(authorizationRequestData?.dcqlQuery, context);
|
|
2306
1886
|
}
|
|
2307
1887
|
};
|
|
2308
1888
|
|
|
2309
1889
|
// src/machine/CallbackStateListener.ts
|
|
2310
|
-
import { Loggers as
|
|
2311
|
-
var
|
|
1890
|
+
import { Loggers as Loggers6, LogLevel, LogMethod } from "@sphereon/ssi-types";
|
|
1891
|
+
var logger6 = Loggers6.DEFAULT.options("sphereon:siopv2-oid4vp:op-auth", {
|
|
2312
1892
|
defaultLogLevel: LogLevel.DEBUG,
|
|
2313
1893
|
methods: [
|
|
2314
1894
|
LogMethod.CONSOLE
|
|
@@ -2317,21 +1897,21 @@ var logger5 = Loggers5.DEFAULT.options("sphereon:siopv2-oid4vp:op-auth", {
|
|
|
2317
1897
|
var OID4VPCallbackStateListener = /* @__PURE__ */ __name((callbacks) => {
|
|
2318
1898
|
return async (oid4vciMachine, state) => {
|
|
2319
1899
|
if (state._event.type === "internal") {
|
|
2320
|
-
|
|
1900
|
+
logger6.debug("oid4vpCallbackStateListener: internal event");
|
|
2321
1901
|
return;
|
|
2322
1902
|
}
|
|
2323
|
-
|
|
1903
|
+
logger6.info(`VP state listener state: ${JSON.stringify(state.value)}`);
|
|
2324
1904
|
if (!callbacks || callbacks.size === 0) {
|
|
2325
|
-
|
|
1905
|
+
logger6.info(`VP no callbacks registered for state: ${JSON.stringify(state.value)}`);
|
|
2326
1906
|
return;
|
|
2327
1907
|
}
|
|
2328
1908
|
for (const [stateKey, callback] of callbacks) {
|
|
2329
1909
|
if (state.matches(stateKey)) {
|
|
2330
|
-
|
|
2331
|
-
await callback(oid4vciMachine, state).then(() =>
|
|
2332
|
-
|
|
1910
|
+
logger6.log(`VP state callback for state: ${JSON.stringify(state.value)}, will execute...`);
|
|
1911
|
+
await callback(oid4vciMachine, state).then(() => logger6.log(`VP state callback executed for state: ${JSON.stringify(state.value)}`)).catch((error) => {
|
|
1912
|
+
logger6.error(`VP state callback failed for state: ${JSON.stringify(state.value)}, error: ${JSON.stringify(error?.message)}, ${JSON.stringify(state.event)}`);
|
|
2333
1913
|
if (error.stack) {
|
|
2334
|
-
|
|
1914
|
+
logger6.error(error.stack);
|
|
2335
1915
|
}
|
|
2336
1916
|
});
|
|
2337
1917
|
break;
|
|
@@ -2344,8 +1924,8 @@ var OID4VPCallbackStateListener = /* @__PURE__ */ __name((callbacks) => {
|
|
|
2344
1924
|
import { contextHasPlugin } from "@sphereon/ssi-sdk.agent-config";
|
|
2345
1925
|
import { LinkHandlerAdapter } from "@sphereon/ssi-sdk.core";
|
|
2346
1926
|
import { interpreterStartOrResume } from "@sphereon/ssi-sdk.xstate-machine-persistence";
|
|
2347
|
-
import { Loggers as
|
|
2348
|
-
var
|
|
1927
|
+
import { Loggers as Loggers7 } from "@sphereon/ssi-types";
|
|
1928
|
+
var logger7 = Loggers7.DEFAULT.options(LOGGER_NAMESPACE, {}).get(LOGGER_NAMESPACE);
|
|
2349
1929
|
var Siopv2OID4VPLinkHandler = class extends LinkHandlerAdapter {
|
|
2350
1930
|
static {
|
|
2351
1931
|
__name(this, "Siopv2OID4VPLinkHandler");
|
|
@@ -2365,7 +1945,7 @@ var Siopv2OID4VPLinkHandler = class extends LinkHandlerAdapter {
|
|
|
2365
1945
|
this.idOpts = args.idOpts;
|
|
2366
1946
|
}
|
|
2367
1947
|
async handle(url, opts) {
|
|
2368
|
-
|
|
1948
|
+
logger7.debug(`handling SIOP link: ${url}`);
|
|
2369
1949
|
const siopv2Machine = await this.context.agent.siopGetMachineInterpreter({
|
|
2370
1950
|
url,
|
|
2371
1951
|
idOpts: opts?.idOpts ?? this.idOpts,
|
|
@@ -2381,22 +1961,18 @@ var Siopv2OID4VPLinkHandler = class extends LinkHandlerAdapter {
|
|
|
2381
1961
|
singletonCheck: true,
|
|
2382
1962
|
noRegistration: this.noStateMachinePersistence
|
|
2383
1963
|
});
|
|
2384
|
-
|
|
1964
|
+
logger7.debug(`SIOP machine started for link: ${url}`, init);
|
|
2385
1965
|
} else {
|
|
2386
1966
|
interpreter.start(opts?.machineState);
|
|
2387
|
-
|
|
1967
|
+
logger7.debug(`SIOP machine started for link: ${url}`);
|
|
2388
1968
|
}
|
|
2389
1969
|
}
|
|
2390
1970
|
};
|
|
2391
|
-
|
|
2392
|
-
// src/index.ts
|
|
2393
|
-
var schema = require_plugin_schema();
|
|
2394
1971
|
export {
|
|
2395
1972
|
DEFAULT_JWT_PROOF_TYPE,
|
|
2396
1973
|
DID_PREFIX,
|
|
2397
1974
|
DidAuthSiopOpAuthenticator,
|
|
2398
1975
|
LOGGER_NAMESPACE,
|
|
2399
|
-
OID4VP,
|
|
2400
1976
|
OID4VPCallbackStateListener,
|
|
2401
1977
|
OpSession,
|
|
2402
1978
|
Siopv2HolderEvent,
|
|
@@ -2408,14 +1984,15 @@ export {
|
|
|
2408
1984
|
Siopv2MachineStates,
|
|
2409
1985
|
Siopv2OID4VPLinkHandler,
|
|
2410
1986
|
SupportedLanguage,
|
|
1987
|
+
convertToDcqlCredentials,
|
|
2411
1988
|
createJwtCallbackWithIdOpts,
|
|
2412
1989
|
createJwtCallbackWithOpOpts,
|
|
2413
1990
|
createOID4VPPresentationSignCallback,
|
|
2414
1991
|
createOP,
|
|
2415
1992
|
createOPBuilder,
|
|
1993
|
+
createVerifiablePresentationForFormat,
|
|
2416
1994
|
didAuthSiopOpAuthenticatorMethods,
|
|
2417
|
-
events,
|
|
2418
1995
|
getSigningAlgo,
|
|
2419
|
-
schema
|
|
1996
|
+
plugin_schema_default as schema
|
|
2420
1997
|
};
|
|
2421
1998
|
//# sourceMappingURL=index.js.map
|