@sovrahq/waci 3.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/.eslintignore +2 -0
  2. package/.eslintrc.js +21 -0
  3. package/.prettierrc +4 -0
  4. package/LICENSE +201 -0
  5. package/dist/callbacks/index.d.ts +108 -0
  6. package/dist/callbacks/index.js +9 -0
  7. package/dist/callbacks/index.js.map +1 -0
  8. package/dist/constants/index.d.ts +1 -0
  9. package/dist/constants/index.js +5 -0
  10. package/dist/constants/index.js.map +1 -0
  11. package/dist/handlers/common/problem-report.handler.d.ts +4 -0
  12. package/dist/handlers/common/problem-report.handler.js +72 -0
  13. package/dist/handlers/common/problem-report.handler.js.map +1 -0
  14. package/dist/handlers/common/step-2-oob-invitation.handler.d.ts +4 -0
  15. package/dist/handlers/common/step-2-oob-invitation.handler.js +93 -0
  16. package/dist/handlers/common/step-2-oob-invitation.handler.js.map +1 -0
  17. package/dist/handlers/decorators/register-handler.decorator.d.ts +2 -0
  18. package/dist/handlers/decorators/register-handler.decorator.js +13 -0
  19. package/dist/handlers/decorators/register-handler.decorator.js.map +1 -0
  20. package/dist/handlers/index.d.ts +6 -0
  21. package/dist/handlers/index.js +11 -0
  22. package/dist/handlers/index.js.map +1 -0
  23. package/dist/handlers/issuance/step-3-propose-credential.handler.d.ts +32 -0
  24. package/dist/handlers/issuance/step-3-propose-credential.handler.js +180 -0
  25. package/dist/handlers/issuance/step-3-propose-credential.handler.js.map +1 -0
  26. package/dist/handlers/issuance/step-4-1-offer-credential-proceed.handler.d.ts +5 -0
  27. package/dist/handlers/issuance/step-4-1-offer-credential-proceed.handler.js +152 -0
  28. package/dist/handlers/issuance/step-4-1-offer-credential-proceed.handler.js.map +1 -0
  29. package/dist/handlers/issuance/step-4-offer-credential.handler.d.ts +5 -0
  30. package/dist/handlers/issuance/step-4-offer-credential.handler.js +169 -0
  31. package/dist/handlers/issuance/step-4-offer-credential.handler.js.map +1 -0
  32. package/dist/handlers/issuance/step-5-request-credential.handler.d.ts +4 -0
  33. package/dist/handlers/issuance/step-5-request-credential.handler.js +275 -0
  34. package/dist/handlers/issuance/step-5-request-credential.handler.js.map +1 -0
  35. package/dist/handlers/issuance/step-6-issue-credential.handler.d.ts +4 -0
  36. package/dist/handlers/issuance/step-6-issue-credential.handler.js +106 -0
  37. package/dist/handlers/issuance/step-6-issue-credential.handler.js.map +1 -0
  38. package/dist/handlers/issuance/step-7-ack-message.handler.d.ts +4 -0
  39. package/dist/handlers/issuance/step-7-ack-message.handler.js +78 -0
  40. package/dist/handlers/issuance/step-7-ack-message.handler.js.map +1 -0
  41. package/dist/handlers/presentation/step-3-propose-presentation.handler.d.ts +5 -0
  42. package/dist/handlers/presentation/step-3-propose-presentation.handler.js +107 -0
  43. package/dist/handlers/presentation/step-3-propose-presentation.handler.js.map +1 -0
  44. package/dist/handlers/presentation/step-4-1-presentation-proceed.handler.d.ts +5 -0
  45. package/dist/handlers/presentation/step-4-1-presentation-proceed.handler.js +130 -0
  46. package/dist/handlers/presentation/step-4-1-presentation-proceed.handler.js.map +1 -0
  47. package/dist/handlers/presentation/step-4-request-presentation.handler.d.ts +5 -0
  48. package/dist/handlers/presentation/step-4-request-presentation.handler.js +151 -0
  49. package/dist/handlers/presentation/step-4-request-presentation.handler.js.map +1 -0
  50. package/dist/handlers/presentation/step-5-present-proof.handler.d.ts +4 -0
  51. package/dist/handlers/presentation/step-5-present-proof.handler.js +211 -0
  52. package/dist/handlers/presentation/step-5-present-proof.handler.js.map +1 -0
  53. package/dist/handlers/presentation/step-6-ack-message.handler.d.ts +4 -0
  54. package/dist/handlers/presentation/step-6-ack-message.handler.js +72 -0
  55. package/dist/handlers/presentation/step-6-ack-message.handler.js.map +1 -0
  56. package/dist/index.d.ts +17 -0
  57. package/dist/index.js +37 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/services/waci-interpreter.d.ts +17 -0
  60. package/dist/services/waci-interpreter.js +222 -0
  61. package/dist/services/waci-interpreter.js.map +1 -0
  62. package/dist/types/actor.d.ts +5 -0
  63. package/dist/types/actor.js +10 -0
  64. package/dist/types/actor.js.map +1 -0
  65. package/dist/types/credential-application.d.ts +36 -0
  66. package/dist/types/credential-application.js +3 -0
  67. package/dist/types/credential-application.js.map +1 -0
  68. package/dist/types/credential-manifest.d.ts +173 -0
  69. package/dist/types/credential-manifest.js +3 -0
  70. package/dist/types/credential-manifest.js.map +1 -0
  71. package/dist/types/index.d.ts +4 -0
  72. package/dist/types/index.js +21 -0
  73. package/dist/types/index.js.map +1 -0
  74. package/dist/types/problem-report.d.ts +13 -0
  75. package/dist/types/problem-report.js +18 -0
  76. package/dist/types/problem-report.js.map +1 -0
  77. package/dist/types/waci-message.d.ts +106 -0
  78. package/dist/types/waci-message.js +106 -0
  79. package/dist/types/waci-message.js.map +1 -0
  80. package/dist/utils/erros.d.ts +15 -0
  81. package/dist/utils/erros.js +42 -0
  82. package/dist/utils/erros.js.map +1 -0
  83. package/dist/utils/index.d.ts +22 -0
  84. package/dist/utils/index.js +356 -0
  85. package/dist/utils/index.js.map +1 -0
  86. package/jest.config.json +17 -0
  87. package/package.json +39 -0
  88. package/readme.md +1 -0
  89. package/src/callbacks/index.ts +75 -0
  90. package/src/constants/index.ts +1 -0
  91. package/src/handlers/common/problem-report.handler.ts +15 -0
  92. package/src/handlers/common/step-2-oob-invitation.handler.ts +45 -0
  93. package/src/handlers/decorators/register-handler.decorator.ts +10 -0
  94. package/src/handlers/index.ts +7 -0
  95. package/src/handlers/issuance/step-3-propose-credential.handler.ts +186 -0
  96. package/src/handlers/issuance/step-4-1-offer-credential-proceed.handler.ts +129 -0
  97. package/src/handlers/issuance/step-4-offer-credential.handler.ts +137 -0
  98. package/src/handlers/issuance/step-5-request-credential.handler.ts +205 -0
  99. package/src/handlers/issuance/step-6-issue-credential.handler.ts +63 -0
  100. package/src/handlers/issuance/step-7-ack-message.handler.ts +21 -0
  101. package/src/handlers/presentation/step-3-propose-presentation.handler.ts +67 -0
  102. package/src/handlers/presentation/step-4-1-presentation-proceed.handler.ts +100 -0
  103. package/src/handlers/presentation/step-4-request-presentation.handler.ts +115 -0
  104. package/src/handlers/presentation/step-5-present-proof.handler.ts +159 -0
  105. package/src/handlers/presentation/step-6-ack-message.handler.ts +15 -0
  106. package/src/index.ts +18 -0
  107. package/src/services/waci-interpreter.ts +161 -0
  108. package/src/types/actor.ts +5 -0
  109. package/src/types/credential-application.ts +38 -0
  110. package/src/types/credential-manifest.ts +184 -0
  111. package/src/types/index.ts +4 -0
  112. package/src/types/problem-report.ts +29 -0
  113. package/src/types/waci-message.ts +148 -0
  114. package/src/utils/erros.ts +21 -0
  115. package/src/utils/index.ts +272 -0
  116. package/test/handlers/issuance/step-3-propose-credential.handler.spec.ts +43 -0
  117. package/test/handlers/issuance/step-4-offer-credential.handler.spec.ts +53 -0
  118. package/test/handlers/issuance/step-5-request-credential.handler.spec.ts +102 -0
  119. package/test/handlers/presentation/step-5-present-proof.handler.spec.ts +142 -0
  120. package/test/handlers/shared/step-2-oob-invitation.handler.spec.ts +55 -0
  121. package/test/stubs/index.ts +842 -0
  122. package/test/waci-interpreter.spec.ts +113 -0
  123. package/tsconfig.build.json +9 -0
  124. package/tsconfig.json +20 -0
@@ -0,0 +1,356 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ var __asyncValues = (this && this.__asyncValues) || function (o) {
39
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
40
+ var m = o[Symbol.asyncIterator], i;
41
+ return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
42
+ function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
43
+ function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
44
+ };
45
+ Object.defineProperty(exports, "__esModule", { value: true });
46
+ exports.validateVcByInputDescriptor = exports.extractExpectedChallenge = exports.verifyPresentation = exports.createUUID = exports.getObjectValues = exports.extractSDJWTClaims = exports.extractClaimKeyFromPath = void 0;
47
+ var UUID = require("uuid");
48
+ var jsonpath = require("jsonpath");
49
+ var jsonschema = require("jsonschema");
50
+ var erros_1 = require("./erros");
51
+ /**
52
+ * Extract the claim key from a JSONPath expression.
53
+ * E.g. "$.credentialSubject.name" → "name", "$.type" → "type"
54
+ */
55
+ var extractClaimKeyFromPath = function (path) {
56
+ var segments = path.replace(/^\$\.?/, '').split('.');
57
+ return segments[segments.length - 1];
58
+ };
59
+ exports.extractClaimKeyFromPath = extractClaimKeyFromPath;
60
+ /**
61
+ * Parse an SD-JWT string and extract the disclosed claim names as a Set.
62
+ * SD-JWT format: <JWT>~<disclosure1>~<disclosure2>~...~[<KB-JWT>]
63
+ * Each disclosure is base64url-encoded JSON array: [salt, claimName, claimValue]
64
+ */
65
+ var extractSDJWTClaims = function (sdJwtString) {
66
+ var claims = new Set();
67
+ try {
68
+ var parts = sdJwtString.split('~');
69
+ // Skip first part (JWT) and filter out empty strings and potential KB-JWT (has dots)
70
+ var disclosures = parts.slice(1).filter(function (p) { return p.length > 0; });
71
+ for (var _i = 0, disclosures_1 = disclosures; _i < disclosures_1.length; _i++) {
72
+ var disclosure = disclosures_1[_i];
73
+ // Skip if it looks like a JWT (KB-JWT)
74
+ if (disclosure.split('.').length === 3)
75
+ continue;
76
+ try {
77
+ // Base64url decode
78
+ var base64 = disclosure.replace(/-/g, '+').replace(/_/g, '/');
79
+ while (base64.length % 4 !== 0)
80
+ base64 += '=';
81
+ var decoded = Buffer.from(base64, 'base64').toString('utf-8');
82
+ var array = JSON.parse(decoded);
83
+ if (Array.isArray(array) && array.length >= 2) {
84
+ claims.add(array[1]); // claimName is second element
85
+ }
86
+ }
87
+ catch (_a) {
88
+ // Skip malformed disclosures
89
+ }
90
+ }
91
+ }
92
+ catch (_b) {
93
+ // Return empty set on any error
94
+ }
95
+ return claims;
96
+ };
97
+ exports.extractSDJWTClaims = extractSDJWTClaims;
98
+ var getObjectValues = function (object) {
99
+ return Object.values(object);
100
+ };
101
+ exports.getObjectValues = getObjectValues;
102
+ exports.createUUID = UUID.v4;
103
+ var verifyPresentation = function (presentationDefinition, credentialApplication, verificationCallback) { return __awaiter(void 0, void 0, void 0, function () {
104
+ var vcs, _loop_1, _a, _b, _c, state_1, e_1_1, error_1;
105
+ var _d, e_1, _e, _f;
106
+ var _g, _h;
107
+ return __generator(this, function (_j) {
108
+ switch (_j.label) {
109
+ case 0:
110
+ _j.trys.push([0, 14, , 15]);
111
+ vcs = [];
112
+ _j.label = 1;
113
+ case 1:
114
+ _j.trys.push([1, 7, 8, 13]);
115
+ _loop_1 = function () {
116
+ var inputDescriptor, vcInput, vc, verificationResult_1, disclosedClaims, _i, _k, field, pathKey, _l, _m, field, fieldValue, errors, verificationResult, error;
117
+ return __generator(this, function (_o) {
118
+ switch (_o.label) {
119
+ case 0:
120
+ _f = _c.value;
121
+ _a = false;
122
+ _o.label = 1;
123
+ case 1:
124
+ _o.trys.push([1, , 5, 6]);
125
+ inputDescriptor = _f;
126
+ vcInput = credentialApplication.data.json.presentation_submission.descriptor_map.find(function (descriptor) { return inputDescriptor.id === descriptor.id; });
127
+ if (!vcInput)
128
+ return [2 /*return*/, { value: new erros_1.InputDescriptorError() }];
129
+ vc = jsonpath.query(credentialApplication.data.json, vcInput.path)[0];
130
+ vcs.push(vc);
131
+ if (!(typeof vc === 'string')) return [3 /*break*/, 3];
132
+ return [4 /*yield*/, verificationCallback(vc)];
133
+ case 2:
134
+ verificationResult_1 = _o.sent();
135
+ console.log('---- Verification Result (SD-JWT string) -----', verificationResult_1);
136
+ if (!verificationResult_1.result) {
137
+ return [2 /*return*/, { value: {
138
+ result: false,
139
+ error: verificationResult_1.error || ['Credential verification failed'],
140
+ vcs: vcs
141
+ } }];
142
+ }
143
+ // Validate that required fields from constraints are present in SD-JWT disclosures
144
+ if ((_g = inputDescriptor.constraints) === null || _g === void 0 ? void 0 : _g.fields) {
145
+ disclosedClaims = (0, exports.extractSDJWTClaims)(vc);
146
+ for (_i = 0, _k = inputDescriptor.constraints.fields; _i < _k.length; _i++) {
147
+ field = _k[_i];
148
+ pathKey = (0, exports.extractClaimKeyFromPath)(field.path[0]);
149
+ if (!disclosedClaims.has(pathKey)) {
150
+ return [2 /*return*/, { value: {
151
+ result: false,
152
+ error: [{ name: 'missing-field', description: "SD-JWT missing required disclosure: ".concat(pathKey) }],
153
+ vcs: vcs,
154
+ } }];
155
+ }
156
+ }
157
+ }
158
+ return [2 /*return*/, "continue"];
159
+ case 3:
160
+ // Verify fields
161
+ for (_l = 0, _m = inputDescriptor.constraints.fields; _l < _m.length; _l++) {
162
+ field = _m[_l];
163
+ fieldValue = (_h = jsonpath.query(vc, field.path[0])) === null || _h === void 0 ? void 0 : _h[0];
164
+ if (!fieldValue) {
165
+ return [2 /*return*/, { value: { result: false, error: [{ name: 'missing-field', description: "Missing required field: ".concat(field.path[0]) }], vcs: vcs } }];
166
+ }
167
+ if (field.filter) {
168
+ errors = jsonschema.validate(fieldValue, field.filter).errors;
169
+ if (errors.length) {
170
+ return [2 /*return*/, { value: { result: false, error: [{ name: 'invalid-field', description: "Field ".concat(field.path[0], " does not match filter") }], vcs: vcs } }];
171
+ }
172
+ }
173
+ }
174
+ return [4 /*yield*/, verificationCallback(vc)];
175
+ case 4:
176
+ verificationResult = _o.sent();
177
+ console.log('---- Verification Result -----', verificationResult);
178
+ if (!verificationResult.result) {
179
+ error = verificationResult.error;
180
+ switch (error.name) {
181
+ case 'did-document-resolution-error':
182
+ // DIDDocumentResolutionError
183
+ console.log("Cannot resolve DID document: ".concat(error.did));
184
+ // Handle DID resolution failure
185
+ break;
186
+ case 'vc-invalid-signature':
187
+ // InvalidSignatureError
188
+ console.log('Invalid signature detected');
189
+ console.log('Description:', error.description);
190
+ // Handle signature validation failure
191
+ break;
192
+ case 'verification-method-not-found':
193
+ // VerificationMethodNotFound
194
+ console.log("Verification method ".concat(error.verificationMethod, " not found in DID Document: ").concat(error.did));
195
+ // Handle missing verification method
196
+ break;
197
+ case 'verification-relationship-invalid':
198
+ // VerificationRelationshipError
199
+ console.log("Verification method ".concat(error.verificationMethod, " is not configured as ").concat(error.expectedVerificationRelationship));
200
+ // Handle incorrect verification relationship
201
+ break;
202
+ case 'unexpected-challenge':
203
+ // UnexpectedChallengeError
204
+ console.log('Unexpected challenge error:', error.errorMessage);
205
+ // Handle challenge validation failure
206
+ break;
207
+ case 'authentication-purpose-challenge-required':
208
+ // AuthenticationPurposeChallengeRequired
209
+ console.log('Authentication purpose requires a challenge');
210
+ // Handle missing challenge for authentication
211
+ break;
212
+ case 'verifiable-credential-revoked':
213
+ // VerifiableCredentialRevoked
214
+ console.log('Credential has been revoked');
215
+ console.log('Revocation details:', error.errors);
216
+ return [2 /*return*/, { value: {
217
+ result: false,
218
+ error: verificationResult.error || ['Credential verification failed'],
219
+ vcs: vcs
220
+ } }];
221
+ // Handle revoked credential
222
+ break;
223
+ case 'verifiable-credential-suspended':
224
+ // VerifiableCredentialSuspended
225
+ console.log('Credential has been suspended');
226
+ console.log('Suspension details:', error.errors);
227
+ return [2 /*return*/, { value: {
228
+ result: false,
229
+ error: verificationResult.error || ['Credential verification failed'],
230
+ vcs: vcs
231
+ } }];
232
+ // Handle suspended credential
233
+ break;
234
+ case 'credential-status-service-error':
235
+ // CredentialStatusServiceError
236
+ console.log("Error retrieving credential status from: ".concat(error.endpoint));
237
+ console.log("HTTP Status: ".concat(error.httpStatusResult));
238
+ console.log("Response Data: ".concat(error.dataResult));
239
+ // Handle credential status service failure
240
+ break;
241
+ case 'verifiable-credential-expired':
242
+ // VerifiableCredentialExpired
243
+ console.log('Credential has expired');
244
+ return [2 /*return*/, { value: {
245
+ result: false,
246
+ error: verificationResult.error || ['Credential verification failed'],
247
+ vcs: vcs
248
+ } }];
249
+ // Handle expired credential
250
+ break;
251
+ case 'unhandled-vc-suite-error':
252
+ // UnhandledVCSuiteError
253
+ console.log('Unhandled VC suite error:', error.messageError);
254
+ // Handle unexpected verification errors
255
+ break;
256
+ default:
257
+ console.log('Unknown error type:', error.name);
258
+ console.log('Error description:', error.description);
259
+ console.log('Error code:', error.code);
260
+ // Handle unknown errors
261
+ }
262
+ }
263
+ return [3 /*break*/, 6];
264
+ case 5:
265
+ _a = true;
266
+ return [7 /*endfinally*/];
267
+ case 6: return [2 /*return*/];
268
+ }
269
+ });
270
+ };
271
+ _a = true, _b = __asyncValues(presentationDefinition.input_descriptors);
272
+ _j.label = 2;
273
+ case 2: return [4 /*yield*/, _b.next()];
274
+ case 3:
275
+ if (!(_c = _j.sent(), _d = _c.done, !_d)) return [3 /*break*/, 6];
276
+ return [5 /*yield**/, _loop_1()];
277
+ case 4:
278
+ state_1 = _j.sent();
279
+ if (typeof state_1 === "object")
280
+ return [2 /*return*/, state_1.value];
281
+ _j.label = 5;
282
+ case 5: return [3 /*break*/, 2];
283
+ case 6: return [3 /*break*/, 13];
284
+ case 7:
285
+ e_1_1 = _j.sent();
286
+ e_1 = { error: e_1_1 };
287
+ return [3 /*break*/, 13];
288
+ case 8:
289
+ _j.trys.push([8, , 11, 12]);
290
+ if (!(!_a && !_d && (_e = _b.return))) return [3 /*break*/, 10];
291
+ return [4 /*yield*/, _e.call(_b)];
292
+ case 9:
293
+ _j.sent();
294
+ _j.label = 10;
295
+ case 10: return [3 /*break*/, 12];
296
+ case 11:
297
+ if (e_1) throw e_1.error;
298
+ return [7 /*endfinally*/];
299
+ case 12: return [7 /*endfinally*/];
300
+ case 13: return [2 /*return*/, {
301
+ result: true,
302
+ vcs: vcs
303
+ }];
304
+ case 14:
305
+ error_1 = _j.sent();
306
+ console.error(error_1);
307
+ return [2 /*return*/, {
308
+ result: false,
309
+ error: error_1,
310
+ vcs: []
311
+ }];
312
+ case 15: return [2 /*return*/];
313
+ }
314
+ });
315
+ }); };
316
+ exports.verifyPresentation = verifyPresentation;
317
+ var extractExpectedChallenge = function (presentationDefinitionMessage) {
318
+ return presentationDefinitionMessage.attachments.find(function (attachment) { var _a, _b, _c; return (_c = (_b = (_a = attachment === null || attachment === void 0 ? void 0 : attachment.data) === null || _a === void 0 ? void 0 : _a.json) === null || _b === void 0 ? void 0 : _b.options) === null || _c === void 0 ? void 0 : _c.challenge; }).data.json.options.challenge;
319
+ };
320
+ exports.extractExpectedChallenge = extractExpectedChallenge;
321
+ var validateVcByInputDescriptor = function (vc, inputDescriptor) {
322
+ var _a, _b;
323
+ // SD-JWT: validate disclosed claims against required fields
324
+ if (typeof vc === 'string') {
325
+ if (!((_a = inputDescriptor.constraints) === null || _a === void 0 ? void 0 : _a.fields))
326
+ return true;
327
+ var disclosedClaims = (0, exports.extractSDJWTClaims)(vc);
328
+ for (var _i = 0, _c = inputDescriptor.constraints.fields; _i < _c.length; _i++) {
329
+ var field = _c[_i];
330
+ var pathKey = (0, exports.extractClaimKeyFromPath)(field.path[0]);
331
+ if (!disclosedClaims.has(pathKey))
332
+ return false;
333
+ }
334
+ return true;
335
+ }
336
+ for (var _d = 0, _e = inputDescriptor.constraints.fields; _d < _e.length; _d++) {
337
+ var field = _e[_d];
338
+ var fieldValues = (_b = field.path) === null || _b === void 0 ? void 0 : _b.map(function (path) {
339
+ return jsonpath.value(vc, path);
340
+ });
341
+ for (var _f = 0, fieldValues_1 = fieldValues; _f < fieldValues_1.length; _f++) {
342
+ var value = fieldValues_1[_f];
343
+ if (!value)
344
+ return false;
345
+ if (field.filter) {
346
+ var errors = jsonschema.validate(value, field.filter).errors;
347
+ if (errors.length) {
348
+ return false;
349
+ }
350
+ }
351
+ }
352
+ }
353
+ return true;
354
+ };
355
+ exports.validateVcByInputDescriptor = validateVcByInputDescriptor;
356
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ {
2
+ "moduleFileExtensions": [
3
+ "js",
4
+ "json",
5
+ "ts"
6
+ ],
7
+ "rootDir": "test",
8
+ "testRegex": ".*\\.spec\\.ts$",
9
+ "transform": {
10
+ "^.+\\.(t|j)s$": "ts-jest"
11
+ },
12
+ "collectCoverageFrom": [
13
+ "**/*.(t|j)s"
14
+ ],
15
+ "coverageDirectory": "../coverage",
16
+ "testEnvironment": "node"
17
+ }
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@sovrahq/waci",
3
+ "version": "3.4.0",
4
+ "license": "Apache-2.0",
5
+ "main": "dist/index.js",
6
+ "typings": "dist/index.d.ts",
7
+ "scripts": {
8
+ "build": "tsc --project tsconfig.build.json",
9
+ "test": "jest --verbose --silent"
10
+ },
11
+ "devDependencies": {
12
+ "@types/base-64": "^1.0.0",
13
+ "@types/jest": "^27.5.0",
14
+ "@types/jsonpath": "^0.2.0",
15
+ "@types/lodash": "^4.14.182",
16
+ "@types/uuid": "^8.3.4",
17
+ "@typescript-eslint/eslint-plugin": "^5.0.0",
18
+ "@typescript-eslint/parser": "^5.0.0",
19
+ "eslint": "^8.2.0",
20
+ "eslint-config-airbnb-base": "^15.0.0",
21
+ "eslint-config-prettier": "^8.3.0",
22
+ "eslint-plugin-import": "^2.25.2",
23
+ "eslint-plugin-prettier": "^4.0.0",
24
+ "eslint-plugin-unused-imports": "^2.0.0",
25
+ "jest": "^28.0.3",
26
+ "prettier": "^2.3.2",
27
+ "ts-jest": "^28.0.1",
28
+ "typescript": "^4.2.4"
29
+ },
30
+ "dependencies": {
31
+ "jsonpath": "^1.1.1",
32
+ "jsonschema": "^1.4.1",
33
+ "lodash": "^4.17.21",
34
+ "uuid": "^8.3.2"
35
+ },
36
+ "publishConfig": {
37
+ "access": "public"
38
+ }
39
+ }
package/readme.md ADDED
@@ -0,0 +1 @@
1
+ # WACI
@@ -0,0 +1,75 @@
1
+ import {
2
+ CredentialFulfillment,
3
+ Actor,
4
+ CredentialManifest,
5
+ InputDescriptor,
6
+ PresentationDefinitionFrame,
7
+ WACIMessage,
8
+ } from '../types';
9
+ import { OfferCredentialMessageParamsBase } from '../handlers/issuance/step-3-propose-credential.handler';
10
+
11
+ export type Callback<TInput = any, TOutput = any> = (
12
+ input: TInput,
13
+ ) => Promise<TOutput>;
14
+
15
+ export type InputCallbacks = {
16
+ [Actor.Holder]?: {
17
+ getHolderDID: Callback<{ message: WACIMessage }, string>;
18
+ // Issuance flow
19
+ getCredentialApplication: Callback<
20
+ { manifest: CredentialManifest; fulfillment: CredentialFulfillment, message?: WACIMessage },
21
+ { credentialsToPresent: any[], presentationProofTypes: string[] } | CredentialPresentationResponse
22
+ >;
23
+ // Verification flow
24
+ getCredentialPresentation: Callback<
25
+ {
26
+ inputDescriptors: InputDescriptor[],
27
+ frame?: PresentationDefinitionFrame,
28
+ message?: WACIMessage
29
+ },
30
+ { credentialsToPresent: any[] } | CredentialPresentationResponse
31
+ >;
32
+ signPresentation: Callback<{
33
+ contentToSign: any;
34
+ challenge: string;
35
+ domain?: string;
36
+ message?: WACIMessage;
37
+ }>;
38
+ handleCredentialFulfillment: Callback<{ credentialFulfillment: CredentialFulfillment[], message: WACIMessage }, boolean>;
39
+ handlePresentationAck: Callback<{ status: any, message: WACIMessage }, void>;
40
+ };
41
+
42
+ [Actor.Issuer]?: {
43
+ getCredentialManifest: Callback<
44
+ { invitationId: string; holderDid: string, message: WACIMessage },
45
+ OfferCredentialMessageParamsBase
46
+ >;
47
+ signCredential: Callback<{ vc: any, message: WACIMessage }, any>;
48
+ verifyCredential: Callback<any, { result: boolean; error?: any }>;
49
+ credentialVerificationResult?: Callback<{ result: boolean; error?: any, thid: string, vcs: any[], message: WACIMessage }, void>;
50
+ verifyPresentation: Callback<
51
+ { presentation: any; challenge: string, message?: WACIMessage, holderDid?: string },
52
+ { result: boolean; error?: any }
53
+ >;
54
+ handleIssuanceAck: Callback<{ status: any, from: string, pthid: string, thid: string, message: WACIMessage }, void>;
55
+ };
56
+ [Actor.Verifier]?: {
57
+ getPresentationDefinition: Callback<
58
+ { invitationId: string },
59
+ {
60
+ inputDescriptors: InputDescriptor[],
61
+ frame?: PresentationDefinitionFrame,
62
+ }
63
+ >;
64
+ credentialVerificationResult?: Callback<{ result: boolean; error?: any, thid: string, vcs: any[], message: WACIMessage }, void>;
65
+ verifyCredential: Callback<any, { result: boolean; error?: any }>;
66
+ verifyPresentation: Callback<
67
+ { presentation: any; challenge: string, message?: WACIMessage, holderDid?: string },
68
+ { result: boolean; error?: any }
69
+ >;
70
+ };
71
+ };
72
+
73
+ export enum CredentialPresentationResponse {
74
+ AsyncProcess
75
+ }
@@ -0,0 +1 @@
1
+ export const SUPPORTED_ALGORITHMS = [ 'didcomm/v2', 'didcomm/aip2;env=rfc587' ];
@@ -0,0 +1,15 @@
1
+ import { RegisterHandler } from '../decorators/register-handler.decorator';
2
+ import {
3
+ WACIMessage,
4
+ WACIMessageHandler,
5
+ WACIMessageType,
6
+ Actor,
7
+ } from '../../types';
8
+
9
+ @RegisterHandler(Actor.Holder, WACIMessageType.ProblemReport)
10
+ export class ProblemReportHandler implements WACIMessageHandler {
11
+ async handle(messageThread: WACIMessage[], callbacks: any): Promise<void> {
12
+ const message = messageThread[messageThread.length - 1];
13
+ await callbacks[Actor.Holder].handlePresentationAck({ status: message.body, message });
14
+ }
15
+ }
@@ -0,0 +1,45 @@
1
+ import { RegisterHandler } from '../decorators/register-handler.decorator';
2
+ import {
3
+ GoalCode,
4
+ WACIMessage,
5
+ WACIMessageHandler,
6
+ WACIMessageHandlerResponse,
7
+ WACIMessageResponseType,
8
+ WACIMessageType,
9
+ Actor,
10
+ } from '../../types';
11
+ import { createUUID } from '../../utils';
12
+
13
+ @RegisterHandler(Actor.Holder, WACIMessageType.OutOfBandInvitation)
14
+ export class OOBInvitationHandler implements WACIMessageHandler {
15
+ async handle(
16
+ messageThread: WACIMessage[],
17
+ callbacks: any,
18
+ ): Promise<WACIMessageHandlerResponse> {
19
+ const message = messageThread[messageThread.length - 1];
20
+ let responseMessageType: WACIMessageType;
21
+ switch (message?.body?.goal_code) {
22
+ case GoalCode.Issuance:
23
+ responseMessageType = WACIMessageType.ProposeCredential;
24
+ break;
25
+ case GoalCode.Presentation:
26
+ responseMessageType = WACIMessageType.ProposePresentation;
27
+ break;
28
+ default:
29
+ throw Error('No goal code defined in invitation');
30
+ }
31
+
32
+ const holderDID = await callbacks[Actor.Holder].getHolderDID({ message });
33
+
34
+ return {
35
+ responseType: WACIMessageResponseType.CreateThread,
36
+ message: {
37
+ type: responseMessageType,
38
+ id: createUUID(),
39
+ pthid: message.id,
40
+ from: holderDID,
41
+ to: [message.from],
42
+ },
43
+ };
44
+ }
45
+ }
@@ -0,0 +1,10 @@
1
+ import { Actor } from '../../types';
2
+ import { handlers } from '../index';
3
+
4
+ export const RegisterHandler =
5
+ (actor : Actor, messageType : any) : any =>
6
+ (target : new (...args : never[]) => any) => {
7
+ const actorHandlers = handlers[actor];
8
+ // eslint-disable-next-line new-cap
9
+ actorHandlers.set(messageType, new target());
10
+ };
@@ -0,0 +1,7 @@
1
+ import { WACIMessageHandler, WACIMessageType, Actor } from '../types';
2
+
3
+ export const handlers = {
4
+ [Actor.Holder]: new Map<WACIMessageType, WACIMessageHandler>(),
5
+ [Actor.Issuer]: new Map<WACIMessageType, WACIMessageHandler>(),
6
+ [Actor.Verifier]: new Map<WACIMessageType, WACIMessageHandler>(),
7
+ };