@icure/api 5.0.9 → 5.0.12

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.
@@ -36,7 +36,9 @@ class IccAuthApi {
36
36
  _body = body;
37
37
  const _url = this.host + `/auth/check` + '?ts=' + new Date().getTime();
38
38
  let headers = this.headers;
39
- headers = headers.filter((h) => h.header !== 'Content-Type').concat(new XHR_1.XHR.Header('Content-Type', 'application/json'));
39
+ headers = headers
40
+ .filter((h) => { var _a; return h.header !== 'Content-Type' && ((_a = h.header) === null || _a === void 0 ? void 0 : _a.toLowerCase()) !== 'authorization'; })
41
+ .concat(new XHR_1.XHR.Header('Content-Type', 'application/json'));
40
42
  return XHR_1.XHR.sendCommand('POST', _url, headers, _body, this.fetchImpl)
41
43
  .then((doc) => new AuthenticationResponse_1.AuthenticationResponse(doc.body))
42
44
  .catch((err) => this.handleError(err));
@@ -1 +1 @@
1
- {"version":3,"file":"IccAuthApi.js","sourceRoot":"","sources":["../../../icc-api/api/IccAuthApi.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * iCure Data Stack API Documentation\n * The iCure Data Stack Application API is the native interface to iCure. This version is obsolete, please use v2.\n *\n * OpenAPI spec version: v1\n *\n *\n * NOTE: This class is auto generated by the swagger code generator program.\n * https://github.com/swagger-api/swagger-codegen.git\n * Do not edit the class manually.\n */\nimport { XHR } from './XHR'\nimport { AuthenticationResponse } from '../model/AuthenticationResponse'\nimport { LoginCredentials } from '../model/LoginCredentials'\n\nexport class IccAuthApi {\n host: string\n headers: Array<XHR.Header>\n fetchImpl?: (input: RequestInfo, init?: RequestInit) => Promise<Response>\n\n constructor(host: string, headers: any, fetchImpl?: (input: RequestInfo, init?: RequestInit) => Promise<Response>) {\n this.host = host\n this.headers = Object.keys(headers).map((k) => new XHR.Header(k, headers[k]))\n this.fetchImpl = fetchImpl\n }\n\n setHeaders(h: Array<XHR.Header>) {\n this.headers = h\n }\n\n handleError(e: XHR.XHRError): never {\n throw e\n }\n\n /**\n * Check login using groupId/userId and password\n * @summary check\n * @param body\n */\n check(body?: LoginCredentials): Promise<AuthenticationResponse> {\n let _body = null\n _body = body\n\n const _url = this.host + `/auth/check` + '?ts=' + new Date().getTime()\n let headers = this.headers\n headers = headers.filter((h) => h.header !== 'Content-Type').concat(new XHR.Header('Content-Type', 'application/json'))\n return XHR.sendCommand('POST', _url, headers, _body, this.fetchImpl)\n .then((doc) => new AuthenticationResponse(doc.body as JSON))\n .catch((err) => this.handleError(err))\n }\n\n /**\n * Login using username and password\n * @summary login\n * @param body\n */\n login(body?: LoginCredentials): Promise<AuthenticationResponse> {\n let _body = null\n _body = body\n\n const _url = this.host + `/auth/login` + '?ts=' + new Date().getTime()\n let headers = this.headers\n headers = headers\n .filter((h) => h.header !== 'Content-Type' && h.header?.toLowerCase() !== 'authorization')\n .concat(new XHR.Header('Content-Type', 'application/json'))\n return XHR.sendCommand('POST', _url, headers, _body, this.fetchImpl, undefined, true)\n .then((doc) => new AuthenticationResponse(doc.body as JSON))\n .catch((err) => this.handleError(err))\n }\n\n /**\n * Logout\n * @summary logout\n */\n logout(): Promise<AuthenticationResponse> {\n let _body = null\n\n const _url = this.host + `/auth/logout` + '?ts=' + new Date().getTime()\n let headers = this.headers\n return XHR.sendCommand(\n 'GET',\n _url,\n headers.filter((h) => h.header?.toLowerCase() !== 'authorization'),\n _body,\n this.fetchImpl\n )\n .then((doc) => new AuthenticationResponse(doc.body as JSON))\n .catch((err) => this.handleError(err))\n }\n\n /**\n * Logout\n * @summary logout\n */\n logoutPost(): Promise<AuthenticationResponse> {\n let _body = null\n\n const _url = this.host + `/auth/logout` + '?ts=' + new Date().getTime()\n let headers = this.headers\n return XHR.sendCommand(\n 'POST',\n _url,\n headers.filter((h) => h.header?.toLowerCase() !== 'authorization'),\n _body,\n this.fetchImpl\n )\n .then((doc) => new AuthenticationResponse(doc.body as JSON))\n .catch((err) => this.handleError(err))\n }\n\n /**\n * Get token for subsequent operation\n * @summary token\n * @param method\n * @param path\n */\n token(method: string, path: string): Promise<string> {\n let _body = null\n\n const _url = this.host + `/auth/token/${encodeURIComponent(String(method))}/${encodeURIComponent(String(path))}` + '?ts=' + new Date().getTime()\n let headers = this.headers\n return XHR.sendCommand('GET', _url, headers, _body, this.fetchImpl)\n .then((doc) => JSON.parse(JSON.stringify(doc.body)))\n .catch((err) => this.handleError(err))\n }\n}\n"]}
1
+ {"version":3,"file":"IccAuthApi.js","sourceRoot":"","sources":["../../../icc-api/api/IccAuthApi.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * iCure Data Stack API Documentation\n * The iCure Data Stack Application API is the native interface to iCure. This version is obsolete, please use v2.\n *\n * OpenAPI spec version: v1\n *\n *\n * NOTE: This class is auto generated by the swagger code generator program.\n * https://github.com/swagger-api/swagger-codegen.git\n * Do not edit the class manually.\n */\nimport { XHR } from './XHR'\nimport { AuthenticationResponse } from '../model/AuthenticationResponse'\nimport { LoginCredentials } from '../model/LoginCredentials'\n\nexport class IccAuthApi {\n host: string\n headers: Array<XHR.Header>\n fetchImpl?: (input: RequestInfo, init?: RequestInit) => Promise<Response>\n\n constructor(host: string, headers: any, fetchImpl?: (input: RequestInfo, init?: RequestInit) => Promise<Response>) {\n this.host = host\n this.headers = Object.keys(headers).map((k) => new XHR.Header(k, headers[k]))\n this.fetchImpl = fetchImpl\n }\n\n setHeaders(h: Array<XHR.Header>) {\n this.headers = h\n }\n\n handleError(e: XHR.XHRError): never {\n throw e\n }\n\n /**\n * Check login using groupId/userId and password\n * @summary check\n * @param body\n */\n check(body?: LoginCredentials): Promise<AuthenticationResponse> {\n let _body = null\n _body = body\n\n const _url = this.host + `/auth/check` + '?ts=' + new Date().getTime()\n let headers = this.headers\n headers = headers\n .filter((h) => h.header !== 'Content-Type' && h.header?.toLowerCase() !== 'authorization')\n .concat(new XHR.Header('Content-Type', 'application/json'))\n return XHR.sendCommand('POST', _url, headers, _body, this.fetchImpl)\n .then((doc) => new AuthenticationResponse(doc.body as JSON))\n .catch((err) => this.handleError(err))\n }\n\n /**\n * Login using username and password\n * @summary login\n * @param body\n */\n login(body?: LoginCredentials): Promise<AuthenticationResponse> {\n let _body = null\n _body = body\n\n const _url = this.host + `/auth/login` + '?ts=' + new Date().getTime()\n let headers = this.headers\n headers = headers\n .filter((h) => h.header !== 'Content-Type' && h.header?.toLowerCase() !== 'authorization')\n .concat(new XHR.Header('Content-Type', 'application/json'))\n return XHR.sendCommand('POST', _url, headers, _body, this.fetchImpl, undefined, true)\n .then((doc) => new AuthenticationResponse(doc.body as JSON))\n .catch((err) => this.handleError(err))\n }\n\n /**\n * Logout\n * @summary logout\n */\n logout(): Promise<AuthenticationResponse> {\n let _body = null\n\n const _url = this.host + `/auth/logout` + '?ts=' + new Date().getTime()\n let headers = this.headers\n return XHR.sendCommand(\n 'GET',\n _url,\n headers.filter((h) => h.header?.toLowerCase() !== 'authorization'),\n _body,\n this.fetchImpl\n )\n .then((doc) => new AuthenticationResponse(doc.body as JSON))\n .catch((err) => this.handleError(err))\n }\n\n /**\n * Logout\n * @summary logout\n */\n logoutPost(): Promise<AuthenticationResponse> {\n let _body = null\n\n const _url = this.host + `/auth/logout` + '?ts=' + new Date().getTime()\n let headers = this.headers\n return XHR.sendCommand(\n 'POST',\n _url,\n headers.filter((h) => h.header?.toLowerCase() !== 'authorization'),\n _body,\n this.fetchImpl\n )\n .then((doc) => new AuthenticationResponse(doc.body as JSON))\n .catch((err) => this.handleError(err))\n }\n\n /**\n * Get token for subsequent operation\n * @summary token\n * @param method\n * @param path\n */\n token(method: string, path: string): Promise<string> {\n let _body = null\n\n const _url = this.host + `/auth/token/${encodeURIComponent(String(method))}/${encodeURIComponent(String(path))}` + '?ts=' + new Date().getTime()\n let headers = this.headers\n return XHR.sendCommand('GET', _url, headers, _body, this.fetchImpl)\n .then((doc) => JSON.parse(JSON.stringify(doc.body)))\n .catch((err) => this.handleError(err))\n }\n}\n"]}
@@ -574,7 +574,10 @@ class IccCryptoXApi {
574
574
  const [publicKeyFingerprint, encryptedAesExchangeKey] = candidates[candidates.findIndex(([k, v]) => publicKeys.some((pk) => pk.endsWith(k)))];
575
575
  return Object.assign(Object.assign({}, map), { [e[0]]: { [publicKeyFingerprint]: encryptedAesExchangeKey } });
576
576
  }, {});
577
- return !owner.publicKey || mapOfAesExchangeKeys[owner.publicKey] || !((_b = owner.hcPartyKeys) === null || _b === void 0 ? void 0 : _b[delegateId]) || (publicKeys.find((p) => p == owner.publicKey) == undefined)
577
+ return !owner.publicKey ||
578
+ mapOfAesExchangeKeys[owner.publicKey] ||
579
+ !((_b = owner.hcPartyKeys) === null || _b === void 0 ? void 0 : _b[delegateId]) ||
580
+ publicKeys.find((p) => p == owner.publicKey) == undefined
578
581
  ? mapOfAesExchangeKeys
579
582
  : Object.assign(Object.assign({}, mapOfAesExchangeKeys), { [owner.publicKey]: { [owner.publicKey.slice(-32)]: owner.hcPartyKeys[delegateId][0] } });
580
583
  });
@@ -703,9 +706,9 @@ class IccCryptoXApi {
703
706
  this.throwDetailedExceptionForInvalidParameter('child.id', child.id, 'addDelegationsAndEncryptionKeys', arguments);
704
707
  return (secretDelegationKey
705
708
  ? this.extendedDelegationsAndCryptedForeignKeys(child, parent, ownerId, delegateId, secretDelegationKey)
706
- : Promise.resolve({ delegations: {}, cryptedForeignKeys: {} }))
709
+ : Promise.resolve({ modifiedObject: child, delegations: {}, cryptedForeignKeys: {}, secretId: null }))
707
710
  .then((extendedChildObjectSPKsAndCFKs) => secretEncryptionKey
708
- ? this.appendEncryptionKeys(child, ownerId, delegateId, secretEncryptionKey).then(
711
+ ? this.appendEncryptionKeys(extendedChildObjectSPKsAndCFKs.modifiedObject, ownerId, delegateId, secretEncryptionKey).then(
709
712
  //TODO: extendedDelegationsAndCryptedForeignKeys and appendEncryptionKeys can be done in parallel
710
713
  (extendedChildObjectEKs) => ({
711
714
  extendedSPKsAndCFKs: extendedChildObjectSPKsAndCFKs,
@@ -716,7 +719,7 @@ class IccCryptoXApi {
716
719
  extendedEKs: { encryptionKeys: {} },
717
720
  }))
718
721
  .then(({ extendedSPKsAndCFKs: extendedChildObjectSPKsAndCFKs, extendedEKs: extendedChildObjectEKs }) => {
719
- return _.assign(child, {
722
+ return _.assign(extendedChildObjectSPKsAndCFKs.modifiedObject, {
720
723
  // Conservative version ... We might want to be more aggressive with the deduplication of keys
721
724
  // For each delegate, we are going to concatenate to the src (the new delegations), the object in dest (the current delegations)
722
725
  // for which we do not find an equivalent delegation (same delegator, same delegate)
@@ -1361,7 +1364,7 @@ class IccCryptoXApi {
1361
1364
  if (!selectedPublicKey) {
1362
1365
  throw new Error(`Invalid owner, no public key, keypairs have not be set for ${ownerId}`);
1363
1366
  }
1364
- if ((owner.hcPartyKeys || {})[delegateId] ||
1367
+ if (((owner.hcPartyKeys || {})[delegateId] && owner.publicKey && availablePublicKeysFingerprints.includes(owner.publicKey.slice(-32))) ||
1365
1368
  Object.values(owner.aesExchangeKeys || {}).some((x) => x[delegateId] && Object.keys(x[delegateId]).some((k) => availablePublicKeysFingerprints.includes(k)))) {
1366
1369
  return owner;
1367
1370
  }
@@ -1 +1 @@
1
- {"version":3,"file":"icc-crypto-x-api.js","sourceRoot":"","sources":["../../icc-x-api/icc-crypto-x-api.ts"],"names":[],"mappings":"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","sourcesContent":["import {IccDeviceApi, IccHcpartyApi, IccPatientApi} from '../icc-api'\nimport {AESUtils} from './crypto/AES'\nimport {RSAUtils} from './crypto/RSA'\nimport {ShamirClass} from './crypto/shamir'\n\nimport * as _ from 'lodash'\nimport {\n Delegation,\n Device,\n Document,\n EncryptedEntity,\n EncryptedParentEntity,\n HealthcareParty,\n MaintenanceTask,\n Patient,\n PropertyStub,\n PropertyTypeStub,\n TypedValueObject,\n User,\n} from '../icc-api/model/models'\nimport { b2a, b64_2uas, hex2ua, string2ua, ua2hex, ua2string, ua2utf8, utf8_2ua } from './utils/binary-utils'\nimport { fold, jwk2spki, notConcurrent, pkcs8ToJwk, spkiToJwk } from './utils'\nimport { IccMaintenanceTaskXApi } from './icc-maintenance-task-x-api'\n\ninterface DelegatorAndKeys {\n delegatorId: string\n key: CryptoKey\n rawKey: string\n}\n\ntype CachedDataOwner =\n | {\n type: 'patient'\n dataOwner: Patient\n }\n | {\n type: 'device'\n dataOwner: Device\n }\n | {\n type: 'hcp'\n dataOwner: HealthcareParty\n }\n\nexport class IccCryptoXApi {\n get crypto(): Crypto {\n return this._crypto\n }\n\n get shamir(): ShamirClass {\n return this._shamir\n }\n\n get RSA(): RSAUtils {\n return this._RSA\n }\n\n get AES(): AESUtils {\n return this._AES\n }\n\n hcPartyKeysCache: {\n [key: string]: DelegatorAndKeys\n } = {}\n\n //[delegateId][delegatorId] = delegateEncryptedHcPartyKey\n //for each delegate, it stores the list of delegators and the corresponding delegateEncryptedHcPartyKey (shared HcPartyKey, from delegator to delegate, encrypted with the RSA key of the delegate)\n hcPartyKeysRequestsCache: {\n [delegateId: string]: Promise<{ [key: string]: { [key: string]: { [key: string]: string } } }>\n } = {}\n\n cacheLastDeletionTimestamp: number | undefined = undefined\n\n dataOwnerCache: { [key: string]: Promise<CachedDataOwner> } = {}\n\n emptyHcpCache(hcpartyId: string) {\n delete this.hcPartyKeysRequestsCache[hcpartyId]\n delete this.dataOwnerCache[hcpartyId]\n delete this.dataOwnerCache[hcpartyId]\n }\n\n /**\n * Gets all delegate encrypted HcParty keys of the delegate with the given `delegateHcPartyId`, and for each key the delegator id\n * If the keys are not cached, they are retrieved from the backend.\n *\n * @param delegateHcPartyId The Health Care Party id\n * @returns \\{delegatorId: delegateEncryptedHcPartyKey\\}\n */\n private getEncryptedAesExchangeKeysForDelegate(\n delegateHcPartyId: string\n ): Promise<{ [key: string]: { [key: string]: { [key: string]: string } } }> {\n return (\n this.hcPartyKeysRequestsCache[delegateHcPartyId] ||\n (this.hcPartyKeysRequestsCache[delegateHcPartyId] = this.forceGetEncryptedAesExchangeKeysForDelegate(delegateHcPartyId))\n )\n }\n\n private forceGetEncryptedAesExchangeKeysForDelegate(\n delegateHcPartyId: string\n ): Promise<{ [key: string]: { [key: string]: { [key: string]: string } } }> {\n return Promise.all([\n this.patientBaseApi.getPatientAesExchangeKeysForDelegate(delegateHcPartyId).catch(() => {}),\n this.hcpartyBaseApi.getAesExchangeKeysForDelegate(delegateHcPartyId).catch(() => {}),\n this.deviceBaseApi.getDeviceAesExchangeKeysForDelegate(delegateHcPartyId).catch(() => {}),\n ]).then(([a, b, c]) => ({ ...a, ...b, ...c }))\n }\n\n keychainLocalStoreIdPrefix = 'org.taktik.icure.ehealth.keychain.'\n keychainValidityDateLocalStoreIdPrefix = 'org.taktik.icure.ehealth.keychain-date.'\n hcpPreferenceKeyEhealthCert = 'eHealthCRTCrypt'\n hcpPreferenceKeyEhealthCertDate = 'eHealthCRTDate'\n rsaLocalStoreIdPrefix = 'org.taktik.icure.rsa.'\n\n private hcpartyBaseApi: IccHcpartyApi\n private patientBaseApi: IccPatientApi\n private deviceBaseApi: IccDeviceApi\n private readonly _crypto: Crypto\n\n private generateKeyConcurrencyMap: { [key: string]: PromiseLike<HealthcareParty | Patient> }\n private rsaKeyPairs: { [pubKeyFingerprint: string]: { publicKey: CryptoKey; privateKey: CryptoKey } } = {}\n\n private readonly _AES: AESUtils\n private readonly _RSA: RSAUtils\n private readonly _shamir: ShamirClass\n\n constructor(\n host: string,\n headers: { [key: string]: string },\n hcpartyBaseApi: IccHcpartyApi, //Init with a hcparty x api for better performances\n patientBaseApi: IccPatientApi,\n deviceBaseApi: IccDeviceApi,\n crypto: Crypto = typeof window !== 'undefined' ? window.crypto : typeof self !== 'undefined' ? self.crypto : ({} as Crypto)\n ) {\n this.hcpartyBaseApi = hcpartyBaseApi\n this.patientBaseApi = patientBaseApi\n this.deviceBaseApi = deviceBaseApi\n this._crypto = crypto\n this.generateKeyConcurrencyMap = {}\n\n this._AES = new AESUtils(crypto)\n this._RSA = new RSAUtils(crypto)\n this._shamir = new ShamirClass(crypto)\n }\n\n randomUuid() {\n return ((1e7).toString() + -1e3 + -4e3 + -8e3 + -1e11).replace(\n /[018]/g,\n (c) => (Number(c) ^ ((this._crypto.getRandomValues(new Uint8Array(1))! as Uint8Array)[0] & (15 >> (Number(c) / 4)))).toString(16) //Keep that inlined or you will loose the random\n )\n }\n\n sha256(data: ArrayBuffer | Uint8Array) {\n return this._crypto.subtle.digest('SHA-256', data)\n }\n\n private async getPublicKeys() {\n return await Object.values(this.rsaKeyPairs).reduce(async (p, rsa) => {\n return (await p).concat([jwk2spki(await this.RSA.exportKey(rsa.publicKey, 'jwk'))])\n }, Promise.resolve([] as string[]))\n }\n\n encryptShamirRSAKey(hcp: HealthcareParty, notaries: Array<HealthcareParty>, threshold?: number): Promise<HealthcareParty> {\n return this.loadKeyPairImported(hcp.id!).then((keyPair) =>\n this._RSA.exportKey(keyPair.privateKey, 'pkcs8').then(async (exportedKey) => {\n const privateKey = exportedKey as ArrayBuffer\n const nLen = notaries.length\n const shares = nLen == 1 ? [privateKey] : this._shamir.share(ua2hex(privateKey), nLen, threshold || nLen).map((share) => hex2ua(share))\n const publicKeys = await this.getPublicKeys()\n\n return _.reduce(\n notaries,\n (queue, notary, idx) => {\n return queue.then(async (hcp) => {\n const { owner: hcParty, aesExchangeKeys } = await this.getOrCreateHcPartyKeys(hcp, notary.id!)\n const [publicKeyIdentifier, hcPartyKeys] = Object.entries(aesExchangeKeys)[0]\n\n try {\n const importedAESHcPartyKey = await this.decryptHcPartyKey(\n notary.id!,\n hcParty.id!,\n notary.id!,\n publicKeyIdentifier,\n hcPartyKeys,\n publicKeys\n )\n const encryptedShamirPartition = await this.AES.encrypt(importedAESHcPartyKey.key, shares[idx])\n\n hcParty.privateKeyShamirPartitions = hcParty.privateKeyShamirPartitions || {}\n hcParty.privateKeyShamirPartitions[notary.id!] = ua2hex(encryptedShamirPartition)\n } catch (e) {\n console.log('Error during encryptedShamirRSAKey', notary.id, e)\n }\n return hcParty\n })\n },\n Promise.resolve(hcp)\n )\n })\n )\n }\n\n /* Reconstructs the hcp's private key from the notaries' shamir shares and stores it in localstorage.\n The retrieval procedure of the shares is not designed or implemented yet. Therefore, it currently only\n works if the private key of the notaries are stored in local storage (e.g. notaries = [hcp parent]).\n * @param hcp : the hcp whose key we want to reconstruct\n * @param notaries : holders of the shamir shares\n **/\n async decryptShamirRSAKey(hcp: HealthcareParty, notaries: Array<HealthcareParty>): Promise<void> {\n try {\n const publicKeys = await this.getPublicKeys()\n const nLen = notaries.length\n let decryptedPrivatedKey\n if (nLen == 1) {\n const notaryHcPartyId = notaries[0].id!\n const encryptedAesKeyMap = await this.getEncryptedAesExchangeKeys(hcp, notaryHcPartyId)\n const importedAESHcPartyKey = await Promise.all(\n Object.entries(encryptedAesKeyMap).map(\n async ([idPubKey, keysMap]) => await this.decryptHcPartyKey(notaryHcPartyId, hcp.id!, notaryHcPartyId, idPubKey, keysMap, publicKeys)\n )\n )\n const cryptedPrivatedKey = hcp.privateKeyShamirPartitions![notaryHcPartyId]\n decryptedPrivatedKey = ua2hex(\n await this.AES.decryptSome(\n importedAESHcPartyKey.map((k) => k.key),\n hex2ua(cryptedPrivatedKey)\n )\n )\n } else {\n const decryptedShares: string[] = await _.reduce(\n notaries,\n (queue, notary) => {\n return queue.then(async (shares: string[]) => {\n try {\n // TODO: now, we get the encrypted shares in db and decrypt them. This assumes that the\n // the notaries' private keys are in localstorage. We should implement a way for the notaries to\n // give hcp the decrypted shares without having to also share their private keys.\n const encryptedAesKeyMap = await this.getEncryptedAesExchangeKeys(hcp, notary.id!)\n const importedAESHcPartyKey = await Promise.all(\n Object.entries(encryptedAesKeyMap).map(\n async ([idPubKey, keysMap]) => await this.decryptHcPartyKey(notary.id!, hcp.id!, notary.id!, idPubKey, keysMap, publicKeys)\n )\n )\n const encryptedShare = hcp.privateKeyShamirPartitions![notary.id!]\n const decryptedShamirPartition = ua2hex(\n await this.AES.decryptSome(\n importedAESHcPartyKey.map((k) => k.key),\n hex2ua(encryptedShare)\n )\n )\n shares.push(decryptedShamirPartition)\n } catch (e) {\n console.log('Error during encryptedShamirRSAKey', notary.id, e)\n }\n return shares\n })\n },\n Promise.resolve([] as string[])\n )\n\n decryptedPrivatedKey = this._shamir.combine(decryptedShares)\n }\n\n const importedPrivateKey = await this._RSA.importKey('pkcs8', hex2ua(decryptedPrivatedKey), ['decrypt'])\n const importedPublicKey = await this._RSA.importKey('spki', hex2ua(hcp.publicKey!), ['encrypt'])\n\n const exportedKeyPair = await this._RSA.exportKeys({ publicKey: importedPublicKey, privateKey: importedPrivateKey }, 'jwk', 'jwk')\n this.storeKeyPair(hcp.id!, exportedKeyPair)\n } catch (e) {\n console.log('Cannot decrypt shamir RSA key')\n }\n }\n\n /**\n * Gets the decryptedHcPartyKey for the given `encryptedHcPartyKey`\n *\n * If the decrypted key exists in the cache, retrieves it from there.\n * Otherwise, decrypts it using the RSA key of the delegator or delegate (depending on the value of `encryptedForDelegator`)\n *\n * @param loggedHcPartyId The logged DataOwner id or the id of his parent\n * @param delegatorId The id of Delegator eg, the DataOwner where this AES exchange key is stored\n * @param delegateHcPartyId The id of the delegate : the data owner for whom this aes exchange key has been created\n * @param publicKey The public key of the delegator : A unique aes exchange key is created for each public key of the delegator. This is the public key corresponding to the encryptedHcPartyKeys\n * @param encryptedHcPartyKeys The encryptedHcPartyKeys to be decrypted\n * @param publicKeys The public keys for which we might have a private key\n *\n * @returns - **delegatorId** the input param `delegatorId`\n * - **key** the decrypted `encryptedHcPartyKey`\n */\n\n async decryptHcPartyKey(\n loggedHcPartyId: string,\n delegatorId: string,\n delegateHcPartyId: string,\n publicKey: string,\n encryptedHcPartyKeys: { [key: string]: string },\n publicKeys: string[]\n ): Promise<DelegatorAndKeys> {\n if (!publicKeys.length) {\n const reason = `Cannot decrypt RSA encrypted AES HcPartyKey from ${delegatorId} to ${delegateHcPartyId}: no public key`\n console.warn(reason)\n throw new Error(reason)\n }\n\n const cacheKey = `${delegateHcPartyId}|${publicKey.slice(-32)}|${delegatorId}`\n const res = this.hcPartyKeysCache[cacheKey]\n\n if (res) {\n return res\n }\n\n const result = await publicKeys.reduce(async (res, pk) => {\n const delegatorAndKeys = await res\n if (delegatorAndKeys) {\n return delegatorAndKeys\n }\n\n const fingerprint = pk.slice(-32)\n const keyPair = this.rsaKeyPairs[fingerprint] ?? (await this.cacheKeyPair(this.loadKeyPairNotImported(loggedHcPartyId, fingerprint)))\n if (!keyPair) {\n return\n }\n\n const encryptedHcPartyKey = encryptedHcPartyKeys[fingerprint]\n if (!encryptedHcPartyKey) {\n return\n }\n\n try {\n const decryptedAesExchangeKey = await this._RSA.decrypt(keyPair.privateKey, hex2ua(encryptedHcPartyKey))\n const importedAesExchangeKey = await this._AES.importKey('raw', decryptedAesExchangeKey)\n return (this.hcPartyKeysCache[cacheKey] = {\n delegatorId: delegatorId,\n key: importedAesExchangeKey,\n rawKey: ua2hex(new Uint8Array(decryptedAesExchangeKey)),\n })\n } catch (e) {\n const reason = `Cannot decrypt RSA encrypted AES HcPartyKey from ${delegatorId} to ${delegateHcPartyId} for pubKey ${fingerprint}: impossible to decrypt`\n console.log(reason)\n }\n }, Promise.resolve() as Promise<DelegatorAndKeys | void>)\n\n const availablePublicKeys = publicKeys.filter((pk) => this.rsaKeyPairs[pk.slice(-32)])\n\n if (!result) {\n //Try to find another key from the transfer keys\n const hcp = (await this.getDataOwner(loggedHcPartyId))!\n const candidates = Object.entries(hcp.dataOwner.transferKeys ?? {})\n .filter(([fp, _]) => availablePublicKeys.some((pk) => pk.slice(-32) === fp.slice(-32))) // only keep keys that we will be able to decrypt\n .flatMap(([pk, keys]) => Object.entries(keys).map(([k, v]) => [pk, k, v]))\n .filter(([_, k]) => !publicKeys.some((apk) => apk.slice(-32) === k.slice(-32)))\n if (candidates.length) {\n const newPublicKeys = await candidates.reduce(async (p, [decryptionKeyFingerprint, privateKeyFingerprint, encryptedPrivateKey]) => {\n const newKeys = await p\n const aesExchangeKeys = Object.entries(hcp.dataOwner.aesExchangeKeys!).find(\n ([fp, _]) => fp.slice(-32) === privateKeyFingerprint.slice(-32)\n )?.[1][loggedHcPartyId]\n if (aesExchangeKeys) {\n const encryptedAesExchangeKey = Object.entries(aesExchangeKeys).find(\n ([fp, _]) => fp.slice(-32) === decryptionKeyFingerprint.slice(-32)\n )?.[1]\n if (encryptedAesExchangeKey) {\n const keyPair = this.rsaKeyPairs[decryptionKeyFingerprint.slice(-32)]\n if (!keyPair) {\n return newKeys\n }\n const decryptedAesExchangeKey = await this._RSA.decrypt(keyPair.privateKey, hex2ua(encryptedAesExchangeKey))\n const importedAesExchangeKey = await this._AES.importKey('raw', decryptedAesExchangeKey)\n\n const decryptedPrivateKey = await this._AES.decrypt(importedAesExchangeKey, hex2ua(encryptedPrivateKey))\n\n const newPublicKey = Object.keys(hcp.dataOwner.aesExchangeKeys!).find((fp) => fp.slice(-32) === privateKeyFingerprint.slice(-32))!\n await this.cacheKeyPair({\n publicKey: spkiToJwk(hex2ua(newPublicKey)),\n privateKey: pkcs8ToJwk(decryptedPrivateKey),\n })\n\n return newKeys.concat([newPublicKey])\n }\n }\n return newKeys\n }, Promise.resolve([]) as Promise<string[]>)\n\n if (newPublicKeys.length) {\n return await this.decryptHcPartyKey(loggedHcPartyId, delegatorId, delegateHcPartyId, publicKey, encryptedHcPartyKeys, newPublicKeys)\n }\n }\n\n const reason = `Cannot decrypt RSA encrypted AES HcPartyKey from ${delegatorId} to ${delegateHcPartyId}: impossible to decrypt. No private key was found or could be used to decrypt the aes exchange keys`\n console.log(reason)\n throw new Error(reason)\n }\n\n return result\n }\n\n /**\n * Cache the RSA private/public key pair for the HcP with the given id `hcPartyKeyOwner`\n */\n cacheKeyPair(keyPairInJwk: { publicKey: JsonWebKey; privateKey: JsonWebKey }) {\n return this._RSA.importKeyPair('jwk', keyPairInJwk.privateKey, 'jwk', keyPairInJwk.publicKey).then((importedKeyPair) => {\n const pk = jwk2spki(keyPairInJwk.publicKey)\n return (this.rsaKeyPairs[pk.slice(-32)] = importedKeyPair)\n })\n }\n\n /**\n * Gets the secret ID (SFKs) that should be used in the prescribed context (confidential or not) from decrypted SPKs of the given `parent`, decrypted by the HcP with the given `hcpartyId` AND by its HcP parents\n * @param parent :the object of which delegations (SPKs) to decrypt\n * @param hcpartyId :the id of the delegate HcP\n * @param confidential :weather the key is going to be used for a confidential piece or data or not\n * @returns - **extractedKeys** array containing secret IDs (SFKs) from decrypted SPKs, from both given HcP and its parents ; can contain duplicates\n * - **hcpartyId** the given `hcpartyId` OR, if a parent exist, the HcP id of the top parent in the hierarchy (even if that parent has no delegations)\n */\n async extractPreferredSfk(parent: EncryptedParentEntity, hcpartyId: string, confidential: boolean) {\n const secretForeignKeys = await this.extractSFKsHierarchyFromDelegations(parent, hcpartyId)\n const keys = secretForeignKeys\n .filter(({ extractedKeys }) => extractedKeys.length > 0)\n .filter((x, idx) => (confidential ? x.hcpartyId === hcpartyId : idx === 0))[0]\n\n return (\n (keys &&\n (confidential\n ? keys.extractedKeys.find(\n (k) => !secretForeignKeys.some(({ extractedKeys, hcpartyId: parentHcpId }) => hcpartyId !== parentHcpId && extractedKeys.includes(k))\n )\n : keys.extractedKeys[0])) ||\n undefined\n )\n }\n\n /**\n * Gets an array of decrypted HcPartyKeys, shared between the delegate with ID `delegateHcPartyId` and the delegators in `delegatorsHcPartyIdsSet`\n *\n * 1. Get the keys for the delegateHealthCareParty (cache/backend).\n * 2. For each key in the delegators, decrypt it with the delegate's private key\n * 3. Filter out undefined keys and return them\n *\n * @param delegatorsHcPartyIdsSet array of delegator HcP IDs that could have delegated something to the HcP with ID `delegateHcPartyId`\n * @param delegateHcPartyId the HcP for which the HcPs with IDs in `delegatorsHcPartyIdsSet` could have delegated something\n * @param minCacheDurationInSeconds The minimum cache duration\n * @returns - **delegatorId** : the id of the delegator HcP that shares the **key** with the `delegateHcPartyId`\n * - **key** the decrypted HcPartyKey, shared between **delegatorId** and `delegateHcPartyId`\n */\n async decryptAndImportAesHcPartyKeysForDelegators(\n delegatorsHcPartyIdsSet: Array<string>,\n delegateHcPartyId: string,\n minCacheDurationInSeconds: number = 60\n ): Promise<Array<DelegatorAndKeys>> {\n const aesExchangeKeys = await (\n this.hcPartyKeysRequestsCache[delegateHcPartyId] ||\n (this.hcPartyKeysRequestsCache[delegateHcPartyId] = this.getEncryptedAesExchangeKeysForDelegate(delegateHcPartyId))\n ).then(async (delegatorIdsWithDelegateEncryptedHcPartyKeys: { [key: string]: { [key: string]: { [key: string]: string } } }) => {\n // [key: delegatorId] = delegateEncryptedHcPartyKey\n // For each delegatorId, obtain the AES key (decrypted HcParty Key) shared with the delegate, decrypted by the delegate\n return (\n await Promise.all(\n delegatorsHcPartyIdsSet.map(async (delegatorId: string) => {\n const encryptedHcPartyKeysForPubKeyFingerprint = delegatorIdsWithDelegateEncryptedHcPartyKeys[delegatorId]\n if (!encryptedHcPartyKeysForPubKeyFingerprint) {\n return [] as DelegatorAndKeys[]\n }\n const decryptedKeys = await Promise.all(\n Object.entries(encryptedHcPartyKeysForPubKeyFingerprint).map(async ([delegatorPubKeyFinerprint, encryptedAesExchangeKeys]) => {\n try {\n return await this.decryptHcPartyKey(\n delegateHcPartyId,\n delegatorId,\n delegateHcPartyId,\n delegatorPubKeyFinerprint,\n encryptedAesExchangeKeys,\n Object.keys(this.rsaKeyPairs)\n )\n } catch (e) {\n console.log(`failed to decrypt hcPartyKey from ${delegatorId} to ${delegateHcPartyId}`)\n return\n }\n })\n )\n return decryptedKeys.filter((x) => !!x) as DelegatorAndKeys[]\n })\n )\n ).reduce((acc, x) => [...acc, ...x], [])\n })\n\n if (aesExchangeKeys.length > 0) {\n return aesExchangeKeys\n }\n\n const nowTimestamp = +new Date()\n if (!this.cacheLastDeletionTimestamp || (nowTimestamp - this.cacheLastDeletionTimestamp) / 1000 >= minCacheDurationInSeconds) {\n delete this.hcPartyKeysRequestsCache[delegateHcPartyId]\n this.cacheLastDeletionTimestamp = nowTimestamp\n return this.decryptAndImportAesHcPartyKeysForDelegators(delegatorsHcPartyIdsSet, delegateHcPartyId, minCacheDurationInSeconds)\n }\n\n return []\n }\n\n /**\n * Gets an array of decrypted HcPartyKeys from the given `delegations`, that are shared with / can be decrypted by the HcP with the given `healthcarePartyId` (or by its parents when `fallbackOnParent` is true)\n *\n * 1. Checks whether the delegations' object has a delegation for the\n * given healthCarePartyId.\n * 2. Enumerates all the delegators (delegation.owner) present in\n * the delegations.\n * 3. Decrypt's delegators' keys and returns them.\n *\n * @param dataOwnerId : the id of the delegate HCP\n * @param delegations : delegations (can be SPKs, CFKs, EKs) for all delegates\n * @param fallbackOnParent default true; use parent's healthCarePartyId in case there's no delegation for the `healthcarePartyId`\n * @returns - **delegatorId** : the id of the delegator HcP that shares the **key** with the `healthcarePartyId`\n * - **key** the decrypted HcPartyKey, shared between **delegatorId** and `healthcarePartyId`\n */\n async getDecryptedAesExchangeKeysOfDelegateAndParentsFromGenericDelegations(\n dataOwnerId: string,\n delegations: { [key: string]: Array<Delegation> },\n fallbackOnParent = true\n ): Promise<Array<DelegatorAndKeys>> {\n const delegationsArray = delegations[dataOwnerId] ?? []\n\n if (!delegationsArray.length && fallbackOnParent) {\n const { dataOwner: hcp } = await this.getDataOwner(dataOwnerId)\n return (hcp as any).parentId\n ? await this.getDecryptedAesExchangeKeysOfDelegateAndParentsFromGenericDelegations((hcp as any).parentId, delegations)\n : []\n } else {\n const delegatorIds = new Set<string>()\n delegationsArray.forEach((del) => delegatorIds.add(del.owner!))\n return this.decryptAndImportAesHcPartyKeysForDelegators(Array.from(delegatorIds), dataOwnerId)\n }\n }\n\n /**\n * Retrieve the owner HealthCareParty key and use it to encrypt\n * both the delegations (createdObject.id) and the cryptedForeignKeys\n * (parentObject.id), and returns them in an object.\n */\n async initObjectDelegations(\n createdObject: any,\n parentObject: any,\n ownerId: string,\n secretForeignKeyOfParent: string | null\n ): Promise<{\n owner: HealthcareParty | Device | Patient\n delegations: any\n cryptedForeignKeys: any\n secretForeignKeys: any[]\n secretId: string\n }> {\n const publicKeys = await this.getPublicKeys()\n\n this.throwDetailedExceptionForInvalidParameter('createdObject.id', createdObject.id, 'initObjectDelegations', arguments)\n\n if (parentObject) this.throwDetailedExceptionForInvalidParameter('parentObject.id', parentObject.id, 'initObjectDelegations', arguments)\n\n const secretId = this.randomUuid()\n return this.getDataOwner(ownerId).then(async ({ dataOwner: owner }) => {\n const { owner: modifiedOwner, aesExchangeKeys } = await this.getOrCreateHcPartyKeys(owner, ownerId)\n const importedAESHcPartyKey = await this.decryptAnyAesExchangeKeyForOwner(aesExchangeKeys, ownerId, ownerId, ownerId, publicKeys)\n\n const encryptedDelegation = await this._AES.encrypt(\n importedAESHcPartyKey.key,\n string2ua(createdObject.id + ':' + secretId).buffer as ArrayBuffer,\n importedAESHcPartyKey.rawKey\n )\n const encryptedSecretForeignKey =\n parentObject &&\n this._AES.encrypt(\n importedAESHcPartyKey.key,\n string2ua(createdObject.id + ':' + parentObject.id).buffer as ArrayBuffer,\n importedAESHcPartyKey.rawKey\n )\n\n return {\n owner: modifiedOwner,\n delegations: _.fromPairs([\n [\n ownerId,\n [\n {\n owner: ownerId,\n delegatedTo: ownerId,\n key: ua2hex(encryptedDelegation!),\n },\n ],\n ],\n ]),\n cryptedForeignKeys:\n (encryptedSecretForeignKey &&\n _.fromPairs([\n [\n ownerId,\n [\n {\n owner: ownerId,\n delegatedTo: ownerId,\n key: ua2hex(encryptedSecretForeignKey!),\n },\n ],\n ],\n ])) ||\n {},\n secretForeignKeys: (secretForeignKeyOfParent && [secretForeignKeyOfParent]) || [],\n secretId: secretId,\n }\n })\n }\n\n private async decryptAnyAesExchangeKeyForOwner(\n aesExchangeKeys: { [p: string]: { [p: string]: string } },\n loggedHcPartyId: string,\n delegatorId: string,\n delegateHcPartyId: string,\n publicKeys: string[]\n ) {\n const importedAESHcPartyKey = await Object.entries(aesExchangeKeys).reduce(async (acc, [publicKeyIdentifier, hcPartyKeys]) => {\n const accValue = await acc\n if (accValue) {\n return accValue\n }\n try {\n return await this.decryptHcPartyKey(loggedHcPartyId, delegatorId, delegateHcPartyId, publicKeyIdentifier, hcPartyKeys, publicKeys)\n } catch (e) {\n return undefined\n }\n }, Promise.resolve() as Promise<DelegatorAndKeys | undefined>)\n\n if (!importedAESHcPartyKey) {\n throw new Error(`No hcParty key can be decrypted from ${delegatorId} to ${delegateHcPartyId} using currently available private keys`)\n }\n return importedAESHcPartyKey\n }\n\n /**\n * Gets updated instances of SPKs and CKFs for the child object `modifiedObject`.\n * These updated SPKs and CKFs contain new SPKs/CFKs to provide delegation from delegator HcP with id `ownerId` to delegate HcP with id `delegateId`\n *\n * 1. if `secretIdOfModifiedObject` is not provided, the method will throw an exception; this `secretIdOfModifiedObject` is used to generate a new delegation (SPK) in step 3;\n * the `secretIdOfModifiedObject` is returned, unmodified, as `secretId`\n * 2. if the owner (delegator) did not perform a delegation to the delegate, then this HcP delegation (creation of a new HcPKey) is performed now\n * 3. creates a new delegation (Secret Primary Keys) on the `modifiedObject` encrypted with the HcPKey from owner to the delegate;\n * 4. if `parentObject` != null, creates a new CFK on the `modifiedObject` encrypted with the HcPKey from owner to the delegate;\n * 5. this new delegation (from step 3) is added to the list of existing delegations (Secret Primary Keys) on the `modifiedObject` for the delegate given by `delegateId`\n * 6. if the CFK (from step 4) can be created, this new CFK is added to the list of existing CFKs on the `modifiedObject` for the delegate given by `delegateId`\n * 7. then some duplicates delegations (SPKs) and CKFs are removed\n *\n * @param modifiedObject : the object of which SPKs and CFKs will be cloned, the clones will be modified and then used as returned values ; it's a 'child' of `parentObject`; will NOT be mutated\n * @param parentObject : will NOT be mutated\n * @param ownerId : the HcP id of the delegator\n * @param delegateId : the HcP id of the delegate\n * @param secretIdOfModifiedObject : the secret id used in the child object to generate its SPK\n * @returns - **delegations** existing delegations (SPKs) of the `modifiedObject`, appended with results from step 5\n * - **cryptedForeignKeys** existing CFKs of the `modifiedObject`, appended with results from steps 6\n * - **secretId** which is the given input parameter `secretIdOfModifiedObject`\n */\n\n extendedDelegationsAndCryptedForeignKeys<T extends EncryptedEntity, P extends EncryptedParentEntity>(\n //TODO: suggested name: getExtendedChildObjectSPKandCFKwithDelegationFromDelegatorToDelegate\n modifiedObject: T,\n parentObject: P | null,\n ownerId: string,\n delegateId: string,\n secretIdOfModifiedObject: string | null\n ): Promise<{\n modifiedObject: T\n delegations: { [key: string]: Array<Delegation> }\n cryptedForeignKeys: { [key: string]: Array<Delegation> }\n secretId: string | null //TODO: why input parameter secretIdOfModifiedObject is returned?\n }> {\n this.throwDetailedExceptionForInvalidParameter('modifiedObject.id', modifiedObject.id, 'extendedDelegationsAndCryptedForeignKeys', arguments) //modifiedObject should never be null\n\n if (parentObject)\n this.throwDetailedExceptionForInvalidParameter('parentObject.id', parentObject?.id, 'extendedDelegationsAndCryptedForeignKeys', arguments)\n\n this.throwDetailedExceptionForInvalidParameter(\n 'secretIdOfModifiedObject',\n secretIdOfModifiedObject,\n 'extendedDelegationsAndCryptedForeignKeys',\n arguments\n )\n\n return this.getDataOwner(ownerId)\n .then(async ({ dataOwner: owner }) => {\n const publicKeys = await this.getPublicKeys()\n const { owner: modifiedOwner, aesExchangeKeys } = await this.getOrCreateHcPartyKeys(owner, delegateId)\n const importedAESHcPartyKey = await this.decryptAnyAesExchangeKeyForOwner(aesExchangeKeys, ownerId, delegateId, ownerId, publicKeys)\n\n modifiedObject = modifiedObject?.id === owner.id ? (modifiedOwner as T) : modifiedObject\n\n return {\n previousDecryptedDelegations: await Promise.all(\n ((modifiedObject.delegations || {})[delegateId] || []).map(\n (d: Delegation) =>\n (d.key &&\n d.owner === ownerId &&\n this._AES.decrypt(importedAESHcPartyKey.key, hex2ua(d.key), importedAESHcPartyKey.rawKey).catch(() => {\n console.log(\n `Cannot decrypt delegation from ${d.owner} to ${d.delegatedTo} for object with id ${modifiedObject.id}:`,\n modifiedObject\n )\n return Promise.resolve()\n })) ||\n Promise.resolve()\n ) as Array<Promise<ArrayBuffer>>\n ),\n\n previousDecryptedCryptedForeignKeys: await Promise.all(\n ((modifiedObject.cryptedForeignKeys || {})[delegateId] || []).map(\n (d: Delegation) =>\n (d.key &&\n d.owner === ownerId &&\n this._AES.decrypt(importedAESHcPartyKey.key, hex2ua(d.key), importedAESHcPartyKey.rawKey).catch(() => {\n console.log(\n `Cannot decrypt cryptedForeignKeys from ${d.owner} to ${d.delegatedTo} for object with id ${modifiedObject.id}:`,\n modifiedObject\n )\n return Promise.resolve()\n })) ||\n Promise.resolve()\n ) as Array<Promise<ArrayBuffer>>\n ),\n\n cryptedDelegation: await this._AES.encrypt(\n importedAESHcPartyKey.key,\n string2ua(modifiedObject.id + ':' + secretIdOfModifiedObject!).buffer as ArrayBuffer,\n importedAESHcPartyKey.rawKey\n ),\n\n cryptedForeignKey: parentObject\n ? await this._AES.encrypt(\n importedAESHcPartyKey.key,\n string2ua(modifiedObject.id + ':' + parentObject.id).buffer as ArrayBuffer,\n importedAESHcPartyKey.rawKey\n )\n : undefined,\n }\n })\n .then(({ previousDecryptedDelegations, previousDecryptedCryptedForeignKeys, cryptedDelegation, cryptedForeignKey }) => {\n //try to limit the extent of the modifications to the delegations by preserving the redundant delegation already present and removing duplicates\n //For delegate delegateId, we create:\n // 1. an array of objects { d : {owner,delegatedTo,encrypted(key)}} with one object for each existing delegation and the new key concatenated\n // 2. an array of objects { k : decrypted(key)} with one object for the existing delegations and the new key concatenated\n // We merge them to get one array of objects: { d: {owner,delegatedTo,encrypted(key)}, k: decrypted(key)}\n const delegationCryptedDecrypted = (\n _.merge(\n ((modifiedObject.delegations || {})[delegateId] || []).map((d: Delegation) => ({\n d,\n })),\n (previousDecryptedDelegations || []).map((dd) => (dd ? ua2string(dd) : null)).map((k) => ({ k }))\n ) as { d: Delegation; k: string }[]\n )\n .filter(({ d, k }) => !!k || d.owner !== ownerId) //Only keep the ones created by us that can still be decrypted\n .map(({ d, k }) => ({\n d,\n k: k || this.randomUuid(),\n })) // Use some unique id that ensures the delegation not created by us are going to be held\n .concat([\n {\n d: {\n owner: ownerId,\n delegatedTo: delegateId,\n key: ua2hex(cryptedDelegation!),\n },\n k: modifiedObject.id + ':' + secretIdOfModifiedObject!,\n },\n ])\n\n const allDelegations = _.cloneDeep(modifiedObject.delegations || {})\n\n //Only keep one version of the decrypted key\n allDelegations[delegateId] = _.uniqBy(delegationCryptedDecrypted, (x: any) => x.k).map((x: any) => x.d)\n\n const cryptedForeignKeysCryptedDecrypted = (\n _.merge(\n ((modifiedObject.cryptedForeignKeys || {})[delegateId] || []).map((d: Delegation) => ({\n d,\n })),\n (previousDecryptedCryptedForeignKeys || []).map((dd) => (dd ? ua2string(dd) : null)).map((k) => ({ k }))\n ) as { d: Delegation; k: string }[]\n )\n .filter(({ d, k }) => !!k || d.owner !== ownerId) //Only keep the ones created by us that can still be decrypted\n .map(({ d, k }: { d: Delegation; k: string }) => ({\n d,\n k: k || this.randomUuid(),\n })) // Use some unique id that ensures the delegation not created by us are going to be held\n .concat(\n cryptedForeignKey\n ? [\n {\n d: {\n owner: ownerId,\n delegatedTo: delegateId,\n key: ua2hex(cryptedForeignKey),\n },\n k: modifiedObject.id + ':' + parentObject?.id,\n },\n ]\n : []\n )\n\n const allCryptedForeignKeys = _.cloneDeep(modifiedObject.cryptedForeignKeys || {})\n if (cryptedForeignKeysCryptedDecrypted.length > 0) {\n allCryptedForeignKeys[delegateId] = _.uniqBy(cryptedForeignKeysCryptedDecrypted, (x: any) => x.k).map((x: any) => x.d)\n }\n\n return {\n modifiedObject,\n delegations: allDelegations,\n cryptedForeignKeys: allCryptedForeignKeys,\n secretId: secretIdOfModifiedObject,\n }\n })\n }\n\n async getEncryptedAesExchangeKeys(\n owner: HealthcareParty | Patient | Device,\n delegateId: string\n ): Promise<{ [pubKeyIdentifier: string]: { [pubKeyFingerprint: string]: string } }> {\n const publicKeys = await this.getPublicKeys()\n const mapOfAesExchangeKeys = Object.entries(owner.aesExchangeKeys ?? {})\n .filter((e) => e[1][delegateId] && Object.keys(e[1][delegateId]).some((k1) => publicKeys.some((pk) => pk.endsWith(k1))))\n .reduce((map, e) => {\n const candidates = Object.entries(e[1][delegateId])\n const [publicKeyFingerprint, encryptedAesExchangeKey] = candidates[candidates.findIndex(([k, v]) => publicKeys.some((pk) => pk.endsWith(k)))]\n return { ...map, [e[0]]: { [publicKeyFingerprint]: encryptedAesExchangeKey } }\n }, {} as { [pubKeyIdentifier: string]: { [pubKeyFingerprint: string]: string } })\n\n return !owner.publicKey || mapOfAesExchangeKeys[owner.publicKey] || !owner.hcPartyKeys?.[delegateId] || (publicKeys.find((p) => p == owner.publicKey!) == undefined)\n ? mapOfAesExchangeKeys\n : { ...mapOfAesExchangeKeys, [owner.publicKey]: { [owner.publicKey.slice(-32)]: owner.hcPartyKeys[delegateId][0] } }\n }\n\n async getOrCreateHcPartyKeys(\n owner: HealthcareParty | Patient | Device,\n delegateId: string\n ): Promise<{\n owner: HealthcareParty | Patient | Device\n aesExchangeKeys: { [pubKeyIdentifier: string]: { [pubKeyFingerprint: string]: string } }\n }> {\n const aesExchangeKeys = await this.getEncryptedAesExchangeKeys(owner, delegateId)\n if (Object.keys(aesExchangeKeys).length) {\n return { owner, aesExchangeKeys }\n }\n\n const modifiedOwner = await this.generateKeyForDelegate(owner.id!, delegateId)\n return { owner: modifiedOwner, aesExchangeKeys: await this.getEncryptedAesExchangeKeys(modifiedOwner, delegateId) }\n }\n\n /**\n * Retrieve the owners HealthCareParty key, decrypt it, and\n * use it to encrypt & initialize the \"encryptionKeys\" object\n * and return it.\n * @param createdObject\n * @param ownerId\n */\n initEncryptionKeys(\n createdObject: any,\n ownerId: string\n ): Promise<{\n encryptionKeys: any\n secretId: string\n }> {\n this.throwDetailedExceptionForInvalidParameter('createdObject.id', createdObject.id, 'initEncryptionKeys', arguments)\n\n const secretId = this.randomUuid()\n return this.getDataOwner(ownerId).then(async ({ dataOwner: owner }) => {\n const publicKeys = await this.getPublicKeys()\n const { owner: modifiedOwner, aesExchangeKeys } = await this.getOrCreateHcPartyKeys(owner, ownerId)\n const importedAESHcPartyKey = await this.decryptAnyAesExchangeKeyForOwner(aesExchangeKeys, ownerId, ownerId, ownerId, publicKeys)\n const encryptedEncryptionKeys = await this._AES.encrypt(\n importedAESHcPartyKey.key,\n string2ua(createdObject.id + ':' + secretId),\n importedAESHcPartyKey.rawKey\n )\n\n return {\n encryptionKeys: _.fromPairs([\n [\n ownerId,\n [\n {\n owner: ownerId,\n delegatedTo: ownerId,\n key: ua2hex(encryptedEncryptionKeys),\n },\n ],\n ],\n ]),\n secretId: secretId,\n }\n })\n }\n\n /**\n * Gets an updated instance of the EKs of `modifiedObject`.\n * The updated EKs contain a new EK to provide delegation from delegator HcP with id `ownerId` to delegate HcP with id `delegateId`.\n * @param modifiedObject : the object of which EKs will be cloned, the clone will be used to append the new EK, and then used as return value; will NOT be mutated\n * @param ownerId : delegator HcP id\n * @param delegateId : delegate HcP id\n * @param secretEncryptionKeyOfObject : secret Id for the EK (Content Encryption Key)\n * @returns - **encryptionKeys** existing EKs of the `modifiedObject`, appended with a new EK item (owner: `ownerId`, delegatedTo: `delegateId`, encrypted key with secretId: `secretEncryptionKeyOfObject` )\n * - **secretId** which is the given input parameter `secretEncryptionKeyOfObject`\n */\n async appendEncryptionKeys(\n //TODO: suggested name: getExtendedEKwithDelegationFromDelegatorToDelegate\n modifiedObject: any,\n ownerId: string,\n delegateId: string,\n secretEncryptionKeyOfObject: string\n ): Promise<{\n encryptionKeys: { [key: string]: Array<Delegation> }\n secretId: string | null //secretEncryptionKeyOfObject is returned to avoid the need for a new decryption when chaining calls\n }> {\n this.throwDetailedExceptionForInvalidParameter('modifiedObject.id', modifiedObject.id, 'appendEncryptionKeys', arguments) //modifiedObject should never be null\n\n this.throwDetailedExceptionForInvalidParameter('secretEncryptionKeyOfObject', secretEncryptionKeyOfObject, 'appendEncryptionKeys', arguments)\n\n return this.getDataOwner(ownerId)\n .then(async ({ dataOwner: owner }) => {\n const publicKeys = await this.getPublicKeys()\n const { owner: modifiedOwner, aesExchangeKeys } = await this.getOrCreateHcPartyKeys(owner, delegateId)\n const importedAESHcPartyKey = await this.decryptAnyAesExchangeKeyForOwner(aesExchangeKeys, ownerId, ownerId, delegateId, publicKeys)\n\n return {\n previousDecryptedEncryptionKeys: await Promise.all(\n ((modifiedObject.encryptionKeys || {})[delegateId] || []).map(\n (d: Delegation) =>\n (d.key &&\n d.owner === ownerId &&\n this._AES.decrypt(importedAESHcPartyKey.key, hex2ua(d.key), importedAESHcPartyKey.rawKey).catch(() => {\n console.log(\n `Cannot decrypt encryption key from ${d.owner} to ${d.delegatedTo} for object with id ${modifiedObject.id}:`,\n modifiedObject\n )\n return Promise.resolve()\n })) ||\n Promise.resolve()\n ) as Array<Promise<ArrayBuffer>>\n ),\n encryptedEncryptionKey: await this._AES.encrypt(\n importedAESHcPartyKey.key,\n string2ua(modifiedObject.id + ':' + secretEncryptionKeyOfObject)\n ),\n }\n })\n .then(({ previousDecryptedEncryptionKeys, encryptedEncryptionKey }) => {\n //try to limit the extent of the modifications to the delegations by preserving the redundant encryption keys already present and removing duplicates\n //For delegate delegateId, we create:\n // 1. an array of objects { d : {owner,delegatedTo,encrypted(key)}} with one object for the existing encryption keys and the new key concatenated\n // 2. an array of objects { k : decrypted(key)} with one object for the existing delegations and the new key concatenated\n // We merge them to get one array of objects: { d: {owner,delegatedTo,encrypted(key)}, k: decrypted(key)}\n const encryptionKeysCryptedDecrypted = _.merge(\n ((modifiedObject.encryptionKeys || {})[delegateId] || []).map((d: Delegation) => ({\n d,\n })),\n (previousDecryptedEncryptionKeys || []).map((dd) => (dd ? ua2string(dd) : null)).map((k) => ({ k }))\n )\n .filter(({ d, k }: { d: Delegation; k: string }) => !!k || d.owner !== ownerId) //Only keep the ones created by us that can still be decrypted\n .map(({ d, k }: { d: Delegation; k: string }) => ({ d, k: k || this.randomUuid() }))\n .concat([\n {\n d: {\n owner: ownerId,\n delegatedTo: delegateId,\n key: ua2hex(encryptedEncryptionKey),\n },\n k: modifiedObject.id + ':' + secretEncryptionKeyOfObject!,\n },\n ])\n\n const allEncryptionKeys = _.cloneDeep(modifiedObject.encryptionKeys)\n allEncryptionKeys[delegateId] = _.uniqBy(encryptionKeysCryptedDecrypted, (x: any) => x.k).map((x: any) => x.d)\n\n return {\n encryptionKeys: allEncryptionKeys,\n secretId: secretEncryptionKeyOfObject,\n }\n })\n }\n\n /**\n * Gets an updated `child` object that will have its SPKs, CFKs, KSs updated to include delegations from delegator HcP with id `ownerId` to delegate HcP with id `delegateId`\n * The SFKs of `child` are not updated, so this method assumes this is not the initial delegation on the `child` object\n * The method also performs some deduplication of all types of delegations.\n * @param parent : the parent object of `child`; will NOT be mutated\n * @param child : the object that will be mutated and returned\n * @param ownerId delegator HcP id\n * @param delegateId delegate HcP id\n * @param secretDelegationKey the secret Id used in the child object to generate the SPK\n * @param secretEncryptionKey the secret Id used in the child object to generate the EK (Content Encryption Key)\n * @returns - an updated `child` object that will contain updated SPKs, CFKs, EKs\n * */\n\n addDelegationsAndEncryptionKeys<T extends EncryptedEntity>(\n //TODO: suggested name: updateChildGenericDelegationsFromDelegatorToDelegate\n parent: EncryptedParentEntity | null,\n child: T,\n ownerId: string,\n delegateId: string,\n secretDelegationKey: string | null,\n secretEncryptionKey: string | null\n ): Promise<T> {\n if (parent) this.throwDetailedExceptionForInvalidParameter('parent.id', parent.id, 'addDelegationsAndEncryptionKeys', arguments)\n\n this.throwDetailedExceptionForInvalidParameter('child.id', child.id, 'addDelegationsAndEncryptionKeys', arguments)\n return (\n secretDelegationKey\n ? this.extendedDelegationsAndCryptedForeignKeys(child, parent, ownerId, delegateId, secretDelegationKey)\n : Promise.resolve({ delegations: {}, cryptedForeignKeys: {} })\n )\n .then((extendedChildObjectSPKsAndCFKs) =>\n secretEncryptionKey\n ? this.appendEncryptionKeys(child, ownerId, delegateId, secretEncryptionKey).then(\n //TODO: extendedDelegationsAndCryptedForeignKeys and appendEncryptionKeys can be done in parallel\n (extendedChildObjectEKs) => ({\n extendedSPKsAndCFKs: extendedChildObjectSPKsAndCFKs,\n extendedEKs: extendedChildObjectEKs,\n })\n )\n : Promise.resolve({\n extendedSPKsAndCFKs: extendedChildObjectSPKsAndCFKs,\n extendedEKs: { encryptionKeys: {} },\n })\n )\n .then(({ extendedSPKsAndCFKs: extendedChildObjectSPKsAndCFKs, extendedEKs: extendedChildObjectEKs }) => {\n return _.assign(child, {\n // Conservative version ... We might want to be more aggressive with the deduplication of keys\n // For each delegate, we are going to concatenate to the src (the new delegations), the object in dest (the current delegations)\n // for which we do not find an equivalent delegation (same delegator, same delegate)\n delegations: _.assignWith(child.delegations, extendedChildObjectSPKsAndCFKs.delegations, (dest, src) =>\n (src || []).concat(\n _.filter(dest, (d: Delegation) => !src.some((s: Delegation) => s.owner === d.owner && s.delegatedTo === d.delegatedTo))\n )\n ),\n cryptedForeignKeys: _.assignWith(child.cryptedForeignKeys, extendedChildObjectSPKsAndCFKs.cryptedForeignKeys, (dest, src) =>\n (src || []).concat(\n _.filter(dest, (d: Delegation) => !src.some((s: Delegation) => s.owner === d.owner && s.delegatedTo === d.delegatedTo))\n )\n ),\n encryptionKeys: _.assignWith(child.encryptionKeys, extendedChildObjectEKs.encryptionKeys, (dest, src) =>\n (src || []).concat(\n _.filter(dest, (d: Delegation) => !src.some((s: Delegation) => s.owner === d.owner && s.delegatedTo === d.delegatedTo))\n )\n ),\n })\n })\n }\n\n /**\n * Gets the secret IDs (SFKs) inside decrypted SPKs of the given `document`, decrypted by the HcP with the given `hcpartyId` AND by its HcP parents\n * @param document : the object of which delegations (SPKs) to decrypt\n * @param hcpartyId : the id of the delegate HcP\n * @returns - **extractedKeys** array containing secret IDs (SFKs) from decrypted SPKs, from both given HcP and its parents ; can contain duplicates\n * - **hcpartyId** the given `hcpartyId` OR, if a parent exist, the HcP id of the top parent in the hierarchy (even if that parent has no delegations)\n */\n //TODO: even if there are no delegations for parent HCP (but the parent exists), the returned hcpartyId will be the one of the parent; is this ok?\n extractDelegationsSFKs(\n //TODO: suggested name: getSecretIDsSPKofHcpAndParentsFromDocument\n document: EncryptedEntity | null,\n hcpartyId?: string\n ): Promise<{ extractedKeys: Array<string>; hcpartyId?: string }> {\n if (!document || !hcpartyId) {\n return Promise.resolve({ extractedKeys: [], hcpartyId: hcpartyId }) //TODO: thow exception instead?\n }\n const delegationsForAllDelegates = document.delegations\n if (!delegationsForAllDelegates || !Object.keys(delegationsForAllDelegates).length) {\n console.log(`There is no delegation in document (${document.id})`)\n return Promise.resolve({ extractedKeys: [], hcpartyId: hcpartyId })\n }\n return this.extractKeysFromDelegationsForHcpHierarchy(hcpartyId, document.id!, delegationsForAllDelegates)\n }\n\n /**\n * Gets the secret IDs (SFKs) inside decrypted SPKs of the given `document`, decrypted by the HcP with the given `hcpartyId` AND by its HcP parents\n * @param document : the object of which delegations (SPKs) to decrypt\n * @param hcpartyId : the id of the delegate HcP\n * @returns - **extractedKeys** array containing secret IDs (SFKs) from decrypted SPKs, from both given HcP and its parents ; can contain duplicates\n * - **hcpartyId** the given `hcpartyId` OR, if a parent exist, the HcP id of the top parent in the hierarchy (even if that parent has no delegations)\n */\n extractSFKsHierarchyFromDelegations(\n document: EncryptedEntity | null,\n hcpartyId?: string\n ): Promise<Array<{ hcpartyId: string; extractedKeys: Array<string> }>> {\n if (!document || !hcpartyId) {\n return Promise.resolve([])\n }\n const delegationsForAllDelegates = document.delegations\n if (!delegationsForAllDelegates || !Object.keys(delegationsForAllDelegates).length) {\n console.log(`There is no delegation in document (${document.id})`)\n return Promise.resolve([])\n }\n return this.extractKeysHierarchyFromDelegationLikes(hcpartyId, document.id!, delegationsForAllDelegates)\n }\n\n // noinspection JSUnusedGlobalSymbols\n\n extractCryptedFKs(\n //TODO: suggested name: getSecretIDsCFKofHcpAndParentsFromDocument\n document: EncryptedEntity | null,\n hcpartyId: string\n ): Promise<{ extractedKeys: Array<string>; hcpartyId: string }> {\n if (!document || !document.cryptedForeignKeys) {\n return Promise.resolve({ extractedKeys: [], hcpartyId: hcpartyId })\n }\n const cfksForAllDelegates = document.cryptedForeignKeys\n if (!cfksForAllDelegates || !Object.keys(cfksForAllDelegates).length) {\n console.log(`There is no cryptedForeignKeys in document (${document.id})`)\n return Promise.resolve({ extractedKeys: [], hcpartyId: hcpartyId })\n }\n return this.extractKeysFromDelegationsForHcpHierarchy(hcpartyId, document.id!, cfksForAllDelegates)\n }\n\n extractEncryptionsSKs(\n //TODO: suggested name: getSecretIDsEKofHcpAndParentsFromDocument\n document: EncryptedEntity,\n hcpartyId: string\n ): Promise<{ extractedKeys: Array<string>; hcpartyId: string }> {\n if (!document.encryptionKeys) {\n return Promise.resolve({ extractedKeys: [], hcpartyId: hcpartyId })\n }\n const eckeysForAllDelegates = document.encryptionKeys\n if (!eckeysForAllDelegates || !Object.keys(eckeysForAllDelegates).length) {\n //console.log(`There is no encryption key in document (${document.id})`)\n return Promise.resolve({ extractedKeys: [], hcpartyId: hcpartyId })\n }\n return this.extractKeysFromDelegationsForHcpHierarchy(hcpartyId, document.id!, eckeysForAllDelegates)\n }\n\n extractDelegationsSFKsAndEncryptionSKs(ety: EncryptedEntity, ownerId: string) {\n const delegationsSfksOwnerPromise = this.extractDelegationsSFKs(ety, ownerId).then((xks) => xks.extractedKeys) //Will climb up hierarchy\n const encryptionKeysOwnerPromise = this.extractEncryptionsSKs(ety, ownerId).then((xks) => xks.extractedKeys) //Will climb up hierarchy\n\n return Promise.all([delegationsSfksOwnerPromise, encryptionKeysOwnerPromise])\n }\n\n /**\n * Get decrypted generic secret IDs (secretIdSPKs, parentIds, secretIdEKs) from generic delegations (SPKs, CFKs, EKs)\n * 1. Get HealthCareParty from it's Id.\n * 2. Decrypt the keys of the given HCP.\n * 3. Decrypt the parent's key if it has parent.\n * 4. Return the decrypted key corresponding to the Health Care Party.\n * @param hcpartyId : the id of the delegate HcP (including its parents) for which to decrypt `extractedKeys`\n * @param objectId : the id of the object/document of which delegations to decrypt ; used just to log to console a message (Cryptographic mistake) in case the object id inside SPK, CFK, EK is different from this one\n * @param delegations : generic delegations (can be SPKs, CFKs, EKs) for all delegates from where to extract `extractedKeys`\n * @returns - **extractedKeys** array containing secret IDs from decrypted generic delegations, from both HCP with given `hcpartyId` and its parents; can contain duplicates\n * - **hcpartyId** the given `hcpartyId` OR, if a parent exist, the HCP id of the top parent in the hierarchy (even if that parent has no delegations)\n */\n //TODO: even if there are no delegations for parent HCP (but the parent exists), the returned hcpartyId will be the one of the parent\n async extractKeysHierarchyFromDelegationLikes(\n //TODO suggested name: getSecretIdsOfHcpAndParentsFromGenericDelegations\n hcpartyId: string,\n objectId: string,\n delegations: { [key: string]: Array<Delegation> }\n ): Promise<Array<{ hcpartyId: string; extractedKeys: Array<string> }>> {\n const { dataOwner: hcp } = await this.getDataOwner(hcpartyId)\n const extractedKeys = []\n if (delegations[hcpartyId]?.length) {\n const decryptedAndImportedAesHcPartyKeys = await this.getDecryptedAesExchangeKeysOfDelegateAndParentsFromGenericDelegations(\n hcpartyId,\n delegations,\n false\n )\n const collatedAesKeysFromDelegatorToHcpartyId = decryptedAndImportedAesHcPartyKeys.reduce((map, k) => ({ ...map, [k.delegatorId]: k }), {})\n extractedKeys.push(...(await this.decryptKeyInDelegationLikes(delegations[hcpartyId], collatedAesKeysFromDelegatorToHcpartyId, objectId)))\n }\n\n return (hcp as HealthcareParty).parentId\n ? [\n ...(await this.extractKeysHierarchyFromDelegationLikes((hcp as HealthcareParty).parentId!, objectId, delegations)),\n { extractedKeys: extractedKeys, hcpartyId: hcpartyId },\n ]\n : [{ extractedKeys: extractedKeys, hcpartyId: hcpartyId }]\n }\n\n /**\n * Get decrypted generic secret IDs (secretIdSPKs, parentIds, secretIdEKs) from generic delegations (SPKs, CFKs, EKs)\n * 1. Get Data Owner (HCP, Patient or Device) from it's Id.\n * 2. Decrypt the keys of the given data owner.\n * 3. Decrypt the parent's key if it has parent.\n * 4. Return the decrypted key corresponding to the Health Care Party.\n * @param dataOwnerId : the id of the delegate data owner (including its parents) for which to decrypt `extractedKeys`\n * @param objectId : the id of the object/document of which delegations to decrypt ; used just to log to console a message (Cryptographic mistake) in case the object id inside SPK, CFK, EK is different from this one\n * @param delegations : generic delegations (can be SPKs, CFKs, EKs) for all delegates from where to extract `extractedKeys`\n * @returns - **extractedKeys** array containing secret IDs from decrypted generic delegations, from both data owner with given `dataOwnerId` and its parents; can contain duplicates\n * - **dataOwnerId** the given `dataOwnerId` OR, if a parent exist, the data owner id of the top parent in the hierarchy (even if that parent has no delegations)\n */\n //TODO: even if there are no delegations for parent HCP (but the parent exists), the returned dataOwnerId will be the one of the parent\n extractKeysFromDelegationsForHcpHierarchy(\n //TODO suggested name: getSecretIdsOfHcpAndParentsFromGenericDelegations\n dataOwnerId: string,\n objectId: string,\n delegations: { [key: string]: Array<Delegation> }\n ): Promise<{ extractedKeys: Array<string>; hcpartyId: string }> {\n return this.getDataOwner(dataOwnerId).then(({ dataOwner: hcp }) =>\n (delegations[dataOwnerId] && delegations[dataOwnerId].length\n ? this.getDecryptedAesExchangeKeysOfDelegateAndParentsFromGenericDelegations(dataOwnerId, delegations, false).then(\n (decryptedAndImportedAesHcPartyKeys) => {\n const collatedAesKeysFromDelegatorToHcpartyId: {\n [key: string]: { key: CryptoKey; rawKey: string }[]\n } = {}\n decryptedAndImportedAesHcPartyKeys.forEach((k) => {\n ;(collatedAesKeysFromDelegatorToHcpartyId[k.delegatorId] ?? (collatedAesKeysFromDelegatorToHcpartyId[k.delegatorId] = [])).push(k)\n })\n return this.decryptKeyInDelegationLikes(delegations[dataOwnerId], collatedAesKeysFromDelegatorToHcpartyId, objectId!)\n }\n )\n : Promise.resolve([])\n ).then((extractedKeys) =>\n (hcp as HealthcareParty).parentId\n ? this.extractKeysFromDelegationsForHcpHierarchy((hcp as HealthcareParty).parentId!, objectId, delegations).then((parentResponse) =>\n _.assign(parentResponse, {\n extractedKeys: parentResponse.extractedKeys.concat(extractedKeys),\n })\n )\n : { extractedKeys: extractedKeys, hcpartyId: dataOwnerId }\n )\n )\n }\n\n /**\n * Gets an array of generic secret IDs decrypted from a list of generic delegations (SPKs, CFKs, EKs) `delegationsArray`\n * If a particular generic delegation thows an exception when decrypted, the return value for it's secret ID will be 'false' and a message is logged to console\n * For each one of the delegations in the `delegationsArray`, it tries to decrypt with the decryptedHcPartyKey of the owner of that delegation;\n *\n * @param delegationsArray : generic delegations array\n * @param aesKeys : **key** HcP ids of delegators/owners in the `delegationsArray`, each with its own decryptedHcPartyKey\n * @param masterId : is the object id to which the generic delegation belongs to\n * - used only to check whether the object.id matches the one stored in the decrypted generic delegation item\n * - even if there's no match, the secret ID is kept as a valid result (and a message logged to console)\n * @returns array of generic secret IDs (secretIdSPK, parentId, secretIdEK)\n */\n async decryptKeyInDelegationLikes(\n //TODO: suggested name: getSecretIdsFromGenericDelegations\n delegationsArray: Array<Delegation>,\n aesKeysForDataOwnerId: { [key: string]: { key: CryptoKey; rawKey: string }[] },\n masterId: string\n ): Promise<Array<string>> {\n const decryptPromises: Array<Promise<string | undefined>> = delegationsArray.map(async (genericDelegationItem) => {\n const aesKeys = aesKeysForDataOwnerId[genericDelegationItem.owner!]\n if (aesKeys?.length) {\n return aesKeys.reduce(async (acc, aesKey) => {\n const accValue = await acc\n if (accValue) {\n return accValue\n }\n try {\n const decryptedGenericDelegationKey = await this._AES.decrypt(aesKey.key, hex2ua(genericDelegationItem.key!), aesKey.rawKey)\n const results = ua2string(decryptedGenericDelegationKey).split(':')\n\n const objectId = results[0] //must be the ID of the object, for checksum\n const genericSecretId = results[1]\n\n const details =\n 'object ID: ' + masterId + '; generic delegation from ' + genericDelegationItem.owner + ' to ' + genericDelegationItem.delegatedTo\n\n if (!objectId) console.warn('Object id is empty; ' + details)\n if (!genericSecretId) console.warn('Secret id is empty; ' + details)\n\n if (objectId !== masterId) {\n /*console.log(\n \"Cryptographic mistake: object ID is not equal to the expected concatenated id within decrypted generic delegation. This may happen when patients have been merged; \" +\n details\n )*/\n }\n return genericSecretId\n } catch (err) {\n console.log(\n `Could not decrypt generic delegation in object with ID: ${masterId} from ${genericDelegationItem.owner} to ${genericDelegationItem.delegatedTo}: ${err}`\n )\n console.log(`AES key is: ${aesKey.rawKey}. Encrypted data is ${genericDelegationItem.key}.`)\n\n return undefined\n }\n }, Promise.resolve() as Promise<string | undefined>)\n } else {\n console.log(`Could not find aes key for object with ID: ${masterId}`)\n }\n })\n return Promise.all(decryptPromises).then((genericSecretId) => genericSecretId.filter((id) => !!id) as string[])\n }\n\n getPublicKeyFromPrivateKey(privateKey: JsonWebKey, dataOwner: Patient | Device | HealthcareParty) {\n if (!privateKey.n || !privateKey.e) {\n throw new Error('No public key can be deduced from incomplete private key')\n }\n\n const publicKeyFromPrivateKey = jwk2spki(privateKey)\n const publicKeys = [dataOwner.publicKey].concat(Object.keys(dataOwner.aesExchangeKeys ?? {})).filter((x) => !!x)\n\n if (!publicKeys.length) {\n throw new Error('No public key has been defined for hcp')\n }\n\n const publicKey = publicKeys.find((it) => it === publicKeyFromPrivateKey)\n if (!publicKey) {\n throw new Error('No public key can be found for this private key')\n }\n\n return publicKey\n }\n\n async loadKeyPairsAsTextInBrowserLocalStorage(healthcarePartyId: string, privateKey: Uint8Array) {\n const { dataOwner } = await this.getDataOwner(healthcarePartyId)\n\n const privateKeyInJwk = pkcs8ToJwk(privateKey)\n const publicKey = this.getPublicKeyFromPrivateKey(privateKeyInJwk, dataOwner)\n\n const keyPair: { publicKey: CryptoKey; privateKey: CryptoKey } = await this._RSA.importKeyPair(\n 'jwk',\n privateKeyInJwk,\n 'jwk',\n spkiToJwk(hex2ua(publicKey))\n )\n this.rsaKeyPairs[publicKey.slice(-32)] = keyPair\n const exportedKeyPair = await this._RSA.exportKeys(keyPair, 'jwk', 'jwk')\n\n return this.storeKeyPair(`${healthcarePartyId}.${publicKey.slice(-32)}`, exportedKeyPair)\n }\n\n async loadKeyPairsAsJwkInBrowserLocalStorage(healthcarePartyId: string, privateKey: JsonWebKey) {\n const { dataOwner } = await this.getDataOwner(healthcarePartyId)\n\n if ((!privateKey.n || !privateKey.e) && dataOwner.publicKey) {\n //Fallback on default publicKey\n console.warn('An incomplete key has been completed using the default public key of the data owner')\n const publicKeyInJwk = spkiToJwk(hex2ua(dataOwner.publicKey))\n privateKey.n = publicKeyInJwk.n\n privateKey.e = publicKeyInJwk.e\n }\n\n const publicKey = this.getPublicKeyFromPrivateKey(privateKey, dataOwner)\n\n const keyPair = await this._RSA.importKeyPair('jwk', privateKey, 'jwk', spkiToJwk(hex2ua(publicKey)))\n this.rsaKeyPairs[healthcarePartyId] = keyPair\n const exportedKeyPair = await this._RSA.exportKeys(keyPair, 'jwk', 'jwk')\n\n return this.storeKeyPair(`${healthcarePartyId}.${publicKey.slice(-32)}`, exportedKeyPair)\n }\n\n // noinspection JSUnusedGlobalSymbols\n loadKeyPairsInBrowserLocalStorage(healthcarePartyId: string, file: Blob): Promise<void> {\n const fr = new FileReader()\n return new Promise((resolve, reject) => {\n fr.onerror = reject\n fr.onabort = reject\n fr.onload = (e: any) => {\n //TODO remove any\n const privateKey = e.target.result as string\n this.loadKeyPairsAsTextInBrowserLocalStorage(healthcarePartyId, hex2ua(privateKey))\n .then(() => resolve())\n .catch(reject)\n }\n fr.readAsText(file)\n })\n }\n\n // noinspection JSUnusedGlobalSymbols\n saveKeychainInBrowserLocalStorage(id: string, keychain: number) {\n localStorage.setItem(\n this.keychainLocalStoreIdPrefix + id,\n b2a(new Uint8Array(keychain).reduce((data, byte) => data + String.fromCharCode(byte), ''))\n )\n }\n\n saveKeychainInBrowserLocalStorageAsBase64(id: string, keyChainB64: string) {\n localStorage.setItem(this.keychainLocalStoreIdPrefix + id, keyChainB64)\n }\n\n // noinspection JSUnusedGlobalSymbols\n saveKeychainValidityDateInBrowserLocalStorage(id: string, date: string) {\n if (!id) return\n\n if (!date) {\n localStorage.removeItem(this.keychainValidityDateLocalStoreIdPrefix + id)\n } else {\n localStorage.setItem(this.keychainValidityDateLocalStoreIdPrefix + id, date)\n }\n }\n\n /**\n * Populate the HCP.options dict with an encrypted eHealth certificate and unencryped expiry date.\n * Any potentially unencrypted certificates will be pruned from the HCP.\n * @param hcpId Id of the hcp to modify\n * @returns modified HCP\n */\n async saveKeyChainInHCPFromLocalStorage(hcpId: string): Promise<HealthcareParty> {\n return await this.hcpartyBaseApi.getHealthcareParty(hcpId).then(async (hcp: HealthcareParty) => {\n let aesKey: CryptoKey | null = null\n try {\n aesKey = _.find(\n await this.decryptAndImportAesHcPartyKeysForDelegators([hcp.id!], hcp.id!),\n (delegator: DelegatorAndKeys) => delegator.delegatorId === hcp.id\n )!.key\n } catch (e) {\n console.error('Error while importing the AES key.')\n }\n if (!aesKey) {\n console.error('No encryption key!')\n }\n\n const opts = hcp.options || {}\n\n const crt = this.getKeychainInBrowserLocalStorageAsBase64(hcp.id!!)\n if (!!aesKey && !!crt) {\n let crtEncrypted: ArrayBuffer | null = null\n try {\n crtEncrypted = await this.AES.encrypt(aesKey, new Uint8Array(string2ua(atob(crt))))\n } catch (e) {\n console.error('Error while encrypting the certificate', e)\n }\n\n // add the encrypted certificate to the options\n _.set(opts, this.hcpPreferenceKeyEhealthCert, ua2string(new Uint8Array(crtEncrypted!)))\n }\n\n const crtValidityDate = this.getKeychainValidityDateInBrowserLocalStorage(hcp.id!!)\n if (!!crtValidityDate) {\n _.set(opts, this.hcpPreferenceKeyEhealthCertDate, crtValidityDate)\n }\n\n hcp.options = opts\n return hcp\n })\n }\n\n importKeychainInBrowserFromHCP(hcpId: string): Promise<void> {\n return this.hcpartyBaseApi.getHealthcareParty(hcpId).then(async (hcp: HealthcareParty) => {\n let crtCryp: Uint8Array | null = null\n if (!!hcp.options && !!hcp.options[this.hcpPreferenceKeyEhealthCert]) {\n crtCryp = string2ua(hcp.options[this.hcpPreferenceKeyEhealthCert])\n }\n\n const crtValidityDate = _.get(hcp.options, this.hcpPreferenceKeyEhealthCertDate)\n\n // store the validity date\n if (!!crtValidityDate) {\n this.saveKeychainValidityDateInBrowserLocalStorage(hcp.id!!, crtValidityDate)\n }\n\n let crt: ArrayBuffer | null = null\n let decryptionKey: CryptoKey | null = null\n try {\n decryptionKey = _.find(\n await this.decryptAndImportAesHcPartyKeysForDelegators([hcp.id!], hcp.id!),\n (delegator: DelegatorAndKeys) => delegator.delegatorId === hcp.id\n )!.key\n } catch (e) {\n console.error('Error while importing the AES key.')\n }\n if (!decryptionKey) {\n throw new Error('No encryption key! eHealth certificate cannot be decrypted.')\n }\n\n if (!!crtCryp && decryptionKey) {\n try {\n crt = await this.AES.decrypt(decryptionKey, crtCryp)\n } catch (e) {\n console.error(e)\n }\n }\n\n if (!crt) {\n throw new Error(`Error while saving certificate in browser local storage! Hcp ${hcp.id} has no certificate.`)\n } else {\n this.saveKeychainInBrowserLocalStorageAsBase64(hcp.id!!, btoa(String.fromCharCode.apply(null, Array.from(new Uint8Array(crt)))))\n }\n\n return\n })\n }\n\n /**\n * Synchronizes the eHealth certificate from the database into the LocalStorage, returning information on the presence\n * of certificate data in either place.\n *\n * @param hcpId The healthcare party id\n * @returns A Promise for an object that represents the existence of a certificate in local storage and in the DB,\n * through the two boolean properties \"local\" and \"remote\".\n */\n syncEhealthCertificateFromDatabase(hcpId: string): Promise<{ remote: boolean; local: boolean }> {\n return this.hcpartyBaseApi.getHealthcareParty(hcpId).then((hcp: HealthcareParty) => {\n const remoteCertificate = _.get(hcp.options, this.hcpPreferenceKeyEhealthCert)\n const localCertificate = this.getKeychainInBrowserLocalStorageAsBase64(hcp.id!)\n\n if (remoteCertificate) {\n return this.importKeychainInBrowserFromHCP(hcp.id!)\n .then(() => ({ local: true, remote: true }))\n .catch(() => ({ local: !!localCertificate, remote: true }))\n } else {\n return { local: !!localCertificate, remote: !!remoteCertificate }\n }\n })\n }\n\n getKeychainInBrowserLocalStorageAsBase64(id: string) {\n return localStorage.getItem(this.keychainLocalStoreIdPrefix + id)\n }\n\n getKeychainValidityDateInBrowserLocalStorage(id: string) {\n return localStorage.getItem(this.keychainValidityDateLocalStoreIdPrefix + id)\n }\n\n // noinspection JSUnusedGlobalSymbols\n loadKeychainFromBrowserLocalStorage(id: string) {\n const lsItem = localStorage.getItem('org.taktik.icure.ehealth.keychain.' + id)\n return lsItem !== null ? b64_2uas(lsItem) : null\n }\n\n /**\n *\n * @param id\n * @param keyPair should be JWK\n */\n storeKeyPair(id: string, keyPair: { publicKey: any; privateKey: any }) {\n if (typeof Storage === 'undefined') {\n console.log('Your browser does not support HTML5 Browser Local Storage !')\n throw 'Your browser does not support HTML5 Browser Local Storage !'\n }\n //TODO encryption\n localStorage.setItem(this.rsaLocalStoreIdPrefix + id, JSON.stringify(keyPair))\n }\n\n /**\n * loads the RSA key pair (hcparty) in JWK from local storage, not imported\n *\n * @param id doc id - hcpartyId\n * @param publicKeyFingerPrint the 32 last characters of public key this private key is associated with\n * @returns {Object} it is in JWK - not imported\n */\n loadKeyPairNotImported(id: string, publicKeyFingerPrint?: string): { publicKey: JsonWebKey; privateKey: JsonWebKey } {\n if (typeof Storage === 'undefined') {\n console.log('Your browser does not support HTML5 Browser Local Storage !')\n throw 'Your browser does not support HTML5 Browser Local Storage !'\n }\n //TODO decryption\n const item =\n (publicKeyFingerPrint && localStorage.getItem(this.rsaLocalStoreIdPrefix + id + '.' + publicKeyFingerPrint)) ??\n localStorage.getItem(this.rsaLocalStoreIdPrefix + id)\n if (!item) {\n console.warn(`No key can be found in local storage for id ${id} and publicKeyFingerPrint ${publicKeyFingerPrint}`)\n }\n return JSON.parse(item!)\n }\n\n /**\n * Loads and imports the RSA key pair (hcparty) from local storage\n *\n * @param id doc id - hcPartyId\n * @returns {Promise} -> {CryptoKey} - imported RSA\n */\n loadKeyPairImported(id: string) {\n return new Promise((resolve: (value: { publicKey: CryptoKey; privateKey: CryptoKey }) => any, reject) => {\n try {\n const jwkKey = localStorage.getItem(this.rsaLocalStoreIdPrefix + id) as string\n if (jwkKey) {\n const jwkKeyPair = JSON.parse(jwkKey)\n if (jwkKeyPair.publicKey && jwkKeyPair.privateKey) {\n this._RSA.importKeyPair('jwk', jwkKeyPair.privateKey, 'jwk', jwkKeyPair.publicKey).then(resolve, (err) => {\n console.log('Error in RSA.importKeyPair: ' + err)\n reject(err)\n })\n } else {\n const message = 'Error in RSA.importKeyPair: Invalid key'\n console.log(message)\n reject(Error(message))\n }\n } else {\n const message = 'Error in RSA.importKeyPair: Missing key'\n console.log(message)\n reject(Error(message))\n }\n } catch (err) {\n reject(err)\n }\n })\n }\n\n async addNewKeyPairForOwnerId(\n maintenanceTasksApi: IccMaintenanceTaskXApi,\n user: User,\n ownerId: string,\n generateTransferKey: boolean = true\n ): Promise<{ dataOwner: HealthcareParty | Patient | Device; publicKey: string; privateKey: string }> {\n return this.addNewKeyPairForOwner(maintenanceTasksApi, user, await this.getDataOwner(ownerId), generateTransferKey)\n }\n\n async addNewKeyPairForOwner(\n maintenanceTasksApi: IccMaintenanceTaskXApi,\n user: User,\n cdo: CachedDataOwner,\n generateTransferKey: boolean = true\n ): Promise<{ dataOwner: HealthcareParty | Patient | Device; publicKey: string; privateKey: string }> {\n const { publicKey, privateKey } = await this.RSA.generateKeyPair()\n const publicKeyHex = ua2hex(await this.RSA.exportKey(publicKey!, 'spki'))\n\n const gen = (await this._AES.generateCryptoKey(true)) as string\n\n await this.cacheKeyPair({ publicKey: await this.RSA.exportKey(publicKey!, 'jwk'), privateKey: await this.RSA.exportKey(privateKey!, 'jwk') })\n\n const { type: ownerType, dataOwner: ownerToUpdate } = await this.createOrUpdateAesExchangeKeysFor(cdo, gen, {\n pubKey: publicKey,\n privKey: privateKey,\n }).then((dataOwnerWithUpdatedAesKeys) =>\n generateTransferKey\n ? this.createOrUpdateTransferKeysFor(dataOwnerWithUpdatedAesKeys, gen, { pubKey: publicKey, privKey: privateKey })\n : dataOwnerWithUpdatedAesKeys\n )\n\n const modifiedDataOwnerAndType =\n ownerType === 'hcp'\n ? await (this.dataOwnerCache[ownerToUpdate.id!] = this.hcpartyBaseApi\n .modifyHealthcareParty(ownerToUpdate as HealthcareParty)\n .then((x) => ({ type: 'hcp', dataOwner: x } as CachedDataOwner)))\n : ownerType === 'patient'\n ? await (this.dataOwnerCache[ownerToUpdate.id!] = this.patientBaseApi\n .modifyPatient(ownerToUpdate as Patient)\n .then((x) => ({ type: 'patient', dataOwner: x } as CachedDataOwner)))\n : await (this.dataOwnerCache[ownerToUpdate.id!] = this.deviceBaseApi\n .updateDevice(ownerToUpdate as Device)\n .then((x) => ({ type: 'device', dataOwner: x } as CachedDataOwner)))\n\n const sentMaintenanceTasks = await this.sendMaintenanceTasks(maintenanceTasksApi, user, modifiedDataOwnerAndType.dataOwner, publicKey)\n\n return {\n dataOwner: sentMaintenanceTasks.length\n ? await this.retrieveDataOwnerInfoAfterPotentialUpdate(modifiedDataOwnerAndType.dataOwner)\n : modifiedDataOwnerAndType.dataOwner,\n publicKey: publicKeyHex,\n privateKey: ua2hex((await this.RSA.exportKey(privateKey!, 'pkcs8')) as ArrayBuffer),\n }\n }\n\n private async createOrUpdateAesExchangeKeysFor(\n cdo: CachedDataOwner,\n decryptedAesExchangeKey: string,\n keyToEncrypt: { pubKey: CryptoKey; privKey: CryptoKey }\n ): Promise<CachedDataOwner> {\n const publicKeyHex = ua2hex(await this.RSA.exportKey(keyToEncrypt.pubKey!, 'spki'))\n const existingAesExchangeKeys = cdo.dataOwner.aesExchangeKeys ?? {}\n existingAesExchangeKeys[publicKeyHex] = await this.encryptAesKeyFor(decryptedAesExchangeKey, cdo.dataOwner, keyToEncrypt.pubKey)\n\n return { type: cdo.type, dataOwner: { ...cdo.dataOwner, aesExchangeKeys: existingAesExchangeKeys } } as CachedDataOwner\n }\n\n private async createOrUpdateTransferKeysFor(\n dataOwner: CachedDataOwner,\n decryptedAesExchangeKey: string,\n keyToEncrypt: { pubKey: CryptoKey; privKey: CryptoKey }\n ): Promise<CachedDataOwner> {\n const pubKeyToEncryptHex = ua2hex(await this.RSA.exportKey(keyToEncrypt.pubKey, 'spki'))\n\n const encryptedKey = ua2hex(\n await this._AES.encrypt(\n await this._AES.importKey('raw', hex2ua(decryptedAesExchangeKey)),\n (await this.RSA.exportKey(keyToEncrypt.privKey!, 'pkcs8')) as ArrayBuffer,\n decryptedAesExchangeKey\n )\n )\n\n const dataOwnerExistingPubKeys = Array.from(await this.getDataOwnerHexPublicKeys(dataOwner.dataOwner))\n\n const transferKeys = fold(dataOwnerExistingPubKeys, dataOwner.dataOwner.transferKeys ?? {}, (pubAcc, pubKeyHex) => {\n if (pubKeyHex !== pubKeyToEncryptHex) {\n const existingKeys = pubAcc[pubKeyHex] ?? {}\n existingKeys[pubKeyToEncryptHex] = encryptedKey\n pubAcc[pubKeyHex] = existingKeys\n }\n return pubAcc\n })\n\n return { type: dataOwner.type, dataOwner: { ...dataOwner.dataOwner, transferKeys: transferKeys } } as CachedDataOwner\n }\n\n private async encryptAesKeyFor(\n aesKey: string,\n dataOwner: HealthcareParty | Patient | Device,\n doNewPublicKey: CryptoKey\n ): Promise<{ [delId: string]: { [pk: string]: string } }> {\n const dataOwnerAllPubKeys = [doNewPublicKey].concat(await this.getDataOwnerPublicKeys(dataOwner))\n\n const encrAes: { [pubKeyFingerprint: string]: string } = {}\n for (const pubKey of dataOwnerAllPubKeys) {\n encrAes[ua2hex(await this.RSA.exportKey(pubKey, 'spki')).slice(-32)] = ua2hex(await this._RSA.encrypt(pubKey, hex2ua(aesKey)))\n }\n\n return { [dataOwner.id!]: encrAes }\n }\n\n private retrieveDataOwnerInfoAfterPotentialUpdate(dataOwnerToUpdate: HealthcareParty | Patient | Device): Promise<CachedDataOwner> {\n return this.getDataOwner(dataOwnerToUpdate.id!).then(({ type, dataOwner }) => {\n return {\n type: type,\n dataOwner: {\n ...dataOwner,\n transferKeys: dataOwnerToUpdate.transferKeys,\n hcPartyKeys: fold(Object.entries(dataOwnerToUpdate.hcPartyKeys ?? {}), dataOwner.hcPartyKeys ?? {}, (acc, [delegateId, hcKeys]) => {\n acc[delegateId] = hcKeys\n return acc\n }),\n aesExchangeKeys: fold(\n Object.entries(dataOwnerToUpdate.aesExchangeKeys ?? {}),\n dataOwner.aesExchangeKeys ?? {},\n (pubAcc, [pubKey, newAesExcKeys]) => {\n const existingKeys = pubAcc[pubKey] ?? {}\n pubAcc[pubKey] = fold(Object.entries(newAesExcKeys), existingKeys, (delAcc, [delId, delKeys]) => {\n delAcc[delId] = delKeys\n return delAcc\n })\n return pubAcc\n }\n ),\n },\n } as CachedDataOwner\n })\n }\n\n private async sendMaintenanceTasks(\n maintenanceTaskApi: IccMaintenanceTaskXApi,\n user: User,\n dataOwner: HealthcareParty | Patient | Device,\n newPublicKey: CryptoKey\n ): Promise<MaintenanceTask[]> {\n const hexNewPubKey = ua2hex(await this.RSA.exportKey(newPublicKey, 'spki'))\n const nonAccessiblePubKeys = Array.from(this.getDataOwnerHexPublicKeys(dataOwner).values())\n .filter((existingPubKey) => existingPubKey != hexNewPubKey)\n .filter(\n (existingPubKey) =>\n !Object.values(this.rsaKeyPairs).find(\n async ({ publicKey, privateKey }) => ua2hex(await this.RSA.exportKey(publicKey, 'spki')) == existingPubKey\n )\n )\n\n if (nonAccessiblePubKeys.length) {\n const tasksForDelegates = Object.entries(await this.getEncryptedAesExchangeKeysForDelegate(dataOwner.id!))\n .filter(([delegatorId]) => delegatorId != dataOwner.id)\n .flatMap(([delegatorId, delegatorKeys]) => {\n return Object.entries(delegatorKeys).flatMap(([, aesExchangeKeys]) => {\n return Object.keys(aesExchangeKeys).map((delegatePubKey) => {\n return { delegateId: delegatorId, maintenanceTask: this.createMaintenanceTask(dataOwner, delegatePubKey) }\n })\n })\n })\n\n const tasksForDelegator = Object.entries(await this.getEncryptedAesExchangeKeys(dataOwner, dataOwner.id!)).flatMap(\n ([doPubKey, delegateKeys]) => {\n return Object.keys(delegateKeys)\n .filter((delegateId) => delegateId != dataOwner.id)\n .map((delegateId) => {\n return { delegateId: delegateId, maintenanceTask: this.createMaintenanceTask(dataOwner, doPubKey) }\n })\n }\n )\n\n return Promise.all(\n tasksForDelegates\n .concat(tasksForDelegator)\n .map(async ({ delegateId, maintenanceTask }) => {\n const taskToCreate = await maintenanceTaskApi?.newInstance(user, maintenanceTask, [delegateId])\n return taskToCreate ? maintenanceTaskApi?.createMaintenanceTaskWithUser(user, taskToCreate) : undefined\n })\n .filter((createdTask) => createdTask != undefined)\n )\n } else {\n return []\n }\n }\n\n private createMaintenanceTask(concernedDataOwner: HealthcareParty | Patient | Device, concernedPubKey: string) {\n return new MaintenanceTask({\n id: this.randomUuid(),\n taskType: 'updateAesExchangeKey',\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: concernedDataOwner.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: concernedPubKey,\n }),\n }),\n ],\n })\n }\n\n private getDataOwnerHexPublicKeys(dataOwner: HealthcareParty | Patient | Device): Set<string> {\n return new Set(\n (dataOwner.publicKey ? [dataOwner.publicKey] : [])\n .concat(dataOwner.aesExchangeKeys ? Object.keys(dataOwner.aesExchangeKeys) : [])\n .filter((pubKey) => !!pubKey)\n )\n }\n\n private async getDataOwnerPublicKeys(dataOwner: HealthcareParty | Patient | Device): Promise<CryptoKey[]> {\n return await Promise.all(\n Array.from(this.getDataOwnerHexPublicKeys(dataOwner)).map(\n async (pubKey) => await this._RSA.importKey('jwk', spkiToJwk(hex2ua(pubKey)), ['encrypt'])\n )\n )\n }\n\n generateKeyForDelegate(ownerId: string, delegateId: string): PromiseLike<HealthcareParty | Patient> {\n //Preload hcp and patient because we need them and they are going to be invalidated from the caches\n return notConcurrent(this.generateKeyConcurrencyMap, ownerId, async () => {\n const [{ type: ownerType, dataOwner: owner }, { dataOwner: delegate }] = await Promise.all([\n this.getDataOwner(ownerId),\n this.getDataOwner(delegateId),\n ])\n\n const ownerLegacyPublicKey = owner.publicKey\n\n const availablePublicKeysFingerprints = Object.keys(this.rsaKeyPairs)\n const availableOwnerPublicKeys = [\n ownerLegacyPublicKey,\n ...Object.keys(owner.aesExchangeKeys || {}).filter((x) => x !== ownerLegacyPublicKey),\n ].filter((k) => !!k && availablePublicKeysFingerprints.some((fp) => k.endsWith(fp))) as string[]\n const selectedPublicKey = availableOwnerPublicKeys[0]\n\n if (!selectedPublicKey) {\n throw new Error(`Invalid owner, no public key, keypairs have not be set for ${ownerId}`)\n }\n\n if (\n (owner.hcPartyKeys || {})[delegateId] ||\n Object.values(owner.aesExchangeKeys || {}).some(\n (x) => x[delegateId] && Object.keys(x[delegateId]).some((k) => availablePublicKeysFingerprints.includes(k))\n )\n ) {\n return owner\n }\n\n let ownerCombinedAesExchangeKeys = owner.aesExchangeKeys ?? {}\n\n if (ownerLegacyPublicKey && !(owner.aesExchangeKeys ?? {})[ownerLegacyPublicKey]) {\n //Transfer keys from old structure (hcparty keys) to new one (aesExchangeKeys)\n const unknownDataOwnerCounterPartIds = Object.keys(owner.hcPartyKeys ?? {}).filter((x) => x !== ownerId && x !== delegateId)\n const counterParts = [\n owner,\n delegate,\n ...(await Promise.all(unknownDataOwnerCounterPartIds.map((cpid) => this.getDataOwner(cpid).then((dot) => dot.dataOwner)))),\n ]\n ownerCombinedAesExchangeKeys = {\n [ownerLegacyPublicKey]: Object.entries(owner.hcPartyKeys ?? {}).reduce(\n (map, [hcpId, keys]) => ({\n ...map,\n [hcpId]: { [ownerLegacyPublicKey]: keys[0], [counterParts.find((x) => x.id === hcpId)?.publicKey ?? '']: keys[1] },\n ...{},\n }),\n {}\n ),\n ...ownerCombinedAesExchangeKeys,\n }\n }\n\n const delegatePublicKeys = [delegate.publicKey, ...Object.keys(delegate.aesExchangeKeys ?? {}).filter((x) => x !== delegate.publicKey)].filter(\n (x) => !!x\n ) as string[]\n if (!delegatePublicKeys.length) {\n throw new Error(`Invalid delegate, no public key, keypairs have not be set for ${delegateId}`)\n }\n const genProm = this._AES.generateCryptoKey(true).then(async (AESKey) => {\n const allPubKeys = [...availableOwnerPublicKeys, ...delegatePublicKeys]\n const encryptedAesKeys = await allPubKeys.reduce(\n async (map, pubK) => ({\n ...(await map),\n [pubK.slice(-32)]: ua2hex(\n await this._RSA.encrypt(await this._RSA.importKey('jwk', spkiToJwk(hex2ua(pubK)), ['encrypt']), hex2ua(AESKey as string))\n ),\n }),\n Promise.resolve({} as { [pubKey: string]: string })\n )\n\n if (delegate.publicKey && ownerLegacyPublicKey) {\n owner.hcPartyKeys![delegateId] = [encryptedAesKeys[ownerLegacyPublicKey.slice(-32)], encryptedAesKeys[delegate.publicKey.slice(-32)]]\n }\n owner.aesExchangeKeys = {\n ...(ownerCombinedAesExchangeKeys ?? {}),\n [selectedPublicKey]: { ...(owner.aesExchangeKeys?.[selectedPublicKey] ?? {}), [delegateId]: encryptedAesKeys },\n }\n\n return new Promise<['hcp', HealthcareParty] | ['patient', Patient] | ['device', Device]>((resolve, reject) => {\n ownerType === 'hcp'\n ? (this.dataOwnerCache[owner.id!] = this.hcpartyBaseApi\n .modifyHealthcareParty(owner as HealthcareParty)\n .then((x) => ({ type: 'hcp', dataOwner: x } as CachedDataOwner)))\n .then((x) => resolve(['hcp', x.dataOwner]))\n .catch((e) => reject(e))\n : ownerType === 'patient'\n ? (this.dataOwnerCache[owner.id!] = this.patientBaseApi.modifyPatient(owner as Patient).then((x) => ({ type: 'patient', dataOwner: x })))\n .then((x) => resolve(['patient', x.dataOwner]))\n .catch((e) => reject(e))\n : (this.dataOwnerCache[owner.id!] = this.deviceBaseApi.updateDevice(owner as Device).then((x) => ({ type: 'device', dataOwner: x })))\n .then((x) => resolve(['device', x.dataOwner]))\n .catch((e) => reject(e))\n })\n })\n\n this.hcPartyKeysRequestsCache[delegateId] = genProm.then(() => {\n return this.forceGetEncryptedAesExchangeKeysForDelegate(delegateId)\n })\n return genProm.then((res) => {\n return res[1]\n })\n })\n }\n\n getDataOwner(ownerId: string) {\n return (\n this.dataOwnerCache[ownerId] ??\n (this.dataOwnerCache[ownerId] = this.patientBaseApi\n .getPatient(ownerId)\n .then((x) => ({ type: 'patient', dataOwner: x } as CachedDataOwner))\n .catch(() => this.deviceBaseApi.getDevice(ownerId).then((x) => ({ type: 'device', dataOwner: x } as CachedDataOwner)))\n .catch(() => this.hcpartyBaseApi.getHealthcareParty(ownerId).then((x) => ({ type: 'hcp', dataOwner: x } as CachedDataOwner)))\n .catch((e) => {\n delete this.dataOwnerCache[ownerId]\n throw e\n }))\n )\n }\n\n // noinspection JSUnusedGlobalSymbols\n async checkPrivateKeyValidity(dataOwner: HealthcareParty | Patient | Device): Promise<boolean> {\n const publicKeys = Array.from(new Set([dataOwner.publicKey].concat(Object.keys(dataOwner.aesExchangeKeys ?? {})).filter((x) => !!x))) as string[]\n\n return await publicKeys.reduce(async (pres, publicKey) => {\n const res = await pres\n if (res) {\n return true\n }\n try {\n const k = await this._RSA.importKey('jwk', spkiToJwk(hex2ua(publicKey)), ['encrypt'])\n const cipher = await this._RSA.encrypt(k, utf8_2ua('shibboleth'))\n const kp = this.loadKeyPairNotImported(dataOwner.id!, publicKey.slice(-32))\n const plainText = await this._RSA\n .importKeyPair('jwk', kp.privateKey, 'jwk', kp.publicKey)\n .then((ikp) => this._RSA.decrypt(ikp.privateKey, new Uint8Array(cipher)))\n .then((x) => ua2utf8(x))\n return plainText === 'shibboleth'\n } catch (e) {\n return false\n }\n }, Promise.resolve(false))\n }\n\n private throwDetailedExceptionForInvalidParameter(argName: string, argValue: any, methodName: string, methodArgs: any) {\n if (argValue) return\n\n let details = '\\nMethod name: icc-crypto-x-api.' + methodName + '()\\nArguments:'\n\n if (methodArgs) {\n try {\n const argsArray = [...methodArgs]\n _.each(argsArray, (arg, index) => (details += '\\n[' + index + ']: ' + JSON.stringify(arg)))\n } catch (ex) {\n details += '; a problem occured while logging arguments details: ' + ex\n }\n }\n\n throw '### THIS SHOULD NOT HAPPEN: ' + argName + ' has an invalid value: ' + argValue + details\n }\n\n async getEncryptionDecryptionKeys(dataOwnerId: string, document: EncryptedEntity): Promise<Array<string> | undefined> {\n try {\n return !document.id\n ? undefined\n : _.uniq(\n (\n await this.extractKeysFromDelegationsForHcpHierarchy(\n dataOwnerId,\n document.id,\n (document.encryptionKeys && Object.keys(document.encryptionKeys).length && document.encryptionKeys) || document.delegations!\n )\n ).extractedKeys\n )\n } catch (e) {\n return undefined\n }\n }\n\n async encryptDecrypt(\n method: 'encrypt' | 'decrypt',\n content: Uint8Array | ArrayBuffer,\n edKey?: string,\n user?: User,\n documentObject?: Document\n ): Promise<Uint8Array | Array<any> | any> {\n if (!content || !(edKey || (user?.healthcarePartyId && documentObject))) return content\n\n if (edKey) {\n const importedEdKey = await this._AES.importKey('raw', hex2ua(edKey.replace(/-/g, '')))\n try {\n return await this._AES[method](importedEdKey, content)\n } catch (e) {\n return content\n }\n }\n\n const sfks = await this.extractKeysFromDelegationsForHcpHierarchy(user?.healthcarePartyId!, documentObject?.id!, documentObject?.encryptionKeys!)\n const importedEdKey = await this._AES.importKey('raw', hex2ua(sfks.extractedKeys[0].replace(/-/g, '')))\n try {\n return await this._AES[method](importedEdKey, content)\n } catch (e) {\n return content\n }\n }\n}\n"]}
1
+ {"version":3,"file":"icc-crypto-x-api.js","sourceRoot":"","sources":["../../icc-x-api/icc-crypto-x-api.ts"],"names":[],"mappings":"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","sourcesContent":["import { IccDeviceApi, IccHcpartyApi, IccPatientApi } from '../icc-api'\nimport { AESUtils } from './crypto/AES'\nimport { RSAUtils } from './crypto/RSA'\nimport { ShamirClass } from './crypto/shamir'\n\nimport * as _ from 'lodash'\nimport {\n Delegation,\n Device,\n Document,\n EncryptedEntity,\n EncryptedParentEntity,\n HealthcareParty,\n MaintenanceTask,\n Patient,\n PropertyStub,\n PropertyTypeStub,\n TypedValueObject,\n User,\n} from '../icc-api/model/models'\nimport { b2a, b64_2uas, hex2ua, string2ua, ua2hex, ua2string, ua2utf8, utf8_2ua } from './utils/binary-utils'\nimport { fold, jwk2spki, notConcurrent, pkcs8ToJwk, spkiToJwk } from './utils'\nimport { IccMaintenanceTaskXApi } from './icc-maintenance-task-x-api'\n\ninterface DelegatorAndKeys {\n delegatorId: string\n key: CryptoKey\n rawKey: string\n}\n\ntype CachedDataOwner =\n | {\n type: 'patient'\n dataOwner: Patient\n }\n | {\n type: 'device'\n dataOwner: Device\n }\n | {\n type: 'hcp'\n dataOwner: HealthcareParty\n }\n\nexport class IccCryptoXApi {\n get crypto(): Crypto {\n return this._crypto\n }\n\n get shamir(): ShamirClass {\n return this._shamir\n }\n\n get RSA(): RSAUtils {\n return this._RSA\n }\n\n get AES(): AESUtils {\n return this._AES\n }\n\n hcPartyKeysCache: {\n [key: string]: DelegatorAndKeys\n } = {}\n\n //[delegateId][delegatorId] = delegateEncryptedHcPartyKey\n //for each delegate, it stores the list of delegators and the corresponding delegateEncryptedHcPartyKey (shared HcPartyKey, from delegator to delegate, encrypted with the RSA key of the delegate)\n hcPartyKeysRequestsCache: {\n [delegateId: string]: Promise<{ [key: string]: { [key: string]: { [key: string]: string } } }>\n } = {}\n\n cacheLastDeletionTimestamp: number | undefined = undefined\n\n dataOwnerCache: { [key: string]: Promise<CachedDataOwner> } = {}\n\n emptyHcpCache(hcpartyId: string) {\n delete this.hcPartyKeysRequestsCache[hcpartyId]\n delete this.dataOwnerCache[hcpartyId]\n delete this.dataOwnerCache[hcpartyId]\n }\n\n /**\n * Gets all delegate encrypted HcParty keys of the delegate with the given `delegateHcPartyId`, and for each key the delegator id\n * If the keys are not cached, they are retrieved from the backend.\n *\n * @param delegateHcPartyId The Health Care Party id\n * @returns \\{delegatorId: delegateEncryptedHcPartyKey\\}\n */\n private getEncryptedAesExchangeKeysForDelegate(\n delegateHcPartyId: string\n ): Promise<{ [key: string]: { [key: string]: { [key: string]: string } } }> {\n return (\n this.hcPartyKeysRequestsCache[delegateHcPartyId] ||\n (this.hcPartyKeysRequestsCache[delegateHcPartyId] = this.forceGetEncryptedAesExchangeKeysForDelegate(delegateHcPartyId))\n )\n }\n\n private forceGetEncryptedAesExchangeKeysForDelegate(\n delegateHcPartyId: string\n ): Promise<{ [key: string]: { [key: string]: { [key: string]: string } } }> {\n return Promise.all([\n this.patientBaseApi.getPatientAesExchangeKeysForDelegate(delegateHcPartyId).catch(() => {}),\n this.hcpartyBaseApi.getAesExchangeKeysForDelegate(delegateHcPartyId).catch(() => {}),\n this.deviceBaseApi.getDeviceAesExchangeKeysForDelegate(delegateHcPartyId).catch(() => {}),\n ]).then(([a, b, c]) => ({ ...a, ...b, ...c }))\n }\n\n keychainLocalStoreIdPrefix = 'org.taktik.icure.ehealth.keychain.'\n keychainValidityDateLocalStoreIdPrefix = 'org.taktik.icure.ehealth.keychain-date.'\n hcpPreferenceKeyEhealthCert = 'eHealthCRTCrypt'\n hcpPreferenceKeyEhealthCertDate = 'eHealthCRTDate'\n rsaLocalStoreIdPrefix = 'org.taktik.icure.rsa.'\n\n private hcpartyBaseApi: IccHcpartyApi\n private patientBaseApi: IccPatientApi\n private deviceBaseApi: IccDeviceApi\n private readonly _crypto: Crypto\n\n private generateKeyConcurrencyMap: { [key: string]: PromiseLike<HealthcareParty | Patient> }\n private rsaKeyPairs: { [pubKeyFingerprint: string]: { publicKey: CryptoKey; privateKey: CryptoKey } } = {}\n\n private readonly _AES: AESUtils\n private readonly _RSA: RSAUtils\n private readonly _shamir: ShamirClass\n\n constructor(\n host: string,\n headers: { [key: string]: string },\n hcpartyBaseApi: IccHcpartyApi, //Init with a hcparty x api for better performances\n patientBaseApi: IccPatientApi,\n deviceBaseApi: IccDeviceApi,\n crypto: Crypto = typeof window !== 'undefined' ? window.crypto : typeof self !== 'undefined' ? self.crypto : ({} as Crypto)\n ) {\n this.hcpartyBaseApi = hcpartyBaseApi\n this.patientBaseApi = patientBaseApi\n this.deviceBaseApi = deviceBaseApi\n this._crypto = crypto\n this.generateKeyConcurrencyMap = {}\n\n this._AES = new AESUtils(crypto)\n this._RSA = new RSAUtils(crypto)\n this._shamir = new ShamirClass(crypto)\n }\n\n randomUuid() {\n return ((1e7).toString() + -1e3 + -4e3 + -8e3 + -1e11).replace(\n /[018]/g,\n (c) => (Number(c) ^ ((this._crypto.getRandomValues(new Uint8Array(1))! as Uint8Array)[0] & (15 >> (Number(c) / 4)))).toString(16) //Keep that inlined or you will loose the random\n )\n }\n\n sha256(data: ArrayBuffer | Uint8Array) {\n return this._crypto.subtle.digest('SHA-256', data)\n }\n\n private async getPublicKeys() {\n return await Object.values(this.rsaKeyPairs).reduce(async (p, rsa) => {\n return (await p).concat([jwk2spki(await this.RSA.exportKey(rsa.publicKey, 'jwk'))])\n }, Promise.resolve([] as string[]))\n }\n\n encryptShamirRSAKey(hcp: HealthcareParty, notaries: Array<HealthcareParty>, threshold?: number): Promise<HealthcareParty> {\n return this.loadKeyPairImported(hcp.id!).then((keyPair) =>\n this._RSA.exportKey(keyPair.privateKey, 'pkcs8').then(async (exportedKey) => {\n const privateKey = exportedKey as ArrayBuffer\n const nLen = notaries.length\n const shares = nLen == 1 ? [privateKey] : this._shamir.share(ua2hex(privateKey), nLen, threshold || nLen).map((share) => hex2ua(share))\n const publicKeys = await this.getPublicKeys()\n\n return _.reduce(\n notaries,\n (queue, notary, idx) => {\n return queue.then(async (hcp) => {\n const { owner: hcParty, aesExchangeKeys } = await this.getOrCreateHcPartyKeys(hcp, notary.id!)\n const [publicKeyIdentifier, hcPartyKeys] = Object.entries(aesExchangeKeys)[0]\n\n try {\n const importedAESHcPartyKey = await this.decryptHcPartyKey(\n notary.id!,\n hcParty.id!,\n notary.id!,\n publicKeyIdentifier,\n hcPartyKeys,\n publicKeys\n )\n const encryptedShamirPartition = await this.AES.encrypt(importedAESHcPartyKey.key, shares[idx])\n\n hcParty.privateKeyShamirPartitions = hcParty.privateKeyShamirPartitions || {}\n hcParty.privateKeyShamirPartitions[notary.id!] = ua2hex(encryptedShamirPartition)\n } catch (e) {\n console.log('Error during encryptedShamirRSAKey', notary.id, e)\n }\n return hcParty\n })\n },\n Promise.resolve(hcp)\n )\n })\n )\n }\n\n /* Reconstructs the hcp's private key from the notaries' shamir shares and stores it in localstorage.\n The retrieval procedure of the shares is not designed or implemented yet. Therefore, it currently only\n works if the private key of the notaries are stored in local storage (e.g. notaries = [hcp parent]).\n * @param hcp : the hcp whose key we want to reconstruct\n * @param notaries : holders of the shamir shares\n **/\n async decryptShamirRSAKey(hcp: HealthcareParty, notaries: Array<HealthcareParty>): Promise<void> {\n try {\n const publicKeys = await this.getPublicKeys()\n const nLen = notaries.length\n let decryptedPrivatedKey\n if (nLen == 1) {\n const notaryHcPartyId = notaries[0].id!\n const encryptedAesKeyMap = await this.getEncryptedAesExchangeKeys(hcp, notaryHcPartyId)\n const importedAESHcPartyKey = await Promise.all(\n Object.entries(encryptedAesKeyMap).map(\n async ([idPubKey, keysMap]) => await this.decryptHcPartyKey(notaryHcPartyId, hcp.id!, notaryHcPartyId, idPubKey, keysMap, publicKeys)\n )\n )\n const cryptedPrivatedKey = hcp.privateKeyShamirPartitions![notaryHcPartyId]\n decryptedPrivatedKey = ua2hex(\n await this.AES.decryptSome(\n importedAESHcPartyKey.map((k) => k.key),\n hex2ua(cryptedPrivatedKey)\n )\n )\n } else {\n const decryptedShares: string[] = await _.reduce(\n notaries,\n (queue, notary) => {\n return queue.then(async (shares: string[]) => {\n try {\n // TODO: now, we get the encrypted shares in db and decrypt them. This assumes that the\n // the notaries' private keys are in localstorage. We should implement a way for the notaries to\n // give hcp the decrypted shares without having to also share their private keys.\n const encryptedAesKeyMap = await this.getEncryptedAesExchangeKeys(hcp, notary.id!)\n const importedAESHcPartyKey = await Promise.all(\n Object.entries(encryptedAesKeyMap).map(\n async ([idPubKey, keysMap]) => await this.decryptHcPartyKey(notary.id!, hcp.id!, notary.id!, idPubKey, keysMap, publicKeys)\n )\n )\n const encryptedShare = hcp.privateKeyShamirPartitions![notary.id!]\n const decryptedShamirPartition = ua2hex(\n await this.AES.decryptSome(\n importedAESHcPartyKey.map((k) => k.key),\n hex2ua(encryptedShare)\n )\n )\n shares.push(decryptedShamirPartition)\n } catch (e) {\n console.log('Error during encryptedShamirRSAKey', notary.id, e)\n }\n return shares\n })\n },\n Promise.resolve([] as string[])\n )\n\n decryptedPrivatedKey = this._shamir.combine(decryptedShares)\n }\n\n const importedPrivateKey = await this._RSA.importKey('pkcs8', hex2ua(decryptedPrivatedKey), ['decrypt'])\n const importedPublicKey = await this._RSA.importKey('spki', hex2ua(hcp.publicKey!), ['encrypt'])\n\n const exportedKeyPair = await this._RSA.exportKeys({ publicKey: importedPublicKey, privateKey: importedPrivateKey }, 'jwk', 'jwk')\n this.storeKeyPair(hcp.id!, exportedKeyPair)\n } catch (e) {\n console.log('Cannot decrypt shamir RSA key')\n }\n }\n\n /**\n * Gets the decryptedHcPartyKey for the given `encryptedHcPartyKey`\n *\n * If the decrypted key exists in the cache, retrieves it from there.\n * Otherwise, decrypts it using the RSA key of the delegator or delegate (depending on the value of `encryptedForDelegator`)\n *\n * @param loggedHcPartyId The logged DataOwner id or the id of his parent\n * @param delegatorId The id of Delegator eg, the DataOwner where this AES exchange key is stored\n * @param delegateHcPartyId The id of the delegate : the data owner for whom this aes exchange key has been created\n * @param publicKey The public key of the delegator : A unique aes exchange key is created for each public key of the delegator. This is the public key corresponding to the encryptedHcPartyKeys\n * @param encryptedHcPartyKeys The encryptedHcPartyKeys to be decrypted\n * @param publicKeys The public keys for which we might have a private key\n *\n * @returns - **delegatorId** the input param `delegatorId`\n * - **key** the decrypted `encryptedHcPartyKey`\n */\n\n async decryptHcPartyKey(\n loggedHcPartyId: string,\n delegatorId: string,\n delegateHcPartyId: string,\n publicKey: string,\n encryptedHcPartyKeys: { [key: string]: string },\n publicKeys: string[]\n ): Promise<DelegatorAndKeys> {\n if (!publicKeys.length) {\n const reason = `Cannot decrypt RSA encrypted AES HcPartyKey from ${delegatorId} to ${delegateHcPartyId}: no public key`\n console.warn(reason)\n throw new Error(reason)\n }\n\n const cacheKey = `${delegateHcPartyId}|${publicKey.slice(-32)}|${delegatorId}`\n const res = this.hcPartyKeysCache[cacheKey]\n\n if (res) {\n return res\n }\n\n const result = await publicKeys.reduce(async (res, pk) => {\n const delegatorAndKeys = await res\n if (delegatorAndKeys) {\n return delegatorAndKeys\n }\n\n const fingerprint = pk.slice(-32)\n const keyPair = this.rsaKeyPairs[fingerprint] ?? (await this.cacheKeyPair(this.loadKeyPairNotImported(loggedHcPartyId, fingerprint)))\n if (!keyPair) {\n return\n }\n\n const encryptedHcPartyKey = encryptedHcPartyKeys[fingerprint]\n if (!encryptedHcPartyKey) {\n return\n }\n\n try {\n const decryptedAesExchangeKey = await this._RSA.decrypt(keyPair.privateKey, hex2ua(encryptedHcPartyKey))\n const importedAesExchangeKey = await this._AES.importKey('raw', decryptedAesExchangeKey)\n return (this.hcPartyKeysCache[cacheKey] = {\n delegatorId: delegatorId,\n key: importedAesExchangeKey,\n rawKey: ua2hex(new Uint8Array(decryptedAesExchangeKey)),\n })\n } catch (e) {\n const reason = `Cannot decrypt RSA encrypted AES HcPartyKey from ${delegatorId} to ${delegateHcPartyId} for pubKey ${fingerprint}: impossible to decrypt`\n console.log(reason)\n }\n }, Promise.resolve() as Promise<DelegatorAndKeys | void>)\n\n const availablePublicKeys = publicKeys.filter((pk) => this.rsaKeyPairs[pk.slice(-32)])\n\n if (!result) {\n //Try to find another key from the transfer keys\n const hcp = (await this.getDataOwner(loggedHcPartyId))!\n const candidates = Object.entries(hcp.dataOwner.transferKeys ?? {})\n .filter(([fp, _]) => availablePublicKeys.some((pk) => pk.slice(-32) === fp.slice(-32))) // only keep keys that we will be able to decrypt\n .flatMap(([pk, keys]) => Object.entries(keys).map(([k, v]) => [pk, k, v]))\n .filter(([_, k]) => !publicKeys.some((apk) => apk.slice(-32) === k.slice(-32)))\n if (candidates.length) {\n const newPublicKeys = await candidates.reduce(async (p, [decryptionKeyFingerprint, privateKeyFingerprint, encryptedPrivateKey]) => {\n const newKeys = await p\n const aesExchangeKeys = Object.entries(hcp.dataOwner.aesExchangeKeys!).find(\n ([fp, _]) => fp.slice(-32) === privateKeyFingerprint.slice(-32)\n )?.[1][loggedHcPartyId]\n if (aesExchangeKeys) {\n const encryptedAesExchangeKey = Object.entries(aesExchangeKeys).find(\n ([fp, _]) => fp.slice(-32) === decryptionKeyFingerprint.slice(-32)\n )?.[1]\n if (encryptedAesExchangeKey) {\n const keyPair = this.rsaKeyPairs[decryptionKeyFingerprint.slice(-32)]\n if (!keyPair) {\n return newKeys\n }\n const decryptedAesExchangeKey = await this._RSA.decrypt(keyPair.privateKey, hex2ua(encryptedAesExchangeKey))\n const importedAesExchangeKey = await this._AES.importKey('raw', decryptedAesExchangeKey)\n\n const decryptedPrivateKey = await this._AES.decrypt(importedAesExchangeKey, hex2ua(encryptedPrivateKey))\n\n const newPublicKey = Object.keys(hcp.dataOwner.aesExchangeKeys!).find((fp) => fp.slice(-32) === privateKeyFingerprint.slice(-32))!\n await this.cacheKeyPair({\n publicKey: spkiToJwk(hex2ua(newPublicKey)),\n privateKey: pkcs8ToJwk(decryptedPrivateKey),\n })\n\n return newKeys.concat([newPublicKey])\n }\n }\n return newKeys\n }, Promise.resolve([]) as Promise<string[]>)\n\n if (newPublicKeys.length) {\n return await this.decryptHcPartyKey(loggedHcPartyId, delegatorId, delegateHcPartyId, publicKey, encryptedHcPartyKeys, newPublicKeys)\n }\n }\n\n const reason = `Cannot decrypt RSA encrypted AES HcPartyKey from ${delegatorId} to ${delegateHcPartyId}: impossible to decrypt. No private key was found or could be used to decrypt the aes exchange keys`\n console.log(reason)\n throw new Error(reason)\n }\n\n return result\n }\n\n /**\n * Cache the RSA private/public key pair for the HcP with the given id `hcPartyKeyOwner`\n */\n cacheKeyPair(keyPairInJwk: { publicKey: JsonWebKey; privateKey: JsonWebKey }) {\n return this._RSA.importKeyPair('jwk', keyPairInJwk.privateKey, 'jwk', keyPairInJwk.publicKey).then((importedKeyPair) => {\n const pk = jwk2spki(keyPairInJwk.publicKey)\n return (this.rsaKeyPairs[pk.slice(-32)] = importedKeyPair)\n })\n }\n\n /**\n * Gets the secret ID (SFKs) that should be used in the prescribed context (confidential or not) from decrypted SPKs of the given `parent`, decrypted by the HcP with the given `hcpartyId` AND by its HcP parents\n * @param parent :the object of which delegations (SPKs) to decrypt\n * @param hcpartyId :the id of the delegate HcP\n * @param confidential :weather the key is going to be used for a confidential piece or data or not\n * @returns - **extractedKeys** array containing secret IDs (SFKs) from decrypted SPKs, from both given HcP and its parents ; can contain duplicates\n * - **hcpartyId** the given `hcpartyId` OR, if a parent exist, the HcP id of the top parent in the hierarchy (even if that parent has no delegations)\n */\n async extractPreferredSfk(parent: EncryptedParentEntity, hcpartyId: string, confidential: boolean) {\n const secretForeignKeys = await this.extractSFKsHierarchyFromDelegations(parent, hcpartyId)\n const keys = secretForeignKeys\n .filter(({ extractedKeys }) => extractedKeys.length > 0)\n .filter((x, idx) => (confidential ? x.hcpartyId === hcpartyId : idx === 0))[0]\n\n return (\n (keys &&\n (confidential\n ? keys.extractedKeys.find(\n (k) => !secretForeignKeys.some(({ extractedKeys, hcpartyId: parentHcpId }) => hcpartyId !== parentHcpId && extractedKeys.includes(k))\n )\n : keys.extractedKeys[0])) ||\n undefined\n )\n }\n\n /**\n * Gets an array of decrypted HcPartyKeys, shared between the delegate with ID `delegateHcPartyId` and the delegators in `delegatorsHcPartyIdsSet`\n *\n * 1. Get the keys for the delegateHealthCareParty (cache/backend).\n * 2. For each key in the delegators, decrypt it with the delegate's private key\n * 3. Filter out undefined keys and return them\n *\n * @param delegatorsHcPartyIdsSet array of delegator HcP IDs that could have delegated something to the HcP with ID `delegateHcPartyId`\n * @param delegateHcPartyId the HcP for which the HcPs with IDs in `delegatorsHcPartyIdsSet` could have delegated something\n * @param minCacheDurationInSeconds The minimum cache duration\n * @returns - **delegatorId** : the id of the delegator HcP that shares the **key** with the `delegateHcPartyId`\n * - **key** the decrypted HcPartyKey, shared between **delegatorId** and `delegateHcPartyId`\n */\n async decryptAndImportAesHcPartyKeysForDelegators(\n delegatorsHcPartyIdsSet: Array<string>,\n delegateHcPartyId: string,\n minCacheDurationInSeconds: number = 60\n ): Promise<Array<DelegatorAndKeys>> {\n const aesExchangeKeys = await (\n this.hcPartyKeysRequestsCache[delegateHcPartyId] ||\n (this.hcPartyKeysRequestsCache[delegateHcPartyId] = this.getEncryptedAesExchangeKeysForDelegate(delegateHcPartyId))\n ).then(async (delegatorIdsWithDelegateEncryptedHcPartyKeys: { [key: string]: { [key: string]: { [key: string]: string } } }) => {\n // [key: delegatorId] = delegateEncryptedHcPartyKey\n // For each delegatorId, obtain the AES key (decrypted HcParty Key) shared with the delegate, decrypted by the delegate\n return (\n await Promise.all(\n delegatorsHcPartyIdsSet.map(async (delegatorId: string) => {\n const encryptedHcPartyKeysForPubKeyFingerprint = delegatorIdsWithDelegateEncryptedHcPartyKeys[delegatorId]\n if (!encryptedHcPartyKeysForPubKeyFingerprint) {\n return [] as DelegatorAndKeys[]\n }\n const decryptedKeys = await Promise.all(\n Object.entries(encryptedHcPartyKeysForPubKeyFingerprint).map(async ([delegatorPubKeyFinerprint, encryptedAesExchangeKeys]) => {\n try {\n return await this.decryptHcPartyKey(\n delegateHcPartyId,\n delegatorId,\n delegateHcPartyId,\n delegatorPubKeyFinerprint,\n encryptedAesExchangeKeys,\n Object.keys(this.rsaKeyPairs)\n )\n } catch (e) {\n console.log(`failed to decrypt hcPartyKey from ${delegatorId} to ${delegateHcPartyId}`)\n return\n }\n })\n )\n return decryptedKeys.filter((x) => !!x) as DelegatorAndKeys[]\n })\n )\n ).reduce((acc, x) => [...acc, ...x], [])\n })\n\n if (aesExchangeKeys.length > 0) {\n return aesExchangeKeys\n }\n\n const nowTimestamp = +new Date()\n if (!this.cacheLastDeletionTimestamp || (nowTimestamp - this.cacheLastDeletionTimestamp) / 1000 >= minCacheDurationInSeconds) {\n delete this.hcPartyKeysRequestsCache[delegateHcPartyId]\n this.cacheLastDeletionTimestamp = nowTimestamp\n return this.decryptAndImportAesHcPartyKeysForDelegators(delegatorsHcPartyIdsSet, delegateHcPartyId, minCacheDurationInSeconds)\n }\n\n return []\n }\n\n /**\n * Gets an array of decrypted HcPartyKeys from the given `delegations`, that are shared with / can be decrypted by the HcP with the given `healthcarePartyId` (or by its parents when `fallbackOnParent` is true)\n *\n * 1. Checks whether the delegations' object has a delegation for the\n * given healthCarePartyId.\n * 2. Enumerates all the delegators (delegation.owner) present in\n * the delegations.\n * 3. Decrypt's delegators' keys and returns them.\n *\n * @param dataOwnerId : the id of the delegate HCP\n * @param delegations : delegations (can be SPKs, CFKs, EKs) for all delegates\n * @param fallbackOnParent default true; use parent's healthCarePartyId in case there's no delegation for the `healthcarePartyId`\n * @returns - **delegatorId** : the id of the delegator HcP that shares the **key** with the `healthcarePartyId`\n * - **key** the decrypted HcPartyKey, shared between **delegatorId** and `healthcarePartyId`\n */\n async getDecryptedAesExchangeKeysOfDelegateAndParentsFromGenericDelegations(\n dataOwnerId: string,\n delegations: { [key: string]: Array<Delegation> },\n fallbackOnParent = true\n ): Promise<Array<DelegatorAndKeys>> {\n const delegationsArray = delegations[dataOwnerId] ?? []\n\n if (!delegationsArray.length && fallbackOnParent) {\n const { dataOwner: hcp } = await this.getDataOwner(dataOwnerId)\n return (hcp as any).parentId\n ? await this.getDecryptedAesExchangeKeysOfDelegateAndParentsFromGenericDelegations((hcp as any).parentId, delegations)\n : []\n } else {\n const delegatorIds = new Set<string>()\n delegationsArray.forEach((del) => delegatorIds.add(del.owner!))\n return this.decryptAndImportAesHcPartyKeysForDelegators(Array.from(delegatorIds), dataOwnerId)\n }\n }\n\n /**\n * Retrieve the owner HealthCareParty key and use it to encrypt\n * both the delegations (createdObject.id) and the cryptedForeignKeys\n * (parentObject.id), and returns them in an object.\n */\n async initObjectDelegations(\n createdObject: any,\n parentObject: any,\n ownerId: string,\n secretForeignKeyOfParent: string | null\n ): Promise<{\n owner: HealthcareParty | Device | Patient\n delegations: any\n cryptedForeignKeys: any\n secretForeignKeys: any[]\n secretId: string\n }> {\n const publicKeys = await this.getPublicKeys()\n\n this.throwDetailedExceptionForInvalidParameter('createdObject.id', createdObject.id, 'initObjectDelegations', arguments)\n\n if (parentObject) this.throwDetailedExceptionForInvalidParameter('parentObject.id', parentObject.id, 'initObjectDelegations', arguments)\n\n const secretId = this.randomUuid()\n return this.getDataOwner(ownerId).then(async ({ dataOwner: owner }) => {\n const { owner: modifiedOwner, aesExchangeKeys } = await this.getOrCreateHcPartyKeys(owner, ownerId)\n const importedAESHcPartyKey = await this.decryptAnyAesExchangeKeyForOwner(aesExchangeKeys, ownerId, ownerId, ownerId, publicKeys)\n\n const encryptedDelegation = await this._AES.encrypt(\n importedAESHcPartyKey.key,\n string2ua(createdObject.id + ':' + secretId).buffer as ArrayBuffer,\n importedAESHcPartyKey.rawKey\n )\n const encryptedSecretForeignKey =\n parentObject &&\n this._AES.encrypt(\n importedAESHcPartyKey.key,\n string2ua(createdObject.id + ':' + parentObject.id).buffer as ArrayBuffer,\n importedAESHcPartyKey.rawKey\n )\n\n return {\n owner: modifiedOwner,\n delegations: _.fromPairs([\n [\n ownerId,\n [\n {\n owner: ownerId,\n delegatedTo: ownerId,\n key: ua2hex(encryptedDelegation!),\n },\n ],\n ],\n ]),\n cryptedForeignKeys:\n (encryptedSecretForeignKey &&\n _.fromPairs([\n [\n ownerId,\n [\n {\n owner: ownerId,\n delegatedTo: ownerId,\n key: ua2hex(encryptedSecretForeignKey!),\n },\n ],\n ],\n ])) ||\n {},\n secretForeignKeys: (secretForeignKeyOfParent && [secretForeignKeyOfParent]) || [],\n secretId: secretId,\n }\n })\n }\n\n private async decryptAnyAesExchangeKeyForOwner(\n aesExchangeKeys: { [p: string]: { [p: string]: string } },\n loggedHcPartyId: string,\n delegatorId: string,\n delegateHcPartyId: string,\n publicKeys: string[]\n ) {\n const importedAESHcPartyKey = await Object.entries(aesExchangeKeys).reduce(async (acc, [publicKeyIdentifier, hcPartyKeys]) => {\n const accValue = await acc\n if (accValue) {\n return accValue\n }\n try {\n return await this.decryptHcPartyKey(loggedHcPartyId, delegatorId, delegateHcPartyId, publicKeyIdentifier, hcPartyKeys, publicKeys)\n } catch (e) {\n return undefined\n }\n }, Promise.resolve() as Promise<DelegatorAndKeys | undefined>)\n\n if (!importedAESHcPartyKey) {\n throw new Error(`No hcParty key can be decrypted from ${delegatorId} to ${delegateHcPartyId} using currently available private keys`)\n }\n return importedAESHcPartyKey\n }\n\n /**\n * Gets updated instances of SPKs and CKFs for the child object `modifiedObject`.\n * These updated SPKs and CKFs contain new SPKs/CFKs to provide delegation from delegator HcP with id `ownerId` to delegate HcP with id `delegateId`\n *\n * 1. if `secretIdOfModifiedObject` is not provided, the method will throw an exception; this `secretIdOfModifiedObject` is used to generate a new delegation (SPK) in step 3;\n * the `secretIdOfModifiedObject` is returned, unmodified, as `secretId`\n * 2. if the owner (delegator) did not perform a delegation to the delegate, then this HcP delegation (creation of a new HcPKey) is performed now\n * 3. creates a new delegation (Secret Primary Keys) on the `modifiedObject` encrypted with the HcPKey from owner to the delegate;\n * 4. if `parentObject` != null, creates a new CFK on the `modifiedObject` encrypted with the HcPKey from owner to the delegate;\n * 5. this new delegation (from step 3) is added to the list of existing delegations (Secret Primary Keys) on the `modifiedObject` for the delegate given by `delegateId`\n * 6. if the CFK (from step 4) can be created, this new CFK is added to the list of existing CFKs on the `modifiedObject` for the delegate given by `delegateId`\n * 7. then some duplicates delegations (SPKs) and CKFs are removed\n *\n * @param modifiedObject : the object of which SPKs and CFKs will be cloned, the clones will be modified and then used as returned values ; it's a 'child' of `parentObject`; will NOT be mutated\n * @param parentObject : will NOT be mutated\n * @param ownerId : the HcP id of the delegator\n * @param delegateId : the HcP id of the delegate\n * @param secretIdOfModifiedObject : the secret id used in the child object to generate its SPK\n * @returns - **delegations** existing delegations (SPKs) of the `modifiedObject`, appended with results from step 5\n * - **cryptedForeignKeys** existing CFKs of the `modifiedObject`, appended with results from steps 6\n * - **secretId** which is the given input parameter `secretIdOfModifiedObject`\n */\n\n extendedDelegationsAndCryptedForeignKeys<T extends EncryptedEntity, P extends EncryptedParentEntity>(\n //TODO: suggested name: getExtendedChildObjectSPKandCFKwithDelegationFromDelegatorToDelegate\n modifiedObject: T,\n parentObject: P | null,\n ownerId: string,\n delegateId: string,\n secretIdOfModifiedObject: string | null\n ): Promise<{\n modifiedObject: T\n delegations: { [key: string]: Array<Delegation> }\n cryptedForeignKeys: { [key: string]: Array<Delegation> }\n secretId: string | null //TODO: why input parameter secretIdOfModifiedObject is returned?\n }> {\n this.throwDetailedExceptionForInvalidParameter('modifiedObject.id', modifiedObject.id, 'extendedDelegationsAndCryptedForeignKeys', arguments) //modifiedObject should never be null\n\n if (parentObject)\n this.throwDetailedExceptionForInvalidParameter('parentObject.id', parentObject?.id, 'extendedDelegationsAndCryptedForeignKeys', arguments)\n\n this.throwDetailedExceptionForInvalidParameter(\n 'secretIdOfModifiedObject',\n secretIdOfModifiedObject,\n 'extendedDelegationsAndCryptedForeignKeys',\n arguments\n )\n\n return this.getDataOwner(ownerId)\n .then(async ({ dataOwner: owner }) => {\n const publicKeys = await this.getPublicKeys()\n const { owner: modifiedOwner, aesExchangeKeys } = await this.getOrCreateHcPartyKeys(owner, delegateId)\n const importedAESHcPartyKey = await this.decryptAnyAesExchangeKeyForOwner(aesExchangeKeys, ownerId, delegateId, ownerId, publicKeys)\n\n modifiedObject = modifiedObject?.id === owner.id ? (modifiedOwner as T) : modifiedObject\n\n return {\n previousDecryptedDelegations: await Promise.all(\n ((modifiedObject.delegations || {})[delegateId] || []).map(\n (d: Delegation) =>\n (d.key &&\n d.owner === ownerId &&\n this._AES.decrypt(importedAESHcPartyKey.key, hex2ua(d.key), importedAESHcPartyKey.rawKey).catch(() => {\n console.log(\n `Cannot decrypt delegation from ${d.owner} to ${d.delegatedTo} for object with id ${modifiedObject.id}:`,\n modifiedObject\n )\n return Promise.resolve()\n })) ||\n Promise.resolve()\n ) as Array<Promise<ArrayBuffer>>\n ),\n\n previousDecryptedCryptedForeignKeys: await Promise.all(\n ((modifiedObject.cryptedForeignKeys || {})[delegateId] || []).map(\n (d: Delegation) =>\n (d.key &&\n d.owner === ownerId &&\n this._AES.decrypt(importedAESHcPartyKey.key, hex2ua(d.key), importedAESHcPartyKey.rawKey).catch(() => {\n console.log(\n `Cannot decrypt cryptedForeignKeys from ${d.owner} to ${d.delegatedTo} for object with id ${modifiedObject.id}:`,\n modifiedObject\n )\n return Promise.resolve()\n })) ||\n Promise.resolve()\n ) as Array<Promise<ArrayBuffer>>\n ),\n\n cryptedDelegation: await this._AES.encrypt(\n importedAESHcPartyKey.key,\n string2ua(modifiedObject.id + ':' + secretIdOfModifiedObject!).buffer as ArrayBuffer,\n importedAESHcPartyKey.rawKey\n ),\n\n cryptedForeignKey: parentObject\n ? await this._AES.encrypt(\n importedAESHcPartyKey.key,\n string2ua(modifiedObject.id + ':' + parentObject.id).buffer as ArrayBuffer,\n importedAESHcPartyKey.rawKey\n )\n : undefined,\n }\n })\n .then(({ previousDecryptedDelegations, previousDecryptedCryptedForeignKeys, cryptedDelegation, cryptedForeignKey }) => {\n //try to limit the extent of the modifications to the delegations by preserving the redundant delegation already present and removing duplicates\n //For delegate delegateId, we create:\n // 1. an array of objects { d : {owner,delegatedTo,encrypted(key)}} with one object for each existing delegation and the new key concatenated\n // 2. an array of objects { k : decrypted(key)} with one object for the existing delegations and the new key concatenated\n // We merge them to get one array of objects: { d: {owner,delegatedTo,encrypted(key)}, k: decrypted(key)}\n const delegationCryptedDecrypted = (\n _.merge(\n ((modifiedObject.delegations || {})[delegateId] || []).map((d: Delegation) => ({\n d,\n })),\n (previousDecryptedDelegations || []).map((dd) => (dd ? ua2string(dd) : null)).map((k) => ({ k }))\n ) as { d: Delegation; k: string }[]\n )\n .filter(({ d, k }) => !!k || d.owner !== ownerId) //Only keep the ones created by us that can still be decrypted\n .map(({ d, k }) => ({\n d,\n k: k || this.randomUuid(),\n })) // Use some unique id that ensures the delegation not created by us are going to be held\n .concat([\n {\n d: {\n owner: ownerId,\n delegatedTo: delegateId,\n key: ua2hex(cryptedDelegation!),\n },\n k: modifiedObject.id + ':' + secretIdOfModifiedObject!,\n },\n ])\n\n const allDelegations = _.cloneDeep(modifiedObject.delegations || {})\n\n //Only keep one version of the decrypted key\n allDelegations[delegateId] = _.uniqBy(delegationCryptedDecrypted, (x: any) => x.k).map((x: any) => x.d)\n\n const cryptedForeignKeysCryptedDecrypted = (\n _.merge(\n ((modifiedObject.cryptedForeignKeys || {})[delegateId] || []).map((d: Delegation) => ({\n d,\n })),\n (previousDecryptedCryptedForeignKeys || []).map((dd) => (dd ? ua2string(dd) : null)).map((k) => ({ k }))\n ) as { d: Delegation; k: string }[]\n )\n .filter(({ d, k }) => !!k || d.owner !== ownerId) //Only keep the ones created by us that can still be decrypted\n .map(({ d, k }: { d: Delegation; k: string }) => ({\n d,\n k: k || this.randomUuid(),\n })) // Use some unique id that ensures the delegation not created by us are going to be held\n .concat(\n cryptedForeignKey\n ? [\n {\n d: {\n owner: ownerId,\n delegatedTo: delegateId,\n key: ua2hex(cryptedForeignKey),\n },\n k: modifiedObject.id + ':' + parentObject?.id,\n },\n ]\n : []\n )\n\n const allCryptedForeignKeys = _.cloneDeep(modifiedObject.cryptedForeignKeys || {})\n if (cryptedForeignKeysCryptedDecrypted.length > 0) {\n allCryptedForeignKeys[delegateId] = _.uniqBy(cryptedForeignKeysCryptedDecrypted, (x: any) => x.k).map((x: any) => x.d)\n }\n\n return {\n modifiedObject,\n delegations: allDelegations,\n cryptedForeignKeys: allCryptedForeignKeys,\n secretId: secretIdOfModifiedObject,\n }\n })\n }\n\n async getEncryptedAesExchangeKeys(\n owner: HealthcareParty | Patient | Device,\n delegateId: string\n ): Promise<{ [pubKeyIdentifier: string]: { [pubKeyFingerprint: string]: string } }> {\n const publicKeys = await this.getPublicKeys()\n const mapOfAesExchangeKeys = Object.entries(owner.aesExchangeKeys ?? {})\n .filter((e) => e[1][delegateId] && Object.keys(e[1][delegateId]).some((k1) => publicKeys.some((pk) => pk.endsWith(k1))))\n .reduce((map, e) => {\n const candidates = Object.entries(e[1][delegateId])\n const [publicKeyFingerprint, encryptedAesExchangeKey] = candidates[candidates.findIndex(([k, v]) => publicKeys.some((pk) => pk.endsWith(k)))]\n return { ...map, [e[0]]: { [publicKeyFingerprint]: encryptedAesExchangeKey } }\n }, {} as { [pubKeyIdentifier: string]: { [pubKeyFingerprint: string]: string } })\n\n return !owner.publicKey ||\n mapOfAesExchangeKeys[owner.publicKey] ||\n !owner.hcPartyKeys?.[delegateId] ||\n publicKeys.find((p) => p == owner.publicKey!) == undefined\n ? mapOfAesExchangeKeys\n : { ...mapOfAesExchangeKeys, [owner.publicKey]: { [owner.publicKey.slice(-32)]: owner.hcPartyKeys[delegateId][0] } }\n }\n\n async getOrCreateHcPartyKeys(\n owner: HealthcareParty | Patient | Device,\n delegateId: string\n ): Promise<{\n owner: HealthcareParty | Patient | Device\n aesExchangeKeys: { [pubKeyIdentifier: string]: { [pubKeyFingerprint: string]: string } }\n }> {\n const aesExchangeKeys = await this.getEncryptedAesExchangeKeys(owner, delegateId)\n if (Object.keys(aesExchangeKeys).length) {\n return { owner, aesExchangeKeys }\n }\n\n const modifiedOwner = await this.generateKeyForDelegate(owner.id!, delegateId)\n return { owner: modifiedOwner, aesExchangeKeys: await this.getEncryptedAesExchangeKeys(modifiedOwner, delegateId) }\n }\n\n /**\n * Retrieve the owners HealthCareParty key, decrypt it, and\n * use it to encrypt & initialize the \"encryptionKeys\" object\n * and return it.\n * @param createdObject\n * @param ownerId\n */\n initEncryptionKeys(\n createdObject: any,\n ownerId: string\n ): Promise<{\n encryptionKeys: any\n secretId: string\n }> {\n this.throwDetailedExceptionForInvalidParameter('createdObject.id', createdObject.id, 'initEncryptionKeys', arguments)\n\n const secretId = this.randomUuid()\n return this.getDataOwner(ownerId).then(async ({ dataOwner: owner }) => {\n const publicKeys = await this.getPublicKeys()\n const { owner: modifiedOwner, aesExchangeKeys } = await this.getOrCreateHcPartyKeys(owner, ownerId)\n const importedAESHcPartyKey = await this.decryptAnyAesExchangeKeyForOwner(aesExchangeKeys, ownerId, ownerId, ownerId, publicKeys)\n const encryptedEncryptionKeys = await this._AES.encrypt(\n importedAESHcPartyKey.key,\n string2ua(createdObject.id + ':' + secretId),\n importedAESHcPartyKey.rawKey\n )\n\n return {\n encryptionKeys: _.fromPairs([\n [\n ownerId,\n [\n {\n owner: ownerId,\n delegatedTo: ownerId,\n key: ua2hex(encryptedEncryptionKeys),\n },\n ],\n ],\n ]),\n secretId: secretId,\n }\n })\n }\n\n /**\n * Gets an updated instance of the EKs of `modifiedObject`.\n * The updated EKs contain a new EK to provide delegation from delegator HcP with id `ownerId` to delegate HcP with id `delegateId`.\n * @param modifiedObject : the object of which EKs will be cloned, the clone will be used to append the new EK, and then used as return value; will NOT be mutated\n * @param ownerId : delegator HcP id\n * @param delegateId : delegate HcP id\n * @param secretEncryptionKeyOfObject : secret Id for the EK (Content Encryption Key)\n * @returns - **encryptionKeys** existing EKs of the `modifiedObject`, appended with a new EK item (owner: `ownerId`, delegatedTo: `delegateId`, encrypted key with secretId: `secretEncryptionKeyOfObject` )\n * - **secretId** which is the given input parameter `secretEncryptionKeyOfObject`\n */\n async appendEncryptionKeys(\n //TODO: suggested name: getExtendedEKwithDelegationFromDelegatorToDelegate\n modifiedObject: any,\n ownerId: string,\n delegateId: string,\n secretEncryptionKeyOfObject: string\n ): Promise<{\n encryptionKeys: { [key: string]: Array<Delegation> }\n secretId: string | null //secretEncryptionKeyOfObject is returned to avoid the need for a new decryption when chaining calls\n }> {\n this.throwDetailedExceptionForInvalidParameter('modifiedObject.id', modifiedObject.id, 'appendEncryptionKeys', arguments) //modifiedObject should never be null\n\n this.throwDetailedExceptionForInvalidParameter('secretEncryptionKeyOfObject', secretEncryptionKeyOfObject, 'appendEncryptionKeys', arguments)\n\n return this.getDataOwner(ownerId)\n .then(async ({ dataOwner: owner }) => {\n const publicKeys = await this.getPublicKeys()\n const { owner: modifiedOwner, aesExchangeKeys } = await this.getOrCreateHcPartyKeys(owner, delegateId)\n const importedAESHcPartyKey = await this.decryptAnyAesExchangeKeyForOwner(aesExchangeKeys, ownerId, ownerId, delegateId, publicKeys)\n\n return {\n previousDecryptedEncryptionKeys: await Promise.all(\n ((modifiedObject.encryptionKeys || {})[delegateId] || []).map(\n (d: Delegation) =>\n (d.key &&\n d.owner === ownerId &&\n this._AES.decrypt(importedAESHcPartyKey.key, hex2ua(d.key), importedAESHcPartyKey.rawKey).catch(() => {\n console.log(\n `Cannot decrypt encryption key from ${d.owner} to ${d.delegatedTo} for object with id ${modifiedObject.id}:`,\n modifiedObject\n )\n return Promise.resolve()\n })) ||\n Promise.resolve()\n ) as Array<Promise<ArrayBuffer>>\n ),\n encryptedEncryptionKey: await this._AES.encrypt(\n importedAESHcPartyKey.key,\n string2ua(modifiedObject.id + ':' + secretEncryptionKeyOfObject)\n ),\n }\n })\n .then(({ previousDecryptedEncryptionKeys, encryptedEncryptionKey }) => {\n //try to limit the extent of the modifications to the delegations by preserving the redundant encryption keys already present and removing duplicates\n //For delegate delegateId, we create:\n // 1. an array of objects { d : {owner,delegatedTo,encrypted(key)}} with one object for the existing encryption keys and the new key concatenated\n // 2. an array of objects { k : decrypted(key)} with one object for the existing delegations and the new key concatenated\n // We merge them to get one array of objects: { d: {owner,delegatedTo,encrypted(key)}, k: decrypted(key)}\n const encryptionKeysCryptedDecrypted = _.merge(\n ((modifiedObject.encryptionKeys || {})[delegateId] || []).map((d: Delegation) => ({\n d,\n })),\n (previousDecryptedEncryptionKeys || []).map((dd) => (dd ? ua2string(dd) : null)).map((k) => ({ k }))\n )\n .filter(({ d, k }: { d: Delegation; k: string }) => !!k || d.owner !== ownerId) //Only keep the ones created by us that can still be decrypted\n .map(({ d, k }: { d: Delegation; k: string }) => ({ d, k: k || this.randomUuid() }))\n .concat([\n {\n d: {\n owner: ownerId,\n delegatedTo: delegateId,\n key: ua2hex(encryptedEncryptionKey),\n },\n k: modifiedObject.id + ':' + secretEncryptionKeyOfObject!,\n },\n ])\n\n const allEncryptionKeys = _.cloneDeep(modifiedObject.encryptionKeys)\n allEncryptionKeys[delegateId] = _.uniqBy(encryptionKeysCryptedDecrypted, (x: any) => x.k).map((x: any) => x.d)\n\n return {\n encryptionKeys: allEncryptionKeys,\n secretId: secretEncryptionKeyOfObject,\n }\n })\n }\n\n /**\n * Gets an updated `child` object that will have its SPKs, CFKs, KSs updated to include delegations from delegator HcP with id `ownerId` to delegate HcP with id `delegateId`\n * The SFKs of `child` are not updated, so this method assumes this is not the initial delegation on the `child` object\n * The method also performs some deduplication of all types of delegations.\n * @param parent : the parent object of `child`; will NOT be mutated\n * @param child : the object that will be mutated and returned\n * @param ownerId delegator HcP id\n * @param delegateId delegate HcP id\n * @param secretDelegationKey the secret Id used in the child object to generate the SPK\n * @param secretEncryptionKey the secret Id used in the child object to generate the EK (Content Encryption Key)\n * @returns - an updated `child` object that will contain updated SPKs, CFKs, EKs\n * */\n\n addDelegationsAndEncryptionKeys<T extends EncryptedEntity>(\n //TODO: suggested name: updateChildGenericDelegationsFromDelegatorToDelegate\n parent: EncryptedParentEntity | null,\n child: T,\n ownerId: string,\n delegateId: string,\n secretDelegationKey: string | null,\n secretEncryptionKey: string | null\n ): Promise<T> {\n if (parent) this.throwDetailedExceptionForInvalidParameter('parent.id', parent.id, 'addDelegationsAndEncryptionKeys', arguments)\n\n this.throwDetailedExceptionForInvalidParameter('child.id', child.id, 'addDelegationsAndEncryptionKeys', arguments)\n return (\n secretDelegationKey\n ? this.extendedDelegationsAndCryptedForeignKeys(child, parent, ownerId, delegateId, secretDelegationKey)\n : Promise.resolve({ modifiedObject: child, delegations: {}, cryptedForeignKeys: {}, secretId: null })\n )\n .then((extendedChildObjectSPKsAndCFKs) =>\n secretEncryptionKey\n ? this.appendEncryptionKeys(extendedChildObjectSPKsAndCFKs.modifiedObject, ownerId, delegateId, secretEncryptionKey).then(\n //TODO: extendedDelegationsAndCryptedForeignKeys and appendEncryptionKeys can be done in parallel\n (extendedChildObjectEKs) => ({\n extendedSPKsAndCFKs: extendedChildObjectSPKsAndCFKs,\n extendedEKs: extendedChildObjectEKs,\n })\n )\n : Promise.resolve({\n extendedSPKsAndCFKs: extendedChildObjectSPKsAndCFKs,\n extendedEKs: { encryptionKeys: {} },\n })\n )\n .then(({ extendedSPKsAndCFKs: extendedChildObjectSPKsAndCFKs, extendedEKs: extendedChildObjectEKs }) => {\n return _.assign(extendedChildObjectSPKsAndCFKs.modifiedObject, {\n // Conservative version ... We might want to be more aggressive with the deduplication of keys\n // For each delegate, we are going to concatenate to the src (the new delegations), the object in dest (the current delegations)\n // for which we do not find an equivalent delegation (same delegator, same delegate)\n delegations: _.assignWith(child.delegations, extendedChildObjectSPKsAndCFKs.delegations, (dest, src) =>\n (src || []).concat(\n _.filter(dest, (d: Delegation) => !src.some((s: Delegation) => s.owner === d.owner && s.delegatedTo === d.delegatedTo))\n )\n ),\n cryptedForeignKeys: _.assignWith(child.cryptedForeignKeys, extendedChildObjectSPKsAndCFKs.cryptedForeignKeys, (dest, src) =>\n (src || []).concat(\n _.filter(dest, (d: Delegation) => !src.some((s: Delegation) => s.owner === d.owner && s.delegatedTo === d.delegatedTo))\n )\n ),\n encryptionKeys: _.assignWith(child.encryptionKeys, extendedChildObjectEKs.encryptionKeys, (dest, src) =>\n (src || []).concat(\n _.filter(dest, (d: Delegation) => !src.some((s: Delegation) => s.owner === d.owner && s.delegatedTo === d.delegatedTo))\n )\n ),\n })\n })\n }\n\n /**\n * Gets the secret IDs (SFKs) inside decrypted SPKs of the given `document`, decrypted by the HcP with the given `hcpartyId` AND by its HcP parents\n * @param document : the object of which delegations (SPKs) to decrypt\n * @param hcpartyId : the id of the delegate HcP\n * @returns - **extractedKeys** array containing secret IDs (SFKs) from decrypted SPKs, from both given HcP and its parents ; can contain duplicates\n * - **hcpartyId** the given `hcpartyId` OR, if a parent exist, the HcP id of the top parent in the hierarchy (even if that parent has no delegations)\n */\n //TODO: even if there are no delegations for parent HCP (but the parent exists), the returned hcpartyId will be the one of the parent; is this ok?\n extractDelegationsSFKs(\n //TODO: suggested name: getSecretIDsSPKofHcpAndParentsFromDocument\n document: EncryptedEntity | null,\n hcpartyId?: string\n ): Promise<{ extractedKeys: Array<string>; hcpartyId?: string }> {\n if (!document || !hcpartyId) {\n return Promise.resolve({ extractedKeys: [], hcpartyId: hcpartyId }) //TODO: thow exception instead?\n }\n const delegationsForAllDelegates = document.delegations\n if (!delegationsForAllDelegates || !Object.keys(delegationsForAllDelegates).length) {\n console.log(`There is no delegation in document (${document.id})`)\n return Promise.resolve({ extractedKeys: [], hcpartyId: hcpartyId })\n }\n return this.extractKeysFromDelegationsForHcpHierarchy(hcpartyId, document.id!, delegationsForAllDelegates)\n }\n\n /**\n * Gets the secret IDs (SFKs) inside decrypted SPKs of the given `document`, decrypted by the HcP with the given `hcpartyId` AND by its HcP parents\n * @param document : the object of which delegations (SPKs) to decrypt\n * @param hcpartyId : the id of the delegate HcP\n * @returns - **extractedKeys** array containing secret IDs (SFKs) from decrypted SPKs, from both given HcP and its parents ; can contain duplicates\n * - **hcpartyId** the given `hcpartyId` OR, if a parent exist, the HcP id of the top parent in the hierarchy (even if that parent has no delegations)\n */\n extractSFKsHierarchyFromDelegations(\n document: EncryptedEntity | null,\n hcpartyId?: string\n ): Promise<Array<{ hcpartyId: string; extractedKeys: Array<string> }>> {\n if (!document || !hcpartyId) {\n return Promise.resolve([])\n }\n const delegationsForAllDelegates = document.delegations\n if (!delegationsForAllDelegates || !Object.keys(delegationsForAllDelegates).length) {\n console.log(`There is no delegation in document (${document.id})`)\n return Promise.resolve([])\n }\n return this.extractKeysHierarchyFromDelegationLikes(hcpartyId, document.id!, delegationsForAllDelegates)\n }\n\n // noinspection JSUnusedGlobalSymbols\n\n extractCryptedFKs(\n //TODO: suggested name: getSecretIDsCFKofHcpAndParentsFromDocument\n document: EncryptedEntity | null,\n hcpartyId: string\n ): Promise<{ extractedKeys: Array<string>; hcpartyId: string }> {\n if (!document || !document.cryptedForeignKeys) {\n return Promise.resolve({ extractedKeys: [], hcpartyId: hcpartyId })\n }\n const cfksForAllDelegates = document.cryptedForeignKeys\n if (!cfksForAllDelegates || !Object.keys(cfksForAllDelegates).length) {\n console.log(`There is no cryptedForeignKeys in document (${document.id})`)\n return Promise.resolve({ extractedKeys: [], hcpartyId: hcpartyId })\n }\n return this.extractKeysFromDelegationsForHcpHierarchy(hcpartyId, document.id!, cfksForAllDelegates)\n }\n\n extractEncryptionsSKs(\n //TODO: suggested name: getSecretIDsEKofHcpAndParentsFromDocument\n document: EncryptedEntity,\n hcpartyId: string\n ): Promise<{ extractedKeys: Array<string>; hcpartyId: string }> {\n if (!document.encryptionKeys) {\n return Promise.resolve({ extractedKeys: [], hcpartyId: hcpartyId })\n }\n const eckeysForAllDelegates = document.encryptionKeys\n if (!eckeysForAllDelegates || !Object.keys(eckeysForAllDelegates).length) {\n //console.log(`There is no encryption key in document (${document.id})`)\n return Promise.resolve({ extractedKeys: [], hcpartyId: hcpartyId })\n }\n return this.extractKeysFromDelegationsForHcpHierarchy(hcpartyId, document.id!, eckeysForAllDelegates)\n }\n\n extractDelegationsSFKsAndEncryptionSKs(ety: EncryptedEntity, ownerId: string) {\n const delegationsSfksOwnerPromise = this.extractDelegationsSFKs(ety, ownerId).then((xks) => xks.extractedKeys) //Will climb up hierarchy\n const encryptionKeysOwnerPromise = this.extractEncryptionsSKs(ety, ownerId).then((xks) => xks.extractedKeys) //Will climb up hierarchy\n\n return Promise.all([delegationsSfksOwnerPromise, encryptionKeysOwnerPromise])\n }\n\n /**\n * Get decrypted generic secret IDs (secretIdSPKs, parentIds, secretIdEKs) from generic delegations (SPKs, CFKs, EKs)\n * 1. Get HealthCareParty from it's Id.\n * 2. Decrypt the keys of the given HCP.\n * 3. Decrypt the parent's key if it has parent.\n * 4. Return the decrypted key corresponding to the Health Care Party.\n * @param hcpartyId : the id of the delegate HcP (including its parents) for which to decrypt `extractedKeys`\n * @param objectId : the id of the object/document of which delegations to decrypt ; used just to log to console a message (Cryptographic mistake) in case the object id inside SPK, CFK, EK is different from this one\n * @param delegations : generic delegations (can be SPKs, CFKs, EKs) for all delegates from where to extract `extractedKeys`\n * @returns - **extractedKeys** array containing secret IDs from decrypted generic delegations, from both HCP with given `hcpartyId` and its parents; can contain duplicates\n * - **hcpartyId** the given `hcpartyId` OR, if a parent exist, the HCP id of the top parent in the hierarchy (even if that parent has no delegations)\n */\n //TODO: even if there are no delegations for parent HCP (but the parent exists), the returned hcpartyId will be the one of the parent\n async extractKeysHierarchyFromDelegationLikes(\n //TODO suggested name: getSecretIdsOfHcpAndParentsFromGenericDelegations\n hcpartyId: string,\n objectId: string,\n delegations: { [key: string]: Array<Delegation> }\n ): Promise<Array<{ hcpartyId: string; extractedKeys: Array<string> }>> {\n const { dataOwner: hcp } = await this.getDataOwner(hcpartyId)\n const extractedKeys = []\n if (delegations[hcpartyId]?.length) {\n const decryptedAndImportedAesHcPartyKeys = await this.getDecryptedAesExchangeKeysOfDelegateAndParentsFromGenericDelegations(\n hcpartyId,\n delegations,\n false\n )\n const collatedAesKeysFromDelegatorToHcpartyId = decryptedAndImportedAesHcPartyKeys.reduce((map, k) => ({ ...map, [k.delegatorId]: k }), {})\n extractedKeys.push(...(await this.decryptKeyInDelegationLikes(delegations[hcpartyId], collatedAesKeysFromDelegatorToHcpartyId, objectId)))\n }\n\n return (hcp as HealthcareParty).parentId\n ? [\n ...(await this.extractKeysHierarchyFromDelegationLikes((hcp as HealthcareParty).parentId!, objectId, delegations)),\n { extractedKeys: extractedKeys, hcpartyId: hcpartyId },\n ]\n : [{ extractedKeys: extractedKeys, hcpartyId: hcpartyId }]\n }\n\n /**\n * Get decrypted generic secret IDs (secretIdSPKs, parentIds, secretIdEKs) from generic delegations (SPKs, CFKs, EKs)\n * 1. Get Data Owner (HCP, Patient or Device) from it's Id.\n * 2. Decrypt the keys of the given data owner.\n * 3. Decrypt the parent's key if it has parent.\n * 4. Return the decrypted key corresponding to the Health Care Party.\n * @param dataOwnerId : the id of the delegate data owner (including its parents) for which to decrypt `extractedKeys`\n * @param objectId : the id of the object/document of which delegations to decrypt ; used just to log to console a message (Cryptographic mistake) in case the object id inside SPK, CFK, EK is different from this one\n * @param delegations : generic delegations (can be SPKs, CFKs, EKs) for all delegates from where to extract `extractedKeys`\n * @returns - **extractedKeys** array containing secret IDs from decrypted generic delegations, from both data owner with given `dataOwnerId` and its parents; can contain duplicates\n * - **dataOwnerId** the given `dataOwnerId` OR, if a parent exist, the data owner id of the top parent in the hierarchy (even if that parent has no delegations)\n */\n //TODO: even if there are no delegations for parent HCP (but the parent exists), the returned dataOwnerId will be the one of the parent\n extractKeysFromDelegationsForHcpHierarchy(\n //TODO suggested name: getSecretIdsOfHcpAndParentsFromGenericDelegations\n dataOwnerId: string,\n objectId: string,\n delegations: { [key: string]: Array<Delegation> }\n ): Promise<{ extractedKeys: Array<string>; hcpartyId: string }> {\n return this.getDataOwner(dataOwnerId).then(({ dataOwner: hcp }) =>\n (delegations[dataOwnerId] && delegations[dataOwnerId].length\n ? this.getDecryptedAesExchangeKeysOfDelegateAndParentsFromGenericDelegations(dataOwnerId, delegations, false).then(\n (decryptedAndImportedAesHcPartyKeys) => {\n const collatedAesKeysFromDelegatorToHcpartyId: {\n [key: string]: { key: CryptoKey; rawKey: string }[]\n } = {}\n decryptedAndImportedAesHcPartyKeys.forEach((k) => {\n ;(collatedAesKeysFromDelegatorToHcpartyId[k.delegatorId] ?? (collatedAesKeysFromDelegatorToHcpartyId[k.delegatorId] = [])).push(k)\n })\n return this.decryptKeyInDelegationLikes(delegations[dataOwnerId], collatedAesKeysFromDelegatorToHcpartyId, objectId!)\n }\n )\n : Promise.resolve([])\n ).then((extractedKeys) =>\n (hcp as HealthcareParty).parentId\n ? this.extractKeysFromDelegationsForHcpHierarchy((hcp as HealthcareParty).parentId!, objectId, delegations).then((parentResponse) =>\n _.assign(parentResponse, {\n extractedKeys: parentResponse.extractedKeys.concat(extractedKeys),\n })\n )\n : { extractedKeys: extractedKeys, hcpartyId: dataOwnerId }\n )\n )\n }\n\n /**\n * Gets an array of generic secret IDs decrypted from a list of generic delegations (SPKs, CFKs, EKs) `delegationsArray`\n * If a particular generic delegation thows an exception when decrypted, the return value for it's secret ID will be 'false' and a message is logged to console\n * For each one of the delegations in the `delegationsArray`, it tries to decrypt with the decryptedHcPartyKey of the owner of that delegation;\n *\n * @param delegationsArray : generic delegations array\n * @param aesKeys : **key** HcP ids of delegators/owners in the `delegationsArray`, each with its own decryptedHcPartyKey\n * @param masterId : is the object id to which the generic delegation belongs to\n * - used only to check whether the object.id matches the one stored in the decrypted generic delegation item\n * - even if there's no match, the secret ID is kept as a valid result (and a message logged to console)\n * @returns array of generic secret IDs (secretIdSPK, parentId, secretIdEK)\n */\n async decryptKeyInDelegationLikes(\n //TODO: suggested name: getSecretIdsFromGenericDelegations\n delegationsArray: Array<Delegation>,\n aesKeysForDataOwnerId: { [key: string]: { key: CryptoKey; rawKey: string }[] },\n masterId: string\n ): Promise<Array<string>> {\n const decryptPromises: Array<Promise<string | undefined>> = delegationsArray.map(async (genericDelegationItem) => {\n const aesKeys = aesKeysForDataOwnerId[genericDelegationItem.owner!]\n if (aesKeys?.length) {\n return aesKeys.reduce(async (acc, aesKey) => {\n const accValue = await acc\n if (accValue) {\n return accValue\n }\n try {\n const decryptedGenericDelegationKey = await this._AES.decrypt(aesKey.key, hex2ua(genericDelegationItem.key!), aesKey.rawKey)\n const results = ua2string(decryptedGenericDelegationKey).split(':')\n\n const objectId = results[0] //must be the ID of the object, for checksum\n const genericSecretId = results[1]\n\n const details =\n 'object ID: ' + masterId + '; generic delegation from ' + genericDelegationItem.owner + ' to ' + genericDelegationItem.delegatedTo\n\n if (!objectId) console.warn('Object id is empty; ' + details)\n if (!genericSecretId) console.warn('Secret id is empty; ' + details)\n\n if (objectId !== masterId) {\n /*console.log(\n \"Cryptographic mistake: object ID is not equal to the expected concatenated id within decrypted generic delegation. This may happen when patients have been merged; \" +\n details\n )*/\n }\n return genericSecretId\n } catch (err) {\n console.log(\n `Could not decrypt generic delegation in object with ID: ${masterId} from ${genericDelegationItem.owner} to ${genericDelegationItem.delegatedTo}: ${err}`\n )\n console.log(`AES key is: ${aesKey.rawKey}. Encrypted data is ${genericDelegationItem.key}.`)\n\n return undefined\n }\n }, Promise.resolve() as Promise<string | undefined>)\n } else {\n console.log(`Could not find aes key for object with ID: ${masterId}`)\n }\n })\n return Promise.all(decryptPromises).then((genericSecretId) => genericSecretId.filter((id) => !!id) as string[])\n }\n\n getPublicKeyFromPrivateKey(privateKey: JsonWebKey, dataOwner: Patient | Device | HealthcareParty) {\n if (!privateKey.n || !privateKey.e) {\n throw new Error('No public key can be deduced from incomplete private key')\n }\n\n const publicKeyFromPrivateKey = jwk2spki(privateKey)\n const publicKeys = [dataOwner.publicKey].concat(Object.keys(dataOwner.aesExchangeKeys ?? {})).filter((x) => !!x)\n\n if (!publicKeys.length) {\n throw new Error('No public key has been defined for hcp')\n }\n\n const publicKey = publicKeys.find((it) => it === publicKeyFromPrivateKey)\n if (!publicKey) {\n throw new Error('No public key can be found for this private key')\n }\n\n return publicKey\n }\n\n async loadKeyPairsAsTextInBrowserLocalStorage(healthcarePartyId: string, privateKey: Uint8Array) {\n const { dataOwner } = await this.getDataOwner(healthcarePartyId)\n\n const privateKeyInJwk = pkcs8ToJwk(privateKey)\n const publicKey = this.getPublicKeyFromPrivateKey(privateKeyInJwk, dataOwner)\n\n const keyPair: { publicKey: CryptoKey; privateKey: CryptoKey } = await this._RSA.importKeyPair(\n 'jwk',\n privateKeyInJwk,\n 'jwk',\n spkiToJwk(hex2ua(publicKey))\n )\n this.rsaKeyPairs[publicKey.slice(-32)] = keyPair\n const exportedKeyPair = await this._RSA.exportKeys(keyPair, 'jwk', 'jwk')\n\n return this.storeKeyPair(`${healthcarePartyId}.${publicKey.slice(-32)}`, exportedKeyPair)\n }\n\n async loadKeyPairsAsJwkInBrowserLocalStorage(healthcarePartyId: string, privateKey: JsonWebKey) {\n const { dataOwner } = await this.getDataOwner(healthcarePartyId)\n\n if ((!privateKey.n || !privateKey.e) && dataOwner.publicKey) {\n //Fallback on default publicKey\n console.warn('An incomplete key has been completed using the default public key of the data owner')\n const publicKeyInJwk = spkiToJwk(hex2ua(dataOwner.publicKey))\n privateKey.n = publicKeyInJwk.n\n privateKey.e = publicKeyInJwk.e\n }\n\n const publicKey = this.getPublicKeyFromPrivateKey(privateKey, dataOwner)\n\n const keyPair = await this._RSA.importKeyPair('jwk', privateKey, 'jwk', spkiToJwk(hex2ua(publicKey)))\n this.rsaKeyPairs[healthcarePartyId] = keyPair\n const exportedKeyPair = await this._RSA.exportKeys(keyPair, 'jwk', 'jwk')\n\n return this.storeKeyPair(`${healthcarePartyId}.${publicKey.slice(-32)}`, exportedKeyPair)\n }\n\n // noinspection JSUnusedGlobalSymbols\n loadKeyPairsInBrowserLocalStorage(healthcarePartyId: string, file: Blob): Promise<void> {\n const fr = new FileReader()\n return new Promise((resolve, reject) => {\n fr.onerror = reject\n fr.onabort = reject\n fr.onload = (e: any) => {\n //TODO remove any\n const privateKey = e.target.result as string\n this.loadKeyPairsAsTextInBrowserLocalStorage(healthcarePartyId, hex2ua(privateKey))\n .then(() => resolve())\n .catch(reject)\n }\n fr.readAsText(file)\n })\n }\n\n // noinspection JSUnusedGlobalSymbols\n saveKeychainInBrowserLocalStorage(id: string, keychain: number) {\n localStorage.setItem(\n this.keychainLocalStoreIdPrefix + id,\n b2a(new Uint8Array(keychain).reduce((data, byte) => data + String.fromCharCode(byte), ''))\n )\n }\n\n saveKeychainInBrowserLocalStorageAsBase64(id: string, keyChainB64: string) {\n localStorage.setItem(this.keychainLocalStoreIdPrefix + id, keyChainB64)\n }\n\n // noinspection JSUnusedGlobalSymbols\n saveKeychainValidityDateInBrowserLocalStorage(id: string, date: string) {\n if (!id) return\n\n if (!date) {\n localStorage.removeItem(this.keychainValidityDateLocalStoreIdPrefix + id)\n } else {\n localStorage.setItem(this.keychainValidityDateLocalStoreIdPrefix + id, date)\n }\n }\n\n /**\n * Populate the HCP.options dict with an encrypted eHealth certificate and unencryped expiry date.\n * Any potentially unencrypted certificates will be pruned from the HCP.\n * @param hcpId Id of the hcp to modify\n * @returns modified HCP\n */\n async saveKeyChainInHCPFromLocalStorage(hcpId: string): Promise<HealthcareParty> {\n return await this.hcpartyBaseApi.getHealthcareParty(hcpId).then(async (hcp: HealthcareParty) => {\n let aesKey: CryptoKey | null = null\n try {\n aesKey = _.find(\n await this.decryptAndImportAesHcPartyKeysForDelegators([hcp.id!], hcp.id!),\n (delegator: DelegatorAndKeys) => delegator.delegatorId === hcp.id\n )!.key\n } catch (e) {\n console.error('Error while importing the AES key.')\n }\n if (!aesKey) {\n console.error('No encryption key!')\n }\n\n const opts = hcp.options || {}\n\n const crt = this.getKeychainInBrowserLocalStorageAsBase64(hcp.id!!)\n if (!!aesKey && !!crt) {\n let crtEncrypted: ArrayBuffer | null = null\n try {\n crtEncrypted = await this.AES.encrypt(aesKey, new Uint8Array(string2ua(atob(crt))))\n } catch (e) {\n console.error('Error while encrypting the certificate', e)\n }\n\n // add the encrypted certificate to the options\n _.set(opts, this.hcpPreferenceKeyEhealthCert, ua2string(new Uint8Array(crtEncrypted!)))\n }\n\n const crtValidityDate = this.getKeychainValidityDateInBrowserLocalStorage(hcp.id!!)\n if (!!crtValidityDate) {\n _.set(opts, this.hcpPreferenceKeyEhealthCertDate, crtValidityDate)\n }\n\n hcp.options = opts\n return hcp\n })\n }\n\n importKeychainInBrowserFromHCP(hcpId: string): Promise<void> {\n return this.hcpartyBaseApi.getHealthcareParty(hcpId).then(async (hcp: HealthcareParty) => {\n let crtCryp: Uint8Array | null = null\n if (!!hcp.options && !!hcp.options[this.hcpPreferenceKeyEhealthCert]) {\n crtCryp = string2ua(hcp.options[this.hcpPreferenceKeyEhealthCert])\n }\n\n const crtValidityDate = _.get(hcp.options, this.hcpPreferenceKeyEhealthCertDate)\n\n // store the validity date\n if (!!crtValidityDate) {\n this.saveKeychainValidityDateInBrowserLocalStorage(hcp.id!!, crtValidityDate)\n }\n\n let crt: ArrayBuffer | null = null\n let decryptionKey: CryptoKey | null = null\n try {\n decryptionKey = _.find(\n await this.decryptAndImportAesHcPartyKeysForDelegators([hcp.id!], hcp.id!),\n (delegator: DelegatorAndKeys) => delegator.delegatorId === hcp.id\n )!.key\n } catch (e) {\n console.error('Error while importing the AES key.')\n }\n if (!decryptionKey) {\n throw new Error('No encryption key! eHealth certificate cannot be decrypted.')\n }\n\n if (!!crtCryp && decryptionKey) {\n try {\n crt = await this.AES.decrypt(decryptionKey, crtCryp)\n } catch (e) {\n console.error(e)\n }\n }\n\n if (!crt) {\n throw new Error(`Error while saving certificate in browser local storage! Hcp ${hcp.id} has no certificate.`)\n } else {\n this.saveKeychainInBrowserLocalStorageAsBase64(hcp.id!!, btoa(String.fromCharCode.apply(null, Array.from(new Uint8Array(crt)))))\n }\n\n return\n })\n }\n\n /**\n * Synchronizes the eHealth certificate from the database into the LocalStorage, returning information on the presence\n * of certificate data in either place.\n *\n * @param hcpId The healthcare party id\n * @returns A Promise for an object that represents the existence of a certificate in local storage and in the DB,\n * through the two boolean properties \"local\" and \"remote\".\n */\n syncEhealthCertificateFromDatabase(hcpId: string): Promise<{ remote: boolean; local: boolean }> {\n return this.hcpartyBaseApi.getHealthcareParty(hcpId).then((hcp: HealthcareParty) => {\n const remoteCertificate = _.get(hcp.options, this.hcpPreferenceKeyEhealthCert)\n const localCertificate = this.getKeychainInBrowserLocalStorageAsBase64(hcp.id!)\n\n if (remoteCertificate) {\n return this.importKeychainInBrowserFromHCP(hcp.id!)\n .then(() => ({ local: true, remote: true }))\n .catch(() => ({ local: !!localCertificate, remote: true }))\n } else {\n return { local: !!localCertificate, remote: !!remoteCertificate }\n }\n })\n }\n\n getKeychainInBrowserLocalStorageAsBase64(id: string) {\n return localStorage.getItem(this.keychainLocalStoreIdPrefix + id)\n }\n\n getKeychainValidityDateInBrowserLocalStorage(id: string) {\n return localStorage.getItem(this.keychainValidityDateLocalStoreIdPrefix + id)\n }\n\n // noinspection JSUnusedGlobalSymbols\n loadKeychainFromBrowserLocalStorage(id: string) {\n const lsItem = localStorage.getItem('org.taktik.icure.ehealth.keychain.' + id)\n return lsItem !== null ? b64_2uas(lsItem) : null\n }\n\n /**\n *\n * @param id\n * @param keyPair should be JWK\n */\n storeKeyPair(id: string, keyPair: { publicKey: any; privateKey: any }) {\n if (typeof Storage === 'undefined') {\n console.log('Your browser does not support HTML5 Browser Local Storage !')\n throw 'Your browser does not support HTML5 Browser Local Storage !'\n }\n //TODO encryption\n localStorage.setItem(this.rsaLocalStoreIdPrefix + id, JSON.stringify(keyPair))\n }\n\n /**\n * loads the RSA key pair (hcparty) in JWK from local storage, not imported\n *\n * @param id doc id - hcpartyId\n * @param publicKeyFingerPrint the 32 last characters of public key this private key is associated with\n * @returns {Object} it is in JWK - not imported\n */\n loadKeyPairNotImported(id: string, publicKeyFingerPrint?: string): { publicKey: JsonWebKey; privateKey: JsonWebKey } {\n if (typeof Storage === 'undefined') {\n console.log('Your browser does not support HTML5 Browser Local Storage !')\n throw 'Your browser does not support HTML5 Browser Local Storage !'\n }\n //TODO decryption\n const item =\n (publicKeyFingerPrint && localStorage.getItem(this.rsaLocalStoreIdPrefix + id + '.' + publicKeyFingerPrint)) ??\n localStorage.getItem(this.rsaLocalStoreIdPrefix + id)\n if (!item) {\n console.warn(`No key can be found in local storage for id ${id} and publicKeyFingerPrint ${publicKeyFingerPrint}`)\n }\n return JSON.parse(item!)\n }\n\n /**\n * Loads and imports the RSA key pair (hcparty) from local storage\n *\n * @param id doc id - hcPartyId\n * @returns {Promise} -> {CryptoKey} - imported RSA\n */\n loadKeyPairImported(id: string) {\n return new Promise((resolve: (value: { publicKey: CryptoKey; privateKey: CryptoKey }) => any, reject) => {\n try {\n const jwkKey = localStorage.getItem(this.rsaLocalStoreIdPrefix + id) as string\n if (jwkKey) {\n const jwkKeyPair = JSON.parse(jwkKey)\n if (jwkKeyPair.publicKey && jwkKeyPair.privateKey) {\n this._RSA.importKeyPair('jwk', jwkKeyPair.privateKey, 'jwk', jwkKeyPair.publicKey).then(resolve, (err) => {\n console.log('Error in RSA.importKeyPair: ' + err)\n reject(err)\n })\n } else {\n const message = 'Error in RSA.importKeyPair: Invalid key'\n console.log(message)\n reject(Error(message))\n }\n } else {\n const message = 'Error in RSA.importKeyPair: Missing key'\n console.log(message)\n reject(Error(message))\n }\n } catch (err) {\n reject(err)\n }\n })\n }\n\n async addNewKeyPairForOwnerId(\n maintenanceTasksApi: IccMaintenanceTaskXApi,\n user: User,\n ownerId: string,\n generateTransferKey: boolean = true\n ): Promise<{ dataOwner: HealthcareParty | Patient | Device; publicKey: string; privateKey: string }> {\n return this.addNewKeyPairForOwner(maintenanceTasksApi, user, await this.getDataOwner(ownerId), generateTransferKey)\n }\n\n async addNewKeyPairForOwner(\n maintenanceTasksApi: IccMaintenanceTaskXApi,\n user: User,\n cdo: CachedDataOwner,\n generateTransferKey: boolean = true\n ): Promise<{ dataOwner: HealthcareParty | Patient | Device; publicKey: string; privateKey: string }> {\n const { publicKey, privateKey } = await this.RSA.generateKeyPair()\n const publicKeyHex = ua2hex(await this.RSA.exportKey(publicKey!, 'spki'))\n\n const gen = (await this._AES.generateCryptoKey(true)) as string\n\n await this.cacheKeyPair({ publicKey: await this.RSA.exportKey(publicKey!, 'jwk'), privateKey: await this.RSA.exportKey(privateKey!, 'jwk') })\n\n const { type: ownerType, dataOwner: ownerToUpdate } = await this.createOrUpdateAesExchangeKeysFor(cdo, gen, {\n pubKey: publicKey,\n privKey: privateKey,\n }).then((dataOwnerWithUpdatedAesKeys) =>\n generateTransferKey\n ? this.createOrUpdateTransferKeysFor(dataOwnerWithUpdatedAesKeys, gen, { pubKey: publicKey, privKey: privateKey })\n : dataOwnerWithUpdatedAesKeys\n )\n\n const modifiedDataOwnerAndType =\n ownerType === 'hcp'\n ? await (this.dataOwnerCache[ownerToUpdate.id!] = this.hcpartyBaseApi\n .modifyHealthcareParty(ownerToUpdate as HealthcareParty)\n .then((x) => ({ type: 'hcp', dataOwner: x } as CachedDataOwner)))\n : ownerType === 'patient'\n ? await (this.dataOwnerCache[ownerToUpdate.id!] = this.patientBaseApi\n .modifyPatient(ownerToUpdate as Patient)\n .then((x) => ({ type: 'patient', dataOwner: x } as CachedDataOwner)))\n : await (this.dataOwnerCache[ownerToUpdate.id!] = this.deviceBaseApi\n .updateDevice(ownerToUpdate as Device)\n .then((x) => ({ type: 'device', dataOwner: x } as CachedDataOwner)))\n\n const sentMaintenanceTasks = await this.sendMaintenanceTasks(maintenanceTasksApi, user, modifiedDataOwnerAndType.dataOwner, publicKey)\n\n return {\n dataOwner: sentMaintenanceTasks.length\n ? await this.retrieveDataOwnerInfoAfterPotentialUpdate(modifiedDataOwnerAndType.dataOwner)\n : modifiedDataOwnerAndType.dataOwner,\n publicKey: publicKeyHex,\n privateKey: ua2hex((await this.RSA.exportKey(privateKey!, 'pkcs8')) as ArrayBuffer),\n }\n }\n\n private async createOrUpdateAesExchangeKeysFor(\n cdo: CachedDataOwner,\n decryptedAesExchangeKey: string,\n keyToEncrypt: { pubKey: CryptoKey; privKey: CryptoKey }\n ): Promise<CachedDataOwner> {\n const publicKeyHex = ua2hex(await this.RSA.exportKey(keyToEncrypt.pubKey!, 'spki'))\n const existingAesExchangeKeys = cdo.dataOwner.aesExchangeKeys ?? {}\n existingAesExchangeKeys[publicKeyHex] = await this.encryptAesKeyFor(decryptedAesExchangeKey, cdo.dataOwner, keyToEncrypt.pubKey)\n\n return { type: cdo.type, dataOwner: { ...cdo.dataOwner, aesExchangeKeys: existingAesExchangeKeys } } as CachedDataOwner\n }\n\n private async createOrUpdateTransferKeysFor(\n dataOwner: CachedDataOwner,\n decryptedAesExchangeKey: string,\n keyToEncrypt: { pubKey: CryptoKey; privKey: CryptoKey }\n ): Promise<CachedDataOwner> {\n const pubKeyToEncryptHex = ua2hex(await this.RSA.exportKey(keyToEncrypt.pubKey, 'spki'))\n\n const encryptedKey = ua2hex(\n await this._AES.encrypt(\n await this._AES.importKey('raw', hex2ua(decryptedAesExchangeKey)),\n (await this.RSA.exportKey(keyToEncrypt.privKey!, 'pkcs8')) as ArrayBuffer,\n decryptedAesExchangeKey\n )\n )\n\n const dataOwnerExistingPubKeys = Array.from(await this.getDataOwnerHexPublicKeys(dataOwner.dataOwner))\n\n const transferKeys = fold(dataOwnerExistingPubKeys, dataOwner.dataOwner.transferKeys ?? {}, (pubAcc, pubKeyHex) => {\n if (pubKeyHex !== pubKeyToEncryptHex) {\n const existingKeys = pubAcc[pubKeyHex] ?? {}\n existingKeys[pubKeyToEncryptHex] = encryptedKey\n pubAcc[pubKeyHex] = existingKeys\n }\n return pubAcc\n })\n\n return { type: dataOwner.type, dataOwner: { ...dataOwner.dataOwner, transferKeys: transferKeys } } as CachedDataOwner\n }\n\n private async encryptAesKeyFor(\n aesKey: string,\n dataOwner: HealthcareParty | Patient | Device,\n doNewPublicKey: CryptoKey\n ): Promise<{ [delId: string]: { [pk: string]: string } }> {\n const dataOwnerAllPubKeys = [doNewPublicKey].concat(await this.getDataOwnerPublicKeys(dataOwner))\n\n const encrAes: { [pubKeyFingerprint: string]: string } = {}\n for (const pubKey of dataOwnerAllPubKeys) {\n encrAes[ua2hex(await this.RSA.exportKey(pubKey, 'spki')).slice(-32)] = ua2hex(await this._RSA.encrypt(pubKey, hex2ua(aesKey)))\n }\n\n return { [dataOwner.id!]: encrAes }\n }\n\n private retrieveDataOwnerInfoAfterPotentialUpdate(dataOwnerToUpdate: HealthcareParty | Patient | Device): Promise<CachedDataOwner> {\n return this.getDataOwner(dataOwnerToUpdate.id!).then(({ type, dataOwner }) => {\n return {\n type: type,\n dataOwner: {\n ...dataOwner,\n transferKeys: dataOwnerToUpdate.transferKeys,\n hcPartyKeys: fold(Object.entries(dataOwnerToUpdate.hcPartyKeys ?? {}), dataOwner.hcPartyKeys ?? {}, (acc, [delegateId, hcKeys]) => {\n acc[delegateId] = hcKeys\n return acc\n }),\n aesExchangeKeys: fold(\n Object.entries(dataOwnerToUpdate.aesExchangeKeys ?? {}),\n dataOwner.aesExchangeKeys ?? {},\n (pubAcc, [pubKey, newAesExcKeys]) => {\n const existingKeys = pubAcc[pubKey] ?? {}\n pubAcc[pubKey] = fold(Object.entries(newAesExcKeys), existingKeys, (delAcc, [delId, delKeys]) => {\n delAcc[delId] = delKeys\n return delAcc\n })\n return pubAcc\n }\n ),\n },\n } as CachedDataOwner\n })\n }\n\n private async sendMaintenanceTasks(\n maintenanceTaskApi: IccMaintenanceTaskXApi,\n user: User,\n dataOwner: HealthcareParty | Patient | Device,\n newPublicKey: CryptoKey\n ): Promise<MaintenanceTask[]> {\n const hexNewPubKey = ua2hex(await this.RSA.exportKey(newPublicKey, 'spki'))\n const nonAccessiblePubKeys = Array.from(this.getDataOwnerHexPublicKeys(dataOwner).values())\n .filter((existingPubKey) => existingPubKey != hexNewPubKey)\n .filter(\n (existingPubKey) =>\n !Object.values(this.rsaKeyPairs).find(\n async ({ publicKey, privateKey }) => ua2hex(await this.RSA.exportKey(publicKey, 'spki')) == existingPubKey\n )\n )\n\n if (nonAccessiblePubKeys.length) {\n const tasksForDelegates = Object.entries(await this.getEncryptedAesExchangeKeysForDelegate(dataOwner.id!))\n .filter(([delegatorId]) => delegatorId != dataOwner.id)\n .flatMap(([delegatorId, delegatorKeys]) => {\n return Object.entries(delegatorKeys).flatMap(([, aesExchangeKeys]) => {\n return Object.keys(aesExchangeKeys).map((delegatePubKey) => {\n return { delegateId: delegatorId, maintenanceTask: this.createMaintenanceTask(dataOwner, delegatePubKey) }\n })\n })\n })\n\n const tasksForDelegator = Object.entries(await this.getEncryptedAesExchangeKeys(dataOwner, dataOwner.id!)).flatMap(\n ([doPubKey, delegateKeys]) => {\n return Object.keys(delegateKeys)\n .filter((delegateId) => delegateId != dataOwner.id)\n .map((delegateId) => {\n return { delegateId: delegateId, maintenanceTask: this.createMaintenanceTask(dataOwner, doPubKey) }\n })\n }\n )\n\n return Promise.all(\n tasksForDelegates\n .concat(tasksForDelegator)\n .map(async ({ delegateId, maintenanceTask }) => {\n const taskToCreate = await maintenanceTaskApi?.newInstance(user, maintenanceTask, [delegateId])\n return taskToCreate ? maintenanceTaskApi?.createMaintenanceTaskWithUser(user, taskToCreate) : undefined\n })\n .filter((createdTask) => createdTask != undefined)\n )\n } else {\n return []\n }\n }\n\n private createMaintenanceTask(concernedDataOwner: HealthcareParty | Patient | Device, concernedPubKey: string) {\n return new MaintenanceTask({\n id: this.randomUuid(),\n taskType: 'updateAesExchangeKey',\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: concernedDataOwner.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: concernedPubKey,\n }),\n }),\n ],\n })\n }\n\n private getDataOwnerHexPublicKeys(dataOwner: HealthcareParty | Patient | Device): Set<string> {\n return new Set(\n (dataOwner.publicKey ? [dataOwner.publicKey] : [])\n .concat(dataOwner.aesExchangeKeys ? Object.keys(dataOwner.aesExchangeKeys) : [])\n .filter((pubKey) => !!pubKey)\n )\n }\n\n private async getDataOwnerPublicKeys(dataOwner: HealthcareParty | Patient | Device): Promise<CryptoKey[]> {\n return await Promise.all(\n Array.from(this.getDataOwnerHexPublicKeys(dataOwner)).map(\n async (pubKey) => await this._RSA.importKey('jwk', spkiToJwk(hex2ua(pubKey)), ['encrypt'])\n )\n )\n }\n\n generateKeyForDelegate(ownerId: string, delegateId: string): PromiseLike<HealthcareParty | Patient> {\n //Preload hcp and patient because we need them and they are going to be invalidated from the caches\n return notConcurrent(this.generateKeyConcurrencyMap, ownerId, async () => {\n const [{ type: ownerType, dataOwner: owner }, { dataOwner: delegate }] = await Promise.all([\n this.getDataOwner(ownerId),\n this.getDataOwner(delegateId),\n ])\n\n const ownerLegacyPublicKey = owner.publicKey\n\n const availablePublicKeysFingerprints = Object.keys(this.rsaKeyPairs)\n const availableOwnerPublicKeys = [\n ownerLegacyPublicKey,\n ...Object.keys(owner.aesExchangeKeys || {}).filter((x) => x !== ownerLegacyPublicKey),\n ].filter((k) => !!k && availablePublicKeysFingerprints.some((fp) => k.endsWith(fp))) as string[]\n const selectedPublicKey = availableOwnerPublicKeys[0]\n\n if (!selectedPublicKey) {\n throw new Error(`Invalid owner, no public key, keypairs have not be set for ${ownerId}`)\n }\n\n if (\n ((owner.hcPartyKeys || {})[delegateId] && owner.publicKey && availablePublicKeysFingerprints.includes(owner.publicKey.slice(-32))) ||\n Object.values(owner.aesExchangeKeys || {}).some(\n (x) => x[delegateId] && Object.keys(x[delegateId]).some((k) => availablePublicKeysFingerprints.includes(k))\n )\n ) {\n return owner\n }\n\n let ownerCombinedAesExchangeKeys = owner.aesExchangeKeys ?? {}\n\n if (ownerLegacyPublicKey && !(owner.aesExchangeKeys ?? {})[ownerLegacyPublicKey]) {\n //Transfer keys from old structure (hcparty keys) to new one (aesExchangeKeys)\n const unknownDataOwnerCounterPartIds = Object.keys(owner.hcPartyKeys ?? {}).filter((x) => x !== ownerId && x !== delegateId)\n const counterParts = [\n owner,\n delegate,\n ...(await Promise.all(unknownDataOwnerCounterPartIds.map((cpid) => this.getDataOwner(cpid).then((dot) => dot.dataOwner)))),\n ]\n ownerCombinedAesExchangeKeys = {\n [ownerLegacyPublicKey]: Object.entries(owner.hcPartyKeys ?? {}).reduce(\n (map, [hcpId, keys]) => ({\n ...map,\n [hcpId]: { [ownerLegacyPublicKey]: keys[0], [counterParts.find((x) => x.id === hcpId)?.publicKey ?? '']: keys[1] },\n ...{},\n }),\n {}\n ),\n ...ownerCombinedAesExchangeKeys,\n }\n }\n\n const delegatePublicKeys = [delegate.publicKey, ...Object.keys(delegate.aesExchangeKeys ?? {}).filter((x) => x !== delegate.publicKey)].filter(\n (x) => !!x\n ) as string[]\n if (!delegatePublicKeys.length) {\n throw new Error(`Invalid delegate, no public key, keypairs have not be set for ${delegateId}`)\n }\n const genProm = this._AES.generateCryptoKey(true).then(async (AESKey) => {\n const allPubKeys = [...availableOwnerPublicKeys, ...delegatePublicKeys]\n const encryptedAesKeys = await allPubKeys.reduce(\n async (map, pubK) => ({\n ...(await map),\n [pubK.slice(-32)]: ua2hex(\n await this._RSA.encrypt(await this._RSA.importKey('jwk', spkiToJwk(hex2ua(pubK)), ['encrypt']), hex2ua(AESKey as string))\n ),\n }),\n Promise.resolve({} as { [pubKey: string]: string })\n )\n\n if (delegate.publicKey && ownerLegacyPublicKey) {\n owner.hcPartyKeys![delegateId] = [encryptedAesKeys[ownerLegacyPublicKey.slice(-32)], encryptedAesKeys[delegate.publicKey.slice(-32)]]\n }\n owner.aesExchangeKeys = {\n ...(ownerCombinedAesExchangeKeys ?? {}),\n [selectedPublicKey]: { ...(owner.aesExchangeKeys?.[selectedPublicKey] ?? {}), [delegateId]: encryptedAesKeys },\n }\n\n return new Promise<['hcp', HealthcareParty] | ['patient', Patient] | ['device', Device]>((resolve, reject) => {\n ownerType === 'hcp'\n ? (this.dataOwnerCache[owner.id!] = this.hcpartyBaseApi\n .modifyHealthcareParty(owner as HealthcareParty)\n .then((x) => ({ type: 'hcp', dataOwner: x } as CachedDataOwner)))\n .then((x) => resolve(['hcp', x.dataOwner]))\n .catch((e) => reject(e))\n : ownerType === 'patient'\n ? (this.dataOwnerCache[owner.id!] = this.patientBaseApi.modifyPatient(owner as Patient).then((x) => ({ type: 'patient', dataOwner: x })))\n .then((x) => resolve(['patient', x.dataOwner]))\n .catch((e) => reject(e))\n : (this.dataOwnerCache[owner.id!] = this.deviceBaseApi.updateDevice(owner as Device).then((x) => ({ type: 'device', dataOwner: x })))\n .then((x) => resolve(['device', x.dataOwner]))\n .catch((e) => reject(e))\n })\n })\n\n this.hcPartyKeysRequestsCache[delegateId] = genProm.then(() => {\n return this.forceGetEncryptedAesExchangeKeysForDelegate(delegateId)\n })\n return genProm.then((res) => {\n return res[1]\n })\n })\n }\n\n getDataOwner(ownerId: string) {\n return (\n this.dataOwnerCache[ownerId] ??\n (this.dataOwnerCache[ownerId] = this.patientBaseApi\n .getPatient(ownerId)\n .then((x) => ({ type: 'patient', dataOwner: x } as CachedDataOwner))\n .catch(() => this.deviceBaseApi.getDevice(ownerId).then((x) => ({ type: 'device', dataOwner: x } as CachedDataOwner)))\n .catch(() => this.hcpartyBaseApi.getHealthcareParty(ownerId).then((x) => ({ type: 'hcp', dataOwner: x } as CachedDataOwner)))\n .catch((e) => {\n delete this.dataOwnerCache[ownerId]\n throw e\n }))\n )\n }\n\n // noinspection JSUnusedGlobalSymbols\n async checkPrivateKeyValidity(dataOwner: HealthcareParty | Patient | Device): Promise<boolean> {\n const publicKeys = Array.from(new Set([dataOwner.publicKey].concat(Object.keys(dataOwner.aesExchangeKeys ?? {})).filter((x) => !!x))) as string[]\n\n return await publicKeys.reduce(async (pres, publicKey) => {\n const res = await pres\n if (res) {\n return true\n }\n try {\n const k = await this._RSA.importKey('jwk', spkiToJwk(hex2ua(publicKey)), ['encrypt'])\n const cipher = await this._RSA.encrypt(k, utf8_2ua('shibboleth'))\n const kp = this.loadKeyPairNotImported(dataOwner.id!, publicKey.slice(-32))\n const plainText = await this._RSA\n .importKeyPair('jwk', kp.privateKey, 'jwk', kp.publicKey)\n .then((ikp) => this._RSA.decrypt(ikp.privateKey, new Uint8Array(cipher)))\n .then((x) => ua2utf8(x))\n return plainText === 'shibboleth'\n } catch (e) {\n return false\n }\n }, Promise.resolve(false))\n }\n\n private throwDetailedExceptionForInvalidParameter(argName: string, argValue: any, methodName: string, methodArgs: any) {\n if (argValue) return\n\n let details = '\\nMethod name: icc-crypto-x-api.' + methodName + '()\\nArguments:'\n\n if (methodArgs) {\n try {\n const argsArray = [...methodArgs]\n _.each(argsArray, (arg, index) => (details += '\\n[' + index + ']: ' + JSON.stringify(arg)))\n } catch (ex) {\n details += '; a problem occured while logging arguments details: ' + ex\n }\n }\n\n throw '### THIS SHOULD NOT HAPPEN: ' + argName + ' has an invalid value: ' + argValue + details\n }\n\n async getEncryptionDecryptionKeys(dataOwnerId: string, document: EncryptedEntity): Promise<Array<string> | undefined> {\n try {\n return !document.id\n ? undefined\n : _.uniq(\n (\n await this.extractKeysFromDelegationsForHcpHierarchy(\n dataOwnerId,\n document.id,\n (document.encryptionKeys && Object.keys(document.encryptionKeys).length && document.encryptionKeys) || document.delegations!\n )\n ).extractedKeys\n )\n } catch (e) {\n return undefined\n }\n }\n\n async encryptDecrypt(\n method: 'encrypt' | 'decrypt',\n content: Uint8Array | ArrayBuffer,\n edKey?: string,\n user?: User,\n documentObject?: Document\n ): Promise<Uint8Array | Array<any> | any> {\n if (!content || !(edKey || (user?.healthcarePartyId && documentObject))) return content\n\n if (edKey) {\n const importedEdKey = await this._AES.importKey('raw', hex2ua(edKey.replace(/-/g, '')))\n try {\n return await this._AES[method](importedEdKey, content)\n } catch (e) {\n return content\n }\n }\n\n const sfks = await this.extractKeysFromDelegationsForHcpHierarchy(user?.healthcarePartyId!, documentObject?.id!, documentObject?.encryptionKeys!)\n const importedEdKey = await this._AES.importKey('raw', hex2ua(sfks.extractedKeys[0].replace(/-/g, '')))\n try {\n return await this._AES[method](importedEdKey, content)\n } catch (e) {\n return content\n }\n }\n}\n"]}
@@ -66,4 +66,4 @@ export interface Apis {
66
66
  messageApi: IccMessageXApi;
67
67
  maintenanceTaskApi: IccMaintenanceTaskXApi;
68
68
  }
69
- export declare const Api: (host: string, username: string, password: string, crypto?: Crypto, fetchImpl?: (input: RequestInfo, init?: RequestInit) => Promise<Response>, forceBasic?: boolean) => Promise<Apis>;
69
+ export declare const Api: (host: string, username: string, password: string, crypto?: Crypto, fetchImpl?: (input: RequestInfo, init?: RequestInit) => Promise<Response>, forceBasic?: boolean, autoLogin?: boolean) => Promise<Apis>;
@@ -74,7 +74,7 @@ const Api = function (host, username, password, crypto = typeof window !== 'unde
74
74
  ? window.fetch
75
75
  : typeof self !== 'undefined'
76
76
  ? self.fetch
77
- : fetch, forceBasic = false) {
77
+ : fetch, forceBasic = false, autoLogin = true) {
78
78
  return __awaiter(this, void 0, void 0, function* () {
79
79
  const headers = (0, exports.apiHeaders)(username, password, forceBasic);
80
80
  const authApi = new icc_api_1.IccAuthApi(host, headers, fetchImpl);
@@ -101,11 +101,16 @@ const Api = function (host, username, password, crypto = typeof window !== 'unde
101
101
  const patientApi = new icc_patient_x_api_1.IccPatientXApi(host, headers, cryptoApi, contactApi, formApi, healthcareElementApi, invoiceApi, documentApi, healthcarePartyApi, classificationApi, userApi, calendarItemApi, ['note'], fetchImpl);
102
102
  const messageApi = new icc_message_x_api_1.IccMessageXApi(host, headers, cryptoApi, userApi, fetchImpl);
103
103
  const maintenanceTaskApi = new icc_maintenance_task_x_api_1.IccMaintenanceTaskXApi(host, headers, cryptoApi, userApi, healthcarePartyApi, ['properties'], fetchImpl);
104
- try {
105
- yield (0, utils_1.retry)(() => authApi.login({ username, password }), 3, 1000, 1.5);
104
+ if (autoLogin) {
105
+ try {
106
+ yield (0, utils_1.retry)(() => authApi.login({ username, password }), 3, 1000, 1.5);
107
+ }
108
+ catch (e) {
109
+ console.error('Incorrect user and password used to instantiate Api, or network problem', e);
110
+ }
106
111
  }
107
- catch (e) {
108
- console.error('Incorrect user and password used to instantiate Api, or network problem', e);
112
+ else {
113
+ console.info('Auto login skipped');
109
114
  }
110
115
  return {
111
116
  cryptoApi,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../icc-x-api/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { IccAgendaApi, IccAuthApi, IccEntityrefApi, IccGroupApi, IccInsuranceApi, IccPatientApi, IccPermissionApi } from '../icc-api'\nimport { IccUserXApi } from './icc-user-x-api'\nimport { IccCryptoXApi } from './icc-crypto-x-api'\nimport { IccContactXApi } from './icc-contact-x-api'\nimport { IccInvoiceXApi } from './icc-invoice-x-api'\nimport { IccDocumentXApi } from './icc-document-x-api'\nimport { IccHcpartyXApi } from './icc-hcparty-x-api'\nimport { IccFormXApi } from './icc-form-x-api'\nimport { IccHelementXApi } from './icc-helement-x-api'\nimport { IccClassificationXApi } from './icc-classification-x-api'\nimport { IccCalendarItemXApi } from './icc-calendar-item-x-api'\nimport { IccPatientXApi } from './icc-patient-x-api'\nimport { IccMessageXApi } from './icc-message-x-api'\nimport { IccReceiptXApi } from './icc-receipt-x-api'\nimport { IccAccesslogXApi } from './icc-accesslog-x-api'\nimport { IccTimeTableXApi } from './icc-time-table-x-api'\nimport { IccDeviceApi } from '../icc-api/api/IccDeviceApi'\nimport { IccCodeXApi } from './icc-code-x-api'\nimport { IccMaintenanceTaskXApi } from './icc-maintenance-task-x-api'\nimport { retry } from './utils'\n\nexport * from './icc-accesslog-x-api'\nexport * from './icc-bekmehr-x-api'\nexport * from './icc-calendar-item-x-api'\nexport * from './icc-classification-x-api'\nexport * from './icc-code-x-api'\nexport * from './icc-contact-x-api'\nexport * from './icc-crypto-x-api'\nexport * from './icc-doctemplate-x-api'\nexport * from './icc-document-x-api'\nexport * from './icc-form-x-api'\nexport * from './icc-hcparty-x-api'\nexport * from './icc-helement-x-api'\nexport * from './icc-invoice-x-api'\nexport * from './icc-message-x-api'\nexport * from './icc-patient-x-api'\nexport * from './icc-user-x-api'\nexport * from './icc-time-table-x-api'\nexport * from './icc-receipt-x-api'\nexport * from './utils'\n\nexport const apiHeaders = function (username: string, password: string, forceBasic: boolean = false) {\n return {\n Authorization: `Basic ${\n typeof btoa !== 'undefined' ? btoa(`${username}:${password}`) : Buffer.from(`${username}:${password}`).toString('base64')\n }`,\n 'force-authentication': forceBasic ? 'true' : 'false',\n }\n}\n\nexport interface Apis {\n authApi: IccAuthApi\n codeApi: IccCodeXApi\n entityReferenceApi: IccEntityrefApi\n userApi: IccUserXApi\n permissionApi: IccPermissionApi\n healthcarePartyApi: IccHcpartyXApi\n deviceApi: IccDeviceApi\n cryptoApi: IccCryptoXApi\n accessLogApi: IccAccesslogXApi\n agendaApi: IccAgendaApi\n contactApi: IccContactXApi\n formApi: IccFormXApi\n groupApi: IccGroupApi\n invoiceApi: IccInvoiceXApi\n insuranceApi: IccInsuranceApi\n documentApi: IccDocumentXApi\n healthcareElementApi: IccHelementXApi\n classificationApi: IccClassificationXApi\n calendarItemApi: IccCalendarItemXApi\n receiptApi: IccReceiptXApi\n timetableApi: IccTimeTableXApi\n patientApi: IccPatientXApi\n messageApi: IccMessageXApi\n maintenanceTaskApi: IccMaintenanceTaskXApi\n}\n\nexport const Api = async function (\n host: string,\n username: string,\n password: string,\n crypto: Crypto = typeof window !== 'undefined' ? window.crypto : typeof self !== 'undefined' ? self.crypto : ({} as Crypto),\n fetchImpl: (input: RequestInfo, init?: RequestInit) => Promise<Response> = typeof window !== 'undefined'\n ? window.fetch\n : typeof self !== 'undefined'\n ? self.fetch\n : fetch,\n forceBasic: boolean = false\n): Promise<Apis> {\n const headers = apiHeaders(username, password, forceBasic)\n const authApi = new IccAuthApi(host, headers, fetchImpl)\n const codeApi = new IccCodeXApi(host, headers, fetchImpl)\n const entityReferenceApi = new IccEntityrefApi(host, headers, fetchImpl)\n const userApi = new IccUserXApi(host, headers, fetchImpl)\n const permissionApi = new IccPermissionApi(host, headers, fetchImpl)\n const healthcarePartyApi = new IccHcpartyXApi(host, headers, fetchImpl)\n const deviceApi = new IccDeviceApi(host, headers, fetchImpl)\n const cryptoApi = new IccCryptoXApi(host, headers, healthcarePartyApi, new IccPatientApi(host, headers, fetchImpl), deviceApi, crypto)\n const accessLogApi = new IccAccesslogXApi(host, headers, cryptoApi, userApi, fetchImpl)\n const agendaApi = new IccAgendaApi(host, headers, fetchImpl)\n const contactApi = new IccContactXApi(host, headers, cryptoApi, userApi, fetchImpl)\n const formApi = new IccFormXApi(host, headers, cryptoApi, userApi, fetchImpl)\n const groupApi = new IccGroupApi(host, headers)\n const invoiceApi = new IccInvoiceXApi(host, headers, cryptoApi, entityReferenceApi, userApi, fetchImpl)\n const insuranceApi = new IccInsuranceApi(host, headers, fetchImpl)\n const documentApi = new IccDocumentXApi(host, headers, cryptoApi, authApi, userApi, fetchImpl)\n const healthcareElementApi = new IccHelementXApi(host, headers, cryptoApi, userApi, ['descr', 'note'], fetchImpl)\n const classificationApi = new IccClassificationXApi(host, headers, cryptoApi, userApi, fetchImpl)\n const calendarItemApi = new IccCalendarItemXApi(host, headers, cryptoApi, userApi, ['details', 'title', 'patientId'], fetchImpl)\n const receiptApi = new IccReceiptXApi(host, headers, cryptoApi, userApi, fetchImpl)\n const timetableApi = new IccTimeTableXApi(host, headers, cryptoApi, userApi, fetchImpl)\n const patientApi = new IccPatientXApi(\n host,\n headers,\n cryptoApi,\n contactApi,\n formApi,\n healthcareElementApi,\n invoiceApi,\n documentApi,\n healthcarePartyApi,\n classificationApi,\n userApi,\n calendarItemApi,\n ['note'],\n fetchImpl\n )\n const messageApi = new IccMessageXApi(host, headers, cryptoApi, userApi, fetchImpl)\n const maintenanceTaskApi = new IccMaintenanceTaskXApi(host, headers, cryptoApi, userApi, healthcarePartyApi, ['properties'], fetchImpl)\n\n try {\n await retry(() => authApi.login({ username, password }), 3, 1000, 1.5)\n } catch (e) {\n console.error('Incorrect user and password used to instantiate Api, or network problem', e)\n }\n\n return {\n cryptoApi,\n authApi,\n codeApi,\n userApi,\n permissionApi,\n patientApi,\n healthcarePartyApi,\n deviceApi,\n accessLogApi,\n contactApi,\n healthcareElementApi,\n documentApi,\n formApi,\n invoiceApi,\n insuranceApi,\n messageApi,\n entityReferenceApi,\n receiptApi,\n agendaApi,\n calendarItemApi,\n classificationApi,\n timetableApi,\n groupApi,\n maintenanceTaskApi,\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../icc-x-api/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { IccAgendaApi, IccAuthApi, IccEntityrefApi, IccGroupApi, IccInsuranceApi, IccPatientApi, IccPermissionApi } from '../icc-api'\nimport { IccUserXApi } from './icc-user-x-api'\nimport { IccCryptoXApi } from './icc-crypto-x-api'\nimport { IccContactXApi } from './icc-contact-x-api'\nimport { IccInvoiceXApi } from './icc-invoice-x-api'\nimport { IccDocumentXApi } from './icc-document-x-api'\nimport { IccHcpartyXApi } from './icc-hcparty-x-api'\nimport { IccFormXApi } from './icc-form-x-api'\nimport { IccHelementXApi } from './icc-helement-x-api'\nimport { IccClassificationXApi } from './icc-classification-x-api'\nimport { IccCalendarItemXApi } from './icc-calendar-item-x-api'\nimport { IccPatientXApi } from './icc-patient-x-api'\nimport { IccMessageXApi } from './icc-message-x-api'\nimport { IccReceiptXApi } from './icc-receipt-x-api'\nimport { IccAccesslogXApi } from './icc-accesslog-x-api'\nimport { IccTimeTableXApi } from './icc-time-table-x-api'\nimport { IccDeviceApi } from '../icc-api/api/IccDeviceApi'\nimport { IccCodeXApi } from './icc-code-x-api'\nimport { IccMaintenanceTaskXApi } from './icc-maintenance-task-x-api'\nimport { retry } from './utils'\n\nexport * from './icc-accesslog-x-api'\nexport * from './icc-bekmehr-x-api'\nexport * from './icc-calendar-item-x-api'\nexport * from './icc-classification-x-api'\nexport * from './icc-code-x-api'\nexport * from './icc-contact-x-api'\nexport * from './icc-crypto-x-api'\nexport * from './icc-doctemplate-x-api'\nexport * from './icc-document-x-api'\nexport * from './icc-form-x-api'\nexport * from './icc-hcparty-x-api'\nexport * from './icc-helement-x-api'\nexport * from './icc-invoice-x-api'\nexport * from './icc-message-x-api'\nexport * from './icc-patient-x-api'\nexport * from './icc-user-x-api'\nexport * from './icc-time-table-x-api'\nexport * from './icc-receipt-x-api'\nexport * from './utils'\n\nexport const apiHeaders = function (username: string, password: string, forceBasic = false) {\n return {\n Authorization: `Basic ${\n typeof btoa !== 'undefined' ? btoa(`${username}:${password}`) : Buffer.from(`${username}:${password}`).toString('base64')\n }`,\n 'force-authentication': forceBasic ? 'true' : 'false',\n }\n}\n\nexport interface Apis {\n authApi: IccAuthApi\n codeApi: IccCodeXApi\n entityReferenceApi: IccEntityrefApi\n userApi: IccUserXApi\n permissionApi: IccPermissionApi\n healthcarePartyApi: IccHcpartyXApi\n deviceApi: IccDeviceApi\n cryptoApi: IccCryptoXApi\n accessLogApi: IccAccesslogXApi\n agendaApi: IccAgendaApi\n contactApi: IccContactXApi\n formApi: IccFormXApi\n groupApi: IccGroupApi\n invoiceApi: IccInvoiceXApi\n insuranceApi: IccInsuranceApi\n documentApi: IccDocumentXApi\n healthcareElementApi: IccHelementXApi\n classificationApi: IccClassificationXApi\n calendarItemApi: IccCalendarItemXApi\n receiptApi: IccReceiptXApi\n timetableApi: IccTimeTableXApi\n patientApi: IccPatientXApi\n messageApi: IccMessageXApi\n maintenanceTaskApi: IccMaintenanceTaskXApi\n}\n\nexport const Api = async function (\n host: string,\n username: string,\n password: string,\n crypto: Crypto = typeof window !== 'undefined' ? window.crypto : typeof self !== 'undefined' ? self.crypto : ({} as Crypto),\n fetchImpl: (input: RequestInfo, init?: RequestInit) => Promise<Response> = typeof window !== 'undefined'\n ? window.fetch\n : typeof self !== 'undefined'\n ? self.fetch\n : fetch,\n forceBasic = false,\n autoLogin = true\n): Promise<Apis> {\n const headers = apiHeaders(username, password, forceBasic)\n const authApi = new IccAuthApi(host, headers, fetchImpl)\n const codeApi = new IccCodeXApi(host, headers, fetchImpl)\n const entityReferenceApi = new IccEntityrefApi(host, headers, fetchImpl)\n const userApi = new IccUserXApi(host, headers, fetchImpl)\n const permissionApi = new IccPermissionApi(host, headers, fetchImpl)\n const healthcarePartyApi = new IccHcpartyXApi(host, headers, fetchImpl)\n const deviceApi = new IccDeviceApi(host, headers, fetchImpl)\n const cryptoApi = new IccCryptoXApi(host, headers, healthcarePartyApi, new IccPatientApi(host, headers, fetchImpl), deviceApi, crypto)\n const accessLogApi = new IccAccesslogXApi(host, headers, cryptoApi, userApi, fetchImpl)\n const agendaApi = new IccAgendaApi(host, headers, fetchImpl)\n const contactApi = new IccContactXApi(host, headers, cryptoApi, userApi, fetchImpl)\n const formApi = new IccFormXApi(host, headers, cryptoApi, userApi, fetchImpl)\n const groupApi = new IccGroupApi(host, headers)\n const invoiceApi = new IccInvoiceXApi(host, headers, cryptoApi, entityReferenceApi, userApi, fetchImpl)\n const insuranceApi = new IccInsuranceApi(host, headers, fetchImpl)\n const documentApi = new IccDocumentXApi(host, headers, cryptoApi, authApi, userApi, fetchImpl)\n const healthcareElementApi = new IccHelementXApi(host, headers, cryptoApi, userApi, ['descr', 'note'], fetchImpl)\n const classificationApi = new IccClassificationXApi(host, headers, cryptoApi, userApi, fetchImpl)\n const calendarItemApi = new IccCalendarItemXApi(host, headers, cryptoApi, userApi, ['details', 'title', 'patientId'], fetchImpl)\n const receiptApi = new IccReceiptXApi(host, headers, cryptoApi, userApi, fetchImpl)\n const timetableApi = new IccTimeTableXApi(host, headers, cryptoApi, userApi, fetchImpl)\n const patientApi = new IccPatientXApi(\n host,\n headers,\n cryptoApi,\n contactApi,\n formApi,\n healthcareElementApi,\n invoiceApi,\n documentApi,\n healthcarePartyApi,\n classificationApi,\n userApi,\n calendarItemApi,\n ['note'],\n fetchImpl\n )\n const messageApi = new IccMessageXApi(host, headers, cryptoApi, userApi, fetchImpl)\n const maintenanceTaskApi = new IccMaintenanceTaskXApi(host, headers, cryptoApi, userApi, healthcarePartyApi, ['properties'], fetchImpl)\n\n if (autoLogin) {\n try {\n await retry(() => authApi.login({ username, password }), 3, 1000, 1.5)\n } catch (e) {\n console.error('Incorrect user and password used to instantiate Api, or network problem', e)\n }\n } else {\n console.info('Auto login skipped')\n }\n\n return {\n cryptoApi,\n authApi,\n codeApi,\n userApi,\n permissionApi,\n patientApi,\n healthcarePartyApi,\n deviceApi,\n accessLogApi,\n contactApi,\n healthcareElementApi,\n documentApi,\n formApi,\n invoiceApi,\n insuranceApi,\n messageApi,\n entityReferenceApi,\n receiptApi,\n agendaApi,\n calendarItemApi,\n classificationApi,\n timetableApi,\n groupApi,\n maintenanceTaskApi,\n }\n}\n"]}
@@ -90,7 +90,8 @@ function spkiToJwk(buf) {
90
90
  if (asn1.type === 0x30 &&
91
91
  ((_b = (_a = asn1.children) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.type) === 0x30 &&
92
92
  ((_f = (_e = (_d = (_c = asn1.children) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d.children) === null || _e === void 0 ? void 0 : _e[0]) === null || _f === void 0 ? void 0 : _f.type) === 0x06 &&
93
- (0, binary_utils_1.ua2hex)((_l = (_k = (_j = (_h = (_g = asn1.children) === null || _g === void 0 ? void 0 : _g[0]) === null || _h === void 0 ? void 0 : _h.children) === null || _j === void 0 ? void 0 : _j[0]) === null || _k === void 0 ? void 0 : _k.value) !== null && _l !== void 0 ? _l : new Uint8Array(0)) === '2a864886f70d010101') {
93
+ (0, binary_utils_1.ua2hex)((_l = (_k = (_j = (_h = (_g = asn1.children) === null || _g === void 0 ? void 0 : _g[0]) === null || _h === void 0 ? void 0 : _h.children) === null || _j === void 0 ? void 0 : _j[0]) === null || _k === void 0 ? void 0 : _k.value) !== null && _l !== void 0 ? _l : new Uint8Array(0)) === '2a864886f70d010101' // pragma: allowlist secret
94
+ ) {
94
95
  modulus = (_s = (_r = (_q = (_p = (_o = (_m = asn1.children) === null || _m === void 0 ? void 0 : _m[1]) === null || _o === void 0 ? void 0 : _o.children) === null || _p === void 0 ? void 0 : _p[0]) === null || _q === void 0 ? void 0 : _q.children) === null || _r === void 0 ? void 0 : _r[0]) === null || _s === void 0 ? void 0 : _s.value;
95
96
  exponent = (_y = (_x = (_w = (_v = (_u = (_t = asn1.children) === null || _t === void 0 ? void 0 : _t[1]) === null || _u === void 0 ? void 0 : _u.children) === null || _v === void 0 ? void 0 : _v[0]) === null || _w === void 0 ? void 0 : _w.children) === null || _x === void 0 ? void 0 : _x[1]) === null || _y === void 0 ? void 0 : _y.value;
96
97
  }
@@ -1 +1 @@
1
- {"version":3,"file":"crypto-utils.js","sourceRoot":"","sources":["../../../icc-x-api/utils/crypto-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import * as mm from 'moment'\nimport { Moment } from 'moment'\nimport * as _ from 'lodash'\nimport { a2b, b2a, b64Url2ua, string2ua, ua2b64Url, ua2hex, ua2string } from '../utils/binary-utils'\nimport { pack } from './asn1-packer'\nimport { parseAsn1 } from './asn1-parser'\n\nexport function notConcurrent<T>(concurrencyMap: { [key: string]: PromiseLike<T> }, key: string, proc: () => PromiseLike<T>): PromiseLike<T> {\n const inFlight = concurrencyMap[key]\n if (!inFlight) {\n return (concurrencyMap[key] = (async () => {\n try {\n return await proc()\n } finally {\n delete concurrencyMap[key]\n }\n })())\n } else {\n return concurrencyMap[key].then(() => notConcurrent(concurrencyMap, key, proc))\n }\n}\n\nexport function jwk2pkcs8(jwk: any): string {\n return pack([\n 0x30,\n [\n [0x02, '00'],\n [0x30, [[0x06, '2a864886f70d010101'], [0x05]]],\n [\n 0x04,\n [\n [\n 0x30,\n [\n [0x02, '00'],\n [0x02, ua2hex(b64Url2ua(jwk.n))],\n [0x02, ua2hex(b64Url2ua(jwk.e))],\n [0x02, ua2hex(b64Url2ua(jwk.d))],\n [0x02, ua2hex(b64Url2ua(jwk.p))],\n [0x02, ua2hex(b64Url2ua(jwk.q))],\n [0x02, ua2hex(b64Url2ua(jwk.dp))],\n [0x02, ua2hex(b64Url2ua(jwk.dq))],\n [0x02, ua2hex(b64Url2ua(jwk.qi))],\n ],\n ],\n ],\n ],\n ],\n ])\n}\n\nexport function jwk2spki(jwk: any): string {\n return pack([\n 0x30,\n [\n [0x30, [[0x06, '2a864886f70d010101'], [0x05]]],\n [\n 0x03,\n [\n [\n 0x30,\n [\n [0x02, ua2hex(b64Url2ua(jwk.n))],\n [0x02, ua2hex(b64Url2ua(jwk.e))],\n ],\n ],\n ],\n ],\n ],\n ])\n}\n\nexport function spkiToJwk(buf: Uint8Array): { kty: string; alg: string; n: string; e: string; ext: boolean } {\n const asn1 = parseAsn1(new Uint8Array(buf))\n\n var modulus: Uint8Array | undefined = undefined\n var exponent: Uint8Array | undefined = undefined\n if (\n asn1.type === 0x30 &&\n asn1.children?.[0]?.type === 0x30 &&\n asn1.children?.[0]?.children?.[0]?.type === 0x06 &&\n ua2hex(asn1.children?.[0]?.children?.[0]?.value ?? new Uint8Array(0)) === '2a864886f70d010101'\n ) {\n modulus = asn1.children?.[1]?.children?.[0]?.children?.[0]?.value\n exponent = asn1.children?.[1]?.children?.[0]?.children?.[1]?.value\n } else if (asn1.type === 0x30 && asn1.children?.[0]?.type === 0x02 && asn1.children?.[1]?.type === 0x02) {\n modulus = asn1.children?.[0]?.value\n exponent = asn1.children?.[1]?.value\n }\n\n if (!modulus || !exponent) {\n throw new Error('Invalid spki format')\n }\n return {\n kty: 'RSA',\n alg: 'RSA-OAEP',\n ext: true,\n n: ua2b64Url(minimalRep(modulus)),\n e: ua2b64Url(minimalRep(exponent)),\n }\n}\n\nexport function pkcs8ToJwk(buf: Uint8Array | ArrayBuffer) {\n const parsed = parseAsn1(new Uint8Array(buf))\n const seq =\n parsed.children?.length === 3 && parsed.children[2].type === 0x04 && parsed.children[2].children?.length === 1\n ? parsed.children[2].children[0]\n : parsed\n return {\n kty: 'RSA',\n n: ua2b64Url(minimalRep(seq.children![1].value as Uint8Array)),\n e: ua2b64Url(minimalRep(seq.children![2].value as Uint8Array)),\n d: ua2b64Url(minimalRep(seq.children![3].value as Uint8Array)),\n p: ua2b64Url(minimalRep(seq.children![4].value as Uint8Array)),\n q: ua2b64Url(minimalRep(seq.children![5].value as Uint8Array)),\n dp: ua2b64Url(minimalRep(seq.children![6].value as Uint8Array)),\n dq: ua2b64Url(minimalRep(seq.children![7].value as Uint8Array)),\n qi: ua2b64Url(minimalRep(seq.children![8].value as Uint8Array)),\n }\n}\n\nfunction minimalRep(b: Uint8Array) {\n let i = 0\n while (b[i] === 0) {\n i++\n }\n return b.slice(i)\n}\n\n/**\n * Provide a view over the given Uint8Array where any trailing null bytes at\n * the end are truncated.\n *\n * This can be used to ignore null bytes at the end of a padded UTF-8 string\n * without needing to copy that string, assuming code point U+0000 is encoded\n * in one null byte according to standards rather than in a multi-byte\n * overlong form.\n */\nexport function truncateTrailingNulls(a: Uint8Array) {\n let end = a.byteLength - 1\n while (a[end] === 0 && end >= 0) {\n end--\n }\n // end is now either the last non-null position in a or -1; in the latter\n // case the returned array will have length 0.\n return a.subarray(0, end + 1)\n}\n\n/**\n *\n * @param buffer1 {Uint8Array}\n * @param buffer2{ Uint8Array}\n * @returns {ArrayBuffer}\n */\nexport function appendBuffer(buffer1: ArrayBuffer, buffer2: ArrayBuffer): ArrayBuffer {\n const tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength)\n tmp.set(new Uint8Array(buffer1), 0)\n tmp.set(new Uint8Array(buffer2), buffer1.byteLength)\n return tmp.buffer as ArrayBuffer\n}\n\n//Convenience methods for dates management\nexport function after(d1: number | null | undefined, d2: number | null | undefined): boolean {\n return d1 === null || d2 === null || d1 === undefined || d2 === undefined || moment(d1)!.isAfter(moment(d2)!)\n}\n\nexport function before(d1: number | null | undefined, d2: number | null | undefined): boolean {\n return d1 === null || d2 === null || d1 === undefined || d2 === undefined || moment(d1)!.isBefore(moment(d2)!)\n}\n\nfunction moment(epochOrLongCalendar: number): Moment | null {\n if (!epochOrLongCalendar && epochOrLongCalendar !== 0) {\n return null\n }\n if (epochOrLongCalendar >= 18000101 && epochOrLongCalendar < 25400000) {\n return mm('' + epochOrLongCalendar, 'YYYYMMDD')\n } else if (epochOrLongCalendar >= 18000101000000) {\n return mm('' + epochOrLongCalendar, 'YYYYMMDDHHmmss')\n } else {\n return mm(epochOrLongCalendar)\n }\n}\n\n/**\n * Encrypt object graph recursively\n *\n * @param obj the object to encrypt\n * @param cryptor the cryptor function (returns a promise)\n * @param keys the keys to be crypted: ex for a Patient ['note', 'addresses.*.[\"street\", \"houseNumber\", \"telecoms.*.telecomNumber\"]']\n */\nexport async function crypt(obj: any, cryptor: (obj: { [key: string]: string }) => Promise<ArrayBuffer>, keys: Array<string>) {\n const subObj = _.pick(\n obj,\n keys.filter((k) => !k.includes('*'))\n )\n obj.encryptedSelf = b2a(ua2string(await cryptor(subObj)))\n Object.keys(subObj).forEach((k) => delete obj[k])\n\n await keys\n .filter((k) => k.includes('*'))\n .reduce(async (prev: Promise<void>, k: any) => {\n await prev\n const k1 = k.split('.*.')[0]\n const k2 = k.substr(k1.length + 3)\n\n const mapped = await Promise.all((_.get(obj, k1) || []).map((so: any) => crypt(so, cryptor, k2.startsWith('[') ? JSON.parse(k2) : [k2])))\n _.set(obj, k1, mapped)\n }, Promise.resolve())\n\n return obj\n}\n\n/**\n * Decrypt object graph recursively\n *\n * @param obj the object to encrypt\n * @param decryptor the decryptor function (returns a promise)\n */\nexport async function decrypt(obj: any, decryptor: (obj: Uint8Array) => Promise<{ [key: string]: string }>) {\n await Object.keys(obj).reduce(async (prev: Promise<void>, k: any) => {\n await prev\n if (Array.isArray(obj[k])) {\n await (obj[k] as Array<any>)\n .filter((o) => typeof o === 'object' && o !== null)\n .reduce(async (prev: Promise<void>, so: any) => {\n await prev\n await decrypt(so, decryptor)\n }, Promise.resolve())\n }\n }, Promise.resolve())\n if (obj.encryptedSelf) {\n Object.assign(obj, await decryptor(string2ua(a2b(obj.encryptedSelf))))\n }\n return obj\n}\n"]}
1
+ {"version":3,"file":"crypto-utils.js","sourceRoot":"","sources":["../../../icc-x-api/utils/crypto-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import * as mm from 'moment'\nimport { Moment } from 'moment'\nimport * as _ from 'lodash'\nimport { a2b, b2a, b64Url2ua, string2ua, ua2b64Url, ua2hex, ua2string } from '../utils/binary-utils'\nimport { pack } from './asn1-packer'\nimport { parseAsn1 } from './asn1-parser'\n\nexport function notConcurrent<T>(concurrencyMap: { [key: string]: PromiseLike<T> }, key: string, proc: () => PromiseLike<T>): PromiseLike<T> {\n const inFlight = concurrencyMap[key]\n if (!inFlight) {\n return (concurrencyMap[key] = (async () => {\n try {\n return await proc()\n } finally {\n delete concurrencyMap[key]\n }\n })())\n } else {\n return concurrencyMap[key].then(() => notConcurrent(concurrencyMap, key, proc))\n }\n}\n\nexport function jwk2pkcs8(jwk: any): string {\n return pack([\n 0x30,\n [\n [0x02, '00'],\n [0x30, [[0x06, '2a864886f70d010101'], [0x05]]], // pragma: allowlist secret\n [\n 0x04,\n [\n [\n 0x30,\n [\n [0x02, '00'],\n [0x02, ua2hex(b64Url2ua(jwk.n))],\n [0x02, ua2hex(b64Url2ua(jwk.e))],\n [0x02, ua2hex(b64Url2ua(jwk.d))],\n [0x02, ua2hex(b64Url2ua(jwk.p))],\n [0x02, ua2hex(b64Url2ua(jwk.q))],\n [0x02, ua2hex(b64Url2ua(jwk.dp))],\n [0x02, ua2hex(b64Url2ua(jwk.dq))],\n [0x02, ua2hex(b64Url2ua(jwk.qi))],\n ],\n ],\n ],\n ],\n ],\n ])\n}\n\nexport function jwk2spki(jwk: any): string {\n return pack([\n 0x30,\n [\n [0x30, [[0x06, '2a864886f70d010101'], [0x05]]], // pragma: allowlist secret\n [\n 0x03,\n [\n [\n 0x30,\n [\n [0x02, ua2hex(b64Url2ua(jwk.n))],\n [0x02, ua2hex(b64Url2ua(jwk.e))],\n ],\n ],\n ],\n ],\n ],\n ])\n}\n\nexport function spkiToJwk(buf: Uint8Array): { kty: string; alg: string; n: string; e: string; ext: boolean } {\n const asn1 = parseAsn1(new Uint8Array(buf))\n\n var modulus: Uint8Array | undefined = undefined\n var exponent: Uint8Array | undefined = undefined\n if (\n asn1.type === 0x30 &&\n asn1.children?.[0]?.type === 0x30 &&\n asn1.children?.[0]?.children?.[0]?.type === 0x06 &&\n ua2hex(asn1.children?.[0]?.children?.[0]?.value ?? new Uint8Array(0)) === '2a864886f70d010101' // pragma: allowlist secret\n ) {\n modulus = asn1.children?.[1]?.children?.[0]?.children?.[0]?.value\n exponent = asn1.children?.[1]?.children?.[0]?.children?.[1]?.value\n } else if (asn1.type === 0x30 && asn1.children?.[0]?.type === 0x02 && asn1.children?.[1]?.type === 0x02) {\n modulus = asn1.children?.[0]?.value\n exponent = asn1.children?.[1]?.value\n }\n\n if (!modulus || !exponent) {\n throw new Error('Invalid spki format')\n }\n return {\n kty: 'RSA',\n alg: 'RSA-OAEP',\n ext: true,\n n: ua2b64Url(minimalRep(modulus)),\n e: ua2b64Url(minimalRep(exponent)),\n }\n}\n\nexport function pkcs8ToJwk(buf: Uint8Array | ArrayBuffer) {\n const parsed = parseAsn1(new Uint8Array(buf))\n const seq =\n parsed.children?.length === 3 && parsed.children[2].type === 0x04 && parsed.children[2].children?.length === 1\n ? parsed.children[2].children[0]\n : parsed\n return {\n kty: 'RSA',\n n: ua2b64Url(minimalRep(seq.children![1].value as Uint8Array)),\n e: ua2b64Url(minimalRep(seq.children![2].value as Uint8Array)),\n d: ua2b64Url(minimalRep(seq.children![3].value as Uint8Array)),\n p: ua2b64Url(minimalRep(seq.children![4].value as Uint8Array)),\n q: ua2b64Url(minimalRep(seq.children![5].value as Uint8Array)),\n dp: ua2b64Url(minimalRep(seq.children![6].value as Uint8Array)),\n dq: ua2b64Url(minimalRep(seq.children![7].value as Uint8Array)),\n qi: ua2b64Url(minimalRep(seq.children![8].value as Uint8Array)),\n }\n}\n\nfunction minimalRep(b: Uint8Array) {\n let i = 0\n while (b[i] === 0) {\n i++\n }\n return b.slice(i)\n}\n\n/**\n * Provide a view over the given Uint8Array where any trailing null bytes at\n * the end are truncated.\n *\n * This can be used to ignore null bytes at the end of a padded UTF-8 string\n * without needing to copy that string, assuming code point U+0000 is encoded\n * in one null byte according to standards rather than in a multi-byte\n * overlong form.\n */\nexport function truncateTrailingNulls(a: Uint8Array) {\n let end = a.byteLength - 1\n while (a[end] === 0 && end >= 0) {\n end--\n }\n // end is now either the last non-null position in a or -1; in the latter\n // case the returned array will have length 0.\n return a.subarray(0, end + 1)\n}\n\n/**\n *\n * @param buffer1 {Uint8Array}\n * @param buffer2{ Uint8Array}\n * @returns {ArrayBuffer}\n */\nexport function appendBuffer(buffer1: ArrayBuffer, buffer2: ArrayBuffer): ArrayBuffer {\n const tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength)\n tmp.set(new Uint8Array(buffer1), 0)\n tmp.set(new Uint8Array(buffer2), buffer1.byteLength)\n return tmp.buffer as ArrayBuffer\n}\n\n//Convenience methods for dates management\nexport function after(d1: number | null | undefined, d2: number | null | undefined): boolean {\n return d1 === null || d2 === null || d1 === undefined || d2 === undefined || moment(d1)!.isAfter(moment(d2)!)\n}\n\nexport function before(d1: number | null | undefined, d2: number | null | undefined): boolean {\n return d1 === null || d2 === null || d1 === undefined || d2 === undefined || moment(d1)!.isBefore(moment(d2)!)\n}\n\nfunction moment(epochOrLongCalendar: number): Moment | null {\n if (!epochOrLongCalendar && epochOrLongCalendar !== 0) {\n return null\n }\n if (epochOrLongCalendar >= 18000101 && epochOrLongCalendar < 25400000) {\n return mm('' + epochOrLongCalendar, 'YYYYMMDD')\n } else if (epochOrLongCalendar >= 18000101000000) {\n return mm('' + epochOrLongCalendar, 'YYYYMMDDHHmmss')\n } else {\n return mm(epochOrLongCalendar)\n }\n}\n\n/**\n * Encrypt object graph recursively\n *\n * @param obj the object to encrypt\n * @param cryptor the cryptor function (returns a promise)\n * @param keys the keys to be crypted: ex for a Patient ['note', 'addresses.*.[\"street\", \"houseNumber\", \"telecoms.*.telecomNumber\"]']\n */\nexport async function crypt(obj: any, cryptor: (obj: { [key: string]: string }) => Promise<ArrayBuffer>, keys: Array<string>) {\n const subObj = _.pick(\n obj,\n keys.filter((k) => !k.includes('*'))\n )\n obj.encryptedSelf = b2a(ua2string(await cryptor(subObj)))\n Object.keys(subObj).forEach((k) => delete obj[k])\n\n await keys\n .filter((k) => k.includes('*'))\n .reduce(async (prev: Promise<void>, k: any) => {\n await prev\n const k1 = k.split('.*.')[0]\n const k2 = k.substr(k1.length + 3)\n\n const mapped = await Promise.all((_.get(obj, k1) || []).map((so: any) => crypt(so, cryptor, k2.startsWith('[') ? JSON.parse(k2) : [k2])))\n _.set(obj, k1, mapped)\n }, Promise.resolve())\n\n return obj\n}\n\n/**\n * Decrypt object graph recursively\n *\n * @param obj the object to encrypt\n * @param decryptor the decryptor function (returns a promise)\n */\nexport async function decrypt(obj: any, decryptor: (obj: Uint8Array) => Promise<{ [key: string]: string }>) {\n await Object.keys(obj).reduce(async (prev: Promise<void>, k: any) => {\n await prev\n if (Array.isArray(obj[k])) {\n await (obj[k] as Array<any>)\n .filter((o) => typeof o === 'object' && o !== null)\n .reduce(async (prev: Promise<void>, so: any) => {\n await prev\n await decrypt(so, decryptor)\n }, Promise.resolve())\n }\n }, Promise.resolve())\n if (obj.encryptedSelf) {\n Object.assign(obj, await decryptor(string2ua(a2b(obj.encryptedSelf))))\n }\n return obj\n}\n"]}
@@ -3,12 +3,19 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.UuidEncoder = void 0;
4
4
  const bigInt = require("big-integer");
5
5
  const knownBases = {
6
+ // pragma: allowlist nextline secret
6
7
  base64: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/',
8
+ // pragma: allowlist nextline secret
7
9
  base62: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
10
+ // pragma: allowlist nextline secret
8
11
  base58: '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz',
12
+ // pragma: allowlist nextline secret
9
13
  base36: '0123456789abcdefghijklmnopqrstuvwxyz',
14
+ // pragma: allowlist nextline secret
10
15
  base32: '0123456789abcdefghjkmnpqrstvwxyz',
16
+ // pragma: allowlist nextline secret
11
17
  base16: '0123456789abcdef',
18
+ // pragma: allowlist nextline secret
12
19
  base10: '0123456789',
13
20
  base2: '01',
14
21
  };
@@ -1 +1 @@
1
- {"version":3,"file":"uuid-encoder.js","sourceRoot":"","sources":["../../../icc-x-api/utils/uuid-encoder.ts"],"names":[],"mappings":"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","sourcesContent":["import * as bigInt from 'big-integer'\n\nconst knownBases: { [key: string]: string } = {\n base64: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/',\n base62: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',\n base58: '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz', // Bitcoin base58\n base36: '0123456789abcdefghijklmnopqrstuvwxyz',\n base32: '0123456789abcdefghjkmnpqrstvwxyz', // Crockford's base32\n base16: '0123456789abcdef',\n base10: '0123456789',\n base2: '01',\n}\n\nconst caseSensitiveBases: { [key: string]: boolean } = {\n base62: true,\n base58: true,\n base36: false,\n base32: false,\n base16: false,\n base10: true,\n base2: true,\n}\n\nexport class UuidEncoder {\n private encStr: string = knownBases.base36\n private isCaseSensitive = false\n private base = 36\n /**\n * @public\n * @param [baseEncodingStr] A string containing all usable letters for encoding\n * @constructor\n */\n constructor(baseEncodingStr = 'base36') {\n this.setBaseEncodingStr(baseEncodingStr)\n }\n\n /**\n * Set encoding base\n * @param {string} baseEncodingStr A string containing all usable letters for encoding\n * @public\n */\n setBaseEncodingStr(baseEncodingStr: string) {\n this.encStr = UuidEncoder.resolveEncodingStr(baseEncodingStr)\n this.isCaseSensitive = UuidEncoder.isCaseSensitiveBase(baseEncodingStr)\n this.base = this.encStr.length\n }\n\n /**\n * @private\n * @param {string} baseEncodingStr\n * @returns {string}\n */\n static resolveEncodingStr(baseEncodingStr: string) {\n return Object.prototype.hasOwnProperty.call(knownBases, baseEncodingStr) ? knownBases[baseEncodingStr] : baseEncodingStr\n }\n\n /**\n * @public\n * @param baseEncodingStr\n * @returns {boolean}\n */\n static isCaseSensitiveBase(baseEncodingStr: string) {\n return Object.prototype.hasOwnProperty.call(caseSensitiveBases, baseEncodingStr) ? caseSensitiveBases[baseEncodingStr] : true\n }\n\n /**\n * Encode a UUID\n * @param {string} uuid Properly formatted UUID\n * @returns {string} Encoded UUID\n * @public\n */\n encode(uuid: string) {\n const cleanUuid = uuid.replace(/-/g, '')\n const { base, encStr } = this\n\n let iUuid = bigInt(cleanUuid, 16)\n let str = ''\n\n do {\n str = encStr.substr(iUuid.mod(base).valueOf(), 1) + str\n iUuid = iUuid.divide(base)\n } while (iUuid.greater(0))\n\n return str\n }\n\n /**\n * Decode an encoded UUID\n * @public\n * @param {string} str Previously encoded string\n * @returns {string} Properly formatted UUID\n * @throws Throws an {Error} when encountering invalid data\n */\n decode(str: string) {\n let iUuid = bigInt(0)\n\n const { base, encStr } = this\n const len = str.length\n const finalStr = this.isCaseSensitive ? str : str.toLowerCase()\n\n for (let pos = 0; pos < len; pos += 1) {\n const ch = finalStr.substr(pos, 1)\n const encPos = encStr.indexOf(ch)\n\n if (encPos < 0) {\n throw new Error('Invalid encoded data')\n }\n\n iUuid = iUuid.add(encPos)\n\n if (pos < len - 1) {\n iUuid = iUuid.multiply(base)\n }\n }\n\n const uuid = iUuid.toString(16).padStart(32, '0')\n\n return `${uuid.substr(0, 8)}-${uuid.substr(8, 4)}-${uuid.substr(12, 4)}-${uuid.substr(16, 4)}-${uuid.substr(20)}`\n }\n}\n"]}
1
+ {"version":3,"file":"uuid-encoder.js","sourceRoot":"","sources":["../../../icc-x-api/utils/uuid-encoder.ts"],"names":[],"mappings":"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","sourcesContent":["import * as bigInt from 'big-integer'\n\nconst knownBases: { [key: string]: string } = {\n // pragma: allowlist nextline secret\n base64: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/',\n // pragma: allowlist nextline secret\n base62: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',\n // pragma: allowlist nextline secret\n base58: '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz', // Bitcoin base58\n // pragma: allowlist nextline secret\n base36: '0123456789abcdefghijklmnopqrstuvwxyz',\n // pragma: allowlist nextline secret\n base32: '0123456789abcdefghjkmnpqrstvwxyz', // Crockford's base32\n // pragma: allowlist nextline secret\n base16: '0123456789abcdef',\n // pragma: allowlist nextline secret\n base10: '0123456789',\n base2: '01',\n}\n\nconst caseSensitiveBases: { [key: string]: boolean } = {\n base62: true,\n base58: true,\n base36: false,\n base32: false,\n base16: false,\n base10: true,\n base2: true,\n}\n\nexport class UuidEncoder {\n private encStr: string = knownBases.base36\n private isCaseSensitive = false\n private base = 36\n /**\n * @public\n * @param [baseEncodingStr] A string containing all usable letters for encoding\n * @constructor\n */\n constructor(baseEncodingStr = 'base36') {\n this.setBaseEncodingStr(baseEncodingStr)\n }\n\n /**\n * Set encoding base\n * @param {string} baseEncodingStr A string containing all usable letters for encoding\n * @public\n */\n setBaseEncodingStr(baseEncodingStr: string) {\n this.encStr = UuidEncoder.resolveEncodingStr(baseEncodingStr)\n this.isCaseSensitive = UuidEncoder.isCaseSensitiveBase(baseEncodingStr)\n this.base = this.encStr.length\n }\n\n /**\n * @private\n * @param {string} baseEncodingStr\n * @returns {string}\n */\n static resolveEncodingStr(baseEncodingStr: string) {\n return Object.prototype.hasOwnProperty.call(knownBases, baseEncodingStr) ? knownBases[baseEncodingStr] : baseEncodingStr\n }\n\n /**\n * @public\n * @param baseEncodingStr\n * @returns {boolean}\n */\n static isCaseSensitiveBase(baseEncodingStr: string) {\n return Object.prototype.hasOwnProperty.call(caseSensitiveBases, baseEncodingStr) ? caseSensitiveBases[baseEncodingStr] : true\n }\n\n /**\n * Encode a UUID\n * @param {string} uuid Properly formatted UUID\n * @returns {string} Encoded UUID\n * @public\n */\n encode(uuid: string) {\n const cleanUuid = uuid.replace(/-/g, '')\n const { base, encStr } = this\n\n let iUuid = bigInt(cleanUuid, 16)\n let str = ''\n\n do {\n str = encStr.substr(iUuid.mod(base).valueOf(), 1) + str\n iUuid = iUuid.divide(base)\n } while (iUuid.greater(0))\n\n return str\n }\n\n /**\n * Decode an encoded UUID\n * @public\n * @param {string} str Previously encoded string\n * @returns {string} Properly formatted UUID\n * @throws Throws an {Error} when encountering invalid data\n */\n decode(str: string) {\n let iUuid = bigInt(0)\n\n const { base, encStr } = this\n const len = str.length\n const finalStr = this.isCaseSensitive ? str : str.toLowerCase()\n\n for (let pos = 0; pos < len; pos += 1) {\n const ch = finalStr.substr(pos, 1)\n const encPos = encStr.indexOf(ch)\n\n if (encPos < 0) {\n throw new Error('Invalid encoded data')\n }\n\n iUuid = iUuid.add(encPos)\n\n if (pos < len - 1) {\n iUuid = iUuid.multiply(base)\n }\n }\n\n const uuid = iUuid.toString(16).padStart(32, '0')\n\n return `${uuid.substr(0, 8)}-${uuid.substr(8, 4)}-${uuid.substr(12, 4)}-${uuid.substr(16, 4)}-${uuid.substr(20)}`\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@icure/api",
3
- "version": "5.0.9",
3
+ "version": "5.0.12",
4
4
  "description": "Typescript version of iCure standalone API client",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",