@icure/api 8.1.8 → 8.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/icc-api/model/RouteOfAdministration.d.ts +0 -1
- package/icc-api/model/RouteOfAdministration.js.map +1 -1
- package/icc-api/model/Vmp.d.ts +0 -2
- package/icc-api/model/Vmp.js.map +1 -1
- package/icc-api/model/VmpGroup.d.ts +0 -2
- package/icc-api/model/VmpGroup.js.map +1 -1
- package/icc-api/model/internal/ExchangeData.d.ts +1 -1
- package/icc-api/model/internal/ExchangeData.js +1 -7
- package/icc-api/model/internal/ExchangeData.js.map +1 -1
- package/icc-x-api/crypto/BaseExchangeDataManager.d.ts +19 -9
- package/icc-x-api/crypto/BaseExchangeDataManager.js +27 -6
- package/icc-x-api/crypto/BaseExchangeDataManager.js.map +1 -1
- package/icc-x-api/crypto/CryptoStrategies.d.ts +2 -1
- package/icc-x-api/crypto/CryptoStrategies.js.map +1 -1
- package/icc-x-api/crypto/DelegationsDeAnonymization.js +1 -1
- package/icc-x-api/crypto/DelegationsDeAnonymization.js.map +1 -1
- package/icc-x-api/crypto/ExchangeDataManager.d.ts +25 -2
- package/icc-x-api/crypto/ExchangeDataManager.js +98 -5
- package/icc-x-api/crypto/ExchangeDataManager.js.map +1 -1
- package/icc-x-api/crypto/ExtendedApisUtils.d.ts +3 -1
- package/icc-x-api/crypto/ExtendedApisUtils.js.map +1 -1
- package/icc-x-api/crypto/ExtendedApisUtilsImpl.d.ts +1 -1
- package/icc-x-api/crypto/ExtendedApisUtilsImpl.js +3 -3
- package/icc-x-api/crypto/ExtendedApisUtilsImpl.js.map +1 -1
- package/icc-x-api/crypto/SecureDelegationsManager.d.ts +3 -1
- package/icc-x-api/crypto/SecureDelegationsManager.js +10 -6
- package/icc-x-api/crypto/SecureDelegationsManager.js.map +1 -1
- package/icc-x-api/crypto/ShamirKeysManager.js +1 -1
- package/icc-x-api/crypto/ShamirKeysManager.js.map +1 -1
- package/icc-x-api/crypto/UserEncryptionKeysManager.js +4 -0
- package/icc-x-api/crypto/UserEncryptionKeysManager.js.map +1 -1
- package/icc-x-api/crypto/utils.js +1 -1
- package/icc-x-api/crypto/utils.js.map +1 -1
- package/icc-x-api/icc-accesslog-x-api.d.ts +6 -0
- package/icc-x-api/icc-accesslog-x-api.js +6 -2
- package/icc-x-api/icc-accesslog-x-api.js.map +1 -1
- package/icc-x-api/icc-bekmehr-x-api.js +1 -1
- package/icc-x-api/icc-bekmehr-x-api.js.map +1 -1
- package/icc-x-api/icc-calendar-item-x-api.d.ts +4 -0
- package/icc-x-api/icc-calendar-item-x-api.js +3 -1
- package/icc-x-api/icc-calendar-item-x-api.js.map +1 -1
- package/icc-x-api/icc-classification-x-api.d.ts +3 -0
- package/icc-x-api/icc-classification-x-api.js +3 -1
- package/icc-x-api/icc-classification-x-api.js.map +1 -1
- package/icc-x-api/icc-contact-x-api.d.ts +3 -0
- package/icc-x-api/icc-contact-x-api.js +3 -1
- package/icc-x-api/icc-contact-x-api.js.map +1 -1
- package/icc-x-api/icc-crypto-x-api.d.ts +29 -0
- package/icc-x-api/icc-crypto-x-api.js +36 -0
- package/icc-x-api/icc-crypto-x-api.js.map +1 -1
- package/icc-x-api/icc-document-x-api.d.ts +3 -0
- package/icc-x-api/icc-document-x-api.js +3 -1
- package/icc-x-api/icc-document-x-api.js.map +1 -1
- package/icc-x-api/icc-form-x-api.d.ts +3 -0
- package/icc-x-api/icc-form-x-api.js +3 -1
- package/icc-x-api/icc-form-x-api.js.map +1 -1
- package/icc-x-api/icc-helement-x-api.d.ts +3 -0
- package/icc-x-api/icc-helement-x-api.js +3 -1
- package/icc-x-api/icc-helement-x-api.js.map +1 -1
- package/icc-x-api/icc-invoice-x-api.d.ts +3 -0
- package/icc-x-api/icc-invoice-x-api.js +3 -1
- package/icc-x-api/icc-invoice-x-api.js.map +1 -1
- package/icc-x-api/icc-maintenance-task-x-api.d.ts +3 -0
- package/icc-x-api/icc-maintenance-task-x-api.js +3 -1
- package/icc-x-api/icc-maintenance-task-x-api.js.map +1 -1
- package/icc-x-api/icc-message-x-api.d.ts +3 -0
- package/icc-x-api/icc-message-x-api.js +3 -1
- package/icc-x-api/icc-message-x-api.js.map +1 -1
- package/icc-x-api/icc-patient-x-api.d.ts +3 -0
- package/icc-x-api/icc-patient-x-api.js +6 -2
- package/icc-x-api/icc-patient-x-api.js.map +1 -1
- package/icc-x-api/icc-receipt-x-api.d.ts +3 -0
- package/icc-x-api/icc-receipt-x-api.js +3 -1
- package/icc-x-api/icc-receipt-x-api.js.map +1 -1
- package/icc-x-api/icc-recovery-x-api.js +8 -1
- package/icc-x-api/icc-recovery-x-api.js.map +1 -1
- package/icc-x-api/icc-time-table-x-api.d.ts +3 -0
- package/icc-x-api/icc-time-table-x-api.js +3 -1
- package/icc-x-api/icc-time-table-x-api.js.map +1 -1
- package/icc-x-api/icc-topic-x-api.d.ts +3 -0
- package/icc-x-api/icc-topic-x-api.js +3 -1
- package/icc-x-api/icc-topic-x-api.js.map +1 -1
- package/icc-x-api/index.d.ts +16 -0
- package/icc-x-api/index.js +7 -1
- package/icc-x-api/index.js.map +1 -1
- package/icc-x-api/utils/websocket.d.ts +1 -0
- package/package.json +1 -1
- package/test/icc-x-api/autofix-anonymity-test.js +18 -4
- package/test/icc-x-api/autofix-anonymity-test.js.map +1 -1
- package/test/icc-x-api/crypto/exchange-data-manager-test.js +34 -32
- package/test/icc-x-api/crypto/exchange-data-manager-test.js.map +1 -1
- package/test/icc-x-api/crypto/secure-delegations-manager-test.js +2 -2
- package/test/icc-x-api/crypto/secure-delegations-manager-test.js.map +1 -1
- package/test/icc-x-api/icc-hcparty-x-api-test.js +2 -14
- package/test/icc-x-api/icc-hcparty-x-api-test.js.map +1 -1
- package/test/icc-x-api/keyless-api.d.ts +1 -0
- package/test/icc-x-api/keyless-api.js +125 -0
- package/test/icc-x-api/keyless-api.js.map +1 -0
- package/test/utils/FakeExchangeDataManager.d.ts +8 -0
- package/test/utils/FakeExchangeDataManager.js +3 -0
- package/test/utils/FakeExchangeDataManager.js.map +1 -1
- package/test/utils/KeylessCryptoStrategies.d.ts +23 -0
- package/test/utils/KeylessCryptoStrategies.js +26 -0
- package/test/utils/KeylessCryptoStrategies.js.map +1 -0
- package/test/utils/test_utils.d.ts +7 -0
- package/test/utils/test_utils.js +30 -1
- package/test/utils/test_utils.js.map +1 -1
|
@@ -176,12 +176,13 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
|
|
|
176
176
|
it('should create new encryption keys when none is available', function () {
|
|
177
177
|
return __awaiter(this, void 0, void 0, function* () {
|
|
178
178
|
function doTest(allowFullExchangeDataLoad) {
|
|
179
|
+
var _a;
|
|
179
180
|
return __awaiter(this, void 0, void 0, function* () {
|
|
180
181
|
yield initialiseComponents(allowFullExchangeDataLoad);
|
|
181
182
|
const sfk = primitives.randomUuid();
|
|
182
183
|
const initialisedCount = exchangeDataApi.callCount;
|
|
183
|
-
const createdData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId
|
|
184
|
-
const retrievedCachedData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId
|
|
184
|
+
const createdData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId);
|
|
185
|
+
const retrievedCachedData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId);
|
|
185
186
|
exchangeDataApi.compareCallCountFromBaseline(initialisedCount, {
|
|
186
187
|
createExchangeData: 1,
|
|
187
188
|
// If we could fully preload we already know whether the exchange key already exists or not, otherwise we have to request from the api
|
|
@@ -199,7 +200,7 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
|
|
|
199
200
|
(0, chai_1.expect)(decryptedAccessControlSecretByDelegate.successfulDecryptions[0]).to.equal(createdData.accessControlSecret);
|
|
200
201
|
(0, chai_1.expect)(retrievedCachedData.exchangeData.delegator).to.equal(selfId);
|
|
201
202
|
(0, chai_1.expect)(retrievedCachedData.exchangeData.delegate).to.equal(delegateId);
|
|
202
|
-
(0, chai_1.expect)(Object.keys(retrievedCachedData.exchangeData.delegatorSignature)).to.have.length(1);
|
|
203
|
+
(0, chai_1.expect)(Object.keys((_a = retrievedCachedData.exchangeData.delegatorSignature) !== null && _a !== void 0 ? _a : {})).to.have.length(1);
|
|
203
204
|
(0, chai_1.expect)(Object.keys(retrievedCachedData.exchangeData.exchangeKey)).to.have.length(2);
|
|
204
205
|
(0, chai_1.expect)(Object.keys(retrievedCachedData.exchangeData.accessControlSecret)).to.have.length(2);
|
|
205
206
|
(0, chai_1.expect)(Object.keys(retrievedCachedData.exchangeData.sharedSignatureKey)).to.have.length(2);
|
|
@@ -212,12 +213,13 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
|
|
|
212
213
|
it('should create encryption keys to self when none is available', function () {
|
|
213
214
|
return __awaiter(this, void 0, void 0, function* () {
|
|
214
215
|
function doTest(allowFullExchangeDataLoad) {
|
|
216
|
+
var _a;
|
|
215
217
|
return __awaiter(this, void 0, void 0, function* () {
|
|
216
218
|
yield initialiseComponents(allowFullExchangeDataLoad);
|
|
217
|
-
const createdData = yield exchangeData.getOrCreateEncryptionDataTo(selfId
|
|
219
|
+
const createdData = yield exchangeData.getOrCreateEncryptionDataTo(selfId);
|
|
218
220
|
(0, chai_1.expect)(createdData.exchangeData.delegator).to.equal(selfId);
|
|
219
221
|
(0, chai_1.expect)(createdData.exchangeData.delegate).to.equal(selfId);
|
|
220
|
-
(0, chai_1.expect)(Object.keys(createdData.exchangeData.delegatorSignature)).to.have.length(1);
|
|
222
|
+
(0, chai_1.expect)(Object.keys((_a = createdData.exchangeData.delegatorSignature) !== null && _a !== void 0 ? _a : {})).to.have.length(1);
|
|
221
223
|
(0, chai_1.expect)(Object.keys(createdData.exchangeData.sharedSignatureKey)).to.have.length(1);
|
|
222
224
|
(0, chai_1.expect)(Object.keys(createdData.exchangeData.exchangeKey)).to.have.length(1);
|
|
223
225
|
(0, chai_1.expect)(Object.keys(createdData.exchangeData.accessControlSecret)).to.have.length(1);
|
|
@@ -247,7 +249,7 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
|
|
|
247
249
|
yield dataOwnerApi.addPublicKeyForOwner(selfId, keyData.pair);
|
|
248
250
|
yield encryptionKeysManager.addOrUpdateKey(primitives, keyData.pair, false);
|
|
249
251
|
}
|
|
250
|
-
const created = yield exchangeData.getOrCreateEncryptionDataTo(delegateId
|
|
252
|
+
const created = yield exchangeData.getOrCreateEncryptionDataTo(delegateId);
|
|
251
253
|
(0, chai_1.expect)((0, collection_utils_1.setEquals)(new Set(Object.keys(created.exchangeData.exchangeKey)), new Set(Object.keys(created.exchangeData.accessControlSecret))), 'Keys used for encryption of exchange key and access control secret must be the same.').to.be.true;
|
|
252
254
|
(0, chai_1.expect)((0, collection_utils_1.setEquals)(new Set(Object.keys(created.exchangeData.exchangeKey)), new Set([...delegateVerifiedKeys.map((x) => x.fingerprintV2), ...extraDelegatorVerifiedKeys.map((x) => x.fingerprintV2), selfKeyFpV2])), 'Only verified keys of delegate and delegator should be used for encryption of exchange key and access control secret.').to.be.true;
|
|
253
255
|
for (const keyData of [{ pair: selfKeypair, fingerprintV2: selfKeyFpV1 }, ...extraDelegatorVerifiedKeys, ...delegateVerifiedKeys]) {
|
|
@@ -266,10 +268,10 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
|
|
|
266
268
|
function doTest(allowFullExchangeDataLoad) {
|
|
267
269
|
return __awaiter(this, void 0, void 0, function* () {
|
|
268
270
|
yield initialiseComponents(allowFullExchangeDataLoad);
|
|
269
|
-
const createdData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId
|
|
271
|
+
const createdData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId);
|
|
270
272
|
yield exchangeData.clearOrRepopulateCache();
|
|
271
273
|
const countAfterCacheClear = exchangeDataApi.callCount;
|
|
272
|
-
const reloadedData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId
|
|
274
|
+
const reloadedData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId);
|
|
273
275
|
exchangeDataApi.compareCallCountFromBaseline(countAfterCacheClear, {
|
|
274
276
|
createExchangeData: 0,
|
|
275
277
|
getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 1,
|
|
@@ -289,11 +291,11 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
|
|
|
289
291
|
function doTest(allowFullExchangeDataLoad) {
|
|
290
292
|
return __awaiter(this, void 0, void 0, function* () {
|
|
291
293
|
yield initialiseComponents(allowFullExchangeDataLoad);
|
|
292
|
-
const createdData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId
|
|
294
|
+
const createdData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId);
|
|
293
295
|
yield encryptionKeysManager.unverifyExistingKeysAndCreateNewVerified(primitives);
|
|
294
296
|
yield exchangeData.clearOrRepopulateCache();
|
|
295
297
|
const countAfterCacheClear = exchangeDataApi.callCount;
|
|
296
|
-
const newData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId
|
|
298
|
+
const newData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId);
|
|
297
299
|
exchangeDataApi.compareCallCountFromBaseline(countAfterCacheClear, {
|
|
298
300
|
createExchangeData: 1,
|
|
299
301
|
getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 1,
|
|
@@ -316,12 +318,12 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
|
|
|
316
318
|
return __awaiter(this, void 0, void 0, function* () {
|
|
317
319
|
yield initialiseComponents(allowFullExchangeDataLoad);
|
|
318
320
|
const sfk = primitives.randomUuid();
|
|
319
|
-
const createdData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId
|
|
321
|
+
const createdData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId);
|
|
320
322
|
// Tamper with exchange data
|
|
321
323
|
yield exchangeDataApi.modifyExchangeData(yield tamper(createdData.exchangeData, selfKeypair, selfKeyFpV2));
|
|
322
324
|
yield exchangeData.clearOrRepopulateCache();
|
|
323
325
|
const countAfterCacheClear = exchangeDataApi.callCount;
|
|
324
|
-
const newData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId
|
|
326
|
+
const newData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId);
|
|
325
327
|
exchangeDataApi.compareCallCountFromBaseline(countAfterCacheClear, {
|
|
326
328
|
createExchangeData: 1,
|
|
327
329
|
getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 1,
|
|
@@ -364,13 +366,13 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
|
|
|
364
366
|
function doTest(allowFullExchangeDataLoad) {
|
|
365
367
|
return __awaiter(this, void 0, void 0, function* () {
|
|
366
368
|
yield initialiseComponents(allowFullExchangeDataLoad);
|
|
367
|
-
const createdData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId
|
|
369
|
+
const createdData = yield exchangeData.getOrCreateEncryptionDataTo(delegateId);
|
|
368
370
|
// Tamper with exchange data
|
|
369
371
|
yield exchangeDataApi.modifyExchangeData(Object.assign(Object.assign({}, createdData.exchangeData), { delegate: delegate2Id }));
|
|
370
372
|
yield exchangeData.clearOrRepopulateCache();
|
|
371
373
|
const countAfterCacheClear = exchangeDataApi.callCount;
|
|
372
|
-
const newDataToDelegate = yield exchangeData.getOrCreateEncryptionDataTo(delegateId
|
|
373
|
-
const newDataToDelegate2 = yield exchangeData.getOrCreateEncryptionDataTo(delegate2Id
|
|
374
|
+
const newDataToDelegate = yield exchangeData.getOrCreateEncryptionDataTo(delegateId);
|
|
375
|
+
const newDataToDelegate2 = yield exchangeData.getOrCreateEncryptionDataTo(delegate2Id);
|
|
374
376
|
exchangeDataApi.compareCallCountFromBaseline(countAfterCacheClear, {
|
|
375
377
|
createExchangeData: 2,
|
|
376
378
|
getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 2,
|
|
@@ -399,7 +401,7 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
|
|
|
399
401
|
function doTest(allowFullExchangeDataLoad) {
|
|
400
402
|
return __awaiter(this, void 0, void 0, function* () {
|
|
401
403
|
yield initialiseComponents(allowFullExchangeDataLoad);
|
|
402
|
-
const createdData1 = yield exchangeData.getOrCreateEncryptionDataTo(delegateId
|
|
404
|
+
const createdData1 = yield exchangeData.getOrCreateEncryptionDataTo(delegateId);
|
|
403
405
|
const createdData2 = yield createDataFromRandomToSelf();
|
|
404
406
|
yield encryptionKeysManager.unverifyExistingKeysAndCreateNewVerified(primitives);
|
|
405
407
|
yield exchangeData.clearOrRepopulateCache();
|
|
@@ -416,7 +418,7 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
|
|
|
416
418
|
function doTest(allowFullExchangeDataLoad) {
|
|
417
419
|
return __awaiter(this, void 0, void 0, function* () {
|
|
418
420
|
yield initialiseComponents(allowFullExchangeDataLoad);
|
|
419
|
-
const createdData1 = yield exchangeData.getOrCreateEncryptionDataTo(delegateId
|
|
421
|
+
const createdData1 = yield exchangeData.getOrCreateEncryptionDataTo(delegateId);
|
|
420
422
|
const hashes1 = yield accessControlSecretUtils.allSecureDelegationKeysFor(createdData1.accessControlSecret);
|
|
421
423
|
const retrievedKeys1 = yield exchangeData.getCachedDecryptionDataKeyByAccessControlHash(hashes1);
|
|
422
424
|
for (const hash of hashes1) {
|
|
@@ -442,7 +444,7 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
|
|
|
442
444
|
function doTest(allowFullExchangeDataLoad) {
|
|
443
445
|
return __awaiter(this, void 0, void 0, function* () {
|
|
444
446
|
yield initialiseComponents(allowFullExchangeDataLoad);
|
|
445
|
-
const createdBySelf = yield exchangeData.getOrCreateEncryptionDataTo(selfId
|
|
447
|
+
const createdBySelf = yield exchangeData.getOrCreateEncryptionDataTo(selfId);
|
|
446
448
|
const createdByOther = yield createDataFromRandomToSelf();
|
|
447
449
|
const newKey = yield primitives.RSA.generateKeyPair(icc_x_api_1.ShaVersion.Sha256);
|
|
448
450
|
yield dataOwnerApi.addPublicKeyForOwner(selfId, newKey);
|
|
@@ -469,7 +471,7 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
|
|
|
469
471
|
function doTest(allowFullExchangeDataLoad) {
|
|
470
472
|
return __awaiter(this, void 0, void 0, function* () {
|
|
471
473
|
yield initialiseComponents(allowFullExchangeDataLoad);
|
|
472
|
-
const createdBySelf = yield exchangeData.getOrCreateEncryptionDataTo(selfId
|
|
474
|
+
const createdBySelf = yield exchangeData.getOrCreateEncryptionDataTo(selfId);
|
|
473
475
|
const createdByOther = yield createDataFromRandomToSelf();
|
|
474
476
|
yield encryptionKeysManager.addOrUpdateKey(primitives, selfKeypair, false);
|
|
475
477
|
yield exchangeData.clearOrRepopulateCache();
|
|
@@ -494,7 +496,7 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
|
|
|
494
496
|
yield checkDataEqual((yield exchangeData.getCachedDecryptionDataKeyByAccessControlHash([hash]))[hash], data);
|
|
495
497
|
}
|
|
496
498
|
if (data.exchangeData.delegator === selfId) {
|
|
497
|
-
yield checkDataEqual(yield exchangeData.getOrCreateEncryptionDataTo(data.exchangeData.delegate
|
|
499
|
+
yield checkDataEqual(yield exchangeData.getOrCreateEncryptionDataTo(data.exchangeData.delegate), data);
|
|
498
500
|
}
|
|
499
501
|
yield checkDataEqual((yield exchangeData.getDecryptionDataKeyByIds([data.exchangeData.id], true))[data.exchangeData.id], data);
|
|
500
502
|
exchangeDataApi.compareCallCountFromBaseline(apiCallsBaseline, {
|
|
@@ -514,7 +516,7 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
|
|
|
514
516
|
(0, chai_1.expect)(Object.keys(yield exchangeData.getCachedDecryptionDataKeyByAccessControlHash([hash]))).to.have.length(0);
|
|
515
517
|
}
|
|
516
518
|
if (data.exchangeData.delegator === selfId) {
|
|
517
|
-
yield checkDataEqual(yield exchangeData.getOrCreateEncryptionDataTo(data.exchangeData.delegate
|
|
519
|
+
yield checkDataEqual(yield exchangeData.getOrCreateEncryptionDataTo(data.exchangeData.delegate), data);
|
|
518
520
|
exchangeDataApi.compareCallCountFromBaseline(apiCallsBaseline, {
|
|
519
521
|
getExchangeDataByIds: 0,
|
|
520
522
|
createExchangeData: 0,
|
|
@@ -535,8 +537,8 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
|
|
|
535
537
|
}
|
|
536
538
|
});
|
|
537
539
|
}
|
|
538
|
-
const createdBySelf1 = yield exchangeData.getOrCreateEncryptionDataTo(selfId
|
|
539
|
-
const createdBySelf2 = yield exchangeData.getOrCreateEncryptionDataTo(delegateId
|
|
540
|
+
const createdBySelf1 = yield exchangeData.getOrCreateEncryptionDataTo(selfId);
|
|
541
|
+
const createdBySelf2 = yield exchangeData.getOrCreateEncryptionDataTo(delegateId);
|
|
540
542
|
const createdByOther1 = yield createDataFromRandomToSelf(); // Not automatically cached: created by someone else
|
|
541
543
|
const createdByOther2 = yield createDataFromRandomToSelf(); // Not automatically cached: created by someone else
|
|
542
544
|
// noinspection DuplicatedCode
|
|
@@ -572,7 +574,7 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
|
|
|
572
574
|
it('implementation with unlimited cache should preload all existing exchange data on creation', function () {
|
|
573
575
|
return __awaiter(this, void 0, void 0, function* () {
|
|
574
576
|
yield initialiseComponents(true);
|
|
575
|
-
const createdBySelf = yield exchangeData.getOrCreateEncryptionDataTo(selfId
|
|
577
|
+
const createdBySelf = yield exchangeData.getOrCreateEncryptionDataTo(selfId);
|
|
576
578
|
const createdByOther = yield createDataFromRandomToSelf();
|
|
577
579
|
const recreatedExchangeData = yield (0, ExchangeDataManager_1.initialiseExchangeDataManagerForCurrentDataOwner)(baseExchangeData, encryptionKeysManager, accessControlSecretUtils, new TestCryptoStrategies_1.TestCryptoStrategies(), dataOwnerApi, primitives, true);
|
|
578
580
|
const apiCallsAfterCreation = exchangeDataApi.callCount;
|
|
@@ -603,8 +605,8 @@ let env;
|
|
|
603
605
|
return __awaiter(this, void 0, void 0, function* () {
|
|
604
606
|
const hcp1Details = yield (0, test_utils_1.createNewHcpApi)(env);
|
|
605
607
|
const hcp2Details = yield (0, test_utils_1.createNewHcpApi)(env);
|
|
606
|
-
const ed1to2 = yield hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId
|
|
607
|
-
const ed2to1 = yield hcp2Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp1Details.credentials.dataOwnerId
|
|
608
|
+
const ed1to2 = yield hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId);
|
|
609
|
+
const ed2to1 = yield hcp2Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp1Details.credentials.dataOwnerId);
|
|
608
610
|
yield hcp1Details.api.cryptoApi.exchangeData.clearOrRepopulateCache();
|
|
609
611
|
yield hcp2Details.api.cryptoApi.exchangeData.clearOrRepopulateCache();
|
|
610
612
|
const newKeyPair = yield hcp1Details.api.cryptoApi.primitives.RSA.generateKeyPair(icc_x_api_1.ShaVersion.Sha256);
|
|
@@ -614,8 +616,8 @@ let env;
|
|
|
614
616
|
yield hcp1Details.api.cryptoApi.exchangeData.giveAccessBackTo(hcp2Details.credentials.dataOwnerId, exportedPub);
|
|
615
617
|
yield hcp1Details.api.cryptoApi.exchangeData.clearOrRepopulateCache();
|
|
616
618
|
yield hcp2Details.api.cryptoApi.exchangeData.clearOrRepopulateCache();
|
|
617
|
-
const updatedEd1to2 = yield hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId
|
|
618
|
-
const updatedEd2to1 = yield hcp2Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp1Details.credentials.dataOwnerId
|
|
619
|
+
const updatedEd1to2 = yield hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId);
|
|
620
|
+
const updatedEd2to1 = yield hcp2Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp1Details.credentials.dataOwnerId);
|
|
619
621
|
(0, chai_1.expect)(updatedEd1to2.exchangeData.id).to.equal(ed1to2.exchangeData.id);
|
|
620
622
|
(0, chai_1.expect)(Object.keys(updatedEd2to1.exchangeData.exchangeKey).length).to.be.greaterThan(Object.keys(ed2to1.exchangeData.exchangeKey).length);
|
|
621
623
|
(0, chai_1.expect)(Object.keys(updatedEd2to1.exchangeData.exchangeKey).length).to.equal(Object.keys(updatedEd2to1.exchangeData.accessControlSecret).length);
|
|
@@ -630,8 +632,8 @@ let env;
|
|
|
630
632
|
return __awaiter(this, void 0, void 0, function* () {
|
|
631
633
|
const hcp1Details = yield (0, test_utils_1.createNewHcpApi)(env);
|
|
632
634
|
const hcp2Details = yield (0, test_utils_1.createNewHcpApi)(env);
|
|
633
|
-
const ed1to2 = yield hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId
|
|
634
|
-
const ed2to1 = yield hcp2Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp1Details.credentials.dataOwnerId
|
|
635
|
+
const ed1to2 = yield hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId);
|
|
636
|
+
const ed2to1 = yield hcp2Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp1Details.credentials.dataOwnerId);
|
|
635
637
|
yield hcp1Details.api.cryptoApi.exchangeData.clearOrRepopulateCache();
|
|
636
638
|
yield hcp2Details.api.cryptoApi.exchangeData.clearOrRepopulateCache();
|
|
637
639
|
const exchangeDataApi = new IccExchangeDataApi_1.IccExchangeDataApi(env.iCureUrl, {}, hcp1Details.api.authApi.authenticationProvider, fetch);
|
|
@@ -653,8 +655,8 @@ let env;
|
|
|
653
655
|
yield hcp1Details.api.cryptoApi.exchangeData.giveAccessBackTo(hcp2Details.credentials.dataOwnerId, exportedPub);
|
|
654
656
|
yield hcp1Details.api.cryptoApi.exchangeData.clearOrRepopulateCache();
|
|
655
657
|
yield hcp2Details.api.cryptoApi.exchangeData.clearOrRepopulateCache();
|
|
656
|
-
const updatedEd1to2 = yield hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId
|
|
657
|
-
const updatedEd2to1 = yield hcp2Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp1Details.credentials.dataOwnerId
|
|
658
|
+
const updatedEd1to2 = yield hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId);
|
|
659
|
+
const updatedEd2to1 = yield hcp2Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp1Details.credentials.dataOwnerId);
|
|
658
660
|
(0, chai_1.expect)(updatedEd1to2.exchangeData.id).to.not.equal(ed1to2.exchangeData.id);
|
|
659
661
|
(0, chai_1.expect)(updatedEd2to1.exchangeData.id).to.not.equal(ed2to1.exchangeData.id);
|
|
660
662
|
const decData1to2 = (yield hcp1Details.api.cryptoApi.exchangeData.getDecryptionDataKeyByIds([ed1to2.exchangeData.id], true))[ed1to2.exchangeData.id];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exchange-data-manager-test.js","sourceRoot":"","sources":["../../../../test/icc-x-api/crypto/exchange-data-manager-test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe } from 'mocha'\nimport {\n ExchangeDataManager,\n ExchangeDataManagerOptionalParameters,\n initialiseExchangeDataManagerForCurrentDataOwner,\n} from '../../../icc-x-api/crypto/ExchangeDataManager'\nimport { WebCryptoPrimitives } from '../../../icc-x-api/crypto/CryptoPrimitives'\nimport { webcrypto } from 'crypto'\nimport { BaseExchangeDataManager } from '../../../icc-x-api/crypto/BaseExchangeDataManager'\nimport { FakeExchangeDataApi } from '../../utils/FakeExchangeDataApi'\nimport { FakeDataOwnerApi } from '../../utils/FakeDataOwnerApi'\nimport { TestCryptoStrategies } from '../../utils/TestCryptoStrategies'\nimport { EntityWithDelegationTypeName, ShaVersion, ua2b64, ua2hex } from '../../../icc-x-api'\nimport { FakeEncryptionKeysManager } from '../../utils/FakeEncryptionKeysManager'\nimport { AccessControlSecretUtils } from '../../../icc-x-api/crypto/AccessControlSecretUtils'\nimport { ExchangeData } from '../../../icc-api/model/internal/ExchangeData'\nimport { expect } from 'chai'\nimport { setEquals } from '../../../icc-x-api/utils/collection-utils'\nimport { KeyPair } from '../../../icc-x-api/crypto/RSA'\nimport * as _ from 'lodash'\nimport { fingerprintV1, fingerprintV1toV2, fingerprintV2 } from '../../../icc-x-api/crypto/utils'\nimport { DataOwnerTypeEnum } from '../../../icc-api/model/DataOwnerTypeEnum'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { createNewHcpApi, getEnvironmentInitializer, setLocalStorage } from '../../utils/test_utils'\nimport 'isomorphic-fetch'\nimport { IccExchangeDataApi } from '../../../icc-api/api/internal/IccExchangeDataApi'\n\nsetLocalStorage(fetch)\n\ndescribe('Exchange data manager - unit', async function () {\n const primitives = new WebCryptoPrimitives(webcrypto as any)\n const accessControlSecretUtils = new AccessControlSecretUtils(primitives)\n let selfId: string\n let selfKeyFpV1: string\n let selfKeyFpV2: string\n let selfKeypair: KeyPair<CryptoKey>\n let delegateId: string\n let delegateKeyFp: string\n let delegateKeypair: KeyPair<CryptoKey>\n let delegate2Id: string\n let delegate2KeyFp: string\n let delegate2Keypair: KeyPair<CryptoKey>\n let dataOwnerApi: FakeDataOwnerApi\n let exchangeDataApi: FakeExchangeDataApi\n let baseExchangeData: BaseExchangeDataManager\n let exchangeData: ExchangeDataManager\n let encryptionKeysManager: FakeEncryptionKeysManager\n\n async function initialiseComponents(\n allowFullExchangeDataLoad: boolean,\n optionalParameters: ExchangeDataManagerOptionalParameters & { verifiedDelegateKeys?: Set<string> } = {}\n ) {\n const dataOwnerType = allowFullExchangeDataLoad ? DataOwnerTypeEnum.Patient : DataOwnerTypeEnum.Hcp\n selfId = primitives.randomUuid()\n selfKeypair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n selfKeyFpV1 = fingerprintV1(ua2hex(await primitives.RSA.exportKey(selfKeypair.publicKey, 'spki')))\n selfKeyFpV2 = fingerprintV1toV2(selfKeyFpV1)\n delegateId = primitives.randomUuid()\n delegateKeypair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n delegateKeyFp = fingerprintV1(ua2hex(await primitives.RSA.exportKey(delegateKeypair.publicKey, 'spki')))\n delegate2Id = primitives.randomUuid()\n delegate2Keypair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n delegate2KeyFp = fingerprintV1(ua2hex(await primitives.RSA.exportKey(delegate2Keypair.publicKey, 'spki')))\n dataOwnerApi = new FakeDataOwnerApi(\n {\n id: selfId,\n type: dataOwnerType,\n publicKeysForOaepWithSha256: [ua2hex(await primitives.RSA.exportKey(selfKeypair.publicKey, 'spki'))],\n },\n [\n {\n id: delegateId,\n type: dataOwnerType,\n publicKeysForOaepWithSha256: [ua2hex(await primitives.RSA.exportKey(delegateKeypair.publicKey, 'spki'))],\n },\n {\n id: delegate2Id,\n type: dataOwnerType,\n publicKeysForOaepWithSha256: [ua2hex(await primitives.RSA.exportKey(delegate2Keypair.publicKey, 'spki'))],\n },\n ]\n )\n const cryptoStrategies = new TestCryptoStrategies(undefined, undefined, optionalParameters.verifiedDelegateKeys)\n exchangeDataApi = new FakeExchangeDataApi()\n baseExchangeData = new BaseExchangeDataManager(exchangeDataApi, dataOwnerApi, primitives, allowFullExchangeDataLoad, false)\n encryptionKeysManager = await FakeEncryptionKeysManager.create(primitives, [selfKeypair])\n exchangeData = await initialiseExchangeDataManagerForCurrentDataOwner(\n baseExchangeData,\n encryptionKeysManager,\n accessControlSecretUtils,\n cryptoStrategies,\n dataOwnerApi,\n primitives,\n true,\n optionalParameters\n )\n }\n\n async function checkDataEqual(\n actual: { exchangeData: ExchangeData; accessControlSecret?: string; exchangeKey: CryptoKey | undefined } | undefined,\n expected: { exchangeData: ExchangeData; accessControlSecret?: string; exchangeKey: CryptoKey | undefined }\n ) {\n expect(actual).to.not.be.undefined\n expect(_.isEqual(_.omit(expected.exchangeData, ['rev']), _.omit(actual!.exchangeData, ['rev']))).to.equal(\n true,\n `Data should be equivalent\\nExpected: ${JSON.stringify(expected.exchangeData, undefined, 2)}\\nActual: ${JSON.stringify(\n actual!.exchangeData,\n undefined,\n 2\n )}\\n`\n )\n expect(expected.accessControlSecret).to.equal(actual!.accessControlSecret)\n await checkAesKeysEquality(actual!.exchangeKey, expected.exchangeKey)\n }\n\n async function checkAesKeysEquality(actual: CryptoKey | undefined, expected: CryptoKey | undefined) {\n if (!actual && !expected) return\n expect(!actual).to.equal(!expected, !expected ? 'Key should not have been decrypted' : 'Key should have been decrypted')\n expect(ua2hex(await primitives.AES.exportKey(expected!, 'raw'))).to.equal(ua2hex(await primitives.AES.exportKey(actual!, 'raw')))\n }\n\n async function createDataFromRandomToSelf(): Promise<{ exchangeData: ExchangeData; exchangeKey: CryptoKey; accessControlSecret: string }> {\n const encryptionKey = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const encryptionFp = ua2hex(await primitives.RSA.exportKey(encryptionKey.publicKey, 'spki')).slice(-32)\n const signatureKey = await primitives.RSA.generateKeyPair(ShaVersion.Sha1)\n const signatureFp = ua2hex(await primitives.RSA.exportKey(signatureKey.publicKey, 'spki')).slice(-32)\n const created = await baseExchangeData.createExchangeData(\n selfId,\n { [signatureFp]: signatureKey.privateKey },\n { [encryptionFp]: encryptionKey.publicKey, [selfKeyFpV1]: selfKeypair.publicKey }\n )\n const modified = await exchangeDataApi.modifyExchangeData(\n new ExchangeData({\n ...created.exchangeData,\n delegator: primitives.randomUuid(),\n })\n )\n return { exchangeData: modified, exchangeKey: created.exchangeKey, accessControlSecret: created.accessControlSecret }\n }\n\n async function generateEncryptionKeys(n: number): Promise<{ pair: KeyPair<CryptoKey>; fingerprintV2: string; hexPub: string }[]> {\n return await Promise.all(\n Array(n)\n .fill(null)\n .map(async () => {\n const pair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const hexPub = ua2hex(await primitives.RSA.exportKey(pair.publicKey, 'spki'))\n const fingerprint = fingerprintV2(hexPub)\n return { pair, fingerprintV2: fingerprint, hexPub }\n })\n )\n }\n\n it('base should be able to retrieve all exchange data for the current data owner if allowed by the crypto strategies', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const expectedData = await Promise.all(\n Array.from(Array(3500), async (_, i) => {\n const data = new ExchangeData({\n id: primitives.randomUuid(),\n delegate: i % 2 === 0 ? selfId : primitives.randomUuid(),\n delegator: i % 2 === 0 ? primitives.randomUuid() : selfId,\n exchangeKey: { not: 'important' },\n accessControlSecret: { not: 'important' },\n sharedSignatureKey: { not: 'important' },\n delegatorSignature: { not: 'important' },\n sharedSignature: 'not important',\n })\n await exchangeDataApi.createExchangeData(data)\n return data\n })\n )\n await Promise.all(\n Array.from(Array(500), async () => {\n // Should not be in result\n const data = new ExchangeData({\n id: primitives.randomUuid(),\n delegate: primitives.randomUuid(),\n delegator: primitives.randomUuid(),\n exchangeKey: { not: 'important' },\n accessControlSecret: { not: 'important' },\n sharedSignatureKey: { not: 'important' },\n delegatorSignature: { not: 'important' },\n sharedSignature: 'not important',\n })\n await exchangeDataApi.createExchangeData(data)\n })\n )\n const retrieved = await baseExchangeData.getAllExchangeDataForCurrentDataOwnerIfAllowed()\n if (allowFullExchangeDataLoad) {\n expect(retrieved).to.not.be.undefined\n expect(retrieved).to.have.length(expectedData.length)\n expect(setEquals(new Set(expectedData.map((x) => x.id)), new Set(retrieved!.map((x) => x.id))), 'Retrieved and expected ids').to.be.true\n } else {\n expect(retrieved).to.be.undefined\n }\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should create new encryption keys when none is available', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const sfk = primitives.randomUuid()\n const initialisedCount = exchangeDataApi.callCount\n const createdData = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n const retrievedCachedData = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n exchangeDataApi.compareCallCountFromBaseline(initialisedCount, {\n createExchangeData: 1,\n // If we could fully preload we already know whether the exchange key already exists or not, otherwise we have to request from the api\n getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 1,\n modifyExchangeData: 0,\n getExchangeDataByIds: 0,\n getExchangeDataByParticipant: 0,\n })\n await checkDataEqual(retrievedCachedData, createdData)\n const decryptedKeyByDelegate = await baseExchangeData.tryDecryptExchangeKeys([createdData.exchangeData], { [delegateKeyFp]: delegateKeypair })\n const decryptedAccessControlSecretByDelegate = await baseExchangeData.tryDecryptAccessControlSecret([createdData.exchangeData], {\n [delegateKeyFp]: delegateKeypair,\n })\n await checkAesKeysEquality(decryptedKeyByDelegate.successfulDecryptions[0], createdData.exchangeKey)\n expect(decryptedAccessControlSecretByDelegate.successfulDecryptions[0]).to.equal(createdData.accessControlSecret)\n expect(retrievedCachedData.exchangeData.delegator).to.equal(selfId)\n expect(retrievedCachedData.exchangeData.delegate).to.equal(delegateId)\n expect(Object.keys(retrievedCachedData.exchangeData.delegatorSignature)).to.have.length(1)\n expect(Object.keys(retrievedCachedData.exchangeData.exchangeKey)).to.have.length(2)\n expect(Object.keys(retrievedCachedData.exchangeData.accessControlSecret)).to.have.length(2)\n expect(Object.keys(retrievedCachedData.exchangeData.sharedSignatureKey)).to.have.length(2)\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should create encryption keys to self when none is available', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdData = await exchangeData.getOrCreateEncryptionDataTo(selfId, false)\n expect(createdData.exchangeData.delegator).to.equal(selfId)\n expect(createdData.exchangeData.delegate).to.equal(selfId)\n expect(Object.keys(createdData.exchangeData.delegatorSignature)).to.have.length(1)\n expect(Object.keys(createdData.exchangeData.sharedSignatureKey)).to.have.length(1)\n expect(Object.keys(createdData.exchangeData.exchangeKey)).to.have.length(1)\n expect(Object.keys(createdData.exchangeData.accessControlSecret)).to.have.length(1)\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should ignore unverified keys when creating new exchange data', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n const delegateVerifiedKeys = await generateEncryptionKeys(5)\n const extraDelegateUnverifiedKeys = await generateEncryptionKeys(5)\n const extraDelegatorVerifiedKeys = await generateEncryptionKeys(5)\n const delegatorUnverifiedKeys = await generateEncryptionKeys(5)\n await initialiseComponents(allowFullExchangeDataLoad, { verifiedDelegateKeys: new Set(delegateVerifiedKeys.map((x) => x.hexPub)) })\n for (const keyData of [...delegateVerifiedKeys, ...extraDelegateUnverifiedKeys]) {\n await dataOwnerApi.addPublicKeyForOwner(delegateId, keyData.pair)\n }\n for (const keyData of extraDelegatorVerifiedKeys) {\n await dataOwnerApi.addPublicKeyForOwner(selfId, keyData.pair)\n await encryptionKeysManager.addOrUpdateKey(primitives, keyData.pair, true)\n }\n for (const keyData of delegatorUnverifiedKeys) {\n await dataOwnerApi.addPublicKeyForOwner(selfId, keyData.pair)\n await encryptionKeysManager.addOrUpdateKey(primitives, keyData.pair, false)\n }\n const created = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n expect(\n setEquals(new Set(Object.keys(created.exchangeData.exchangeKey)), new Set(Object.keys(created.exchangeData.accessControlSecret))),\n 'Keys used for encryption of exchange key and access control secret must be the same.'\n ).to.be.true\n expect(\n setEquals(\n new Set(Object.keys(created.exchangeData.exchangeKey)),\n new Set([...delegateVerifiedKeys.map((x) => x.fingerprintV2), ...extraDelegatorVerifiedKeys.map((x) => x.fingerprintV2), selfKeyFpV2])\n ),\n 'Only verified keys of delegate and delegator should be used for encryption of exchange key and access control secret.'\n ).to.be.true\n for (const keyData of [{ pair: selfKeypair, fingerprintV2: selfKeyFpV1 }, ...extraDelegatorVerifiedKeys, ...delegateVerifiedKeys]) {\n await checkAesKeysEquality(\n (\n await baseExchangeData.tryDecryptExchangeKeys([created.exchangeData], { [keyData.fingerprintV2]: keyData.pair })\n ).successfulDecryptions[0],\n created.exchangeKey\n )\n expect(\n (await baseExchangeData.tryDecryptAccessControlSecret([created.exchangeData], { [keyData.fingerprintV2]: keyData.pair }))\n .successfulDecryptions[0]\n ).to.equal(created.accessControlSecret)\n }\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should reuse existing exchange data for encryption when it can be verified', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdData = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n await exchangeData.clearOrRepopulateCache()\n const countAfterCacheClear = exchangeDataApi.callCount\n const reloadedData = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n exchangeDataApi.compareCallCountFromBaseline(countAfterCacheClear, {\n createExchangeData: 0,\n getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 1,\n modifyExchangeData: 0,\n getExchangeDataByIds: 0,\n getExchangeDataByParticipant: 0,\n })\n await checkDataEqual(reloadedData, createdData)\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should create new exchange data for encryption when the existing data can not be verified due to unavailable verification key', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdData = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n await encryptionKeysManager.unverifyExistingKeysAndCreateNewVerified(primitives)\n await exchangeData.clearOrRepopulateCache()\n const countAfterCacheClear = exchangeDataApi.callCount\n const newData = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n exchangeDataApi.compareCallCountFromBaseline(countAfterCacheClear, {\n createExchangeData: 1,\n getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 1,\n modifyExchangeData: 0,\n getExchangeDataByIds: 0,\n getExchangeDataByParticipant: 0,\n })\n expect(_.isEqual(_.omit(createdData.exchangeData, ['rev']), _.omit(newData.exchangeData, ['rev']))).to.equal(\n false,\n 'Exchange data manager should have created new exchange data for encryption'\n )\n expect(ua2hex(await primitives.AES.exportKey(createdData.exchangeKey, 'raw'))).to.not.equal(\n ua2hex(await primitives.AES.exportKey(newData.exchangeKey, 'raw'))\n )\n expect(createdData.accessControlSecret).to.not.equal(newData.accessControlSecret)\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should create new exchange data for encryption when the existing data can not be verified due to tampering of the encrypted access control secret and/or encrypted exchange key', async function () {\n async function doTest(\n allowFullExchangeDataLoad: boolean,\n tamper: (exchangeData: ExchangeData, selfKeyPair: KeyPair<CryptoKey>, selfKeyFp: string) => Promise<ExchangeData>\n ) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const sfk = primitives.randomUuid()\n const createdData = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n // Tamper with exchange data\n await exchangeDataApi.modifyExchangeData(await tamper(createdData.exchangeData, selfKeypair, selfKeyFpV2))\n await exchangeData.clearOrRepopulateCache()\n const countAfterCacheClear = exchangeDataApi.callCount\n const newData = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n exchangeDataApi.compareCallCountFromBaseline(countAfterCacheClear, {\n createExchangeData: 1,\n getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 1,\n modifyExchangeData: 0,\n getExchangeDataByIds: 0,\n getExchangeDataByParticipant: 0,\n })\n expect(createdData.exchangeData.id).not.to.equal(\n newData.exchangeData.id,\n 'Exchange data manager should have created new exchange data for encryption'\n )\n expect(ua2hex(await primitives.AES.exportKey(createdData.exchangeKey, 'raw'))).to.not.equal(\n ua2hex(await primitives.AES.exportKey(newData.exchangeKey, 'raw'))\n )\n expect(createdData.accessControlSecret).to.not.equal(newData.accessControlSecret)\n const updatedUnverifiedOldData = (await exchangeData.getDecryptionDataKeyByIds([createdData.exchangeData.id!], true))[\n createdData.exchangeData.id!\n ]\n expect(updatedUnverifiedOldData).to.not.be.undefined\n }\n const extraKeyPair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const extraKeyPairFp = fingerprintV2(ua2hex(await primitives.RSA.exportKey(extraKeyPair.publicKey, 'spki')))\n const fakeKey = primitives.randomBytes(16)\n const tamperByChangingEncryptionKey = async (exchangeData: ExchangeData, selfKeyPair: KeyPair<CryptoKey>, selfKeyFp: string) =>\n new ExchangeData({\n ...exchangeData,\n exchangeKey: {\n ...exchangeData.exchangeKey,\n [selfKeyFp]: ua2b64(await primitives.RSA.encrypt(selfKeyPair.publicKey, fakeKey)),\n },\n })\n const tamperByChangingAccessControlSecret = async (exchangeData: ExchangeData, selfKeyPair: KeyPair<CryptoKey>, selfKeyFp: string) =>\n new ExchangeData({\n ...exchangeData,\n accessControlSecret: {\n ...exchangeData.accessControlSecret,\n [selfKeyFp]: ua2b64(await primitives.RSA.encrypt(selfKeyPair.publicKey, fakeKey)),\n },\n })\n const tamperByChangingBoth = async (exchangeData: ExchangeData, selfKeyPair: KeyPair<CryptoKey>, selfKeyFp: string) =>\n tamperByChangingEncryptionKey(await tamperByChangingAccessControlSecret(exchangeData, selfKeyPair, selfKeyFp), selfKeyPair, selfKeyFp)\n const tamperByAddingEncryptionKey = async (exchangeData: ExchangeData) =>\n new ExchangeData({\n ...exchangeData,\n exchangeKey: {\n ...exchangeData.exchangeKey,\n [extraKeyPairFp]: ua2b64(await primitives.RSA.encrypt(extraKeyPair.publicKey, fakeKey)),\n },\n })\n await doTest(true, tamperByChangingEncryptionKey)\n await doTest(false, tamperByChangingEncryptionKey)\n await doTest(true, tamperByChangingAccessControlSecret)\n await doTest(false, tamperByChangingAccessControlSecret)\n await doTest(true, tamperByChangingBoth)\n await doTest(false, tamperByChangingBoth)\n await doTest(true, tamperByAddingEncryptionKey)\n await doTest(false, tamperByAddingEncryptionKey)\n })\n\n it('should create new exchange data for encryption when the existing data can not be verified due to tampering of the delegate id', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdData = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n // Tamper with exchange data\n await exchangeDataApi.modifyExchangeData({\n ...createdData.exchangeData,\n delegate: delegate2Id,\n })\n await exchangeData.clearOrRepopulateCache()\n const countAfterCacheClear = exchangeDataApi.callCount\n const newDataToDelegate = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n const newDataToDelegate2 = await exchangeData.getOrCreateEncryptionDataTo(delegate2Id, false)\n exchangeDataApi.compareCallCountFromBaseline(countAfterCacheClear, {\n createExchangeData: 2,\n getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 2,\n modifyExchangeData: 0,\n getExchangeDataByIds: 0,\n getExchangeDataByParticipant: 0,\n })\n expect(createdData.exchangeData.id).to.not.equal(\n newDataToDelegate.exchangeData.id,\n 'Exchange data manager should have created new exchange data for encryption to delegate'\n )\n expect(createdData.exchangeData.id).to.not.equal(\n newDataToDelegate2.exchangeData.id,\n 'Exchange data manager should have created new exchange data for encryption to delegate 2'\n )\n expect(ua2hex(await primitives.AES.exportKey(createdData.exchangeKey, 'raw'))).to.not.equal(\n ua2hex(await primitives.AES.exportKey(newDataToDelegate.exchangeKey, 'raw'))\n )\n expect(ua2hex(await primitives.AES.exportKey(createdData.exchangeKey, 'raw'))).to.not.equal(\n ua2hex(await primitives.AES.exportKey(newDataToDelegate2.exchangeKey, 'raw'))\n )\n expect(createdData.accessControlSecret).to.not.equal(newDataToDelegate.accessControlSecret)\n expect(createdData.accessControlSecret).to.not.equal(newDataToDelegate2.accessControlSecret)\n const updatedUnverifiedOldData = (await exchangeData.getDecryptionDataKeyByIds([createdData.exchangeData.id!], true))[\n createdData.exchangeData.id!\n ]\n expect(updatedUnverifiedOldData).to.not.be.undefined\n expect(ua2hex(await primitives.AES.exportKey(updatedUnverifiedOldData!.exchangeKey!, 'raw'))).to.equal(\n ua2hex(await primitives.AES.exportKey(createdData.exchangeKey, 'raw'))\n )\n expect(updatedUnverifiedOldData!.accessControlSecret).to.equal(createdData.accessControlSecret)\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should return existing exchange data keys for decryption even if the data authenticity could not be verified', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdData1 = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n const createdData2 = await createDataFromRandomToSelf()\n await encryptionKeysManager.unverifyExistingKeysAndCreateNewVerified(primitives)\n await exchangeData.clearOrRepopulateCache()\n await checkDataEqual(\n (\n await exchangeData.getDecryptionDataKeyByIds([createdData1.exchangeData.id!], true)\n )[createdData1.exchangeData.id!],\n createdData1\n )\n await checkDataEqual(\n (\n await exchangeData.getDecryptionDataKeyByIds([createdData2.exchangeData.id!], true)\n )[createdData2.exchangeData.id!],\n createdData2\n )\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('newly created data or data retrieved by id should be cached and retrievable by hash', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdData1 = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n const hashes1 = await accessControlSecretUtils.allSecureDelegationKeysFor(createdData1.accessControlSecret)\n const retrievedKeys1 = await exchangeData.getCachedDecryptionDataKeyByAccessControlHash(hashes1)\n for (const hash of hashes1) {\n await checkDataEqual(retrievedKeys1[hash], createdData1)\n }\n if (!allowFullExchangeDataLoad) {\n const createdData2 = await createDataFromRandomToSelf()\n const hashes2 = await accessControlSecretUtils.allSecureDelegationKeysFor(createdData2.accessControlSecret)\n await checkDataEqual(\n (\n await exchangeData.getDecryptionDataKeyByIds([createdData2.exchangeData.id!], true)\n )[createdData2.exchangeData.id!],\n createdData2\n )\n const retrievedKeys2 = await exchangeData.getCachedDecryptionDataKeyByAccessControlHash([...hashes1, ...hashes2])\n for (const hash of hashes2) {\n await checkDataEqual(retrievedKeys2[hash], createdData2)\n }\n }\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('if data can not be decrypted the retrieval method should return undefined', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdBySelf = await exchangeData.getOrCreateEncryptionDataTo(selfId, false)\n const createdByOther = await createDataFromRandomToSelf()\n const newKey = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n await dataOwnerApi.addPublicKeyForOwner(selfId, newKey)\n // Simulate loss of key\n encryptionKeysManager.deleteKey(selfKeyFpV1)\n await encryptionKeysManager.addOrUpdateKey(primitives, newKey, true)\n await exchangeData.clearOrRepopulateCache()\n await checkDataEqual((await exchangeData.getDecryptionDataKeyByIds([createdBySelf.exchangeData.id!], true))[createdBySelf.exchangeData.id!], {\n exchangeData: createdBySelf.exchangeData,\n exchangeKey: undefined,\n })\n await checkDataEqual((await exchangeData.getDecryptionDataKeyByIds([createdByOther.exchangeData.id!], true))[createdByOther.exchangeData.id!], {\n exchangeData: createdByOther.exchangeData,\n exchangeKey: undefined,\n })\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('unverified keys should still be usable for decryption of data', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdBySelf = await exchangeData.getOrCreateEncryptionDataTo(selfId, false)\n const createdByOther = await createDataFromRandomToSelf()\n await encryptionKeysManager.addOrUpdateKey(primitives, selfKeypair, false)\n await exchangeData.clearOrRepopulateCache()\n await checkDataEqual(\n (\n await exchangeData.getDecryptionDataKeyByIds([createdBySelf.exchangeData.id!], true)\n )[createdBySelf.exchangeData.id!],\n createdBySelf\n )\n await checkDataEqual(\n (\n await exchangeData.getDecryptionDataKeyByIds([createdByOther.exchangeData.id!], true)\n )[createdByOther.exchangeData.id!],\n createdByOther\n )\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('implementation with limited cache should trigger eviction of delegate and hash cache on eviction of data by id cache', async function () {\n await initialiseComponents(false, { lruCacheSize: 3 })\n const entityType = EntityWithDelegationTypeName.Contact\n const sfks = [primitives.randomUuid(), primitives.randomUuid(), primitives.randomUuid()]\n\n async function verifyCached(data: { exchangeData: ExchangeData; accessControlSecret: string; exchangeKey: CryptoKey }) {\n const apiCallsBaseline = exchangeDataApi.callCount\n const hashes = await accessControlSecretUtils.allSecureDelegationKeysFor(data.accessControlSecret)\n for (const hash of hashes) {\n await checkDataEqual((await exchangeData.getCachedDecryptionDataKeyByAccessControlHash([hash]))[hash], data)\n }\n if (data.exchangeData.delegator === selfId) {\n await checkDataEqual(await exchangeData.getOrCreateEncryptionDataTo(data.exchangeData.delegate, false), data)\n }\n await checkDataEqual((await exchangeData.getDecryptionDataKeyByIds([data.exchangeData.id!], true))[data.exchangeData.id!], data)\n exchangeDataApi.compareCallCountFromBaseline(apiCallsBaseline, {\n getExchangeDataByIds: 0,\n createExchangeData: 0,\n modifyExchangeData: 0,\n getExchangeDataByParticipant: 0,\n getExchangeDataByDelegatorDelegate: 0,\n })\n }\n\n async function verifyNotCachedThenCache(data: { exchangeData: ExchangeData; accessControlSecret: string; exchangeKey: CryptoKey }) {\n const apiCallsBaseline = exchangeDataApi.callCount\n const hashes = [await accessControlSecretUtils.secureDelegationKeyFor(data.accessControlSecret, entityType)]\n for (const hash of hashes) {\n expect(Object.keys(await exchangeData.getCachedDecryptionDataKeyByAccessControlHash([hash]))).to.have.length(0)\n }\n if (data.exchangeData.delegator === selfId) {\n await checkDataEqual(await exchangeData.getOrCreateEncryptionDataTo(data.exchangeData.delegate, false), data)\n exchangeDataApi.compareCallCountFromBaseline(apiCallsBaseline, {\n getExchangeDataByIds: 0,\n createExchangeData: 0,\n modifyExchangeData: 0,\n getExchangeDataByParticipant: 0,\n getExchangeDataByDelegatorDelegate: 1,\n })\n } else {\n await checkDataEqual((await exchangeData.getDecryptionDataKeyByIds([data.exchangeData.id!], true))[data.exchangeData.id!], data)\n exchangeDataApi.compareCallCountFromBaseline(apiCallsBaseline, {\n getExchangeDataByIds: 1,\n createExchangeData: 0,\n modifyExchangeData: 0,\n getExchangeDataByParticipant: 0,\n getExchangeDataByDelegatorDelegate: 0,\n })\n }\n }\n\n const createdBySelf1 = await exchangeData.getOrCreateEncryptionDataTo(selfId, false)\n const createdBySelf2 = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n const createdByOther1 = await createDataFromRandomToSelf() // Not automatically cached: created by someone else\n const createdByOther2 = await createDataFromRandomToSelf() // Not automatically cached: created by someone else\n // noinspection DuplicatedCode\n await verifyCached(createdBySelf1)\n await verifyCached(createdBySelf2)\n await verifyNotCachedThenCache(createdByOther1)\n await verifyCached(createdBySelf1)\n await verifyCached(createdBySelf2)\n await verifyCached(createdByOther1)\n await verifyNotCachedThenCache(createdByOther2)\n await verifyCached(createdBySelf2)\n await verifyCached(createdByOther1)\n await verifyCached(createdByOther2)\n await verifyNotCachedThenCache(createdBySelf1)\n await verifyCached(createdByOther1)\n await verifyCached(createdByOther2)\n await verifyCached(createdBySelf1)\n await verifyNotCachedThenCache(createdBySelf2)\n await verifyCached(createdByOther2)\n // noinspection DuplicatedCode\n await verifyCached(createdBySelf1)\n await verifyCached(createdBySelf2)\n await verifyNotCachedThenCache(createdByOther1)\n await verifyCached(createdBySelf1)\n await verifyCached(createdBySelf2)\n await verifyCached(createdByOther1)\n await verifyNotCachedThenCache(createdByOther2)\n await verifyCached(createdBySelf2)\n await verifyCached(createdByOther1)\n await verifyCached(createdByOther2)\n })\n\n it('implementation with unlimited cache should preload all existing exchange data on creation', async function () {\n await initialiseComponents(true)\n const createdBySelf = await exchangeData.getOrCreateEncryptionDataTo(selfId, false)\n const createdByOther = await createDataFromRandomToSelf()\n const recreatedExchangeData = await initialiseExchangeDataManagerForCurrentDataOwner(\n baseExchangeData,\n encryptionKeysManager,\n accessControlSecretUtils,\n new TestCryptoStrategies(),\n dataOwnerApi,\n primitives,\n true\n )\n const apiCallsAfterCreation = exchangeDataApi.callCount\n await checkDataEqual(\n (\n await recreatedExchangeData.getDecryptionDataKeyByIds([createdBySelf.exchangeData.id!], false)\n )[createdBySelf.exchangeData.id!],\n createdBySelf\n )\n await checkDataEqual(\n (\n await recreatedExchangeData.getDecryptionDataKeyByIds([createdByOther.exchangeData.id!], false)\n )[createdByOther.exchangeData.id!],\n createdByOther\n )\n exchangeDataApi.compareCallCountFromBaseline(apiCallsAfterCreation, {\n getExchangeDataByIds: 0,\n createExchangeData: 0,\n modifyExchangeData: 0,\n getExchangeDataByParticipant: 0,\n getExchangeDataByDelegatorDelegate: 0,\n })\n })\n})\n\nlet env: TestVars\n\ndescribe('Exchange data manager - e2e', async function () {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n })\n\n it('give access back should not invalidate existing and valid exchange data', async function () {\n const hcp1Details = await createNewHcpApi(env)\n const hcp2Details = await createNewHcpApi(env)\n const ed1to2 = await hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId, false)\n const ed2to1 = await hcp2Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp1Details.credentials.dataOwnerId, false)\n await hcp1Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n await hcp2Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n const newKeyPair = await hcp1Details.api.cryptoApi.primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const exportedPub = ua2hex(await hcp1Details.api.cryptoApi.primitives.RSA.exportKey(newKeyPair.publicKey, 'spki'))\n const hcp2 = await hcp2Details.api.healthcarePartyApi.getHealthcareParty(hcp2Details.credentials.dataOwnerId)\n await hcp2Details.api.healthcarePartyApi.modifyHealthcareParty({\n ...hcp2,\n publicKeysForOaepWithSha256: [...hcp2.publicKeysForOaepWithSha256, exportedPub],\n })\n await hcp1Details.api.cryptoApi.exchangeData.giveAccessBackTo(hcp2Details.credentials.dataOwnerId, exportedPub)\n await hcp1Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n await hcp2Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n const updatedEd1to2 = await hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId, false)\n const updatedEd2to1 = await hcp2Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp1Details.credentials.dataOwnerId, false)\n expect(updatedEd1to2.exchangeData.id).to.equal(ed1to2.exchangeData.id)\n expect(Object.keys(updatedEd2to1.exchangeData.exchangeKey).length).to.be.greaterThan(Object.keys(ed2to1.exchangeData.exchangeKey).length)\n expect(Object.keys(updatedEd2to1.exchangeData.exchangeKey).length).to.equal(Object.keys(updatedEd2to1.exchangeData.accessControlSecret).length)\n expect(Object.keys(updatedEd2to1.exchangeData.exchangeKey).length).to.equal(Object.keys(updatedEd2to1.exchangeData.sharedSignatureKey).length)\n expect(updatedEd2to1.exchangeData.id).to.equal(ed2to1.exchangeData.id)\n expect(Object.keys(updatedEd1to2.exchangeData.exchangeKey).length).to.be.greaterThan(Object.keys(ed1to2.exchangeData.exchangeKey).length)\n expect(Object.keys(updatedEd1to2.exchangeData.exchangeKey).length).to.equal(Object.keys(updatedEd1to2.exchangeData.accessControlSecret).length)\n expect(Object.keys(updatedEd1to2.exchangeData.exchangeKey).length).to.equal(Object.keys(updatedEd1to2.exchangeData.sharedSignatureKey).length)\n })\n\n it('invalid exchange data should not be re-validated by give access back', async function () {\n const hcp1Details = await createNewHcpApi(env)\n const hcp2Details = await createNewHcpApi(env)\n const ed1to2 = await hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId, false)\n const ed2to1 = await hcp2Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp1Details.credentials.dataOwnerId, false)\n await hcp1Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n await hcp2Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n const exchangeDataApi = new IccExchangeDataApi(env.iCureUrl, {}, hcp1Details.api.authApi.authenticationProvider, fetch)\n const extraKeyPair = await hcp1Details.api.cryptoApi.primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const extraKeyPairPub = ua2hex(await hcp1Details.api.cryptoApi.primitives.RSA.exportKey(extraKeyPair.publicKey, 'spki'))\n const extraKeyPairFp = fingerprintV2(extraKeyPairPub)\n const fakeData = await hcp1Details.api.cryptoApi.primitives.randomBytes(16)\n async function tamperWithData(data: ExchangeData) {\n await exchangeDataApi.modifyExchangeData({\n ...data,\n exchangeKey: {\n ...data.exchangeKey,\n [extraKeyPairFp]: ua2b64(await hcp1Details.api.cryptoApi.primitives.RSA.encrypt(extraKeyPair.publicKey, fakeData)),\n },\n accessControlSecret: {\n ...data.accessControlSecret,\n [extraKeyPairFp]: ua2b64(await hcp1Details.api.cryptoApi.primitives.RSA.encrypt(extraKeyPair.publicKey, fakeData)),\n },\n sharedSignatureKey: {\n ...data.sharedSignatureKey,\n [extraKeyPairFp]: ua2b64(await hcp1Details.api.cryptoApi.primitives.RSA.encrypt(extraKeyPair.publicKey, fakeData)),\n },\n })\n }\n await tamperWithData(ed1to2.exchangeData)\n await tamperWithData(ed2to1.exchangeData)\n const newKeyPair = await hcp1Details.api.cryptoApi.primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const exportedPub = ua2hex(await hcp1Details.api.cryptoApi.primitives.RSA.exportKey(newKeyPair.publicKey, 'spki'))\n const hcp2 = await hcp2Details.api.healthcarePartyApi.getHealthcareParty(hcp2Details.credentials.dataOwnerId)\n await hcp2Details.api.healthcarePartyApi.modifyHealthcareParty({\n ...hcp2,\n publicKeysForOaepWithSha256: [...hcp2.publicKeysForOaepWithSha256, exportedPub, extraKeyPairPub],\n })\n await hcp1Details.api.cryptoApi.exchangeData.giveAccessBackTo(hcp2Details.credentials.dataOwnerId, exportedPub)\n await hcp1Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n await hcp2Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n const updatedEd1to2 = await hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId, false)\n const updatedEd2to1 = await hcp2Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp1Details.credentials.dataOwnerId, false)\n expect(updatedEd1to2.exchangeData.id).to.not.equal(ed1to2.exchangeData.id)\n expect(updatedEd2to1.exchangeData.id).to.not.equal(ed2to1.exchangeData.id)\n const decData1to2 = (await hcp1Details.api.cryptoApi.exchangeData.getDecryptionDataKeyByIds([ed1to2.exchangeData.id!], true))[\n ed1to2.exchangeData.id!\n ]\n expect(decData1to2).to.not.be.undefined\n expect(decData1to2!.exchangeKey).to.not.be.undefined\n expect(decData1to2!.accessControlSecret).to.not.be.undefined\n const decData2to1 = (await hcp2Details.api.cryptoApi.exchangeData.getDecryptionDataKeyByIds([ed2to1.exchangeData.id!], true))[\n ed2to1.exchangeData.id!\n ]\n expect(decData2to1).to.not.be.undefined\n expect(decData2to1!.exchangeKey).to.not.be.undefined\n expect(decData2to1!.accessControlSecret).to.not.be.undefined\n })\n})\n"]}
|
|
1
|
+
{"version":3,"file":"exchange-data-manager-test.js","sourceRoot":"","sources":["../../../../test/icc-x-api/crypto/exchange-data-manager-test.ts"],"names":[],"mappings":"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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"]}
|