@sphereon/ssi-sdk.siopv2-oid4vp-op-auth 0.34.1-feature.SSISDK.46.45 → 0.34.1-feature.SSISDK.47.154
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 +584 -1106
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +709 -111
- package/dist/index.d.ts +709 -111
- package/dist/index.js +521 -1043
- package/dist/index.js.map +1 -1
- package/package.json +24 -24
- package/src/agent/DidAuthSiopOpAuthenticator.ts +9 -144
- package/src/index.ts +2 -1
- package/src/machine/Siopv2Machine.ts +4 -4
- package/src/services/Siopv2MachineService.ts +133 -265
- package/src/session/OID4VP.ts +310 -299
- package/src/session/OpSession.ts +22 -114
- package/src/types/IDidAuthSiopOpAuthenticator.ts +5 -58
- package/src/types/identifier/index.ts +0 -4
- package/src/types/siop-service/index.ts +1 -3
- package/src/utils/CredentialUtils.ts +1 -39
- package/src/utils/dcql.ts +22 -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"
|
|
133
98
|
},
|
|
134
|
-
|
|
99
|
+
additionalProperties: false
|
|
100
|
+
},
|
|
101
|
+
required: ["identifier"],
|
|
102
|
+
description: "Arguments needed for {@link DidAuthSiopOpAuthenticator.registerSessionForSiop } "
|
|
103
|
+
},
|
|
104
|
+
IRemoveSiopSessionArgs: {
|
|
105
|
+
type: "object",
|
|
106
|
+
properties: {
|
|
107
|
+
sessionId: {
|
|
108
|
+
type: "string"
|
|
109
|
+
},
|
|
110
|
+
additionalProperties: false
|
|
111
|
+
},
|
|
112
|
+
required: ["sessionId"],
|
|
113
|
+
description: "Arguments needed for {@link DidAuthSiopOpAuthenticator.removeSessionForSiop } "
|
|
114
|
+
},
|
|
115
|
+
IAuthenticateWithSiopArgs: {
|
|
116
|
+
type: "object",
|
|
117
|
+
properties: {
|
|
118
|
+
sessionId: {
|
|
119
|
+
type: "string"
|
|
120
|
+
},
|
|
121
|
+
stateId: {
|
|
122
|
+
type: "string"
|
|
123
|
+
},
|
|
124
|
+
redirectUrl: {
|
|
125
|
+
type: "string"
|
|
126
|
+
},
|
|
127
|
+
additionalProperties: false
|
|
128
|
+
},
|
|
129
|
+
required: ["sessionId", "stateId", "redirectUrl"],
|
|
130
|
+
description: "Arguments needed for {@link DidAuthSiopOpAuthenticator.authenticateWithSiop } "
|
|
131
|
+
},
|
|
132
|
+
IResponse: {
|
|
133
|
+
type: "object",
|
|
134
|
+
properties: {
|
|
135
|
+
status: {
|
|
136
|
+
type: "number"
|
|
137
|
+
},
|
|
138
|
+
additionalProperties: true
|
|
139
|
+
},
|
|
140
|
+
required: ["status"],
|
|
141
|
+
description: "Result of {@link DidAuthSiopOpAuthenticator.authenticateWithSiop & DidAuthSiopOpAuthenticator.sendSiopAuthenticationResponse } "
|
|
142
|
+
},
|
|
143
|
+
IGetSiopAuthenticationRequestFromRpArgs: {
|
|
144
|
+
type: "object",
|
|
145
|
+
properties: {
|
|
146
|
+
sessionId: {
|
|
147
|
+
type: "string"
|
|
148
|
+
},
|
|
149
|
+
stateId: {
|
|
150
|
+
type: "string"
|
|
151
|
+
},
|
|
152
|
+
redirectUrl: {
|
|
153
|
+
type: "string"
|
|
154
|
+
},
|
|
155
|
+
additionalProperties: false
|
|
156
|
+
},
|
|
157
|
+
required: ["sessionId", "stateId", "redirectUrl"],
|
|
158
|
+
description: "Arguments needed for {@link DidAuthSiopOpAuthenticator.getSiopAuthenticationRequestFromRP } "
|
|
159
|
+
},
|
|
160
|
+
ParsedAuthenticationRequestURI: {
|
|
161
|
+
type: "object",
|
|
162
|
+
properties: {
|
|
163
|
+
jwt: {
|
|
164
|
+
type: "string"
|
|
165
|
+
},
|
|
166
|
+
requestPayload: {
|
|
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
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
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"
|
|
211
|
+
},
|
|
212
|
+
alsoKnownAs: {
|
|
213
|
+
type: "array",
|
|
214
|
+
items: {
|
|
215
|
+
type: "string"
|
|
216
|
+
}
|
|
207
217
|
},
|
|
208
|
-
|
|
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 Loggers4 } from "@sphereon/ssi-types";
|
|
369
|
+
import { decodeUriAsJson } from "@sphereon/did-auth-siop";
|
|
370
|
+
import { ConnectionType as ConnectionType2, CorrelationIdentifierType, IdentityOrigin } from "@sphereon/ssi-sdk.data-store";
|
|
371
|
+
import { Loggers as Loggers4, CredentialRole as CredentialRole2 } from "@sphereon/ssi-types";
|
|
376
372
|
import { v4 as uuidv4 } from "uuid";
|
|
377
373
|
|
|
378
374
|
// src/session/functions.ts
|
|
@@ -528,104 +524,15 @@ function getSigningAlgo(type) {
|
|
|
528
524
|
}
|
|
529
525
|
__name(getSigningAlgo, "getSigningAlgo");
|
|
530
526
|
|
|
531
|
-
// src/session/OID4VP.ts
|
|
532
|
-
import { PresentationExchange } from "@sphereon/did-auth-siop";
|
|
533
|
-
import { Status } from "@sphereon/pex";
|
|
534
|
-
import { isManagedIdentifierDidResult, isOID4VCIssuerIdentifier } from "@sphereon/ssi-sdk-ext.identifier-resolution";
|
|
535
|
-
import { defaultHasher } from "@sphereon/ssi-sdk.core";
|
|
536
|
-
import { verifiableCredentialForRoleFilter } from "@sphereon/ssi-sdk.credential-store";
|
|
537
|
-
|
|
538
|
-
// src/types/IDidAuthSiopOpAuthenticator.ts
|
|
539
|
-
var LOGGER_NAMESPACE = "sphereon:siopv2-oid4vp:op-auth";
|
|
540
|
-
var events = /* @__PURE__ */ (function(events2) {
|
|
541
|
-
events2["DID_SIOP_AUTHENTICATED"] = "didSiopAuthenticated";
|
|
542
|
-
return events2;
|
|
543
|
-
})({});
|
|
544
|
-
var DEFAULT_JWT_PROOF_TYPE = "JwtProof2020";
|
|
545
|
-
|
|
546
|
-
// src/types/siop-service/index.ts
|
|
547
|
-
var Siopv2HolderEvent = /* @__PURE__ */ (function(Siopv2HolderEvent2) {
|
|
548
|
-
Siopv2HolderEvent2["CONTACT_IDENTITY_CREATED"] = "contact_identity_created";
|
|
549
|
-
Siopv2HolderEvent2["IDENTIFIER_CREATED"] = "identifier_created";
|
|
550
|
-
return Siopv2HolderEvent2;
|
|
551
|
-
})({});
|
|
552
|
-
var SupportedLanguage = /* @__PURE__ */ (function(SupportedLanguage2) {
|
|
553
|
-
SupportedLanguage2["ENGLISH"] = "en";
|
|
554
|
-
SupportedLanguage2["DUTCH"] = "nl";
|
|
555
|
-
return SupportedLanguage2;
|
|
556
|
-
})({});
|
|
557
|
-
|
|
558
|
-
// src/types/machine/index.ts
|
|
559
|
-
var Siopv2MachineStates = /* @__PURE__ */ (function(Siopv2MachineStates2) {
|
|
560
|
-
Siopv2MachineStates2["createConfig"] = "createConfig";
|
|
561
|
-
Siopv2MachineStates2["getSiopRequest"] = "getSiopRequest";
|
|
562
|
-
Siopv2MachineStates2["getSelectableCredentials"] = "getSelectableCredentials";
|
|
563
|
-
Siopv2MachineStates2["retrieveContact"] = "retrieveContact";
|
|
564
|
-
Siopv2MachineStates2["transitionFromSetup"] = "transitionFromSetup";
|
|
565
|
-
Siopv2MachineStates2["addContact"] = "addContact";
|
|
566
|
-
Siopv2MachineStates2["addContactIdentity"] = "addContactIdentity";
|
|
567
|
-
Siopv2MachineStates2["selectCredentials"] = "selectCredentials";
|
|
568
|
-
Siopv2MachineStates2["sendResponse"] = "sendResponse";
|
|
569
|
-
Siopv2MachineStates2["handleError"] = "handleError";
|
|
570
|
-
Siopv2MachineStates2["aborted"] = "aborted";
|
|
571
|
-
Siopv2MachineStates2["declined"] = "declined";
|
|
572
|
-
Siopv2MachineStates2["error"] = "error";
|
|
573
|
-
Siopv2MachineStates2["done"] = "done";
|
|
574
|
-
return Siopv2MachineStates2;
|
|
575
|
-
})({});
|
|
576
|
-
var Siopv2MachineAddContactStates = /* @__PURE__ */ (function(Siopv2MachineAddContactStates2) {
|
|
577
|
-
Siopv2MachineAddContactStates2["idle"] = "idle";
|
|
578
|
-
Siopv2MachineAddContactStates2["executing"] = "executing";
|
|
579
|
-
Siopv2MachineAddContactStates2["next"] = "next";
|
|
580
|
-
return Siopv2MachineAddContactStates2;
|
|
581
|
-
})({});
|
|
582
|
-
var Siopv2MachineEvents = /* @__PURE__ */ (function(Siopv2MachineEvents2) {
|
|
583
|
-
Siopv2MachineEvents2["NEXT"] = "NEXT";
|
|
584
|
-
Siopv2MachineEvents2["PREVIOUS"] = "PREVIOUS";
|
|
585
|
-
Siopv2MachineEvents2["DECLINE"] = "DECLINE";
|
|
586
|
-
Siopv2MachineEvents2["SET_CONTACT_ALIAS"] = "SET_CONTACT_ALIAS";
|
|
587
|
-
Siopv2MachineEvents2["SET_CONTACT_CONSENT"] = "SET_CONTACT_CONSENT";
|
|
588
|
-
Siopv2MachineEvents2["CREATE_CONTACT"] = "CREATE_CONTACT";
|
|
589
|
-
Siopv2MachineEvents2["SET_SELECTED_CREDENTIALS"] = "SET_SELECTED_CREDENTIALS";
|
|
590
|
-
return Siopv2MachineEvents2;
|
|
591
|
-
})({});
|
|
592
|
-
var Siopv2MachineGuards = /* @__PURE__ */ (function(Siopv2MachineGuards2) {
|
|
593
|
-
Siopv2MachineGuards2["hasNoContactGuard"] = "Siopv2HasNoContactGuard";
|
|
594
|
-
Siopv2MachineGuards2["createContactGuard"] = "Siopv2CreateContactGuard";
|
|
595
|
-
Siopv2MachineGuards2["hasContactGuard"] = "Siopv2HasContactGuard";
|
|
596
|
-
Siopv2MachineGuards2["hasAuthorizationRequestGuard"] = "Siopv2HasAuthorizationRequestGuard";
|
|
597
|
-
Siopv2MachineGuards2["hasSelectableCredentialsAndContactGuard"] = "Siopv2HasSelectableCredentialsAndContactGuard";
|
|
598
|
-
Siopv2MachineGuards2["hasSelectedRequiredCredentialsGuard"] = "Siopv2HasSelectedRequiredCredentialsGuard";
|
|
599
|
-
Siopv2MachineGuards2["siopOnlyGuard"] = "Siopv2IsSiopOnlyGuard";
|
|
600
|
-
Siopv2MachineGuards2["siopWithOID4VPGuard"] = "Siopv2IsSiopWithOID4VPGuard";
|
|
601
|
-
return Siopv2MachineGuards2;
|
|
602
|
-
})({});
|
|
603
|
-
var Siopv2MachineServices = /* @__PURE__ */ (function(Siopv2MachineServices2) {
|
|
604
|
-
Siopv2MachineServices2["getSiopRequest"] = "getSiopRequest";
|
|
605
|
-
Siopv2MachineServices2["getSelectableCredentials"] = "getSelectableCredentials";
|
|
606
|
-
Siopv2MachineServices2["retrieveContact"] = "retrieveContact";
|
|
607
|
-
Siopv2MachineServices2["addContactIdentity"] = "addContactIdentity";
|
|
608
|
-
Siopv2MachineServices2["sendResponse"] = "sendResponse";
|
|
609
|
-
Siopv2MachineServices2["createConfig"] = "createConfig";
|
|
610
|
-
return Siopv2MachineServices2;
|
|
611
|
-
})({});
|
|
612
|
-
|
|
613
|
-
// src/types/identifier/index.ts
|
|
614
|
-
var DID_PREFIX = "did";
|
|
615
|
-
|
|
616
527
|
// src/session/OID4VP.ts
|
|
617
528
|
var OID4VP = class _OID4VP {
|
|
618
529
|
static {
|
|
619
530
|
__name(this, "OID4VP");
|
|
620
531
|
}
|
|
621
|
-
session
|
|
622
|
-
allIdentifiers
|
|
623
|
-
hasher
|
|
532
|
+
//private readonly session: OpSession
|
|
533
|
+
// private readonly allIdentifiers: string[]
|
|
534
|
+
// private readonly hasher?: HasherSync
|
|
624
535
|
constructor(args) {
|
|
625
|
-
const { session, allIdentifiers, hasher = defaultHasher } = args;
|
|
626
|
-
this.session = session;
|
|
627
|
-
this.allIdentifiers = allIdentifiers ?? [];
|
|
628
|
-
this.hasher = hasher;
|
|
629
536
|
}
|
|
630
537
|
static async init(session, allIdentifiers, hasher) {
|
|
631
538
|
return new _OID4VP({
|
|
@@ -634,184 +541,14 @@ var OID4VP = class _OID4VP {
|
|
|
634
541
|
hasher
|
|
635
542
|
});
|
|
636
543
|
}
|
|
637
|
-
async getPresentationDefinitions() {
|
|
638
|
-
const definitions = await this.session.getPresentationDefinitions();
|
|
639
|
-
if (definitions) {
|
|
640
|
-
PresentationExchange.assertValidPresentationDefinitionWithLocations(definitions);
|
|
641
|
-
}
|
|
642
|
-
return definitions;
|
|
643
|
-
}
|
|
644
|
-
getPresentationExchange(args) {
|
|
645
|
-
const { verifiableCredentials, allIdentifiers, hasher } = args;
|
|
646
|
-
return new PresentationExchange({
|
|
647
|
-
allDIDs: allIdentifiers ?? this.allIdentifiers,
|
|
648
|
-
allVerifiableCredentials: verifiableCredentials,
|
|
649
|
-
hasher: hasher ?? this.hasher
|
|
650
|
-
});
|
|
651
|
-
}
|
|
652
|
-
async createVerifiablePresentations(credentialRole, credentialsWithDefinitions, opts) {
|
|
653
|
-
return await Promise.all(credentialsWithDefinitions.map((cred) => this.createVerifiablePresentation(credentialRole, cred, opts)));
|
|
654
|
-
}
|
|
655
|
-
async createVerifiablePresentation(credentialRole, selectedVerifiableCredentials, opts) {
|
|
656
|
-
const { subjectIsHolder, holder, forceNoCredentialsInVP = false } = {
|
|
657
|
-
...opts
|
|
658
|
-
};
|
|
659
|
-
if (subjectIsHolder && holder) {
|
|
660
|
-
throw Error("Cannot both have subject is holder and a holderDID value at the same time (programming error)");
|
|
661
|
-
}
|
|
662
|
-
if (forceNoCredentialsInVP) {
|
|
663
|
-
selectedVerifiableCredentials.credentials = [];
|
|
664
|
-
} else if (!selectedVerifiableCredentials?.credentials || selectedVerifiableCredentials.credentials.length === 0) {
|
|
665
|
-
throw Error("No verifiable verifiableCredentials provided for presentation definition");
|
|
666
|
-
}
|
|
667
|
-
const proofOptions = {
|
|
668
|
-
...opts?.proofOpts,
|
|
669
|
-
challenge: opts?.proofOpts?.nonce ?? opts?.proofOpts?.challenge ?? this.session.nonce,
|
|
670
|
-
domain: opts?.proofOpts?.domain ?? await this.session.getRedirectUri()
|
|
671
|
-
};
|
|
672
|
-
let idOpts2 = opts?.idOpts;
|
|
673
|
-
if (!idOpts2) {
|
|
674
|
-
if (opts?.subjectIsHolder) {
|
|
675
|
-
if (forceNoCredentialsInVP) {
|
|
676
|
-
return Promise.reject(Error(`Cannot have subject is holder, when force no credentials is being used, as we could never determine the holder then. Please provide holderDID`));
|
|
677
|
-
}
|
|
678
|
-
const firstUniqueDC = selectedVerifiableCredentials.credentials[0];
|
|
679
|
-
if (typeof firstUniqueDC !== "object" || !("digitalCredential" in firstUniqueDC)) {
|
|
680
|
-
return Promise.reject(Error("If no opts provided, credentials should be of type UniqueDigitalCredential"));
|
|
681
|
-
}
|
|
682
|
-
idOpts2 = isOID4VCIssuerIdentifier(firstUniqueDC.digitalCredential.kmsKeyRef) ? await this.session.context.agent.identifierManagedGetByIssuer({
|
|
683
|
-
identifier: firstUniqueDC.digitalCredential.kmsKeyRef
|
|
684
|
-
}) : await this.session.context.agent.identifierManagedGetByKid({
|
|
685
|
-
identifier: firstUniqueDC.digitalCredential.kmsKeyRef,
|
|
686
|
-
kmsKeyRef: firstUniqueDC.digitalCredential.kmsKeyRef
|
|
687
|
-
});
|
|
688
|
-
} else if (opts?.holder) {
|
|
689
|
-
idOpts2 = {
|
|
690
|
-
identifier: opts.holder
|
|
691
|
-
};
|
|
692
|
-
}
|
|
693
|
-
}
|
|
694
|
-
const vcs = forceNoCredentialsInVP ? selectedVerifiableCredentials : opts?.applyFilter ? await this.filterCredentials(credentialRole, selectedVerifiableCredentials.definition, {
|
|
695
|
-
restrictToFormats: opts?.restrictToFormats,
|
|
696
|
-
restrictToDIDMethods: opts?.restrictToDIDMethods,
|
|
697
|
-
filterOpts: {
|
|
698
|
-
verifiableCredentials: selectedVerifiableCredentials.credentials
|
|
699
|
-
}
|
|
700
|
-
}) : {
|
|
701
|
-
definition: selectedVerifiableCredentials.definition,
|
|
702
|
-
credentials: selectedVerifiableCredentials.credentials
|
|
703
|
-
};
|
|
704
|
-
if (!idOpts2) {
|
|
705
|
-
return Promise.reject(Error(`No identifier options present at this point`));
|
|
706
|
-
}
|
|
707
|
-
const signCallback = await createOID4VPPresentationSignCallback({
|
|
708
|
-
presentationSignCallback: this.session.options.presentationSignCallback,
|
|
709
|
-
idOpts: idOpts2,
|
|
710
|
-
context: this.session.context,
|
|
711
|
-
domain: proofOptions.domain,
|
|
712
|
-
challenge: proofOptions.challenge,
|
|
713
|
-
format: opts?.restrictToFormats ?? selectedVerifiableCredentials.definition.definition.format,
|
|
714
|
-
skipDidResolution: opts?.skipDidResolution ?? false
|
|
715
|
-
});
|
|
716
|
-
const identifier = await this.session.context.agent.identifierManagedGet(idOpts2);
|
|
717
|
-
const verifiableCredentials = vcs.credentials.map((credential) => typeof credential === "object" && "digitalCredential" in credential ? credential.originalVerifiableCredential : credential);
|
|
718
|
-
const presentationResult = await this.getPresentationExchange({
|
|
719
|
-
verifiableCredentials,
|
|
720
|
-
allIdentifiers: this.allIdentifiers,
|
|
721
|
-
hasher: opts?.hasher
|
|
722
|
-
}).createVerifiablePresentation(vcs.definition.definition, verifiableCredentials, signCallback, {
|
|
723
|
-
proofOptions,
|
|
724
|
-
// fixme: Update to newer siop-vp to not require dids here. But when Veramo is creating the VP it's still looking at this field to pass into didManagerGet
|
|
725
|
-
...identifier && isManagedIdentifierDidResult(identifier) && {
|
|
726
|
-
holderDID: identifier.did
|
|
727
|
-
}
|
|
728
|
-
});
|
|
729
|
-
const verifiablePresentations = presentationResult.verifiablePresentations.map((verifiablePresentation) => typeof verifiablePresentation !== "string" && "proof" in verifiablePresentation && "jwt" in verifiablePresentation.proof && verifiablePresentation.proof.jwt ? verifiablePresentation.proof.jwt : verifiablePresentation);
|
|
730
|
-
return {
|
|
731
|
-
...presentationResult,
|
|
732
|
-
verifiablePresentations,
|
|
733
|
-
verifiableCredentials,
|
|
734
|
-
definition: selectedVerifiableCredentials.definition,
|
|
735
|
-
idOpts: idOpts2
|
|
736
|
-
};
|
|
737
|
-
}
|
|
738
|
-
async filterCredentialsAgainstAllDefinitions(credentialRole, opts) {
|
|
739
|
-
const defs = await this.getPresentationDefinitions();
|
|
740
|
-
const result = [];
|
|
741
|
-
if (defs) {
|
|
742
|
-
for (const definition of defs) {
|
|
743
|
-
result.push(await this.filterCredentials(credentialRole, definition, opts));
|
|
744
|
-
}
|
|
745
|
-
}
|
|
746
|
-
return result;
|
|
747
|
-
}
|
|
748
|
-
async filterCredentials(credentialRole, presentationDefinition, opts) {
|
|
749
|
-
const udcMap = /* @__PURE__ */ new Map();
|
|
750
|
-
opts?.filterOpts?.verifiableCredentials?.forEach((credential) => {
|
|
751
|
-
if (typeof credential === "object" && "digitalCredential" in credential) {
|
|
752
|
-
udcMap.set(credential.originalVerifiableCredential, credential);
|
|
753
|
-
} else {
|
|
754
|
-
udcMap.set(credential, credential);
|
|
755
|
-
}
|
|
756
|
-
});
|
|
757
|
-
const credentials = (await this.filterCredentialsWithSelectionStatus(credentialRole, presentationDefinition, {
|
|
758
|
-
...opts,
|
|
759
|
-
filterOpts: {
|
|
760
|
-
verifiableCredentials: opts?.filterOpts?.verifiableCredentials?.map((credential) => {
|
|
761
|
-
if (typeof credential === "object" && "digitalCredential" in credential) {
|
|
762
|
-
return credential.originalVerifiableCredential;
|
|
763
|
-
} else {
|
|
764
|
-
return credential;
|
|
765
|
-
}
|
|
766
|
-
})
|
|
767
|
-
}
|
|
768
|
-
})).verifiableCredential;
|
|
769
|
-
return {
|
|
770
|
-
definition: presentationDefinition,
|
|
771
|
-
credentials: credentials?.map((vc) => udcMap.get(vc)) ?? []
|
|
772
|
-
};
|
|
773
|
-
}
|
|
774
|
-
async filterCredentialsWithSelectionStatus(credentialRole, presentationDefinition, opts) {
|
|
775
|
-
const selectionResults = await this.getPresentationExchange({
|
|
776
|
-
verifiableCredentials: await this.getCredentials(credentialRole, opts?.filterOpts)
|
|
777
|
-
}).selectVerifiableCredentialsForSubmission(presentationDefinition.definition, opts);
|
|
778
|
-
if (selectionResults.errors && selectionResults.errors.length > 0) {
|
|
779
|
-
throw Error(JSON.stringify(selectionResults.errors));
|
|
780
|
-
} else if (selectionResults.areRequiredCredentialsPresent === Status.ERROR) {
|
|
781
|
-
throw Error(`Not all required credentials are available to satisfy the relying party's request`);
|
|
782
|
-
}
|
|
783
|
-
const matches = selectionResults.matches;
|
|
784
|
-
if (!matches || matches.length === 0 || !selectionResults.verifiableCredential || selectionResults.verifiableCredential.length === 0) {
|
|
785
|
-
throw Error(JSON.stringify(selectionResults.errors));
|
|
786
|
-
}
|
|
787
|
-
return selectionResults;
|
|
788
|
-
}
|
|
789
|
-
async getCredentials(credentialRole, filterOpts) {
|
|
790
|
-
if (filterOpts?.verifiableCredentials && filterOpts.verifiableCredentials.length > 0) {
|
|
791
|
-
return filterOpts.verifiableCredentials;
|
|
792
|
-
}
|
|
793
|
-
const filter = verifiableCredentialForRoleFilter(credentialRole, filterOpts?.filter);
|
|
794
|
-
const uniqueCredentials = await this.session.context.agent.crsGetUniqueCredentials({
|
|
795
|
-
filter
|
|
796
|
-
});
|
|
797
|
-
return uniqueCredentials.map((uniqueVC) => {
|
|
798
|
-
const vc = uniqueVC.uniformVerifiableCredential;
|
|
799
|
-
const proof = Array.isArray(vc.proof) ? vc.proof : [
|
|
800
|
-
vc.proof
|
|
801
|
-
];
|
|
802
|
-
const jwtProof = proof.find((p) => p?.type === DEFAULT_JWT_PROOF_TYPE);
|
|
803
|
-
return jwtProof ? jwtProof.jwt : vc;
|
|
804
|
-
});
|
|
805
|
-
}
|
|
806
544
|
};
|
|
807
545
|
|
|
808
546
|
// src/session/OpSession.ts
|
|
809
547
|
import { OP as OP2, URI } from "@sphereon/did-auth-siop";
|
|
810
548
|
import { getAgentDIDMethods, getAgentResolver } from "@sphereon/ssi-sdk-ext.did-utils";
|
|
811
549
|
import { encodeBase64url } from "@sphereon/ssi-sdk.core";
|
|
812
|
-
import {
|
|
550
|
+
import { parseDid } from "@sphereon/ssi-types";
|
|
813
551
|
import { v4 } from "uuid";
|
|
814
|
-
import { PEX } from "@sphereon/pex";
|
|
815
552
|
import { Loggers } from "@sphereon/ssi-types";
|
|
816
553
|
var logger = Loggers.DEFAULT.get("sphereon:oid4vp:OpSession");
|
|
817
554
|
var OpSession = class _OpSession {
|
|
@@ -826,13 +563,11 @@ var OpSession = class _OpSession {
|
|
|
826
563
|
verifiedAuthorizationRequest;
|
|
827
564
|
_nonce;
|
|
828
565
|
_state;
|
|
829
|
-
_providedPresentationDefinitions;
|
|
830
566
|
constructor(options) {
|
|
831
567
|
this.id = options.sessionId;
|
|
832
568
|
this.options = options.op;
|
|
833
569
|
this.context = options.context;
|
|
834
570
|
this.requestJwtOrUri = options.requestJwtOrUri;
|
|
835
|
-
this._providedPresentationDefinitions = options.providedPresentationDefinitions;
|
|
836
571
|
}
|
|
837
572
|
static async init(options) {
|
|
838
573
|
return new _OpSession(options);
|
|
@@ -930,7 +665,7 @@ var OpSession = class _OpSession {
|
|
|
930
665
|
subjectSyntaxTypesSupported
|
|
931
666
|
]).map((method) => convertDidMethod(method, opts.didPrefix));
|
|
932
667
|
}
|
|
933
|
-
const isEBSI = rpMethods.length === 0 && (authReq.issuer?.includes(".ebsi.eu") ||
|
|
668
|
+
const isEBSI = rpMethods.length === 0 && (authReq.issuer?.includes(".ebsi.eu") || authReq.authorizationRequest.getMergedProperty("client_id")?.includes(".ebsi.eu"));
|
|
934
669
|
let codecName = void 0;
|
|
935
670
|
if (isEBSI && (!aud || !aud.startsWith("http"))) {
|
|
936
671
|
logger.debug(`EBSI detected, adding did:key to supported DID methods for RP`);
|
|
@@ -985,51 +720,9 @@ var OpSession = class _OpSession {
|
|
|
985
720
|
async getRedirectUri() {
|
|
986
721
|
return Promise.resolve(this.verifiedAuthorizationRequest.responseURI);
|
|
987
722
|
}
|
|
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
723
|
async getOID4VP(args) {
|
|
999
724
|
return await OID4VP.init(this, args.allIdentifiers ?? [], args.hasher);
|
|
1000
725
|
}
|
|
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
726
|
async createJarmResponseCallback({ responseOpts }) {
|
|
1034
727
|
const agent = this.context.agent;
|
|
1035
728
|
return /* @__PURE__ */ __name(async function jarmResponse(opts) {
|
|
@@ -1056,6 +749,7 @@ var OpSession = class _OpSession {
|
|
|
1056
749
|
}, "jarmResponse");
|
|
1057
750
|
}
|
|
1058
751
|
async sendAuthorizationResponse(args) {
|
|
752
|
+
const { responseSignerOpts, dcqlResponse, isFirstParty } = args;
|
|
1059
753
|
const resolveOpts = this.options.resolveOpts ?? {
|
|
1060
754
|
resolver: getAgentResolver(this.context, {
|
|
1061
755
|
uniresolverResolution: true,
|
|
@@ -1066,23 +760,7 @@ var OpSession = class _OpSession {
|
|
|
1066
760
|
if (!resolveOpts.subjectSyntaxTypesSupported || resolveOpts.subjectSyntaxTypesSupported.length === 0) {
|
|
1067
761
|
resolveOpts.subjectSyntaxTypesSupported = await this.getSupportedDIDMethods(true);
|
|
1068
762
|
}
|
|
1069
|
-
const verification = {
|
|
1070
|
-
presentationVerificationCallback: this.createPresentationVerificationCallback(this.context)
|
|
1071
|
-
};
|
|
1072
763
|
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
764
|
const op = await createOP({
|
|
1087
765
|
opOptions: {
|
|
1088
766
|
...this.options,
|
|
@@ -1094,23 +772,16 @@ var OpSession = class _OpSession {
|
|
|
1094
772
|
wellknownDIDVerifyCallback: this.options.wellknownDIDVerifyCallback,
|
|
1095
773
|
supportedVersions: request.versions
|
|
1096
774
|
},
|
|
1097
|
-
idOpts:
|
|
775
|
+
idOpts: responseSignerOpts,
|
|
1098
776
|
context: this.context
|
|
1099
777
|
});
|
|
1100
|
-
let issuer =
|
|
778
|
+
let issuer = responseSignerOpts.issuer;
|
|
1101
779
|
const responseOpts = {
|
|
1102
|
-
verification,
|
|
1103
780
|
issuer,
|
|
1104
|
-
...
|
|
1105
|
-
isFirstParty
|
|
781
|
+
...isFirstParty && {
|
|
782
|
+
isFirstParty
|
|
1106
783
|
},
|
|
1107
|
-
|
|
1108
|
-
presentationExchange: {
|
|
1109
|
-
verifiablePresentations,
|
|
1110
|
-
presentationSubmission: args.presentationSubmission
|
|
1111
|
-
}
|
|
1112
|
-
},
|
|
1113
|
-
dcqlQuery: args.dcqlResponse
|
|
784
|
+
dcqlResponse
|
|
1114
785
|
};
|
|
1115
786
|
const authResponse = await op.createAuthorizationResponse(request, responseOpts);
|
|
1116
787
|
const response = await op.submitAuthorizationResponse(authResponse, await this.createJarmResponseCallback({
|
|
@@ -1122,24 +793,6 @@ var OpSession = class _OpSession {
|
|
|
1122
793
|
return response;
|
|
1123
794
|
}
|
|
1124
795
|
}
|
|
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
796
|
};
|
|
1144
797
|
function convertDidMethod(didMethod, didPrefix) {
|
|
1145
798
|
if (didPrefix === false) {
|
|
@@ -1149,10 +802,79 @@ function convertDidMethod(didMethod, didPrefix) {
|
|
|
1149
802
|
}
|
|
1150
803
|
__name(convertDidMethod, "convertDidMethod");
|
|
1151
804
|
|
|
1152
|
-
// src/
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
805
|
+
// src/types/IDidAuthSiopOpAuthenticator.ts
|
|
806
|
+
var LOGGER_NAMESPACE = "sphereon:siopv2-oid4vp:op-auth";
|
|
807
|
+
var DEFAULT_JWT_PROOF_TYPE = "JwtProof2020";
|
|
808
|
+
|
|
809
|
+
// src/types/siop-service/index.ts
|
|
810
|
+
var Siopv2HolderEvent = /* @__PURE__ */ (function(Siopv2HolderEvent2) {
|
|
811
|
+
Siopv2HolderEvent2["CONTACT_IDENTITY_CREATED"] = "contact_identity_created";
|
|
812
|
+
Siopv2HolderEvent2["IDENTIFIER_CREATED"] = "identifier_created";
|
|
813
|
+
return Siopv2HolderEvent2;
|
|
814
|
+
})({});
|
|
815
|
+
var SupportedLanguage = /* @__PURE__ */ (function(SupportedLanguage2) {
|
|
816
|
+
SupportedLanguage2["ENGLISH"] = "en";
|
|
817
|
+
SupportedLanguage2["DUTCH"] = "nl";
|
|
818
|
+
return SupportedLanguage2;
|
|
819
|
+
})({});
|
|
820
|
+
|
|
821
|
+
// src/types/machine/index.ts
|
|
822
|
+
var Siopv2MachineStates = /* @__PURE__ */ (function(Siopv2MachineStates2) {
|
|
823
|
+
Siopv2MachineStates2["createConfig"] = "createConfig";
|
|
824
|
+
Siopv2MachineStates2["getSiopRequest"] = "getSiopRequest";
|
|
825
|
+
Siopv2MachineStates2["getSelectableCredentials"] = "getSelectableCredentials";
|
|
826
|
+
Siopv2MachineStates2["retrieveContact"] = "retrieveContact";
|
|
827
|
+
Siopv2MachineStates2["transitionFromSetup"] = "transitionFromSetup";
|
|
828
|
+
Siopv2MachineStates2["addContact"] = "addContact";
|
|
829
|
+
Siopv2MachineStates2["addContactIdentity"] = "addContactIdentity";
|
|
830
|
+
Siopv2MachineStates2["selectCredentials"] = "selectCredentials";
|
|
831
|
+
Siopv2MachineStates2["sendResponse"] = "sendResponse";
|
|
832
|
+
Siopv2MachineStates2["handleError"] = "handleError";
|
|
833
|
+
Siopv2MachineStates2["aborted"] = "aborted";
|
|
834
|
+
Siopv2MachineStates2["declined"] = "declined";
|
|
835
|
+
Siopv2MachineStates2["error"] = "error";
|
|
836
|
+
Siopv2MachineStates2["done"] = "done";
|
|
837
|
+
return Siopv2MachineStates2;
|
|
838
|
+
})({});
|
|
839
|
+
var Siopv2MachineAddContactStates = /* @__PURE__ */ (function(Siopv2MachineAddContactStates2) {
|
|
840
|
+
Siopv2MachineAddContactStates2["idle"] = "idle";
|
|
841
|
+
Siopv2MachineAddContactStates2["executing"] = "executing";
|
|
842
|
+
Siopv2MachineAddContactStates2["next"] = "next";
|
|
843
|
+
return Siopv2MachineAddContactStates2;
|
|
844
|
+
})({});
|
|
845
|
+
var Siopv2MachineEvents = /* @__PURE__ */ (function(Siopv2MachineEvents2) {
|
|
846
|
+
Siopv2MachineEvents2["NEXT"] = "NEXT";
|
|
847
|
+
Siopv2MachineEvents2["PREVIOUS"] = "PREVIOUS";
|
|
848
|
+
Siopv2MachineEvents2["DECLINE"] = "DECLINE";
|
|
849
|
+
Siopv2MachineEvents2["SET_CONTACT_ALIAS"] = "SET_CONTACT_ALIAS";
|
|
850
|
+
Siopv2MachineEvents2["SET_CONTACT_CONSENT"] = "SET_CONTACT_CONSENT";
|
|
851
|
+
Siopv2MachineEvents2["CREATE_CONTACT"] = "CREATE_CONTACT";
|
|
852
|
+
Siopv2MachineEvents2["SET_SELECTED_CREDENTIALS"] = "SET_SELECTED_CREDENTIALS";
|
|
853
|
+
return Siopv2MachineEvents2;
|
|
854
|
+
})({});
|
|
855
|
+
var Siopv2MachineGuards = /* @__PURE__ */ (function(Siopv2MachineGuards2) {
|
|
856
|
+
Siopv2MachineGuards2["hasNoContactGuard"] = "Siopv2HasNoContactGuard";
|
|
857
|
+
Siopv2MachineGuards2["createContactGuard"] = "Siopv2CreateContactGuard";
|
|
858
|
+
Siopv2MachineGuards2["hasContactGuard"] = "Siopv2HasContactGuard";
|
|
859
|
+
Siopv2MachineGuards2["hasAuthorizationRequestGuard"] = "Siopv2HasAuthorizationRequestGuard";
|
|
860
|
+
Siopv2MachineGuards2["hasSelectableCredentialsAndContactGuard"] = "Siopv2HasSelectableCredentialsAndContactGuard";
|
|
861
|
+
Siopv2MachineGuards2["hasSelectedRequiredCredentialsGuard"] = "Siopv2HasSelectedRequiredCredentialsGuard";
|
|
862
|
+
Siopv2MachineGuards2["siopOnlyGuard"] = "Siopv2IsSiopOnlyGuard";
|
|
863
|
+
Siopv2MachineGuards2["siopWithOID4VPGuard"] = "Siopv2IsSiopWithOID4VPGuard";
|
|
864
|
+
return Siopv2MachineGuards2;
|
|
865
|
+
})({});
|
|
866
|
+
var Siopv2MachineServices = /* @__PURE__ */ (function(Siopv2MachineServices2) {
|
|
867
|
+
Siopv2MachineServices2["getSiopRequest"] = "getSiopRequest";
|
|
868
|
+
Siopv2MachineServices2["getSelectableCredentials"] = "getSelectableCredentials";
|
|
869
|
+
Siopv2MachineServices2["retrieveContact"] = "retrieveContact";
|
|
870
|
+
Siopv2MachineServices2["addContactIdentity"] = "addContactIdentity";
|
|
871
|
+
Siopv2MachineServices2["sendResponse"] = "sendResponse";
|
|
872
|
+
Siopv2MachineServices2["createConfig"] = "createConfig";
|
|
873
|
+
return Siopv2MachineServices2;
|
|
874
|
+
})({});
|
|
875
|
+
|
|
876
|
+
// src/types/identifier/index.ts
|
|
877
|
+
var DID_PREFIX = "did";
|
|
1156
878
|
|
|
1157
879
|
// src/machine/Siopv2Machine.ts
|
|
1158
880
|
import { assign, createMachine, interpret } from "xstate";
|
|
@@ -1221,7 +943,7 @@ var Siopv2HasSelectableCredentialsAndContactGuard = /* @__PURE__ */ __name((_ctx
|
|
|
1221
943
|
if (!contact) {
|
|
1222
944
|
throw new Error("Missing contact request data in context");
|
|
1223
945
|
}
|
|
1224
|
-
return authorizationRequestData.
|
|
946
|
+
return authorizationRequestData.dcqlQuery !== void 0;
|
|
1225
947
|
}, "Siopv2HasSelectableCredentialsAndContactGuard");
|
|
1226
948
|
var Siopv2CreateContactGuard = /* @__PURE__ */ __name((_ctx, _event) => {
|
|
1227
949
|
const { contactAlias, hasContactConsent } = _ctx;
|
|
@@ -1232,7 +954,7 @@ var Siopv2HasSelectedRequiredCredentialsGuard = /* @__PURE__ */ __name((_ctx, _e
|
|
|
1232
954
|
if (authorizationRequestData === void 0) {
|
|
1233
955
|
throw new Error("Missing authorization request data in context");
|
|
1234
956
|
}
|
|
1235
|
-
if (authorizationRequestData.
|
|
957
|
+
if (authorizationRequestData.dcqlQuery === void 0) {
|
|
1236
958
|
throw Error("No presentation definitions present");
|
|
1237
959
|
}
|
|
1238
960
|
return _ctx.selectedCredentials.length > 0;
|
|
@@ -1242,7 +964,7 @@ var Siopv2IsSiopOnlyGuard = /* @__PURE__ */ __name((_ctx, _event) => {
|
|
|
1242
964
|
if (authorizationRequestData === void 0) {
|
|
1243
965
|
throw new Error("Missing authorization request data in context");
|
|
1244
966
|
}
|
|
1245
|
-
return authorizationRequestData.
|
|
967
|
+
return authorizationRequestData.dcqlQuery === void 0;
|
|
1246
968
|
}, "Siopv2IsSiopOnlyGuard");
|
|
1247
969
|
var Siopv2IsSiopWithOID4VPGuard = /* @__PURE__ */ __name((_ctx, _event) => {
|
|
1248
970
|
const { authorizationRequestData, selectableCredentialsMap } = _ctx;
|
|
@@ -1252,7 +974,7 @@ var Siopv2IsSiopWithOID4VPGuard = /* @__PURE__ */ __name((_ctx, _event) => {
|
|
|
1252
974
|
if (!selectableCredentialsMap) {
|
|
1253
975
|
throw new Error("Missing selectableCredentialsMap in context");
|
|
1254
976
|
}
|
|
1255
|
-
return authorizationRequestData.
|
|
977
|
+
return authorizationRequestData.dcqlQuery !== void 0;
|
|
1256
978
|
}, "Siopv2IsSiopWithOID4VPGuard");
|
|
1257
979
|
var createSiopv2Machine = /* @__PURE__ */ __name((opts) => {
|
|
1258
980
|
const { url, idOpts: idOpts2 } = opts;
|
|
@@ -1568,114 +1290,57 @@ var Siopv2Machine = class {
|
|
|
1568
1290
|
|
|
1569
1291
|
// src/services/Siopv2MachineService.ts
|
|
1570
1292
|
import { SupportedVersion as SupportedVersion2 } from "@sphereon/did-auth-siop";
|
|
1571
|
-
import {
|
|
1572
|
-
import {
|
|
1573
|
-
import {
|
|
1574
|
-
import {
|
|
1575
|
-
import { CredentialMapper as
|
|
1576
|
-
import {
|
|
1577
|
-
import { defaultHasher as defaultHasher2, encodeJoseBlob } from "@sphereon/ssi-sdk.core";
|
|
1293
|
+
import { isOID4VCIssuerIdentifier } from "@sphereon/ssi-sdk-ext.identifier-resolution";
|
|
1294
|
+
import { verifiableCredentialForRoleFilter } from "@sphereon/ssi-sdk.credential-store";
|
|
1295
|
+
import { ConnectionType } from "@sphereon/ssi-sdk.data-store";
|
|
1296
|
+
import { CredentialRole } from "@sphereon/ssi-types";
|
|
1297
|
+
import { CredentialMapper as CredentialMapper3, Loggers as Loggers3 } from "@sphereon/ssi-types";
|
|
1298
|
+
import { encodeJoseBlob } from "@sphereon/ssi-sdk.core";
|
|
1578
1299
|
import { DcqlPresentation, DcqlQuery } from "dcql";
|
|
1579
1300
|
|
|
1580
1301
|
// src/utils/dcql.ts
|
|
1581
|
-
import { CredentialMapper as
|
|
1302
|
+
import { CredentialMapper as CredentialMapper2 } from "@sphereon/ssi-types";
|
|
1303
|
+
import { Dcql } from "@sphereon/did-auth-siop";
|
|
1582
1304
|
|
|
1583
1305
|
// src/utils/CredentialUtils.ts
|
|
1584
|
-
import { CredentialMapper
|
|
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");
|
|
1306
|
+
import { CredentialMapper } from "@sphereon/ssi-types";
|
|
1602
1307
|
var isUniqueDigitalCredential = /* @__PURE__ */ __name((credential) => {
|
|
1603
1308
|
return credential.digitalCredential !== void 0;
|
|
1604
1309
|
}, "isUniqueDigitalCredential");
|
|
1605
1310
|
|
|
1606
1311
|
// src/utils/dcql.ts
|
|
1607
1312
|
function convertToDcqlCredentials(credential, hasher) {
|
|
1608
|
-
let
|
|
1313
|
+
let originalVerifiableCredential;
|
|
1609
1314
|
if (isUniqueDigitalCredential(credential)) {
|
|
1610
1315
|
if (!credential.originalVerifiableCredential) {
|
|
1611
1316
|
throw new Error("originalVerifiableCredential is not defined in UniqueDigitalCredential");
|
|
1612
1317
|
}
|
|
1613
|
-
|
|
1318
|
+
originalVerifiableCredential = CredentialMapper2.decodeVerifiableCredential(credential.originalVerifiableCredential, hasher);
|
|
1614
1319
|
} else {
|
|
1615
|
-
|
|
1320
|
+
originalVerifiableCredential = CredentialMapper2.decodeVerifiableCredential(credential, hasher);
|
|
1616
1321
|
}
|
|
1617
|
-
if (!
|
|
1322
|
+
if (!originalVerifiableCredential) {
|
|
1618
1323
|
throw new Error("No payload found");
|
|
1619
1324
|
}
|
|
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
|
-
};
|
|
1325
|
+
if (CredentialMapper2.isJwtDecodedCredential(originalVerifiableCredential)) {
|
|
1326
|
+
return Dcql.toDcqlJwtCredential(CredentialMapper2.toWrappedVerifiableCredential(originalVerifiableCredential));
|
|
1327
|
+
} else if (CredentialMapper2.isSdJwtDecodedCredential(originalVerifiableCredential)) {
|
|
1328
|
+
return Dcql.toDcqlSdJwtCredential(CredentialMapper2.toWrappedVerifiableCredential(originalVerifiableCredential));
|
|
1329
|
+
} else if (CredentialMapper2.isMsoMdocDecodedCredential(originalVerifiableCredential)) {
|
|
1330
|
+
return Dcql.toDcqlMdocCredential(CredentialMapper2.toWrappedVerifiableCredential(originalVerifiableCredential));
|
|
1331
|
+
} else if (CredentialMapper2.isW3cCredential(originalVerifiableCredential)) {
|
|
1332
|
+
return Dcql.toDcqlJsonLdCredential(CredentialMapper2.toWrappedVerifiableCredential(originalVerifiableCredential));
|
|
1640
1333
|
}
|
|
1334
|
+
throw Error(`Unable to map credential to DCQL credential. Credential: ${JSON.stringify(originalVerifiableCredential)}`);
|
|
1641
1335
|
}
|
|
1642
1336
|
__name(convertToDcqlCredentials, "convertToDcqlCredentials");
|
|
1643
1337
|
|
|
1644
1338
|
// src/services/Siopv2MachineService.ts
|
|
1339
|
+
import { getOrCreatePrimaryIdentifier, SupportedDidMethodEnum } from "@sphereon/ssi-sdk-ext.did-utils";
|
|
1645
1340
|
var logger3 = Loggers3.DEFAULT.get(LOGGER_NAMESPACE);
|
|
1646
|
-
var createEbsiIdentifier = /* @__PURE__ */ __name(async (agentContext) => {
|
|
1647
|
-
logger3.log(`No EBSI key present yet. Creating a new one...`);
|
|
1648
|
-
const { result: newIdentifier, created } = await getOrCreatePrimaryIdentifier(agentContext, {
|
|
1649
|
-
method: SupportedDidMethodEnum.DID_KEY,
|
|
1650
|
-
createOpts: {
|
|
1651
|
-
options: {
|
|
1652
|
-
codecName: "jwk_jcs-pub",
|
|
1653
|
-
type: "Secp256r1"
|
|
1654
|
-
}
|
|
1655
|
-
}
|
|
1656
|
-
});
|
|
1657
|
-
logger3.log(`EBSI key created: ${newIdentifier.did}`);
|
|
1658
|
-
if (created) {
|
|
1659
|
-
await agentContext.agent.emit(Siopv2HolderEvent.IDENTIFIER_CREATED, {
|
|
1660
|
-
result: newIdentifier
|
|
1661
|
-
});
|
|
1662
|
-
}
|
|
1663
|
-
return await agentContext.agent.identifierManagedGetByDid({
|
|
1664
|
-
identifier: newIdentifier.did
|
|
1665
|
-
});
|
|
1666
|
-
}, "createEbsiIdentifier");
|
|
1667
|
-
var hasEbsiClient = /* @__PURE__ */ __name(async (authorizationRequest) => {
|
|
1668
|
-
const clientId = await authorizationRequest.getMergedProperty("client_id");
|
|
1669
|
-
const redirectUri = await authorizationRequest.getMergedProperty("redirect_uri");
|
|
1670
|
-
return clientId?.toLowerCase().includes(".ebsi.eu") || redirectUri?.toLowerCase().includes(".ebsi.eu");
|
|
1671
|
-
}, "hasEbsiClient");
|
|
1672
1341
|
var siopSendAuthorizationResponse = /* @__PURE__ */ __name(async (connectionType, args, context) => {
|
|
1673
1342
|
const { agent } = context;
|
|
1674
|
-
const
|
|
1675
|
-
...context,
|
|
1676
|
-
agent: context.agent
|
|
1677
|
-
};
|
|
1678
|
-
let { idOpts: idOpts2, isFirstParty, hasher = defaultHasher2 } = args;
|
|
1343
|
+
const { credentials } = args;
|
|
1679
1344
|
if (connectionType !== ConnectionType.SIOPv2_OpenID4VP) {
|
|
1680
1345
|
return Promise.reject(Error(`No supported authentication provider for type: ${connectionType}`));
|
|
1681
1346
|
}
|
|
@@ -1683,252 +1348,148 @@ var siopSendAuthorizationResponse = /* @__PURE__ */ __name(async (connectionType
|
|
|
1683
1348
|
sessionId: args.sessionId
|
|
1684
1349
|
});
|
|
1685
1350
|
const request = await session.getAuthorizationRequest();
|
|
1686
|
-
const aud =
|
|
1351
|
+
const aud = request.authorizationRequest.getMergedProperty("aud");
|
|
1687
1352
|
logger3.debug(`AUD: ${aud}`);
|
|
1688
1353
|
logger3.debug(JSON.stringify(request.authorizationRequest));
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
|
|
1696
|
-
|
|
1697
|
-
|
|
1698
|
-
|
|
1699
|
-
|
|
1700
|
-
|
|
1701
|
-
|
|
1702
|
-
|
|
1703
|
-
|
|
1704
|
-
|
|
1705
|
-
|
|
1706
|
-
|
|
1707
|
-
|
|
1708
|
-
|
|
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
|
|
1354
|
+
const domain = await request.authorizationRequest.getMergedProperty("client_id") ?? request.issuer ?? (request.versions.includes(SupportedVersion2.JWT_VC_PRESENTATION_PROFILE_v1) ? "https://self-issued.me/v2/openid-vc" : "https://self-issued.me/v2");
|
|
1355
|
+
logger3.debug(`NONCE: ${session.nonce}, domain: ${domain}`);
|
|
1356
|
+
const firstUniqueDC = credentials[0];
|
|
1357
|
+
if (typeof firstUniqueDC !== "object" || !("digitalCredential" in firstUniqueDC)) {
|
|
1358
|
+
return Promise.reject(Error("SiopMachine only supports UniqueDigitalCredentials for now"));
|
|
1359
|
+
}
|
|
1360
|
+
let identifier;
|
|
1361
|
+
const digitalCredential = firstUniqueDC.digitalCredential;
|
|
1362
|
+
const firstVC = firstUniqueDC.uniformVerifiableCredential;
|
|
1363
|
+
const holder = CredentialMapper3.isSdJwtDecodedCredential(firstVC) ? firstVC.decodedPayload.cnf?.jwk ? (
|
|
1364
|
+
//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
|
|
1365
|
+
`did:jwk:${encodeJoseBlob(firstVC.decodedPayload.cnf?.jwk)}#0`
|
|
1366
|
+
) : firstVC.decodedPayload.sub : Array.isArray(firstVC.credentialSubject) ? firstVC.credentialSubject[0].id : firstVC.credentialSubject.id;
|
|
1367
|
+
if (!digitalCredential.kmsKeyRef) {
|
|
1368
|
+
if (!holder) {
|
|
1369
|
+
return Promise.reject(`No holder found and no kmsKeyRef in DB. Cannot determine identifier to use`);
|
|
1370
|
+
}
|
|
1371
|
+
try {
|
|
1372
|
+
identifier = await session.context.agent.identifierManagedGet({
|
|
1373
|
+
identifier: holder
|
|
1724
1374
|
});
|
|
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
|
-
}
|
|
1375
|
+
} catch (e) {
|
|
1376
|
+
logger3.debug(`Holder DID not found: ${holder}`);
|
|
1377
|
+
throw e;
|
|
1747
1378
|
}
|
|
1748
|
-
|
|
1749
|
-
|
|
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
|
-
}
|
|
1379
|
+
} else if (isOID4VCIssuerIdentifier(digitalCredential.kmsKeyRef)) {
|
|
1380
|
+
identifier = await session.context.agent.identifierManagedGetByOID4VCIssuer({
|
|
1381
|
+
identifier: firstUniqueDC.digitalCredential.kmsKeyRef
|
|
1758
1382
|
});
|
|
1759
|
-
|
|
1760
|
-
|
|
1761
|
-
|
|
1762
|
-
|
|
1383
|
+
} else {
|
|
1384
|
+
switch (digitalCredential.subjectCorrelationType) {
|
|
1385
|
+
case "DID":
|
|
1386
|
+
identifier = await session.context.agent.identifierManagedGetByDid({
|
|
1387
|
+
identifier: digitalCredential.subjectCorrelationId ?? holder,
|
|
1388
|
+
kmsKeyRef: digitalCredential.kmsKeyRef
|
|
1389
|
+
});
|
|
1390
|
+
break;
|
|
1391
|
+
// TODO other implementations?
|
|
1392
|
+
default:
|
|
1393
|
+
identifier = await session.context.agent.identifierManagedGetByKid({
|
|
1394
|
+
identifier: digitalCredential.subjectCorrelationId ?? holder ?? digitalCredential.kmsKeyRef,
|
|
1395
|
+
kmsKeyRef: digitalCredential.kmsKeyRef
|
|
1396
|
+
});
|
|
1763
1397
|
}
|
|
1764
|
-
|
|
1765
|
-
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
|
|
1769
|
-
|
|
1770
|
-
|
|
1771
|
-
|
|
1772
|
-
|
|
1773
|
-
|
|
1774
|
-
|
|
1775
|
-
|
|
1776
|
-
|
|
1777
|
-
|
|
1778
|
-
|
|
1779
|
-
|
|
1780
|
-
|
|
1781
|
-
if (args.verifiableCredentialsWithDefinition !== void 0 && args.verifiableCredentialsWithDefinition !== null) {
|
|
1782
|
-
const vcs = args.verifiableCredentialsWithDefinition.flatMap((vcd) => vcd.credentials);
|
|
1783
|
-
const domain = await request.authorizationRequest.getMergedProperty("client_id") ?? request.issuer ?? (request.versions.includes(SupportedVersion2.JWT_VC_PRESENTATION_PROFILE_v1) ? "https://self-issued.me/v2/openid-vc" : "https://self-issued.me/v2");
|
|
1784
|
-
logger3.debug(`NONCE: ${session.nonce}, domain: ${domain}`);
|
|
1785
|
-
const firstUniqueDC = vcs[0];
|
|
1786
|
-
if (typeof firstUniqueDC !== "object" || !("digitalCredential" in firstUniqueDC)) {
|
|
1787
|
-
return Promise.reject(Error("SiopMachine only supports UniqueDigitalCredentials for now"));
|
|
1398
|
+
}
|
|
1399
|
+
const dcqlCredentialsWithCredentials = new Map(credentials.map((vc) => [
|
|
1400
|
+
convertToDcqlCredentials(vc),
|
|
1401
|
+
vc
|
|
1402
|
+
]));
|
|
1403
|
+
const queryResult = DcqlQuery.query(request.dcqlQuery, Array.from(dcqlCredentialsWithCredentials.keys()));
|
|
1404
|
+
if (!queryResult.can_be_satisfied) {
|
|
1405
|
+
return Promise.reject(Error("Credentials do not match required query request"));
|
|
1406
|
+
}
|
|
1407
|
+
const presentation = {};
|
|
1408
|
+
const uniqueCredentials = Array.from(dcqlCredentialsWithCredentials.values());
|
|
1409
|
+
for (const [key, value] of Object.entries(queryResult.credential_matches)) {
|
|
1410
|
+
if (value.success) {
|
|
1411
|
+
const matchedCredentials = value.valid_credentials.map((cred) => uniqueCredentials[cred.input_credential_index]);
|
|
1412
|
+
const vc = matchedCredentials[0];
|
|
1413
|
+
if (!vc) {
|
|
1414
|
+
continue;
|
|
1788
1415
|
}
|
|
1789
|
-
|
|
1790
|
-
|
|
1791
|
-
|
|
1792
|
-
const holder = CredentialMapper4.isSdJwtDecodedCredential(firstVC) ? firstVC.decodedPayload.cnf?.jwk ? (
|
|
1793
|
-
//doesn't apply to did:jwk only, as you can represent any DID key as a JWK. So whenever you encounter a JWK it doesn't mean it had to come from a did:jwk in the system. It just can always be represented as a did:jwk
|
|
1794
|
-
`did:jwk:${encodeJoseBlob(firstVC.decodedPayload.cnf?.jwk)}#0`
|
|
1795
|
-
) : firstVC.decodedPayload.sub : Array.isArray(firstVC.credentialSubject) ? firstVC.credentialSubject[0].id : firstVC.credentialSubject.id;
|
|
1796
|
-
if (!digitalCredential.kmsKeyRef) {
|
|
1797
|
-
if (!holder) {
|
|
1798
|
-
return Promise.reject(`No holder found and no kmsKeyRef in DB. Cannot determine identifier to use`);
|
|
1799
|
-
}
|
|
1800
|
-
try {
|
|
1801
|
-
identifier = await session.context.agent.identifierManagedGet({
|
|
1802
|
-
identifier: holder
|
|
1803
|
-
});
|
|
1804
|
-
} catch (e) {
|
|
1805
|
-
logger3.debug(`Holder DID not found: ${holder}`);
|
|
1806
|
-
throw e;
|
|
1807
|
-
}
|
|
1808
|
-
} else if (isOID4VCIssuerIdentifier2(digitalCredential.kmsKeyRef)) {
|
|
1809
|
-
identifier = await session.context.agent.identifierManagedGetByOID4VCIssuer({
|
|
1810
|
-
identifier: firstUniqueDC.digitalCredential.kmsKeyRef
|
|
1811
|
-
});
|
|
1812
|
-
} else {
|
|
1813
|
-
switch (digitalCredential.subjectCorrelationType) {
|
|
1814
|
-
case "DID":
|
|
1815
|
-
identifier = await session.context.agent.identifierManagedGetByDid({
|
|
1816
|
-
identifier: digitalCredential.subjectCorrelationId ?? holder,
|
|
1817
|
-
kmsKeyRef: digitalCredential.kmsKeyRef
|
|
1818
|
-
});
|
|
1819
|
-
break;
|
|
1820
|
-
// TODO other implementations?
|
|
1821
|
-
default:
|
|
1822
|
-
identifier = await session.context.agent.identifierManagedGetByKid({
|
|
1823
|
-
identifier: digitalCredential.subjectCorrelationId ?? holder ?? digitalCredential.kmsKeyRef,
|
|
1824
|
-
kmsKeyRef: digitalCredential.kmsKeyRef
|
|
1825
|
-
});
|
|
1826
|
-
}
|
|
1416
|
+
const originalVc = retrieveEncodedCredential(vc);
|
|
1417
|
+
if (!originalVc) {
|
|
1418
|
+
continue;
|
|
1827
1419
|
}
|
|
1828
|
-
|
|
1829
|
-
|
|
1830
|
-
vcs.forEach((vc) => {
|
|
1831
|
-
const rep = convertToDcqlCredentials(vc, args.hasher);
|
|
1832
|
-
if (rep) {
|
|
1833
|
-
dcqlRepresentations.push(rep);
|
|
1834
|
-
}
|
|
1835
|
-
});
|
|
1836
|
-
const queryResult = DcqlQuery.query(request.dcqlQuery, dcqlRepresentations);
|
|
1837
|
-
const presentation = {};
|
|
1838
|
-
for (const [key, value] of Object.entries(queryResult.credential_matches)) {
|
|
1839
|
-
const allMatches = Array.isArray(value) ? value : [
|
|
1840
|
-
value
|
|
1841
|
-
];
|
|
1842
|
-
allMatches.forEach((match) => {
|
|
1843
|
-
if (match.success) {
|
|
1844
|
-
const originalCredential = getOriginalVerifiableCredential(vcs[match.input_credential_index]);
|
|
1845
|
-
if (!originalCredential) {
|
|
1846
|
-
throw new Error(`Index ${match.input_credential_index} out of range in credentials array`);
|
|
1847
|
-
}
|
|
1848
|
-
presentation[key] = originalCredential["compactSdJwtVc"] !== void 0 ? originalCredential.compactSdJwtVc : originalCredential;
|
|
1849
|
-
}
|
|
1850
|
-
});
|
|
1420
|
+
if (originalVc) {
|
|
1421
|
+
presentation[key] = originalVc;
|
|
1851
1422
|
}
|
|
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
1423
|
}
|
|
1863
1424
|
}
|
|
1864
|
-
|
|
1425
|
+
const dcqlPresentation = DcqlPresentation.parse(presentation);
|
|
1426
|
+
const response = session.sendAuthorizationResponse({
|
|
1427
|
+
responseSignerOpts: identifier,
|
|
1428
|
+
dcqlResponse: {
|
|
1429
|
+
dcqlPresentation
|
|
1430
|
+
}
|
|
1431
|
+
});
|
|
1432
|
+
logger3.debug(`Response: `, response);
|
|
1433
|
+
return response;
|
|
1865
1434
|
}, "siopSendAuthorizationResponse");
|
|
1866
|
-
|
|
1867
|
-
return
|
|
1868
|
-
|
|
1869
|
-
|
|
1870
|
-
inputDescriptor
|
|
1871
|
-
]
|
|
1872
|
-
};
|
|
1873
|
-
}
|
|
1874
|
-
__name(buildPartialPD, "buildPartialPD");
|
|
1875
|
-
var getSelectableCredentials = /* @__PURE__ */ __name(async (presentationDefinition, context) => {
|
|
1435
|
+
var retrieveEncodedCredential = /* @__PURE__ */ __name((credential) => {
|
|
1436
|
+
return credential.originalVerifiableCredential !== void 0 && credential.originalVerifiableCredential !== null && credential?.originalVerifiableCredential?.compactSdJwtVc !== void 0 && credential?.originalVerifiableCredential?.compactSdJwtVc !== null ? credential.originalVerifiableCredential.compactSdJwtVc : credential.originalVerifiableCredential;
|
|
1437
|
+
}, "retrieveEncodedCredential");
|
|
1438
|
+
var getSelectableCredentials = /* @__PURE__ */ __name(async (dcqlQuery, context) => {
|
|
1876
1439
|
const agentContext = {
|
|
1877
1440
|
...context,
|
|
1878
1441
|
agent: context.agent
|
|
1879
1442
|
};
|
|
1880
1443
|
const { agent } = agentContext;
|
|
1881
|
-
const pex = new PEX2();
|
|
1882
1444
|
const uniqueVerifiableCredentials = await agent.crsGetUniqueCredentials({
|
|
1883
|
-
filter:
|
|
1445
|
+
filter: verifiableCredentialForRoleFilter(CredentialRole.HOLDER)
|
|
1884
1446
|
});
|
|
1885
|
-
const
|
|
1447
|
+
const branding = await agent.ibGetCredentialBranding();
|
|
1448
|
+
const dcqlCredentialsWithCredentials = new Map(uniqueVerifiableCredentials.map((vc) => [
|
|
1449
|
+
convertToDcqlCredentials(vc),
|
|
1450
|
+
vc
|
|
1451
|
+
]));
|
|
1452
|
+
const queryResult = DcqlQuery.query(dcqlQuery, Array.from(dcqlCredentialsWithCredentials.keys()));
|
|
1453
|
+
const uniqueCredentials = Array.from(dcqlCredentialsWithCredentials.values());
|
|
1886
1454
|
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
|
-
}
|
|
1455
|
+
for (const [key, value] of Object.entries(queryResult.credential_matches)) {
|
|
1456
|
+
if (!value.valid_credentials) {
|
|
1457
|
+
continue;
|
|
1458
|
+
}
|
|
1459
|
+
const mapSelectableCredentialPromises = value.valid_credentials.map(async (cred) => {
|
|
1460
|
+
const matchedCredential = uniqueCredentials[cred.input_credential_index];
|
|
1461
|
+
const credentialBranding = branding.filter((cb) => cb.vcHash === matchedCredential.hash);
|
|
1462
|
+
const issuerPartyIdentity = await agent.cmGetContacts({
|
|
1463
|
+
filter: [
|
|
1464
|
+
{
|
|
1465
|
+
identities: {
|
|
1466
|
+
identifier: {
|
|
1467
|
+
correlationId: matchedCredential.uniformVerifiableCredential.issuerDid
|
|
1908
1468
|
}
|
|
1909
1469
|
}
|
|
1910
|
-
|
|
1911
|
-
|
|
1912
|
-
|
|
1913
|
-
|
|
1914
|
-
|
|
1915
|
-
|
|
1916
|
-
|
|
1917
|
-
|
|
1918
|
-
|
|
1470
|
+
}
|
|
1471
|
+
]
|
|
1472
|
+
});
|
|
1473
|
+
const subjectPartyIdentity = await agent.cmGetContacts({
|
|
1474
|
+
filter: [
|
|
1475
|
+
{
|
|
1476
|
+
identities: {
|
|
1477
|
+
identifier: {
|
|
1478
|
+
correlationId: matchedCredential.uniformVerifiableCredential.subjectDid
|
|
1919
1479
|
}
|
|
1920
1480
|
}
|
|
1921
|
-
|
|
1922
|
-
|
|
1923
|
-
|
|
1924
|
-
|
|
1925
|
-
|
|
1926
|
-
|
|
1927
|
-
|
|
1928
|
-
|
|
1929
|
-
}
|
|
1930
|
-
}
|
|
1931
|
-
|
|
1481
|
+
}
|
|
1482
|
+
]
|
|
1483
|
+
});
|
|
1484
|
+
return {
|
|
1485
|
+
credential: matchedCredential,
|
|
1486
|
+
credentialBranding: credentialBranding[0]?.localeBranding,
|
|
1487
|
+
issuerParty: issuerPartyIdentity?.[0],
|
|
1488
|
+
subjectParty: subjectPartyIdentity?.[0]
|
|
1489
|
+
};
|
|
1490
|
+
});
|
|
1491
|
+
const selectableCredentials = await Promise.all(mapSelectableCredentialPromises);
|
|
1492
|
+
selectableCredentialsMap.set(key, selectableCredentials);
|
|
1932
1493
|
}
|
|
1933
1494
|
return selectableCredentialsMap;
|
|
1934
1495
|
}, "getSelectableCredentials");
|
|
@@ -1969,7 +1530,7 @@ var DidAuthSiopOpAuthenticator = class {
|
|
|
1969
1530
|
static {
|
|
1970
1531
|
__name(this, "DidAuthSiopOpAuthenticator");
|
|
1971
1532
|
}
|
|
1972
|
-
schema =
|
|
1533
|
+
schema = plugin_schema_default.IDidAuthSiopOpAuthenticator;
|
|
1973
1534
|
methods = {
|
|
1974
1535
|
siopGetOPSession: this.siopGetOPSession.bind(this),
|
|
1975
1536
|
siopRegisterOPSession: this.siopRegisterOPSession.bind(this),
|
|
@@ -2112,7 +1673,7 @@ var DidAuthSiopOpAuthenticator = class {
|
|
|
2112
1673
|
const url = verifiedAuthorizationRequest.responseURI ?? (args.url.includes("request_uri") ? decodeURIComponent(args.url.split("?request_uri=")[1].trim()) : verifiedAuthorizationRequest.issuer ?? verifiedAuthorizationRequest.registrationMetadataPayload?.client_id);
|
|
2113
1674
|
const uri = url.includes("://") ? new URL(url) : void 0;
|
|
2114
1675
|
const correlationId = uri?.hostname ?? await this.determineCorrelationId(uri, verifiedAuthorizationRequest, clientName, context);
|
|
2115
|
-
const clientId =
|
|
1676
|
+
const clientId = verifiedAuthorizationRequest.authorizationRequest.getMergedProperty("client_id");
|
|
2116
1677
|
return {
|
|
2117
1678
|
issuer: verifiedAuthorizationRequest.issuer,
|
|
2118
1679
|
correlationId,
|
|
@@ -2120,7 +1681,6 @@ var DidAuthSiopOpAuthenticator = class {
|
|
|
2120
1681
|
uri,
|
|
2121
1682
|
name: clientName,
|
|
2122
1683
|
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
1684
|
dcqlQuery: verifiedAuthorizationRequest.dcqlQuery
|
|
2125
1685
|
};
|
|
2126
1686
|
}
|
|
@@ -2197,75 +1757,14 @@ var DidAuthSiopOpAuthenticator = class {
|
|
|
2197
1757
|
if (authorizationRequestData === void 0) {
|
|
2198
1758
|
return Promise.reject(Error("Missing authorization request data in context"));
|
|
2199
1759
|
}
|
|
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
1760
|
const response = await siopSendAuthorizationResponse(ConnectionType2.SIOPv2_OpenID4VP, {
|
|
2260
1761
|
sessionId: didAuthConfig.sessionId,
|
|
2261
1762
|
...args.idOpts && {
|
|
2262
1763
|
idOpts: args.idOpts
|
|
2263
1764
|
},
|
|
2264
|
-
...authorizationRequestData.presentationDefinitions !== void 0 && {
|
|
2265
|
-
verifiableCredentialsWithDefinition
|
|
2266
|
-
},
|
|
2267
1765
|
isFirstParty,
|
|
2268
|
-
hasher: this.hasher
|
|
1766
|
+
hasher: this.hasher,
|
|
1767
|
+
credentials: selectedCredentials
|
|
2269
1768
|
}, context);
|
|
2270
1769
|
const contentType = response.headers.get("content-type") || "";
|
|
2271
1770
|
let responseBody = null;
|
|
@@ -2279,30 +1778,12 @@ var DidAuthSiopOpAuthenticator = class {
|
|
|
2279
1778
|
queryParams: decodeUriAsJson(response?.url)
|
|
2280
1779
|
};
|
|
2281
1780
|
}
|
|
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
1781
|
async siopGetSelectableCredentials(args, context) {
|
|
2298
1782
|
const { authorizationRequestData } = args;
|
|
2299
|
-
if (!authorizationRequestData
|
|
2300
|
-
return Promise.reject(Error("Missing required
|
|
2301
|
-
}
|
|
2302
|
-
if (authorizationRequestData.presentationDefinitions.length > 1) {
|
|
2303
|
-
return Promise.reject(Error("Multiple presentation definitions present"));
|
|
1783
|
+
if (!authorizationRequestData?.dcqlQuery) {
|
|
1784
|
+
return Promise.reject(Error("Missing required dcql query in context"));
|
|
2304
1785
|
}
|
|
2305
|
-
return getSelectableCredentials(authorizationRequestData
|
|
1786
|
+
return getSelectableCredentials(authorizationRequestData?.dcqlQuery, context);
|
|
2306
1787
|
}
|
|
2307
1788
|
};
|
|
2308
1789
|
|
|
@@ -2388,9 +1869,6 @@ var Siopv2OID4VPLinkHandler = class extends LinkHandlerAdapter {
|
|
|
2388
1869
|
}
|
|
2389
1870
|
}
|
|
2390
1871
|
};
|
|
2391
|
-
|
|
2392
|
-
// src/index.ts
|
|
2393
|
-
var schema = require_plugin_schema();
|
|
2394
1872
|
export {
|
|
2395
1873
|
DEFAULT_JWT_PROOF_TYPE,
|
|
2396
1874
|
DID_PREFIX,
|
|
@@ -2408,14 +1886,14 @@ export {
|
|
|
2408
1886
|
Siopv2MachineStates,
|
|
2409
1887
|
Siopv2OID4VPLinkHandler,
|
|
2410
1888
|
SupportedLanguage,
|
|
1889
|
+
convertToDcqlCredentials,
|
|
2411
1890
|
createJwtCallbackWithIdOpts,
|
|
2412
1891
|
createJwtCallbackWithOpOpts,
|
|
2413
1892
|
createOID4VPPresentationSignCallback,
|
|
2414
1893
|
createOP,
|
|
2415
1894
|
createOPBuilder,
|
|
2416
1895
|
didAuthSiopOpAuthenticatorMethods,
|
|
2417
|
-
events,
|
|
2418
1896
|
getSigningAlgo,
|
|
2419
|
-
schema
|
|
1897
|
+
plugin_schema_default as schema
|
|
2420
1898
|
};
|
|
2421
1899
|
//# sourceMappingURL=index.js.map
|