@icure/api 8.1.9 → 8.2.1

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 (98) hide show
  1. package/icc-x-api/crypto/BaseExchangeDataManager.d.ts +19 -9
  2. package/icc-x-api/crypto/BaseExchangeDataManager.js +25 -5
  3. package/icc-x-api/crypto/BaseExchangeDataManager.js.map +1 -1
  4. package/icc-x-api/crypto/CryptoStrategies.d.ts +2 -1
  5. package/icc-x-api/crypto/CryptoStrategies.js.map +1 -1
  6. package/icc-x-api/crypto/DelegationsDeAnonymization.js +1 -1
  7. package/icc-x-api/crypto/DelegationsDeAnonymization.js.map +1 -1
  8. package/icc-x-api/crypto/ExchangeDataManager.d.ts +25 -2
  9. package/icc-x-api/crypto/ExchangeDataManager.js +98 -5
  10. package/icc-x-api/crypto/ExchangeDataManager.js.map +1 -1
  11. package/icc-x-api/crypto/ExtendedApisUtils.d.ts +3 -1
  12. package/icc-x-api/crypto/ExtendedApisUtils.js.map +1 -1
  13. package/icc-x-api/crypto/ExtendedApisUtilsImpl.d.ts +1 -1
  14. package/icc-x-api/crypto/ExtendedApisUtilsImpl.js +3 -3
  15. package/icc-x-api/crypto/ExtendedApisUtilsImpl.js.map +1 -1
  16. package/icc-x-api/crypto/SecureDelegationsManager.d.ts +3 -1
  17. package/icc-x-api/crypto/SecureDelegationsManager.js +10 -6
  18. package/icc-x-api/crypto/SecureDelegationsManager.js.map +1 -1
  19. package/icc-x-api/crypto/ShamirKeysManager.js +1 -1
  20. package/icc-x-api/crypto/ShamirKeysManager.js.map +1 -1
  21. package/icc-x-api/crypto/UserEncryptionKeysManager.d.ts +2 -1
  22. package/icc-x-api/crypto/UserEncryptionKeysManager.js +18 -1
  23. package/icc-x-api/crypto/UserEncryptionKeysManager.js.map +1 -1
  24. package/icc-x-api/crypto/utils.js +1 -1
  25. package/icc-x-api/crypto/utils.js.map +1 -1
  26. package/icc-x-api/icc-accesslog-x-api.d.ts +6 -0
  27. package/icc-x-api/icc-accesslog-x-api.js +6 -2
  28. package/icc-x-api/icc-accesslog-x-api.js.map +1 -1
  29. package/icc-x-api/icc-calendar-item-x-api.d.ts +4 -0
  30. package/icc-x-api/icc-calendar-item-x-api.js +3 -1
  31. package/icc-x-api/icc-calendar-item-x-api.js.map +1 -1
  32. package/icc-x-api/icc-classification-x-api.d.ts +3 -0
  33. package/icc-x-api/icc-classification-x-api.js +3 -1
  34. package/icc-x-api/icc-classification-x-api.js.map +1 -1
  35. package/icc-x-api/icc-contact-x-api.d.ts +3 -0
  36. package/icc-x-api/icc-contact-x-api.js +3 -1
  37. package/icc-x-api/icc-contact-x-api.js.map +1 -1
  38. package/icc-x-api/icc-crypto-x-api.d.ts +29 -0
  39. package/icc-x-api/icc-crypto-x-api.js +36 -0
  40. package/icc-x-api/icc-crypto-x-api.js.map +1 -1
  41. package/icc-x-api/icc-document-x-api.d.ts +3 -0
  42. package/icc-x-api/icc-document-x-api.js +3 -1
  43. package/icc-x-api/icc-document-x-api.js.map +1 -1
  44. package/icc-x-api/icc-form-x-api.d.ts +3 -0
  45. package/icc-x-api/icc-form-x-api.js +3 -1
  46. package/icc-x-api/icc-form-x-api.js.map +1 -1
  47. package/icc-x-api/icc-helement-x-api.d.ts +3 -0
  48. package/icc-x-api/icc-helement-x-api.js +3 -1
  49. package/icc-x-api/icc-helement-x-api.js.map +1 -1
  50. package/icc-x-api/icc-invoice-x-api.d.ts +3 -0
  51. package/icc-x-api/icc-invoice-x-api.js +3 -1
  52. package/icc-x-api/icc-invoice-x-api.js.map +1 -1
  53. package/icc-x-api/icc-maintenance-task-x-api.d.ts +3 -0
  54. package/icc-x-api/icc-maintenance-task-x-api.js +3 -1
  55. package/icc-x-api/icc-maintenance-task-x-api.js.map +1 -1
  56. package/icc-x-api/icc-message-x-api.d.ts +3 -0
  57. package/icc-x-api/icc-message-x-api.js +3 -1
  58. package/icc-x-api/icc-message-x-api.js.map +1 -1
  59. package/icc-x-api/icc-patient-x-api.d.ts +3 -0
  60. package/icc-x-api/icc-patient-x-api.js +6 -2
  61. package/icc-x-api/icc-patient-x-api.js.map +1 -1
  62. package/icc-x-api/icc-receipt-x-api.d.ts +3 -0
  63. package/icc-x-api/icc-receipt-x-api.js +3 -1
  64. package/icc-x-api/icc-receipt-x-api.js.map +1 -1
  65. package/icc-x-api/icc-recovery-x-api.js +8 -1
  66. package/icc-x-api/icc-recovery-x-api.js.map +1 -1
  67. package/icc-x-api/icc-time-table-x-api.d.ts +3 -0
  68. package/icc-x-api/icc-time-table-x-api.js +3 -1
  69. package/icc-x-api/icc-time-table-x-api.js.map +1 -1
  70. package/icc-x-api/icc-topic-x-api.d.ts +3 -0
  71. package/icc-x-api/icc-topic-x-api.js +3 -1
  72. package/icc-x-api/icc-topic-x-api.js.map +1 -1
  73. package/icc-x-api/index.d.ts +16 -0
  74. package/icc-x-api/index.js +8 -2
  75. package/icc-x-api/index.js.map +1 -1
  76. package/package.json +1 -1
  77. package/test/icc-x-api/autofix-anonymity-test.js +18 -4
  78. package/test/icc-x-api/autofix-anonymity-test.js.map +1 -1
  79. package/test/icc-x-api/crypto/exchange-data-manager-test.js +30 -30
  80. package/test/icc-x-api/crypto/exchange-data-manager-test.js.map +1 -1
  81. package/test/icc-x-api/crypto/secure-delegations-manager-test.js +2 -2
  82. package/test/icc-x-api/crypto/secure-delegations-manager-test.js.map +1 -1
  83. package/test/icc-x-api/icc-hcparty-x-api-test.js +2 -14
  84. package/test/icc-x-api/icc-hcparty-x-api-test.js.map +1 -1
  85. package/test/icc-x-api/keyless-api.d.ts +1 -0
  86. package/test/icc-x-api/keyless-api.js +125 -0
  87. package/test/icc-x-api/keyless-api.js.map +1 -0
  88. package/test/utils/FakeEncryptionKeysManager.js +1 -1
  89. package/test/utils/FakeEncryptionKeysManager.js.map +1 -1
  90. package/test/utils/FakeExchangeDataManager.d.ts +8 -0
  91. package/test/utils/FakeExchangeDataManager.js +3 -0
  92. package/test/utils/FakeExchangeDataManager.js.map +1 -1
  93. package/test/utils/KeylessCryptoStrategies.d.ts +23 -0
  94. package/test/utils/KeylessCryptoStrategies.js +26 -0
  95. package/test/utils/KeylessCryptoStrategies.js.map +1 -0
  96. package/test/utils/test_utils.d.ts +7 -0
  97. package/test/utils/test_utils.js +30 -1
  98. package/test/utils/test_utils.js.map +1 -1
@@ -181,8 +181,8 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
181
181
  yield initialiseComponents(allowFullExchangeDataLoad);
182
182
  const sfk = primitives.randomUuid();
183
183
  const initialisedCount = exchangeDataApi.callCount;
184
- const createdData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId, false);
185
- const retrievedCachedData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId, false);
184
+ const createdData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId);
185
+ const retrievedCachedData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId);
186
186
  exchangeDataApi.compareCallCountFromBaseline(initialisedCount, {
187
187
  createExchangeData: 1,
188
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
@@ -216,7 +216,7 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
216
216
  var _a;
217
217
  return __awaiter(this, void 0, void 0, function* () {
218
218
  yield initialiseComponents(allowFullExchangeDataLoad);
219
- const createdData = yield exchangeData.getOrCreateEncryptionDataTo(selfId, false);
219
+ const createdData = yield exchangeData.getOrCreateEncryptionDataTo(selfId);
220
220
  (0, chai_1.expect)(createdData.exchangeData.delegator).to.equal(selfId);
221
221
  (0, chai_1.expect)(createdData.exchangeData.delegate).to.equal(selfId);
222
222
  (0, chai_1.expect)(Object.keys((_a = createdData.exchangeData.delegatorSignature) !== null && _a !== void 0 ? _a : {})).to.have.length(1);
@@ -249,7 +249,7 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
249
249
  yield dataOwnerApi.addPublicKeyForOwner(selfId, keyData.pair);
250
250
  yield encryptionKeysManager.addOrUpdateKey(primitives, keyData.pair, false);
251
251
  }
252
- const created = yield exchangeData.getOrCreateEncryptionDataTo(delegateId, false);
252
+ const created = yield exchangeData.getOrCreateEncryptionDataTo(delegateId);
253
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;
254
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;
255
255
  for (const keyData of [{ pair: selfKeypair, fingerprintV2: selfKeyFpV1 }, ...extraDelegatorVerifiedKeys, ...delegateVerifiedKeys]) {
@@ -268,10 +268,10 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
268
268
  function doTest(allowFullExchangeDataLoad) {
269
269
  return __awaiter(this, void 0, void 0, function* () {
270
270
  yield initialiseComponents(allowFullExchangeDataLoad);
271
- const createdData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId, false);
271
+ const createdData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId);
272
272
  yield exchangeData.clearOrRepopulateCache();
273
273
  const countAfterCacheClear = exchangeDataApi.callCount;
274
- const reloadedData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId, false);
274
+ const reloadedData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId);
275
275
  exchangeDataApi.compareCallCountFromBaseline(countAfterCacheClear, {
276
276
  createExchangeData: 0,
277
277
  getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 1,
@@ -291,11 +291,11 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
291
291
  function doTest(allowFullExchangeDataLoad) {
292
292
  return __awaiter(this, void 0, void 0, function* () {
293
293
  yield initialiseComponents(allowFullExchangeDataLoad);
294
- const createdData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId, false);
294
+ const createdData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId);
295
295
  yield encryptionKeysManager.unverifyExistingKeysAndCreateNewVerified(primitives);
296
296
  yield exchangeData.clearOrRepopulateCache();
297
297
  const countAfterCacheClear = exchangeDataApi.callCount;
298
- const newData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId, false);
298
+ const newData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId);
299
299
  exchangeDataApi.compareCallCountFromBaseline(countAfterCacheClear, {
300
300
  createExchangeData: 1,
301
301
  getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 1,
@@ -318,12 +318,12 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
318
318
  return __awaiter(this, void 0, void 0, function* () {
319
319
  yield initialiseComponents(allowFullExchangeDataLoad);
320
320
  const sfk = primitives.randomUuid();
321
- const createdData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId, false);
321
+ const createdData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId);
322
322
  // Tamper with exchange data
323
323
  yield exchangeDataApi.modifyExchangeData(yield tamper(createdData.exchangeData, selfKeypair, selfKeyFpV2));
324
324
  yield exchangeData.clearOrRepopulateCache();
325
325
  const countAfterCacheClear = exchangeDataApi.callCount;
326
- const newData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId, false);
326
+ const newData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId);
327
327
  exchangeDataApi.compareCallCountFromBaseline(countAfterCacheClear, {
328
328
  createExchangeData: 1,
329
329
  getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 1,
@@ -366,13 +366,13 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
366
366
  function doTest(allowFullExchangeDataLoad) {
367
367
  return __awaiter(this, void 0, void 0, function* () {
368
368
  yield initialiseComponents(allowFullExchangeDataLoad);
369
- const createdData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId, false);
369
+ const createdData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId);
370
370
  // Tamper with exchange data
371
371
  yield exchangeDataApi.modifyExchangeData(Object.assign(Object.assign({}, createdData.exchangeData), { delegate: delegate2Id }));
372
372
  yield exchangeData.clearOrRepopulateCache();
373
373
  const countAfterCacheClear = exchangeDataApi.callCount;
374
- const newDataToDelegate = yield exchangeData.getOrCreateEncryptionDataTo(delegateId, false);
375
- const newDataToDelegate2 = yield exchangeData.getOrCreateEncryptionDataTo(delegate2Id, false);
374
+ const newDataToDelegate = yield exchangeData.getOrCreateEncryptionDataTo(delegateId);
375
+ const newDataToDelegate2 = yield exchangeData.getOrCreateEncryptionDataTo(delegate2Id);
376
376
  exchangeDataApi.compareCallCountFromBaseline(countAfterCacheClear, {
377
377
  createExchangeData: 2,
378
378
  getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 2,
@@ -401,7 +401,7 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
401
401
  function doTest(allowFullExchangeDataLoad) {
402
402
  return __awaiter(this, void 0, void 0, function* () {
403
403
  yield initialiseComponents(allowFullExchangeDataLoad);
404
- const createdData1 = yield exchangeData.getOrCreateEncryptionDataTo(delegateId, false);
404
+ const createdData1 = yield exchangeData.getOrCreateEncryptionDataTo(delegateId);
405
405
  const createdData2 = yield createDataFromRandomToSelf();
406
406
  yield encryptionKeysManager.unverifyExistingKeysAndCreateNewVerified(primitives);
407
407
  yield exchangeData.clearOrRepopulateCache();
@@ -418,7 +418,7 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
418
418
  function doTest(allowFullExchangeDataLoad) {
419
419
  return __awaiter(this, void 0, void 0, function* () {
420
420
  yield initialiseComponents(allowFullExchangeDataLoad);
421
- const createdData1 = yield exchangeData.getOrCreateEncryptionDataTo(delegateId, false);
421
+ const createdData1 = yield exchangeData.getOrCreateEncryptionDataTo(delegateId);
422
422
  const hashes1 = yield accessControlSecretUtils.allSecureDelegationKeysFor(createdData1.accessControlSecret);
423
423
  const retrievedKeys1 = yield exchangeData.getCachedDecryptionDataKeyByAccessControlHash(hashes1);
424
424
  for (const hash of hashes1) {
@@ -444,7 +444,7 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
444
444
  function doTest(allowFullExchangeDataLoad) {
445
445
  return __awaiter(this, void 0, void 0, function* () {
446
446
  yield initialiseComponents(allowFullExchangeDataLoad);
447
- const createdBySelf = yield exchangeData.getOrCreateEncryptionDataTo(selfId, false);
447
+ const createdBySelf = yield exchangeData.getOrCreateEncryptionDataTo(selfId);
448
448
  const createdByOther = yield createDataFromRandomToSelf();
449
449
  const newKey = yield primitives.RSA.generateKeyPair(icc_x_api_1.ShaVersion.Sha256);
450
450
  yield dataOwnerApi.addPublicKeyForOwner(selfId, newKey);
@@ -471,7 +471,7 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
471
471
  function doTest(allowFullExchangeDataLoad) {
472
472
  return __awaiter(this, void 0, void 0, function* () {
473
473
  yield initialiseComponents(allowFullExchangeDataLoad);
474
- const createdBySelf = yield exchangeData.getOrCreateEncryptionDataTo(selfId, false);
474
+ const createdBySelf = yield exchangeData.getOrCreateEncryptionDataTo(selfId);
475
475
  const createdByOther = yield createDataFromRandomToSelf();
476
476
  yield encryptionKeysManager.addOrUpdateKey(primitives, selfKeypair, false);
477
477
  yield exchangeData.clearOrRepopulateCache();
@@ -496,7 +496,7 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
496
496
  yield checkDataEqual((yield exchangeData.getCachedDecryptionDataKeyByAccessControlHash([hash]))[hash], data);
497
497
  }
498
498
  if (data.exchangeData.delegator === selfId) {
499
- yield checkDataEqual(yield exchangeData.getOrCreateEncryptionDataTo(data.exchangeData.delegate, false), data);
499
+ yield checkDataEqual(yield exchangeData.getOrCreateEncryptionDataTo(data.exchangeData.delegate), data);
500
500
  }
501
501
  yield checkDataEqual((yield exchangeData.getDecryptionDataKeyByIds([data.exchangeData.id], true))[data.exchangeData.id], data);
502
502
  exchangeDataApi.compareCallCountFromBaseline(apiCallsBaseline, {
@@ -516,7 +516,7 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
516
516
  (0, chai_1.expect)(Object.keys(yield exchangeData.getCachedDecryptionDataKeyByAccessControlHash([hash]))).to.have.length(0);
517
517
  }
518
518
  if (data.exchangeData.delegator === selfId) {
519
- yield checkDataEqual(yield exchangeData.getOrCreateEncryptionDataTo(data.exchangeData.delegate, false), data);
519
+ yield checkDataEqual(yield exchangeData.getOrCreateEncryptionDataTo(data.exchangeData.delegate), data);
520
520
  exchangeDataApi.compareCallCountFromBaseline(apiCallsBaseline, {
521
521
  getExchangeDataByIds: 0,
522
522
  createExchangeData: 0,
@@ -537,8 +537,8 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
537
537
  }
538
538
  });
539
539
  }
540
- const createdBySelf1 = yield exchangeData.getOrCreateEncryptionDataTo(selfId, false);
541
- const createdBySelf2 = yield exchangeData.getOrCreateEncryptionDataTo(delegateId, false);
540
+ const createdBySelf1 = yield exchangeData.getOrCreateEncryptionDataTo(selfId);
541
+ const createdBySelf2 = yield exchangeData.getOrCreateEncryptionDataTo(delegateId);
542
542
  const createdByOther1 = yield createDataFromRandomToSelf(); // Not automatically cached: created by someone else
543
543
  const createdByOther2 = yield createDataFromRandomToSelf(); // Not automatically cached: created by someone else
544
544
  // noinspection DuplicatedCode
@@ -574,7 +574,7 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
574
574
  it('implementation with unlimited cache should preload all existing exchange data on creation', function () {
575
575
  return __awaiter(this, void 0, void 0, function* () {
576
576
  yield initialiseComponents(true);
577
- const createdBySelf = yield exchangeData.getOrCreateEncryptionDataTo(selfId, false);
577
+ const createdBySelf = yield exchangeData.getOrCreateEncryptionDataTo(selfId);
578
578
  const createdByOther = yield createDataFromRandomToSelf();
579
579
  const recreatedExchangeData = yield (0, ExchangeDataManager_1.initialiseExchangeDataManagerForCurrentDataOwner)(baseExchangeData, encryptionKeysManager, accessControlSecretUtils, new TestCryptoStrategies_1.TestCryptoStrategies(), dataOwnerApi, primitives, true);
580
580
  const apiCallsAfterCreation = exchangeDataApi.callCount;
@@ -605,8 +605,8 @@ let env;
605
605
  return __awaiter(this, void 0, void 0, function* () {
606
606
  const hcp1Details = yield (0, test_utils_1.createNewHcpApi)(env);
607
607
  const hcp2Details = yield (0, test_utils_1.createNewHcpApi)(env);
608
- const ed1to2 = yield hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId, false);
609
- 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);
610
610
  yield hcp1Details.api.cryptoApi.exchangeData.clearOrRepopulateCache();
611
611
  yield hcp2Details.api.cryptoApi.exchangeData.clearOrRepopulateCache();
612
612
  const newKeyPair = yield hcp1Details.api.cryptoApi.primitives.RSA.generateKeyPair(icc_x_api_1.ShaVersion.Sha256);
@@ -616,8 +616,8 @@ let env;
616
616
  yield hcp1Details.api.cryptoApi.exchangeData.giveAccessBackTo(hcp2Details.credentials.dataOwnerId, exportedPub);
617
617
  yield hcp1Details.api.cryptoApi.exchangeData.clearOrRepopulateCache();
618
618
  yield hcp2Details.api.cryptoApi.exchangeData.clearOrRepopulateCache();
619
- const updatedEd1to2 = yield hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId, false);
620
- 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);
621
621
  (0, chai_1.expect)(updatedEd1to2.exchangeData.id).to.equal(ed1to2.exchangeData.id);
622
622
  (0, chai_1.expect)(Object.keys(updatedEd2to1.exchangeData.exchangeKey).length).to.be.greaterThan(Object.keys(ed2to1.exchangeData.exchangeKey).length);
623
623
  (0, chai_1.expect)(Object.keys(updatedEd2to1.exchangeData.exchangeKey).length).to.equal(Object.keys(updatedEd2to1.exchangeData.accessControlSecret).length);
@@ -632,8 +632,8 @@ let env;
632
632
  return __awaiter(this, void 0, void 0, function* () {
633
633
  const hcp1Details = yield (0, test_utils_1.createNewHcpApi)(env);
634
634
  const hcp2Details = yield (0, test_utils_1.createNewHcpApi)(env);
635
- const ed1to2 = yield hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId, false);
636
- 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);
637
637
  yield hcp1Details.api.cryptoApi.exchangeData.clearOrRepopulateCache();
638
638
  yield hcp2Details.api.cryptoApi.exchangeData.clearOrRepopulateCache();
639
639
  const exchangeDataApi = new IccExchangeDataApi_1.IccExchangeDataApi(env.iCureUrl, {}, hcp1Details.api.authApi.authenticationProvider, fetch);
@@ -655,8 +655,8 @@ let env;
655
655
  yield hcp1Details.api.cryptoApi.exchangeData.giveAccessBackTo(hcp2Details.credentials.dataOwnerId, exportedPub);
656
656
  yield hcp1Details.api.cryptoApi.exchangeData.clearOrRepopulateCache();
657
657
  yield hcp2Details.api.cryptoApi.exchangeData.clearOrRepopulateCache();
658
- const updatedEd1to2 = yield hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId, false);
659
- 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);
660
660
  (0, chai_1.expect)(updatedEd1to2.exchangeData.id).to.not.equal(ed1to2.exchangeData.id);
661
661
  (0, chai_1.expect)(updatedEd2to1.exchangeData.id).to.not.equal(ed2to1.exchangeData.id);
662
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":"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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)\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"]}
@@ -187,7 +187,7 @@ var EntryUpdateTypeEnum = EntitySharedMetadataUpdateRequest_1.EntitySharedMetada
187
187
  yield initialiseComponents(false, false);
188
188
  const canonicalSfk = primitives.randomUuid();
189
189
  const aliasSfk = primitives.randomUuid();
190
- const exchangeDataInfo = yield exchangeData.getOrCreateEncryptionDataTo(delegateId, false);
190
+ const exchangeDataInfo = yield exchangeData.getOrCreateEncryptionDataTo(delegateId);
191
191
  const canonicalKey = yield accessControlSecretUtils.secureDelegationKeyFor(exchangeDataInfo.accessControlSecret, icc_x_api_1.EntityWithDelegationTypeName.Patient);
192
192
  const aliasKey = yield accessControlSecretUtils.secureDelegationKeyFor(exchangeDataInfo.accessControlSecret, icc_x_api_1.EntityWithDelegationTypeName.Patient);
193
193
  const existingSecretIds = [(0, icc_x_api_1.ua2hex)(primitives.randomBytes(16))];
@@ -246,7 +246,7 @@ var EntryUpdateTypeEnum = EntitySharedMetadataUpdateRequest_1.EntitySharedMetada
246
246
  return __awaiter(this, void 0, void 0, function* () {
247
247
  yield initialiseComponents(false, false);
248
248
  const canonicalSfk = primitives.randomUuid();
249
- const exchangeDataInfo = yield exchangeData.getOrCreateEncryptionDataTo(delegateId, false);
249
+ const exchangeDataInfo = yield exchangeData.getOrCreateEncryptionDataTo(delegateId);
250
250
  const canonicalKey = yield accessControlSecretUtils.secureDelegationKeyFor(exchangeDataInfo.accessControlSecret, icc_x_api_1.EntityWithDelegationTypeName.Patient);
251
251
  const existingSecretIds = [(0, icc_x_api_1.ua2hex)(primitives.randomBytes(16))];
252
252
  const existingEncryptionKeys = [];