@icure/api 8.1.8 → 8.2.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 (107) hide show
  1. package/icc-api/model/RouteOfAdministration.d.ts +0 -1
  2. package/icc-api/model/RouteOfAdministration.js.map +1 -1
  3. package/icc-api/model/Vmp.d.ts +0 -2
  4. package/icc-api/model/Vmp.js.map +1 -1
  5. package/icc-api/model/VmpGroup.d.ts +0 -2
  6. package/icc-api/model/VmpGroup.js.map +1 -1
  7. package/icc-api/model/internal/ExchangeData.d.ts +1 -1
  8. package/icc-api/model/internal/ExchangeData.js +1 -7
  9. package/icc-api/model/internal/ExchangeData.js.map +1 -1
  10. package/icc-x-api/crypto/BaseExchangeDataManager.d.ts +19 -9
  11. package/icc-x-api/crypto/BaseExchangeDataManager.js +27 -6
  12. package/icc-x-api/crypto/BaseExchangeDataManager.js.map +1 -1
  13. package/icc-x-api/crypto/CryptoStrategies.d.ts +2 -1
  14. package/icc-x-api/crypto/CryptoStrategies.js.map +1 -1
  15. package/icc-x-api/crypto/DelegationsDeAnonymization.js +1 -1
  16. package/icc-x-api/crypto/DelegationsDeAnonymization.js.map +1 -1
  17. package/icc-x-api/crypto/ExchangeDataManager.d.ts +25 -2
  18. package/icc-x-api/crypto/ExchangeDataManager.js +98 -5
  19. package/icc-x-api/crypto/ExchangeDataManager.js.map +1 -1
  20. package/icc-x-api/crypto/ExtendedApisUtils.d.ts +3 -1
  21. package/icc-x-api/crypto/ExtendedApisUtils.js.map +1 -1
  22. package/icc-x-api/crypto/ExtendedApisUtilsImpl.d.ts +1 -1
  23. package/icc-x-api/crypto/ExtendedApisUtilsImpl.js +3 -3
  24. package/icc-x-api/crypto/ExtendedApisUtilsImpl.js.map +1 -1
  25. package/icc-x-api/crypto/SecureDelegationsManager.d.ts +3 -1
  26. package/icc-x-api/crypto/SecureDelegationsManager.js +10 -6
  27. package/icc-x-api/crypto/SecureDelegationsManager.js.map +1 -1
  28. package/icc-x-api/crypto/ShamirKeysManager.js +1 -1
  29. package/icc-x-api/crypto/ShamirKeysManager.js.map +1 -1
  30. package/icc-x-api/crypto/UserEncryptionKeysManager.js +4 -0
  31. package/icc-x-api/crypto/UserEncryptionKeysManager.js.map +1 -1
  32. package/icc-x-api/crypto/utils.js +1 -1
  33. package/icc-x-api/crypto/utils.js.map +1 -1
  34. package/icc-x-api/icc-accesslog-x-api.d.ts +6 -0
  35. package/icc-x-api/icc-accesslog-x-api.js +6 -2
  36. package/icc-x-api/icc-accesslog-x-api.js.map +1 -1
  37. package/icc-x-api/icc-bekmehr-x-api.js +1 -1
  38. package/icc-x-api/icc-bekmehr-x-api.js.map +1 -1
  39. package/icc-x-api/icc-calendar-item-x-api.d.ts +4 -0
  40. package/icc-x-api/icc-calendar-item-x-api.js +3 -1
  41. package/icc-x-api/icc-calendar-item-x-api.js.map +1 -1
  42. package/icc-x-api/icc-classification-x-api.d.ts +3 -0
  43. package/icc-x-api/icc-classification-x-api.js +3 -1
  44. package/icc-x-api/icc-classification-x-api.js.map +1 -1
  45. package/icc-x-api/icc-contact-x-api.d.ts +3 -0
  46. package/icc-x-api/icc-contact-x-api.js +3 -1
  47. package/icc-x-api/icc-contact-x-api.js.map +1 -1
  48. package/icc-x-api/icc-crypto-x-api.d.ts +29 -0
  49. package/icc-x-api/icc-crypto-x-api.js +36 -0
  50. package/icc-x-api/icc-crypto-x-api.js.map +1 -1
  51. package/icc-x-api/icc-document-x-api.d.ts +3 -0
  52. package/icc-x-api/icc-document-x-api.js +3 -1
  53. package/icc-x-api/icc-document-x-api.js.map +1 -1
  54. package/icc-x-api/icc-form-x-api.d.ts +3 -0
  55. package/icc-x-api/icc-form-x-api.js +3 -1
  56. package/icc-x-api/icc-form-x-api.js.map +1 -1
  57. package/icc-x-api/icc-helement-x-api.d.ts +3 -0
  58. package/icc-x-api/icc-helement-x-api.js +3 -1
  59. package/icc-x-api/icc-helement-x-api.js.map +1 -1
  60. package/icc-x-api/icc-invoice-x-api.d.ts +3 -0
  61. package/icc-x-api/icc-invoice-x-api.js +3 -1
  62. package/icc-x-api/icc-invoice-x-api.js.map +1 -1
  63. package/icc-x-api/icc-maintenance-task-x-api.d.ts +3 -0
  64. package/icc-x-api/icc-maintenance-task-x-api.js +3 -1
  65. package/icc-x-api/icc-maintenance-task-x-api.js.map +1 -1
  66. package/icc-x-api/icc-message-x-api.d.ts +3 -0
  67. package/icc-x-api/icc-message-x-api.js +3 -1
  68. package/icc-x-api/icc-message-x-api.js.map +1 -1
  69. package/icc-x-api/icc-patient-x-api.d.ts +3 -0
  70. package/icc-x-api/icc-patient-x-api.js +6 -2
  71. package/icc-x-api/icc-patient-x-api.js.map +1 -1
  72. package/icc-x-api/icc-receipt-x-api.d.ts +3 -0
  73. package/icc-x-api/icc-receipt-x-api.js +3 -1
  74. package/icc-x-api/icc-receipt-x-api.js.map +1 -1
  75. package/icc-x-api/icc-recovery-x-api.js +8 -1
  76. package/icc-x-api/icc-recovery-x-api.js.map +1 -1
  77. package/icc-x-api/icc-time-table-x-api.d.ts +3 -0
  78. package/icc-x-api/icc-time-table-x-api.js +3 -1
  79. package/icc-x-api/icc-time-table-x-api.js.map +1 -1
  80. package/icc-x-api/icc-topic-x-api.d.ts +3 -0
  81. package/icc-x-api/icc-topic-x-api.js +3 -1
  82. package/icc-x-api/icc-topic-x-api.js.map +1 -1
  83. package/icc-x-api/index.d.ts +16 -0
  84. package/icc-x-api/index.js +7 -1
  85. package/icc-x-api/index.js.map +1 -1
  86. package/icc-x-api/utils/websocket.d.ts +1 -0
  87. package/package.json +1 -1
  88. package/test/icc-x-api/autofix-anonymity-test.js +18 -4
  89. package/test/icc-x-api/autofix-anonymity-test.js.map +1 -1
  90. package/test/icc-x-api/crypto/exchange-data-manager-test.js +34 -32
  91. package/test/icc-x-api/crypto/exchange-data-manager-test.js.map +1 -1
  92. package/test/icc-x-api/crypto/secure-delegations-manager-test.js +2 -2
  93. package/test/icc-x-api/crypto/secure-delegations-manager-test.js.map +1 -1
  94. package/test/icc-x-api/icc-hcparty-x-api-test.js +2 -14
  95. package/test/icc-x-api/icc-hcparty-x-api-test.js.map +1 -1
  96. package/test/icc-x-api/keyless-api.d.ts +1 -0
  97. package/test/icc-x-api/keyless-api.js +125 -0
  98. package/test/icc-x-api/keyless-api.js.map +1 -0
  99. package/test/utils/FakeExchangeDataManager.d.ts +8 -0
  100. package/test/utils/FakeExchangeDataManager.js +3 -0
  101. package/test/utils/FakeExchangeDataManager.js.map +1 -1
  102. package/test/utils/KeylessCryptoStrategies.d.ts +23 -0
  103. package/test/utils/KeylessCryptoStrategies.js +26 -0
  104. package/test/utils/KeylessCryptoStrategies.js.map +1 -0
  105. package/test/utils/test_utils.d.ts +7 -0
  106. package/test/utils/test_utils.js +30 -1
  107. package/test/utils/test_utils.js.map +1 -1
@@ -176,12 +176,13 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
176
176
  it('should create new encryption keys when none is available', function () {
177
177
  return __awaiter(this, void 0, void 0, function* () {
178
178
  function doTest(allowFullExchangeDataLoad) {
179
+ var _a;
179
180
  return __awaiter(this, void 0, void 0, function* () {
180
181
  yield initialiseComponents(allowFullExchangeDataLoad);
181
182
  const sfk = primitives.randomUuid();
182
183
  const initialisedCount = exchangeDataApi.callCount;
183
- const createdData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId, false);
184
- const retrievedCachedData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId, false);
184
+ const createdData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId);
185
+ const retrievedCachedData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId);
185
186
  exchangeDataApi.compareCallCountFromBaseline(initialisedCount, {
186
187
  createExchangeData: 1,
187
188
  // If we could fully preload we already know whether the exchange key already exists or not, otherwise we have to request from the api
@@ -199,7 +200,7 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
199
200
  (0, chai_1.expect)(decryptedAccessControlSecretByDelegate.successfulDecryptions[0]).to.equal(createdData.accessControlSecret);
200
201
  (0, chai_1.expect)(retrievedCachedData.exchangeData.delegator).to.equal(selfId);
201
202
  (0, chai_1.expect)(retrievedCachedData.exchangeData.delegate).to.equal(delegateId);
202
- (0, chai_1.expect)(Object.keys(retrievedCachedData.exchangeData.delegatorSignature)).to.have.length(1);
203
+ (0, chai_1.expect)(Object.keys((_a = retrievedCachedData.exchangeData.delegatorSignature) !== null && _a !== void 0 ? _a : {})).to.have.length(1);
203
204
  (0, chai_1.expect)(Object.keys(retrievedCachedData.exchangeData.exchangeKey)).to.have.length(2);
204
205
  (0, chai_1.expect)(Object.keys(retrievedCachedData.exchangeData.accessControlSecret)).to.have.length(2);
205
206
  (0, chai_1.expect)(Object.keys(retrievedCachedData.exchangeData.sharedSignatureKey)).to.have.length(2);
@@ -212,12 +213,13 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
212
213
  it('should create encryption keys to self when none is available', function () {
213
214
  return __awaiter(this, void 0, void 0, function* () {
214
215
  function doTest(allowFullExchangeDataLoad) {
216
+ var _a;
215
217
  return __awaiter(this, void 0, void 0, function* () {
216
218
  yield initialiseComponents(allowFullExchangeDataLoad);
217
- const createdData = yield exchangeData.getOrCreateEncryptionDataTo(selfId, false);
219
+ const createdData = yield exchangeData.getOrCreateEncryptionDataTo(selfId);
218
220
  (0, chai_1.expect)(createdData.exchangeData.delegator).to.equal(selfId);
219
221
  (0, chai_1.expect)(createdData.exchangeData.delegate).to.equal(selfId);
220
- (0, chai_1.expect)(Object.keys(createdData.exchangeData.delegatorSignature)).to.have.length(1);
222
+ (0, chai_1.expect)(Object.keys((_a = createdData.exchangeData.delegatorSignature) !== null && _a !== void 0 ? _a : {})).to.have.length(1);
221
223
  (0, chai_1.expect)(Object.keys(createdData.exchangeData.sharedSignatureKey)).to.have.length(1);
222
224
  (0, chai_1.expect)(Object.keys(createdData.exchangeData.exchangeKey)).to.have.length(1);
223
225
  (0, chai_1.expect)(Object.keys(createdData.exchangeData.accessControlSecret)).to.have.length(1);
@@ -247,7 +249,7 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
247
249
  yield dataOwnerApi.addPublicKeyForOwner(selfId, keyData.pair);
248
250
  yield encryptionKeysManager.addOrUpdateKey(primitives, keyData.pair, false);
249
251
  }
250
- const created = yield exchangeData.getOrCreateEncryptionDataTo(delegateId, false);
252
+ const created = yield exchangeData.getOrCreateEncryptionDataTo(delegateId);
251
253
  (0, chai_1.expect)((0, collection_utils_1.setEquals)(new Set(Object.keys(created.exchangeData.exchangeKey)), new Set(Object.keys(created.exchangeData.accessControlSecret))), 'Keys used for encryption of exchange key and access control secret must be the same.').to.be.true;
252
254
  (0, chai_1.expect)((0, collection_utils_1.setEquals)(new Set(Object.keys(created.exchangeData.exchangeKey)), new Set([...delegateVerifiedKeys.map((x) => x.fingerprintV2), ...extraDelegatorVerifiedKeys.map((x) => x.fingerprintV2), selfKeyFpV2])), 'Only verified keys of delegate and delegator should be used for encryption of exchange key and access control secret.').to.be.true;
253
255
  for (const keyData of [{ pair: selfKeypair, fingerprintV2: selfKeyFpV1 }, ...extraDelegatorVerifiedKeys, ...delegateVerifiedKeys]) {
@@ -266,10 +268,10 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
266
268
  function doTest(allowFullExchangeDataLoad) {
267
269
  return __awaiter(this, void 0, void 0, function* () {
268
270
  yield initialiseComponents(allowFullExchangeDataLoad);
269
- const createdData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId, false);
271
+ const createdData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId);
270
272
  yield exchangeData.clearOrRepopulateCache();
271
273
  const countAfterCacheClear = exchangeDataApi.callCount;
272
- const reloadedData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId, false);
274
+ const reloadedData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId);
273
275
  exchangeDataApi.compareCallCountFromBaseline(countAfterCacheClear, {
274
276
  createExchangeData: 0,
275
277
  getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 1,
@@ -289,11 +291,11 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
289
291
  function doTest(allowFullExchangeDataLoad) {
290
292
  return __awaiter(this, void 0, void 0, function* () {
291
293
  yield initialiseComponents(allowFullExchangeDataLoad);
292
- const createdData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId, false);
294
+ const createdData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId);
293
295
  yield encryptionKeysManager.unverifyExistingKeysAndCreateNewVerified(primitives);
294
296
  yield exchangeData.clearOrRepopulateCache();
295
297
  const countAfterCacheClear = exchangeDataApi.callCount;
296
- const newData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId, false);
298
+ const newData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId);
297
299
  exchangeDataApi.compareCallCountFromBaseline(countAfterCacheClear, {
298
300
  createExchangeData: 1,
299
301
  getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 1,
@@ -316,12 +318,12 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
316
318
  return __awaiter(this, void 0, void 0, function* () {
317
319
  yield initialiseComponents(allowFullExchangeDataLoad);
318
320
  const sfk = primitives.randomUuid();
319
- const createdData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId, false);
321
+ const createdData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId);
320
322
  // Tamper with exchange data
321
323
  yield exchangeDataApi.modifyExchangeData(yield tamper(createdData.exchangeData, selfKeypair, selfKeyFpV2));
322
324
  yield exchangeData.clearOrRepopulateCache();
323
325
  const countAfterCacheClear = exchangeDataApi.callCount;
324
- const newData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId, false);
326
+ const newData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId);
325
327
  exchangeDataApi.compareCallCountFromBaseline(countAfterCacheClear, {
326
328
  createExchangeData: 1,
327
329
  getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 1,
@@ -364,13 +366,13 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
364
366
  function doTest(allowFullExchangeDataLoad) {
365
367
  return __awaiter(this, void 0, void 0, function* () {
366
368
  yield initialiseComponents(allowFullExchangeDataLoad);
367
- const createdData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId, false);
369
+ const createdData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId);
368
370
  // Tamper with exchange data
369
371
  yield exchangeDataApi.modifyExchangeData(Object.assign(Object.assign({}, createdData.exchangeData), { delegate: delegate2Id }));
370
372
  yield exchangeData.clearOrRepopulateCache();
371
373
  const countAfterCacheClear = exchangeDataApi.callCount;
372
- const newDataToDelegate = yield exchangeData.getOrCreateEncryptionDataTo(delegateId, false);
373
- const newDataToDelegate2 = yield exchangeData.getOrCreateEncryptionDataTo(delegate2Id, false);
374
+ const newDataToDelegate = yield exchangeData.getOrCreateEncryptionDataTo(delegateId);
375
+ const newDataToDelegate2 = yield exchangeData.getOrCreateEncryptionDataTo(delegate2Id);
374
376
  exchangeDataApi.compareCallCountFromBaseline(countAfterCacheClear, {
375
377
  createExchangeData: 2,
376
378
  getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 2,
@@ -399,7 +401,7 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
399
401
  function doTest(allowFullExchangeDataLoad) {
400
402
  return __awaiter(this, void 0, void 0, function* () {
401
403
  yield initialiseComponents(allowFullExchangeDataLoad);
402
- const createdData1 = yield exchangeData.getOrCreateEncryptionDataTo(delegateId, false);
404
+ const createdData1 = yield exchangeData.getOrCreateEncryptionDataTo(delegateId);
403
405
  const createdData2 = yield createDataFromRandomToSelf();
404
406
  yield encryptionKeysManager.unverifyExistingKeysAndCreateNewVerified(primitives);
405
407
  yield exchangeData.clearOrRepopulateCache();
@@ -416,7 +418,7 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
416
418
  function doTest(allowFullExchangeDataLoad) {
417
419
  return __awaiter(this, void 0, void 0, function* () {
418
420
  yield initialiseComponents(allowFullExchangeDataLoad);
419
- const createdData1 = yield exchangeData.getOrCreateEncryptionDataTo(delegateId, false);
421
+ const createdData1 = yield exchangeData.getOrCreateEncryptionDataTo(delegateId);
420
422
  const hashes1 = yield accessControlSecretUtils.allSecureDelegationKeysFor(createdData1.accessControlSecret);
421
423
  const retrievedKeys1 = yield exchangeData.getCachedDecryptionDataKeyByAccessControlHash(hashes1);
422
424
  for (const hash of hashes1) {
@@ -442,7 +444,7 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
442
444
  function doTest(allowFullExchangeDataLoad) {
443
445
  return __awaiter(this, void 0, void 0, function* () {
444
446
  yield initialiseComponents(allowFullExchangeDataLoad);
445
- const createdBySelf = yield exchangeData.getOrCreateEncryptionDataTo(selfId, false);
447
+ const createdBySelf = yield exchangeData.getOrCreateEncryptionDataTo(selfId);
446
448
  const createdByOther = yield createDataFromRandomToSelf();
447
449
  const newKey = yield primitives.RSA.generateKeyPair(icc_x_api_1.ShaVersion.Sha256);
448
450
  yield dataOwnerApi.addPublicKeyForOwner(selfId, newKey);
@@ -469,7 +471,7 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
469
471
  function doTest(allowFullExchangeDataLoad) {
470
472
  return __awaiter(this, void 0, void 0, function* () {
471
473
  yield initialiseComponents(allowFullExchangeDataLoad);
472
- const createdBySelf = yield exchangeData.getOrCreateEncryptionDataTo(selfId, false);
474
+ const createdBySelf = yield exchangeData.getOrCreateEncryptionDataTo(selfId);
473
475
  const createdByOther = yield createDataFromRandomToSelf();
474
476
  yield encryptionKeysManager.addOrUpdateKey(primitives, selfKeypair, false);
475
477
  yield exchangeData.clearOrRepopulateCache();
@@ -494,7 +496,7 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
494
496
  yield checkDataEqual((yield exchangeData.getCachedDecryptionDataKeyByAccessControlHash([hash]))[hash], data);
495
497
  }
496
498
  if (data.exchangeData.delegator === selfId) {
497
- yield checkDataEqual(yield exchangeData.getOrCreateEncryptionDataTo(data.exchangeData.delegate, false), data);
499
+ yield checkDataEqual(yield exchangeData.getOrCreateEncryptionDataTo(data.exchangeData.delegate), data);
498
500
  }
499
501
  yield checkDataEqual((yield exchangeData.getDecryptionDataKeyByIds([data.exchangeData.id], true))[data.exchangeData.id], data);
500
502
  exchangeDataApi.compareCallCountFromBaseline(apiCallsBaseline, {
@@ -514,7 +516,7 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
514
516
  (0, chai_1.expect)(Object.keys(yield exchangeData.getCachedDecryptionDataKeyByAccessControlHash([hash]))).to.have.length(0);
515
517
  }
516
518
  if (data.exchangeData.delegator === selfId) {
517
- yield checkDataEqual(yield exchangeData.getOrCreateEncryptionDataTo(data.exchangeData.delegate, false), data);
519
+ yield checkDataEqual(yield exchangeData.getOrCreateEncryptionDataTo(data.exchangeData.delegate), data);
518
520
  exchangeDataApi.compareCallCountFromBaseline(apiCallsBaseline, {
519
521
  getExchangeDataByIds: 0,
520
522
  createExchangeData: 0,
@@ -535,8 +537,8 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
535
537
  }
536
538
  });
537
539
  }
538
- const createdBySelf1 = yield exchangeData.getOrCreateEncryptionDataTo(selfId, false);
539
- const createdBySelf2 = yield exchangeData.getOrCreateEncryptionDataTo(delegateId, false);
540
+ const createdBySelf1 = yield exchangeData.getOrCreateEncryptionDataTo(selfId);
541
+ const createdBySelf2 = yield exchangeData.getOrCreateEncryptionDataTo(delegateId);
540
542
  const createdByOther1 = yield createDataFromRandomToSelf(); // Not automatically cached: created by someone else
541
543
  const createdByOther2 = yield createDataFromRandomToSelf(); // Not automatically cached: created by someone else
542
544
  // noinspection DuplicatedCode
@@ -572,7 +574,7 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
572
574
  it('implementation with unlimited cache should preload all existing exchange data on creation', function () {
573
575
  return __awaiter(this, void 0, void 0, function* () {
574
576
  yield initialiseComponents(true);
575
- const createdBySelf = yield exchangeData.getOrCreateEncryptionDataTo(selfId, false);
577
+ const createdBySelf = yield exchangeData.getOrCreateEncryptionDataTo(selfId);
576
578
  const createdByOther = yield createDataFromRandomToSelf();
577
579
  const recreatedExchangeData = yield (0, ExchangeDataManager_1.initialiseExchangeDataManagerForCurrentDataOwner)(baseExchangeData, encryptionKeysManager, accessControlSecretUtils, new TestCryptoStrategies_1.TestCryptoStrategies(), dataOwnerApi, primitives, true);
578
580
  const apiCallsAfterCreation = exchangeDataApi.callCount;
@@ -603,8 +605,8 @@ let env;
603
605
  return __awaiter(this, void 0, void 0, function* () {
604
606
  const hcp1Details = yield (0, test_utils_1.createNewHcpApi)(env);
605
607
  const hcp2Details = yield (0, test_utils_1.createNewHcpApi)(env);
606
- const ed1to2 = yield hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId, false);
607
- const ed2to1 = yield hcp2Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp1Details.credentials.dataOwnerId, false);
608
+ const ed1to2 = yield hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId);
609
+ const ed2to1 = yield hcp2Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp1Details.credentials.dataOwnerId);
608
610
  yield hcp1Details.api.cryptoApi.exchangeData.clearOrRepopulateCache();
609
611
  yield hcp2Details.api.cryptoApi.exchangeData.clearOrRepopulateCache();
610
612
  const newKeyPair = yield hcp1Details.api.cryptoApi.primitives.RSA.generateKeyPair(icc_x_api_1.ShaVersion.Sha256);
@@ -614,8 +616,8 @@ let env;
614
616
  yield hcp1Details.api.cryptoApi.exchangeData.giveAccessBackTo(hcp2Details.credentials.dataOwnerId, exportedPub);
615
617
  yield hcp1Details.api.cryptoApi.exchangeData.clearOrRepopulateCache();
616
618
  yield hcp2Details.api.cryptoApi.exchangeData.clearOrRepopulateCache();
617
- const updatedEd1to2 = yield hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId, false);
618
- const updatedEd2to1 = yield hcp2Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp1Details.credentials.dataOwnerId, false);
619
+ const updatedEd1to2 = yield hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId);
620
+ const updatedEd2to1 = yield hcp2Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp1Details.credentials.dataOwnerId);
619
621
  (0, chai_1.expect)(updatedEd1to2.exchangeData.id).to.equal(ed1to2.exchangeData.id);
620
622
  (0, chai_1.expect)(Object.keys(updatedEd2to1.exchangeData.exchangeKey).length).to.be.greaterThan(Object.keys(ed2to1.exchangeData.exchangeKey).length);
621
623
  (0, chai_1.expect)(Object.keys(updatedEd2to1.exchangeData.exchangeKey).length).to.equal(Object.keys(updatedEd2to1.exchangeData.accessControlSecret).length);
@@ -630,8 +632,8 @@ let env;
630
632
  return __awaiter(this, void 0, void 0, function* () {
631
633
  const hcp1Details = yield (0, test_utils_1.createNewHcpApi)(env);
632
634
  const hcp2Details = yield (0, test_utils_1.createNewHcpApi)(env);
633
- const ed1to2 = yield hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId, false);
634
- const ed2to1 = yield hcp2Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp1Details.credentials.dataOwnerId, false);
635
+ const ed1to2 = yield hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId);
636
+ const ed2to1 = yield hcp2Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp1Details.credentials.dataOwnerId);
635
637
  yield hcp1Details.api.cryptoApi.exchangeData.clearOrRepopulateCache();
636
638
  yield hcp2Details.api.cryptoApi.exchangeData.clearOrRepopulateCache();
637
639
  const exchangeDataApi = new IccExchangeDataApi_1.IccExchangeDataApi(env.iCureUrl, {}, hcp1Details.api.authApi.authenticationProvider, fetch);
@@ -653,8 +655,8 @@ let env;
653
655
  yield hcp1Details.api.cryptoApi.exchangeData.giveAccessBackTo(hcp2Details.credentials.dataOwnerId, exportedPub);
654
656
  yield hcp1Details.api.cryptoApi.exchangeData.clearOrRepopulateCache();
655
657
  yield hcp2Details.api.cryptoApi.exchangeData.clearOrRepopulateCache();
656
- const updatedEd1to2 = yield hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId, false);
657
- const updatedEd2to1 = yield hcp2Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp1Details.credentials.dataOwnerId, false);
658
+ const updatedEd1to2 = yield hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId);
659
+ const updatedEd2to1 = yield hcp2Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp1Details.credentials.dataOwnerId);
658
660
  (0, chai_1.expect)(updatedEd1to2.exchangeData.id).to.not.equal(ed1to2.exchangeData.id);
659
661
  (0, chai_1.expect)(updatedEd2to1.exchangeData.id).to.not.equal(ed2to1.exchangeData.id);
660
662
  const decData1to2 = (yield hcp1Details.api.cryptoApi.exchangeData.getDecryptionDataKeyByIds([ed1to2.exchangeData.id], true))[ed1to2.exchangeData.id];
@@ -1 +1 @@
1
- {"version":3,"file":"exchange-data-manager-test.js","sourceRoot":"","sources":["../../../../test/icc-x-api/crypto/exchange-data-manager-test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe } from 'mocha'\nimport {\n ExchangeDataManager,\n ExchangeDataManagerOptionalParameters,\n initialiseExchangeDataManagerForCurrentDataOwner,\n} from '../../../icc-x-api/crypto/ExchangeDataManager'\nimport { WebCryptoPrimitives } from '../../../icc-x-api/crypto/CryptoPrimitives'\nimport { webcrypto } from 'crypto'\nimport { BaseExchangeDataManager } from '../../../icc-x-api/crypto/BaseExchangeDataManager'\nimport { FakeExchangeDataApi } from '../../utils/FakeExchangeDataApi'\nimport { FakeDataOwnerApi } from '../../utils/FakeDataOwnerApi'\nimport { TestCryptoStrategies } from '../../utils/TestCryptoStrategies'\nimport { EntityWithDelegationTypeName, ShaVersion, ua2b64, ua2hex } from '../../../icc-x-api'\nimport { FakeEncryptionKeysManager } from '../../utils/FakeEncryptionKeysManager'\nimport { AccessControlSecretUtils } from '../../../icc-x-api/crypto/AccessControlSecretUtils'\nimport { ExchangeData } from '../../../icc-api/model/internal/ExchangeData'\nimport { expect } from 'chai'\nimport { setEquals } from '../../../icc-x-api/utils/collection-utils'\nimport { KeyPair } from '../../../icc-x-api/crypto/RSA'\nimport * as _ from 'lodash'\nimport { fingerprintV1, fingerprintV1toV2, fingerprintV2 } from '../../../icc-x-api/crypto/utils'\nimport { DataOwnerTypeEnum } from '../../../icc-api/model/DataOwnerTypeEnum'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { createNewHcpApi, getEnvironmentInitializer, setLocalStorage } from '../../utils/test_utils'\nimport 'isomorphic-fetch'\nimport { IccExchangeDataApi } from '../../../icc-api/api/internal/IccExchangeDataApi'\n\nsetLocalStorage(fetch)\n\ndescribe('Exchange data manager - unit', async function () {\n const primitives = new WebCryptoPrimitives(webcrypto as any)\n const accessControlSecretUtils = new AccessControlSecretUtils(primitives)\n let selfId: string\n let selfKeyFpV1: string\n let selfKeyFpV2: string\n let selfKeypair: KeyPair<CryptoKey>\n let delegateId: string\n let delegateKeyFp: string\n let delegateKeypair: KeyPair<CryptoKey>\n let delegate2Id: string\n let delegate2KeyFp: string\n let delegate2Keypair: KeyPair<CryptoKey>\n let dataOwnerApi: FakeDataOwnerApi\n let exchangeDataApi: FakeExchangeDataApi\n let baseExchangeData: BaseExchangeDataManager\n let exchangeData: ExchangeDataManager\n let encryptionKeysManager: FakeEncryptionKeysManager\n\n async function initialiseComponents(\n allowFullExchangeDataLoad: boolean,\n optionalParameters: ExchangeDataManagerOptionalParameters & { verifiedDelegateKeys?: Set<string> } = {}\n ) {\n const dataOwnerType = allowFullExchangeDataLoad ? DataOwnerTypeEnum.Patient : DataOwnerTypeEnum.Hcp\n selfId = primitives.randomUuid()\n selfKeypair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n selfKeyFpV1 = fingerprintV1(ua2hex(await primitives.RSA.exportKey(selfKeypair.publicKey, 'spki')))\n selfKeyFpV2 = fingerprintV1toV2(selfKeyFpV1)\n delegateId = primitives.randomUuid()\n delegateKeypair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n delegateKeyFp = fingerprintV1(ua2hex(await primitives.RSA.exportKey(delegateKeypair.publicKey, 'spki')))\n delegate2Id = primitives.randomUuid()\n delegate2Keypair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n delegate2KeyFp = fingerprintV1(ua2hex(await primitives.RSA.exportKey(delegate2Keypair.publicKey, 'spki')))\n dataOwnerApi = new FakeDataOwnerApi(\n {\n id: selfId,\n type: dataOwnerType,\n publicKeysForOaepWithSha256: [ua2hex(await primitives.RSA.exportKey(selfKeypair.publicKey, 'spki'))],\n },\n [\n {\n id: delegateId,\n type: dataOwnerType,\n publicKeysForOaepWithSha256: [ua2hex(await primitives.RSA.exportKey(delegateKeypair.publicKey, 'spki'))],\n },\n {\n id: delegate2Id,\n type: dataOwnerType,\n publicKeysForOaepWithSha256: [ua2hex(await primitives.RSA.exportKey(delegate2Keypair.publicKey, 'spki'))],\n },\n ]\n )\n const cryptoStrategies = new TestCryptoStrategies(undefined, undefined, optionalParameters.verifiedDelegateKeys)\n exchangeDataApi = new FakeExchangeDataApi()\n baseExchangeData = new BaseExchangeDataManager(exchangeDataApi, dataOwnerApi, primitives, allowFullExchangeDataLoad, false)\n encryptionKeysManager = await FakeEncryptionKeysManager.create(primitives, [selfKeypair])\n exchangeData = await initialiseExchangeDataManagerForCurrentDataOwner(\n baseExchangeData,\n encryptionKeysManager,\n accessControlSecretUtils,\n cryptoStrategies,\n dataOwnerApi,\n primitives,\n true,\n optionalParameters\n )\n }\n\n async function checkDataEqual(\n actual: { exchangeData: ExchangeData; accessControlSecret?: string; exchangeKey: CryptoKey | undefined } | undefined,\n expected: { exchangeData: ExchangeData; accessControlSecret?: string; exchangeKey: CryptoKey | undefined }\n ) {\n expect(actual).to.not.be.undefined\n expect(_.isEqual(_.omit(expected.exchangeData, ['rev']), _.omit(actual!.exchangeData, ['rev']))).to.equal(\n true,\n `Data should be equivalent\\nExpected: ${JSON.stringify(expected.exchangeData, undefined, 2)}\\nActual: ${JSON.stringify(\n actual!.exchangeData,\n undefined,\n 2\n )}\\n`\n )\n expect(expected.accessControlSecret).to.equal(actual!.accessControlSecret)\n await checkAesKeysEquality(actual!.exchangeKey, expected.exchangeKey)\n }\n\n async function checkAesKeysEquality(actual: CryptoKey | undefined, expected: CryptoKey | undefined) {\n if (!actual && !expected) return\n expect(!actual).to.equal(!expected, !expected ? 'Key should not have been decrypted' : 'Key should have been decrypted')\n expect(ua2hex(await primitives.AES.exportKey(expected!, 'raw'))).to.equal(ua2hex(await primitives.AES.exportKey(actual!, 'raw')))\n }\n\n async function createDataFromRandomToSelf(): Promise<{ exchangeData: ExchangeData; exchangeKey: CryptoKey; accessControlSecret: string }> {\n const encryptionKey = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const encryptionFp = ua2hex(await primitives.RSA.exportKey(encryptionKey.publicKey, 'spki')).slice(-32)\n const signatureKey = await primitives.RSA.generateKeyPair(ShaVersion.Sha1)\n const signatureFp = ua2hex(await primitives.RSA.exportKey(signatureKey.publicKey, 'spki')).slice(-32)\n const created = await baseExchangeData.createExchangeData(\n selfId,\n { [signatureFp]: signatureKey.privateKey },\n { [encryptionFp]: encryptionKey.publicKey, [selfKeyFpV1]: selfKeypair.publicKey }\n )\n const modified = await exchangeDataApi.modifyExchangeData(\n new ExchangeData({\n ...created.exchangeData,\n delegator: primitives.randomUuid(),\n })\n )\n return { exchangeData: modified, exchangeKey: created.exchangeKey, accessControlSecret: created.accessControlSecret }\n }\n\n async function generateEncryptionKeys(n: number): Promise<{ pair: KeyPair<CryptoKey>; fingerprintV2: string; hexPub: string }[]> {\n return await Promise.all(\n Array(n)\n .fill(null)\n .map(async () => {\n const pair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const hexPub = ua2hex(await primitives.RSA.exportKey(pair.publicKey, 'spki'))\n const fingerprint = fingerprintV2(hexPub)\n return { pair, fingerprintV2: fingerprint, hexPub }\n })\n )\n }\n\n it('base should be able to retrieve all exchange data for the current data owner if allowed by the crypto strategies', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const expectedData = await Promise.all(\n Array.from(Array(3500), async (_, i) => {\n const data = new ExchangeData({\n id: primitives.randomUuid(),\n delegate: i % 2 === 0 ? selfId : primitives.randomUuid(),\n delegator: i % 2 === 0 ? primitives.randomUuid() : selfId,\n exchangeKey: { not: 'important' },\n accessControlSecret: { not: 'important' },\n sharedSignatureKey: { not: 'important' },\n delegatorSignature: { not: 'important' },\n sharedSignature: 'not important',\n })\n await exchangeDataApi.createExchangeData(data)\n return data\n })\n )\n await Promise.all(\n Array.from(Array(500), async () => {\n // Should not be in result\n const data = new ExchangeData({\n id: primitives.randomUuid(),\n delegate: primitives.randomUuid(),\n delegator: primitives.randomUuid(),\n exchangeKey: { not: 'important' },\n accessControlSecret: { not: 'important' },\n sharedSignatureKey: { not: 'important' },\n delegatorSignature: { not: 'important' },\n sharedSignature: 'not important',\n })\n await exchangeDataApi.createExchangeData(data)\n })\n )\n const retrieved = await baseExchangeData.getAllExchangeDataForCurrentDataOwnerIfAllowed()\n if (allowFullExchangeDataLoad) {\n expect(retrieved).to.not.be.undefined\n expect(retrieved).to.have.length(expectedData.length)\n expect(setEquals(new Set(expectedData.map((x) => x.id)), new Set(retrieved!.map((x) => x.id))), 'Retrieved and expected ids').to.be.true\n } else {\n expect(retrieved).to.be.undefined\n }\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should create new encryption keys when none is available', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const sfk = primitives.randomUuid()\n const initialisedCount = exchangeDataApi.callCount\n const createdData = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n const retrievedCachedData = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n exchangeDataApi.compareCallCountFromBaseline(initialisedCount, {\n createExchangeData: 1,\n // If we could fully preload we already know whether the exchange key already exists or not, otherwise we have to request from the api\n getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 1,\n modifyExchangeData: 0,\n getExchangeDataByIds: 0,\n getExchangeDataByParticipant: 0,\n })\n await checkDataEqual(retrievedCachedData, createdData)\n const decryptedKeyByDelegate = await baseExchangeData.tryDecryptExchangeKeys([createdData.exchangeData], { [delegateKeyFp]: delegateKeypair })\n const decryptedAccessControlSecretByDelegate = await baseExchangeData.tryDecryptAccessControlSecret([createdData.exchangeData], {\n [delegateKeyFp]: delegateKeypair,\n })\n await checkAesKeysEquality(decryptedKeyByDelegate.successfulDecryptions[0], createdData.exchangeKey)\n expect(decryptedAccessControlSecretByDelegate.successfulDecryptions[0]).to.equal(createdData.accessControlSecret)\n expect(retrievedCachedData.exchangeData.delegator).to.equal(selfId)\n expect(retrievedCachedData.exchangeData.delegate).to.equal(delegateId)\n expect(Object.keys(retrievedCachedData.exchangeData.delegatorSignature)).to.have.length(1)\n expect(Object.keys(retrievedCachedData.exchangeData.exchangeKey)).to.have.length(2)\n expect(Object.keys(retrievedCachedData.exchangeData.accessControlSecret)).to.have.length(2)\n expect(Object.keys(retrievedCachedData.exchangeData.sharedSignatureKey)).to.have.length(2)\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should create encryption keys to self when none is available', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdData = await exchangeData.getOrCreateEncryptionDataTo(selfId, false)\n expect(createdData.exchangeData.delegator).to.equal(selfId)\n expect(createdData.exchangeData.delegate).to.equal(selfId)\n expect(Object.keys(createdData.exchangeData.delegatorSignature)).to.have.length(1)\n expect(Object.keys(createdData.exchangeData.sharedSignatureKey)).to.have.length(1)\n expect(Object.keys(createdData.exchangeData.exchangeKey)).to.have.length(1)\n expect(Object.keys(createdData.exchangeData.accessControlSecret)).to.have.length(1)\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should ignore unverified keys when creating new exchange data', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n const delegateVerifiedKeys = await generateEncryptionKeys(5)\n const extraDelegateUnverifiedKeys = await generateEncryptionKeys(5)\n const extraDelegatorVerifiedKeys = await generateEncryptionKeys(5)\n const delegatorUnverifiedKeys = await generateEncryptionKeys(5)\n await initialiseComponents(allowFullExchangeDataLoad, { verifiedDelegateKeys: new Set(delegateVerifiedKeys.map((x) => x.hexPub)) })\n for (const keyData of [...delegateVerifiedKeys, ...extraDelegateUnverifiedKeys]) {\n await dataOwnerApi.addPublicKeyForOwner(delegateId, keyData.pair)\n }\n for (const keyData of extraDelegatorVerifiedKeys) {\n await dataOwnerApi.addPublicKeyForOwner(selfId, keyData.pair)\n await encryptionKeysManager.addOrUpdateKey(primitives, keyData.pair, true)\n }\n for (const keyData of delegatorUnverifiedKeys) {\n await dataOwnerApi.addPublicKeyForOwner(selfId, keyData.pair)\n await encryptionKeysManager.addOrUpdateKey(primitives, keyData.pair, false)\n }\n const created = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n expect(\n setEquals(new Set(Object.keys(created.exchangeData.exchangeKey)), new Set(Object.keys(created.exchangeData.accessControlSecret))),\n 'Keys used for encryption of exchange key and access control secret must be the same.'\n ).to.be.true\n expect(\n setEquals(\n new Set(Object.keys(created.exchangeData.exchangeKey)),\n new Set([...delegateVerifiedKeys.map((x) => x.fingerprintV2), ...extraDelegatorVerifiedKeys.map((x) => x.fingerprintV2), selfKeyFpV2])\n ),\n 'Only verified keys of delegate and delegator should be used for encryption of exchange key and access control secret.'\n ).to.be.true\n for (const keyData of [{ pair: selfKeypair, fingerprintV2: selfKeyFpV1 }, ...extraDelegatorVerifiedKeys, ...delegateVerifiedKeys]) {\n await checkAesKeysEquality(\n (\n await baseExchangeData.tryDecryptExchangeKeys([created.exchangeData], { [keyData.fingerprintV2]: keyData.pair })\n ).successfulDecryptions[0],\n created.exchangeKey\n )\n expect(\n (await baseExchangeData.tryDecryptAccessControlSecret([created.exchangeData], { [keyData.fingerprintV2]: keyData.pair }))\n .successfulDecryptions[0]\n ).to.equal(created.accessControlSecret)\n }\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should reuse existing exchange data for encryption when it can be verified', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdData = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n await exchangeData.clearOrRepopulateCache()\n const countAfterCacheClear = exchangeDataApi.callCount\n const reloadedData = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n exchangeDataApi.compareCallCountFromBaseline(countAfterCacheClear, {\n createExchangeData: 0,\n getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 1,\n modifyExchangeData: 0,\n getExchangeDataByIds: 0,\n getExchangeDataByParticipant: 0,\n })\n await checkDataEqual(reloadedData, createdData)\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should create new exchange data for encryption when the existing data can not be verified due to unavailable verification key', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdData = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n await encryptionKeysManager.unverifyExistingKeysAndCreateNewVerified(primitives)\n await exchangeData.clearOrRepopulateCache()\n const countAfterCacheClear = exchangeDataApi.callCount\n const newData = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n exchangeDataApi.compareCallCountFromBaseline(countAfterCacheClear, {\n createExchangeData: 1,\n getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 1,\n modifyExchangeData: 0,\n getExchangeDataByIds: 0,\n getExchangeDataByParticipant: 0,\n })\n expect(_.isEqual(_.omit(createdData.exchangeData, ['rev']), _.omit(newData.exchangeData, ['rev']))).to.equal(\n false,\n 'Exchange data manager should have created new exchange data for encryption'\n )\n expect(ua2hex(await primitives.AES.exportKey(createdData.exchangeKey, 'raw'))).to.not.equal(\n ua2hex(await primitives.AES.exportKey(newData.exchangeKey, 'raw'))\n )\n expect(createdData.accessControlSecret).to.not.equal(newData.accessControlSecret)\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should create new exchange data for encryption when the existing data can not be verified due to tampering of the encrypted access control secret and/or encrypted exchange key', async function () {\n async function doTest(\n allowFullExchangeDataLoad: boolean,\n tamper: (exchangeData: ExchangeData, selfKeyPair: KeyPair<CryptoKey>, selfKeyFp: string) => Promise<ExchangeData>\n ) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const sfk = primitives.randomUuid()\n const createdData = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n // Tamper with exchange data\n await exchangeDataApi.modifyExchangeData(await tamper(createdData.exchangeData, selfKeypair, selfKeyFpV2))\n await exchangeData.clearOrRepopulateCache()\n const countAfterCacheClear = exchangeDataApi.callCount\n const newData = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n exchangeDataApi.compareCallCountFromBaseline(countAfterCacheClear, {\n createExchangeData: 1,\n getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 1,\n modifyExchangeData: 0,\n getExchangeDataByIds: 0,\n getExchangeDataByParticipant: 0,\n })\n expect(createdData.exchangeData.id).not.to.equal(\n newData.exchangeData.id,\n 'Exchange data manager should have created new exchange data for encryption'\n )\n expect(ua2hex(await primitives.AES.exportKey(createdData.exchangeKey, 'raw'))).to.not.equal(\n ua2hex(await primitives.AES.exportKey(newData.exchangeKey, 'raw'))\n )\n expect(createdData.accessControlSecret).to.not.equal(newData.accessControlSecret)\n const updatedUnverifiedOldData = (await exchangeData.getDecryptionDataKeyByIds([createdData.exchangeData.id!], true))[\n createdData.exchangeData.id!\n ]\n expect(updatedUnverifiedOldData).to.not.be.undefined\n }\n const extraKeyPair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const extraKeyPairFp = fingerprintV2(ua2hex(await primitives.RSA.exportKey(extraKeyPair.publicKey, 'spki')))\n const fakeKey = primitives.randomBytes(16)\n const tamperByChangingEncryptionKey = async (exchangeData: ExchangeData, selfKeyPair: KeyPair<CryptoKey>, selfKeyFp: string) =>\n new ExchangeData({\n ...exchangeData,\n exchangeKey: {\n ...exchangeData.exchangeKey,\n [selfKeyFp]: ua2b64(await primitives.RSA.encrypt(selfKeyPair.publicKey, fakeKey)),\n },\n })\n const tamperByChangingAccessControlSecret = async (exchangeData: ExchangeData, selfKeyPair: KeyPair<CryptoKey>, selfKeyFp: string) =>\n new ExchangeData({\n ...exchangeData,\n accessControlSecret: {\n ...exchangeData.accessControlSecret,\n [selfKeyFp]: ua2b64(await primitives.RSA.encrypt(selfKeyPair.publicKey, fakeKey)),\n },\n })\n const tamperByChangingBoth = async (exchangeData: ExchangeData, selfKeyPair: KeyPair<CryptoKey>, selfKeyFp: string) =>\n tamperByChangingEncryptionKey(await tamperByChangingAccessControlSecret(exchangeData, selfKeyPair, selfKeyFp), selfKeyPair, selfKeyFp)\n const tamperByAddingEncryptionKey = async (exchangeData: ExchangeData) =>\n new ExchangeData({\n ...exchangeData,\n exchangeKey: {\n ...exchangeData.exchangeKey,\n [extraKeyPairFp]: ua2b64(await primitives.RSA.encrypt(extraKeyPair.publicKey, fakeKey)),\n },\n })\n await doTest(true, tamperByChangingEncryptionKey)\n await doTest(false, tamperByChangingEncryptionKey)\n await doTest(true, tamperByChangingAccessControlSecret)\n await doTest(false, tamperByChangingAccessControlSecret)\n await doTest(true, tamperByChangingBoth)\n await doTest(false, tamperByChangingBoth)\n await doTest(true, tamperByAddingEncryptionKey)\n await doTest(false, tamperByAddingEncryptionKey)\n })\n\n it('should create new exchange data for encryption when the existing data can not be verified due to tampering of the delegate id', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdData = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n // Tamper with exchange data\n await exchangeDataApi.modifyExchangeData({\n ...createdData.exchangeData,\n delegate: delegate2Id,\n })\n await exchangeData.clearOrRepopulateCache()\n const countAfterCacheClear = exchangeDataApi.callCount\n const newDataToDelegate = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n const newDataToDelegate2 = await exchangeData.getOrCreateEncryptionDataTo(delegate2Id, false)\n exchangeDataApi.compareCallCountFromBaseline(countAfterCacheClear, {\n createExchangeData: 2,\n getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 2,\n modifyExchangeData: 0,\n getExchangeDataByIds: 0,\n getExchangeDataByParticipant: 0,\n })\n expect(createdData.exchangeData.id).to.not.equal(\n newDataToDelegate.exchangeData.id,\n 'Exchange data manager should have created new exchange data for encryption to delegate'\n )\n expect(createdData.exchangeData.id).to.not.equal(\n newDataToDelegate2.exchangeData.id,\n 'Exchange data manager should have created new exchange data for encryption to delegate 2'\n )\n expect(ua2hex(await primitives.AES.exportKey(createdData.exchangeKey, 'raw'))).to.not.equal(\n ua2hex(await primitives.AES.exportKey(newDataToDelegate.exchangeKey, 'raw'))\n )\n expect(ua2hex(await primitives.AES.exportKey(createdData.exchangeKey, 'raw'))).to.not.equal(\n ua2hex(await primitives.AES.exportKey(newDataToDelegate2.exchangeKey, 'raw'))\n )\n expect(createdData.accessControlSecret).to.not.equal(newDataToDelegate.accessControlSecret)\n expect(createdData.accessControlSecret).to.not.equal(newDataToDelegate2.accessControlSecret)\n const updatedUnverifiedOldData = (await exchangeData.getDecryptionDataKeyByIds([createdData.exchangeData.id!], true))[\n createdData.exchangeData.id!\n ]\n expect(updatedUnverifiedOldData).to.not.be.undefined\n expect(ua2hex(await primitives.AES.exportKey(updatedUnverifiedOldData!.exchangeKey!, 'raw'))).to.equal(\n ua2hex(await primitives.AES.exportKey(createdData.exchangeKey, 'raw'))\n )\n expect(updatedUnverifiedOldData!.accessControlSecret).to.equal(createdData.accessControlSecret)\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should return existing exchange data keys for decryption even if the data authenticity could not be verified', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdData1 = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n const createdData2 = await createDataFromRandomToSelf()\n await encryptionKeysManager.unverifyExistingKeysAndCreateNewVerified(primitives)\n await exchangeData.clearOrRepopulateCache()\n await checkDataEqual(\n (\n await exchangeData.getDecryptionDataKeyByIds([createdData1.exchangeData.id!], true)\n )[createdData1.exchangeData.id!],\n createdData1\n )\n await checkDataEqual(\n (\n await exchangeData.getDecryptionDataKeyByIds([createdData2.exchangeData.id!], true)\n )[createdData2.exchangeData.id!],\n createdData2\n )\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('newly created data or data retrieved by id should be cached and retrievable by hash', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdData1 = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n const hashes1 = await accessControlSecretUtils.allSecureDelegationKeysFor(createdData1.accessControlSecret)\n const retrievedKeys1 = await exchangeData.getCachedDecryptionDataKeyByAccessControlHash(hashes1)\n for (const hash of hashes1) {\n await checkDataEqual(retrievedKeys1[hash], createdData1)\n }\n if (!allowFullExchangeDataLoad) {\n const createdData2 = await createDataFromRandomToSelf()\n const hashes2 = await accessControlSecretUtils.allSecureDelegationKeysFor(createdData2.accessControlSecret)\n await checkDataEqual(\n (\n await exchangeData.getDecryptionDataKeyByIds([createdData2.exchangeData.id!], true)\n )[createdData2.exchangeData.id!],\n createdData2\n )\n const retrievedKeys2 = await exchangeData.getCachedDecryptionDataKeyByAccessControlHash([...hashes1, ...hashes2])\n for (const hash of hashes2) {\n await checkDataEqual(retrievedKeys2[hash], createdData2)\n }\n }\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('if data can not be decrypted the retrieval method should return undefined', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdBySelf = await exchangeData.getOrCreateEncryptionDataTo(selfId, false)\n const createdByOther = await createDataFromRandomToSelf()\n const newKey = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n await dataOwnerApi.addPublicKeyForOwner(selfId, newKey)\n // Simulate loss of key\n encryptionKeysManager.deleteKey(selfKeyFpV1)\n await encryptionKeysManager.addOrUpdateKey(primitives, newKey, true)\n await exchangeData.clearOrRepopulateCache()\n await checkDataEqual((await exchangeData.getDecryptionDataKeyByIds([createdBySelf.exchangeData.id!], true))[createdBySelf.exchangeData.id!], {\n exchangeData: createdBySelf.exchangeData,\n exchangeKey: undefined,\n })\n await checkDataEqual((await exchangeData.getDecryptionDataKeyByIds([createdByOther.exchangeData.id!], true))[createdByOther.exchangeData.id!], {\n exchangeData: createdByOther.exchangeData,\n exchangeKey: undefined,\n })\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('unverified keys should still be usable for decryption of data', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdBySelf = await exchangeData.getOrCreateEncryptionDataTo(selfId, false)\n const createdByOther = await createDataFromRandomToSelf()\n await encryptionKeysManager.addOrUpdateKey(primitives, selfKeypair, false)\n await exchangeData.clearOrRepopulateCache()\n await checkDataEqual(\n (\n await exchangeData.getDecryptionDataKeyByIds([createdBySelf.exchangeData.id!], true)\n )[createdBySelf.exchangeData.id!],\n createdBySelf\n )\n await checkDataEqual(\n (\n await exchangeData.getDecryptionDataKeyByIds([createdByOther.exchangeData.id!], true)\n )[createdByOther.exchangeData.id!],\n createdByOther\n )\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('implementation with limited cache should trigger eviction of delegate and hash cache on eviction of data by id cache', async function () {\n await initialiseComponents(false, { lruCacheSize: 3 })\n const entityType = EntityWithDelegationTypeName.Contact\n const sfks = [primitives.randomUuid(), primitives.randomUuid(), primitives.randomUuid()]\n\n async function verifyCached(data: { exchangeData: ExchangeData; accessControlSecret: string; exchangeKey: CryptoKey }) {\n const apiCallsBaseline = exchangeDataApi.callCount\n const hashes = await accessControlSecretUtils.allSecureDelegationKeysFor(data.accessControlSecret)\n for (const hash of hashes) {\n await checkDataEqual((await exchangeData.getCachedDecryptionDataKeyByAccessControlHash([hash]))[hash], data)\n }\n if (data.exchangeData.delegator === selfId) {\n await checkDataEqual(await exchangeData.getOrCreateEncryptionDataTo(data.exchangeData.delegate, false), data)\n }\n await checkDataEqual((await exchangeData.getDecryptionDataKeyByIds([data.exchangeData.id!], true))[data.exchangeData.id!], data)\n exchangeDataApi.compareCallCountFromBaseline(apiCallsBaseline, {\n getExchangeDataByIds: 0,\n createExchangeData: 0,\n modifyExchangeData: 0,\n getExchangeDataByParticipant: 0,\n getExchangeDataByDelegatorDelegate: 0,\n })\n }\n\n async function verifyNotCachedThenCache(data: { exchangeData: ExchangeData; accessControlSecret: string; exchangeKey: CryptoKey }) {\n const apiCallsBaseline = exchangeDataApi.callCount\n const hashes = [await accessControlSecretUtils.secureDelegationKeyFor(data.accessControlSecret, entityType)]\n for (const hash of hashes) {\n expect(Object.keys(await exchangeData.getCachedDecryptionDataKeyByAccessControlHash([hash]))).to.have.length(0)\n }\n if (data.exchangeData.delegator === selfId) {\n await checkDataEqual(await exchangeData.getOrCreateEncryptionDataTo(data.exchangeData.delegate, false), data)\n exchangeDataApi.compareCallCountFromBaseline(apiCallsBaseline, {\n getExchangeDataByIds: 0,\n createExchangeData: 0,\n modifyExchangeData: 0,\n getExchangeDataByParticipant: 0,\n getExchangeDataByDelegatorDelegate: 1,\n })\n } else {\n await checkDataEqual((await exchangeData.getDecryptionDataKeyByIds([data.exchangeData.id!], true))[data.exchangeData.id!], data)\n exchangeDataApi.compareCallCountFromBaseline(apiCallsBaseline, {\n getExchangeDataByIds: 1,\n createExchangeData: 0,\n modifyExchangeData: 0,\n getExchangeDataByParticipant: 0,\n getExchangeDataByDelegatorDelegate: 0,\n })\n }\n }\n\n const createdBySelf1 = await exchangeData.getOrCreateEncryptionDataTo(selfId, false)\n const createdBySelf2 = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n const createdByOther1 = await createDataFromRandomToSelf() // Not automatically cached: created by someone else\n const createdByOther2 = await createDataFromRandomToSelf() // Not automatically cached: created by someone else\n // noinspection DuplicatedCode\n await verifyCached(createdBySelf1)\n await verifyCached(createdBySelf2)\n await verifyNotCachedThenCache(createdByOther1)\n await verifyCached(createdBySelf1)\n await verifyCached(createdBySelf2)\n await verifyCached(createdByOther1)\n await verifyNotCachedThenCache(createdByOther2)\n await verifyCached(createdBySelf2)\n await verifyCached(createdByOther1)\n await verifyCached(createdByOther2)\n await verifyNotCachedThenCache(createdBySelf1)\n await verifyCached(createdByOther1)\n await verifyCached(createdByOther2)\n await verifyCached(createdBySelf1)\n await verifyNotCachedThenCache(createdBySelf2)\n await verifyCached(createdByOther2)\n // noinspection DuplicatedCode\n await verifyCached(createdBySelf1)\n await verifyCached(createdBySelf2)\n await verifyNotCachedThenCache(createdByOther1)\n await verifyCached(createdBySelf1)\n await verifyCached(createdBySelf2)\n await verifyCached(createdByOther1)\n await verifyNotCachedThenCache(createdByOther2)\n await verifyCached(createdBySelf2)\n await verifyCached(createdByOther1)\n await verifyCached(createdByOther2)\n })\n\n it('implementation with unlimited cache should preload all existing exchange data on creation', async function () {\n await initialiseComponents(true)\n const createdBySelf = await exchangeData.getOrCreateEncryptionDataTo(selfId, false)\n const createdByOther = await createDataFromRandomToSelf()\n const recreatedExchangeData = await initialiseExchangeDataManagerForCurrentDataOwner(\n baseExchangeData,\n encryptionKeysManager,\n accessControlSecretUtils,\n new TestCryptoStrategies(),\n dataOwnerApi,\n primitives,\n true\n )\n const apiCallsAfterCreation = exchangeDataApi.callCount\n await checkDataEqual(\n (\n await recreatedExchangeData.getDecryptionDataKeyByIds([createdBySelf.exchangeData.id!], false)\n )[createdBySelf.exchangeData.id!],\n createdBySelf\n )\n await checkDataEqual(\n (\n await recreatedExchangeData.getDecryptionDataKeyByIds([createdByOther.exchangeData.id!], false)\n )[createdByOther.exchangeData.id!],\n createdByOther\n )\n exchangeDataApi.compareCallCountFromBaseline(apiCallsAfterCreation, {\n getExchangeDataByIds: 0,\n createExchangeData: 0,\n modifyExchangeData: 0,\n getExchangeDataByParticipant: 0,\n getExchangeDataByDelegatorDelegate: 0,\n })\n })\n})\n\nlet env: TestVars\n\ndescribe('Exchange data manager - e2e', async function () {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n })\n\n it('give access back should not invalidate existing and valid exchange data', async function () {\n const hcp1Details = await createNewHcpApi(env)\n const hcp2Details = await createNewHcpApi(env)\n const ed1to2 = await hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId, false)\n const ed2to1 = await hcp2Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp1Details.credentials.dataOwnerId, false)\n await hcp1Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n await hcp2Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n const newKeyPair = await hcp1Details.api.cryptoApi.primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const exportedPub = ua2hex(await hcp1Details.api.cryptoApi.primitives.RSA.exportKey(newKeyPair.publicKey, 'spki'))\n const hcp2 = await hcp2Details.api.healthcarePartyApi.getHealthcareParty(hcp2Details.credentials.dataOwnerId)\n await hcp2Details.api.healthcarePartyApi.modifyHealthcareParty({\n ...hcp2,\n publicKeysForOaepWithSha256: [...hcp2.publicKeysForOaepWithSha256, exportedPub],\n })\n await hcp1Details.api.cryptoApi.exchangeData.giveAccessBackTo(hcp2Details.credentials.dataOwnerId, exportedPub)\n await hcp1Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n await hcp2Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n const updatedEd1to2 = await hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId, false)\n const updatedEd2to1 = await hcp2Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp1Details.credentials.dataOwnerId, false)\n expect(updatedEd1to2.exchangeData.id).to.equal(ed1to2.exchangeData.id)\n expect(Object.keys(updatedEd2to1.exchangeData.exchangeKey).length).to.be.greaterThan(Object.keys(ed2to1.exchangeData.exchangeKey).length)\n expect(Object.keys(updatedEd2to1.exchangeData.exchangeKey).length).to.equal(Object.keys(updatedEd2to1.exchangeData.accessControlSecret).length)\n expect(Object.keys(updatedEd2to1.exchangeData.exchangeKey).length).to.equal(Object.keys(updatedEd2to1.exchangeData.sharedSignatureKey).length)\n expect(updatedEd2to1.exchangeData.id).to.equal(ed2to1.exchangeData.id)\n expect(Object.keys(updatedEd1to2.exchangeData.exchangeKey).length).to.be.greaterThan(Object.keys(ed1to2.exchangeData.exchangeKey).length)\n expect(Object.keys(updatedEd1to2.exchangeData.exchangeKey).length).to.equal(Object.keys(updatedEd1to2.exchangeData.accessControlSecret).length)\n expect(Object.keys(updatedEd1to2.exchangeData.exchangeKey).length).to.equal(Object.keys(updatedEd1to2.exchangeData.sharedSignatureKey).length)\n })\n\n it('invalid exchange data should not be re-validated by give access back', async function () {\n const hcp1Details = await createNewHcpApi(env)\n const hcp2Details = await createNewHcpApi(env)\n const ed1to2 = await hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId, false)\n const ed2to1 = await hcp2Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp1Details.credentials.dataOwnerId, false)\n await hcp1Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n await hcp2Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n const exchangeDataApi = new IccExchangeDataApi(env.iCureUrl, {}, hcp1Details.api.authApi.authenticationProvider, fetch)\n const extraKeyPair = await hcp1Details.api.cryptoApi.primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const extraKeyPairPub = ua2hex(await hcp1Details.api.cryptoApi.primitives.RSA.exportKey(extraKeyPair.publicKey, 'spki'))\n const extraKeyPairFp = fingerprintV2(extraKeyPairPub)\n const fakeData = await hcp1Details.api.cryptoApi.primitives.randomBytes(16)\n async function tamperWithData(data: ExchangeData) {\n await exchangeDataApi.modifyExchangeData({\n ...data,\n exchangeKey: {\n ...data.exchangeKey,\n [extraKeyPairFp]: ua2b64(await hcp1Details.api.cryptoApi.primitives.RSA.encrypt(extraKeyPair.publicKey, fakeData)),\n },\n accessControlSecret: {\n ...data.accessControlSecret,\n [extraKeyPairFp]: ua2b64(await hcp1Details.api.cryptoApi.primitives.RSA.encrypt(extraKeyPair.publicKey, fakeData)),\n },\n sharedSignatureKey: {\n ...data.sharedSignatureKey,\n [extraKeyPairFp]: ua2b64(await hcp1Details.api.cryptoApi.primitives.RSA.encrypt(extraKeyPair.publicKey, fakeData)),\n },\n })\n }\n await tamperWithData(ed1to2.exchangeData)\n await tamperWithData(ed2to1.exchangeData)\n const newKeyPair = await hcp1Details.api.cryptoApi.primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const exportedPub = ua2hex(await hcp1Details.api.cryptoApi.primitives.RSA.exportKey(newKeyPair.publicKey, 'spki'))\n const hcp2 = await hcp2Details.api.healthcarePartyApi.getHealthcareParty(hcp2Details.credentials.dataOwnerId)\n await hcp2Details.api.healthcarePartyApi.modifyHealthcareParty({\n ...hcp2,\n publicKeysForOaepWithSha256: [...hcp2.publicKeysForOaepWithSha256, exportedPub, extraKeyPairPub],\n })\n await hcp1Details.api.cryptoApi.exchangeData.giveAccessBackTo(hcp2Details.credentials.dataOwnerId, exportedPub)\n await hcp1Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n await hcp2Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n const updatedEd1to2 = await hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId, false)\n const updatedEd2to1 = await hcp2Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp1Details.credentials.dataOwnerId, false)\n expect(updatedEd1to2.exchangeData.id).to.not.equal(ed1to2.exchangeData.id)\n expect(updatedEd2to1.exchangeData.id).to.not.equal(ed2to1.exchangeData.id)\n const decData1to2 = (await hcp1Details.api.cryptoApi.exchangeData.getDecryptionDataKeyByIds([ed1to2.exchangeData.id!], true))[\n ed1to2.exchangeData.id!\n ]\n expect(decData1to2).to.not.be.undefined\n expect(decData1to2!.exchangeKey).to.not.be.undefined\n expect(decData1to2!.accessControlSecret).to.not.be.undefined\n const decData2to1 = (await hcp2Details.api.cryptoApi.exchangeData.getDecryptionDataKeyByIds([ed2to1.exchangeData.id!], true))[\n ed2to1.exchangeData.id!\n ]\n expect(decData2to1).to.not.be.undefined\n expect(decData2to1!.exchangeKey).to.not.be.undefined\n expect(decData2to1!.accessControlSecret).to.not.be.undefined\n })\n})\n"]}
1
+ {"version":3,"file":"exchange-data-manager-test.js","sourceRoot":"","sources":["../../../../test/icc-x-api/crypto/exchange-data-manager-test.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,iCAAgC;AAChC,uFAIsD;AACtD,iFAAgF;AAChF,mCAAkC;AAClC,+FAA2F;AAC3F,yEAAqE;AACrE,mEAA+D;AAC/D,2EAAuE;AACvE,kDAA6F;AAC7F,qFAAiF;AACjF,iGAA6F;AAC7F,+EAA2E;AAC3E,+BAA6B;AAC7B,gFAAqE;AAErE,4BAA2B;AAC3B,2DAAiG;AACjG,gFAA4E;AAC5E,mDAAmE;AACnE,uDAAoG;AACpG,4BAAyB;AACzB,yFAAqF;AAErF,IAAA,4BAAe,EAAC,KAAK,CAAC,CAAA;AAEtB,IAAA,gBAAQ,EAAC,8BAA8B,EAAE;;QACvC,MAAM,UAAU,GAAG,IAAI,sCAAmB,CAAC,kBAAgB,CAAC,CAAA;QAC5D,MAAM,wBAAwB,GAAG,IAAI,mDAAwB,CAAC,UAAU,CAAC,CAAA;QACzE,IAAI,MAAc,CAAA;QAClB,IAAI,WAAmB,CAAA;QACvB,IAAI,WAAmB,CAAA;QACvB,IAAI,WAA+B,CAAA;QACnC,IAAI,UAAkB,CAAA;QACtB,IAAI,aAAqB,CAAA;QACzB,IAAI,eAAmC,CAAA;QACvC,IAAI,WAAmB,CAAA;QACvB,IAAI,cAAsB,CAAA;QAC1B,IAAI,gBAAoC,CAAA;QACxC,IAAI,YAA8B,CAAA;QAClC,IAAI,eAAoC,CAAA;QACxC,IAAI,gBAAyC,CAAA;QAC7C,IAAI,YAAiC,CAAA;QACrC,IAAI,qBAAgD,CAAA;QAEpD,SAAe,oBAAoB,CACjC,yBAAkC,EAClC,qBAAqG,EAAE;;gBAEvG,MAAM,aAAa,GAAG,yBAAyB,CAAC,CAAC,CAAC,qCAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,qCAAiB,CAAC,GAAG,CAAA;gBACnG,MAAM,GAAG,UAAU,CAAC,UAAU,EAAE,CAAA;gBAChC,WAAW,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,eAAe,CAAC,sBAAU,CAAC,MAAM,CAAC,CAAA;gBACrE,WAAW,GAAG,IAAA,qBAAa,EAAC,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAA;gBAClG,WAAW,GAAG,IAAA,yBAAiB,EAAC,WAAW,CAAC,CAAA;gBAC5C,UAAU,GAAG,UAAU,CAAC,UAAU,EAAE,CAAA;gBACpC,eAAe,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,eAAe,CAAC,sBAAU,CAAC,MAAM,CAAC,CAAA;gBACzE,aAAa,GAAG,IAAA,qBAAa,EAAC,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAA;gBACxG,WAAW,GAAG,UAAU,CAAC,UAAU,EAAE,CAAA;gBACrC,gBAAgB,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,eAAe,CAAC,sBAAU,CAAC,MAAM,CAAC,CAAA;gBAC1E,cAAc,GAAG,IAAA,qBAAa,EAAC,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAA;gBAC1G,YAAY,GAAG,IAAI,mCAAgB,CACjC;oBACE,EAAE,EAAE,MAAM;oBACV,IAAI,EAAE,aAAa;oBACnB,2BAA2B,EAAE,CAAC,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;iBACrG,EACD;oBACE;wBACE,EAAE,EAAE,UAAU;wBACd,IAAI,EAAE,aAAa;wBACnB,2BAA2B,EAAE,CAAC,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;qBACzG;oBACD;wBACE,EAAE,EAAE,WAAW;wBACf,IAAI,EAAE,aAAa;wBACnB,2BAA2B,EAAE,CAAC,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;qBAC1G;iBACF,CACF,CAAA;gBACD,MAAM,gBAAgB,GAAG,IAAI,2CAAoB,CAAC,SAAS,EAAE,SAAS,EAAE,kBAAkB,CAAC,oBAAoB,CAAC,CAAA;gBAChH,eAAe,GAAG,IAAI,yCAAmB,EAAE,CAAA;gBAC3C,gBAAgB,GAAG,IAAI,iDAAuB,CAAC,eAAe,EAAE,YAAY,EAAE,UAAU,EAAE,yBAAyB,EAAE,KAAK,CAAC,CAAA;gBAC3H,qBAAqB,GAAG,MAAM,qDAAyB,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,WAAW,CAAC,CAAC,CAAA;gBACzF,YAAY,GAAG,MAAM,IAAA,sEAAgD,EACnE,gBAAgB,EAChB,qBAAqB,EACrB,wBAAwB,EACxB,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,IAAI,EACJ,kBAAkB,CACnB,CAAA;YACH,CAAC;SAAA;QAED,SAAe,cAAc,CAC3B,MAAoH,EACpH,QAA0G;;gBAE1G,IAAA,aAAM,EAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;gBAClC,IAAA,aAAM,EAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,MAAO,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CACvG,IAAI,EACJ,wCAAwC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC,aAAa,IAAI,CAAC,SAAS,CACpH,MAAO,CAAC,YAAY,EACpB,SAAS,EACT,CAAC,CACF,IAAI,CACN,CAAA;gBACD,IAAA,aAAM,EAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAO,CAAC,mBAAmB,CAAC,CAAA;gBAC1E,MAAM,oBAAoB,CAAC,MAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAA;YACvE,CAAC;SAAA;QAED,SAAe,oBAAoB,CAAC,MAA6B,EAAE,QAA+B;;gBAChG,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ;oBAAE,OAAM;gBAChC,IAAA,aAAM,EAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,oCAAoC,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAA;gBACxH,IAAA,aAAM,EAAC,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,QAAS,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,MAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAA;YACnI,CAAC;SAAA;QAED,SAAe,0BAA0B;;gBACvC,MAAM,aAAa,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,eAAe,CAAC,sBAAU,CAAC,MAAM,CAAC,CAAA;gBAC7E,MAAM,YAAY,GAAG,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAA;gBACvG,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,eAAe,CAAC,sBAAU,CAAC,IAAI,CAAC,CAAA;gBAC1E,MAAM,WAAW,GAAG,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAA;gBACrG,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,kBAAkB,CACvD,MAAM,EACN,EAAE,CAAC,WAAW,CAAC,EAAE,YAAY,CAAC,UAAU,EAAE,EAC1C,EAAE,CAAC,YAAY,CAAC,EAAE,aAAa,CAAC,SAAS,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,SAAS,EAAE,CAClF,CAAA;gBACD,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,kBAAkB,CACvD,IAAI,2BAAY,iCACX,OAAO,CAAC,YAAY,KACvB,SAAS,EAAE,UAAU,CAAC,UAAU,EAAE,IAClC,CACH,CAAA;gBACD,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,mBAAmB,EAAE,OAAO,CAAC,mBAAmB,EAAE,CAAA;YACvH,CAAC;SAAA;QAED,SAAe,sBAAsB,CAAC,CAAS;;gBAC7C,OAAO,MAAM,OAAO,CAAC,GAAG,CACtB,KAAK,CAAC,CAAC,CAAC;qBACL,IAAI,CAAC,IAAI,CAAC;qBACV,GAAG,CAAC,GAAS,EAAE;oBACd,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,eAAe,CAAC,sBAAU,CAAC,MAAM,CAAC,CAAA;oBACpE,MAAM,MAAM,GAAG,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAA;oBAC7E,MAAM,WAAW,GAAG,IAAA,qBAAa,EAAC,MAAM,CAAC,CAAA;oBACzC,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,EAAE,CAAA;gBACrD,CAAC,CAAA,CAAC,CACL,CAAA;YACH,CAAC;SAAA;QAED,EAAE,CAAC,kHAAkH,EAAE;;gBACrH,SAAe,MAAM,CAAC,yBAAkC;;wBACtD,MAAM,oBAAoB,CAAC,yBAAyB,CAAC,CAAA;wBACrD,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,GAAG,CACpC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAO,CAAC,EAAE,CAAC,EAAE,EAAE;4BACrC,MAAM,IAAI,GAAG,IAAI,2BAAY,CAAC;gCAC5B,EAAE,EAAE,UAAU,CAAC,UAAU,EAAE;gCAC3B,QAAQ,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,EAAE;gCACxD,SAAS,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,MAAM;gCACzD,WAAW,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE;gCACjC,mBAAmB,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE;gCACzC,kBAAkB,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE;gCACxC,kBAAkB,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE;gCACxC,eAAe,EAAE,eAAe;6BACjC,CAAC,CAAA;4BACF,MAAM,eAAe,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAA;4BAC9C,OAAO,IAAI,CAAA;wBACb,CAAC,CAAA,CAAC,CACH,CAAA;wBACD,MAAM,OAAO,CAAC,GAAG,CACf,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,GAAS,EAAE;4BAChC,0BAA0B;4BAC1B,MAAM,IAAI,GAAG,IAAI,2BAAY,CAAC;gCAC5B,EAAE,EAAE,UAAU,CAAC,UAAU,EAAE;gCAC3B,QAAQ,EAAE,UAAU,CAAC,UAAU,EAAE;gCACjC,SAAS,EAAE,UAAU,CAAC,UAAU,EAAE;gCAClC,WAAW,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE;gCACjC,mBAAmB,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE;gCACzC,kBAAkB,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE;gCACxC,kBAAkB,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE;gCACxC,eAAe,EAAE,eAAe;6BACjC,CAAC,CAAA;4BACF,MAAM,eAAe,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAA;wBAChD,CAAC,CAAA,CAAC,CACH,CAAA;wBACD,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,8CAA8C,EAAE,CAAA;wBACzF,IAAI,yBAAyB,EAAE;4BAC7B,IAAA,aAAM,EAAC,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;4BACrC,IAAA,aAAM,EAAC,SAAS,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;4BACrD,IAAA,aAAM,EAAC,IAAA,4BAAS,EAAC,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,SAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,4BAA4B,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAA;yBACzI;6BAAM;4BACL,IAAA,aAAM,EAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAA;yBAClC;oBACH,CAAC;iBAAA;gBACD,MAAM,MAAM,CAAC,IAAI,CAAC,CAAA;gBAClB,MAAM,MAAM,CAAC,KAAK,CAAC,CAAA;YACrB,CAAC;SAAA,CAAC,CAAA;QAEF,EAAE,CAAC,0DAA0D,EAAE;;gBAC7D,SAAe,MAAM,CAAC,yBAAkC;;;wBACtD,MAAM,oBAAoB,CAAC,yBAAyB,CAAC,CAAA;wBACrD,MAAM,GAAG,GAAG,UAAU,CAAC,UAAU,EAAE,CAAA;wBACnC,MAAM,gBAAgB,GAAG,eAAe,CAAC,SAAS,CAAA;wBAClD,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAA;wBAC9E,MAAM,mBAAmB,GAAG,MAAM,YAAY,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAA;wBACtF,eAAe,CAAC,4BAA4B,CAAC,gBAAgB,EAAE;4BAC7D,kBAAkB,EAAE,CAAC;4BACrB,sIAAsI;4BACtI,kCAAkC,EAAE,yBAAyB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;4BACrE,kBAAkB,EAAE,CAAC;4BACrB,oBAAoB,EAAE,CAAC;4BACvB,4BAA4B,EAAE,CAAC;yBAChC,CAAC,CAAA;wBACF,MAAM,cAAc,CAAC,mBAAmB,EAAE,WAAW,CAAC,CAAA;wBACtD,MAAM,sBAAsB,GAAG,MAAM,gBAAgB,CAAC,sBAAsB,CAAC,CAAC,WAAW,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,eAAe,EAAE,CAAC,CAAA;wBAC9I,MAAM,sCAAsC,GAAG,MAAM,gBAAgB,CAAC,6BAA6B,CAAC,CAAC,WAAW,CAAC,YAAY,CAAC,EAAE;4BAC9H,CAAC,aAAa,CAAC,EAAE,eAAe;yBACjC,CAAC,CAAA;wBACF,MAAM,oBAAoB,CAAC,sBAAsB,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,WAAW,CAAC,CAAA;wBACpG,IAAA,aAAM,EAAC,sCAAsC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,mBAAmB,CAAC,CAAA;wBACjH,IAAA,aAAM,EAAC,mBAAmB,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;wBACnE,IAAA,aAAM,EAAC,mBAAmB,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;wBACtE,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,MAAA,mBAAmB,CAAC,YAAY,CAAC,kBAAkB,mCAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;wBAChG,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;wBACnF,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;wBAC3F,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;;iBAC3F;gBACD,MAAM,MAAM,CAAC,IAAI,CAAC,CAAA;gBAClB,MAAM,MAAM,CAAC,KAAK,CAAC,CAAA;YACrB,CAAC;SAAA,CAAC,CAAA;QAEF,EAAE,CAAC,8DAA8D,EAAE;;gBACjE,SAAe,MAAM,CAAC,yBAAkC;;;wBACtD,MAAM,oBAAoB,CAAC,yBAAyB,CAAC,CAAA;wBACrD,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,2BAA2B,CAAC,MAAM,CAAC,CAAA;wBAC1E,IAAA,aAAM,EAAC,WAAW,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;wBAC3D,IAAA,aAAM,EAAC,WAAW,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;wBAC1D,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,MAAA,WAAW,CAAC,YAAY,CAAC,kBAAkB,mCAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;wBACxF,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;wBAClF,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;wBAC3E,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;;iBACpF;gBACD,MAAM,MAAM,CAAC,IAAI,CAAC,CAAA;gBAClB,MAAM,MAAM,CAAC,KAAK,CAAC,CAAA;YACrB,CAAC;SAAA,CAAC,CAAA;QAEF,EAAE,CAAC,+DAA+D,EAAE;;gBAClE,SAAe,MAAM,CAAC,yBAAkC;;wBACtD,MAAM,oBAAoB,GAAG,MAAM,sBAAsB,CAAC,CAAC,CAAC,CAAA;wBAC5D,MAAM,2BAA2B,GAAG,MAAM,sBAAsB,CAAC,CAAC,CAAC,CAAA;wBACnE,MAAM,0BAA0B,GAAG,MAAM,sBAAsB,CAAC,CAAC,CAAC,CAAA;wBAClE,MAAM,uBAAuB,GAAG,MAAM,sBAAsB,CAAC,CAAC,CAAC,CAAA;wBAC/D,MAAM,oBAAoB,CAAC,yBAAyB,EAAE,EAAE,oBAAoB,EAAE,IAAI,GAAG,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAA;wBACnI,KAAK,MAAM,OAAO,IAAI,CAAC,GAAG,oBAAoB,EAAE,GAAG,2BAA2B,CAAC,EAAE;4BAC/E,MAAM,YAAY,CAAC,oBAAoB,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;yBAClE;wBACD,KAAK,MAAM,OAAO,IAAI,0BAA0B,EAAE;4BAChD,MAAM,YAAY,CAAC,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;4BAC7D,MAAM,qBAAqB,CAAC,cAAc,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;yBAC3E;wBACD,KAAK,MAAM,OAAO,IAAI,uBAAuB,EAAE;4BAC7C,MAAM,YAAY,CAAC,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;4BAC7D,MAAM,qBAAqB,CAAC,cAAc,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;yBAC5E;wBACD,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAA;wBAC1E,IAAA,aAAM,EACJ,IAAA,4BAAS,EAAC,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC,CAAC,EACjI,sFAAsF,CACvF,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAA;wBACZ,IAAA,aAAM,EACJ,IAAA,4BAAS,EACP,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,EACtD,IAAI,GAAG,CAAC,CAAC,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,GAAG,0BAA0B,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,WAAW,CAAC,CAAC,CACvI,EACD,uHAAuH,CACxH,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAA;wBACZ,KAAK,MAAM,OAAO,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,EAAE,GAAG,0BAA0B,EAAE,GAAG,oBAAoB,CAAC,EAAE;4BACjI,MAAM,oBAAoB,CACxB,CACE,MAAM,gBAAgB,CAAC,sBAAsB,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CACjH,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAC1B,OAAO,CAAC,WAAW,CACpB,CAAA;4BACD,IAAA,aAAM,EACJ,CAAC,MAAM,gBAAgB,CAAC,6BAA6B,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;iCACtH,qBAAqB,CAAC,CAAC,CAAC,CAC5B,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAA;yBACxC;oBACH,CAAC;iBAAA;gBACD,MAAM,MAAM,CAAC,IAAI,CAAC,CAAA;gBAClB,MAAM,MAAM,CAAC,KAAK,CAAC,CAAA;YACrB,CAAC;SAAA,CAAC,CAAA;QAEF,EAAE,CAAC,4EAA4E,EAAE;;gBAC/E,SAAe,MAAM,CAAC,yBAAkC;;wBACtD,MAAM,oBAAoB,CAAC,yBAAyB,CAAC,CAAA;wBACrD,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAA;wBAC9E,MAAM,YAAY,CAAC,sBAAsB,EAAE,CAAA;wBAC3C,MAAM,oBAAoB,GAAG,eAAe,CAAC,SAAS,CAAA;wBACtD,MAAM,YAAY,GAAG,MAAM,YAAY,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAA;wBAC/E,eAAe,CAAC,4BAA4B,CAAC,oBAAoB,EAAE;4BACjE,kBAAkB,EAAE,CAAC;4BACrB,kCAAkC,EAAE,yBAAyB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;4BACrE,kBAAkB,EAAE,CAAC;4BACrB,oBAAoB,EAAE,CAAC;4BACvB,4BAA4B,EAAE,CAAC;yBAChC,CAAC,CAAA;wBACF,MAAM,cAAc,CAAC,YAAY,EAAE,WAAW,CAAC,CAAA;oBACjD,CAAC;iBAAA;gBACD,MAAM,MAAM,CAAC,IAAI,CAAC,CAAA;gBAClB,MAAM,MAAM,CAAC,KAAK,CAAC,CAAA;YACrB,CAAC;SAAA,CAAC,CAAA;QAEF,EAAE,CAAC,+HAA+H,EAAE;;gBAClI,SAAe,MAAM,CAAC,yBAAkC;;wBACtD,MAAM,oBAAoB,CAAC,yBAAyB,CAAC,CAAA;wBACrD,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAA;wBAC9E,MAAM,qBAAqB,CAAC,wCAAwC,CAAC,UAAU,CAAC,CAAA;wBAChF,MAAM,YAAY,CAAC,sBAAsB,EAAE,CAAA;wBAC3C,MAAM,oBAAoB,GAAG,eAAe,CAAC,SAAS,CAAA;wBACtD,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAA;wBAC1E,eAAe,CAAC,4BAA4B,CAAC,oBAAoB,EAAE;4BACjE,kBAAkB,EAAE,CAAC;4BACrB,kCAAkC,EAAE,yBAAyB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;4BACrE,kBAAkB,EAAE,CAAC;4BACrB,oBAAoB,EAAE,CAAC;4BACvB,4BAA4B,EAAE,CAAC;yBAChC,CAAC,CAAA;wBACF,IAAA,aAAM,EAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAC1G,KAAK,EACL,4EAA4E,CAC7E,CAAA;wBACD,IAAA,aAAM,EAAC,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CACzF,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CACnE,CAAA;wBACD,IAAA,aAAM,EAAC,WAAW,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAA;oBACnF,CAAC;iBAAA;gBACD,MAAM,MAAM,CAAC,IAAI,CAAC,CAAA;gBAClB,MAAM,MAAM,CAAC,KAAK,CAAC,CAAA;YACrB,CAAC;SAAA,CAAC,CAAA;QAEF,EAAE,CAAC,iLAAiL,EAAE;;gBACpL,SAAe,MAAM,CACnB,yBAAkC,EAClC,MAAiH;;wBAEjH,MAAM,oBAAoB,CAAC,yBAAyB,CAAC,CAAA;wBACrD,MAAM,GAAG,GAAG,UAAU,CAAC,UAAU,EAAE,CAAA;wBACnC,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAA;wBAC9E,4BAA4B;wBAC5B,MAAM,eAAe,CAAC,kBAAkB,CAAC,MAAM,MAAM,CAAC,WAAW,CAAC,YAAY,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC,CAAA;wBAC1G,MAAM,YAAY,CAAC,sBAAsB,EAAE,CAAA;wBAC3C,MAAM,oBAAoB,GAAG,eAAe,CAAC,SAAS,CAAA;wBACtD,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAA;wBAC1E,eAAe,CAAC,4BAA4B,CAAC,oBAAoB,EAAE;4BACjE,kBAAkB,EAAE,CAAC;4BACrB,kCAAkC,EAAE,yBAAyB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;4BACrE,kBAAkB,EAAE,CAAC;4BACrB,oBAAoB,EAAE,CAAC;4BACvB,4BAA4B,EAAE,CAAC;yBAChC,CAAC,CAAA;wBACF,IAAA,aAAM,EAAC,WAAW,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAC9C,OAAO,CAAC,YAAY,CAAC,EAAE,EACvB,4EAA4E,CAC7E,CAAA;wBACD,IAAA,aAAM,EAAC,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CACzF,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CACnE,CAAA;wBACD,IAAA,aAAM,EAAC,WAAW,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAA;wBACjF,MAAM,wBAAwB,GAAG,CAAC,MAAM,YAAY,CAAC,yBAAyB,CAAC,CAAC,WAAW,CAAC,YAAY,CAAC,EAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CACnH,WAAW,CAAC,YAAY,CAAC,EAAG,CAC7B,CAAA;wBACD,IAAA,aAAM,EAAC,wBAAwB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;oBACtD,CAAC;iBAAA;gBACD,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,eAAe,CAAC,sBAAU,CAAC,MAAM,CAAC,CAAA;gBAC5E,MAAM,cAAc,GAAG,IAAA,qBAAa,EAAC,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAA;gBAC5G,MAAM,OAAO,GAAG,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;gBAC1C,MAAM,6BAA6B,GAAG,CAAO,YAA0B,EAAE,WAA+B,EAAE,SAAiB,EAAE,EAAE;oBAC7H,OAAA,IAAI,2BAAY,iCACX,YAAY,KACf,WAAW,kCACN,YAAY,CAAC,WAAW,KAC3B,CAAC,SAAS,CAAC,EAAE,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,OAEnF,CAAA;kBAAA,CAAA;gBACJ,MAAM,mCAAmC,GAAG,CAAO,YAA0B,EAAE,WAA+B,EAAE,SAAiB,EAAE,EAAE;oBACnI,OAAA,IAAI,2BAAY,iCACX,YAAY,KACf,mBAAmB,kCACd,YAAY,CAAC,mBAAmB,KACnC,CAAC,SAAS,CAAC,EAAE,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,OAEnF,CAAA;kBAAA,CAAA;gBACJ,MAAM,oBAAoB,GAAG,CAAO,YAA0B,EAAE,WAA+B,EAAE,SAAiB,EAAE,EAAE,gDACpH,OAAA,6BAA6B,CAAC,MAAM,mCAAmC,CAAC,YAAY,EAAE,WAAW,EAAE,SAAS,CAAC,EAAE,WAAW,EAAE,SAAS,CAAC,CAAA,GAAA,CAAA;gBACxI,MAAM,2BAA2B,GAAG,CAAO,YAA0B,EAAE,EAAE;oBACvE,OAAA,IAAI,2BAAY,iCACX,YAAY,KACf,WAAW,kCACN,YAAY,CAAC,WAAW,KAC3B,CAAC,cAAc,CAAC,EAAE,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,OAEzF,CAAA;kBAAA,CAAA;gBACJ,MAAM,MAAM,CAAC,IAAI,EAAE,6BAA6B,CAAC,CAAA;gBACjD,MAAM,MAAM,CAAC,KAAK,EAAE,6BAA6B,CAAC,CAAA;gBAClD,MAAM,MAAM,CAAC,IAAI,EAAE,mCAAmC,CAAC,CAAA;gBACvD,MAAM,MAAM,CAAC,KAAK,EAAE,mCAAmC,CAAC,CAAA;gBACxD,MAAM,MAAM,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAA;gBACxC,MAAM,MAAM,CAAC,KAAK,EAAE,oBAAoB,CAAC,CAAA;gBACzC,MAAM,MAAM,CAAC,IAAI,EAAE,2BAA2B,CAAC,CAAA;gBAC/C,MAAM,MAAM,CAAC,KAAK,EAAE,2BAA2B,CAAC,CAAA;YAClD,CAAC;SAAA,CAAC,CAAA;QAEF,EAAE,CAAC,+HAA+H,EAAE;;gBAClI,SAAe,MAAM,CAAC,yBAAkC;;wBACtD,MAAM,oBAAoB,CAAC,yBAAyB,CAAC,CAAA;wBACrD,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAA;wBAC9E,4BAA4B;wBAC5B,MAAM,eAAe,CAAC,kBAAkB,iCACnC,WAAW,CAAC,YAAY,KAC3B,QAAQ,EAAE,WAAW,IACrB,CAAA;wBACF,MAAM,YAAY,CAAC,sBAAsB,EAAE,CAAA;wBAC3C,MAAM,oBAAoB,GAAG,eAAe,CAAC,SAAS,CAAA;wBACtD,MAAM,iBAAiB,GAAG,MAAM,YAAY,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAA;wBACpF,MAAM,kBAAkB,GAAG,MAAM,YAAY,CAAC,2BAA2B,CAAC,WAAW,CAAC,CAAA;wBACtF,eAAe,CAAC,4BAA4B,CAAC,oBAAoB,EAAE;4BACjE,kBAAkB,EAAE,CAAC;4BACrB,kCAAkC,EAAE,yBAAyB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;4BACrE,kBAAkB,EAAE,CAAC;4BACrB,oBAAoB,EAAE,CAAC;4BACvB,4BAA4B,EAAE,CAAC;yBAChC,CAAC,CAAA;wBACF,IAAA,aAAM,EAAC,WAAW,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAC9C,iBAAiB,CAAC,YAAY,CAAC,EAAE,EACjC,wFAAwF,CACzF,CAAA;wBACD,IAAA,aAAM,EAAC,WAAW,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAC9C,kBAAkB,CAAC,YAAY,CAAC,EAAE,EAClC,0FAA0F,CAC3F,CAAA;wBACD,IAAA,aAAM,EAAC,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CACzF,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,iBAAiB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CAC7E,CAAA;wBACD,IAAA,aAAM,EAAC,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CACzF,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,kBAAkB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CAC9E,CAAA;wBACD,IAAA,aAAM,EAAC,WAAW,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,CAAA;wBAC3F,IAAA,aAAM,EAAC,WAAW,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,kBAAkB,CAAC,mBAAmB,CAAC,CAAA;wBAC5F,MAAM,wBAAwB,GAAG,CAAC,MAAM,YAAY,CAAC,yBAAyB,CAAC,CAAC,WAAW,CAAC,YAAY,CAAC,EAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CACnH,WAAW,CAAC,YAAY,CAAC,EAAG,CAC7B,CAAA;wBACD,IAAA,aAAM,EAAC,wBAAwB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;wBACpD,IAAA,aAAM,EAAC,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,wBAAyB,CAAC,WAAY,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CACpG,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CACvE,CAAA;wBACD,IAAA,aAAM,EAAC,wBAAyB,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,mBAAmB,CAAC,CAAA;oBACjG,CAAC;iBAAA;gBACD,MAAM,MAAM,CAAC,IAAI,CAAC,CAAA;gBAClB,MAAM,MAAM,CAAC,KAAK,CAAC,CAAA;YACrB,CAAC;SAAA,CAAC,CAAA;QAEF,EAAE,CAAC,8GAA8G,EAAE;;gBACjH,SAAe,MAAM,CAAC,yBAAkC;;wBACtD,MAAM,oBAAoB,CAAC,yBAAyB,CAAC,CAAA;wBACrD,MAAM,YAAY,GAAG,MAAM,YAAY,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAA;wBAC/E,MAAM,YAAY,GAAG,MAAM,0BAA0B,EAAE,CAAA;wBACvD,MAAM,qBAAqB,CAAC,wCAAwC,CAAC,UAAU,CAAC,CAAA;wBAChF,MAAM,YAAY,CAAC,sBAAsB,EAAE,CAAA;wBAC3C,MAAM,cAAc,CAClB,CACE,MAAM,YAAY,CAAC,yBAAyB,CAAC,CAAC,YAAY,CAAC,YAAY,CAAC,EAAG,CAAC,EAAE,IAAI,CAAC,CACpF,CAAC,YAAY,CAAC,YAAY,CAAC,EAAG,CAAC,EAChC,YAAY,CACb,CAAA;wBACD,MAAM,cAAc,CAClB,CACE,MAAM,YAAY,CAAC,yBAAyB,CAAC,CAAC,YAAY,CAAC,YAAY,CAAC,EAAG,CAAC,EAAE,IAAI,CAAC,CACpF,CAAC,YAAY,CAAC,YAAY,CAAC,EAAG,CAAC,EAChC,YAAY,CACb,CAAA;oBACH,CAAC;iBAAA;gBACD,MAAM,MAAM,CAAC,IAAI,CAAC,CAAA;gBAClB,MAAM,MAAM,CAAC,KAAK,CAAC,CAAA;YACrB,CAAC;SAAA,CAAC,CAAA;QAEF,EAAE,CAAC,qFAAqF,EAAE;;gBACxF,SAAe,MAAM,CAAC,yBAAkC;;wBACtD,MAAM,oBAAoB,CAAC,yBAAyB,CAAC,CAAA;wBACrD,MAAM,YAAY,GAAG,MAAM,YAAY,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAA;wBAC/E,MAAM,OAAO,GAAG,MAAM,wBAAwB,CAAC,0BAA0B,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAA;wBAC3G,MAAM,cAAc,GAAG,MAAM,YAAY,CAAC,6CAA6C,CAAC,OAAO,CAAC,CAAA;wBAChG,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE;4BAC1B,MAAM,cAAc,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,YAAY,CAAC,CAAA;yBACzD;wBACD,IAAI,CAAC,yBAAyB,EAAE;4BAC9B,MAAM,YAAY,GAAG,MAAM,0BAA0B,EAAE,CAAA;4BACvD,MAAM,OAAO,GAAG,MAAM,wBAAwB,CAAC,0BAA0B,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAA;4BAC3G,MAAM,cAAc,CAClB,CACE,MAAM,YAAY,CAAC,yBAAyB,CAAC,CAAC,YAAY,CAAC,YAAY,CAAC,EAAG,CAAC,EAAE,IAAI,CAAC,CACpF,CAAC,YAAY,CAAC,YAAY,CAAC,EAAG,CAAC,EAChC,YAAY,CACb,CAAA;4BACD,MAAM,cAAc,GAAG,MAAM,YAAY,CAAC,6CAA6C,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,CAAA;4BACjH,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE;gCAC1B,MAAM,cAAc,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,YAAY,CAAC,CAAA;6BACzD;yBACF;oBACH,CAAC;iBAAA;gBACD,MAAM,MAAM,CAAC,IAAI,CAAC,CAAA;gBAClB,MAAM,MAAM,CAAC,KAAK,CAAC,CAAA;YACrB,CAAC;SAAA,CAAC,CAAA;QAEF,EAAE,CAAC,2EAA2E,EAAE;;gBAC9E,SAAe,MAAM,CAAC,yBAAkC;;wBACtD,MAAM,oBAAoB,CAAC,yBAAyB,CAAC,CAAA;wBACrD,MAAM,aAAa,GAAG,MAAM,YAAY,CAAC,2BAA2B,CAAC,MAAM,CAAC,CAAA;wBAC5E,MAAM,cAAc,GAAG,MAAM,0BAA0B,EAAE,CAAA;wBACzD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,eAAe,CAAC,sBAAU,CAAC,MAAM,CAAC,CAAA;wBACtE,MAAM,YAAY,CAAC,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;wBACvD,uBAAuB;wBACvB,qBAAqB,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA;wBAC5C,MAAM,qBAAqB,CAAC,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;wBACpE,MAAM,YAAY,CAAC,sBAAsB,EAAE,CAAA;wBAC3C,MAAM,cAAc,CAAC,CAAC,MAAM,YAAY,CAAC,yBAAyB,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC,EAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC,EAAG,CAAC,EAAE;4BAC3I,YAAY,EAAE,aAAa,CAAC,YAAY;4BACxC,WAAW,EAAE,SAAS;yBACvB,CAAC,CAAA;wBACF,MAAM,cAAc,CAAC,CAAC,MAAM,YAAY,CAAC,yBAAyB,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC,EAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC,EAAG,CAAC,EAAE;4BAC7I,YAAY,EAAE,cAAc,CAAC,YAAY;4BACzC,WAAW,EAAE,SAAS;yBACvB,CAAC,CAAA;oBACJ,CAAC;iBAAA;gBACD,MAAM,MAAM,CAAC,IAAI,CAAC,CAAA;gBAClB,MAAM,MAAM,CAAC,KAAK,CAAC,CAAA;YACrB,CAAC;SAAA,CAAC,CAAA;QAEF,EAAE,CAAC,+DAA+D,EAAE;;gBAClE,SAAe,MAAM,CAAC,yBAAkC;;wBACtD,MAAM,oBAAoB,CAAC,yBAAyB,CAAC,CAAA;wBACrD,MAAM,aAAa,GAAG,MAAM,YAAY,CAAC,2BAA2B,CAAC,MAAM,CAAC,CAAA;wBAC5E,MAAM,cAAc,GAAG,MAAM,0BAA0B,EAAE,CAAA;wBACzD,MAAM,qBAAqB,CAAC,cAAc,CAAC,UAAU,EAAE,WAAW,EAAE,KAAK,CAAC,CAAA;wBAC1E,MAAM,YAAY,CAAC,sBAAsB,EAAE,CAAA;wBAC3C,MAAM,cAAc,CAClB,CACE,MAAM,YAAY,CAAC,yBAAyB,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC,EAAG,CAAC,EAAE,IAAI,CAAC,CACrF,CAAC,aAAa,CAAC,YAAY,CAAC,EAAG,CAAC,EACjC,aAAa,CACd,CAAA;wBACD,MAAM,cAAc,CAClB,CACE,MAAM,YAAY,CAAC,yBAAyB,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC,EAAG,CAAC,EAAE,IAAI,CAAC,CACtF,CAAC,cAAc,CAAC,YAAY,CAAC,EAAG,CAAC,EAClC,cAAc,CACf,CAAA;oBACH,CAAC;iBAAA;gBACD,MAAM,MAAM,CAAC,IAAI,CAAC,CAAA;gBAClB,MAAM,MAAM,CAAC,KAAK,CAAC,CAAA;YACrB,CAAC;SAAA,CAAC,CAAA;QAEF,EAAE,CAAC,sHAAsH,EAAE;;gBACzH,MAAM,oBAAoB,CAAC,KAAK,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,CAAA;gBACtD,MAAM,UAAU,GAAG,wCAA4B,CAAC,OAAO,CAAA;gBACvD,MAAM,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,EAAE,EAAE,UAAU,CAAC,UAAU,EAAE,EAAE,UAAU,CAAC,UAAU,EAAE,CAAC,CAAA;gBAExF,SAAe,YAAY,CAAC,IAAyF;;wBACnH,MAAM,gBAAgB,GAAG,eAAe,CAAC,SAAS,CAAA;wBAClD,MAAM,MAAM,GAAG,MAAM,wBAAwB,CAAC,0BAA0B,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;wBAClG,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE;4BACzB,MAAM,cAAc,CAAC,CAAC,MAAM,YAAY,CAAC,6CAA6C,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAA;yBAC7G;wBACD,IAAI,IAAI,CAAC,YAAY,CAAC,SAAS,KAAK,MAAM,EAAE;4BAC1C,MAAM,cAAc,CAAC,MAAM,YAAY,CAAC,2BAA2B,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAA;yBACvG;wBACD,MAAM,cAAc,CAAC,CAAC,MAAM,YAAY,CAAC,yBAAyB,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,EAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,EAAG,CAAC,EAAE,IAAI,CAAC,CAAA;wBAChI,eAAe,CAAC,4BAA4B,CAAC,gBAAgB,EAAE;4BAC7D,oBAAoB,EAAE,CAAC;4BACvB,kBAAkB,EAAE,CAAC;4BACrB,kBAAkB,EAAE,CAAC;4BACrB,4BAA4B,EAAE,CAAC;4BAC/B,kCAAkC,EAAE,CAAC;yBACtC,CAAC,CAAA;oBACJ,CAAC;iBAAA;gBAED,SAAe,wBAAwB,CAAC,IAAyF;;wBAC/H,MAAM,gBAAgB,GAAG,eAAe,CAAC,SAAS,CAAA;wBAClD,MAAM,MAAM,GAAG,CAAC,MAAM,wBAAwB,CAAC,sBAAsB,CAAC,IAAI,CAAC,mBAAmB,EAAE,UAAU,CAAC,CAAC,CAAA;wBAC5G,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE;4BACzB,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,MAAM,YAAY,CAAC,6CAA6C,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;yBAChH;wBACD,IAAI,IAAI,CAAC,YAAY,CAAC,SAAS,KAAK,MAAM,EAAE;4BAC1C,MAAM,cAAc,CAAC,MAAM,YAAY,CAAC,2BAA2B,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAA;4BACtG,eAAe,CAAC,4BAA4B,CAAC,gBAAgB,EAAE;gCAC7D,oBAAoB,EAAE,CAAC;gCACvB,kBAAkB,EAAE,CAAC;gCACrB,kBAAkB,EAAE,CAAC;gCACrB,4BAA4B,EAAE,CAAC;gCAC/B,kCAAkC,EAAE,CAAC;6BACtC,CAAC,CAAA;yBACH;6BAAM;4BACL,MAAM,cAAc,CAAC,CAAC,MAAM,YAAY,CAAC,yBAAyB,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,EAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,EAAG,CAAC,EAAE,IAAI,CAAC,CAAA;4BAChI,eAAe,CAAC,4BAA4B,CAAC,gBAAgB,EAAE;gCAC7D,oBAAoB,EAAE,CAAC;gCACvB,kBAAkB,EAAE,CAAC;gCACrB,kBAAkB,EAAE,CAAC;gCACrB,4BAA4B,EAAE,CAAC;gCAC/B,kCAAkC,EAAE,CAAC;6BACtC,CAAC,CAAA;yBACH;oBACH,CAAC;iBAAA;gBAED,MAAM,cAAc,GAAG,MAAM,YAAY,CAAC,2BAA2B,CAAC,MAAM,CAAC,CAAA;gBAC7E,MAAM,cAAc,GAAG,MAAM,YAAY,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAA;gBACjF,MAAM,eAAe,GAAG,MAAM,0BAA0B,EAAE,CAAA,CAAC,oDAAoD;gBAC/G,MAAM,eAAe,GAAG,MAAM,0BAA0B,EAAE,CAAA,CAAC,oDAAoD;gBAC/G,8BAA8B;gBAC9B,MAAM,YAAY,CAAC,cAAc,CAAC,CAAA;gBAClC,MAAM,YAAY,CAAC,cAAc,CAAC,CAAA;gBAClC,MAAM,wBAAwB,CAAC,eAAe,CAAC,CAAA;gBAC/C,MAAM,YAAY,CAAC,cAAc,CAAC,CAAA;gBAClC,MAAM,YAAY,CAAC,cAAc,CAAC,CAAA;gBAClC,MAAM,YAAY,CAAC,eAAe,CAAC,CAAA;gBACnC,MAAM,wBAAwB,CAAC,eAAe,CAAC,CAAA;gBAC/C,MAAM,YAAY,CAAC,cAAc,CAAC,CAAA;gBAClC,MAAM,YAAY,CAAC,eAAe,CAAC,CAAA;gBACnC,MAAM,YAAY,CAAC,eAAe,CAAC,CAAA;gBACnC,MAAM,wBAAwB,CAAC,cAAc,CAAC,CAAA;gBAC9C,MAAM,YAAY,CAAC,eAAe,CAAC,CAAA;gBACnC,MAAM,YAAY,CAAC,eAAe,CAAC,CAAA;gBACnC,MAAM,YAAY,CAAC,cAAc,CAAC,CAAA;gBAClC,MAAM,wBAAwB,CAAC,cAAc,CAAC,CAAA;gBAC9C,MAAM,YAAY,CAAC,eAAe,CAAC,CAAA;gBACnC,8BAA8B;gBAC9B,MAAM,YAAY,CAAC,cAAc,CAAC,CAAA;gBAClC,MAAM,YAAY,CAAC,cAAc,CAAC,CAAA;gBAClC,MAAM,wBAAwB,CAAC,eAAe,CAAC,CAAA;gBAC/C,MAAM,YAAY,CAAC,cAAc,CAAC,CAAA;gBAClC,MAAM,YAAY,CAAC,cAAc,CAAC,CAAA;gBAClC,MAAM,YAAY,CAAC,eAAe,CAAC,CAAA;gBACnC,MAAM,wBAAwB,CAAC,eAAe,CAAC,CAAA;gBAC/C,MAAM,YAAY,CAAC,cAAc,CAAC,CAAA;gBAClC,MAAM,YAAY,CAAC,eAAe,CAAC,CAAA;gBACnC,MAAM,YAAY,CAAC,eAAe,CAAC,CAAA;YACrC,CAAC;SAAA,CAAC,CAAA;QAEF,EAAE,CAAC,2FAA2F,EAAE;;gBAC9F,MAAM,oBAAoB,CAAC,IAAI,CAAC,CAAA;gBAChC,MAAM,aAAa,GAAG,MAAM,YAAY,CAAC,2BAA2B,CAAC,MAAM,CAAC,CAAA;gBAC5E,MAAM,cAAc,GAAG,MAAM,0BAA0B,EAAE,CAAA;gBACzD,MAAM,qBAAqB,GAAG,MAAM,IAAA,sEAAgD,EAClF,gBAAgB,EAChB,qBAAqB,EACrB,wBAAwB,EACxB,IAAI,2CAAoB,EAAE,EAC1B,YAAY,EACZ,UAAU,EACV,IAAI,CACL,CAAA;gBACD,MAAM,qBAAqB,GAAG,eAAe,CAAC,SAAS,CAAA;gBACvD,MAAM,cAAc,CAClB,CACE,MAAM,qBAAqB,CAAC,yBAAyB,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC,EAAG,CAAC,EAAE,KAAK,CAAC,CAC/F,CAAC,aAAa,CAAC,YAAY,CAAC,EAAG,CAAC,EACjC,aAAa,CACd,CAAA;gBACD,MAAM,cAAc,CAClB,CACE,MAAM,qBAAqB,CAAC,yBAAyB,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC,EAAG,CAAC,EAAE,KAAK,CAAC,CAChG,CAAC,cAAc,CAAC,YAAY,CAAC,EAAG,CAAC,EAClC,cAAc,CACf,CAAA;gBACD,eAAe,CAAC,4BAA4B,CAAC,qBAAqB,EAAE;oBAClE,oBAAoB,EAAE,CAAC;oBACvB,kBAAkB,EAAE,CAAC;oBACrB,kBAAkB,EAAE,CAAC;oBACrB,4BAA4B,EAAE,CAAC;oBAC/B,kCAAkC,EAAE,CAAC;iBACtC,CAAC,CAAA;YACJ,CAAC;SAAA,CAAC,CAAA;IACJ,CAAC;CAAA,CAAC,CAAA;AAEF,IAAI,GAAa,CAAA;AAEjB,IAAA,gBAAQ,EAAC,6BAA6B,EAAE;;QACtC,MAAM,CAAC;;gBACL,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;gBACpB,MAAM,WAAW,GAAG,MAAM,IAAA,sCAAyB,GAAE,CAAA;gBACrD,GAAG,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,IAAA,uBAAe,GAAE,CAAC,CAAA;YACpD,CAAC;SAAA,CAAC,CAAA;QAEF,EAAE,CAAC,yEAAyE,EAAE;;gBAC5E,MAAM,WAAW,GAAG,MAAM,IAAA,4BAAe,EAAC,GAAG,CAAC,CAAA;gBAC9C,MAAM,WAAW,GAAG,MAAM,IAAA,4BAAe,EAAC,GAAG,CAAC,CAAA;gBAC9C,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,2BAA2B,CAAC,WAAW,CAAC,WAAW,CAAC,WAAW,CAAC,CAAA;gBAC5H,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,2BAA2B,CAAC,WAAW,CAAC,WAAW,CAAC,WAAW,CAAC,CAAA;gBAC5H,MAAM,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,sBAAsB,EAAE,CAAA;gBACrE,MAAM,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,sBAAsB,EAAE,CAAA;gBACrE,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,eAAe,CAAC,sBAAU,CAAC,MAAM,CAAC,CAAA;gBACpG,MAAM,WAAW,GAAG,IAAA,kBAAM,EAAC,MAAM,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAA;gBAClH,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,WAAW,CAAC,WAAW,CAAC,WAAW,CAAC,CAAA;gBAC7G,MAAM,WAAW,CAAC,GAAG,CAAC,kBAAkB,CAAC,qBAAqB,iCACzD,IAAI,KACP,2BAA2B,EAAE,CAAC,GAAG,IAAI,CAAC,2BAA2B,EAAE,WAAW,CAAC,IAC/E,CAAA;gBACF,MAAM,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,gBAAgB,CAAC,WAAW,CAAC,WAAW,CAAC,WAAW,EAAE,WAAW,CAAC,CAAA;gBAC/G,MAAM,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,sBAAsB,EAAE,CAAA;gBACrE,MAAM,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,sBAAsB,EAAE,CAAA;gBACrE,MAAM,aAAa,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,2BAA2B,CAAC,WAAW,CAAC,WAAW,CAAC,WAAW,CAAC,CAAA;gBACnI,MAAM,aAAa,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,2BAA2B,CAAC,WAAW,CAAC,WAAW,CAAC,WAAW,CAAC,CAAA;gBACnI,IAAA,aAAM,EAAC,aAAa,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAA;gBACtE,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAA;gBACzI,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAA;gBAC/I,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAA;gBAC9I,IAAA,aAAM,EAAC,aAAa,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAA;gBACtE,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAA;gBACzI,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAA;gBAC/I,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAA;YAChJ,CAAC;SAAA,CAAC,CAAA;QAEF,EAAE,CAAC,sEAAsE,EAAE;;gBACzE,MAAM,WAAW,GAAG,MAAM,IAAA,4BAAe,EAAC,GAAG,CAAC,CAAA;gBAC9C,MAAM,WAAW,GAAG,MAAM,IAAA,4BAAe,EAAC,GAAG,CAAC,CAAA;gBAC9C,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,2BAA2B,CAAC,WAAW,CAAC,WAAW,CAAC,WAAW,CAAC,CAAA;gBAC5H,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,2BAA2B,CAAC,WAAW,CAAC,WAAW,CAAC,WAAW,CAAC,CAAA;gBAC5H,MAAM,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,sBAAsB,EAAE,CAAA;gBACrE,MAAM,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,sBAAsB,EAAE,CAAA;gBACrE,MAAM,eAAe,GAAG,IAAI,uCAAkB,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,EAAE,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAA;gBACvH,MAAM,YAAY,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,eAAe,CAAC,sBAAU,CAAC,MAAM,CAAC,CAAA;gBACtG,MAAM,eAAe,GAAG,IAAA,kBAAM,EAAC,MAAM,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAA;gBACxH,MAAM,cAAc,GAAG,IAAA,qBAAa,EAAC,eAAe,CAAC,CAAA;gBACrD,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;gBAC3E,SAAe,cAAc,CAAC,IAAkB;;wBAC9C,MAAM,eAAe,CAAC,kBAAkB,iCACnC,IAAI,KACP,WAAW,kCACN,IAAI,CAAC,WAAW,KACnB,CAAC,cAAc,CAAC,EAAE,IAAA,kBAAM,EAAC,MAAM,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,KAEpH,mBAAmB,kCACd,IAAI,CAAC,mBAAmB,KAC3B,CAAC,cAAc,CAAC,EAAE,IAAA,kBAAM,EAAC,MAAM,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,KAEpH,kBAAkB,kCACb,IAAI,CAAC,kBAAkB,KAC1B,CAAC,cAAc,CAAC,EAAE,IAAA,kBAAM,EAAC,MAAM,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,OAEpH,CAAA;oBACJ,CAAC;iBAAA;gBACD,MAAM,cAAc,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;gBACzC,MAAM,cAAc,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;gBACzC,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,eAAe,CAAC,sBAAU,CAAC,MAAM,CAAC,CAAA;gBACpG,MAAM,WAAW,GAAG,IAAA,kBAAM,EAAC,MAAM,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAA;gBAClH,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,WAAW,CAAC,WAAW,CAAC,WAAW,CAAC,CAAA;gBAC7G,MAAM,WAAW,CAAC,GAAG,CAAC,kBAAkB,CAAC,qBAAqB,iCACzD,IAAI,KACP,2BAA2B,EAAE,CAAC,GAAG,IAAI,CAAC,2BAA2B,EAAE,WAAW,EAAE,eAAe,CAAC,IAChG,CAAA;gBACF,MAAM,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,gBAAgB,CAAC,WAAW,CAAC,WAAW,CAAC,WAAW,EAAE,WAAW,CAAC,CAAA;gBAC/G,MAAM,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,sBAAsB,EAAE,CAAA;gBACrE,MAAM,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,sBAAsB,EAAE,CAAA;gBACrE,MAAM,aAAa,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,2BAA2B,CAAC,WAAW,CAAC,WAAW,CAAC,WAAW,CAAC,CAAA;gBACnI,MAAM,aAAa,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,2BAA2B,CAAC,WAAW,CAAC,WAAW,CAAC,WAAW,CAAC,CAAA;gBACnI,IAAA,aAAM,EAAC,aAAa,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAA;gBAC1E,IAAA,aAAM,EAAC,aAAa,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAA;gBAC1E,MAAM,WAAW,GAAG,CAAC,MAAM,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,yBAAyB,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,EAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAC3H,MAAM,CAAC,YAAY,CAAC,EAAG,CACxB,CAAA;gBACD,IAAA,aAAM,EAAC,WAAW,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;gBACvC,IAAA,aAAM,EAAC,WAAY,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;gBACpD,IAAA,aAAM,EAAC,WAAY,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;gBAC5D,MAAM,WAAW,GAAG,CAAC,MAAM,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,yBAAyB,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,EAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAC3H,MAAM,CAAC,YAAY,CAAC,EAAG,CACxB,CAAA;gBACD,IAAA,aAAM,EAAC,WAAW,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;gBACvC,IAAA,aAAM,EAAC,WAAY,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;gBACpD,IAAA,aAAM,EAAC,WAAY,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;YAC9D,CAAC;SAAA,CAAC,CAAA;IACJ,CAAC;CAAA,CAAC,CAAA","sourcesContent":["import { describe } from 'mocha'\nimport {\n ExchangeDataManager,\n ExchangeDataManagerOptionalParameters,\n initialiseExchangeDataManagerForCurrentDataOwner,\n} from '../../../icc-x-api/crypto/ExchangeDataManager'\nimport { WebCryptoPrimitives } from '../../../icc-x-api/crypto/CryptoPrimitives'\nimport { webcrypto } from 'crypto'\nimport { BaseExchangeDataManager } from '../../../icc-x-api/crypto/BaseExchangeDataManager'\nimport { FakeExchangeDataApi } from '../../utils/FakeExchangeDataApi'\nimport { FakeDataOwnerApi } from '../../utils/FakeDataOwnerApi'\nimport { TestCryptoStrategies } from '../../utils/TestCryptoStrategies'\nimport { EntityWithDelegationTypeName, ShaVersion, ua2b64, ua2hex } from '../../../icc-x-api'\nimport { FakeEncryptionKeysManager } from '../../utils/FakeEncryptionKeysManager'\nimport { AccessControlSecretUtils } from '../../../icc-x-api/crypto/AccessControlSecretUtils'\nimport { ExchangeData } from '../../../icc-api/model/internal/ExchangeData'\nimport { expect } from 'chai'\nimport { setEquals } from '../../../icc-x-api/utils/collection-utils'\nimport { KeyPair } from '../../../icc-x-api/crypto/RSA'\nimport * as _ from 'lodash'\nimport { fingerprintV1, fingerprintV1toV2, fingerprintV2 } from '../../../icc-x-api/crypto/utils'\nimport { DataOwnerTypeEnum } from '../../../icc-api/model/DataOwnerTypeEnum'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { createNewHcpApi, getEnvironmentInitializer, setLocalStorage } from '../../utils/test_utils'\nimport 'isomorphic-fetch'\nimport { IccExchangeDataApi } from '../../../icc-api/api/internal/IccExchangeDataApi'\n\nsetLocalStorage(fetch)\n\ndescribe('Exchange data manager - unit', async function () {\n const primitives = new WebCryptoPrimitives(webcrypto as any)\n const accessControlSecretUtils = new AccessControlSecretUtils(primitives)\n let selfId: string\n let selfKeyFpV1: string\n let selfKeyFpV2: string\n let selfKeypair: KeyPair<CryptoKey>\n let delegateId: string\n let delegateKeyFp: string\n let delegateKeypair: KeyPair<CryptoKey>\n let delegate2Id: string\n let delegate2KeyFp: string\n let delegate2Keypair: KeyPair<CryptoKey>\n let dataOwnerApi: FakeDataOwnerApi\n let exchangeDataApi: FakeExchangeDataApi\n let baseExchangeData: BaseExchangeDataManager\n let exchangeData: ExchangeDataManager\n let encryptionKeysManager: FakeEncryptionKeysManager\n\n async function initialiseComponents(\n allowFullExchangeDataLoad: boolean,\n optionalParameters: ExchangeDataManagerOptionalParameters & { verifiedDelegateKeys?: Set<string> } = {}\n ) {\n const dataOwnerType = allowFullExchangeDataLoad ? DataOwnerTypeEnum.Patient : DataOwnerTypeEnum.Hcp\n selfId = primitives.randomUuid()\n selfKeypair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n selfKeyFpV1 = fingerprintV1(ua2hex(await primitives.RSA.exportKey(selfKeypair.publicKey, 'spki')))\n selfKeyFpV2 = fingerprintV1toV2(selfKeyFpV1)\n delegateId = primitives.randomUuid()\n delegateKeypair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n delegateKeyFp = fingerprintV1(ua2hex(await primitives.RSA.exportKey(delegateKeypair.publicKey, 'spki')))\n delegate2Id = primitives.randomUuid()\n delegate2Keypair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n delegate2KeyFp = fingerprintV1(ua2hex(await primitives.RSA.exportKey(delegate2Keypair.publicKey, 'spki')))\n dataOwnerApi = new FakeDataOwnerApi(\n {\n id: selfId,\n type: dataOwnerType,\n publicKeysForOaepWithSha256: [ua2hex(await primitives.RSA.exportKey(selfKeypair.publicKey, 'spki'))],\n },\n [\n {\n id: delegateId,\n type: dataOwnerType,\n publicKeysForOaepWithSha256: [ua2hex(await primitives.RSA.exportKey(delegateKeypair.publicKey, 'spki'))],\n },\n {\n id: delegate2Id,\n type: dataOwnerType,\n publicKeysForOaepWithSha256: [ua2hex(await primitives.RSA.exportKey(delegate2Keypair.publicKey, 'spki'))],\n },\n ]\n )\n const cryptoStrategies = new TestCryptoStrategies(undefined, undefined, optionalParameters.verifiedDelegateKeys)\n exchangeDataApi = new FakeExchangeDataApi()\n baseExchangeData = new BaseExchangeDataManager(exchangeDataApi, dataOwnerApi, primitives, allowFullExchangeDataLoad, false)\n encryptionKeysManager = await FakeEncryptionKeysManager.create(primitives, [selfKeypair])\n exchangeData = await initialiseExchangeDataManagerForCurrentDataOwner(\n baseExchangeData,\n encryptionKeysManager,\n accessControlSecretUtils,\n cryptoStrategies,\n dataOwnerApi,\n primitives,\n true,\n optionalParameters\n )\n }\n\n async function checkDataEqual(\n actual: { exchangeData: ExchangeData; accessControlSecret?: string; exchangeKey: CryptoKey | undefined } | undefined,\n expected: { exchangeData: ExchangeData; accessControlSecret?: string; exchangeKey: CryptoKey | undefined }\n ) {\n expect(actual).to.not.be.undefined\n expect(_.isEqual(_.omit(expected.exchangeData, ['rev']), _.omit(actual!.exchangeData, ['rev']))).to.equal(\n true,\n `Data should be equivalent\\nExpected: ${JSON.stringify(expected.exchangeData, undefined, 2)}\\nActual: ${JSON.stringify(\n actual!.exchangeData,\n undefined,\n 2\n )}\\n`\n )\n expect(expected.accessControlSecret).to.equal(actual!.accessControlSecret)\n await checkAesKeysEquality(actual!.exchangeKey, expected.exchangeKey)\n }\n\n async function checkAesKeysEquality(actual: CryptoKey | undefined, expected: CryptoKey | undefined) {\n if (!actual && !expected) return\n expect(!actual).to.equal(!expected, !expected ? 'Key should not have been decrypted' : 'Key should have been decrypted')\n expect(ua2hex(await primitives.AES.exportKey(expected!, 'raw'))).to.equal(ua2hex(await primitives.AES.exportKey(actual!, 'raw')))\n }\n\n async function createDataFromRandomToSelf(): Promise<{ exchangeData: ExchangeData; exchangeKey: CryptoKey; accessControlSecret: string }> {\n const encryptionKey = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const encryptionFp = ua2hex(await primitives.RSA.exportKey(encryptionKey.publicKey, 'spki')).slice(-32)\n const signatureKey = await primitives.RSA.generateKeyPair(ShaVersion.Sha1)\n const signatureFp = ua2hex(await primitives.RSA.exportKey(signatureKey.publicKey, 'spki')).slice(-32)\n const created = await baseExchangeData.createExchangeData(\n selfId,\n { [signatureFp]: signatureKey.privateKey },\n { [encryptionFp]: encryptionKey.publicKey, [selfKeyFpV1]: selfKeypair.publicKey }\n )\n const modified = await exchangeDataApi.modifyExchangeData(\n new ExchangeData({\n ...created.exchangeData,\n delegator: primitives.randomUuid(),\n })\n )\n return { exchangeData: modified, exchangeKey: created.exchangeKey, accessControlSecret: created.accessControlSecret }\n }\n\n async function generateEncryptionKeys(n: number): Promise<{ pair: KeyPair<CryptoKey>; fingerprintV2: string; hexPub: string }[]> {\n return await Promise.all(\n Array(n)\n .fill(null)\n .map(async () => {\n const pair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const hexPub = ua2hex(await primitives.RSA.exportKey(pair.publicKey, 'spki'))\n const fingerprint = fingerprintV2(hexPub)\n return { pair, fingerprintV2: fingerprint, hexPub }\n })\n )\n }\n\n it('base should be able to retrieve all exchange data for the current data owner if allowed by the crypto strategies', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const expectedData = await Promise.all(\n Array.from(Array(3500), async (_, i) => {\n const data = new ExchangeData({\n id: primitives.randomUuid(),\n delegate: i % 2 === 0 ? selfId : primitives.randomUuid(),\n delegator: i % 2 === 0 ? primitives.randomUuid() : selfId,\n exchangeKey: { not: 'important' },\n accessControlSecret: { not: 'important' },\n sharedSignatureKey: { not: 'important' },\n delegatorSignature: { not: 'important' },\n sharedSignature: 'not important',\n })\n await exchangeDataApi.createExchangeData(data)\n return data\n })\n )\n await Promise.all(\n Array.from(Array(500), async () => {\n // Should not be in result\n const data = new ExchangeData({\n id: primitives.randomUuid(),\n delegate: primitives.randomUuid(),\n delegator: primitives.randomUuid(),\n exchangeKey: { not: 'important' },\n accessControlSecret: { not: 'important' },\n sharedSignatureKey: { not: 'important' },\n delegatorSignature: { not: 'important' },\n sharedSignature: 'not important',\n })\n await exchangeDataApi.createExchangeData(data)\n })\n )\n const retrieved = await baseExchangeData.getAllExchangeDataForCurrentDataOwnerIfAllowed()\n if (allowFullExchangeDataLoad) {\n expect(retrieved).to.not.be.undefined\n expect(retrieved).to.have.length(expectedData.length)\n expect(setEquals(new Set(expectedData.map((x) => x.id)), new Set(retrieved!.map((x) => x.id))), 'Retrieved and expected ids').to.be.true\n } else {\n expect(retrieved).to.be.undefined\n }\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should create new encryption keys when none is available', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const sfk = primitives.randomUuid()\n const initialisedCount = exchangeDataApi.callCount\n const createdData = await exchangeData.getOrCreateEncryptionDataTo(delegateId)\n const retrievedCachedData = await exchangeData.getOrCreateEncryptionDataTo(delegateId)\n exchangeDataApi.compareCallCountFromBaseline(initialisedCount, {\n createExchangeData: 1,\n // If we could fully preload we already know whether the exchange key already exists or not, otherwise we have to request from the api\n getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 1,\n modifyExchangeData: 0,\n getExchangeDataByIds: 0,\n getExchangeDataByParticipant: 0,\n })\n await checkDataEqual(retrievedCachedData, createdData)\n const decryptedKeyByDelegate = await baseExchangeData.tryDecryptExchangeKeys([createdData.exchangeData], { [delegateKeyFp]: delegateKeypair })\n const decryptedAccessControlSecretByDelegate = await baseExchangeData.tryDecryptAccessControlSecret([createdData.exchangeData], {\n [delegateKeyFp]: delegateKeypair,\n })\n await checkAesKeysEquality(decryptedKeyByDelegate.successfulDecryptions[0], createdData.exchangeKey)\n expect(decryptedAccessControlSecretByDelegate.successfulDecryptions[0]).to.equal(createdData.accessControlSecret)\n expect(retrievedCachedData.exchangeData.delegator).to.equal(selfId)\n expect(retrievedCachedData.exchangeData.delegate).to.equal(delegateId)\n expect(Object.keys(retrievedCachedData.exchangeData.delegatorSignature ?? {})).to.have.length(1)\n expect(Object.keys(retrievedCachedData.exchangeData.exchangeKey)).to.have.length(2)\n expect(Object.keys(retrievedCachedData.exchangeData.accessControlSecret)).to.have.length(2)\n expect(Object.keys(retrievedCachedData.exchangeData.sharedSignatureKey)).to.have.length(2)\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should create encryption keys to self when none is available', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdData = await exchangeData.getOrCreateEncryptionDataTo(selfId)\n expect(createdData.exchangeData.delegator).to.equal(selfId)\n expect(createdData.exchangeData.delegate).to.equal(selfId)\n expect(Object.keys(createdData.exchangeData.delegatorSignature ?? {})).to.have.length(1)\n expect(Object.keys(createdData.exchangeData.sharedSignatureKey)).to.have.length(1)\n expect(Object.keys(createdData.exchangeData.exchangeKey)).to.have.length(1)\n expect(Object.keys(createdData.exchangeData.accessControlSecret)).to.have.length(1)\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should ignore unverified keys when creating new exchange data', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n const delegateVerifiedKeys = await generateEncryptionKeys(5)\n const extraDelegateUnverifiedKeys = await generateEncryptionKeys(5)\n const extraDelegatorVerifiedKeys = await generateEncryptionKeys(5)\n const delegatorUnverifiedKeys = await generateEncryptionKeys(5)\n await initialiseComponents(allowFullExchangeDataLoad, { verifiedDelegateKeys: new Set(delegateVerifiedKeys.map((x) => x.hexPub)) })\n for (const keyData of [...delegateVerifiedKeys, ...extraDelegateUnverifiedKeys]) {\n await dataOwnerApi.addPublicKeyForOwner(delegateId, keyData.pair)\n }\n for (const keyData of extraDelegatorVerifiedKeys) {\n await dataOwnerApi.addPublicKeyForOwner(selfId, keyData.pair)\n await encryptionKeysManager.addOrUpdateKey(primitives, keyData.pair, true)\n }\n for (const keyData of delegatorUnverifiedKeys) {\n await dataOwnerApi.addPublicKeyForOwner(selfId, keyData.pair)\n await encryptionKeysManager.addOrUpdateKey(primitives, keyData.pair, false)\n }\n const created = await exchangeData.getOrCreateEncryptionDataTo(delegateId)\n expect(\n setEquals(new Set(Object.keys(created.exchangeData.exchangeKey)), new Set(Object.keys(created.exchangeData.accessControlSecret))),\n 'Keys used for encryption of exchange key and access control secret must be the same.'\n ).to.be.true\n expect(\n setEquals(\n new Set(Object.keys(created.exchangeData.exchangeKey)),\n new Set([...delegateVerifiedKeys.map((x) => x.fingerprintV2), ...extraDelegatorVerifiedKeys.map((x) => x.fingerprintV2), selfKeyFpV2])\n ),\n 'Only verified keys of delegate and delegator should be used for encryption of exchange key and access control secret.'\n ).to.be.true\n for (const keyData of [{ pair: selfKeypair, fingerprintV2: selfKeyFpV1 }, ...extraDelegatorVerifiedKeys, ...delegateVerifiedKeys]) {\n await checkAesKeysEquality(\n (\n await baseExchangeData.tryDecryptExchangeKeys([created.exchangeData], { [keyData.fingerprintV2]: keyData.pair })\n ).successfulDecryptions[0],\n created.exchangeKey\n )\n expect(\n (await baseExchangeData.tryDecryptAccessControlSecret([created.exchangeData], { [keyData.fingerprintV2]: keyData.pair }))\n .successfulDecryptions[0]\n ).to.equal(created.accessControlSecret)\n }\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should reuse existing exchange data for encryption when it can be verified', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdData = await exchangeData.getOrCreateEncryptionDataTo(delegateId)\n await exchangeData.clearOrRepopulateCache()\n const countAfterCacheClear = exchangeDataApi.callCount\n const reloadedData = await exchangeData.getOrCreateEncryptionDataTo(delegateId)\n exchangeDataApi.compareCallCountFromBaseline(countAfterCacheClear, {\n createExchangeData: 0,\n getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 1,\n modifyExchangeData: 0,\n getExchangeDataByIds: 0,\n getExchangeDataByParticipant: 0,\n })\n await checkDataEqual(reloadedData, createdData)\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should create new exchange data for encryption when the existing data can not be verified due to unavailable verification key', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdData = await exchangeData.getOrCreateEncryptionDataTo(delegateId)\n await encryptionKeysManager.unverifyExistingKeysAndCreateNewVerified(primitives)\n await exchangeData.clearOrRepopulateCache()\n const countAfterCacheClear = exchangeDataApi.callCount\n const newData = await exchangeData.getOrCreateEncryptionDataTo(delegateId)\n exchangeDataApi.compareCallCountFromBaseline(countAfterCacheClear, {\n createExchangeData: 1,\n getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 1,\n modifyExchangeData: 0,\n getExchangeDataByIds: 0,\n getExchangeDataByParticipant: 0,\n })\n expect(_.isEqual(_.omit(createdData.exchangeData, ['rev']), _.omit(newData.exchangeData, ['rev']))).to.equal(\n false,\n 'Exchange data manager should have created new exchange data for encryption'\n )\n expect(ua2hex(await primitives.AES.exportKey(createdData.exchangeKey, 'raw'))).to.not.equal(\n ua2hex(await primitives.AES.exportKey(newData.exchangeKey, 'raw'))\n )\n expect(createdData.accessControlSecret).to.not.equal(newData.accessControlSecret)\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should create new exchange data for encryption when the existing data can not be verified due to tampering of the encrypted access control secret and/or encrypted exchange key', async function () {\n async function doTest(\n allowFullExchangeDataLoad: boolean,\n tamper: (exchangeData: ExchangeData, selfKeyPair: KeyPair<CryptoKey>, selfKeyFp: string) => Promise<ExchangeData>\n ) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const sfk = primitives.randomUuid()\n const createdData = await exchangeData.getOrCreateEncryptionDataTo(delegateId)\n // Tamper with exchange data\n await exchangeDataApi.modifyExchangeData(await tamper(createdData.exchangeData, selfKeypair, selfKeyFpV2))\n await exchangeData.clearOrRepopulateCache()\n const countAfterCacheClear = exchangeDataApi.callCount\n const newData = await exchangeData.getOrCreateEncryptionDataTo(delegateId)\n exchangeDataApi.compareCallCountFromBaseline(countAfterCacheClear, {\n createExchangeData: 1,\n getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 1,\n modifyExchangeData: 0,\n getExchangeDataByIds: 0,\n getExchangeDataByParticipant: 0,\n })\n expect(createdData.exchangeData.id).not.to.equal(\n newData.exchangeData.id,\n 'Exchange data manager should have created new exchange data for encryption'\n )\n expect(ua2hex(await primitives.AES.exportKey(createdData.exchangeKey, 'raw'))).to.not.equal(\n ua2hex(await primitives.AES.exportKey(newData.exchangeKey, 'raw'))\n )\n expect(createdData.accessControlSecret).to.not.equal(newData.accessControlSecret)\n const updatedUnverifiedOldData = (await exchangeData.getDecryptionDataKeyByIds([createdData.exchangeData.id!], true))[\n createdData.exchangeData.id!\n ]\n expect(updatedUnverifiedOldData).to.not.be.undefined\n }\n const extraKeyPair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const extraKeyPairFp = fingerprintV2(ua2hex(await primitives.RSA.exportKey(extraKeyPair.publicKey, 'spki')))\n const fakeKey = primitives.randomBytes(16)\n const tamperByChangingEncryptionKey = async (exchangeData: ExchangeData, selfKeyPair: KeyPair<CryptoKey>, selfKeyFp: string) =>\n new ExchangeData({\n ...exchangeData,\n exchangeKey: {\n ...exchangeData.exchangeKey,\n [selfKeyFp]: ua2b64(await primitives.RSA.encrypt(selfKeyPair.publicKey, fakeKey)),\n },\n })\n const tamperByChangingAccessControlSecret = async (exchangeData: ExchangeData, selfKeyPair: KeyPair<CryptoKey>, selfKeyFp: string) =>\n new ExchangeData({\n ...exchangeData,\n accessControlSecret: {\n ...exchangeData.accessControlSecret,\n [selfKeyFp]: ua2b64(await primitives.RSA.encrypt(selfKeyPair.publicKey, fakeKey)),\n },\n })\n const tamperByChangingBoth = async (exchangeData: ExchangeData, selfKeyPair: KeyPair<CryptoKey>, selfKeyFp: string) =>\n tamperByChangingEncryptionKey(await tamperByChangingAccessControlSecret(exchangeData, selfKeyPair, selfKeyFp), selfKeyPair, selfKeyFp)\n const tamperByAddingEncryptionKey = async (exchangeData: ExchangeData) =>\n new ExchangeData({\n ...exchangeData,\n exchangeKey: {\n ...exchangeData.exchangeKey,\n [extraKeyPairFp]: ua2b64(await primitives.RSA.encrypt(extraKeyPair.publicKey, fakeKey)),\n },\n })\n await doTest(true, tamperByChangingEncryptionKey)\n await doTest(false, tamperByChangingEncryptionKey)\n await doTest(true, tamperByChangingAccessControlSecret)\n await doTest(false, tamperByChangingAccessControlSecret)\n await doTest(true, tamperByChangingBoth)\n await doTest(false, tamperByChangingBoth)\n await doTest(true, tamperByAddingEncryptionKey)\n await doTest(false, tamperByAddingEncryptionKey)\n })\n\n it('should create new exchange data for encryption when the existing data can not be verified due to tampering of the delegate id', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdData = await exchangeData.getOrCreateEncryptionDataTo(delegateId)\n // Tamper with exchange data\n await exchangeDataApi.modifyExchangeData({\n ...createdData.exchangeData,\n delegate: delegate2Id,\n })\n await exchangeData.clearOrRepopulateCache()\n const countAfterCacheClear = exchangeDataApi.callCount\n const newDataToDelegate = await exchangeData.getOrCreateEncryptionDataTo(delegateId)\n const newDataToDelegate2 = await exchangeData.getOrCreateEncryptionDataTo(delegate2Id)\n exchangeDataApi.compareCallCountFromBaseline(countAfterCacheClear, {\n createExchangeData: 2,\n getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 2,\n modifyExchangeData: 0,\n getExchangeDataByIds: 0,\n getExchangeDataByParticipant: 0,\n })\n expect(createdData.exchangeData.id).to.not.equal(\n newDataToDelegate.exchangeData.id,\n 'Exchange data manager should have created new exchange data for encryption to delegate'\n )\n expect(createdData.exchangeData.id).to.not.equal(\n newDataToDelegate2.exchangeData.id,\n 'Exchange data manager should have created new exchange data for encryption to delegate 2'\n )\n expect(ua2hex(await primitives.AES.exportKey(createdData.exchangeKey, 'raw'))).to.not.equal(\n ua2hex(await primitives.AES.exportKey(newDataToDelegate.exchangeKey, 'raw'))\n )\n expect(ua2hex(await primitives.AES.exportKey(createdData.exchangeKey, 'raw'))).to.not.equal(\n ua2hex(await primitives.AES.exportKey(newDataToDelegate2.exchangeKey, 'raw'))\n )\n expect(createdData.accessControlSecret).to.not.equal(newDataToDelegate.accessControlSecret)\n expect(createdData.accessControlSecret).to.not.equal(newDataToDelegate2.accessControlSecret)\n const updatedUnverifiedOldData = (await exchangeData.getDecryptionDataKeyByIds([createdData.exchangeData.id!], true))[\n createdData.exchangeData.id!\n ]\n expect(updatedUnverifiedOldData).to.not.be.undefined\n expect(ua2hex(await primitives.AES.exportKey(updatedUnverifiedOldData!.exchangeKey!, 'raw'))).to.equal(\n ua2hex(await primitives.AES.exportKey(createdData.exchangeKey, 'raw'))\n )\n expect(updatedUnverifiedOldData!.accessControlSecret).to.equal(createdData.accessControlSecret)\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should return existing exchange data keys for decryption even if the data authenticity could not be verified', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdData1 = await exchangeData.getOrCreateEncryptionDataTo(delegateId)\n const createdData2 = await createDataFromRandomToSelf()\n await encryptionKeysManager.unverifyExistingKeysAndCreateNewVerified(primitives)\n await exchangeData.clearOrRepopulateCache()\n await checkDataEqual(\n (\n await exchangeData.getDecryptionDataKeyByIds([createdData1.exchangeData.id!], true)\n )[createdData1.exchangeData.id!],\n createdData1\n )\n await checkDataEqual(\n (\n await exchangeData.getDecryptionDataKeyByIds([createdData2.exchangeData.id!], true)\n )[createdData2.exchangeData.id!],\n createdData2\n )\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('newly created data or data retrieved by id should be cached and retrievable by hash', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdData1 = await exchangeData.getOrCreateEncryptionDataTo(delegateId)\n const hashes1 = await accessControlSecretUtils.allSecureDelegationKeysFor(createdData1.accessControlSecret)\n const retrievedKeys1 = await exchangeData.getCachedDecryptionDataKeyByAccessControlHash(hashes1)\n for (const hash of hashes1) {\n await checkDataEqual(retrievedKeys1[hash], createdData1)\n }\n if (!allowFullExchangeDataLoad) {\n const createdData2 = await createDataFromRandomToSelf()\n const hashes2 = await accessControlSecretUtils.allSecureDelegationKeysFor(createdData2.accessControlSecret)\n await checkDataEqual(\n (\n await exchangeData.getDecryptionDataKeyByIds([createdData2.exchangeData.id!], true)\n )[createdData2.exchangeData.id!],\n createdData2\n )\n const retrievedKeys2 = await exchangeData.getCachedDecryptionDataKeyByAccessControlHash([...hashes1, ...hashes2])\n for (const hash of hashes2) {\n await checkDataEqual(retrievedKeys2[hash], createdData2)\n }\n }\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('if data can not be decrypted the retrieval method should return undefined', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdBySelf = await exchangeData.getOrCreateEncryptionDataTo(selfId)\n const createdByOther = await createDataFromRandomToSelf()\n const newKey = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n await dataOwnerApi.addPublicKeyForOwner(selfId, newKey)\n // Simulate loss of key\n encryptionKeysManager.deleteKey(selfKeyFpV1)\n await encryptionKeysManager.addOrUpdateKey(primitives, newKey, true)\n await exchangeData.clearOrRepopulateCache()\n await checkDataEqual((await exchangeData.getDecryptionDataKeyByIds([createdBySelf.exchangeData.id!], true))[createdBySelf.exchangeData.id!], {\n exchangeData: createdBySelf.exchangeData,\n exchangeKey: undefined,\n })\n await checkDataEqual((await exchangeData.getDecryptionDataKeyByIds([createdByOther.exchangeData.id!], true))[createdByOther.exchangeData.id!], {\n exchangeData: createdByOther.exchangeData,\n exchangeKey: undefined,\n })\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('unverified keys should still be usable for decryption of data', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdBySelf = await exchangeData.getOrCreateEncryptionDataTo(selfId)\n const createdByOther = await createDataFromRandomToSelf()\n await encryptionKeysManager.addOrUpdateKey(primitives, selfKeypair, false)\n await exchangeData.clearOrRepopulateCache()\n await checkDataEqual(\n (\n await exchangeData.getDecryptionDataKeyByIds([createdBySelf.exchangeData.id!], true)\n )[createdBySelf.exchangeData.id!],\n createdBySelf\n )\n await checkDataEqual(\n (\n await exchangeData.getDecryptionDataKeyByIds([createdByOther.exchangeData.id!], true)\n )[createdByOther.exchangeData.id!],\n createdByOther\n )\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('implementation with limited cache should trigger eviction of delegate and hash cache on eviction of data by id cache', async function () {\n await initialiseComponents(false, { lruCacheSize: 3 })\n const entityType = EntityWithDelegationTypeName.Contact\n const sfks = [primitives.randomUuid(), primitives.randomUuid(), primitives.randomUuid()]\n\n async function verifyCached(data: { exchangeData: ExchangeData; accessControlSecret: string; exchangeKey: CryptoKey }) {\n const apiCallsBaseline = exchangeDataApi.callCount\n const hashes = await accessControlSecretUtils.allSecureDelegationKeysFor(data.accessControlSecret)\n for (const hash of hashes) {\n await checkDataEqual((await exchangeData.getCachedDecryptionDataKeyByAccessControlHash([hash]))[hash], data)\n }\n if (data.exchangeData.delegator === selfId) {\n await checkDataEqual(await exchangeData.getOrCreateEncryptionDataTo(data.exchangeData.delegate), data)\n }\n await checkDataEqual((await exchangeData.getDecryptionDataKeyByIds([data.exchangeData.id!], true))[data.exchangeData.id!], data)\n exchangeDataApi.compareCallCountFromBaseline(apiCallsBaseline, {\n getExchangeDataByIds: 0,\n createExchangeData: 0,\n modifyExchangeData: 0,\n getExchangeDataByParticipant: 0,\n getExchangeDataByDelegatorDelegate: 0,\n })\n }\n\n async function verifyNotCachedThenCache(data: { exchangeData: ExchangeData; accessControlSecret: string; exchangeKey: CryptoKey }) {\n const apiCallsBaseline = exchangeDataApi.callCount\n const hashes = [await accessControlSecretUtils.secureDelegationKeyFor(data.accessControlSecret, entityType)]\n for (const hash of hashes) {\n expect(Object.keys(await exchangeData.getCachedDecryptionDataKeyByAccessControlHash([hash]))).to.have.length(0)\n }\n if (data.exchangeData.delegator === selfId) {\n await checkDataEqual(await exchangeData.getOrCreateEncryptionDataTo(data.exchangeData.delegate), data)\n exchangeDataApi.compareCallCountFromBaseline(apiCallsBaseline, {\n getExchangeDataByIds: 0,\n createExchangeData: 0,\n modifyExchangeData: 0,\n getExchangeDataByParticipant: 0,\n getExchangeDataByDelegatorDelegate: 1,\n })\n } else {\n await checkDataEqual((await exchangeData.getDecryptionDataKeyByIds([data.exchangeData.id!], true))[data.exchangeData.id!], data)\n exchangeDataApi.compareCallCountFromBaseline(apiCallsBaseline, {\n getExchangeDataByIds: 1,\n createExchangeData: 0,\n modifyExchangeData: 0,\n getExchangeDataByParticipant: 0,\n getExchangeDataByDelegatorDelegate: 0,\n })\n }\n }\n\n const createdBySelf1 = await exchangeData.getOrCreateEncryptionDataTo(selfId)\n const createdBySelf2 = await exchangeData.getOrCreateEncryptionDataTo(delegateId)\n const createdByOther1 = await createDataFromRandomToSelf() // Not automatically cached: created by someone else\n const createdByOther2 = await createDataFromRandomToSelf() // Not automatically cached: created by someone else\n // noinspection DuplicatedCode\n await verifyCached(createdBySelf1)\n await verifyCached(createdBySelf2)\n await verifyNotCachedThenCache(createdByOther1)\n await verifyCached(createdBySelf1)\n await verifyCached(createdBySelf2)\n await verifyCached(createdByOther1)\n await verifyNotCachedThenCache(createdByOther2)\n await verifyCached(createdBySelf2)\n await verifyCached(createdByOther1)\n await verifyCached(createdByOther2)\n await verifyNotCachedThenCache(createdBySelf1)\n await verifyCached(createdByOther1)\n await verifyCached(createdByOther2)\n await verifyCached(createdBySelf1)\n await verifyNotCachedThenCache(createdBySelf2)\n await verifyCached(createdByOther2)\n // noinspection DuplicatedCode\n await verifyCached(createdBySelf1)\n await verifyCached(createdBySelf2)\n await verifyNotCachedThenCache(createdByOther1)\n await verifyCached(createdBySelf1)\n await verifyCached(createdBySelf2)\n await verifyCached(createdByOther1)\n await verifyNotCachedThenCache(createdByOther2)\n await verifyCached(createdBySelf2)\n await verifyCached(createdByOther1)\n await verifyCached(createdByOther2)\n })\n\n it('implementation with unlimited cache should preload all existing exchange data on creation', async function () {\n await initialiseComponents(true)\n const createdBySelf = await exchangeData.getOrCreateEncryptionDataTo(selfId)\n const createdByOther = await createDataFromRandomToSelf()\n const recreatedExchangeData = await initialiseExchangeDataManagerForCurrentDataOwner(\n baseExchangeData,\n encryptionKeysManager,\n accessControlSecretUtils,\n new TestCryptoStrategies(),\n dataOwnerApi,\n primitives,\n true\n )\n const apiCallsAfterCreation = exchangeDataApi.callCount\n await checkDataEqual(\n (\n await recreatedExchangeData.getDecryptionDataKeyByIds([createdBySelf.exchangeData.id!], false)\n )[createdBySelf.exchangeData.id!],\n createdBySelf\n )\n await checkDataEqual(\n (\n await recreatedExchangeData.getDecryptionDataKeyByIds([createdByOther.exchangeData.id!], false)\n )[createdByOther.exchangeData.id!],\n createdByOther\n )\n exchangeDataApi.compareCallCountFromBaseline(apiCallsAfterCreation, {\n getExchangeDataByIds: 0,\n createExchangeData: 0,\n modifyExchangeData: 0,\n getExchangeDataByParticipant: 0,\n getExchangeDataByDelegatorDelegate: 0,\n })\n })\n})\n\nlet env: TestVars\n\ndescribe('Exchange data manager - e2e', async function () {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n })\n\n it('give access back should not invalidate existing and valid exchange data', async function () {\n const hcp1Details = await createNewHcpApi(env)\n const hcp2Details = await createNewHcpApi(env)\n const ed1to2 = await hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId)\n const ed2to1 = await hcp2Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp1Details.credentials.dataOwnerId)\n await hcp1Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n await hcp2Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n const newKeyPair = await hcp1Details.api.cryptoApi.primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const exportedPub = ua2hex(await hcp1Details.api.cryptoApi.primitives.RSA.exportKey(newKeyPair.publicKey, 'spki'))\n const hcp2 = await hcp2Details.api.healthcarePartyApi.getHealthcareParty(hcp2Details.credentials.dataOwnerId)\n await hcp2Details.api.healthcarePartyApi.modifyHealthcareParty({\n ...hcp2,\n publicKeysForOaepWithSha256: [...hcp2.publicKeysForOaepWithSha256, exportedPub],\n })\n await hcp1Details.api.cryptoApi.exchangeData.giveAccessBackTo(hcp2Details.credentials.dataOwnerId, exportedPub)\n await hcp1Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n await hcp2Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n const updatedEd1to2 = await hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId)\n const updatedEd2to1 = await hcp2Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp1Details.credentials.dataOwnerId)\n expect(updatedEd1to2.exchangeData.id).to.equal(ed1to2.exchangeData.id)\n expect(Object.keys(updatedEd2to1.exchangeData.exchangeKey).length).to.be.greaterThan(Object.keys(ed2to1.exchangeData.exchangeKey).length)\n expect(Object.keys(updatedEd2to1.exchangeData.exchangeKey).length).to.equal(Object.keys(updatedEd2to1.exchangeData.accessControlSecret).length)\n expect(Object.keys(updatedEd2to1.exchangeData.exchangeKey).length).to.equal(Object.keys(updatedEd2to1.exchangeData.sharedSignatureKey).length)\n expect(updatedEd2to1.exchangeData.id).to.equal(ed2to1.exchangeData.id)\n expect(Object.keys(updatedEd1to2.exchangeData.exchangeKey).length).to.be.greaterThan(Object.keys(ed1to2.exchangeData.exchangeKey).length)\n expect(Object.keys(updatedEd1to2.exchangeData.exchangeKey).length).to.equal(Object.keys(updatedEd1to2.exchangeData.accessControlSecret).length)\n expect(Object.keys(updatedEd1to2.exchangeData.exchangeKey).length).to.equal(Object.keys(updatedEd1to2.exchangeData.sharedSignatureKey).length)\n })\n\n it('invalid exchange data should not be re-validated by give access back', async function () {\n const hcp1Details = await createNewHcpApi(env)\n const hcp2Details = await createNewHcpApi(env)\n const ed1to2 = await hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId)\n const ed2to1 = await hcp2Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp1Details.credentials.dataOwnerId)\n await hcp1Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n await hcp2Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n const exchangeDataApi = new IccExchangeDataApi(env.iCureUrl, {}, hcp1Details.api.authApi.authenticationProvider, fetch)\n const extraKeyPair = await hcp1Details.api.cryptoApi.primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const extraKeyPairPub = ua2hex(await hcp1Details.api.cryptoApi.primitives.RSA.exportKey(extraKeyPair.publicKey, 'spki'))\n const extraKeyPairFp = fingerprintV2(extraKeyPairPub)\n const fakeData = await hcp1Details.api.cryptoApi.primitives.randomBytes(16)\n async function tamperWithData(data: ExchangeData) {\n await exchangeDataApi.modifyExchangeData({\n ...data,\n exchangeKey: {\n ...data.exchangeKey,\n [extraKeyPairFp]: ua2b64(await hcp1Details.api.cryptoApi.primitives.RSA.encrypt(extraKeyPair.publicKey, fakeData)),\n },\n accessControlSecret: {\n ...data.accessControlSecret,\n [extraKeyPairFp]: ua2b64(await hcp1Details.api.cryptoApi.primitives.RSA.encrypt(extraKeyPair.publicKey, fakeData)),\n },\n sharedSignatureKey: {\n ...data.sharedSignatureKey,\n [extraKeyPairFp]: ua2b64(await hcp1Details.api.cryptoApi.primitives.RSA.encrypt(extraKeyPair.publicKey, fakeData)),\n },\n })\n }\n await tamperWithData(ed1to2.exchangeData)\n await tamperWithData(ed2to1.exchangeData)\n const newKeyPair = await hcp1Details.api.cryptoApi.primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const exportedPub = ua2hex(await hcp1Details.api.cryptoApi.primitives.RSA.exportKey(newKeyPair.publicKey, 'spki'))\n const hcp2 = await hcp2Details.api.healthcarePartyApi.getHealthcareParty(hcp2Details.credentials.dataOwnerId)\n await hcp2Details.api.healthcarePartyApi.modifyHealthcareParty({\n ...hcp2,\n publicKeysForOaepWithSha256: [...hcp2.publicKeysForOaepWithSha256, exportedPub, extraKeyPairPub],\n })\n await hcp1Details.api.cryptoApi.exchangeData.giveAccessBackTo(hcp2Details.credentials.dataOwnerId, exportedPub)\n await hcp1Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n await hcp2Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n const updatedEd1to2 = await hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId)\n const updatedEd2to1 = await hcp2Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp1Details.credentials.dataOwnerId)\n expect(updatedEd1to2.exchangeData.id).to.not.equal(ed1to2.exchangeData.id)\n expect(updatedEd2to1.exchangeData.id).to.not.equal(ed2to1.exchangeData.id)\n const decData1to2 = (await hcp1Details.api.cryptoApi.exchangeData.getDecryptionDataKeyByIds([ed1to2.exchangeData.id!], true))[\n ed1to2.exchangeData.id!\n ]\n expect(decData1to2).to.not.be.undefined\n expect(decData1to2!.exchangeKey).to.not.be.undefined\n expect(decData1to2!.accessControlSecret).to.not.be.undefined\n const decData2to1 = (await hcp2Details.api.cryptoApi.exchangeData.getDecryptionDataKeyByIds([ed2to1.exchangeData.id!], true))[\n ed2to1.exchangeData.id!\n ]\n expect(decData2to1).to.not.be.undefined\n expect(decData2to1!.exchangeKey).to.not.be.undefined\n expect(decData2to1!.accessControlSecret).to.not.be.undefined\n })\n})\n"]}