@icure/api 8.0.24 → 8.0.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/icc-x-api/crypto/AES.d.ts +54 -2
  2. package/icc-x-api/crypto/AES.js +5 -5
  3. package/icc-x-api/crypto/AES.js.map +1 -1
  4. package/icc-x-api/crypto/CryptoPrimitives.d.ts +21 -12
  5. package/icc-x-api/crypto/CryptoPrimitives.js +8 -19
  6. package/icc-x-api/crypto/CryptoPrimitives.js.map +1 -1
  7. package/icc-x-api/crypto/DelegationsDeAnonymization.js +1 -1
  8. package/icc-x-api/crypto/DelegationsDeAnonymization.js.map +1 -1
  9. package/icc-x-api/crypto/HMACUtils.d.ts +8 -1
  10. package/icc-x-api/crypto/HMACUtils.js +3 -3
  11. package/icc-x-api/crypto/HMACUtils.js.map +1 -1
  12. package/icc-x-api/crypto/NativeCryptoPrimitivesBridge.d.ts +113 -0
  13. package/icc-x-api/crypto/NativeCryptoPrimitivesBridge.js +477 -0
  14. package/icc-x-api/crypto/NativeCryptoPrimitivesBridge.js.map +1 -0
  15. package/icc-x-api/crypto/RSA.d.ts +107 -4
  16. package/icc-x-api/crypto/RSA.js +4 -4
  17. package/icc-x-api/crypto/RSA.js.map +1 -1
  18. package/icc-x-api/crypto/shamir.d.ts +7 -3
  19. package/icc-x-api/crypto/shamir.js +14 -5
  20. package/icc-x-api/crypto/shamir.js.map +1 -1
  21. package/icc-x-api/index.d.ts +1 -0
  22. package/icc-x-api/index.js +5 -3
  23. package/icc-x-api/index.js.map +1 -1
  24. package/package.json +1 -1
  25. package/test/icc-api/api/IccMedicalLocationApi.js +6 -6
  26. package/test/icc-api/api/IccMedicalLocationApi.js.map +1 -1
  27. package/test/icc-x-api/crud/comprehensive-crud-test.js +1 -1
  28. package/test/icc-x-api/crud/comprehensive-crud-test.js.map +1 -1
  29. package/test/icc-x-api/crud/entities-crud-test-interface.js +1 -0
  30. package/test/icc-x-api/crud/entities-crud-test-interface.js.map +1 -1
  31. package/test/icc-x-api/crypto/anonymous-delegations-test.js +1 -2
  32. package/test/icc-x-api/crypto/anonymous-delegations-test.js.map +1 -1
  33. package/test/icc-x-api/crypto/crypto-utils.js +1 -2
  34. package/test/icc-x-api/crypto/crypto-utils.js.map +1 -1
  35. package/test/icc-x-api/crypto/exchange-data-manager-test.js +1 -1
  36. package/test/icc-x-api/crypto/exchange-data-manager-test.js.map +1 -1
  37. package/test/icc-x-api/crypto/full-crypto-test.js +1 -2
  38. package/test/icc-x-api/crypto/full-crypto-test.js.map +1 -1
  39. package/test/icc-x-api/crypto/secure-delegations-manager-test.js +1 -1
  40. package/test/icc-x-api/crypto/secure-delegations-manager-test.js.map +1 -1
  41. package/test/icc-x-api/crypto/secure-delegations-metadata-decryptor-test.js +2 -2
  42. package/test/icc-x-api/crypto/secure-delegations-metadata-decryptor-test.js.map +1 -1
  43. package/test/icc-x-api/crypto/shamir.js +6 -7
  44. package/test/icc-x-api/crypto/shamir.js.map +1 -1
  45. package/test/icc-x-api/crypto/signature-keys-manager-test.js +1 -1
  46. package/test/icc-x-api/crypto/signature-keys-manager-test.js.map +1 -1
  47. package/test/icc-x-api/icc-maintenance-task-x-api-test.js +3 -2
  48. package/test/icc-x-api/icc-maintenance-task-x-api-test.js.map +1 -1
  49. package/test/icc-x-api/icc-user-x-api-test.js +1 -1
  50. package/test/icc-x-api/icc-user-x-api-test.js.map +1 -1
  51. package/test/icc-x-api/patient-user.js +1 -2
  52. package/test/icc-x-api/patient-user.js.map +1 -1
  53. package/test/icc-x-api/test-legacy-data-support.js +2 -3
  54. package/test/icc-x-api/test-legacy-data-support.js.map +1 -1
  55. package/test/utils/FakeDataOwnerApi.js +1 -1
  56. package/test/utils/FakeDataOwnerApi.js.map +1 -1
  57. package/test/utils/FakeGenericApi.js +1 -1
  58. package/test/utils/FakeGenericApi.js.map +1 -1
  59. package/test/utils/TestApi.js +1 -1
  60. package/test/utils/TestApi.js.map +1 -1
  61. package/test/utils/TestCryptoStrategies.js +1 -1
  62. package/test/utils/TestCryptoStrategies.js.map +1 -1
  63. package/test/utils/test_utils.js +6 -6
  64. package/test/utils/test_utils.js.map +1 -1
  65. package/test/icc-api/api/IccArticleApi.d.ts +0 -1
  66. package/test/icc-api/api/IccArticleApi.js +0 -64
  67. package/test/icc-api/api/IccArticleApi.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"secure-delegations-metadata-decryptor-test.js","sourceRoot":"","sources":["../../../../test/icc-x-api/crypto/secure-delegations-metadata-decryptor-test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe } from 'mocha'\nimport { CryptoPrimitives } from '../../../icc-x-api/crypto/CryptoPrimitives'\nimport { webcrypto } from 'crypto'\nimport { FakeEncryptionKeysManager } from '../../utils/FakeEncryptionKeysManager'\nimport { SecureDelegationsSecurityMetadataDecryptor } from '../../../icc-x-api/crypto/SecureDelegationsSecurityMetadataDecryptor'\nimport { SecureDelegationsEncryption } from '../../../icc-x-api/crypto/SecureDelegationsEncryption'\nimport { FakeDecryptionExchangeDataManager } from '../../utils/FakeExchangeDataManager'\nimport { EncryptedEntityWithType, EntityWithDelegationTypeName } from '../../../icc-x-api/utils/EntityWithDelegationTypeName'\nimport { ExchangeData } from '../../../icc-api/model/internal/ExchangeData'\nimport { expect } from 'chai'\nimport { IcureStub } from '../../../icc-api/model/IcureStub'\nimport { SecureDelegation } from '../../../icc-api/model/SecureDelegation'\nimport { ShaVersion, ua2hex } from '../../../icc-x-api'\nimport { SecurityMetadata } from '../../../icc-api/model/SecurityMetadata'\nimport { asyncGeneratorToArray } from '../../../icc-x-api/utils/collection-utils'\nimport { FakeExchangeDataMapManager } from '../../utils/FakeExchangeDataMapManager'\nimport AccessLevel = SecureDelegation.AccessLevelEnum\n\ndescribe('Secure delegations security metadata decryptor', async function () {\n const primitives = new CryptoPrimitives(webcrypto as any)\n const expectedType: EntityWithDelegationTypeName = EntityWithDelegationTypeName.AccessLog\n const expectedSfks = [primitives.randomUuid(), primitives.randomUuid()]\n let encryptionKeysManager: FakeEncryptionKeysManager\n let exchangeData: FakeDecryptionExchangeDataManager\n let exchangeDataMap: FakeExchangeDataMapManager\n let decryptor: SecureDelegationsSecurityMetadataDecryptor\n let secureDelegationsEncryption: SecureDelegationsEncryption\n\n class SecureDelegationWithEncryptedExchangeId extends SecureDelegation {\n constructor(json: JSON | any) {\n super(json)\n Object.assign(this as SecureDelegationWithEncryptedExchangeId, json)\n }\n\n encryptedExchangeDataId!: { [fp: string]: string }\n }\n\n async function cacheExchangeDataMaps(secureDelegations: { [hash: string]: SecureDelegationWithEncryptedExchangeId }) {\n await exchangeDataMap.createExchangeDataMaps(\n Object.entries(secureDelegations).reduce((p, [hash, secDel]) => {\n return {\n ...p,\n [hash]: secDel.encryptedExchangeDataId,\n }\n }, {} as { [hash: string]: { [fp: string]: string } })\n )\n }\n\n async function initialiseComponents() {\n encryptionKeysManager = await FakeEncryptionKeysManager.create(primitives, [], [await primitives.RSA.generateKeyPair(ShaVersion.Sha256)])\n exchangeData = new FakeDecryptionExchangeDataManager(expectedType, expectedSfks, new CryptoPrimitives(webcrypto as any))\n exchangeDataMap = new FakeExchangeDataMapManager()\n secureDelegationsEncryption = new SecureDelegationsEncryption(encryptionKeysManager, primitives)\n decryptor = new SecureDelegationsSecurityMetadataDecryptor(exchangeData, exchangeDataMap, secureDelegationsEncryption, undefined as any) // data owner api not used in these tests\n }\n\n async function randomHash(): Promise<string> {\n return ua2hex(await primitives.sha256(primitives.randomBytes(4)))\n }\n\n async function createExchangeDataAndSecureDelegationEncryptedData(\n exchangeDataDelegator: string,\n exchangeDataDelegate: string\n ): Promise<{\n exchangeData: ExchangeData\n exchangeKey: CryptoKey\n secureDelegationEncryptedData: {\n secretIds: string[]\n encryptionKeys: string[]\n owningEntityIds: string[]\n }\n expectedDecryptedData: {\n secretIds: string[]\n encryptionKeys: string[]\n owningEntityIds: string[]\n }\n }> {\n const exchangeKey = await primitives.AES.generateCryptoKey(false)\n const exchangeData = new ExchangeData({\n id: primitives.randomUuid(),\n delegator: exchangeDataDelegator,\n delegate: exchangeDataDelegate,\n exchangeKey: { ignored: 'in this test' },\n accessControlSecret: { ignored: 'in this test' },\n sharedSignatureKey: { ignored: 'in this test' },\n delegatorSignature: { ignored: 'in this test' },\n sharedSignature: 'ignored in this test',\n })\n const expectedDecryptedData = {\n secretIds: [primitives.randomUuid(), primitives.randomUuid()],\n encryptionKeys: [await primitives.AES.generateCryptoKey(true), await primitives.AES.generateCryptoKey(true)],\n owningEntityIds: [primitives.randomUuid(), primitives.randomUuid()],\n }\n const secureDelegationEncryptedData = {\n secretIds: await Promise.all(expectedDecryptedData.secretIds.map((x) => secureDelegationsEncryption.encryptSecretId(x, exchangeKey))),\n encryptionKeys: await Promise.all(\n expectedDecryptedData.encryptionKeys.map((x) => secureDelegationsEncryption.encryptEncryptionKey(x, exchangeKey))\n ),\n owningEntityIds: await Promise.all(\n expectedDecryptedData.owningEntityIds.map((x) => secureDelegationsEncryption.encryptOwningEntityId(x, exchangeKey))\n ),\n }\n return { exchangeKey, exchangeData, expectedDecryptedData, secureDelegationEncryptedData }\n }\n\n function entityWithSecurityMetadata(securityMetadata: SecurityMetadata): EncryptedEntityWithType {\n return {\n entity: new IcureStub({\n secretForeignKeys: expectedSfks,\n securityMetadata,\n }),\n type: expectedType,\n }\n }\n\n function toSortedJson(data: { decrypted: string; dataOwnersWithAccess: string[] }): string {\n return JSON.stringify({\n decrypted: data.decrypted,\n dataOwnersWithAccess: [...data.dataOwnersWithAccess].sort(),\n })\n }\n\n async function verifyCanDecryptEntityData(\n entity: EncryptedEntityWithType,\n dataOwnerHierarchySubset: string[],\n expected: {\n exchangeData: ExchangeData\n expectedDecryptedData: {\n secretIds: string[]\n encryptionKeys: string[]\n owningEntityIds: string[]\n }\n }[]\n ) {\n const actualSecretIds = (await asyncGeneratorToArray(decryptor.decryptSecretIdsOf(entity, dataOwnerHierarchySubset))).map(toSortedJson)\n const actualOwningEntityIds = (await asyncGeneratorToArray(decryptor.decryptOwningEntityIdsOf(entity, dataOwnerHierarchySubset))).map(\n toSortedJson\n )\n const actualEncryptionKeys = (await asyncGeneratorToArray(decryptor.decryptEncryptionKeysOf(entity, dataOwnerHierarchySubset))).map(toSortedJson)\n const expectedSecretIds: string[] = []\n const expectedOwningEntityIds: string[] = []\n const expectedEncryptionKeys: string[] = []\n for (const data of expected) {\n data.expectedDecryptedData.secretIds.forEach((x) =>\n expectedSecretIds.push(toSortedJson({ decrypted: x, dataOwnersWithAccess: [data.exchangeData.delegate, data.exchangeData.delegator] }))\n )\n data.expectedDecryptedData.owningEntityIds.forEach((x) =>\n expectedOwningEntityIds.push(toSortedJson({ decrypted: x, dataOwnersWithAccess: [data.exchangeData.delegate, data.exchangeData.delegator] }))\n )\n data.expectedDecryptedData.encryptionKeys.forEach((x) =>\n expectedEncryptionKeys.push(toSortedJson({ decrypted: x, dataOwnersWithAccess: [data.exchangeData.delegate, data.exchangeData.delegator] }))\n )\n }\n expect(actualSecretIds).to.have.members(expectedSecretIds)\n expect(actualOwningEntityIds).to.have.members(expectedOwningEntityIds)\n expect(actualEncryptionKeys).to.have.members(expectedEncryptionKeys)\n }\n\n it('should be able to decrypt data from a secure delegation accessible by hash if the hash is cached', async function () {\n await initialiseComponents()\n const self = primitives.randomUuid()\n const createdData1 = await createExchangeDataAndSecureDelegationEncryptedData(self, primitives.randomUuid())\n const createdData2 = await createExchangeDataAndSecureDelegationEncryptedData(primitives.randomUuid(), self)\n const delegation1 = new SecureDelegation({\n ...createdData1.secureDelegationEncryptedData,\n delegator: undefined,\n delegate: undefined,\n exchangeDataId: undefined,\n encryptedExchangeDataId: undefined,\n permissions: AccessLevel.WRITE,\n })\n const delegation2 = new SecureDelegation({\n ...createdData2.secureDelegationEncryptedData,\n delegator: undefined,\n delegate: undefined,\n exchangeDataId: undefined,\n encryptedExchangeDataId: undefined,\n permissions: AccessLevel.WRITE,\n })\n const hash1 = await randomHash()\n const hash2 = await randomHash()\n const hash3 = await randomHash()\n const entity = entityWithSecurityMetadata(\n new SecurityMetadata({\n secureDelegations: { [hash1]: delegation1, [hash2]: delegation2 },\n keysEquivalences: { [hash3]: hash2 },\n })\n )\n exchangeData.cacheFakeData(createdData1.exchangeData, { exchangeKey: createdData1.exchangeKey, hashes: [hash1] })\n exchangeData.cacheFakeData(createdData2.exchangeData, { exchangeKey: createdData2.exchangeKey, hashes: [hash3] })\n await verifyCanDecryptEntityData(entity, [self], [createdData1, createdData2])\n })\n\n it('should be able to decrypt data from a secure delegation with clear text id where the delegator or delegate are in dataOwnersHierarchySubset', async function () {\n await initialiseComponents()\n const self = primitives.randomUuid()\n const other1 = primitives.randomUuid()\n const other2 = primitives.randomUuid()\n const createdData1 = await createExchangeDataAndSecureDelegationEncryptedData(self, other1)\n const createdData2 = await createExchangeDataAndSecureDelegationEncryptedData(other2, self)\n const delegation1 = new SecureDelegation({\n ...createdData1.secureDelegationEncryptedData,\n delegator: self,\n delegate: other1,\n exchangeDataId: createdData1.exchangeData.id,\n encryptedExchangeDataId: undefined,\n permissions: AccessLevel.WRITE,\n })\n const delegation2 = new SecureDelegation({\n ...createdData2.secureDelegationEncryptedData,\n delegator: other2,\n delegate: self,\n exchangeDataId: createdData2.exchangeData.id,\n encryptedExchangeDataId: undefined,\n permissions: AccessLevel.WRITE,\n })\n const entity = entityWithSecurityMetadata(\n new SecurityMetadata({\n secureDelegations: { [await randomHash()]: delegation1, [await randomHash()]: delegation2 },\n })\n )\n exchangeData.cacheFakeData(createdData1.exchangeData, { exchangeKey: createdData1.exchangeKey, hashes: [] }, true)\n exchangeData.cacheFakeData(createdData2.exchangeData, { exchangeKey: createdData2.exchangeKey, hashes: [] })\n await verifyCanDecryptEntityData(entity, [self], [createdData1, createdData2])\n })\n\n it('should be able to decrypt data from a secure delegation with encrypted id if the keys to decrypt the id are available and the delegator or delegate is in dataOwnersHierarchySubset', async function () {\n await initialiseComponents()\n const self = primitives.randomUuid()\n const createdData1 = await createExchangeDataAndSecureDelegationEncryptedData(self, primitives.randomUuid())\n const createdData2 = await createExchangeDataAndSecureDelegationEncryptedData(primitives.randomUuid(), self)\n const encryptionKeys = Object.fromEntries(Object.entries(encryptionKeysManager.getDecryptionKeys()).map(([fp, pair]) => [fp, pair.publicKey]))\n const delegation1 = new SecureDelegationWithEncryptedExchangeId({\n ...createdData1.secureDelegationEncryptedData,\n delegator: self,\n encryptedExchangeDataId: await secureDelegationsEncryption.encryptExchangeDataId(createdData1.exchangeData.id!, encryptionKeys),\n permissions: AccessLevel.WRITE,\n })\n const delegation2 = new SecureDelegationWithEncryptedExchangeId({\n ...createdData2.secureDelegationEncryptedData,\n delegate: self,\n encryptedExchangeDataId: await secureDelegationsEncryption.encryptExchangeDataId(createdData2.exchangeData.id!, encryptionKeys),\n permissions: AccessLevel.WRITE,\n })\n const secureDelegations = { [await randomHash()]: delegation1, [await randomHash()]: delegation2 }\n const entity = entityWithSecurityMetadata(\n new SecurityMetadata({\n secureDelegations: secureDelegations,\n })\n )\n exchangeData.cacheFakeData(createdData1.exchangeData, { exchangeKey: createdData1.exchangeKey, hashes: [] }, true)\n exchangeData.cacheFakeData(createdData2.exchangeData, { exchangeKey: createdData2.exchangeKey, hashes: [] })\n await cacheExchangeDataMaps(secureDelegations)\n await verifyCanDecryptEntityData(entity, [self], [createdData1, createdData2])\n })\n\n it('should be able to decrypt data from secure delegations accessible by encrypted or cleartext id', async function () {\n await initialiseComponents()\n const self = primitives.randomUuid()\n const other1 = primitives.randomUuid()\n const other2 = primitives.randomUuid()\n const createdData1 = await createExchangeDataAndSecureDelegationEncryptedData(self, other1)\n const createdData2 = await createExchangeDataAndSecureDelegationEncryptedData(other2, self)\n const createdData3 = await createExchangeDataAndSecureDelegationEncryptedData(self, primitives.randomUuid())\n const createdData4 = await createExchangeDataAndSecureDelegationEncryptedData(primitives.randomUuid(), self)\n const encryptionKeys = Object.fromEntries(Object.entries(encryptionKeysManager.getDecryptionKeys()).map(([fp, pair]) => [fp, pair.publicKey]))\n const delegation1 = new SecureDelegationWithEncryptedExchangeId({\n ...createdData1.secureDelegationEncryptedData,\n delegator: self,\n delegate: other1,\n exchangeDataId: createdData1.exchangeData.id,\n encryptedExchangeDataId: undefined,\n permissions: AccessLevel.WRITE,\n })\n const delegation2 = new SecureDelegationWithEncryptedExchangeId({\n ...createdData2.secureDelegationEncryptedData,\n delegator: other2,\n delegate: self,\n exchangeDataId: createdData2.exchangeData.id,\n encryptedExchangeDataId: undefined,\n permissions: AccessLevel.WRITE,\n })\n const delegation3 = new SecureDelegationWithEncryptedExchangeId({\n ...createdData3.secureDelegationEncryptedData,\n delegator: self,\n encryptedExchangeDataId: await secureDelegationsEncryption.encryptExchangeDataId(createdData3.exchangeData.id!, encryptionKeys),\n permissions: AccessLevel.WRITE,\n })\n const delegation4 = new SecureDelegationWithEncryptedExchangeId({\n ...createdData4.secureDelegationEncryptedData,\n delegate: self,\n encryptedExchangeDataId: await secureDelegationsEncryption.encryptExchangeDataId(createdData4.exchangeData.id!, encryptionKeys),\n permissions: AccessLevel.WRITE,\n })\n const secureDelegations = {\n [await randomHash()]: delegation1,\n [await randomHash()]: delegation2,\n [await randomHash()]: delegation3,\n [await randomHash()]: delegation4,\n }\n const entity = entityWithSecurityMetadata(\n new SecurityMetadata({\n secureDelegations: secureDelegations,\n })\n )\n exchangeData.cacheFakeData(createdData1.exchangeData, { exchangeKey: createdData1.exchangeKey, hashes: [] }, true)\n exchangeData.cacheFakeData(createdData2.exchangeData, { exchangeKey: createdData2.exchangeKey, hashes: [] })\n exchangeData.cacheFakeData(createdData3.exchangeData, { exchangeKey: createdData3.exchangeKey, hashes: [] }, true)\n exchangeData.cacheFakeData(createdData4.exchangeData, { exchangeKey: createdData4.exchangeKey, hashes: [] })\n await cacheExchangeDataMaps(secureDelegations)\n await verifyCanDecryptEntityData(entity, [self], [createdData1, createdData2, createdData3, createdData4])\n })\n\n // Note: mixed scenario where part of secure delegation is accessible by hash and part by id (clear-text or encrypted) is not realistic and not tested\n\n it('should ignore delegations accessible by id where the neither the delegator nor delegate are in dataOwnersHierarchySubset', async function () {\n await initialiseComponents()\n const createdData1 = await createExchangeDataAndSecureDelegationEncryptedData(primitives.randomUuid(), primitives.randomUuid())\n const createdData2 = await createExchangeDataAndSecureDelegationEncryptedData(primitives.randomUuid(), primitives.randomUuid())\n const delegation1 = new SecureDelegation({\n ...createdData1.secureDelegationEncryptedData,\n delegator: primitives.randomUuid(),\n delegate: primitives.randomUuid(),\n exchangeDataId: createdData1.exchangeData.id,\n encryptedExchangeDataId: undefined,\n permissions: AccessLevel.WRITE,\n })\n const delegation2 = new SecureDelegation({\n ...createdData2.secureDelegationEncryptedData,\n delegator: primitives.randomUuid(),\n delegate: primitives.randomUuid(),\n exchangeDataId: createdData2.exchangeData.id,\n encryptedExchangeDataId: undefined,\n permissions: AccessLevel.WRITE,\n })\n const entity = entityWithSecurityMetadata(\n new SecurityMetadata({\n secureDelegations: { [await randomHash()]: delegation1, [await randomHash()]: delegation2 },\n })\n )\n await verifyCanDecryptEntityData(entity, [primitives.randomUuid()], [])\n })\n\n it('should ignore secure delegation with encrypted id if the keys to decrypt the id are not available', async function () {\n await initialiseComponents()\n const self = primitives.randomUuid()\n const createdData = await createExchangeDataAndSecureDelegationEncryptedData(self, primitives.randomUuid())\n const newKey = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const newKeyFp = ua2hex(await primitives.RSA.exportKey(newKey.publicKey, 'spki')).slice(-32)\n const delegation = new SecureDelegationWithEncryptedExchangeId({\n ...createdData.secureDelegationEncryptedData,\n delegator: self,\n encryptedExchangeDataId: await secureDelegationsEncryption.encryptExchangeDataId(createdData.exchangeData.id!, {\n [newKeyFp]: newKey.publicKey,\n }),\n permissions: AccessLevel.WRITE,\n })\n const secureDelegation = { [await randomHash()]: delegation }\n const entity = entityWithSecurityMetadata(\n new SecurityMetadata({\n secureDelegations: secureDelegation,\n })\n )\n exchangeData.cacheFakeData(createdData.exchangeData, { exchangeKey: createdData.exchangeKey, hashes: [] })\n await cacheExchangeDataMaps(secureDelegation)\n await verifyCanDecryptEntityData(entity, [self], [])\n })\n\n it('should ignore secure delegations corresponding to exchange data which could not be decrypted', async function () {\n await initialiseComponents()\n const self = primitives.randomUuid()\n const other1 = primitives.randomUuid()\n const other2 = primitives.randomUuid()\n const createdData1 = await createExchangeDataAndSecureDelegationEncryptedData(self, other1)\n const createdData2 = await createExchangeDataAndSecureDelegationEncryptedData(other2, self)\n const delegation1 = new SecureDelegation({\n ...createdData1.secureDelegationEncryptedData,\n delegator: self,\n delegate: other1,\n exchangeDataId: createdData1.exchangeData.id,\n encryptedExchangeDataId: undefined,\n permissions: AccessLevel.WRITE,\n })\n const delegation2 = new SecureDelegation({\n ...createdData2.secureDelegationEncryptedData,\n delegator: other2,\n delegate: self,\n exchangeDataId: createdData2.exchangeData.id,\n encryptedExchangeDataId: undefined,\n permissions: AccessLevel.WRITE,\n })\n const entity = entityWithSecurityMetadata(\n new SecurityMetadata({\n secureDelegations: { [await randomHash()]: delegation1, [await randomHash()]: delegation2 },\n })\n )\n exchangeData.cacheFakeData(createdData1.exchangeData, { exchangeKey: createdData1.exchangeKey, hashes: [] })\n exchangeData.cacheFakeData(createdData2.exchangeData, undefined)\n await verifyCanDecryptEntityData(entity, [self], [createdData1])\n })\n\n it('should give an error if dataOwnersHierarchySubset is empty', async function () {\n await initialiseComponents()\n const entity = {\n entity: new IcureStub({ secretForeignKeys: expectedSfks }),\n type: expectedType,\n }\n let failed = 0\n try {\n decryptor.decryptEncryptionKeysOf(entity, [])\n } catch (e) {\n console.log(e)\n failed++\n }\n try {\n decryptor.decryptSecretIdsOf(entity, [])\n } catch (e) {\n console.log(e)\n failed++\n }\n try {\n decryptor.decryptOwningEntityIdsOf(entity, [])\n } catch (e) {\n console.log(e)\n failed++\n }\n try {\n await decryptor.getEntityAccessLevel(entity, [])\n } catch (e) {\n console.log(e)\n failed++\n }\n expect(failed).to.equal(4)\n })\n\n it('should return the best access level with directly accessible secure delegations', async function () {\n await initialiseComponents()\n const dataOwnerA = primitives.randomUuid()\n const dataOwnerB = primitives.randomUuid()\n const secureDelegationWriteA = new SecureDelegation({ delegator: dataOwnerA, permissions: AccessLevel.WRITE })\n const secureDelegationReadA = new SecureDelegation({ delegate: dataOwnerA, permissions: AccessLevel.READ })\n const secureDelegationWriteB = new SecureDelegation({ delegate: dataOwnerB, permissions: AccessLevel.WRITE })\n const secureDelegationReadB = new SecureDelegation({ delegator: dataOwnerB, permissions: AccessLevel.READ })\n const secureDelegationWriteOther = new SecureDelegation({ delegator: primitives.randomUuid(), permissions: AccessLevel.WRITE })\n const secureDelegationReadOther = new SecureDelegation({ delegator: primitives.randomUuid(), permissions: AccessLevel.READ })\n expect(\n await decryptor.getEntityAccessLevel(\n entityWithSecurityMetadata({\n secureDelegations: {\n [await randomHash()]: secureDelegationReadA,\n [await randomHash()]: secureDelegationWriteOther,\n [await randomHash()]: secureDelegationWriteB,\n },\n }),\n [dataOwnerA]\n )\n ).to.equal(AccessLevel.READ)\n expect(\n await decryptor.getEntityAccessLevel(\n entityWithSecurityMetadata({\n secureDelegations: {\n [await randomHash()]: secureDelegationReadA,\n [await randomHash()]: secureDelegationWriteOther,\n [await randomHash()]: secureDelegationWriteB,\n },\n }),\n [dataOwnerB]\n )\n ).to.equal(AccessLevel.WRITE)\n expect(\n await decryptor.getEntityAccessLevel(\n entityWithSecurityMetadata({\n secureDelegations: {\n [await randomHash()]: secureDelegationReadOther,\n [await randomHash()]: secureDelegationWriteB,\n },\n }),\n [dataOwnerA]\n )\n ).to.equal(undefined)\n expect(\n await decryptor.getEntityAccessLevel(\n entityWithSecurityMetadata({\n secureDelegations: {\n [await randomHash()]: secureDelegationReadA,\n [await randomHash()]: secureDelegationWriteOther,\n [await randomHash()]: secureDelegationWriteB,\n },\n }),\n [dataOwnerA, dataOwnerB]\n )\n ).to.equal(AccessLevel.WRITE)\n expect(\n await decryptor.getEntityAccessLevel(\n entityWithSecurityMetadata({\n secureDelegations: {\n [await randomHash()]: secureDelegationReadA,\n [await randomHash()]: secureDelegationReadB,\n [await randomHash()]: secureDelegationWriteOther,\n },\n }),\n [dataOwnerA, dataOwnerB]\n )\n ).to.equal(AccessLevel.READ)\n expect(\n await decryptor.getEntityAccessLevel(\n entityWithSecurityMetadata({\n secureDelegations: {\n [await randomHash()]: secureDelegationWriteA,\n },\n }),\n [dataOwnerA, dataOwnerB]\n )\n ).to.equal(AccessLevel.WRITE)\n })\n\n it('should return the best access level with secure delegations accessible through hash', async function () {\n const hashA = await randomHash()\n const hashB = await randomHash()\n const secureDelegationWriteA: [string, SecureDelegation] = [hashA, new SecureDelegation({ permissions: AccessLevel.WRITE })]\n const secureDelegationReadA: [string, SecureDelegation] = [hashA, new SecureDelegation({ permissions: AccessLevel.READ })]\n const secureDelegationWriteB: [string, SecureDelegation] = [hashB, new SecureDelegation({ permissions: AccessLevel.WRITE })]\n const secureDelegationReadB: [string, SecureDelegation] = [hashB, new SecureDelegation({ permissions: AccessLevel.READ })]\n const secureDelegationWriteOther: [string, SecureDelegation] = [\n await randomHash(),\n new SecureDelegation({ delegator: primitives.randomUuid(), permissions: AccessLevel.WRITE }),\n ]\n const secureDelegationReadOther: [string, SecureDelegation] = [\n await randomHash(),\n new SecureDelegation({ delegator: primitives.randomUuid(), permissions: AccessLevel.READ }),\n ]\n\n async function testWithEntriesAndHashes(entries: [string, SecureDelegation][], hashes: string[], expectedLevel: AccessLevel | undefined) {\n await initialiseComponents()\n for (const hash of hashes) {\n exchangeData.cacheFakeData({} as any, { exchangeKey: {} as any, hashes: [hash] })\n }\n expect(\n await decryptor.getEntityAccessLevel(\n entityWithSecurityMetadata({\n secureDelegations: Object.fromEntries(entries),\n }),\n [primitives.randomUuid()]\n )\n ).to.equal(expectedLevel)\n }\n\n await testWithEntriesAndHashes([secureDelegationReadA, secureDelegationWriteB, secureDelegationWriteOther], [hashA], AccessLevel.READ)\n await testWithEntriesAndHashes([secureDelegationReadA, secureDelegationWriteB, secureDelegationWriteOther], [hashB], AccessLevel.WRITE)\n await testWithEntriesAndHashes([secureDelegationWriteB, secureDelegationReadOther], [hashA], undefined)\n await testWithEntriesAndHashes([secureDelegationReadA, secureDelegationWriteB, secureDelegationWriteOther], [hashA, hashB], AccessLevel.WRITE)\n await testWithEntriesAndHashes([secureDelegationReadA, secureDelegationReadB, secureDelegationWriteOther], [hashA, hashB], AccessLevel.READ)\n await testWithEntriesAndHashes([secureDelegationWriteA], [hashA, hashB], AccessLevel.WRITE)\n })\n})\n"]}
1
+ {"version":3,"file":"secure-delegations-metadata-decryptor-test.js","sourceRoot":"","sources":["../../../../test/icc-x-api/crypto/secure-delegations-metadata-decryptor-test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe } from 'mocha'\nimport { CryptoPrimitives, CryptoPrimitivesImpl } from '../../../icc-x-api/crypto/CryptoPrimitives'\nimport { webcrypto } from 'crypto'\nimport { FakeEncryptionKeysManager } from '../../utils/FakeEncryptionKeysManager'\nimport { SecureDelegationsSecurityMetadataDecryptor } from '../../../icc-x-api/crypto/SecureDelegationsSecurityMetadataDecryptor'\nimport { SecureDelegationsEncryption } from '../../../icc-x-api/crypto/SecureDelegationsEncryption'\nimport { FakeDecryptionExchangeDataManager } from '../../utils/FakeExchangeDataManager'\nimport { EncryptedEntityWithType, EntityWithDelegationTypeName } from '../../../icc-x-api/utils/EntityWithDelegationTypeName'\nimport { ExchangeData } from '../../../icc-api/model/internal/ExchangeData'\nimport { expect } from 'chai'\nimport { IcureStub } from '../../../icc-api/model/IcureStub'\nimport { SecureDelegation } from '../../../icc-api/model/SecureDelegation'\nimport { ShaVersion, ua2hex } from '../../../icc-x-api'\nimport { SecurityMetadata } from '../../../icc-api/model/SecurityMetadata'\nimport { asyncGeneratorToArray } from '../../../icc-x-api/utils/collection-utils'\nimport { FakeExchangeDataMapManager } from '../../utils/FakeExchangeDataMapManager'\nimport AccessLevel = SecureDelegation.AccessLevelEnum\n\ndescribe('Secure delegations security metadata decryptor', async function () {\n const primitives = new CryptoPrimitivesImpl(webcrypto as any)\n const expectedType: EntityWithDelegationTypeName = EntityWithDelegationTypeName.AccessLog\n const expectedSfks = [primitives.randomUuid(), primitives.randomUuid()]\n let encryptionKeysManager: FakeEncryptionKeysManager\n let exchangeData: FakeDecryptionExchangeDataManager\n let exchangeDataMap: FakeExchangeDataMapManager\n let decryptor: SecureDelegationsSecurityMetadataDecryptor\n let secureDelegationsEncryption: SecureDelegationsEncryption\n\n class SecureDelegationWithEncryptedExchangeId extends SecureDelegation {\n constructor(json: JSON | any) {\n super(json)\n Object.assign(this as SecureDelegationWithEncryptedExchangeId, json)\n }\n\n encryptedExchangeDataId!: { [fp: string]: string }\n }\n\n async function cacheExchangeDataMaps(secureDelegations: { [hash: string]: SecureDelegationWithEncryptedExchangeId }) {\n await exchangeDataMap.createExchangeDataMaps(\n Object.entries(secureDelegations).reduce((p, [hash, secDel]) => {\n return {\n ...p,\n [hash]: secDel.encryptedExchangeDataId,\n }\n }, {} as { [hash: string]: { [fp: string]: string } })\n )\n }\n\n async function initialiseComponents() {\n encryptionKeysManager = await FakeEncryptionKeysManager.create(primitives, [], [await primitives.RSA.generateKeyPair(ShaVersion.Sha256)])\n exchangeData = new FakeDecryptionExchangeDataManager(expectedType, expectedSfks, new CryptoPrimitivesImpl(webcrypto as any))\n exchangeDataMap = new FakeExchangeDataMapManager()\n secureDelegationsEncryption = new SecureDelegationsEncryption(encryptionKeysManager, primitives)\n decryptor = new SecureDelegationsSecurityMetadataDecryptor(exchangeData, exchangeDataMap, secureDelegationsEncryption, undefined as any) // data owner api not used in these tests\n }\n\n async function randomHash(): Promise<string> {\n return ua2hex(await primitives.sha256(primitives.randomBytes(4)))\n }\n\n async function createExchangeDataAndSecureDelegationEncryptedData(\n exchangeDataDelegator: string,\n exchangeDataDelegate: string\n ): Promise<{\n exchangeData: ExchangeData\n exchangeKey: CryptoKey\n secureDelegationEncryptedData: {\n secretIds: string[]\n encryptionKeys: string[]\n owningEntityIds: string[]\n }\n expectedDecryptedData: {\n secretIds: string[]\n encryptionKeys: string[]\n owningEntityIds: string[]\n }\n }> {\n const exchangeKey = await primitives.AES.generateCryptoKey(false)\n const exchangeData = new ExchangeData({\n id: primitives.randomUuid(),\n delegator: exchangeDataDelegator,\n delegate: exchangeDataDelegate,\n exchangeKey: { ignored: 'in this test' },\n accessControlSecret: { ignored: 'in this test' },\n sharedSignatureKey: { ignored: 'in this test' },\n delegatorSignature: { ignored: 'in this test' },\n sharedSignature: 'ignored in this test',\n })\n const expectedDecryptedData = {\n secretIds: [primitives.randomUuid(), primitives.randomUuid()],\n encryptionKeys: [await primitives.AES.generateCryptoKey(true), await primitives.AES.generateCryptoKey(true)],\n owningEntityIds: [primitives.randomUuid(), primitives.randomUuid()],\n }\n const secureDelegationEncryptedData = {\n secretIds: await Promise.all(expectedDecryptedData.secretIds.map((x) => secureDelegationsEncryption.encryptSecretId(x, exchangeKey))),\n encryptionKeys: await Promise.all(\n expectedDecryptedData.encryptionKeys.map((x) => secureDelegationsEncryption.encryptEncryptionKey(x, exchangeKey))\n ),\n owningEntityIds: await Promise.all(\n expectedDecryptedData.owningEntityIds.map((x) => secureDelegationsEncryption.encryptOwningEntityId(x, exchangeKey))\n ),\n }\n return { exchangeKey, exchangeData, expectedDecryptedData, secureDelegationEncryptedData }\n }\n\n function entityWithSecurityMetadata(securityMetadata: SecurityMetadata): EncryptedEntityWithType {\n return {\n entity: new IcureStub({\n secretForeignKeys: expectedSfks,\n securityMetadata,\n }),\n type: expectedType,\n }\n }\n\n function toSortedJson(data: { decrypted: string; dataOwnersWithAccess: string[] }): string {\n return JSON.stringify({\n decrypted: data.decrypted,\n dataOwnersWithAccess: [...data.dataOwnersWithAccess].sort(),\n })\n }\n\n async function verifyCanDecryptEntityData(\n entity: EncryptedEntityWithType,\n dataOwnerHierarchySubset: string[],\n expected: {\n exchangeData: ExchangeData\n expectedDecryptedData: {\n secretIds: string[]\n encryptionKeys: string[]\n owningEntityIds: string[]\n }\n }[]\n ) {\n const actualSecretIds = (await asyncGeneratorToArray(decryptor.decryptSecretIdsOf(entity, dataOwnerHierarchySubset))).map(toSortedJson)\n const actualOwningEntityIds = (await asyncGeneratorToArray(decryptor.decryptOwningEntityIdsOf(entity, dataOwnerHierarchySubset))).map(\n toSortedJson\n )\n const actualEncryptionKeys = (await asyncGeneratorToArray(decryptor.decryptEncryptionKeysOf(entity, dataOwnerHierarchySubset))).map(toSortedJson)\n const expectedSecretIds: string[] = []\n const expectedOwningEntityIds: string[] = []\n const expectedEncryptionKeys: string[] = []\n for (const data of expected) {\n data.expectedDecryptedData.secretIds.forEach((x) =>\n expectedSecretIds.push(toSortedJson({ decrypted: x, dataOwnersWithAccess: [data.exchangeData.delegate, data.exchangeData.delegator] }))\n )\n data.expectedDecryptedData.owningEntityIds.forEach((x) =>\n expectedOwningEntityIds.push(toSortedJson({ decrypted: x, dataOwnersWithAccess: [data.exchangeData.delegate, data.exchangeData.delegator] }))\n )\n data.expectedDecryptedData.encryptionKeys.forEach((x) =>\n expectedEncryptionKeys.push(toSortedJson({ decrypted: x, dataOwnersWithAccess: [data.exchangeData.delegate, data.exchangeData.delegator] }))\n )\n }\n expect(actualSecretIds).to.have.members(expectedSecretIds)\n expect(actualOwningEntityIds).to.have.members(expectedOwningEntityIds)\n expect(actualEncryptionKeys).to.have.members(expectedEncryptionKeys)\n }\n\n it('should be able to decrypt data from a secure delegation accessible by hash if the hash is cached', async function () {\n await initialiseComponents()\n const self = primitives.randomUuid()\n const createdData1 = await createExchangeDataAndSecureDelegationEncryptedData(self, primitives.randomUuid())\n const createdData2 = await createExchangeDataAndSecureDelegationEncryptedData(primitives.randomUuid(), self)\n const delegation1 = new SecureDelegation({\n ...createdData1.secureDelegationEncryptedData,\n delegator: undefined,\n delegate: undefined,\n exchangeDataId: undefined,\n encryptedExchangeDataId: undefined,\n permissions: AccessLevel.WRITE,\n })\n const delegation2 = new SecureDelegation({\n ...createdData2.secureDelegationEncryptedData,\n delegator: undefined,\n delegate: undefined,\n exchangeDataId: undefined,\n encryptedExchangeDataId: undefined,\n permissions: AccessLevel.WRITE,\n })\n const hash1 = await randomHash()\n const hash2 = await randomHash()\n const hash3 = await randomHash()\n const entity = entityWithSecurityMetadata(\n new SecurityMetadata({\n secureDelegations: { [hash1]: delegation1, [hash2]: delegation2 },\n keysEquivalences: { [hash3]: hash2 },\n })\n )\n exchangeData.cacheFakeData(createdData1.exchangeData, { exchangeKey: createdData1.exchangeKey, hashes: [hash1] })\n exchangeData.cacheFakeData(createdData2.exchangeData, { exchangeKey: createdData2.exchangeKey, hashes: [hash3] })\n await verifyCanDecryptEntityData(entity, [self], [createdData1, createdData2])\n })\n\n it('should be able to decrypt data from a secure delegation with clear text id where the delegator or delegate are in dataOwnersHierarchySubset', async function () {\n await initialiseComponents()\n const self = primitives.randomUuid()\n const other1 = primitives.randomUuid()\n const other2 = primitives.randomUuid()\n const createdData1 = await createExchangeDataAndSecureDelegationEncryptedData(self, other1)\n const createdData2 = await createExchangeDataAndSecureDelegationEncryptedData(other2, self)\n const delegation1 = new SecureDelegation({\n ...createdData1.secureDelegationEncryptedData,\n delegator: self,\n delegate: other1,\n exchangeDataId: createdData1.exchangeData.id,\n encryptedExchangeDataId: undefined,\n permissions: AccessLevel.WRITE,\n })\n const delegation2 = new SecureDelegation({\n ...createdData2.secureDelegationEncryptedData,\n delegator: other2,\n delegate: self,\n exchangeDataId: createdData2.exchangeData.id,\n encryptedExchangeDataId: undefined,\n permissions: AccessLevel.WRITE,\n })\n const entity = entityWithSecurityMetadata(\n new SecurityMetadata({\n secureDelegations: { [await randomHash()]: delegation1, [await randomHash()]: delegation2 },\n })\n )\n exchangeData.cacheFakeData(createdData1.exchangeData, { exchangeKey: createdData1.exchangeKey, hashes: [] }, true)\n exchangeData.cacheFakeData(createdData2.exchangeData, { exchangeKey: createdData2.exchangeKey, hashes: [] })\n await verifyCanDecryptEntityData(entity, [self], [createdData1, createdData2])\n })\n\n it('should be able to decrypt data from a secure delegation with encrypted id if the keys to decrypt the id are available and the delegator or delegate is in dataOwnersHierarchySubset', async function () {\n await initialiseComponents()\n const self = primitives.randomUuid()\n const createdData1 = await createExchangeDataAndSecureDelegationEncryptedData(self, primitives.randomUuid())\n const createdData2 = await createExchangeDataAndSecureDelegationEncryptedData(primitives.randomUuid(), self)\n const encryptionKeys = Object.fromEntries(Object.entries(encryptionKeysManager.getDecryptionKeys()).map(([fp, pair]) => [fp, pair.publicKey]))\n const delegation1 = new SecureDelegationWithEncryptedExchangeId({\n ...createdData1.secureDelegationEncryptedData,\n delegator: self,\n encryptedExchangeDataId: await secureDelegationsEncryption.encryptExchangeDataId(createdData1.exchangeData.id!, encryptionKeys),\n permissions: AccessLevel.WRITE,\n })\n const delegation2 = new SecureDelegationWithEncryptedExchangeId({\n ...createdData2.secureDelegationEncryptedData,\n delegate: self,\n encryptedExchangeDataId: await secureDelegationsEncryption.encryptExchangeDataId(createdData2.exchangeData.id!, encryptionKeys),\n permissions: AccessLevel.WRITE,\n })\n const secureDelegations = { [await randomHash()]: delegation1, [await randomHash()]: delegation2 }\n const entity = entityWithSecurityMetadata(\n new SecurityMetadata({\n secureDelegations: secureDelegations,\n })\n )\n exchangeData.cacheFakeData(createdData1.exchangeData, { exchangeKey: createdData1.exchangeKey, hashes: [] }, true)\n exchangeData.cacheFakeData(createdData2.exchangeData, { exchangeKey: createdData2.exchangeKey, hashes: [] })\n await cacheExchangeDataMaps(secureDelegations)\n await verifyCanDecryptEntityData(entity, [self], [createdData1, createdData2])\n })\n\n it('should be able to decrypt data from secure delegations accessible by encrypted or cleartext id', async function () {\n await initialiseComponents()\n const self = primitives.randomUuid()\n const other1 = primitives.randomUuid()\n const other2 = primitives.randomUuid()\n const createdData1 = await createExchangeDataAndSecureDelegationEncryptedData(self, other1)\n const createdData2 = await createExchangeDataAndSecureDelegationEncryptedData(other2, self)\n const createdData3 = await createExchangeDataAndSecureDelegationEncryptedData(self, primitives.randomUuid())\n const createdData4 = await createExchangeDataAndSecureDelegationEncryptedData(primitives.randomUuid(), self)\n const encryptionKeys = Object.fromEntries(Object.entries(encryptionKeysManager.getDecryptionKeys()).map(([fp, pair]) => [fp, pair.publicKey]))\n const delegation1 = new SecureDelegationWithEncryptedExchangeId({\n ...createdData1.secureDelegationEncryptedData,\n delegator: self,\n delegate: other1,\n exchangeDataId: createdData1.exchangeData.id,\n encryptedExchangeDataId: undefined,\n permissions: AccessLevel.WRITE,\n })\n const delegation2 = new SecureDelegationWithEncryptedExchangeId({\n ...createdData2.secureDelegationEncryptedData,\n delegator: other2,\n delegate: self,\n exchangeDataId: createdData2.exchangeData.id,\n encryptedExchangeDataId: undefined,\n permissions: AccessLevel.WRITE,\n })\n const delegation3 = new SecureDelegationWithEncryptedExchangeId({\n ...createdData3.secureDelegationEncryptedData,\n delegator: self,\n encryptedExchangeDataId: await secureDelegationsEncryption.encryptExchangeDataId(createdData3.exchangeData.id!, encryptionKeys),\n permissions: AccessLevel.WRITE,\n })\n const delegation4 = new SecureDelegationWithEncryptedExchangeId({\n ...createdData4.secureDelegationEncryptedData,\n delegate: self,\n encryptedExchangeDataId: await secureDelegationsEncryption.encryptExchangeDataId(createdData4.exchangeData.id!, encryptionKeys),\n permissions: AccessLevel.WRITE,\n })\n const secureDelegations = {\n [await randomHash()]: delegation1,\n [await randomHash()]: delegation2,\n [await randomHash()]: delegation3,\n [await randomHash()]: delegation4,\n }\n const entity = entityWithSecurityMetadata(\n new SecurityMetadata({\n secureDelegations: secureDelegations,\n })\n )\n exchangeData.cacheFakeData(createdData1.exchangeData, { exchangeKey: createdData1.exchangeKey, hashes: [] }, true)\n exchangeData.cacheFakeData(createdData2.exchangeData, { exchangeKey: createdData2.exchangeKey, hashes: [] })\n exchangeData.cacheFakeData(createdData3.exchangeData, { exchangeKey: createdData3.exchangeKey, hashes: [] }, true)\n exchangeData.cacheFakeData(createdData4.exchangeData, { exchangeKey: createdData4.exchangeKey, hashes: [] })\n await cacheExchangeDataMaps(secureDelegations)\n await verifyCanDecryptEntityData(entity, [self], [createdData1, createdData2, createdData3, createdData4])\n })\n\n // Note: mixed scenario where part of secure delegation is accessible by hash and part by id (clear-text or encrypted) is not realistic and not tested\n\n it('should ignore delegations accessible by id where the neither the delegator nor delegate are in dataOwnersHierarchySubset', async function () {\n await initialiseComponents()\n const createdData1 = await createExchangeDataAndSecureDelegationEncryptedData(primitives.randomUuid(), primitives.randomUuid())\n const createdData2 = await createExchangeDataAndSecureDelegationEncryptedData(primitives.randomUuid(), primitives.randomUuid())\n const delegation1 = new SecureDelegation({\n ...createdData1.secureDelegationEncryptedData,\n delegator: primitives.randomUuid(),\n delegate: primitives.randomUuid(),\n exchangeDataId: createdData1.exchangeData.id,\n encryptedExchangeDataId: undefined,\n permissions: AccessLevel.WRITE,\n })\n const delegation2 = new SecureDelegation({\n ...createdData2.secureDelegationEncryptedData,\n delegator: primitives.randomUuid(),\n delegate: primitives.randomUuid(),\n exchangeDataId: createdData2.exchangeData.id,\n encryptedExchangeDataId: undefined,\n permissions: AccessLevel.WRITE,\n })\n const entity = entityWithSecurityMetadata(\n new SecurityMetadata({\n secureDelegations: { [await randomHash()]: delegation1, [await randomHash()]: delegation2 },\n })\n )\n await verifyCanDecryptEntityData(entity, [primitives.randomUuid()], [])\n })\n\n it('should ignore secure delegation with encrypted id if the keys to decrypt the id are not available', async function () {\n await initialiseComponents()\n const self = primitives.randomUuid()\n const createdData = await createExchangeDataAndSecureDelegationEncryptedData(self, primitives.randomUuid())\n const newKey = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const newKeyFp = ua2hex(await primitives.RSA.exportKey(newKey.publicKey, 'spki')).slice(-32)\n const delegation = new SecureDelegationWithEncryptedExchangeId({\n ...createdData.secureDelegationEncryptedData,\n delegator: self,\n encryptedExchangeDataId: await secureDelegationsEncryption.encryptExchangeDataId(createdData.exchangeData.id!, {\n [newKeyFp]: newKey.publicKey,\n }),\n permissions: AccessLevel.WRITE,\n })\n const secureDelegation = { [await randomHash()]: delegation }\n const entity = entityWithSecurityMetadata(\n new SecurityMetadata({\n secureDelegations: secureDelegation,\n })\n )\n exchangeData.cacheFakeData(createdData.exchangeData, { exchangeKey: createdData.exchangeKey, hashes: [] })\n await cacheExchangeDataMaps(secureDelegation)\n await verifyCanDecryptEntityData(entity, [self], [])\n })\n\n it('should ignore secure delegations corresponding to exchange data which could not be decrypted', async function () {\n await initialiseComponents()\n const self = primitives.randomUuid()\n const other1 = primitives.randomUuid()\n const other2 = primitives.randomUuid()\n const createdData1 = await createExchangeDataAndSecureDelegationEncryptedData(self, other1)\n const createdData2 = await createExchangeDataAndSecureDelegationEncryptedData(other2, self)\n const delegation1 = new SecureDelegation({\n ...createdData1.secureDelegationEncryptedData,\n delegator: self,\n delegate: other1,\n exchangeDataId: createdData1.exchangeData.id,\n encryptedExchangeDataId: undefined,\n permissions: AccessLevel.WRITE,\n })\n const delegation2 = new SecureDelegation({\n ...createdData2.secureDelegationEncryptedData,\n delegator: other2,\n delegate: self,\n exchangeDataId: createdData2.exchangeData.id,\n encryptedExchangeDataId: undefined,\n permissions: AccessLevel.WRITE,\n })\n const entity = entityWithSecurityMetadata(\n new SecurityMetadata({\n secureDelegations: { [await randomHash()]: delegation1, [await randomHash()]: delegation2 },\n })\n )\n exchangeData.cacheFakeData(createdData1.exchangeData, { exchangeKey: createdData1.exchangeKey, hashes: [] })\n exchangeData.cacheFakeData(createdData2.exchangeData, undefined)\n await verifyCanDecryptEntityData(entity, [self], [createdData1])\n })\n\n it('should give an error if dataOwnersHierarchySubset is empty', async function () {\n await initialiseComponents()\n const entity = {\n entity: new IcureStub({ secretForeignKeys: expectedSfks }),\n type: expectedType,\n }\n let failed = 0\n try {\n decryptor.decryptEncryptionKeysOf(entity, [])\n } catch (e) {\n console.log(e)\n failed++\n }\n try {\n decryptor.decryptSecretIdsOf(entity, [])\n } catch (e) {\n console.log(e)\n failed++\n }\n try {\n decryptor.decryptOwningEntityIdsOf(entity, [])\n } catch (e) {\n console.log(e)\n failed++\n }\n try {\n await decryptor.getEntityAccessLevel(entity, [])\n } catch (e) {\n console.log(e)\n failed++\n }\n expect(failed).to.equal(4)\n })\n\n it('should return the best access level with directly accessible secure delegations', async function () {\n await initialiseComponents()\n const dataOwnerA = primitives.randomUuid()\n const dataOwnerB = primitives.randomUuid()\n const secureDelegationWriteA = new SecureDelegation({ delegator: dataOwnerA, permissions: AccessLevel.WRITE })\n const secureDelegationReadA = new SecureDelegation({ delegate: dataOwnerA, permissions: AccessLevel.READ })\n const secureDelegationWriteB = new SecureDelegation({ delegate: dataOwnerB, permissions: AccessLevel.WRITE })\n const secureDelegationReadB = new SecureDelegation({ delegator: dataOwnerB, permissions: AccessLevel.READ })\n const secureDelegationWriteOther = new SecureDelegation({ delegator: primitives.randomUuid(), permissions: AccessLevel.WRITE })\n const secureDelegationReadOther = new SecureDelegation({ delegator: primitives.randomUuid(), permissions: AccessLevel.READ })\n expect(\n await decryptor.getEntityAccessLevel(\n entityWithSecurityMetadata({\n secureDelegations: {\n [await randomHash()]: secureDelegationReadA,\n [await randomHash()]: secureDelegationWriteOther,\n [await randomHash()]: secureDelegationWriteB,\n },\n }),\n [dataOwnerA]\n )\n ).to.equal(AccessLevel.READ)\n expect(\n await decryptor.getEntityAccessLevel(\n entityWithSecurityMetadata({\n secureDelegations: {\n [await randomHash()]: secureDelegationReadA,\n [await randomHash()]: secureDelegationWriteOther,\n [await randomHash()]: secureDelegationWriteB,\n },\n }),\n [dataOwnerB]\n )\n ).to.equal(AccessLevel.WRITE)\n expect(\n await decryptor.getEntityAccessLevel(\n entityWithSecurityMetadata({\n secureDelegations: {\n [await randomHash()]: secureDelegationReadOther,\n [await randomHash()]: secureDelegationWriteB,\n },\n }),\n [dataOwnerA]\n )\n ).to.equal(undefined)\n expect(\n await decryptor.getEntityAccessLevel(\n entityWithSecurityMetadata({\n secureDelegations: {\n [await randomHash()]: secureDelegationReadA,\n [await randomHash()]: secureDelegationWriteOther,\n [await randomHash()]: secureDelegationWriteB,\n },\n }),\n [dataOwnerA, dataOwnerB]\n )\n ).to.equal(AccessLevel.WRITE)\n expect(\n await decryptor.getEntityAccessLevel(\n entityWithSecurityMetadata({\n secureDelegations: {\n [await randomHash()]: secureDelegationReadA,\n [await randomHash()]: secureDelegationReadB,\n [await randomHash()]: secureDelegationWriteOther,\n },\n }),\n [dataOwnerA, dataOwnerB]\n )\n ).to.equal(AccessLevel.READ)\n expect(\n await decryptor.getEntityAccessLevel(\n entityWithSecurityMetadata({\n secureDelegations: {\n [await randomHash()]: secureDelegationWriteA,\n },\n }),\n [dataOwnerA, dataOwnerB]\n )\n ).to.equal(AccessLevel.WRITE)\n })\n\n it('should return the best access level with secure delegations accessible through hash', async function () {\n const hashA = await randomHash()\n const hashB = await randomHash()\n const secureDelegationWriteA: [string, SecureDelegation] = [hashA, new SecureDelegation({ permissions: AccessLevel.WRITE })]\n const secureDelegationReadA: [string, SecureDelegation] = [hashA, new SecureDelegation({ permissions: AccessLevel.READ })]\n const secureDelegationWriteB: [string, SecureDelegation] = [hashB, new SecureDelegation({ permissions: AccessLevel.WRITE })]\n const secureDelegationReadB: [string, SecureDelegation] = [hashB, new SecureDelegation({ permissions: AccessLevel.READ })]\n const secureDelegationWriteOther: [string, SecureDelegation] = [\n await randomHash(),\n new SecureDelegation({ delegator: primitives.randomUuid(), permissions: AccessLevel.WRITE }),\n ]\n const secureDelegationReadOther: [string, SecureDelegation] = [\n await randomHash(),\n new SecureDelegation({ delegator: primitives.randomUuid(), permissions: AccessLevel.READ }),\n ]\n\n async function testWithEntriesAndHashes(entries: [string, SecureDelegation][], hashes: string[], expectedLevel: AccessLevel | undefined) {\n await initialiseComponents()\n for (const hash of hashes) {\n exchangeData.cacheFakeData({} as any, { exchangeKey: {} as any, hashes: [hash] })\n }\n expect(\n await decryptor.getEntityAccessLevel(\n entityWithSecurityMetadata({\n secureDelegations: Object.fromEntries(entries),\n }),\n [primitives.randomUuid()]\n )\n ).to.equal(expectedLevel)\n }\n\n await testWithEntriesAndHashes([secureDelegationReadA, secureDelegationWriteB, secureDelegationWriteOther], [hashA], AccessLevel.READ)\n await testWithEntriesAndHashes([secureDelegationReadA, secureDelegationWriteB, secureDelegationWriteOther], [hashB], AccessLevel.WRITE)\n await testWithEntriesAndHashes([secureDelegationWriteB, secureDelegationReadOther], [hashA], undefined)\n await testWithEntriesAndHashes([secureDelegationReadA, secureDelegationWriteB, secureDelegationWriteOther], [hashA, hashB], AccessLevel.WRITE)\n await testWithEntriesAndHashes([secureDelegationReadA, secureDelegationReadB, secureDelegationWriteOther], [hashA, hashB], AccessLevel.READ)\n await testWithEntriesAndHashes([secureDelegationWriteA], [hashA, hashB], AccessLevel.WRITE)\n })\n})\n"]}
@@ -23,7 +23,6 @@ const TestCryptoStrategies_1 = require("../../utils/TestCryptoStrategies");
23
23
  const FilterChainMaintenanceTask_1 = require("../../../icc-api/model/FilterChainMaintenanceTask");
24
24
  const MaintenanceTaskAfterDateFilter_1 = require("../../../icc-x-api/filters/MaintenanceTaskAfterDateFilter");
25
25
  const KeyPairUpdateRequest_1 = require("../../../icc-x-api/maintenance/KeyPairUpdateRequest");
26
- const RSA_1 = require("../../../icc-x-api/crypto/RSA");
27
26
  const types_1 = require("@icure/test-setup/types");
28
27
  const utils_1 = require("../../../icc-x-api/crypto/utils");
29
28
  // Data was randomly generated, not based on any real key
@@ -39,13 +38,13 @@ const crypto = crypto_1.webcrypto;
39
38
  (0, test_utils_1.setLocalStorage)(fetch);
40
39
  describe('Shamir split', () => {
41
40
  it('should return 5 splits', () => {
42
- const result = new shamir_1.ShamirClass(crypto).share(data, 5, 3);
41
+ const result = new shamir_1.WebcryptoShamir(crypto).share(data, 5, 3);
43
42
  (0, chai_1.expect)(result.length).to.equal(5);
44
43
  });
45
44
  it('should be able to split and recombine a private key', () => __awaiter(void 0, void 0, void 0, function* () {
46
- const rsa = new RSA_1.RSAUtils(crypto);
45
+ const rsa = new icc_x_api_1.RSAUtilsImpl(crypto);
47
46
  const key = (0, icc_x_api_1.ua2hex)(yield rsa.exportKey((yield rsa.generateKeyPair(icc_x_api_1.ShaVersion.Sha256)).privateKey, 'pkcs8'));
48
- const shamir = new shamir_1.ShamirClass(crypto);
47
+ const shamir = new shamir_1.WebcryptoShamir(crypto);
49
48
  const splits = shamir.share(key, 4, 3);
50
49
  const combined = shamir.combine([splits[1], splits[0], splits[3]]);
51
50
  (0, chai_1.expect)(combined).to.equal(key);
@@ -53,19 +52,19 @@ describe('Shamir split', () => {
53
52
  });
54
53
  describe('Shamir combine', () => {
55
54
  it('should return combined data from all shares', () => {
56
- (0, chai_1.expect)(new shamir_1.ShamirClass(crypto).combine(shares)).to.equal(data);
55
+ (0, chai_1.expect)(new shamir_1.WebcryptoShamir(crypto).combine(shares)).to.equal(data);
57
56
  });
58
57
  it('should return combined data with some shares', () => {
59
58
  for (let i = 0; i < 4; i++) {
60
59
  for (let j = i + 1; j < 5; j++) {
61
- (0, chai_1.expect)(new shamir_1.ShamirClass(crypto).combine(shares.filter((x, idx) => idx !== i && idx !== j))).to.equal(data);
60
+ (0, chai_1.expect)(new shamir_1.WebcryptoShamir(crypto).combine(shares.filter((x, idx) => idx !== i && idx !== j))).to.equal(data);
62
61
  }
63
62
  }
64
63
  });
65
64
  it('should fail miserably because it has not enough shares', () => {
66
65
  for (let i = 0; i < 4; i++) {
67
66
  for (let j = i + 1; j < 5; j++) {
68
- (0, chai_1.expect)(new shamir_1.ShamirClass(crypto).combine(shares.filter((x, idx) => idx === i && idx === j))).to.equal('');
67
+ (0, chai_1.expect)(new shamir_1.WebcryptoShamir(crypto).combine(shares.filter((x, idx) => idx === i && idx === j))).to.equal('');
69
68
  }
70
69
  }
71
70
  });
@@ -1 +1 @@
1
- {"version":3,"file":"shamir.js","sourceRoot":"","sources":["../../../../test/icc-x-api/crypto/shamir.ts"],"names":[],"mappings":"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","sourcesContent":["import 'isomorphic-fetch'\nimport { ShamirClass } from '../../../icc-x-api/crypto/shamir'\nimport { expect } from 'chai'\nimport 'mocha'\nimport { IcureApi, ShaVersion, ua2hex } from '../../../icc-x-api'\nimport {\n createHcpHierarchyApis,\n getEnvironmentInitializer,\n hcp1Username,\n hcp2Username,\n hcp3Username,\n setLocalStorage,\n TestUtils,\n} from '../../utils/test_utils'\nimport initApi = TestUtils.initApi\nimport { before } from 'mocha'\nimport { testStorageWithKeys } from '../../utils/TestStorage'\nimport { webcrypto } from 'crypto'\nimport { TestCryptoStrategies } from '../../utils/TestCryptoStrategies'\nimport { FilterChainMaintenanceTask } from '../../../icc-api/model/FilterChainMaintenanceTask'\nimport { MaintenanceTaskAfterDateFilter } from '../../../icc-x-api/filters/MaintenanceTaskAfterDateFilter'\nimport { KeyPairUpdateRequest } from '../../../icc-x-api/maintenance/KeyPairUpdateRequest'\nimport { RSAUtils } from '../../../icc-x-api/crypto/RSA'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { fingerprintV1, fingerprintV1toV2, fingerprintV2 } from '../../../icc-x-api/crypto/utils'\n\n// Data was randomly generated, not based on any real key\nconst data =\n '77b3bb3ac6852a388b2aea8ba1794e63c95a87d10753afbdf8672b607b0ca7c03b39b30b2303bc417de1c78b326cf52810469914ea7dd8128b9f2e5d8f376cdb16b75a8e9dffb12b7c839d6fcf9ef8b6e220ab7973ad76e057038988d9a084f06a9d83cc9c3ee998ad0fcc317bb6c7a1bed8126ceb8463d59e84b50087d15d293970606cfe61f874e3f4efb182107aa971304a88b9821e74b1e6c88e7d0bb8882ab0ba35591e4e8d829fb973a26b480fe7432537b025c1177077689e86b5ff65b39a9d618e1cd8c129ae2b2a981664074301e9265e9842ec0c9e9a95f27a1066336578e06e3f3373d3a98b3b8182e55accc6795bbe9aaaf758179d09eccecc8a21f9f77e660a99e0e652cf39077ef083020d9c9d479fb6751de39e29feb7bcf9c73ee9e9d25f54683d55a82768f603b910b40ccb006d96c25f23ccf88e620c20d5495e11e83859d38bb5314a763c76149b3bcf6d987e6e98b83583f028fd6cfc363cb544673eb5d6cf5a7f9887d78a5a5d5b0a862ca3127a6d359a1a2ea8f332360fb7c4a8fe855eac200735322cd322eab431e659377ad9f9289a2d97152598333f4ca97e8003bdbc2d8b714a72a3bdd4f1b124674d6c2eda71b59f07f073de030795c562658c1a63e03d7de12f6ff57e328f83e05462c588ec7371af9b19f726f04162db61860e2c40e3d01b46cdab6f38a526ba555d09bdbde5702d6ae977f38e51314b20d333e84e645fc08ccc59be6e87aa349ec30e9b3a6c06c9b58693b8d67e8a7259be86b240431f44fb75c05d6a8578ffced3514fecc10e5ed7a052c85484d8b86276f7cd74a57402d79e0de85cb8006272b4c61d6f71ebe6cb039c0604fd4ab6bf2e5c686c5cb10be41a06087c3a598c6115153ad0ff6fd6644de8838b877b63a1c9ad348806e6e5e4962630ce84926b0596028c9bf4fb78cad55a0c7dac4e1b46eef6f76cea2707afc5499c055e56b9545501029b714cff01e3aea3ae955607b686d21f6c453bd6291627cad9502a1d200deb13ca47f45aae1a88c7ee288d5e59c10ea5aecdd681c1f30b67720ba045c6a1174b4b1bf2ba5af90a22d6be4f281d946666015dda5ad79a20bd0c7c43c4e52ddbe10776464e76ae2e883bc5cd2ba965c775227b3ce482f1f764a95a99888ca68c023a530df6ebe0193742f233db700a100cd568342a3d4bd648ee18b6d1de8a9b7cefdcee7858feb886c013286fbafd489d57a46f70b1b676bf6a7cf74a52f13c6d09a7b23cff8a366e78d35c5c69952445739fe1cf5a5815c111808d731d37f6a33f477cee2dcfbaccba65a43e1e1b5dad4c81549a1ebef5ac1bb5814cdf58ba5849ec66095f1e3bb5a1ea48f9fa746553c15580cf98f1a06f630d0b86b95711f3d9381d50711c1f6b8e63e677c77a21a772b921935ccb17a017ce4955e8fcf8fca4bb72e9c4457bf80c471004083676b1410e697b15db4ae9026b9dd2bc222faf9e68a9e4a2eb7bf1ffbd23b23500b1f97e49f1348f64a467fae59a0d2a34c4a7d084d445a86018a48aedad5b0f7b523e5e1af3d3d66a9323cd4fd1a6f1d78611a85204fb5baf09c5b3c559e6e7b574cec7d3a62d81f3b36c43f93de072fa8477b898e824aa18cf971983f931257dccd902fac7766ef934a2e942dfe6a4bb06b103fba46e77d15e780cc58ccc343b83b310f548f46e8a49ed1750722dade4c9acb8cbc0c0fa0de153'\nconst shares = [\n '801231b3513d19f3eaa4dad6cbb40fe4fa000a0df070eda11224feda86242674698a8fa533db9790d9dbc195ca209d012ed20fb1f8c31bb4d27873521036c820f508efd74c566e73975956e54ba00174e6979a6f29ff026a452f8899d5376779020050cd5cc4d05e8c27e545fa6eb4ef25f78df9b4a3ee38ee227b26e41c71356c3408e6da6013ea1981145c7a67d1106f391d78dfd7c8b91d0aebe30901de9646e9db7f74883d05228082b71d0489c9f1214bf8910124e5be4fead82b170faa2d046ef33c27da7a6c1ff8a4c875698eea3f5a1d685ba98674ed69beaa3c2eebce9732ca3c930f5c35a3747953e6ebeae58f976cc090016ecfb5604bf65d0b87ffe4aa5ee6cc57f69b3653397857b41116141b88f3b7942a88eb98dc160d0059267300e351c740461bb440ff329ff3f1abf3b2a75f3b603b6e48165c8c032b0c1b025fed43645af4bcfe9cdfdba00aec8627f82b8c72815a00431acd2b253891085c5f47064bfa015231c62a1711a4ac6792eb39c5c2820e0d6cc2d959874302494add79ac668fa6fb226a25a3b76caafb702eb5cf63ea05e8a5506ea9fcda3530ea22f9bc9602f476868db253cc1ce9b9cd311a67613c90fad0524587ccfb43e1b36133c69e4663b2bc1f157eeda3c7e64c54b17881a485ca6434d09ef6800036fccea47be3f31c21fe015844563015153743df86f98e60f2aef6d5ee7b969818c186160117e524b9b3c2299feb934d0a08f07978447672bf021e15c40d92721694566889df7826631bae3314075e1a1db00767e1d8e7b009c66a3adaf7260c7db97a2244cafca971a7adb5d1babbb115fb178acf08e2d70640bd123538a7f71947b714a38c2b20654feb3b92f261e64481354580570ada0884951ae24684983b1b012ea66901da7f5a0df3057b3f8f0db2519bf2e02c24b109a318d4af4ce5db59f08edad34c8fbd0189c93dd91f73b19c1f6614302d6c94129d7f12671e7c8af884a932932aa59a22442191f806515c5c3facadb6d7f9ab1ae2d178976a1b35b7578a0fed708bba2da6e795a945126d0c9c5e31e945b1e17db4467a2717ccc55dcc03a11325ab5027b613416642bcdc40d9fd495f6939d2cd93bfbaaa81eac6af48ef8e07a8bcf1afc2bc0e1dd5dbfe9622c881c56176e004c0a93faa7ecb0c1aa63d980ee3832ee7ce7d2460618a52471aa2f54477ee97cb23a10c1c183ad243159839c50efacf15ec07961ddd5a7bd68205ea071695486c4801fc77f79372441a353ad23c17397976d4ffd87b5ba2ae189ec496b6de3a6648a90a8a7ba870bcbf307a847205cf3e76222e1cda233a1d96140df29b70480462eb48674925045668c2605efd0777b1fe4aab30a961d3b937bb938962849b9a70fc7def66f837e5a3509fda88e571d631f5aa53d2faa3403a8f9da43ddfd75318721ed6a70c00179696b1ba1ecaa27e7495193cbceffb7e50ff9778ecfa2c0d7525c91b7b9c3e13b9defd5d132eacbdd8d4494bab9b097cd1f0f61356e2635f6428e3d32206d4874c6aa04ee27e3b61495b491d5b855133d9ad19591cfa6a1f58acf101db2427fa4d8eca7dc69dd9c9ebab86d171adbcf1020973ad07b966e6872dd2128e7898c15538695cb80b71a8dace9561b9672639e08406f21a11cefa788c2e950d49fec187d4fb6b4e8ae95763f518c2341d9df697ab7ab87d665eabf28951cbf7aedef2139',\n '802bb4d49a350355bf17d5d888ef07ebb785be0321a99f45052578da97781985baf80a14120a4ca53805efd6a0ec53136a6d5c05192f509216b18f76f09c64338988d3a34e80ca3fc09fbf58adca1229f6e603532415b3e5ded28491c7674d1301e84ab2c80f99e88622d1b1c513f4e305887dd98331e731881b07a31c81a3a7cc1ebae004151b5e7b3aa2ff543fd5c010587ba32ebf72abf3367937d6a661ffbd21fc44f7159c35bee305da1eb588b00f197bbced404b8e099ee5e0d4c6918d5699c406454775efb5b6105eb32fa52ed054f5802fd64941bc6345de8e1a4dc3fcdd332473e398b364c793f0e6a6448c8da5f9556faac7d619ac507107da425cd24e519db5c694a355f1d86b5f73635894b5cb91596f9f58484a35f121af3df11cd1e4381327b50f7e1f965d4b0e5224cf353e8e78e1a3b6a7430d1eaa64488b9c7e0c32be8fa9631c6fbf8ce7bd0b087d53f131227c69da2462a358c626101c0a8ab59b9b55a82c1de8475db77866883934b60ab80ed53b4224a87ce8553d692c7ed3888c5972c7e6ed825845bb25639c98ce68bb0b4426c0d7a08412b423fda3d0efa16e70658bffe6e9803fe38e032048e779ff68fd6123d1fa257239dd7bf97730a79eac8f2f96b25f4ececd851cab99c31099b49d337323eb859242f1e8253a795b5c42886f7ae9cad580706f226180e79004023efb8a7c495971350e5c5773925699d37b92abf232f95cbc547b2ac3fa094f62d360810be979d0ef01ea23a034bb8146778e830f47cbf26ce9a7024fcd1d6d6c361223c9d0aafdeb0a0699da86c80d424ada0365d62edea06bfa9ec09c9729d143bcf75dbbc37cf24b21cd02a4e41f1bb709974a87958d0d8b3f50f500edb2b946523fe85d6a02ebb823c16c42635d1c1dc8c02c9928a31cb23347817658e7cbb8caa6f1cbceeccefb0cb6e2945d443f6f0365468e1bfe119d3a337fd2e844641ec5219be34d94a5377d45f07149499e3cb1cc54d2df0637dd2633f1c7cb4423ba98b087fc8c0372ab2d9a4f4b985f0306815edaf2b94dae983fe7461a462e8d52c5888dae1555d3545db71cd7866daf2cac2d2ef07f820dbec9dddbe88afe6e76fa5f08332c23b74c8146a086a34e757a2f804c9aa5d1a79db6d90e6ceb508f6fda86bf3c073b8747b9f6a995a5ad9e41d5f8544e9e0d8f7e14935b53120c56406845f02893e46bba020243a3ca7139ab2a642ed1da217d3c197de68d14677e40253e777f204473e3010d90d622d19ea7fe72d52ad2cfc798dbe31758ecaec114527e2603da3169128dcdc5db997b1b89a69e04679b303950c02f2c9683ce1b0c71ca1756948276e3cc0c69314b0b218fe5b2b331deb05634fa279053e202c9a54e4a1525752f6dc024f5e613bceb63da013e9b66dfc853ac7805c1ea1c998df9d6dd5ea06dccffd2e56adc126ea007c80415a7fbbbeacf57bcd433090b4cf2f062f08f073712272108da2672254a301a8401908dc0832719d90624371b086d5f2a0742b9ddf17b8678de11b83fad7934e30c65ad14bce2c695bb11229ccb357c3f72ec84fd84a91c00097e6f4df74f3a260fb383af46d163e0564750bf73e0babb4578fc0121d349bc115a70c9268d0a39c7926ea8168cb102f15df4e0b734d961e1d54f5e39c0392c097d7377a48872a14d3dd080a2f64841ad6253e6e5f0890edead0d2e7112b1e694a63be',\n '8039921cf0bbb6ce071087bcedf3b218d963889b79a462912dfa598663ea3841190e8602bae16905da1a399d76b47d348bedd2b0887d05811948d49d124f74e00a4d8d1f777e4d93acd45e75dfbcefa4fffaf71e075d26b54c9309782ac8a7f00ba71cd64cf78075e49cbe24c3be57b74c05ebcdb6b4c7b12004256db3cddaefb5f82191d873c7527d3cf89c60a31cf178cbf1c8f5c0318acfdbd9cab32f58b94040a590883ef4a1788b5f44f8263b5f4ab8ce304e121469ebc0783f8958764c246bf1ccd0b6b7741425fa6099e865215c2bdbad591f852e4ca0eca9cd8f3c0f934c62d818fe910ca253dab32df3177e467fc2f5c8af7d517cb645bb8857d717c16259dccc7d2535675985370bd7473e6da9e0397311df0b3bc6fcf30e40a243416d78a8ac7e686c90ed55772313d75a04fd1d226716738b10673eb01aa8eb61a7be5e8b680aed14250c1be86f09a6873c1540a912f83107c2c83216b53c2a02d41929bf564a145ea484ed8207904a592603f8e6cd6435ff7e6fcc76e873dc81ea072d91db43b7eef59a02bfe67f1aebaadace763776cbb05fdf6f7832ea20b9c1634e6b262cf097895bbff0b498864db3be0b2c831b87850fc345c7eeacd6471ff9b1a4216e9f6a7ccfe665b3f7f8c9bb2ac042c9cd07b3ff6b87dbcb836b11a259c59023b756c543772949ca1b5e83186d12bc08a9db3e2d02245741199a12e1256b787dd78a041f72ce5425123b3eec0e9196df5c065bd2391edfb222ff036d5d595e6f71a88d7bfc82dce25a43f2a8a3cfac24e35e5ec73aae6eeb0cc9e79e66d06f01c53df555ad074c454d9066f2db55982d59a74cda516707bed452ba647cd390f343374200e0aa28da34fa6755d4552ff14bd44e263d9bddef5bc1ddbea9cb754302aa28a3ec47932609e3e2035144cffd62b25e4e98401f872e0065c0eec4144428c238b6a868a40d6af2337eb7544e05b1583cf0d96e1b31d6e6f1d1321fda9258766f3e1bb708539c6615fecf84ca7c97ccb31b43af61df9a849c4e50906cb266a3ef78e7be0434dab531957a306f3fde132803e16ee79e4b6834ddd1b9a8a758fb86a44f200cd6b659d878393aa770f5238ddf181e83ee79a98ceaed26cf7c2e0029e7bf2f4bf80986250887386944e39624acd33c8da11de61c44b2a0ec1ab39fe1d612802e7f6c5d3d15a12d3e18995a9b3a92bcfc15b945bd5feb3e3e49ce232b04efb408cd2616481d5764e72ab622155908f1f1227f375d8777aaf066795e2fd2fe185109e1ff75e4381c63725f75bd973f2140cf94a7c76182c862a7c5b842b08fcb6dd630c342fede5a5678b183cc779891fb54d7ca7cf9dce2d375dbfd7d62449aa80e3e91627b3362afa1907fa144fe4ab4c10373dbd3c246549287359838ef4d5d499267b76a30aa9278cd515785c237d5999e5b752e9c3b78d5ccd68e34bee43ae3157ce272f9f764fd33c1b31ea088eb3db6c4deca8274e44cbf3289fd264a832ef3a10af912a0945027a91ac75197881ae5e0248c977e1da3ed032dc0b1c7aa1450a02d8c8bc90d06917aaa058bbd4bf08888919474be98016762d5ad2d24e8bd3a7095f58d64723fde63050c363c577a4f458e2817dc80d7ee2120e1e679f6ac417f0338f75e4a25eb3d1a649f5cc228ef72828aa9132393bbf0e8e7d28844b560f31ad8305a9cea4fd6b25e4a656cac654a47ea8a3d4',\n '804b7acd1c25024cabe3468cb1d9a9b62d9cc506b9acab173873873cf8c11eb89723a0643fa37858e21b85d7d44567b7ac25cc1c60b5d2835fef2071c89b575c893a0f5cc5db6ee8b6868fd4323ae1556574e3092508952ff36aaadc52f19f07ab62ec166cb0e2c53b162a5dfd28b709f16f3c6672ef7dcbb6955811e552afa54b6f0bda5d8ad171c78852877522a90c65990a8bd7a647994ce800565d928f84e2775e88af9991ec7be785b38274cb9ff13a0c8548ca823563920328d36b52250c94c7985d3f501cd3dcbb06e74371ea549695afdd623a61e1dcb3b3048b1f6877f57cdd710c2a6ba435555a13676e85ee635bed1f3b1272db83a5d2c7446fa250bbbe58d86bd46b77a885d5c3531a129b1250639f1abe460c79578f20254b3711197fec3f23e0765e6547d2d841f4b7e909bf7058cd882e957f691a4cd4977f305b2e484aacbf3b1f8eeb6c8bc5b56723b9144a1c5a29a32e93211ef6ac0bf48d5c6175f738b7543163975f03fb8f9ba17bbf0379bf853f3dc03117cc8e6f420544649e6293a3d25608acd282f22e43e88fcca256699989f86204e1d3301fd8730065f80cd6a1874488b7b897933c5f4b3405f0a485cffb8d1cd74f0e0292c717604b5db39fe05c0b50ed21937d5c0f9f903749dcfb96343f1a14e0e08603f792fcf85a2d3110b43ca66d87ed8ef87a38de4b1e6dfa183ebe4fe830afbb6bda48591d9c5f9679563dc2b5e58054706d2d6ee5bd3a4a49a0c96ec44d840be2213022a166554119d3db14a9ed718b4fb0c97061765c626c8a2c966ff49d46a8df4d11240317775712fac30b85083f30ab0e99cda6b1c7cebcbc6aed2f8df5cbfba1f6434cdb36238ca18279832ec1614f6ce47c6b4b998d5b6c988173ab595bfc239fa860735cb117fb480cc2d069aa39e9a9886fc9790228afef2ad08fdfb2b004f0b8758fc0e8dfab8b6fc17757a16537de26023e6be05dc40f9507d69fb28c316522dc734c894462c54618c7b033f7536cec432104eb5449aa61e50446e9b698b264fc33cce60af1601b0c4737e4328c334aeeed33ede2b8eade8723336fcbfe75ca062ea29e9ccd99f05982c4566a6df360e6f1c7d9b9fd106af106bc9c7b96264ce4f3c675345e126477e84e4c72f6a4dc5f4a1d027176bddf4b0323f2f2ceecfdebebf5d3eb87cb26353820927ac0dd00036b6bb08baadbf72984f6819ae86af8bad1f44ef423801683e4f39b0d583c24a3fe8d9e2641a083397fa9b06a9643360de82100aba32fc5251ff81a96b84bb044af38137220f41954197beda08cb7d0ad581a7311b28be59238d541423f300282b270edaf9fa9169f41bc61b42163e818b0ce4be07d37b3b42cbd41a58f8dc346a7ed649b97a5fbf34c5aa4436ba145c5f234c24f1285e882cd19bff4d3581e6ca874aeb79369225f514b7fdaf15d0fa7d128428dacbbc1ef9797fbafceb5a811a748ef8019d44e69852b9346f100966a29e2c9aa04047a09ae8b4f928bba3f4a0e6340a51a111403868c286101c5541aa6a0be2bef4685723f42617b365abbe2be3d88a676c80648a28951354f1508b0473de6f1f59c24bb2e9c0e2545b6c793207b2ebafe78dca6c0054d7c8e23c848873829b707ab8fc24b8416c150f4dc9be9137d9b6d296e13f24a2e5f1ad45ef07736b9f5068a11a7efcdf089acd21f175f9880f3eb008e112db5f870fc18470',\n '80595c0576abb7d713e414e8d4c51c45437af39ee1a156c310aca6600c533f7c34d52c7297485df80004539c021d49904da542a9f1e7879050167b9a2a48478f0aff51e0fc25e944dacd6ef9404c1cd86c6817440640007f612b2735bf5e75e4a12dba72e848fb5859a845c8fb85145db8e2aa72476a5d4b1e8a7adf4a1ed6ed328990ab81ec0d7dc18e08e441be603d0d0a80e00cd904b87005a0ab381bb6c21f16075cd0b2f978bd8fdf2d64e77870b49bb909eb98ddd281cc9ef78ef5b5e47e66f252c8ce9287724f5138cd84b1e5d8e9bb82ababf60e111f1ac4471e6ea418642d211a1123d462a11c19d8323d7725b9604db83ea8f5be99b01848c9fae94397b619a1d065fd4500d88997f73e74620e7bcbb564fe157ff59e8d0fcad4854ca5e37c807a3d15b09784f8b05c71c922c19cdc473a5813225b5ab4fc1834950b9b7cf19c29fb4c26ed4f08037118e862ffa5d22cde717ec839b05085b631ea53cffd513a270b26880f3d80b313a34abe4cf1ef0cd565fb018b551dcca88eaac33d9a87358966fb457f2c35213611cbdecdccbcda14161f676acb1df36e1c9c11b3c432448a349b3235e1c81ce83411d8c2e9a5d8f6b51fa10e68ad929799fbf1eeca5e0c5df019e12d540aee4721da8f23341b8c820cb4b35278beb947990e159f449152c4ce1e05388e1ba7e5c9db4133be326151fdfb1931853e9f97ff94fe0fe4b2bb9288c089424948f9fa1f28eba38e22aa749c9b9a5c33ebe6c61cc87edfcc83bb76c6d023e76cfa61bde5e5639c63c715ed04c6c86511308ba16b3e4aad72a41bf0203dac0bdae793d2cb37628204a9b54f2a4c916631eb4fd3d26008883438376ea3c73628543e79f8101769c529a9086b1f47754d47c446e922025c5a21766d4206f79888d279557cfbe8ad79baf8d3d008bc4786a101e43f49d972fce83c8fd745e47865897e842cce6c7a16a0a47fbea6a4154d185173ec6300a5a74c4fa88ac39a908a23cf921b88c49e52af4219b09d7fe26e3208d8aec6074cadbf08dea94364d75d57b13e43c93cfe0f60c7fc60ac0f33861e75e8ab53a294b8a428e45549b644f8202ad67fb17bc811b2cb7f5c8cce7d00475ecb7279763a6bec88c19d0f3239e1d199c1e057e1272d88dd5e71fb8f5cd1dfc199b953577cf7c8a25cd80ddfa98de8854ac3b15346277e2f7fa4aa78d5b9634675247e25b5c2654ee903c6f54341735108a8b15c388dcd50b345fc1626df0de819a564361ca44adf5fc6f97a0304f7a6d9de7d38bf64f4cb73a6729dc9ed3bcee78658ea20f0c35684c442f59c004964dedcd2c0eec2ce5704da62122226d1f0971d4804d4d63b80ce343978adc018c292d5e43dd32ef20b04b4be74994e9432a23417bc4d85102d8bd02dd614f1c3004cd8743bbca95ee249340636cbf5b5e7042af64ab51d26b1a4e35c078da2de6e9e4dd0f1687f567e1689de51f7fbc1b5aaba7690e1a490ab2f6de1a7f8b2bd4a035ff741748ca8c55629b695da023a566d124e3d53439238a83489e52392efcc97f007c301c0507373998e3301af3ffed6a8c5a4d21fd965b115be02570283fcd5771d50e67cf35e6c45f704b7361cf09b99414eb76e6401765b02ae21df989cf149d8c0995e76317bcc99e0e8637d8fe36565f199003ea440053bbcac654963f85b4bd2d980166d5027df4f6be7e653f0c203d1823441a',\n]\n\nconst crypto = webcrypto as any\nsetLocalStorage(fetch)\n\ndescribe('Shamir split', () => {\n it('should return 5 splits', () => {\n const result = new ShamirClass(crypto).share(data, 5, 3)\n expect(result.length).to.equal(5)\n })\n\n it('should be able to split and recombine a private key', async () => {\n const rsa = new RSAUtils(crypto)\n const key = ua2hex(await rsa.exportKey((await rsa.generateKeyPair(ShaVersion.Sha256)).privateKey, 'pkcs8'))\n const shamir = new ShamirClass(crypto)\n const splits = shamir.share(key, 4, 3)\n const combined = shamir.combine([splits[1], splits[0], splits[3]])\n expect(combined).to.equal(key)\n })\n})\n\ndescribe('Shamir combine', () => {\n it('should return combined data from all shares', () => {\n expect(new ShamirClass(crypto).combine(shares)).to.equal(data)\n })\n\n it('should return combined data with some shares', () => {\n for (let i = 0; i < 4; i++) {\n for (let j = i + 1; j < 5; j++) {\n expect(new ShamirClass(crypto).combine(shares.filter((x, idx) => idx !== i && idx !== j))).to.equal(data)\n }\n }\n })\n\n it('should fail miserably because it has not enough shares', () => {\n for (let i = 0; i < 4; i++) {\n for (let j = i + 1; j < 5; j++) {\n expect(new ShamirClass(crypto).combine(shares.filter((x, idx) => idx === i && idx === j))).to.equal('')\n }\n }\n })\n})\n\ndescribe('Shamir key recovery', async function () {\n this.timeout(600000)\n let env: TestVars\n\n before(async function () {\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n })\n\n it('should automatically load recoverable keys on startup', async () => {\n const hierarchyApis = await createHcpHierarchyApis(env)\n const api = hierarchyApis.childApi\n const user = hierarchyApis.childUser\n const notariesApis = [\n await initApi(env, hcp1Username),\n await initApi(env, hcp2Username),\n await initApi(env, hcp3Username),\n hierarchyApis.child2Api,\n ]\n const notariesIds = (await Promise.all(notariesApis.map((x) => x.healthcarePartyApi.getCurrentHealthcareParty()))).map((x) => x.id!)\n const pat = await api.patientApi.initConfidentialSecretId(await api.patientApi.newInstance(user), user)\n const descr = 'Confidential info'\n const confidentialData = await api.healthcareElementApi.createHealthElementWithUser(\n user,\n await api.healthcareElementApi.newInstance(user, pat, { descr }, { confidential: true })\n )\n await api.cryptoApi.shamirKeysManager.updateSelfSplits(\n { [fingerprintV1(hierarchyApis.childCredentials.publicKey)]: { notariesIds, minShares: 3 } },\n []\n )\n const lostKeyStorage = await testStorageWithKeys([\n {\n dataOwnerId: hierarchyApis.grandCredentials.dataOwnerId,\n pairs: [\n {\n keyPair: { privateKey: hierarchyApis.grandCredentials.privateKey, publicKey: hierarchyApis.grandCredentials.publicKey },\n shaVersion: ShaVersion.Sha1,\n },\n ],\n },\n {\n dataOwnerId: hierarchyApis.parentCredentials.dataOwnerId,\n pairs: [\n {\n keyPair: { privateKey: hierarchyApis.parentCredentials.privateKey, publicKey: hierarchyApis.parentCredentials.publicKey },\n shaVersion: ShaVersion.Sha1,\n },\n ],\n },\n ])\n const newKey = await api.cryptoApi.primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const lostKeyApi = await IcureApi.initialise(\n env.iCureUrl,\n {\n username: hierarchyApis.childCredentials.user,\n password: hierarchyApis.childCredentials.password,\n },\n new TestCryptoStrategies(newKey),\n webcrypto as any,\n fetch,\n {\n storage: lostKeyStorage.storage,\n keyStorage: lostKeyStorage.keyStorage,\n entryKeysFactory: lostKeyStorage.keyFactory,\n }\n )\n const lostUser = await lostKeyApi.userApi.getCurrentUser()\n const lostPatient = await lostKeyApi.patientApi.getPatientWithUser(lostUser, pat.id!)\n\n async function checkNotRecovered() {\n await lostKeyApi.cryptoApi.forceReload()\n expect(Object.keys(lostKeyApi.cryptoApi.userKeysManager.getDecryptionKeys())).to.have.length(3)\n expect(await lostKeyApi.healthcareElementApi.findBy(lostUser.healthcarePartyId!, lostPatient)).to.be.empty\n }\n\n async function giveBackAccess(notaryId: number) {\n const notaryApi = notariesApis[notaryId]\n await notaryApi.cryptoApi.forceReload()\n const delegateUser = await notaryApi.userApi.getCurrentUser()\n const notifications = (\n await notaryApi.maintenanceTaskApi.filterMaintenanceTasksByWithUser(\n delegateUser!,\n undefined,\n undefined,\n new FilterChainMaintenanceTask({\n filter: new MaintenanceTaskAfterDateFilter({\n date: new Date().getTime() - 100000,\n }),\n })\n )\n ).rows!.map((x) => KeyPairUpdateRequest.fromMaintenanceTask(x))\n const filteredNotifications = notifications.filter((x) => x.concernedDataOwnerId === lostUser.healthcarePartyId)\n expect(filteredNotifications).to.have.length(1)\n await notaryApi.icureMaintenanceTaskApi.applyKeyPairUpdate(filteredNotifications[0])\n }\n\n await checkNotRecovered()\n await giveBackAccess(0)\n await checkNotRecovered()\n await giveBackAccess(1)\n await checkNotRecovered()\n await giveBackAccess(2)\n await giveBackAccess(3)\n await lostKeyApi.cryptoApi.forceReload()\n expect(Object.keys(lostKeyApi.cryptoApi.userKeysManager.getDecryptionKeys())).to.have.length(4)\n const retrievedAfterRecovery = await lostKeyApi.healthcareElementApi.findBy(lostUser.healthcarePartyId!, lostPatient)\n expect(retrievedAfterRecovery).to.have.length(1)\n expect(retrievedAfterRecovery[0].descr).to.equal(descr)\n })\n})\n"]}
1
+ {"version":3,"file":"shamir.js","sourceRoot":"","sources":["../../../../test/icc-x-api/crypto/shamir.ts"],"names":[],"mappings":"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","sourcesContent":["import 'isomorphic-fetch'\nimport { ShamirClass, WebcryptoShamir } from '../../../icc-x-api/crypto/shamir'\nimport { expect } from 'chai'\nimport 'mocha'\nimport { IcureApi, RSAUtilsImpl, ShaVersion, ua2hex } from '../../../icc-x-api'\nimport {\n createHcpHierarchyApis,\n getEnvironmentInitializer,\n hcp1Username,\n hcp2Username,\n hcp3Username,\n setLocalStorage,\n TestUtils,\n} from '../../utils/test_utils'\nimport initApi = TestUtils.initApi\nimport { before } from 'mocha'\nimport { testStorageWithKeys } from '../../utils/TestStorage'\nimport { webcrypto } from 'crypto'\nimport { TestCryptoStrategies } from '../../utils/TestCryptoStrategies'\nimport { FilterChainMaintenanceTask } from '../../../icc-api/model/FilterChainMaintenanceTask'\nimport { MaintenanceTaskAfterDateFilter } from '../../../icc-x-api/filters/MaintenanceTaskAfterDateFilter'\nimport { KeyPairUpdateRequest } from '../../../icc-x-api/maintenance/KeyPairUpdateRequest'\nimport { RSAUtils } from '../../../icc-x-api/crypto/RSA'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { fingerprintV1, fingerprintV1toV2, fingerprintV2 } from '../../../icc-x-api/crypto/utils'\n\n// Data was randomly generated, not based on any real key\nconst data =\n '77b3bb3ac6852a388b2aea8ba1794e63c95a87d10753afbdf8672b607b0ca7c03b39b30b2303bc417de1c78b326cf52810469914ea7dd8128b9f2e5d8f376cdb16b75a8e9dffb12b7c839d6fcf9ef8b6e220ab7973ad76e057038988d9a084f06a9d83cc9c3ee998ad0fcc317bb6c7a1bed8126ceb8463d59e84b50087d15d293970606cfe61f874e3f4efb182107aa971304a88b9821e74b1e6c88e7d0bb8882ab0ba35591e4e8d829fb973a26b480fe7432537b025c1177077689e86b5ff65b39a9d618e1cd8c129ae2b2a981664074301e9265e9842ec0c9e9a95f27a1066336578e06e3f3373d3a98b3b8182e55accc6795bbe9aaaf758179d09eccecc8a21f9f77e660a99e0e652cf39077ef083020d9c9d479fb6751de39e29feb7bcf9c73ee9e9d25f54683d55a82768f603b910b40ccb006d96c25f23ccf88e620c20d5495e11e83859d38bb5314a763c76149b3bcf6d987e6e98b83583f028fd6cfc363cb544673eb5d6cf5a7f9887d78a5a5d5b0a862ca3127a6d359a1a2ea8f332360fb7c4a8fe855eac200735322cd322eab431e659377ad9f9289a2d97152598333f4ca97e8003bdbc2d8b714a72a3bdd4f1b124674d6c2eda71b59f07f073de030795c562658c1a63e03d7de12f6ff57e328f83e05462c588ec7371af9b19f726f04162db61860e2c40e3d01b46cdab6f38a526ba555d09bdbde5702d6ae977f38e51314b20d333e84e645fc08ccc59be6e87aa349ec30e9b3a6c06c9b58693b8d67e8a7259be86b240431f44fb75c05d6a8578ffced3514fecc10e5ed7a052c85484d8b86276f7cd74a57402d79e0de85cb8006272b4c61d6f71ebe6cb039c0604fd4ab6bf2e5c686c5cb10be41a06087c3a598c6115153ad0ff6fd6644de8838b877b63a1c9ad348806e6e5e4962630ce84926b0596028c9bf4fb78cad55a0c7dac4e1b46eef6f76cea2707afc5499c055e56b9545501029b714cff01e3aea3ae955607b686d21f6c453bd6291627cad9502a1d200deb13ca47f45aae1a88c7ee288d5e59c10ea5aecdd681c1f30b67720ba045c6a1174b4b1bf2ba5af90a22d6be4f281d946666015dda5ad79a20bd0c7c43c4e52ddbe10776464e76ae2e883bc5cd2ba965c775227b3ce482f1f764a95a99888ca68c023a530df6ebe0193742f233db700a100cd568342a3d4bd648ee18b6d1de8a9b7cefdcee7858feb886c013286fbafd489d57a46f70b1b676bf6a7cf74a52f13c6d09a7b23cff8a366e78d35c5c69952445739fe1cf5a5815c111808d731d37f6a33f477cee2dcfbaccba65a43e1e1b5dad4c81549a1ebef5ac1bb5814cdf58ba5849ec66095f1e3bb5a1ea48f9fa746553c15580cf98f1a06f630d0b86b95711f3d9381d50711c1f6b8e63e677c77a21a772b921935ccb17a017ce4955e8fcf8fca4bb72e9c4457bf80c471004083676b1410e697b15db4ae9026b9dd2bc222faf9e68a9e4a2eb7bf1ffbd23b23500b1f97e49f1348f64a467fae59a0d2a34c4a7d084d445a86018a48aedad5b0f7b523e5e1af3d3d66a9323cd4fd1a6f1d78611a85204fb5baf09c5b3c559e6e7b574cec7d3a62d81f3b36c43f93de072fa8477b898e824aa18cf971983f931257dccd902fac7766ef934a2e942dfe6a4bb06b103fba46e77d15e780cc58ccc343b83b310f548f46e8a49ed1750722dade4c9acb8cbc0c0fa0de153'\nconst shares = [\n '801231b3513d19f3eaa4dad6cbb40fe4fa000a0df070eda11224feda86242674698a8fa533db9790d9dbc195ca209d012ed20fb1f8c31bb4d27873521036c820f508efd74c566e73975956e54ba00174e6979a6f29ff026a452f8899d5376779020050cd5cc4d05e8c27e545fa6eb4ef25f78df9b4a3ee38ee227b26e41c71356c3408e6da6013ea1981145c7a67d1106f391d78dfd7c8b91d0aebe30901de9646e9db7f74883d05228082b71d0489c9f1214bf8910124e5be4fead82b170faa2d046ef33c27da7a6c1ff8a4c875698eea3f5a1d685ba98674ed69beaa3c2eebce9732ca3c930f5c35a3747953e6ebeae58f976cc090016ecfb5604bf65d0b87ffe4aa5ee6cc57f69b3653397857b41116141b88f3b7942a88eb98dc160d0059267300e351c740461bb440ff329ff3f1abf3b2a75f3b603b6e48165c8c032b0c1b025fed43645af4bcfe9cdfdba00aec8627f82b8c72815a00431acd2b253891085c5f47064bfa015231c62a1711a4ac6792eb39c5c2820e0d6cc2d959874302494add79ac668fa6fb226a25a3b76caafb702eb5cf63ea05e8a5506ea9fcda3530ea22f9bc9602f476868db253cc1ce9b9cd311a67613c90fad0524587ccfb43e1b36133c69e4663b2bc1f157eeda3c7e64c54b17881a485ca6434d09ef6800036fccea47be3f31c21fe015844563015153743df86f98e60f2aef6d5ee7b969818c186160117e524b9b3c2299feb934d0a08f07978447672bf021e15c40d92721694566889df7826631bae3314075e1a1db00767e1d8e7b009c66a3adaf7260c7db97a2244cafca971a7adb5d1babbb115fb178acf08e2d70640bd123538a7f71947b714a38c2b20654feb3b92f261e64481354580570ada0884951ae24684983b1b012ea66901da7f5a0df3057b3f8f0db2519bf2e02c24b109a318d4af4ce5db59f08edad34c8fbd0189c93dd91f73b19c1f6614302d6c94129d7f12671e7c8af884a932932aa59a22442191f806515c5c3facadb6d7f9ab1ae2d178976a1b35b7578a0fed708bba2da6e795a945126d0c9c5e31e945b1e17db4467a2717ccc55dcc03a11325ab5027b613416642bcdc40d9fd495f6939d2cd93bfbaaa81eac6af48ef8e07a8bcf1afc2bc0e1dd5dbfe9622c881c56176e004c0a93faa7ecb0c1aa63d980ee3832ee7ce7d2460618a52471aa2f54477ee97cb23a10c1c183ad243159839c50efacf15ec07961ddd5a7bd68205ea071695486c4801fc77f79372441a353ad23c17397976d4ffd87b5ba2ae189ec496b6de3a6648a90a8a7ba870bcbf307a847205cf3e76222e1cda233a1d96140df29b70480462eb48674925045668c2605efd0777b1fe4aab30a961d3b937bb938962849b9a70fc7def66f837e5a3509fda88e571d631f5aa53d2faa3403a8f9da43ddfd75318721ed6a70c00179696b1ba1ecaa27e7495193cbceffb7e50ff9778ecfa2c0d7525c91b7b9c3e13b9defd5d132eacbdd8d4494bab9b097cd1f0f61356e2635f6428e3d32206d4874c6aa04ee27e3b61495b491d5b855133d9ad19591cfa6a1f58acf101db2427fa4d8eca7dc69dd9c9ebab86d171adbcf1020973ad07b966e6872dd2128e7898c15538695cb80b71a8dace9561b9672639e08406f21a11cefa788c2e950d49fec187d4fb6b4e8ae95763f518c2341d9df697ab7ab87d665eabf28951cbf7aedef2139',\n '802bb4d49a350355bf17d5d888ef07ebb785be0321a99f45052578da97781985baf80a14120a4ca53805efd6a0ec53136a6d5c05192f509216b18f76f09c64338988d3a34e80ca3fc09fbf58adca1229f6e603532415b3e5ded28491c7674d1301e84ab2c80f99e88622d1b1c513f4e305887dd98331e731881b07a31c81a3a7cc1ebae004151b5e7b3aa2ff543fd5c010587ba32ebf72abf3367937d6a661ffbd21fc44f7159c35bee305da1eb588b00f197bbced404b8e099ee5e0d4c6918d5699c406454775efb5b6105eb32fa52ed054f5802fd64941bc6345de8e1a4dc3fcdd332473e398b364c793f0e6a6448c8da5f9556faac7d619ac507107da425cd24e519db5c694a355f1d86b5f73635894b5cb91596f9f58484a35f121af3df11cd1e4381327b50f7e1f965d4b0e5224cf353e8e78e1a3b6a7430d1eaa64488b9c7e0c32be8fa9631c6fbf8ce7bd0b087d53f131227c69da2462a358c626101c0a8ab59b9b55a82c1de8475db77866883934b60ab80ed53b4224a87ce8553d692c7ed3888c5972c7e6ed825845bb25639c98ce68bb0b4426c0d7a08412b423fda3d0efa16e70658bffe6e9803fe38e032048e779ff68fd6123d1fa257239dd7bf97730a79eac8f2f96b25f4ececd851cab99c31099b49d337323eb859242f1e8253a795b5c42886f7ae9cad580706f226180e79004023efb8a7c495971350e5c5773925699d37b92abf232f95cbc547b2ac3fa094f62d360810be979d0ef01ea23a034bb8146778e830f47cbf26ce9a7024fcd1d6d6c361223c9d0aafdeb0a0699da86c80d424ada0365d62edea06bfa9ec09c9729d143bcf75dbbc37cf24b21cd02a4e41f1bb709974a87958d0d8b3f50f500edb2b946523fe85d6a02ebb823c16c42635d1c1dc8c02c9928a31cb23347817658e7cbb8caa6f1cbceeccefb0cb6e2945d443f6f0365468e1bfe119d3a337fd2e844641ec5219be34d94a5377d45f07149499e3cb1cc54d2df0637dd2633f1c7cb4423ba98b087fc8c0372ab2d9a4f4b985f0306815edaf2b94dae983fe7461a462e8d52c5888dae1555d3545db71cd7866daf2cac2d2ef07f820dbec9dddbe88afe6e76fa5f08332c23b74c8146a086a34e757a2f804c9aa5d1a79db6d90e6ceb508f6fda86bf3c073b8747b9f6a995a5ad9e41d5f8544e9e0d8f7e14935b53120c56406845f02893e46bba020243a3ca7139ab2a642ed1da217d3c197de68d14677e40253e777f204473e3010d90d622d19ea7fe72d52ad2cfc798dbe31758ecaec114527e2603da3169128dcdc5db997b1b89a69e04679b303950c02f2c9683ce1b0c71ca1756948276e3cc0c69314b0b218fe5b2b331deb05634fa279053e202c9a54e4a1525752f6dc024f5e613bceb63da013e9b66dfc853ac7805c1ea1c998df9d6dd5ea06dccffd2e56adc126ea007c80415a7fbbbeacf57bcd433090b4cf2f062f08f073712272108da2672254a301a8401908dc0832719d90624371b086d5f2a0742b9ddf17b8678de11b83fad7934e30c65ad14bce2c695bb11229ccb357c3f72ec84fd84a91c00097e6f4df74f3a260fb383af46d163e0564750bf73e0babb4578fc0121d349bc115a70c9268d0a39c7926ea8168cb102f15df4e0b734d961e1d54f5e39c0392c097d7377a48872a14d3dd080a2f64841ad6253e6e5f0890edead0d2e7112b1e694a63be',\n '8039921cf0bbb6ce071087bcedf3b218d963889b79a462912dfa598663ea3841190e8602bae16905da1a399d76b47d348bedd2b0887d05811948d49d124f74e00a4d8d1f777e4d93acd45e75dfbcefa4fffaf71e075d26b54c9309782ac8a7f00ba71cd64cf78075e49cbe24c3be57b74c05ebcdb6b4c7b12004256db3cddaefb5f82191d873c7527d3cf89c60a31cf178cbf1c8f5c0318acfdbd9cab32f58b94040a590883ef4a1788b5f44f8263b5f4ab8ce304e121469ebc0783f8958764c246bf1ccd0b6b7741425fa6099e865215c2bdbad591f852e4ca0eca9cd8f3c0f934c62d818fe910ca253dab32df3177e467fc2f5c8af7d517cb645bb8857d717c16259dccc7d2535675985370bd7473e6da9e0397311df0b3bc6fcf30e40a243416d78a8ac7e686c90ed55772313d75a04fd1d226716738b10673eb01aa8eb61a7be5e8b680aed14250c1be86f09a6873c1540a912f83107c2c83216b53c2a02d41929bf564a145ea484ed8207904a592603f8e6cd6435ff7e6fcc76e873dc81ea072d91db43b7eef59a02bfe67f1aebaadace763776cbb05fdf6f7832ea20b9c1634e6b262cf097895bbff0b498864db3be0b2c831b87850fc345c7eeacd6471ff9b1a4216e9f6a7ccfe665b3f7f8c9bb2ac042c9cd07b3ff6b87dbcb836b11a259c59023b756c543772949ca1b5e83186d12bc08a9db3e2d02245741199a12e1256b787dd78a041f72ce5425123b3eec0e9196df5c065bd2391edfb222ff036d5d595e6f71a88d7bfc82dce25a43f2a8a3cfac24e35e5ec73aae6eeb0cc9e79e66d06f01c53df555ad074c454d9066f2db55982d59a74cda516707bed452ba647cd390f343374200e0aa28da34fa6755d4552ff14bd44e263d9bddef5bc1ddbea9cb754302aa28a3ec47932609e3e2035144cffd62b25e4e98401f872e0065c0eec4144428c238b6a868a40d6af2337eb7544e05b1583cf0d96e1b31d6e6f1d1321fda9258766f3e1bb708539c6615fecf84ca7c97ccb31b43af61df9a849c4e50906cb266a3ef78e7be0434dab531957a306f3fde132803e16ee79e4b6834ddd1b9a8a758fb86a44f200cd6b659d878393aa770f5238ddf181e83ee79a98ceaed26cf7c2e0029e7bf2f4bf80986250887386944e39624acd33c8da11de61c44b2a0ec1ab39fe1d612802e7f6c5d3d15a12d3e18995a9b3a92bcfc15b945bd5feb3e3e49ce232b04efb408cd2616481d5764e72ab622155908f1f1227f375d8777aaf066795e2fd2fe185109e1ff75e4381c63725f75bd973f2140cf94a7c76182c862a7c5b842b08fcb6dd630c342fede5a5678b183cc779891fb54d7ca7cf9dce2d375dbfd7d62449aa80e3e91627b3362afa1907fa144fe4ab4c10373dbd3c246549287359838ef4d5d499267b76a30aa9278cd515785c237d5999e5b752e9c3b78d5ccd68e34bee43ae3157ce272f9f764fd33c1b31ea088eb3db6c4deca8274e44cbf3289fd264a832ef3a10af912a0945027a91ac75197881ae5e0248c977e1da3ed032dc0b1c7aa1450a02d8c8bc90d06917aaa058bbd4bf08888919474be98016762d5ad2d24e8bd3a7095f58d64723fde63050c363c577a4f458e2817dc80d7ee2120e1e679f6ac417f0338f75e4a25eb3d1a649f5cc228ef72828aa9132393bbf0e8e7d28844b560f31ad8305a9cea4fd6b25e4a656cac654a47ea8a3d4',\n '804b7acd1c25024cabe3468cb1d9a9b62d9cc506b9acab173873873cf8c11eb89723a0643fa37858e21b85d7d44567b7ac25cc1c60b5d2835fef2071c89b575c893a0f5cc5db6ee8b6868fd4323ae1556574e3092508952ff36aaadc52f19f07ab62ec166cb0e2c53b162a5dfd28b709f16f3c6672ef7dcbb6955811e552afa54b6f0bda5d8ad171c78852877522a90c65990a8bd7a647994ce800565d928f84e2775e88af9991ec7be785b38274cb9ff13a0c8548ca823563920328d36b52250c94c7985d3f501cd3dcbb06e74371ea549695afdd623a61e1dcb3b3048b1f6877f57cdd710c2a6ba435555a13676e85ee635bed1f3b1272db83a5d2c7446fa250bbbe58d86bd46b77a885d5c3531a129b1250639f1abe460c79578f20254b3711197fec3f23e0765e6547d2d841f4b7e909bf7058cd882e957f691a4cd4977f305b2e484aacbf3b1f8eeb6c8bc5b56723b9144a1c5a29a32e93211ef6ac0bf48d5c6175f738b7543163975f03fb8f9ba17bbf0379bf853f3dc03117cc8e6f420544649e6293a3d25608acd282f22e43e88fcca256699989f86204e1d3301fd8730065f80cd6a1874488b7b897933c5f4b3405f0a485cffb8d1cd74f0e0292c717604b5db39fe05c0b50ed21937d5c0f9f903749dcfb96343f1a14e0e08603f792fcf85a2d3110b43ca66d87ed8ef87a38de4b1e6dfa183ebe4fe830afbb6bda48591d9c5f9679563dc2b5e58054706d2d6ee5bd3a4a49a0c96ec44d840be2213022a166554119d3db14a9ed718b4fb0c97061765c626c8a2c966ff49d46a8df4d11240317775712fac30b85083f30ab0e99cda6b1c7cebcbc6aed2f8df5cbfba1f6434cdb36238ca18279832ec1614f6ce47c6b4b998d5b6c988173ab595bfc239fa860735cb117fb480cc2d069aa39e9a9886fc9790228afef2ad08fdfb2b004f0b8758fc0e8dfab8b6fc17757a16537de26023e6be05dc40f9507d69fb28c316522dc734c894462c54618c7b033f7536cec432104eb5449aa61e50446e9b698b264fc33cce60af1601b0c4737e4328c334aeeed33ede2b8eade8723336fcbfe75ca062ea29e9ccd99f05982c4566a6df360e6f1c7d9b9fd106af106bc9c7b96264ce4f3c675345e126477e84e4c72f6a4dc5f4a1d027176bddf4b0323f2f2ceecfdebebf5d3eb87cb26353820927ac0dd00036b6bb08baadbf72984f6819ae86af8bad1f44ef423801683e4f39b0d583c24a3fe8d9e2641a083397fa9b06a9643360de82100aba32fc5251ff81a96b84bb044af38137220f41954197beda08cb7d0ad581a7311b28be59238d541423f300282b270edaf9fa9169f41bc61b42163e818b0ce4be07d37b3b42cbd41a58f8dc346a7ed649b97a5fbf34c5aa4436ba145c5f234c24f1285e882cd19bff4d3581e6ca874aeb79369225f514b7fdaf15d0fa7d128428dacbbc1ef9797fbafceb5a811a748ef8019d44e69852b9346f100966a29e2c9aa04047a09ae8b4f928bba3f4a0e6340a51a111403868c286101c5541aa6a0be2bef4685723f42617b365abbe2be3d88a676c80648a28951354f1508b0473de6f1f59c24bb2e9c0e2545b6c793207b2ebafe78dca6c0054d7c8e23c848873829b707ab8fc24b8416c150f4dc9be9137d9b6d296e13f24a2e5f1ad45ef07736b9f5068a11a7efcdf089acd21f175f9880f3eb008e112db5f870fc18470',\n '80595c0576abb7d713e414e8d4c51c45437af39ee1a156c310aca6600c533f7c34d52c7297485df80004539c021d49904da542a9f1e7879050167b9a2a48478f0aff51e0fc25e944dacd6ef9404c1cd86c6817440640007f612b2735bf5e75e4a12dba72e848fb5859a845c8fb85145db8e2aa72476a5d4b1e8a7adf4a1ed6ed328990ab81ec0d7dc18e08e441be603d0d0a80e00cd904b87005a0ab381bb6c21f16075cd0b2f978bd8fdf2d64e77870b49bb909eb98ddd281cc9ef78ef5b5e47e66f252c8ce9287724f5138cd84b1e5d8e9bb82ababf60e111f1ac4471e6ea418642d211a1123d462a11c19d8323d7725b9604db83ea8f5be99b01848c9fae94397b619a1d065fd4500d88997f73e74620e7bcbb564fe157ff59e8d0fcad4854ca5e37c807a3d15b09784f8b05c71c922c19cdc473a5813225b5ab4fc1834950b9b7cf19c29fb4c26ed4f08037118e862ffa5d22cde717ec839b05085b631ea53cffd513a270b26880f3d80b313a34abe4cf1ef0cd565fb018b551dcca88eaac33d9a87358966fb457f2c35213611cbdecdccbcda14161f676acb1df36e1c9c11b3c432448a349b3235e1c81ce83411d8c2e9a5d8f6b51fa10e68ad929799fbf1eeca5e0c5df019e12d540aee4721da8f23341b8c820cb4b35278beb947990e159f449152c4ce1e05388e1ba7e5c9db4133be326151fdfb1931853e9f97ff94fe0fe4b2bb9288c089424948f9fa1f28eba38e22aa749c9b9a5c33ebe6c61cc87edfcc83bb76c6d023e76cfa61bde5e5639c63c715ed04c6c86511308ba16b3e4aad72a41bf0203dac0bdae793d2cb37628204a9b54f2a4c916631eb4fd3d26008883438376ea3c73628543e79f8101769c529a9086b1f47754d47c446e922025c5a21766d4206f79888d279557cfbe8ad79baf8d3d008bc4786a101e43f49d972fce83c8fd745e47865897e842cce6c7a16a0a47fbea6a4154d185173ec6300a5a74c4fa88ac39a908a23cf921b88c49e52af4219b09d7fe26e3208d8aec6074cadbf08dea94364d75d57b13e43c93cfe0f60c7fc60ac0f33861e75e8ab53a294b8a428e45549b644f8202ad67fb17bc811b2cb7f5c8cce7d00475ecb7279763a6bec88c19d0f3239e1d199c1e057e1272d88dd5e71fb8f5cd1dfc199b953577cf7c8a25cd80ddfa98de8854ac3b15346277e2f7fa4aa78d5b9634675247e25b5c2654ee903c6f54341735108a8b15c388dcd50b345fc1626df0de819a564361ca44adf5fc6f97a0304f7a6d9de7d38bf64f4cb73a6729dc9ed3bcee78658ea20f0c35684c442f59c004964dedcd2c0eec2ce5704da62122226d1f0971d4804d4d63b80ce343978adc018c292d5e43dd32ef20b04b4be74994e9432a23417bc4d85102d8bd02dd614f1c3004cd8743bbca95ee249340636cbf5b5e7042af64ab51d26b1a4e35c078da2de6e9e4dd0f1687f567e1689de51f7fbc1b5aaba7690e1a490ab2f6de1a7f8b2bd4a035ff741748ca8c55629b695da023a566d124e3d53439238a83489e52392efcc97f007c301c0507373998e3301af3ffed6a8c5a4d21fd965b115be02570283fcd5771d50e67cf35e6c45f704b7361cf09b99414eb76e6401765b02ae21df989cf149d8c0995e76317bcc99e0e8637d8fe36565f199003ea440053bbcac654963f85b4bd2d980166d5027df4f6be7e653f0c203d1823441a',\n]\n\nconst crypto = webcrypto as any\nsetLocalStorage(fetch)\n\ndescribe('Shamir split', () => {\n it('should return 5 splits', () => {\n const result = new WebcryptoShamir(crypto).share(data, 5, 3)\n expect(result.length).to.equal(5)\n })\n\n it('should be able to split and recombine a private key', async () => {\n const rsa = new RSAUtilsImpl(crypto)\n const key = ua2hex(await rsa.exportKey((await rsa.generateKeyPair(ShaVersion.Sha256)).privateKey, 'pkcs8'))\n const shamir = new WebcryptoShamir(crypto)\n const splits = shamir.share(key, 4, 3)\n const combined = shamir.combine([splits[1], splits[0], splits[3]])\n expect(combined).to.equal(key)\n })\n})\n\ndescribe('Shamir combine', () => {\n it('should return combined data from all shares', () => {\n expect(new WebcryptoShamir(crypto).combine(shares)).to.equal(data)\n })\n\n it('should return combined data with some shares', () => {\n for (let i = 0; i < 4; i++) {\n for (let j = i + 1; j < 5; j++) {\n expect(new WebcryptoShamir(crypto).combine(shares.filter((x, idx) => idx !== i && idx !== j))).to.equal(data)\n }\n }\n })\n\n it('should fail miserably because it has not enough shares', () => {\n for (let i = 0; i < 4; i++) {\n for (let j = i + 1; j < 5; j++) {\n expect(new WebcryptoShamir(crypto).combine(shares.filter((x, idx) => idx === i && idx === j))).to.equal('')\n }\n }\n })\n})\n\ndescribe('Shamir key recovery', async function () {\n this.timeout(600000)\n let env: TestVars\n\n before(async function () {\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n })\n\n it('should automatically load recoverable keys on startup', async () => {\n const hierarchyApis = await createHcpHierarchyApis(env)\n const api = hierarchyApis.childApi\n const user = hierarchyApis.childUser\n const notariesApis = [\n await initApi(env, hcp1Username),\n await initApi(env, hcp2Username),\n await initApi(env, hcp3Username),\n hierarchyApis.child2Api,\n ]\n const notariesIds = (await Promise.all(notariesApis.map((x) => x.healthcarePartyApi.getCurrentHealthcareParty()))).map((x) => x.id!)\n const pat = await api.patientApi.initConfidentialSecretId(await api.patientApi.newInstance(user), user)\n const descr = 'Confidential info'\n const confidentialData = await api.healthcareElementApi.createHealthElementWithUser(\n user,\n await api.healthcareElementApi.newInstance(user, pat, { descr }, { confidential: true })\n )\n await api.cryptoApi.shamirKeysManager.updateSelfSplits(\n { [fingerprintV1(hierarchyApis.childCredentials.publicKey)]: { notariesIds, minShares: 3 } },\n []\n )\n const lostKeyStorage = await testStorageWithKeys([\n {\n dataOwnerId: hierarchyApis.grandCredentials.dataOwnerId,\n pairs: [\n {\n keyPair: { privateKey: hierarchyApis.grandCredentials.privateKey, publicKey: hierarchyApis.grandCredentials.publicKey },\n shaVersion: ShaVersion.Sha1,\n },\n ],\n },\n {\n dataOwnerId: hierarchyApis.parentCredentials.dataOwnerId,\n pairs: [\n {\n keyPair: { privateKey: hierarchyApis.parentCredentials.privateKey, publicKey: hierarchyApis.parentCredentials.publicKey },\n shaVersion: ShaVersion.Sha1,\n },\n ],\n },\n ])\n const newKey = await api.cryptoApi.primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const lostKeyApi = await IcureApi.initialise(\n env.iCureUrl,\n {\n username: hierarchyApis.childCredentials.user,\n password: hierarchyApis.childCredentials.password,\n },\n new TestCryptoStrategies(newKey),\n webcrypto as any,\n fetch,\n {\n storage: lostKeyStorage.storage,\n keyStorage: lostKeyStorage.keyStorage,\n entryKeysFactory: lostKeyStorage.keyFactory,\n }\n )\n const lostUser = await lostKeyApi.userApi.getCurrentUser()\n const lostPatient = await lostKeyApi.patientApi.getPatientWithUser(lostUser, pat.id!)\n\n async function checkNotRecovered() {\n await lostKeyApi.cryptoApi.forceReload()\n expect(Object.keys(lostKeyApi.cryptoApi.userKeysManager.getDecryptionKeys())).to.have.length(3)\n expect(await lostKeyApi.healthcareElementApi.findBy(lostUser.healthcarePartyId!, lostPatient)).to.be.empty\n }\n\n async function giveBackAccess(notaryId: number) {\n const notaryApi = notariesApis[notaryId]\n await notaryApi.cryptoApi.forceReload()\n const delegateUser = await notaryApi.userApi.getCurrentUser()\n const notifications = (\n await notaryApi.maintenanceTaskApi.filterMaintenanceTasksByWithUser(\n delegateUser!,\n undefined,\n undefined,\n new FilterChainMaintenanceTask({\n filter: new MaintenanceTaskAfterDateFilter({\n date: new Date().getTime() - 100000,\n }),\n })\n )\n ).rows!.map((x) => KeyPairUpdateRequest.fromMaintenanceTask(x))\n const filteredNotifications = notifications.filter((x) => x.concernedDataOwnerId === lostUser.healthcarePartyId)\n expect(filteredNotifications).to.have.length(1)\n await notaryApi.icureMaintenanceTaskApi.applyKeyPairUpdate(filteredNotifications[0])\n }\n\n await checkNotRecovered()\n await giveBackAccess(0)\n await checkNotRecovered()\n await giveBackAccess(1)\n await checkNotRecovered()\n await giveBackAccess(2)\n await giveBackAccess(3)\n await lostKeyApi.cryptoApi.forceReload()\n expect(Object.keys(lostKeyApi.cryptoApi.userKeysManager.getDecryptionKeys())).to.have.length(4)\n const retrievedAfterRecovery = await lostKeyApi.healthcareElementApi.findBy(lostUser.healthcarePartyId!, lostPatient)\n expect(retrievedAfterRecovery).to.have.length(1)\n expect(retrievedAfterRecovery[0].descr).to.equal(descr)\n })\n})\n"]}
@@ -23,7 +23,7 @@ const utils_1 = require("../../../icc-x-api/crypto/utils");
23
23
  describe('SignatureKeysManager', () => {
24
24
  it('should be able to store a key pair in local storage and reload it', () => __awaiter(void 0, void 0, void 0, function* () {
25
25
  const iCureStorage = new IcureStorageFacade_1.IcureStorageFacade(new TestStorage_1.TestKeyStorage(), new TestStorage_1.TestStorage(), new DefaultStorageEntryKeysFactory_1.DefaultStorageEntryKeysFactory());
26
- const primitives = new CryptoPrimitives_1.CryptoPrimitives(crypto_1.webcrypto);
26
+ const primitives = new CryptoPrimitives_1.CryptoPrimitivesImpl(crypto_1.webcrypto);
27
27
  const dataOwnerApi = new FakeDataOwnerApi_1.FakeDataOwnerApi({ id: primitives.randomUuid(), type: DataOwnerTypeEnum_1.DataOwnerTypeEnum.Hcp });
28
28
  const manager1 = new UserSignatureKeysManager_1.UserSignatureKeysManager(iCureStorage, dataOwnerApi, primitives);
29
29
  const pair1 = yield manager1.getOrCreateSignatureKeyPair();
@@ -1 +1 @@
1
- {"version":3,"file":"signature-keys-manager-test.js","sourceRoot":"","sources":["../../../../test/icc-x-api/crypto/signature-keys-manager-test.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,iGAA6F;AAC7F,sFAAkF;AAClF,yDAAqE;AACrE,8GAA0G;AAC1G,mEAA+D;AAC/D,iFAA6E;AAC7E,mCAAkC;AAClC,gFAA4E;AAC5E,kDAA2C;AAC3C,+BAA6B;AAC7B,2DAA8E;AAE9E,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,mEAAmE,EAAE,GAAS,EAAE;QACjF,MAAM,YAAY,GAAG,IAAI,uCAAkB,CAAC,IAAI,4BAAc,EAAE,EAAE,IAAI,yBAAW,EAAE,EAAE,IAAI,+DAA8B,EAAE,CAAC,CAAA;QAC1H,MAAM,UAAU,GAAG,IAAI,mCAAgB,CAAC,kBAAgB,CAAC,CAAA;QACzD,MAAM,YAAY,GAAG,IAAI,mCAAgB,CAAC,EAAE,EAAE,EAAE,UAAU,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,qCAAiB,CAAC,GAAG,EAAE,CAAC,CAAA;QACvG,MAAM,QAAQ,GAAG,IAAI,mDAAwB,CAAC,YAAY,EAAE,YAAY,EAAE,UAAU,CAAC,CAAA;QACrF,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,2BAA2B,EAAE,CAAA;QAC1D,MAAM,QAAQ,GAAG,IAAI,mDAAwB,CAAC,YAAY,EAAE,YAAY,EAAE,UAAU,CAAC,CAAA;QACrF,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,2BAA2B,EAAE,CAAA;QAC1D,MAAM,QAAQ,GAAG,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAA;QAC1F,MAAM,QAAQ,GAAG,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAA;QAC1F,IAAA,aAAM,EAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;QACnC,MAAM,OAAO,GAAG,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAA;QACvF,MAAM,OAAO,GAAG,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAA;QACvF,IAAA,aAAM,EAAC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACjC,MAAM,aAAa,GAAG,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,MAAM,QAAQ,CAAC,2BAA2B,CAAC,IAAA,qBAAa,EAAC,OAAO,CAAC,CAAC,CAAE,EAAE,MAAM,CAAC,CAAC,CAAA;QAC3I,MAAM,aAAa,GAAG,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,MAAM,QAAQ,CAAC,2BAA2B,CAAC,IAAA,qBAAa,EAAC,OAAO,CAAC,CAAC,CAAE,EAAE,MAAM,CAAC,CAAC,CAAA;QAC3I,IAAA,aAAM,EAAC,aAAa,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACvC,IAAA,aAAM,EAAC,aAAa,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACzC,CAAC,CAAA,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA","sourcesContent":["import { UserSignatureKeysManager } from '../../../icc-x-api/crypto/UserSignatureKeysManager'\nimport { IcureStorageFacade } from '../../../icc-x-api/storage/IcureStorageFacade'\nimport { TestKeyStorage, TestStorage } from '../../utils/TestStorage'\nimport { DefaultStorageEntryKeysFactory } from '../../../icc-x-api/storage/DefaultStorageEntryKeysFactory'\nimport { FakeDataOwnerApi } from '../../utils/FakeDataOwnerApi'\nimport { CryptoPrimitives } from '../../../icc-x-api/crypto/CryptoPrimitives'\nimport { webcrypto } from 'crypto'\nimport { DataOwnerTypeEnum } from '../../../icc-api/model/DataOwnerTypeEnum'\nimport { ua2hex } from '../../../icc-x-api'\nimport { expect } from 'chai'\nimport { fingerprintV1, fingerprintV2 } from '../../../icc-x-api/crypto/utils'\n\ndescribe('SignatureKeysManager', () => {\n it('should be able to store a key pair in local storage and reload it', async () => {\n const iCureStorage = new IcureStorageFacade(new TestKeyStorage(), new TestStorage(), new DefaultStorageEntryKeysFactory())\n const primitives = new CryptoPrimitives(webcrypto as any)\n const dataOwnerApi = new FakeDataOwnerApi({ id: primitives.randomUuid(), type: DataOwnerTypeEnum.Hcp })\n const manager1 = new UserSignatureKeysManager(iCureStorage, dataOwnerApi, primitives)\n const pair1 = await manager1.getOrCreateSignatureKeyPair()\n const manager2 = new UserSignatureKeysManager(iCureStorage, dataOwnerApi, primitives)\n const pair2 = await manager2.getOrCreateSignatureKeyPair()\n const private1 = ua2hex(await primitives.RSA.exportKey(pair1.keyPair.privateKey, 'pkcs8'))\n const private2 = ua2hex(await primitives.RSA.exportKey(pair2.keyPair.privateKey, 'pkcs8'))\n expect(private1).to.equal(private2)\n const public1 = ua2hex(await primitives.RSA.exportKey(pair1.keyPair.publicKey, 'spki'))\n const public2 = ua2hex(await primitives.RSA.exportKey(pair2.keyPair.publicKey, 'spki'))\n expect(public1).to.equal(public2)\n const verification1 = ua2hex(await primitives.RSA.exportKey((await manager1.getSignatureVerificationKey(fingerprintV2(public1)))!, 'spki'))\n const verification2 = ua2hex(await primitives.RSA.exportKey((await manager2.getSignatureVerificationKey(fingerprintV2(public1)))!, 'spki'))\n expect(verification1).to.equal(public1)\n expect(verification2).to.equal(public1)\n })\n})\n"]}
1
+ {"version":3,"file":"signature-keys-manager-test.js","sourceRoot":"","sources":["../../../../test/icc-x-api/crypto/signature-keys-manager-test.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,iGAA6F;AAC7F,sFAAkF;AAClF,yDAAqE;AACrE,8GAA0G;AAC1G,mEAA+D;AAC/D,iFAAmG;AACnG,mCAAkC;AAClC,gFAA4E;AAC5E,kDAA2C;AAC3C,+BAA6B;AAC7B,2DAA8E;AAE9E,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,mEAAmE,EAAE,GAAS,EAAE;QACjF,MAAM,YAAY,GAAG,IAAI,uCAAkB,CAAC,IAAI,4BAAc,EAAE,EAAE,IAAI,yBAAW,EAAE,EAAE,IAAI,+DAA8B,EAAE,CAAC,CAAA;QAC1H,MAAM,UAAU,GAAG,IAAI,uCAAoB,CAAC,kBAAgB,CAAC,CAAA;QAC7D,MAAM,YAAY,GAAG,IAAI,mCAAgB,CAAC,EAAE,EAAE,EAAE,UAAU,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,qCAAiB,CAAC,GAAG,EAAE,CAAC,CAAA;QACvG,MAAM,QAAQ,GAAG,IAAI,mDAAwB,CAAC,YAAY,EAAE,YAAY,EAAE,UAAU,CAAC,CAAA;QACrF,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,2BAA2B,EAAE,CAAA;QAC1D,MAAM,QAAQ,GAAG,IAAI,mDAAwB,CAAC,YAAY,EAAE,YAAY,EAAE,UAAU,CAAC,CAAA;QACrF,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,2BAA2B,EAAE,CAAA;QAC1D,MAAM,QAAQ,GAAG,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAA;QAC1F,MAAM,QAAQ,GAAG,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAA;QAC1F,IAAA,aAAM,EAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;QACnC,MAAM,OAAO,GAAG,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAA;QACvF,MAAM,OAAO,GAAG,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAA;QACvF,IAAA,aAAM,EAAC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACjC,MAAM,aAAa,GAAG,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,MAAM,QAAQ,CAAC,2BAA2B,CAAC,IAAA,qBAAa,EAAC,OAAO,CAAC,CAAC,CAAE,EAAE,MAAM,CAAC,CAAC,CAAA;QAC3I,MAAM,aAAa,GAAG,IAAA,kBAAM,EAAC,MAAM,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,MAAM,QAAQ,CAAC,2BAA2B,CAAC,IAAA,qBAAa,EAAC,OAAO,CAAC,CAAC,CAAE,EAAE,MAAM,CAAC,CAAC,CAAA;QAC3I,IAAA,aAAM,EAAC,aAAa,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACvC,IAAA,aAAM,EAAC,aAAa,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACzC,CAAC,CAAA,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA","sourcesContent":["import { UserSignatureKeysManager } from '../../../icc-x-api/crypto/UserSignatureKeysManager'\nimport { IcureStorageFacade } from '../../../icc-x-api/storage/IcureStorageFacade'\nimport { TestKeyStorage, TestStorage } from '../../utils/TestStorage'\nimport { DefaultStorageEntryKeysFactory } from '../../../icc-x-api/storage/DefaultStorageEntryKeysFactory'\nimport { FakeDataOwnerApi } from '../../utils/FakeDataOwnerApi'\nimport { CryptoPrimitives, CryptoPrimitivesImpl } from '../../../icc-x-api/crypto/CryptoPrimitives'\nimport { webcrypto } from 'crypto'\nimport { DataOwnerTypeEnum } from '../../../icc-api/model/DataOwnerTypeEnum'\nimport { ua2hex } from '../../../icc-x-api'\nimport { expect } from 'chai'\nimport { fingerprintV1, fingerprintV2 } from '../../../icc-x-api/crypto/utils'\n\ndescribe('SignatureKeysManager', () => {\n it('should be able to store a key pair in local storage and reload it', async () => {\n const iCureStorage = new IcureStorageFacade(new TestKeyStorage(), new TestStorage(), new DefaultStorageEntryKeysFactory())\n const primitives = new CryptoPrimitivesImpl(webcrypto as any)\n const dataOwnerApi = new FakeDataOwnerApi({ id: primitives.randomUuid(), type: DataOwnerTypeEnum.Hcp })\n const manager1 = new UserSignatureKeysManager(iCureStorage, dataOwnerApi, primitives)\n const pair1 = await manager1.getOrCreateSignatureKeyPair()\n const manager2 = new UserSignatureKeysManager(iCureStorage, dataOwnerApi, primitives)\n const pair2 = await manager2.getOrCreateSignatureKeyPair()\n const private1 = ua2hex(await primitives.RSA.exportKey(pair1.keyPair.privateKey, 'pkcs8'))\n const private2 = ua2hex(await primitives.RSA.exportKey(pair2.keyPair.privateKey, 'pkcs8'))\n expect(private1).to.equal(private2)\n const public1 = ua2hex(await primitives.RSA.exportKey(pair1.keyPair.publicKey, 'spki'))\n const public2 = ua2hex(await primitives.RSA.exportKey(pair2.keyPair.publicKey, 'spki'))\n expect(public1).to.equal(public2)\n const verification1 = ua2hex(await primitives.RSA.exportKey((await manager1.getSignatureVerificationKey(fingerprintV2(public1)))!, 'spki'))\n const verification2 = ua2hex(await primitives.RSA.exportKey((await manager2.getSignatureVerificationKey(fingerprintV2(public1)))!, 'spki'))\n expect(verification1).to.equal(public1)\n expect(verification2).to.equal(public1)\n })\n})\n"]}
@@ -67,10 +67,11 @@ describe('icc-x-maintenance-task-api Tests', () => {
67
67
  this.timeout(600000);
68
68
  const initializer = yield (0, test_utils_1.getEnvironmentInitializer)();
69
69
  env = yield initializer.execute((0, types_1.getEnvVariables)());
70
- apiForHcp1 = yield initApi(env, test_utils_1.hcp1Username);
70
+ const hierarchicalHcps = yield (0, test_utils_1.createHcpHierarchyApis)(env);
71
+ apiForHcp1 = hierarchicalHcps.grandApi;
71
72
  hcp1User = yield apiForHcp1.userApi.getCurrentUser();
72
73
  hcp1 = yield apiForHcp1.healthcarePartyApi.getCurrentHealthcareParty();
73
- apiForHcp2 = yield initApi(env, test_utils_1.hcp2Username);
74
+ apiForHcp2 = hierarchicalHcps.parentApi;
74
75
  hcp2User = yield apiForHcp2.userApi.getCurrentUser();
75
76
  hcp2 = yield apiForHcp2.healthcarePartyApi.getCurrentHealthcareParty();
76
77
  });
@@ -1 +1 @@
1
- {"version":3,"file":"icc-maintenance-task-x-api-test.js","sourceRoot":"","sources":["../../../test/icc-x-api/icc-maintenance-task-x-api-test.ts"],"names":[],"mappings":"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","sourcesContent":["import { before } from 'mocha'\n\nimport 'isomorphic-fetch'\n\nimport { Apis, EntityWithDelegationTypeName } from '../../icc-x-api'\nimport { assert, expect } from 'chai'\nimport { randomUUID } from 'crypto'\nimport { getEnvironmentInitializer, hcp1Username, hcp2Username, setLocalStorage, TestUtils } from '../utils/test_utils'\nimport { User } from '../../icc-api/model/User'\nimport { IccMaintenanceTaskXApi } from '../../icc-x-api'\nimport { MaintenanceTask } from '../../icc-api/model/MaintenanceTask'\nimport { PropertyStub } from '../../icc-api/model/PropertyStub'\nimport { PropertyTypeStub } from '../../icc-api/model/PropertyTypeStub'\nimport { TypedValueObject } from '../../icc-api/model/TypedValueObject'\nimport { HealthcareParty } from '../../icc-api/model/HealthcareParty'\nimport { Identifier } from '../../icc-api/model/Identifier'\nimport { FilterChainMaintenanceTask } from '../../icc-api/model/FilterChainMaintenanceTask'\nimport { MaintenanceTaskByIdsFilter } from '../../icc-x-api/filters/MaintenanceTaskByIdsFilter'\nimport { MaintenanceTaskByHcPartyAndTypeFilter } from '../../icc-x-api/filters/MaintenanceTaskByHcPartyAndTypeFilter'\nimport { DocIdentifier } from '../../icc-api/model/DocIdentifier'\nimport initApi = TestUtils.initApi\nimport { MaintenanceTaskAfterDateFilter } from '../../icc-x-api/filters/MaintenanceTaskAfterDateFilter'\nimport { SecureDelegation } from '../../icc-api/model/SecureDelegation'\nimport AccessLevel = SecureDelegation.AccessLevelEnum\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\n\nsetLocalStorage(fetch)\nlet env: TestVars\n\nfunction maintenanceTaskToCreate(mTaskApiForHcp: IccMaintenanceTaskXApi, hcpUser: User, delegatedTo: HealthcareParty) {\n return mTaskApiForHcp.newInstance(\n hcpUser,\n new MaintenanceTask({\n id: randomUUID(),\n taskType: randomUUID(),\n status: MaintenanceTask.StatusEnum.Pending,\n properties: [\n new PropertyStub({\n id: 'dataOwnerConcernedId',\n type: new PropertyTypeStub({ type: PropertyTypeStub.TypeEnum.STRING }),\n typedValue: new TypedValueObject({\n type: TypedValueObject.TypeEnum.STRING,\n stringValue: delegatedTo.id,\n }),\n }),\n new PropertyStub({\n id: 'dataOwnerConcernedPubKey',\n type: new PropertyTypeStub({ type: PropertyTypeStub.TypeEnum.STRING }),\n typedValue: new TypedValueObject({\n type: TypedValueObject.TypeEnum.STRING,\n stringValue: delegatedTo.publicKey,\n }),\n }),\n ],\n }),\n { additionalDelegates: { [delegatedTo.id!]: AccessLevel.WRITE } }\n )\n}\n\nlet apiForHcp1: Apis\nlet hcp1User: User\nlet hcp1: HealthcareParty\n\nlet apiForHcp2: Apis\nlet hcp2User: User\nlet hcp2: HealthcareParty\n\ndescribe('icc-x-maintenance-task-api Tests', () => {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n\n apiForHcp1 = await initApi(env, hcp1Username)\n hcp1User = await apiForHcp1.userApi.getCurrentUser()\n hcp1 = await apiForHcp1.healthcarePartyApi.getCurrentHealthcareParty()\n\n apiForHcp2 = await initApi(env, hcp2Username)\n hcp2User = await apiForHcp2.userApi.getCurrentUser()\n hcp2 = await apiForHcp2.healthcarePartyApi.getCurrentHealthcareParty()\n })\n\n it('CreateMaintenanceTaskWithUser Success for HCP', async () => {\n // Given\n const taskToCreate = await maintenanceTaskToCreate(apiForHcp1.maintenanceTaskApi, hcp1User, hcp2)\n\n // When\n const createdTask = await apiForHcp1.maintenanceTaskApi.createMaintenanceTaskWithUser(hcp1User, taskToCreate)\n\n // Then\n assert(createdTask != null)\n assert(createdTask.id == taskToCreate.id)\n const keysFor1 = await apiForHcp1.cryptoApi.xapi.encryptionKeysOf(\n { entity: createdTask, type: EntityWithDelegationTypeName.MaintenanceTask },\n undefined\n )\n expect(keysFor1).to.have.length(1)\n\n const foundTask: MaintenanceTask = await apiForHcp2.maintenanceTaskApi.getMaintenanceTaskWithUser(hcp2User, createdTask.id!)\n\n assert(foundTask.id == createdTask.id)\n assert(foundTask.properties?.find((prop: PropertyStub) => prop.typedValue?.stringValue == hcp2.id) != undefined)\n assert(foundTask.properties?.find((prop: PropertyStub) => prop.typedValue?.stringValue == hcp2.publicKey) != undefined)\n const keysFor2 = await apiForHcp2.cryptoApi.xapi.encryptionKeysOf(\n { entity: createdTask, type: EntityWithDelegationTypeName.MaintenanceTask },\n undefined\n )\n expect(keysFor2).to.have.length(1)\n expect(keysFor2[0]).to.equal(keysFor1[0])\n }).timeout(30000)\n\n it('ModifyMaintenanceTaskWithUser Success for HCP', async () => {\n // Given\n const createdTask: MaintenanceTask = (await apiForHcp1.maintenanceTaskApi.createMaintenanceTaskWithUser(\n hcp1User,\n await maintenanceTaskToCreate(apiForHcp1.maintenanceTaskApi, hcp1User, hcp1)\n ))!\n const identifierToAdd = new Identifier({ id: 'SYSTEM-TEST|VALUE-TEST', system: 'SYSTEM-TEST', value: 'VALUE-TEST' })\n\n // When\n const updatedTask: MaintenanceTask = await apiForHcp1.maintenanceTaskApi.modifyMaintenanceTaskWithUser(\n hcp1User,\n new MaintenanceTask({ ...createdTask, identifier: [identifierToAdd], status: MaintenanceTask.StatusEnum.Ongoing })\n )\n\n // Then\n assert(updatedTask.id == createdTask.id)\n assert(updatedTask.identifier?.[0].system == identifierToAdd.system)\n assert(updatedTask.identifier?.[0].value == identifierToAdd.value)\n assert(updatedTask.identifier?.[0].id == identifierToAdd.id)\n assert(updatedTask.status == MaintenanceTask.StatusEnum.Ongoing)\n })\n\n it('DeleteMaintenanceTaskWithUser Success for delegated HCP', async () => {\n // Given\n const createdTask: MaintenanceTask = (await apiForHcp1.maintenanceTaskApi.createMaintenanceTaskWithUser(\n hcp1User,\n await maintenanceTaskToCreate(apiForHcp1.maintenanceTaskApi, hcp1User, hcp1)\n ))!\n assert(!!createdTask.id)\n\n // When\n const deletedTask: DocIdentifier = await apiForHcp1.maintenanceTaskApi.deleteMaintenanceTaskWithUser(hcp1User, createdTask.id!)\n\n // Then\n assert(!!deletedTask)\n assert(deletedTask.id === createdTask.id)\n })\n\n it('DeleteMaintenanceTaskWithUser Success for HCP that which parent has delegation', async () => {\n // Given\n const createdTask: MaintenanceTask = (await apiForHcp1.maintenanceTaskApi.createMaintenanceTaskWithUser(\n hcp1User,\n await maintenanceTaskToCreate(apiForHcp1.maintenanceTaskApi, hcp1User, hcp1)\n ))!\n assert(!!createdTask.id)\n\n // When\n const deletedTask: DocIdentifier = await apiForHcp2.maintenanceTaskApi.deleteMaintenanceTaskWithUser(hcp1User, createdTask.id!)\n\n // Then\n assert(!!deletedTask)\n assert(deletedTask.id === createdTask.id)\n })\n\n it('DeleteMaintenanceTaskWithUser Fails for non-delegated HCP', async () => {\n const apiForHcp3 = await initApi(env, hcp2Username)\n const hcp3User = await apiForHcp3.userApi.getCurrentUser()\n\n // Given\n const createdTask: MaintenanceTask = (await apiForHcp1.maintenanceTaskApi.createMaintenanceTaskWithUser(\n hcp1User,\n await maintenanceTaskToCreate(apiForHcp1.maintenanceTaskApi, hcp1User, hcp1)\n ))!\n assert(!!createdTask.id)\n\n // When\n apiForHcp3.maintenanceTaskApi.deleteMaintenanceTaskWithUser(hcp3User, createdTask.id!).then(\n () => {\n throw new Error('You should not be here')\n },\n (e) => {\n assert(!!e)\n }\n )\n\n // Then\n const actualTask: MaintenanceTask = await apiForHcp1.maintenanceTaskApi.getMaintenanceTaskWithUser(hcp1User, createdTask.id!)\n assert(!!actualTask)\n assert(!actualTask.deletionDate)\n })\n\n it('FilterMaintenanceTaskByWithUser By Ids Success for HCP', async () => {\n // Given\n const createdTask: MaintenanceTask = (await apiForHcp1.maintenanceTaskApi.createMaintenanceTaskWithUser(\n hcp1User,\n await maintenanceTaskToCreate(apiForHcp1.maintenanceTaskApi, hcp1User, hcp1)\n ))!\n\n // When\n const foundTask = (\n await apiForHcp1.maintenanceTaskApi.filterMaintenanceTasksByWithUser(\n hcp1User,\n undefined,\n undefined,\n new FilterChainMaintenanceTask({\n filter: new MaintenanceTaskByIdsFilter({\n ids: [createdTask.id!],\n }),\n })\n )\n ).rows![0] as MaintenanceTask\n\n // Then\n assert(foundTask.id == createdTask.id)\n })\n\n it('FilterMaintenanceTaskByWithUser By Type Success for HCP', async () => {\n // Given\n const createdTask: MaintenanceTask = (await apiForHcp1.maintenanceTaskApi.createMaintenanceTaskWithUser(\n hcp1User,\n await maintenanceTaskToCreate(apiForHcp1.maintenanceTaskApi, hcp1User, hcp1)\n ))!\n\n // When\n const foundTask = (\n await apiForHcp1.maintenanceTaskApi.filterMaintenanceTasksByWithUser(\n hcp1User,\n undefined,\n undefined,\n new FilterChainMaintenanceTask({\n filter: new MaintenanceTaskByHcPartyAndTypeFilter({\n healthcarePartyId: hcp1.id!,\n type: createdTask.taskType!,\n }),\n })\n )\n ).rows![0]\n\n // Then\n assert(foundTask.id == createdTask.id)\n })\n\n it('FilterMaintenanceTaskByWithUser After Date Success for HCP', async () => {\n // Given\n const startTimestamp = new Date().getTime() + 1000\n const taskToCreate = { ...(await maintenanceTaskToCreate(apiForHcp1.maintenanceTaskApi, hcp1User, hcp1)), created: startTimestamp }\n\n const createdTask: MaintenanceTask = (await apiForHcp1.maintenanceTaskApi.createMaintenanceTaskWithUser(\n hcp1User,\n new MaintenanceTask(taskToCreate)\n ))!\n\n // When\n const foundTask = (\n await apiForHcp1.maintenanceTaskApi.filterMaintenanceTasksByWithUser(\n hcp1User,\n undefined,\n undefined,\n new FilterChainMaintenanceTask({\n filter: new MaintenanceTaskAfterDateFilter({\n healthcarePartyId: hcp1.id!,\n date: startTimestamp - 1000,\n }),\n })\n )\n ).rows![0]\n\n // Then\n assert(foundTask.id == createdTask.id)\n })\n\n it('Share with should work as expected', async () => {\n const api1 = await initApi(env!, hcp1Username)\n const user1 = await api1.userApi.getCurrentUser()\n const api2 = await initApi(env!, hcp2Username)\n const user2 = await api2.userApi.getCurrentUser()\n const samplePatient = await api1.patientApi.createPatientWithUser(\n user1,\n await api1.patientApi.newInstance(user1, { firstName: 'Gigio', lastName: 'Bagigio' })\n )\n const encryptedField = 'Something encrypted'\n const entity = (await api1.maintenanceTaskApi.createMaintenanceTaskWithUser(\n user1,\n await api1.maintenanceTaskApi.newInstance(user1, {\n properties: [\n new PropertyStub({\n id: 'someProp',\n type: new PropertyTypeStub({ type: PropertyTypeStub.TypeEnum.STRING }),\n typedValue: new TypedValueObject({\n type: TypedValueObject.TypeEnum.STRING,\n stringValue: encryptedField,\n }),\n }),\n ],\n })\n ))!\n expect(entity.properties![0].typedValue!.stringValue).to.be.equal(encryptedField)\n await api2.maintenanceTaskApi\n .getMaintenanceTaskWithUser(user2, entity.id!)\n .then(() => {\n throw new Error('Should not be able to get the entity')\n })\n .catch(() => {\n /* expected */\n })\n await api1.maintenanceTaskApi.shareWith(user2.healthcarePartyId!, entity)\n const retrieved = await api2.maintenanceTaskApi.getMaintenanceTaskWithUser(user2, entity.id!)\n expect(retrieved.properties![0].typedValue!.stringValue).to.be.equal(encryptedField)\n })\n})\n"]}
1
+ {"version":3,"file":"icc-maintenance-task-x-api-test.js","sourceRoot":"","sources":["../../../test/icc-x-api/icc-maintenance-task-x-api-test.ts"],"names":[],"mappings":"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","sourcesContent":["import { before } from 'mocha'\n\nimport 'isomorphic-fetch'\n\nimport { Apis, EntityWithDelegationTypeName } from '../../icc-x-api'\nimport { assert, expect } from 'chai'\nimport { randomUUID } from 'crypto'\nimport { createHcpHierarchyApis, getEnvironmentInitializer, hcp1Username, hcp2Username, setLocalStorage, TestUtils } from '../utils/test_utils'\nimport { User } from '../../icc-api/model/User'\nimport { IccMaintenanceTaskXApi } from '../../icc-x-api'\nimport { MaintenanceTask } from '../../icc-api/model/MaintenanceTask'\nimport { PropertyStub } from '../../icc-api/model/PropertyStub'\nimport { PropertyTypeStub } from '../../icc-api/model/PropertyTypeStub'\nimport { TypedValueObject } from '../../icc-api/model/TypedValueObject'\nimport { HealthcareParty } from '../../icc-api/model/HealthcareParty'\nimport { Identifier } from '../../icc-api/model/Identifier'\nimport { FilterChainMaintenanceTask } from '../../icc-api/model/FilterChainMaintenanceTask'\nimport { MaintenanceTaskByIdsFilter } from '../../icc-x-api/filters/MaintenanceTaskByIdsFilter'\nimport { MaintenanceTaskByHcPartyAndTypeFilter } from '../../icc-x-api/filters/MaintenanceTaskByHcPartyAndTypeFilter'\nimport { DocIdentifier } from '../../icc-api/model/DocIdentifier'\nimport initApi = TestUtils.initApi\nimport { MaintenanceTaskAfterDateFilter } from '../../icc-x-api/filters/MaintenanceTaskAfterDateFilter'\nimport { SecureDelegation } from '../../icc-api/model/SecureDelegation'\nimport AccessLevel = SecureDelegation.AccessLevelEnum\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\n\nsetLocalStorage(fetch)\nlet env: TestVars\n\nfunction maintenanceTaskToCreate(mTaskApiForHcp: IccMaintenanceTaskXApi, hcpUser: User, delegatedTo: HealthcareParty) {\n return mTaskApiForHcp.newInstance(\n hcpUser,\n new MaintenanceTask({\n id: randomUUID(),\n taskType: randomUUID(),\n status: MaintenanceTask.StatusEnum.Pending,\n properties: [\n new PropertyStub({\n id: 'dataOwnerConcernedId',\n type: new PropertyTypeStub({ type: PropertyTypeStub.TypeEnum.STRING }),\n typedValue: new TypedValueObject({\n type: TypedValueObject.TypeEnum.STRING,\n stringValue: delegatedTo.id,\n }),\n }),\n new PropertyStub({\n id: 'dataOwnerConcernedPubKey',\n type: new PropertyTypeStub({ type: PropertyTypeStub.TypeEnum.STRING }),\n typedValue: new TypedValueObject({\n type: TypedValueObject.TypeEnum.STRING,\n stringValue: delegatedTo.publicKey,\n }),\n }),\n ],\n }),\n { additionalDelegates: { [delegatedTo.id!]: AccessLevel.WRITE } }\n )\n}\n\nlet apiForHcp1: Apis\nlet hcp1User: User\nlet hcp1: HealthcareParty\n\nlet apiForHcp2: Apis\nlet hcp2User: User\nlet hcp2: HealthcareParty\n\ndescribe('icc-x-maintenance-task-api Tests', () => {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n const hierarchicalHcps = await createHcpHierarchyApis(env)\n\n apiForHcp1 = hierarchicalHcps.grandApi\n hcp1User = await apiForHcp1.userApi.getCurrentUser()\n hcp1 = await apiForHcp1.healthcarePartyApi.getCurrentHealthcareParty()\n\n apiForHcp2 = hierarchicalHcps.parentApi\n hcp2User = await apiForHcp2.userApi.getCurrentUser()\n hcp2 = await apiForHcp2.healthcarePartyApi.getCurrentHealthcareParty()\n })\n\n it('CreateMaintenanceTaskWithUser Success for HCP', async () => {\n // Given\n const taskToCreate = await maintenanceTaskToCreate(apiForHcp1.maintenanceTaskApi, hcp1User, hcp2)\n\n // When\n const createdTask = await apiForHcp1.maintenanceTaskApi.createMaintenanceTaskWithUser(hcp1User, taskToCreate)\n\n // Then\n assert(createdTask != null)\n assert(createdTask.id == taskToCreate.id)\n const keysFor1 = await apiForHcp1.cryptoApi.xapi.encryptionKeysOf(\n { entity: createdTask, type: EntityWithDelegationTypeName.MaintenanceTask },\n undefined\n )\n expect(keysFor1).to.have.length(1)\n\n const foundTask: MaintenanceTask = await apiForHcp2.maintenanceTaskApi.getMaintenanceTaskWithUser(hcp2User, createdTask.id!)\n\n assert(foundTask.id == createdTask.id)\n assert(foundTask.properties?.find((prop: PropertyStub) => prop.typedValue?.stringValue == hcp2.id) != undefined)\n assert(foundTask.properties?.find((prop: PropertyStub) => prop.typedValue?.stringValue == hcp2.publicKey) != undefined)\n const keysFor2 = await apiForHcp2.cryptoApi.xapi.encryptionKeysOf(\n { entity: createdTask, type: EntityWithDelegationTypeName.MaintenanceTask },\n undefined\n )\n expect(keysFor2).to.have.length(1)\n expect(keysFor2[0]).to.equal(keysFor1[0])\n }).timeout(30000)\n\n it('ModifyMaintenanceTaskWithUser Success for HCP', async () => {\n // Given\n const createdTask: MaintenanceTask = (await apiForHcp1.maintenanceTaskApi.createMaintenanceTaskWithUser(\n hcp1User,\n await maintenanceTaskToCreate(apiForHcp1.maintenanceTaskApi, hcp1User, hcp1)\n ))!\n const identifierToAdd = new Identifier({ id: 'SYSTEM-TEST|VALUE-TEST', system: 'SYSTEM-TEST', value: 'VALUE-TEST' })\n\n // When\n const updatedTask: MaintenanceTask = await apiForHcp1.maintenanceTaskApi.modifyMaintenanceTaskWithUser(\n hcp1User,\n new MaintenanceTask({ ...createdTask, identifier: [identifierToAdd], status: MaintenanceTask.StatusEnum.Ongoing })\n )\n\n // Then\n assert(updatedTask.id == createdTask.id)\n assert(updatedTask.identifier?.[0].system == identifierToAdd.system)\n assert(updatedTask.identifier?.[0].value == identifierToAdd.value)\n assert(updatedTask.identifier?.[0].id == identifierToAdd.id)\n assert(updatedTask.status == MaintenanceTask.StatusEnum.Ongoing)\n })\n\n it('DeleteMaintenanceTaskWithUser Success for delegated HCP', async () => {\n // Given\n const createdTask: MaintenanceTask = (await apiForHcp1.maintenanceTaskApi.createMaintenanceTaskWithUser(\n hcp1User,\n await maintenanceTaskToCreate(apiForHcp1.maintenanceTaskApi, hcp1User, hcp1)\n ))!\n assert(!!createdTask.id)\n\n // When\n const deletedTask: DocIdentifier = await apiForHcp1.maintenanceTaskApi.deleteMaintenanceTaskWithUser(hcp1User, createdTask.id!)\n\n // Then\n assert(!!deletedTask)\n assert(deletedTask.id === createdTask.id)\n })\n\n it('DeleteMaintenanceTaskWithUser Success for HCP that which parent has delegation', async () => {\n // Given\n const createdTask: MaintenanceTask = (await apiForHcp1.maintenanceTaskApi.createMaintenanceTaskWithUser(\n hcp1User,\n await maintenanceTaskToCreate(apiForHcp1.maintenanceTaskApi, hcp1User, hcp1)\n ))!\n assert(!!createdTask.id)\n\n // When\n const deletedTask: DocIdentifier = await apiForHcp2.maintenanceTaskApi.deleteMaintenanceTaskWithUser(hcp1User, createdTask.id!)\n\n // Then\n assert(!!deletedTask)\n assert(deletedTask.id === createdTask.id)\n })\n\n it('DeleteMaintenanceTaskWithUser Fails for non-delegated HCP', async () => {\n const apiForHcp3 = await initApi(env, hcp2Username)\n const hcp3User = await apiForHcp3.userApi.getCurrentUser()\n\n // Given\n const createdTask: MaintenanceTask = (await apiForHcp1.maintenanceTaskApi.createMaintenanceTaskWithUser(\n hcp1User,\n await maintenanceTaskToCreate(apiForHcp1.maintenanceTaskApi, hcp1User, hcp1)\n ))!\n assert(!!createdTask.id)\n\n // When\n apiForHcp3.maintenanceTaskApi.deleteMaintenanceTaskWithUser(hcp3User, createdTask.id!).then(\n () => {\n throw new Error('You should not be here')\n },\n (e) => {\n assert(!!e)\n }\n )\n\n // Then\n const actualTask: MaintenanceTask = await apiForHcp1.maintenanceTaskApi.getMaintenanceTaskWithUser(hcp1User, createdTask.id!)\n assert(!!actualTask)\n assert(!actualTask.deletionDate)\n })\n\n it('FilterMaintenanceTaskByWithUser By Ids Success for HCP', async () => {\n // Given\n const createdTask: MaintenanceTask = (await apiForHcp1.maintenanceTaskApi.createMaintenanceTaskWithUser(\n hcp1User,\n await maintenanceTaskToCreate(apiForHcp1.maintenanceTaskApi, hcp1User, hcp1)\n ))!\n\n // When\n const foundTask = (\n await apiForHcp1.maintenanceTaskApi.filterMaintenanceTasksByWithUser(\n hcp1User,\n undefined,\n undefined,\n new FilterChainMaintenanceTask({\n filter: new MaintenanceTaskByIdsFilter({\n ids: [createdTask.id!],\n }),\n })\n )\n ).rows![0] as MaintenanceTask\n\n // Then\n assert(foundTask.id == createdTask.id)\n })\n\n it('FilterMaintenanceTaskByWithUser By Type Success for HCP', async () => {\n // Given\n const createdTask: MaintenanceTask = (await apiForHcp1.maintenanceTaskApi.createMaintenanceTaskWithUser(\n hcp1User,\n await maintenanceTaskToCreate(apiForHcp1.maintenanceTaskApi, hcp1User, hcp1)\n ))!\n\n // When\n const foundTask = (\n await apiForHcp1.maintenanceTaskApi.filterMaintenanceTasksByWithUser(\n hcp1User,\n undefined,\n undefined,\n new FilterChainMaintenanceTask({\n filter: new MaintenanceTaskByHcPartyAndTypeFilter({\n healthcarePartyId: hcp1.id!,\n type: createdTask.taskType!,\n }),\n })\n )\n ).rows![0]\n\n // Then\n assert(foundTask.id == createdTask.id)\n })\n\n it('FilterMaintenanceTaskByWithUser After Date Success for HCP', async () => {\n // Given\n const startTimestamp = new Date().getTime() + 1000\n const taskToCreate = { ...(await maintenanceTaskToCreate(apiForHcp1.maintenanceTaskApi, hcp1User, hcp1)), created: startTimestamp }\n\n const createdTask: MaintenanceTask = (await apiForHcp1.maintenanceTaskApi.createMaintenanceTaskWithUser(\n hcp1User,\n new MaintenanceTask(taskToCreate)\n ))!\n\n // When\n const foundTask = (\n await apiForHcp1.maintenanceTaskApi.filterMaintenanceTasksByWithUser(\n hcp1User,\n undefined,\n undefined,\n new FilterChainMaintenanceTask({\n filter: new MaintenanceTaskAfterDateFilter({\n healthcarePartyId: hcp1.id!,\n date: startTimestamp - 1000,\n }),\n })\n )\n ).rows![0]\n\n // Then\n assert(foundTask.id == createdTask.id)\n })\n\n it('Share with should work as expected', async () => {\n const api1 = await initApi(env!, hcp1Username)\n const user1 = await api1.userApi.getCurrentUser()\n const api2 = await initApi(env!, hcp2Username)\n const user2 = await api2.userApi.getCurrentUser()\n const samplePatient = await api1.patientApi.createPatientWithUser(\n user1,\n await api1.patientApi.newInstance(user1, { firstName: 'Gigio', lastName: 'Bagigio' })\n )\n const encryptedField = 'Something encrypted'\n const entity = (await api1.maintenanceTaskApi.createMaintenanceTaskWithUser(\n user1,\n await api1.maintenanceTaskApi.newInstance(user1, {\n properties: [\n new PropertyStub({\n id: 'someProp',\n type: new PropertyTypeStub({ type: PropertyTypeStub.TypeEnum.STRING }),\n typedValue: new TypedValueObject({\n type: TypedValueObject.TypeEnum.STRING,\n stringValue: encryptedField,\n }),\n }),\n ],\n })\n ))!\n expect(entity.properties![0].typedValue!.stringValue).to.be.equal(encryptedField)\n await api2.maintenanceTaskApi\n .getMaintenanceTaskWithUser(user2, entity.id!)\n .then(() => {\n throw new Error('Should not be able to get the entity')\n })\n .catch(() => {\n /* expected */\n })\n await api1.maintenanceTaskApi.shareWith(user2.healthcarePartyId!, entity)\n const retrieved = await api2.maintenanceTaskApi.getMaintenanceTaskWithUser(user2, entity.id!)\n expect(retrieved.properties![0].typedValue!.stringValue).to.be.equal(encryptedField)\n })\n})\n"]}
@@ -44,7 +44,7 @@ describe('icc-x-user-api Tests', () => {
44
44
  yield api.userApi.getCurrentUser();
45
45
  }));
46
46
  it('Can get an user by its phoneNumber', () => __awaiter(void 0, void 0, void 0, function* () {
47
- const primitives = new icc_x_api_1.CryptoPrimitives(crypto_1.webcrypto);
47
+ const primitives = new icc_x_api_1.CryptoPrimitivesImpl(crypto_1.webcrypto);
48
48
  const phoneNumber = `+${primitives.randomUuid()}`;
49
49
  const api = yield initMasterApi(env);
50
50
  const createdUser = yield api.userApi.createUser(new User_1.User({