@icure/api 8.6.7 → 8.6.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/icc-api/api/IccAccesslogApi.d.ts +14 -0
- package/icc-api/api/IccAccesslogApi.js +31 -0
- package/icc-api/api/IccAccesslogApi.js.map +1 -1
- package/icc-api/model/AbstractFilterAccessLog.d.ts +15 -0
- package/icc-api/model/AbstractFilterAccessLog.js +21 -0
- package/icc-api/model/AbstractFilterAccessLog.js.map +1 -0
- package/icc-api/model/ChapterParagraph.d.ts +16 -0
- package/icc-api/model/ChapterParagraph.js +21 -0
- package/icc-api/model/ChapterParagraph.js.map +1 -0
- package/icc-api/model/Reimbursement.d.ts +2 -0
- package/icc-api/model/Reimbursement.js.map +1 -1
- package/icc-x-api/crypto/ExtendedApisUtilsImpl.js +2 -2
- package/icc-x-api/crypto/ExtendedApisUtilsImpl.js.map +1 -1
- package/icc-x-api/filters/AccessLogByDataOwnerPatientDateFilter.d.ts +22 -0
- package/icc-x-api/filters/AccessLogByDataOwnerPatientDateFilter.js +24 -0
- package/icc-x-api/filters/AccessLogByDataOwnerPatientDateFilter.js.map +1 -0
- package/icc-x-api/filters/AccessLogByDateFilter.d.ts +20 -0
- package/icc-x-api/filters/AccessLogByDateFilter.js +24 -0
- package/icc-x-api/filters/AccessLogByDateFilter.js.map +1 -0
- package/icc-x-api/filters/AccessLogByUserIdUserTypeDateFilter.d.ts +21 -0
- package/icc-x-api/filters/AccessLogByUserIdUserTypeDateFilter.js +24 -0
- package/icc-x-api/filters/AccessLogByUserIdUserTypeDateFilter.js.map +1 -0
- package/icc-x-api/icc-contact-x-api.js +3 -3
- package/icc-x-api/icc-contact-x-api.js.map +1 -1
- package/icc-x-api/utils/crypto-utils.d.ts +2 -1
- package/icc-x-api/utils/crypto-utils.js +57 -6
- package/icc-x-api/utils/crypto-utils.js.map +1 -1
- package/package.json +1 -1
- package/test/icc-x-api/crypto/anonymous-delegations-test.js +1 -1
- package/test/icc-x-api/crypto/anonymous-delegations-test.js.map +1 -1
- package/test/icc-x-api/crypto/cryptoTest.js +99 -1
- package/test/icc-x-api/crypto/cryptoTest.js.map +1 -1
- package/test/icc-x-api/crypto/legacy-metadata-migration-test.js +3 -3
- package/test/icc-x-api/crypto/legacy-metadata-migration-test.js.map +1 -1
- package/test/icc-x-api/entity-with-attachments-api-test.js +2 -2
- package/test/icc-x-api/entity-with-attachments-api-test.js.map +1 -1
- package/test/icc-x-api/icc-user-x-api-test.js +1 -1
- package/test/icc-x-api/icc-user-x-api-test.js.map +1 -1
- package/test/support/CSM-243.js +5 -5
- package/test/support/CSM-243.js.map +1 -1
|
@@ -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, hex2ua, string2ua, ua2b64Url, ua2hex, ua2string } from '../utils/binary-utils'\nimport { pack } from './asn1-packer'\nimport { parseAsn1 } from './asn1-parser'\nimport { KeyPair, ShaVersion } from '../crypto/RSA'\n\nexport function notConcurrent<T>(concurrencyMap: { [key: string]: PromiseLike<any> }, key: string, proc: () => PromiseLike<T>): PromiseLike<T> {\n const inFlight = concurrencyMap[key]\n if (!inFlight) {\n const newJob = (async () => {\n try {\n return await proc()\n } finally {\n delete concurrencyMap[key]\n }\n })()\n concurrencyMap[key] = newJob\n return newJob\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, shaVersion: ShaVersion): { 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: shaVersion === 'sha-256' ? 'RSA-OAEP-256' : '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 * Configuration for the encryption of an object.\n * @param topLevelFields the fields of the object to encrypt. All the fields will be encrypted in a single encryptedSelf field which is added to the\n * object.\n * @param nestedObjectsKeys the name of fields which are expected to contain a nested object (or undefined). Allows to specify\n */\nexport type EncryptedFieldsManifest = {\n topLevelFields: { fieldName: string; fieldPath: string }[]\n nestedObjectsKeys: {\n [objectFieldName: string]: EncryptedFieldsManifest\n }\n mapsValuesKeys: {\n [mapFieldName: string]: EncryptedFieldsManifest\n }\n arraysValuesKeys: {\n [arrayFieldName: string]: EncryptedFieldsManifest\n }\n}\n\n/**\n * @internal this function is for internal use only and may be changed without notice\n *\n * Parse the encrypted fields configuration for a specific entity type.\n *\n * ## Grammar\n *\n * The grammar for each encrypted field is the following:\n * ```\n * fieldName :=\n * regex([a-zA-Z_][a-zA-Z0-9_]+)\n * encryptedField :=\n * fieldName\n * | fieldName + (\".\" | \".*.\" | \"[].\") + encryptedField\n * ```\n *\n * This grammar allows you to specify the fields to encrypt for the object and recursively for nested objects.\n * - A string containing only a single `fieldName` will encrypt the field with the given name.\n * - A string starting with `fieldName.` allows to specify the encrypted fields of a nested object. The encrypted values of the\n * fields in the nested object will be saved in the nested object.\n * - A string starting with `fieldName.*.` treats `fieldName` as a map/dictionary data structure and allows to specify the encrypted fields of the\n * values of the map. Note that the values of the map must be objects as well. The encrypted content of each map value is stored in that value.\n * - A string starting with `fieldName[].` treats `fieldName` as an array and allows to specify the encrypted fields of the values of the array.\n * Note that the values of the array must be objects as well. The encrypted content of each array element is stored in that element.\n *\n * ## Example\n *\n * Consider the following object and encryption keys:\n * ```javascript\n * const obj = {\n * a: { x: 0, y: 1 },\n * b: \"hello\",\n * c: [ { public: \"a\", secret: \"b\" }, { public: \"c\", secret: \"d\" } ],\n * d: \"ok\",\n * e: {\n * info: \"something\",\n * private: \"secret\",\n * dataMap: {\n * \"en\": {\n * a: 1,\n * b: 2\n * },\n * \"fr\": {\n * a: 3,\n * b: 4\n * }\n * }\n * }\n * }\n * const encryptedFields = [\n * \"a\",\n * \"c[].secret\",\n * \"d\",\n * \"e.private\",\n * \"e.datamap.*.a\"\n * ]\n * ```\n * If you use them with the crypt method you will get the following result:\n * ```json\n * {\n * b: \"hello\",\n * c: [\n * { public: \"a\", encryptedSelf: \"...encrypted data of c[0]\" },\n * { public: \"c\", encryptedSelf: \"...encrypted data of c[1]\" }\n * ],\n * e: {\n * info: \"something\",\n * dataMap: {\n * \"en\": { b: 2, encryptedSelf: \"...encrypted data of e.dataMap['en']\" },\n * \"fr\": { b: 4, encryptedSelf: \"...encrypted data of e.dataMap['fr']\" }\n * },\n * encryptedSelf: \"...encrypted data of e\"\n * },\n * encryptedSelf: \"...encrypted data of obj\"\n * }\n * ```\n *\n * ## Shortened representation\n *\n * You can also group encrypted fields having the same prefix by concatenating to the prefix the JSON representation of an array of all the postfixes.\n * For example the following encrypted fields:\n * ```javascript\n * const encryptedFields = [\"a.b.c.d.e.f1\", \"a.b.c.d.e.f2\", \"a.b.c.d.e.f3\", \"a.b.c.d.e.f4\"]\n * ```\n * can be shortened to\n * ```javascript\n * const encryptedFields = ['a.b.c.d.e.[\"f1\",\"f2\",\"f3\",\"f4\"]'] // Note the use of single quotes to avoid escaping the double quotes\n * ```\n * If you use the shortened representation you may need to escape nested json representations. In that case the use of `JSON.stringify` is\n * recommended.\n *\n * @param encryptedFields\n * @param path\n */\nexport function parseEncryptedFields(encryptedFields: string[], path: string): EncryptedFieldsManifest {\n const groupedData = {\n topLevelFields: new Set<string>(),\n nestedObjectsKeys: {} as { [objectFieldName: string]: string[] },\n mapsValuesKeys: {} as { [mapFieldName: string]: string[] },\n arraysValuesKeys: {} as { [arrayFieldName: string]: string[] },\n }\n const encryptedFieldRegex = /^([_a-zA-Z][_a-zA-Z0-9]*)(?:(\\.\\*\\.|\\[]\\.|\\.)(?:[_a-zA-Z].*|\\[.*]))?$/\n const addSubkeyToGroupedData = (\n currFieldName: string,\n currFieldSeparator: string,\n currEncryptedField: string,\n groupedDataKey: 'nestedObjectsKeys' | 'mapsValuesKeys' | 'arraysValuesKeys'\n ) => {\n const existingOrNew = groupedData[groupedDataKey][currFieldName] ?? (groupedData[groupedDataKey][currFieldName] = [])\n const subKey = currEncryptedField.slice(currFieldName.length + currFieldSeparator.length)\n if (subKey.startsWith('[')) {\n let parsedJson: any[]\n try {\n parsedJson = JSON.parse(subKey)\n } catch {\n throw new Error(`Invalid encrypted field ${path}${currEncryptedField} (not a valid JSON subkey)`)\n }\n if (Array.isArray(parsedJson) && parsedJson.every((x) => typeof x == 'string')) {\n parsedJson.forEach((x) => existingOrNew.push(x))\n } else throw new Error(`Invalid encrypted field ${path}${currEncryptedField} (not an array of strings)`)\n } else {\n existingOrNew.push(subKey)\n }\n }\n for (const currEncryptedField of encryptedFields) {\n const currFieldMatch = currEncryptedField.match(encryptedFieldRegex)\n if (!!currFieldMatch) {\n const currFieldName = currFieldMatch[1]\n const currFieldSeparator = currFieldMatch[2]\n if (!currFieldSeparator) {\n if (groupedData.topLevelFields.has(currFieldName)) throw new Error(`Duplicate encrypted field ${path}${currFieldName}`)\n if (\n !!groupedData.nestedObjectsKeys[currFieldName] ||\n !!groupedData.mapsValuesKeys[currFieldName] ||\n !!groupedData.arraysValuesKeys[currFieldName]\n )\n throw new Error(`Encrypted field appears multiple times as different nested types and or top-level-field: ${path}${currFieldName}`)\n groupedData.topLevelFields.add(currFieldName)\n } else if (currFieldSeparator == '.') {\n if (\n groupedData.topLevelFields.has(currFieldName) ||\n !!groupedData.mapsValuesKeys[currFieldName] ||\n !!groupedData.arraysValuesKeys[currFieldName]\n )\n throw new Error(`Encrypted field appears multiple times as different nested types and or top-level-field: ${path}${currFieldName}`)\n addSubkeyToGroupedData(currFieldName, currFieldSeparator, currEncryptedField, 'nestedObjectsKeys')\n } else if (currFieldSeparator == '.*.') {\n if (\n groupedData.topLevelFields.has(currFieldName) ||\n !!groupedData.nestedObjectsKeys[currFieldName] ||\n !!groupedData.arraysValuesKeys[currFieldName]\n )\n throw new Error(`Encrypted field appears multiple times as different nested types and or top-level-field: ${path}${currFieldName}`)\n addSubkeyToGroupedData(currFieldName, currFieldSeparator, currEncryptedField, 'mapsValuesKeys')\n } else if (currFieldSeparator == '[].') {\n if (\n groupedData.topLevelFields.has(currFieldName) ||\n !!groupedData.nestedObjectsKeys[currFieldName] ||\n !!groupedData.mapsValuesKeys[currFieldName]\n )\n throw new Error(`Encrypted field appears multiple times as different nested types and or top-level-field: ${path}${currFieldName}`)\n addSubkeyToGroupedData(currFieldName, currFieldSeparator, currEncryptedField, 'arraysValuesKeys')\n } else throw new Error(`Internal error: unknown separator ${currFieldSeparator} passed regex validation in ${path}${currEncryptedField}`)\n } else throw new Error(`Invalid encrypted field ${path}${currEncryptedField}`)\n }\n return {\n topLevelFields: Array.from(groupedData.topLevelFields).map((fieldName) => ({ fieldName, fieldPath: path + fieldName })),\n nestedObjectsKeys: Object.fromEntries(\n Object.entries(groupedData.nestedObjectsKeys).map(([fieldName, fieldNames]) => [\n fieldName,\n parseEncryptedFields(fieldNames, path + fieldName + '.'),\n ])\n ),\n mapsValuesKeys: Object.fromEntries(\n Object.entries(groupedData.mapsValuesKeys).map(([fieldName, fieldNames]) => [\n fieldName,\n parseEncryptedFields(fieldNames, path + fieldName + '.*.'),\n ])\n ),\n arraysValuesKeys: Object.fromEntries(\n Object.entries(groupedData.arraysValuesKeys).map(([fieldName, fieldNames]) => [\n fieldName,\n parseEncryptedFields(fieldNames, path + fieldName + '[].'),\n ])\n ),\n }\n}\n\n/**\n * @internal this function is for internal use only and may be changed without notice\n * Encrypt the object graph recursively. Generally return an updated SHALLOW copy, although some fields may be deep copied if they also needed to be\n * recursively encrypted.\n * @param obj the object to encrypt\n * @param cryptor takes in input an object consisting only of the fields to encrypt of obj, and returns the encrypted object.\n * @param keys the keys to encrypt for the\n * @param path path of the current object, used for error messages.\n * @return a shallow copy of the object with a new encryptedSelfField and without the encrypted fields.\n */\nexport async function encryptObject(\n obj: { [key: string]: any },\n cryptor: (obj: { [key: string]: any }) => Promise<ArrayBuffer>,\n keys: EncryptedFieldsManifest,\n path: string = 'obj'\n): Promise<{ [key: string]: any }> {\n const shallowClone = { ...obj }\n const currEncryptedFields: { [key: string]: any } = {}\n for (const { fieldName } of keys.topLevelFields) {\n const fieldValue = shallowClone[fieldName]\n if (fieldValue !== undefined) {\n // we keep null values\n currEncryptedFields[fieldName] = fieldValue\n delete shallowClone[fieldName]\n }\n }\n shallowClone['encryptedSelf'] = b2a(ua2string(await cryptor(currEncryptedFields)))\n for (const [fieldName, subKeys] of Object.entries(keys.nestedObjectsKeys)) {\n const fieldValue = shallowClone[fieldName]\n if (fieldValue !== undefined && fieldValue !== null) {\n if (!isPojo(fieldValue)) throw new Error(`Expected field ${path}.${fieldName} to be a non-array object`)\n shallowClone[fieldName] = await encryptObject(fieldValue, cryptor, subKeys, path + '.' + fieldName)\n }\n }\n for (const [mapFieldName, subKeys] of Object.entries(keys.mapsValuesKeys)) {\n const fieldValue = shallowClone[mapFieldName]\n if (fieldValue !== undefined && fieldValue !== null) {\n if (!isPojo(fieldValue)) throw new Error(`Expected field ${path}.${mapFieldName} to be a non-array object`)\n const newMap: { [key: string]: any } = {}\n for (const [key, value] of Object.entries(fieldValue as object)) {\n if (value === null || value === undefined) {\n newMap[key] = value\n } else {\n if (!isPojo(value)) throw new Error(`Expected field ${path}.${mapFieldName}.${key} to be a non-array object`)\n newMap[key] = await encryptObject(value, cryptor, subKeys, path + '.' + mapFieldName + '.' + key)\n }\n }\n shallowClone[mapFieldName] = newMap\n }\n }\n for (const [arrayFieldName, subKeys] of Object.entries(keys.arraysValuesKeys)) {\n const fieldValue = shallowClone[arrayFieldName]\n if (fieldValue !== undefined && fieldValue !== null) {\n if (!Array.isArray(fieldValue)) throw new Error(`Expected field ${path}.${arrayFieldName} to be an array`)\n const newArray: any[] = Array(fieldValue.length)\n for (let i = 0; i < fieldValue.length; i++) {\n const value = fieldValue[i]\n if (value === null || value === undefined) {\n newArray[i] = value\n } else {\n if (!isPojo(value)) throw new Error(`Expected field ${path}.${arrayFieldName}[${i}] to be a non-array object`)\n newArray[i] = await encryptObject(value, cryptor, subKeys, path + '.' + arrayFieldName + '[' + i + ']')\n }\n }\n shallowClone[arrayFieldName] = newArray\n }\n }\n return shallowClone\n}\n\n/**\n * Check if value is a non-null object that is not an array.\n */\nfunction isPojo(value: any): boolean {\n // This break if for some reason we have object versions of String/Number/Boolean\n return value !== null && typeof value === 'object' && !Array.isArray(value) && !(value instanceof ArrayBuffer) && !ArrayBuffer.isView(value)\n}\n\n/**\n * @internal this function is for internal use only and may be changed without notice\n * Decrypt object graph recursively.\n *\n * @param obj the object to decrypt\n * @param decryptor the decryptor function (returns a promise); the decryptor returns the decrypted input or null if\n * the decryption fails\n * @return a deep copy of the object with the decrypted fields and removed encryptedSelf field, or null if the\n * decryption failed\n */\nexport async function decryptObject(\n obj: { [key: string]: any },\n decryptor: (obj: Uint8Array) => Promise<{ [key: string]: any } | null>\n): Promise<{ [key: string]: any } | null> {\n const copy: { [key: string]: any } = {}\n for (const [key, value] of Object.entries(obj)) {\n if (key === 'encryptedSelf') {\n copy[key] = value\n } else if (typeof value === 'object' && value !== null) {\n if (Array.isArray(value)) {\n // Note: nested arrays (and primitives) are returned as is, and they aren't recursively decrypted.\n // This is because we currently don't support encryption of elements from arrays in arrays (we only support\n // arrays in objects in arrays).\n // In future this may change.\n const decryptedElements = []\n for (const element of value) {\n if (isPojo(element)) {\n const decrypted = await decryptObject(element, decryptor)\n if (decrypted == null) return null\n decryptedElements.push(decrypted)\n } else {\n decryptedElements.push(element)\n }\n }\n copy[key] = decryptedElements\n } else if (value instanceof ArrayBuffer || ArrayBuffer.isView(value)) {\n copy[key] = value // No direct decryption of array buffer data. Array buffer should be converted to b64 string and encrypted as json data.\n } else {\n const decrypted = await decryptObject(value, decryptor)\n if (decrypted == null) return null\n copy[key] = decrypted\n }\n } else {\n copy[key] = value\n }\n }\n if (obj.encryptedSelf) {\n const decrypted = await decryptor(string2ua(a2b(obj.encryptedSelf)))\n if (decrypted == null) return null\n return { ...copy, ...decrypted }\n } else return copy\n}\n\n/**\n * Extracts the full jwk key pair from the jwk representation of the private key.\n * @param privateKeyJwk private key in jwk representation\n * @param shaVersion the SHA algorithm version\n * @throws if the key is missing the public modulus or public exponent.\n */\nexport function keyPairFromPrivateKeyJwk(privateKeyJwk: JsonWebKey, shaVersion: ShaVersion): KeyPair<JsonWebKey> {\n if (!privateKeyJwk.n || !privateKeyJwk.e) throw new Error('Incomplete private JsonWebKey: missing public modulus and/or exponent')\n return {\n privateKey: privateKeyJwk,\n publicKey: spkiToJwk(hex2ua(jwk2spki(privateKeyJwk)), shaVersion),\n }\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, hex2ua, string2ua, ua2b64Url, ua2hex, ua2string } from '../utils/binary-utils'\nimport { pack } from './asn1-packer'\nimport { parseAsn1 } from './asn1-parser'\nimport { KeyPair, ShaVersion } from '../crypto/RSA'\n\nexport function notConcurrent<T>(concurrencyMap: { [key: string]: PromiseLike<any> }, key: string, proc: () => PromiseLike<T>): PromiseLike<T> {\n const inFlight = concurrencyMap[key]\n if (!inFlight) {\n const newJob = (async () => {\n try {\n return await proc()\n } finally {\n delete concurrencyMap[key]\n }\n })()\n concurrencyMap[key] = newJob\n return newJob\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, shaVersion: ShaVersion): { 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: shaVersion === 'sha-256' ? 'RSA-OAEP-256' : '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 * Configuration for the encryption of an object.\n * @param topLevelFields the fields of the object to encrypt. All the fields will be encrypted in a single encryptedSelf field which is added to the\n * object.\n * @param nestedObjectsKeys the name of fields which are expected to contain a nested object (or undefined). Allows to specify\n */\nexport type EncryptedFieldsManifest = {\n topLevelFields: { fieldName: string; fieldPath: string }[]\n nestedObjectsKeys: {\n [objectFieldName: string]: EncryptedFieldsManifest\n }\n mapsValuesKeys: {\n [mapFieldName: string]: EncryptedFieldsManifest\n }\n arraysValuesKeys: {\n [arrayFieldName: string]: EncryptedFieldsManifest\n }\n}\n\n/**\n * @internal this function is for internal use only and may be changed without notice\n *\n * Parse the encrypted fields configuration for a specific entity type.\n *\n * ## Grammar\n *\n * The grammar for each encrypted field is the following:\n * ```\n * fieldName :=\n * regex([a-zA-Z_][a-zA-Z0-9_]+)\n * encryptedField :=\n * fieldName\n * | fieldName + (\".\" | \".*.\" | \"[].\") + encryptedField\n * ```\n *\n * This grammar allows you to specify the fields to encrypt for the object and recursively for nested objects.\n * - A string containing only a single `fieldName` will encrypt the field with the given name.\n * - A string starting with `fieldName.` allows to specify the encrypted fields of a nested object. The encrypted values of the\n * fields in the nested object will be saved in the nested object.\n * - A string starting with `fieldName.*.` treats `fieldName` as a map/dictionary data structure and allows to specify the encrypted fields of the\n * values of the map. Note that the values of the map must be objects as well. The encrypted content of each map value is stored in that value.\n * - A string starting with `fieldName[].` treats `fieldName` as an array and allows to specify the encrypted fields of the values of the array.\n * Note that the values of the array must be objects as well. The encrypted content of each array element is stored in that element.\n *\n * ## Example\n *\n * Consider the following object and encryption keys:\n * ```javascript\n * const obj = {\n * a: { x: 0, y: 1 },\n * b: \"hello\",\n * c: [ { public: \"a\", secret: \"b\" }, { public: \"c\", secret: \"d\" } ],\n * d: \"ok\",\n * e: {\n * info: \"something\",\n * private: \"secret\",\n * dataMap: {\n * \"en\": {\n * a: 1,\n * b: 2\n * },\n * \"fr\": {\n * a: 3,\n * b: 4\n * }\n * }\n * }\n * }\n * const encryptedFields = [\n * \"a\",\n * \"c[].secret\",\n * \"d\",\n * \"e.private\",\n * \"e.datamap.*.a\"\n * ]\n * ```\n * If you use them with the crypt method you will get the following result:\n * ```json\n * {\n * b: \"hello\",\n * c: [\n * { public: \"a\", encryptedSelf: \"...encrypted data of c[0]\" },\n * { public: \"c\", encryptedSelf: \"...encrypted data of c[1]\" }\n * ],\n * e: {\n * info: \"something\",\n * dataMap: {\n * \"en\": { b: 2, encryptedSelf: \"...encrypted data of e.dataMap['en']\" },\n * \"fr\": { b: 4, encryptedSelf: \"...encrypted data of e.dataMap['fr']\" }\n * },\n * encryptedSelf: \"...encrypted data of e\"\n * },\n * encryptedSelf: \"...encrypted data of obj\"\n * }\n * ```\n *\n * ## Shortened representation\n *\n * You can also group encrypted fields having the same prefix by concatenating to the prefix the JSON representation of an array of all the postfixes.\n * For example the following encrypted fields:\n * ```javascript\n * const encryptedFields = [\"a.b.c.d.e.f1\", \"a.b.c.d.e.f2\", \"a.b.c.d.e.f3\", \"a.b.c.d.e.f4\"]\n * ```\n * can be shortened to\n * ```javascript\n * const encryptedFields = ['a.b.c.d.e.[\"f1\",\"f2\",\"f3\",\"f4\"]'] // Note the use of single quotes to avoid escaping the double quotes\n * ```\n * If you use the shortened representation you may need to escape nested json representations. In that case the use of `JSON.stringify` is\n * recommended.\n *\n * @param encryptedFields\n * @param path\n */\nexport function parseEncryptedFields(encryptedFields: string[], path: string): EncryptedFieldsManifest {\n const groupedData = {\n topLevelFields: new Set<string>(),\n nestedObjectsKeys: {} as { [objectFieldName: string]: string[] },\n mapsValuesKeys: {} as { [mapFieldName: string]: string[] },\n arraysValuesKeys: {} as { [arrayFieldName: string]: string[] },\n }\n const encryptedFieldRegex = /^([_a-zA-Z][_a-zA-Z0-9]*)(?:(\\.\\*\\.|\\[]\\.|\\.)(?:[_a-zA-Z].*|\\[.*]))?$/\n const addSubkeyToGroupedData = (\n currFieldName: string,\n currFieldSeparator: string,\n currEncryptedField: string,\n groupedDataKey: 'nestedObjectsKeys' | 'mapsValuesKeys' | 'arraysValuesKeys'\n ) => {\n const existingOrNew = groupedData[groupedDataKey][currFieldName] ?? (groupedData[groupedDataKey][currFieldName] = [])\n const subKey = currEncryptedField.slice(currFieldName.length + currFieldSeparator.length)\n if (subKey.startsWith('[')) {\n let parsedJson: any[]\n try {\n parsedJson = JSON.parse(subKey)\n } catch {\n throw new Error(`Invalid encrypted field ${path}${currEncryptedField} (not a valid JSON subkey)`)\n }\n if (Array.isArray(parsedJson) && parsedJson.every((x) => typeof x == 'string')) {\n parsedJson.forEach((x) => existingOrNew.push(x))\n } else throw new Error(`Invalid encrypted field ${path}${currEncryptedField} (not an array of strings)`)\n } else {\n existingOrNew.push(subKey)\n }\n }\n for (const currEncryptedField of encryptedFields) {\n const currFieldMatch = currEncryptedField.match(encryptedFieldRegex)\n if (!!currFieldMatch) {\n const currFieldName = currFieldMatch[1]\n const currFieldSeparator = currFieldMatch[2]\n if (!currFieldSeparator) {\n if (groupedData.topLevelFields.has(currFieldName)) throw new Error(`Duplicate encrypted field ${path}${currFieldName}`)\n if (\n !!groupedData.nestedObjectsKeys[currFieldName] ||\n !!groupedData.mapsValuesKeys[currFieldName] ||\n !!groupedData.arraysValuesKeys[currFieldName]\n )\n throw new Error(`Encrypted field appears multiple times as different nested types and or top-level-field: ${path}${currFieldName}`)\n groupedData.topLevelFields.add(currFieldName)\n } else if (currFieldSeparator == '.') {\n if (\n groupedData.topLevelFields.has(currFieldName) ||\n !!groupedData.mapsValuesKeys[currFieldName] ||\n !!groupedData.arraysValuesKeys[currFieldName]\n )\n throw new Error(`Encrypted field appears multiple times as different nested types and or top-level-field: ${path}${currFieldName}`)\n addSubkeyToGroupedData(currFieldName, currFieldSeparator, currEncryptedField, 'nestedObjectsKeys')\n } else if (currFieldSeparator == '.*.') {\n if (\n groupedData.topLevelFields.has(currFieldName) ||\n !!groupedData.nestedObjectsKeys[currFieldName] ||\n !!groupedData.arraysValuesKeys[currFieldName]\n )\n throw new Error(`Encrypted field appears multiple times as different nested types and or top-level-field: ${path}${currFieldName}`)\n addSubkeyToGroupedData(currFieldName, currFieldSeparator, currEncryptedField, 'mapsValuesKeys')\n } else if (currFieldSeparator == '[].') {\n if (\n groupedData.topLevelFields.has(currFieldName) ||\n !!groupedData.nestedObjectsKeys[currFieldName] ||\n !!groupedData.mapsValuesKeys[currFieldName]\n )\n throw new Error(`Encrypted field appears multiple times as different nested types and or top-level-field: ${path}${currFieldName}`)\n addSubkeyToGroupedData(currFieldName, currFieldSeparator, currEncryptedField, 'arraysValuesKeys')\n } else throw new Error(`Internal error: unknown separator ${currFieldSeparator} passed regex validation in ${path}${currEncryptedField}`)\n } else throw new Error(`Invalid encrypted field ${path}${currEncryptedField}`)\n }\n return {\n topLevelFields: Array.from(groupedData.topLevelFields).map((fieldName) => ({ fieldName, fieldPath: path + fieldName })),\n nestedObjectsKeys: Object.fromEntries(\n Object.entries(groupedData.nestedObjectsKeys).map(([fieldName, fieldNames]) => [\n fieldName,\n parseEncryptedFields(fieldNames, path + fieldName + '.'),\n ])\n ),\n mapsValuesKeys: Object.fromEntries(\n Object.entries(groupedData.mapsValuesKeys).map(([fieldName, fieldNames]) => [\n fieldName,\n parseEncryptedFields(fieldNames, path + fieldName + '.*.'),\n ])\n ),\n arraysValuesKeys: Object.fromEntries(\n Object.entries(groupedData.arraysValuesKeys).map(([fieldName, fieldNames]) => [\n fieldName,\n parseEncryptedFields(fieldNames, path + fieldName + '[].'),\n ])\n ),\n }\n}\n\nfunction encryptedObjectDeepEqual(l: any, r: any): boolean {\n if (Array.isArray(l)) {\n if (!Array.isArray(r) || l.length !== r.length) {\n return false\n }\n for (let i = 0; i < l.length; i++) {\n if (!encryptedObjectDeepEqual(l[i], r[i])) {\n return false\n }\n }\n } else if (typeof l === 'object') {\n if (typeof r !== 'object' || Array.isArray(r)) {\n return false\n }\n const toEncryptKeys = Object.keys(l)\n const encryptedSelfContentKeys = Object.keys(r)\n if (toEncryptKeys.length !== encryptedSelfContentKeys.length) {\n return false\n }\n const allKeys = new Set([...toEncryptKeys, ...encryptedSelfContentKeys])\n if (allKeys.size !== toEncryptKeys.length) {\n return false\n }\n for (const key of toEncryptKeys) {\n if (!encryptedObjectDeepEqual(l[key], r[key])) {\n return false\n }\n }\n } else {\n return l === r\n }\n return true\n}\n\n/**\n * @internal this function is for internal use only and may be changed without notice\n * Encrypt the object graph recursively. Generally return an updated SHALLOW copy, although some fields may be deep copied if they also needed to be\n * recursively encrypted.\n * @param obj the object to encrypt\n * @param cryptor takes in input an object consisting only of the fields to encrypt of obj, and returns the encrypted object.\n * @param decryptor takes in input an \"encrytpedSelf\" value and returns the decrypted content. Can return null or throw exception if the decryption fails.\n * @param keys the keys to encrypt for the\n * @param path path of the current object, used for error messages.\n * @return a shallow copy of the object with a new encryptedSelfField and without the encrypted fields.\n */\nexport async function encryptObject(\n obj: { [key: string]: any },\n cryptor: (obj: { [key: string]: any }) => Promise<ArrayBuffer>,\n decryptor: (encryptedSelf: Uint8Array<ArrayBufferLike>) => Promise<any>,\n keys: EncryptedFieldsManifest,\n path: string = 'obj'\n): Promise<{ [key: string]: any }> {\n const shallowClone = { ...obj }\n const currEncryptedFields: { [key: string]: any } = {}\n for (const { fieldName } of keys.topLevelFields) {\n const fieldValue = shallowClone[fieldName]\n if (fieldValue !== undefined) {\n // we keep null values\n currEncryptedFields[fieldName] = fieldValue\n delete shallowClone[fieldName]\n }\n }\n let existingEncryptedSelfMatch = false\n if (shallowClone.encryptedSelf != undefined) {\n let decrypted = undefined\n try {\n decrypted = await decryptor(string2ua(a2b(shallowClone.encryptedSelf)))\n } catch (e) {\n // ignore\n }\n if (decrypted != undefined /* ignore null and undefined */ && encryptedObjectDeepEqual(currEncryptedFields, decrypted)) {\n existingEncryptedSelfMatch = true\n }\n }\n if (!existingEncryptedSelfMatch) {\n shallowClone['encryptedSelf'] = b2a(ua2string(await cryptor(currEncryptedFields)))\n }\n for (const [fieldName, subKeys] of Object.entries(keys.nestedObjectsKeys)) {\n const fieldValue = shallowClone[fieldName]\n if (fieldValue !== undefined && fieldValue !== null) {\n if (!isPojo(fieldValue)) throw new Error(`Expected field ${path}.${fieldName} to be a non-array object`)\n shallowClone[fieldName] = await encryptObject(fieldValue, cryptor, decryptor, subKeys, path + '.' + fieldName)\n }\n }\n for (const [mapFieldName, subKeys] of Object.entries(keys.mapsValuesKeys)) {\n const fieldValue = shallowClone[mapFieldName]\n if (fieldValue !== undefined && fieldValue !== null) {\n if (!isPojo(fieldValue)) throw new Error(`Expected field ${path}.${mapFieldName} to be a non-array object`)\n const newMap: { [key: string]: any } = {}\n for (const [key, value] of Object.entries(fieldValue as object)) {\n if (value === null || value === undefined) {\n newMap[key] = value\n } else {\n if (!isPojo(value)) throw new Error(`Expected field ${path}.${mapFieldName}.${key} to be a non-array object`)\n newMap[key] = await encryptObject(value, cryptor, decryptor, subKeys, path + '.' + mapFieldName + '.' + key)\n }\n }\n shallowClone[mapFieldName] = newMap\n }\n }\n for (const [arrayFieldName, subKeys] of Object.entries(keys.arraysValuesKeys)) {\n const fieldValue = shallowClone[arrayFieldName]\n if (fieldValue !== undefined && fieldValue !== null) {\n if (!Array.isArray(fieldValue)) throw new Error(`Expected field ${path}.${arrayFieldName} to be an array`)\n const newArray: any[] = Array(fieldValue.length)\n for (let i = 0; i < fieldValue.length; i++) {\n const value = fieldValue[i]\n if (value === null || value === undefined) {\n newArray[i] = value\n } else {\n if (!isPojo(value)) throw new Error(`Expected field ${path}.${arrayFieldName}[${i}] to be a non-array object`)\n newArray[i] = await encryptObject(value, cryptor, decryptor, subKeys, path + '.' + arrayFieldName + '[' + i + ']')\n }\n }\n shallowClone[arrayFieldName] = newArray\n }\n }\n return shallowClone\n}\n\n/**\n * Check if value is a non-null object that is not an array.\n */\nfunction isPojo(value: any): boolean {\n // This break if for some reason we have object versions of String/Number/Boolean\n return value !== null && typeof value === 'object' && !Array.isArray(value) && !(value instanceof ArrayBuffer) && !ArrayBuffer.isView(value)\n}\n\n/**\n * @internal this function is for internal use only and may be changed without notice\n * Decrypt object graph recursively.\n *\n * @param obj the object to decrypt\n * @param decryptor the decryptor function (returns a promise); the decryptor returns the decrypted input or null if\n * the decryption fails\n * @return a deep copy of the object with the decrypted fields and removed encryptedSelf field, or null if the\n * decryption failed\n */\nexport async function decryptObject(\n obj: { [key: string]: any },\n decryptor: (obj: Uint8Array) => Promise<{ [key: string]: any } | null>\n): Promise<{ [key: string]: any } | null> {\n const copy: { [key: string]: any } = {}\n for (const [key, value] of Object.entries(obj)) {\n if (key === 'encryptedSelf') {\n copy[key] = value\n } else if (typeof value === 'object' && value !== null) {\n if (Array.isArray(value)) {\n // Note: nested arrays (and primitives) are returned as is, and they aren't recursively decrypted.\n // This is because we currently don't support encryption of elements from arrays in arrays (we only support\n // arrays in objects in arrays).\n // In future this may change.\n const decryptedElements = []\n for (const element of value) {\n if (isPojo(element)) {\n const decrypted = await decryptObject(element, decryptor)\n if (decrypted == null) return null\n decryptedElements.push(decrypted)\n } else {\n decryptedElements.push(element)\n }\n }\n copy[key] = decryptedElements\n } else if (value instanceof ArrayBuffer || ArrayBuffer.isView(value)) {\n copy[key] = value // No direct decryption of array buffer data. Array buffer should be converted to b64 string and encrypted as json data.\n } else {\n const decrypted = await decryptObject(value, decryptor)\n if (decrypted == null) return null\n copy[key] = decrypted\n }\n } else {\n copy[key] = value\n }\n }\n if (obj.encryptedSelf) {\n const decrypted = await decryptor(string2ua(a2b(obj.encryptedSelf)))\n if (decrypted == null) return null\n return { ...copy, ...decrypted }\n } else return copy\n}\n\n/**\n * Extracts the full jwk key pair from the jwk representation of the private key.\n * @param privateKeyJwk private key in jwk representation\n * @param shaVersion the SHA algorithm version\n * @throws if the key is missing the public modulus or public exponent.\n */\nexport function keyPairFromPrivateKeyJwk(privateKeyJwk: JsonWebKey, shaVersion: ShaVersion): KeyPair<JsonWebKey> {\n if (!privateKeyJwk.n || !privateKeyJwk.e) throw new Error('Incomplete private JsonWebKey: missing public modulus and/or exponent')\n return {\n privateKey: privateKeyJwk,\n publicKey: spkiToJwk(hex2ua(jwk2spki(privateKeyJwk)), shaVersion),\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -298,7 +298,7 @@ describe('Anonymous delegations', () => {
|
|
|
298
298
|
it('without de-anonymisation metadata the data owners should be able to identify anonymous delegates only if their parent is part of the delegation with that delegate.', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
299
299
|
const { parentApi: childApi, parentUser: childUser, grandApi: parentApi, grandUser: parentUser } = yield (0, test_utils_1.createHcpHierarchyApis)(env); // Want to use only hcp with one parent
|
|
300
300
|
const patientInfo = yield createUserAndApi('anonymous');
|
|
301
|
-
let entity = yield parentApi.messageApi.
|
|
301
|
+
let entity = yield parentApi.messageApi.createMessageWithUser(parentUser, yield parentApi.messageApi.newInstanceWithPatient(parentUser, null, { subject: 'A simple subject' }));
|
|
302
302
|
entity = yield parentApi.messageApi.shareWith(patientInfo.userInfo.dataOwnerId, entity, [], { requestedPermissions: FULL_WRITE });
|
|
303
303
|
yield patientInfo.api.cryptoApi.forceReload();
|
|
304
304
|
const expectedAccess = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anonymous-delegations-test.js","sourceRoot":"","sources":["../../../../test/icc-x-api/crypto/anonymous-delegations-test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect } from 'chai'\nimport { before } from 'mocha'\nimport { createHcpHierarchyApis, getEnvironmentInitializer, getTempEmail, setLocalStorage, TestUtils } from '../../utils/test_utils'\nimport { webcrypto } from 'crypto'\nimport 'isomorphic-fetch'\nimport { Apis, WebCryptoPrimitives, EntityWithDelegationTypeName, ShaVersion } from '../../../icc-x-api'\nimport { User } from '../../../icc-api/model/User'\nimport { Patient } from '../../../icc-api/model/Patient'\nimport { HealthElement } from '../../../icc-api/model/HealthElement'\nimport { HealthcareParty } from '../../../icc-api/model/HealthcareParty'\nimport { v4 as uuid } from 'uuid'\nimport { TestApi } from '../../utils/TestApi'\nimport { CryptoPrimitives } from '../../../icc-x-api/crypto/CryptoPrimitives'\nimport { FilterChainMaintenanceTask } from '../../../icc-api/model/FilterChainMaintenanceTask'\nimport { MaintenanceTaskAfterDateFilter } from '../../../icc-x-api/filters/MaintenanceTaskAfterDateFilter'\nimport { KeyPairUpdateRequest } from '../../../icc-x-api/maintenance/KeyPairUpdateRequest'\nimport { EntityShareRequest } from '../../../icc-api/model/requests/EntityShareRequest'\nimport { MaintenanceTask } from '../../../icc-api/model/MaintenanceTask'\nimport * as _ from 'lodash'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { SecureDelegation } from '../../../icc-api/model/SecureDelegation'\nimport { CalendarItem } from '../../../icc-api/model/CalendarItem'\nimport { DataOwnerTypeEnum } from '../../../icc-api/model/DataOwnerTypeEnum'\nimport { Message } from '../../../icc-api/model/Message'\nimport { IccSecureDelegationKeyMapApi } from '../../../icc-api/api/internal/IccSecureDelegationKeyMapApi'\nimport initMasterApi = TestUtils.initMasterApi\nimport RequestedPermissionEnum = EntityShareRequest.RequestedPermissionEnum\nimport AccessLevelEnum = SecureDelegation.AccessLevelEnum\n\nconst FULL_WRITE = RequestedPermissionEnum.FULL_WRITE\nconst FULL_READ = RequestedPermissionEnum.FULL_READ\n\nsetLocalStorage(fetch)\n\ntype DataOwnerType = 'explicit' | 'anonymous'\ntype UserInfo = { user: User; pw: string; dataOwnerId: string }\n\nconst typeCombinations: [DataOwnerType, DataOwnerType][] = [\n ['explicit', 'explicit'],\n ['anonymous', 'explicit'],\n ['explicit', 'anonymous'],\n ['anonymous', 'anonymous'],\n]\nlet env: TestVars\nlet masterApi: Apis\nlet masterUser: User\nconst primitives = new WebCryptoPrimitives(webcrypto as any)\n\ndescribe('Anonymous delegations', () => {\n before(async function () {\n this.timeout(6000000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n masterApi = await initMasterApi(env)\n masterUser = await masterApi.userApi.getCurrentUser()\n })\n\n async function createUserAndApi(userType: DataOwnerType): Promise<{ api: Apis; userInfo: UserInfo }> {\n const dataOwner =\n userType === 'explicit'\n ? await masterApi.healthcarePartyApi.createHealthcareParty(new HealthcareParty({ id: uuid(), firstName: 'test', lastName: 'test' }))\n : await masterApi.patientApi.createPatientWithUser(\n masterUser,\n await masterApi.patientApi.newInstance(masterUser, new Patient({ id: uuid(), firstName: 'test', lastName: 'test' }))\n )\n const login = uuid()\n const user = await masterApi.userApi.createUser(\n new User({\n id: login,\n name: login,\n login: login,\n email: getTempEmail(),\n status: 'ACTIVE',\n healthcarePartyId: userType === 'explicit' ? dataOwner.id : undefined,\n patientId: userType === 'anonymous' ? dataOwner.id : undefined,\n })\n )\n const pw = await masterApi.userApi.getToken(user.id!, uuid())\n return {\n api: await TestApi(env.iCureUrl, login, pw, webcrypto as any),\n userInfo: { user, pw, dataOwnerId: dataOwner.id! },\n }\n }\n\n async function dataOwnerIdsForSearch(apis: Apis, dataOwnerId: string, entityType: EntityWithDelegationTypeName): Promise<string[]> {\n const delegationKeys = await apis.cryptoApi.exchangeData.getAllDelegationKeys(entityType)\n if (delegationKeys) {\n return delegationKeys\n } else {\n return [dataOwnerId]\n }\n }\n\n async function loseKeyAndGiveAccessBack(userThatLosesKey: UserInfo, apiToGiveAccessBack: Apis, userGivingAccessBack: UserInfo): Promise<Apis> {\n const timeBeforeNewKey = new Date().getTime()\n const newKeyPair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const newApi = await TestApi(env.iCureUrl, userThatLosesKey.user.login!, userThatLosesKey.pw, webcrypto as any, newKeyPair, {\n createMaintenanceTasksOnNewKey: false,\n })\n await newApi.icureMaintenanceTaskApi.createMaintenanceTasksForNewKeypair(userThatLosesKey.user, newKeyPair, [\n DataOwnerTypeEnum.Patient,\n DataOwnerTypeEnum.Hcp,\n ])\n await apiToGiveAccessBack.cryptoApi.forceReload()\n const searchIds = await dataOwnerIdsForSearch(apiToGiveAccessBack, userGivingAccessBack.dataOwnerId, EntityWithDelegationTypeName.MaintenanceTask)\n const keyPairUpdateRequests = await searchIds\n .reduce(async (acc, searchId) => {\n const awaitedAcc = await acc\n const currResult = await apiToGiveAccessBack.maintenanceTaskApi.filterMaintenanceTasksByWithUser(\n userGivingAccessBack.user,\n undefined,\n undefined,\n new FilterChainMaintenanceTask({\n filter: new MaintenanceTaskAfterDateFilter({\n date: timeBeforeNewKey,\n healthcarePartyId: searchId,\n }),\n })\n )\n return [...awaitedAcc, ...currResult.rows!]\n }, Promise.resolve([] as MaintenanceTask[]))\n .then((tasks) => tasks.map((task) => KeyPairUpdateRequest.fromMaintenanceTask(task)))\n const concernedRequest = keyPairUpdateRequests.filter((x) => x.concernedDataOwnerId === userThatLosesKey.dataOwnerId)\n expect(concernedRequest).to.have.length(1)\n await apiToGiveAccessBack.icureMaintenanceTaskApi.applyKeyPairUpdate(concernedRequest[0])\n await newApi.cryptoApi.forceReload()\n return newApi\n }\n\n async function createAndShareData(\n creatorApis: Apis,\n creatorInfo: UserInfo,\n delegateInfo: UserInfo\n ): Promise<{ patient: Patient; healthElements: HealthElement[] }> {\n const patient = await masterApi.patientApi.createPatientWithUser(\n masterUser,\n await masterApi.patientApi.newInstance(masterUser, new Patient({ id: uuid(), firstName: 'test', lastName: 'test', note: 'Patient note' }))\n )\n const secretIds = await masterApi.patientApi.decryptSecretIdsOf(patient)\n const updatedPatient1 = await masterApi.patientApi.shareWith(creatorInfo.dataOwnerId, patient, secretIds, { requestedPermissions: FULL_WRITE })\n await creatorApis.cryptoApi.forceReload()\n const updatedPatient2 = await creatorApis.patientApi.shareWith(delegateInfo.dataOwnerId, updatedPatient1, secretIds, {\n requestedPermissions: FULL_WRITE,\n })\n const healthElements: HealthElement[] = []\n for (let i = 0; i < 5; i++) {\n const he = await creatorApis.healthcareElementApi.createHealthElementWithUser(\n creatorInfo.user,\n await creatorApis.healthcareElementApi.newInstance(creatorInfo.user, updatedPatient2, { note: `Health element note - ${i}` })\n )\n const sharedHe = await creatorApis.healthcareElementApi.shareWith(delegateInfo.dataOwnerId, he, { requestedPermissions: FULL_WRITE })\n healthElements.push(sharedHe)\n }\n expect(updatedPatient2.note).to.not.be.undefined\n for (const he of healthElements) {\n expect(he.note).to.not.be.undefined\n }\n return { patient: updatedPatient2, healthElements }\n }\n\n async function checkCanFindAndDecrypt(apis: Apis, expected: { patient: Patient; healthElements: HealthElement[] }) {\n const user = await apis.userApi.getCurrentUser()\n const patient = await apis.patientApi.getPatientWithUser(user, expected.patient.id!)\n expect(patient.note).to.equal(expected.patient.note)\n const searchIds = await dataOwnerIdsForSearch(apis, apis.dataOwnerApi.getDataOwnerIdOf(user), EntityWithDelegationTypeName.HealthElement)\n const patientKeys = await apis.patientApi.decryptSecretIdsOf(patient)\n expect(patientKeys).to.not.be.empty\n const sfks = _.uniq(patientKeys).join(',')\n const retrievedHealthElements = _.uniqBy(\n await searchIds.reduce(async (acc, searchId) => {\n const awaitedAcc = await acc\n const currResult = await apis.healthcareElementApi.findByHCPartyPatientSecretFKeys(searchId, sfks)\n return [...awaitedAcc, ...currResult]\n }, Promise.resolve([] as HealthElement[])),\n (x) => x.id\n )\n expect(retrievedHealthElements.length).to.equal(expected.healthElements.length)\n for (const expectedHe of expected.healthElements) {\n const retrievedHe = retrievedHealthElements.find((x) => x.id === expectedHe.id)\n expect(retrievedHe).to.not.be.undefined\n expect(retrievedHe!.note).to.equal(expectedHe.note)\n }\n }\n\n async function checkAccessInfo(\n actualAccessInfo: { permissionsByDataOwnerId: { [p: string]: AccessLevelEnum }; hasUnknownAnonymousDataOwners: boolean },\n expectedDataOwnersWithAccess: { [dataOwnerId: string]: AccessLevelEnum },\n expectedHasUnknownAnonymousDataOwners: boolean\n ) {\n expect(Object.keys(actualAccessInfo.permissionsByDataOwnerId)).to.have.members(Object.keys(expectedDataOwnersWithAccess))\n expect(actualAccessInfo.hasUnknownAnonymousDataOwners).to.equal(expectedHasUnknownAnonymousDataOwners)\n for (const [dataOwnerId, expectedLevel] of Object.entries(expectedDataOwnersWithAccess)) {\n expect(actualAccessInfo.permissionsByDataOwnerId[dataOwnerId]).to.equal(expectedLevel)\n }\n }\n\n it('without de-anonymisation metadata the data owners should be able to identify anonymous delegates only if they are part of the delegation with that delegate.', async () => {\n const apiA = await createUserAndApi('explicit')\n const apiB = await createUserAndApi('explicit')\n const apiP1 = await createUserAndApi('anonymous')\n const apiP2 = await createUserAndApi('anonymous')\n let entity: CalendarItem = await apiA.api.calendarItemApi.createCalendarItemWithHcParty(\n apiA.userInfo.user,\n await apiA.api.calendarItemApi.newInstance(apiA.userInfo.user, { note: 'Calendar item note' })\n )\n /*\n * A->A\n */\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n { [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE },\n false\n )\n entity = await apiA.api.calendarItemApi.shareWith(apiB.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n /*\n * A->A A->B\n */\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n await checkAccessInfo(\n await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n /*\n * A->A A->B\n * A->P1\n */\n entity = await apiA.api.calendarItemApi.shareWith(apiP1.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n await apiP1.api.cryptoApi.forceReload()\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n await checkAccessInfo(\n await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n await checkAccessInfo(\n await apiP1.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n /*\n * A->A A->B B->P1\n * A->P1\n */\n entity = await apiB.api.calendarItemApi.shareWith(apiP1.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_READ })\n await apiP1.api.cryptoApi.forceReload()\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n await checkAccessInfo(\n await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.READ,\n },\n true\n )\n await checkAccessInfo(\n await apiP1.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n /*\n * A->A A->B B->P1\n * A->P1 P1->P2\n */\n entity = await apiP1.api.calendarItemApi.shareWith(apiP2.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_READ })\n await apiP2.api.cryptoApi.forceReload()\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n await checkAccessInfo(\n await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.READ,\n },\n true\n )\n await checkAccessInfo(\n await apiP1.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.READ,\n },\n false\n )\n await checkAccessInfo(\n await apiP2.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.READ, // P2 is only aware of the P1->P2 delegation\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.READ,\n },\n true\n )\n /*\n * A->A A->B B->P1\n * A->P1 P1->P2\n * A->P2\n */\n entity = await apiA.api.calendarItemApi.shareWith(apiP2.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n await apiP2.api.cryptoApi.forceReload()\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n await checkAccessInfo(\n await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.READ,\n },\n true\n )\n await checkAccessInfo(\n await apiP1.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.READ,\n },\n true\n )\n await checkAccessInfo(\n await apiP2.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.READ, // P2 is only aware of the P1->P2 delegation\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n })\n\n it('without de-anonymisation metadata the data owners should be able to identify anonymous delegates only if their parent is part of the delegation with that delegate.', async () => {\n const { parentApi: childApi, parentUser: childUser, grandApi: parentApi, grandUser: parentUser } = await createHcpHierarchyApis(env) // Want to use only hcp with one parent\n const patientInfo = await createUserAndApi('anonymous')\n let entity: Message = await parentApi.messageApi.createMessage(\n await parentApi.messageApi.newInstanceWithPatient(parentUser, null, { subject: 'A simple subject' })\n )\n entity = await parentApi.messageApi.shareWith(patientInfo.userInfo.dataOwnerId, entity, [], { requestedPermissions: FULL_WRITE })\n await patientInfo.api.cryptoApi.forceReload()\n const expectedAccess = {\n // No child user: has no direct access, only access through parent delegation\n [parentUser.healthcarePartyId!]: AccessLevelEnum.WRITE,\n [patientInfo.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n }\n await checkAccessInfo(await childApi.messageApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await parentApi.messageApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await patientInfo.api.messageApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n })\n\n it('de-anonymisation metadata should allow data owners that are not part of a delegation to figure out the members of that delegation.', async () => {\n const apiA = await createUserAndApi('explicit')\n const apiB = await createUserAndApi('explicit')\n const apiP1 = await createUserAndApi('anonymous')\n const apiP2 = await createUserAndApi('anonymous')\n let entity: CalendarItem = await apiA.api.calendarItemApi.createCalendarItemWithHcParty(\n apiA.userInfo.user,\n await apiA.api.calendarItemApi.newInstance(apiA.userInfo.user, { note: 'Calendar item note' })\n )\n entity = await apiA.api.calendarItemApi.shareWith(apiB.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await apiA.api.calendarItemApi.shareWith(apiP1.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await apiB.api.calendarItemApi.shareWith(apiP1.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_READ })\n await apiP1.api.cryptoApi.forceReload()\n entity = await apiP1.api.calendarItemApi.shareWith(apiP2.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_READ })\n entity = await apiA.api.calendarItemApi.shareWith(apiP2.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n /*\n * A->A A->B B->?P1\n * A->?P1 P1->?P2\n * A->?P2\n */\n await apiA.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiB.userInfo.dataOwnerId, apiP1.userInfo.dataOwnerId, apiP2.userInfo.dataOwnerId]\n )\n /*\n * A can create de-anonymization metadata for his delegations.\n * A->A A->B B->?P1\n * A->P1 P1->?P2\n * A->P2\n */\n await apiP1.api.cryptoApi.forceReload()\n await apiP2.api.cryptoApi.forceReload()\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n await checkAccessInfo(\n await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n await checkAccessInfo(\n await apiP1.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n await checkAccessInfo(\n await apiP2.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n await apiP1.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiB.userInfo.dataOwnerId, apiA.userInfo.dataOwnerId, apiP2.userInfo.dataOwnerId]\n )\n /* Both delegator and delegate can create de-anonymization metadata for a delegation.\n * A->A A->B B->P1\n * A->P1 P1->P2\n * A->P2\n */\n await apiP1.api.cryptoApi.forceReload()\n await apiP2.api.cryptoApi.forceReload()\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n await checkAccessInfo(\n await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n await checkAccessInfo(\n await apiP1.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n await checkAccessInfo(\n await apiP2.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n })\n\n it('Hcp should be able to use de-anonymization metadata for parent', async () => {\n const hierarchy = await createHcpHierarchyApis(env)\n const patientInfo = await createUserAndApi('anonymous')\n let entity: CalendarItem = await hierarchy.parentApi.calendarItemApi.createCalendarItemWithHcParty(\n hierarchy.parentUser,\n await hierarchy.parentApi.calendarItemApi.newInstance(hierarchy.parentUser, { note: 'Calendar item note' })\n ) // Auto-shared with grandApi, but no de-anonymization metadata\n entity = await hierarchy.parentApi.calendarItemApi.shareWith(patientInfo.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n await hierarchy.parentApi.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [hierarchy.grandUser.healthcarePartyId!]\n )\n await patientInfo.api.cryptoApi.forceReload()\n const expectedAccess = {\n [hierarchy.parentUser.healthcarePartyId!]: AccessLevelEnum.WRITE,\n [hierarchy.grandUser.healthcarePartyId!]: AccessLevelEnum.WRITE,\n [patientInfo.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n }\n await checkAccessInfo(await hierarchy.parentApi.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await hierarchy.grandApi.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await hierarchy.child2Api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await patientInfo.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n })\n\n it('De-anonymization metadata should encrypt delegator and delegate, and its creation should be optimised', async () => {\n const apiA = await createUserAndApi('explicit')\n const apiB = await createUserAndApi('explicit')\n const apiP = await createUserAndApi('anonymous')\n let entity: CalendarItem = await apiA.api.calendarItemApi.createCalendarItemWithHcParty(\n apiA.userInfo.user,\n await apiA.api.calendarItemApi.newInstance(apiA.userInfo.user, { note: 'Calendar item note' })\n )\n entity = await apiA.api.calendarItemApi.shareWith(apiB.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await apiA.api.calendarItemApi.shareWith(apiP.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n await apiA.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiB.userInfo.dataOwnerId, apiP.userInfo.dataOwnerId]\n )\n const secureDelegationKeyMapApi = new IccSecureDelegationKeyMapApi(env.iCureUrl, {}, apiA.api.authApi.authenticationProvider, fetch)\n const secureDelegationKeyMaps = await secureDelegationKeyMapApi.getByDelegationKeys(\n { ids: Object.keys(entity.securityMetadata!.secureDelegations!) },\n []\n )\n expect(secureDelegationKeyMaps).to.have.length(1) // Only 1 is necessary -> only 1 is created\n expect(secureDelegationKeyMaps[0].delegator).to.be.undefined\n expect(secureDelegationKeyMaps[0].delegate).to.be.undefined\n const delegationKeyToPatient = Object.entries(entity.securityMetadata!.secureDelegations!).find(([_, v]) => v.delegate === undefined)![0]\n expect(delegationKeyToPatient).to.not.be.undefined\n expect(delegationKeyToPatient).to.not.be.empty\n expect(secureDelegationKeyMaps[0].delegationKey).to.equal(delegationKeyToPatient)\n })\n\n it('De-anonymization metadata should be usable for different entities of the same type', async () => {\n const apiA = await createUserAndApi('explicit')\n const apiB = await createUserAndApi('explicit')\n const apiP = await createUserAndApi('anonymous')\n let entity1: CalendarItem = await apiA.api.calendarItemApi.createCalendarItemWithHcParty(\n apiA.userInfo.user,\n await apiA.api.calendarItemApi.newInstance(apiA.userInfo.user, { note: 'Calendar item note' })\n )\n entity1 = await apiA.api.calendarItemApi.shareWith(apiB.userInfo.dataOwnerId, entity1, { requestedPermissions: FULL_WRITE })\n entity1 = await apiA.api.calendarItemApi.shareWith(apiP.userInfo.dataOwnerId, entity1, { requestedPermissions: FULL_WRITE })\n let entity2: CalendarItem = await apiA.api.calendarItemApi.createCalendarItemWithHcParty(\n apiA.userInfo.user,\n await apiA.api.calendarItemApi.newInstance(apiA.userInfo.user, { note: 'Calendar item note' })\n )\n entity2 = await apiA.api.calendarItemApi.shareWith(apiB.userInfo.dataOwnerId, entity2, { requestedPermissions: FULL_WRITE })\n entity2 = await apiA.api.calendarItemApi.shareWith(apiP.userInfo.dataOwnerId, entity2, { requestedPermissions: FULL_WRITE })\n await apiA.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity: entity1, type: EntityWithDelegationTypeName.CalendarItem },\n [apiB.userInfo.dataOwnerId]\n )\n const expectedAccess = {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n }\n await apiP.api.cryptoApi.forceReload()\n await checkAccessInfo(await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity1), expectedAccess, false)\n await checkAccessInfo(await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity1), expectedAccess, false)\n await checkAccessInfo(await apiP.api.calendarItemApi.getDataOwnersWithAccessTo(entity1), expectedAccess, false)\n await checkAccessInfo(await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity2), expectedAccess, false)\n await checkAccessInfo(await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity2), expectedAccess, false)\n await checkAccessInfo(await apiP.api.calendarItemApi.getDataOwnersWithAccessTo(entity2), expectedAccess, false)\n })\n\n it('De-anonymization metadata optimization: the metadata should not be re-shared with the anonymous delegator/delegate by third parties', async () => {\n const apiP1 = await createUserAndApi('anonymous')\n const apiP2 = await createUserAndApi('anonymous')\n const apiA = await createUserAndApi('explicit')\n let entity: CalendarItem = await apiP1.api.calendarItemApi.createCalendarItemWithHcParty(\n apiP1.userInfo.user,\n await apiP1.api.calendarItemApi.newInstance(apiP1.userInfo.user, { note: 'Calendar item note' })\n )\n entity = await apiP1.api.calendarItemApi.shareWith(apiP2.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await apiP1.api.calendarItemApi.shareWith(apiA.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n await apiP1.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiP2.userInfo.dataOwnerId, apiA.userInfo.dataOwnerId]\n )\n const p1ToP2DelegationKey = Object.entries(entity.securityMetadata!.secureDelegations!).find(\n ([_, v]) => v.delegate === undefined && v.delegator === undefined && v.parentDelegations !== undefined\n )![0]\n expect(p1ToP2DelegationKey).to.not.be.undefined\n expect(p1ToP2DelegationKey).to.not.be.empty\n const delegationMapApi = new IccSecureDelegationKeyMapApi(env.iCureUrl, {}, apiA.api.authApi.authenticationProvider, fetch)\n const delegationMapBeforeAttemptedResharingByA = (await delegationMapApi.getByDelegationKeys({ ids: [p1ToP2DelegationKey] }, []))[0]\n expect(delegationMapBeforeAttemptedResharingByA).to.not.be.undefined\n expect(Object.keys(delegationMapBeforeAttemptedResharingByA.securityMetadata!.secureDelegations!)).to.have.length(3)\n await apiA.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiP2.userInfo.dataOwnerId, apiP1.userInfo.dataOwnerId]\n )\n const delegationMapAfterAttemptedResharingByA = (await delegationMapApi.getByDelegationKeys({ ids: [p1ToP2DelegationKey] }, []))[0]\n expect(delegationMapAfterAttemptedResharingByA).to.not.be.undefined\n expect(Object.keys(delegationMapAfterAttemptedResharingByA.securityMetadata!.secureDelegations!)).to.have.length(3)\n expect(delegationMapAfterAttemptedResharingByA.rev).to.equal(delegationMapBeforeAttemptedResharingByA.rev)\n })\n\n it('De-anonymization metadata should be shared only with selected data owners', async () => {\n const apiA = await createUserAndApi('explicit')\n const apiB = await createUserAndApi('explicit')\n const apiC = await createUserAndApi('explicit')\n const apiP = await createUserAndApi('anonymous')\n let entity: CalendarItem = await apiA.api.calendarItemApi.createCalendarItemWithHcParty(\n apiA.userInfo.user,\n await apiA.api.calendarItemApi.newInstance(apiA.userInfo.user, { note: 'Calendar item note' })\n )\n entity = await apiA.api.calendarItemApi.shareWith(apiB.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await apiA.api.calendarItemApi.shareWith(apiC.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await apiA.api.calendarItemApi.shareWith(apiP.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n await apiA.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiB.userInfo.dataOwnerId]\n )\n const expectedAccess = {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiC.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n }\n await apiP.api.cryptoApi.forceReload()\n await checkAccessInfo(await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await apiP.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n // Except C does not know about P, because he was not given access to the relevant metadata.\n await checkAccessInfo(\n await apiC.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiC.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n })\n\n it('A member of a delegation should be able to update the corresponding de-anonymization metadata even if he was not the original creator', async () => {\n const hierarchy = await createHcpHierarchyApis(env)\n const apiA = await createUserAndApi('explicit')\n const apiB = await createUserAndApi('explicit')\n const apiC = await createUserAndApi('explicit')\n const apiP = await createUserAndApi('anonymous')\n // Parent -> A, B, C, P\n let entity: CalendarItem = await hierarchy.grandApi.calendarItemApi.createCalendarItemWithHcParty(\n hierarchy.grandUser,\n await hierarchy.grandApi.calendarItemApi.newInstance(hierarchy.grandUser, { note: 'Calendar item note' })\n )\n entity = await hierarchy.grandApi.calendarItemApi.shareWith(apiA.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await hierarchy.grandApi.calendarItemApi.shareWith(apiB.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await hierarchy.grandApi.calendarItemApi.shareWith(apiC.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await hierarchy.grandApi.calendarItemApi.shareWith(apiP.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n // Child shares deanon info with A\n await hierarchy.parentApi.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiA.userInfo.dataOwnerId]\n )\n // P shares with B\n await apiP.api.cryptoApi.forceReload()\n await apiP.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiB.userInfo.dataOwnerId]\n )\n // Parent shares with C\n await hierarchy.grandApi.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiC.userInfo.dataOwnerId]\n )\n const expectedAccess = {\n [hierarchy.grandUser.healthcarePartyId!]: AccessLevelEnum.WRITE,\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiC.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n }\n await checkAccessInfo(await hierarchy.grandApi.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await hierarchy.parentApi.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await apiC.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await apiP.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n const delegationKeyMapApi = new IccSecureDelegationKeyMapApi(env.iCureUrl, {}, hierarchy.grandApi.authApi.authenticationProvider, fetch)\n const delegationKeyToP = Object.entries(entity.securityMetadata!.secureDelegations!).find(([_, v]) => v.delegate === undefined)![0]\n expect(delegationKeyToP).to.not.be.undefined\n expect(delegationKeyToP).to.not.be.empty\n const delegationKeyMaps = await delegationKeyMapApi.getByDelegationKeys({ ids: Object.keys(entity.securityMetadata!.secureDelegations!) }, [])\n expect(delegationKeyMaps).to.have.length(1) // Only 1 anonymous, shared by everyone\n })\n\n typeCombinations.forEach(([delegatorType, delegateType]) => {\n it(`should allow delegate to find and decrypt an entity shared with him (${delegatorType}->${delegateType})`, async () => {\n const delegatorApi = await createUserAndApi(delegatorType)\n const delegateApi = await createUserAndApi(delegateType)\n const data = await createAndShareData(delegatorApi.api, delegatorApi.userInfo, delegateApi.userInfo)\n await delegateApi.api.cryptoApi.forceReload()\n await checkCanFindAndDecrypt(delegateApi.api, data)\n await checkCanFindAndDecrypt(delegatorApi.api, data)\n })\n\n it(`should allow delegator to find and decrypt an entity shared with others after give-access-back (${delegatorType}->${delegateType})`, async function () {\n if (delegatorType == delegateType || delegatorType != 'explicit') {\n const delegatorApi = await createUserAndApi(delegatorType)\n const delegateApi = await createUserAndApi(delegateType)\n const data = await createAndShareData(delegatorApi.api, delegatorApi.userInfo, delegateApi.userInfo)\n const delegatorApiAfterGiveAccessBack = await loseKeyAndGiveAccessBack(delegatorApi.userInfo, delegateApi.api, delegateApi.userInfo)\n await delegateApi.api.cryptoApi.forceReload()\n await checkCanFindAndDecrypt(delegateApi.api, data)\n await checkCanFindAndDecrypt(delegatorApi.api, data)\n await checkCanFindAndDecrypt(delegatorApiAfterGiveAccessBack, data)\n } else {\n console.warn('Currently not supported, will be in future')\n }\n })\n\n it(`should allow delegate to find and decrypt an entity shared with him after give-access-back (${delegatorType}->${delegateType})`, async function () {\n if (delegatorType == delegateType || delegateType != 'explicit') {\n const delegatorApi = await createUserAndApi(delegatorType)\n const delegateApi = await createUserAndApi(delegateType)\n const data = await createAndShareData(delegatorApi.api, delegatorApi.userInfo, delegateApi.userInfo)\n const delegateApiAfterGiveAccessBack = await loseKeyAndGiveAccessBack(delegateApi.userInfo, delegatorApi.api, delegatorApi.userInfo)\n await delegateApi.api.cryptoApi.forceReload()\n await checkCanFindAndDecrypt(delegateApi.api, data)\n await checkCanFindAndDecrypt(delegatorApi.api, data)\n await checkCanFindAndDecrypt(delegateApiAfterGiveAccessBack, data)\n } else {\n console.warn('Currently not supported, will be in future')\n }\n })\n })\n})\n"]}
|
|
1
|
+
{"version":3,"file":"anonymous-delegations-test.js","sourceRoot":"","sources":["../../../../test/icc-x-api/crypto/anonymous-delegations-test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect } from 'chai'\nimport { before } from 'mocha'\nimport { createHcpHierarchyApis, getEnvironmentInitializer, getTempEmail, setLocalStorage, TestUtils } from '../../utils/test_utils'\nimport { webcrypto } from 'crypto'\nimport 'isomorphic-fetch'\nimport { Apis, WebCryptoPrimitives, EntityWithDelegationTypeName, ShaVersion } from '../../../icc-x-api'\nimport { User } from '../../../icc-api/model/User'\nimport { Patient } from '../../../icc-api/model/Patient'\nimport { HealthElement } from '../../../icc-api/model/HealthElement'\nimport { HealthcareParty } from '../../../icc-api/model/HealthcareParty'\nimport { v4 as uuid } from 'uuid'\nimport { TestApi } from '../../utils/TestApi'\nimport { CryptoPrimitives } from '../../../icc-x-api/crypto/CryptoPrimitives'\nimport { FilterChainMaintenanceTask } from '../../../icc-api/model/FilterChainMaintenanceTask'\nimport { MaintenanceTaskAfterDateFilter } from '../../../icc-x-api/filters/MaintenanceTaskAfterDateFilter'\nimport { KeyPairUpdateRequest } from '../../../icc-x-api/maintenance/KeyPairUpdateRequest'\nimport { EntityShareRequest } from '../../../icc-api/model/requests/EntityShareRequest'\nimport { MaintenanceTask } from '../../../icc-api/model/MaintenanceTask'\nimport * as _ from 'lodash'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { SecureDelegation } from '../../../icc-api/model/SecureDelegation'\nimport { CalendarItem } from '../../../icc-api/model/CalendarItem'\nimport { DataOwnerTypeEnum } from '../../../icc-api/model/DataOwnerTypeEnum'\nimport { Message } from '../../../icc-api/model/Message'\nimport { IccSecureDelegationKeyMapApi } from '../../../icc-api/api/internal/IccSecureDelegationKeyMapApi'\nimport initMasterApi = TestUtils.initMasterApi\nimport RequestedPermissionEnum = EntityShareRequest.RequestedPermissionEnum\nimport AccessLevelEnum = SecureDelegation.AccessLevelEnum\n\nconst FULL_WRITE = RequestedPermissionEnum.FULL_WRITE\nconst FULL_READ = RequestedPermissionEnum.FULL_READ\n\nsetLocalStorage(fetch)\n\ntype DataOwnerType = 'explicit' | 'anonymous'\ntype UserInfo = { user: User; pw: string; dataOwnerId: string }\n\nconst typeCombinations: [DataOwnerType, DataOwnerType][] = [\n ['explicit', 'explicit'],\n ['anonymous', 'explicit'],\n ['explicit', 'anonymous'],\n ['anonymous', 'anonymous'],\n]\nlet env: TestVars\nlet masterApi: Apis\nlet masterUser: User\nconst primitives = new WebCryptoPrimitives(webcrypto as any)\n\ndescribe('Anonymous delegations', () => {\n before(async function () {\n this.timeout(6000000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n masterApi = await initMasterApi(env)\n masterUser = await masterApi.userApi.getCurrentUser()\n })\n\n async function createUserAndApi(userType: DataOwnerType): Promise<{ api: Apis; userInfo: UserInfo }> {\n const dataOwner =\n userType === 'explicit'\n ? await masterApi.healthcarePartyApi.createHealthcareParty(new HealthcareParty({ id: uuid(), firstName: 'test', lastName: 'test' }))\n : await masterApi.patientApi.createPatientWithUser(\n masterUser,\n await masterApi.patientApi.newInstance(masterUser, new Patient({ id: uuid(), firstName: 'test', lastName: 'test' }))\n )\n const login = uuid()\n const user = await masterApi.userApi.createUser(\n new User({\n id: login,\n name: login,\n login: login,\n email: getTempEmail(),\n status: 'ACTIVE',\n healthcarePartyId: userType === 'explicit' ? dataOwner.id : undefined,\n patientId: userType === 'anonymous' ? dataOwner.id : undefined,\n })\n )\n const pw = await masterApi.userApi.getToken(user.id!, uuid())\n return {\n api: await TestApi(env.iCureUrl, login, pw, webcrypto as any),\n userInfo: { user, pw, dataOwnerId: dataOwner.id! },\n }\n }\n\n async function dataOwnerIdsForSearch(apis: Apis, dataOwnerId: string, entityType: EntityWithDelegationTypeName): Promise<string[]> {\n const delegationKeys = await apis.cryptoApi.exchangeData.getAllDelegationKeys(entityType)\n if (delegationKeys) {\n return delegationKeys\n } else {\n return [dataOwnerId]\n }\n }\n\n async function loseKeyAndGiveAccessBack(userThatLosesKey: UserInfo, apiToGiveAccessBack: Apis, userGivingAccessBack: UserInfo): Promise<Apis> {\n const timeBeforeNewKey = new Date().getTime()\n const newKeyPair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const newApi = await TestApi(env.iCureUrl, userThatLosesKey.user.login!, userThatLosesKey.pw, webcrypto as any, newKeyPair, {\n createMaintenanceTasksOnNewKey: false,\n })\n await newApi.icureMaintenanceTaskApi.createMaintenanceTasksForNewKeypair(userThatLosesKey.user, newKeyPair, [\n DataOwnerTypeEnum.Patient,\n DataOwnerTypeEnum.Hcp,\n ])\n await apiToGiveAccessBack.cryptoApi.forceReload()\n const searchIds = await dataOwnerIdsForSearch(apiToGiveAccessBack, userGivingAccessBack.dataOwnerId, EntityWithDelegationTypeName.MaintenanceTask)\n const keyPairUpdateRequests = await searchIds\n .reduce(async (acc, searchId) => {\n const awaitedAcc = await acc\n const currResult = await apiToGiveAccessBack.maintenanceTaskApi.filterMaintenanceTasksByWithUser(\n userGivingAccessBack.user,\n undefined,\n undefined,\n new FilterChainMaintenanceTask({\n filter: new MaintenanceTaskAfterDateFilter({\n date: timeBeforeNewKey,\n healthcarePartyId: searchId,\n }),\n })\n )\n return [...awaitedAcc, ...currResult.rows!]\n }, Promise.resolve([] as MaintenanceTask[]))\n .then((tasks) => tasks.map((task) => KeyPairUpdateRequest.fromMaintenanceTask(task)))\n const concernedRequest = keyPairUpdateRequests.filter((x) => x.concernedDataOwnerId === userThatLosesKey.dataOwnerId)\n expect(concernedRequest).to.have.length(1)\n await apiToGiveAccessBack.icureMaintenanceTaskApi.applyKeyPairUpdate(concernedRequest[0])\n await newApi.cryptoApi.forceReload()\n return newApi\n }\n\n async function createAndShareData(\n creatorApis: Apis,\n creatorInfo: UserInfo,\n delegateInfo: UserInfo\n ): Promise<{ patient: Patient; healthElements: HealthElement[] }> {\n const patient = await masterApi.patientApi.createPatientWithUser(\n masterUser,\n await masterApi.patientApi.newInstance(masterUser, new Patient({ id: uuid(), firstName: 'test', lastName: 'test', note: 'Patient note' }))\n )\n const secretIds = await masterApi.patientApi.decryptSecretIdsOf(patient)\n const updatedPatient1 = await masterApi.patientApi.shareWith(creatorInfo.dataOwnerId, patient, secretIds, { requestedPermissions: FULL_WRITE })\n await creatorApis.cryptoApi.forceReload()\n const updatedPatient2 = await creatorApis.patientApi.shareWith(delegateInfo.dataOwnerId, updatedPatient1, secretIds, {\n requestedPermissions: FULL_WRITE,\n })\n const healthElements: HealthElement[] = []\n for (let i = 0; i < 5; i++) {\n const he = await creatorApis.healthcareElementApi.createHealthElementWithUser(\n creatorInfo.user,\n await creatorApis.healthcareElementApi.newInstance(creatorInfo.user, updatedPatient2, { note: `Health element note - ${i}` })\n )\n const sharedHe = await creatorApis.healthcareElementApi.shareWith(delegateInfo.dataOwnerId, he, { requestedPermissions: FULL_WRITE })\n healthElements.push(sharedHe)\n }\n expect(updatedPatient2.note).to.not.be.undefined\n for (const he of healthElements) {\n expect(he.note).to.not.be.undefined\n }\n return { patient: updatedPatient2, healthElements }\n }\n\n async function checkCanFindAndDecrypt(apis: Apis, expected: { patient: Patient; healthElements: HealthElement[] }) {\n const user = await apis.userApi.getCurrentUser()\n const patient = await apis.patientApi.getPatientWithUser(user, expected.patient.id!)\n expect(patient.note).to.equal(expected.patient.note)\n const searchIds = await dataOwnerIdsForSearch(apis, apis.dataOwnerApi.getDataOwnerIdOf(user), EntityWithDelegationTypeName.HealthElement)\n const patientKeys = await apis.patientApi.decryptSecretIdsOf(patient)\n expect(patientKeys).to.not.be.empty\n const sfks = _.uniq(patientKeys).join(',')\n const retrievedHealthElements = _.uniqBy(\n await searchIds.reduce(async (acc, searchId) => {\n const awaitedAcc = await acc\n const currResult = await apis.healthcareElementApi.findByHCPartyPatientSecretFKeys(searchId, sfks)\n return [...awaitedAcc, ...currResult]\n }, Promise.resolve([] as HealthElement[])),\n (x) => x.id\n )\n expect(retrievedHealthElements.length).to.equal(expected.healthElements.length)\n for (const expectedHe of expected.healthElements) {\n const retrievedHe = retrievedHealthElements.find((x) => x.id === expectedHe.id)\n expect(retrievedHe).to.not.be.undefined\n expect(retrievedHe!.note).to.equal(expectedHe.note)\n }\n }\n\n async function checkAccessInfo(\n actualAccessInfo: { permissionsByDataOwnerId: { [p: string]: AccessLevelEnum }; hasUnknownAnonymousDataOwners: boolean },\n expectedDataOwnersWithAccess: { [dataOwnerId: string]: AccessLevelEnum },\n expectedHasUnknownAnonymousDataOwners: boolean\n ) {\n expect(Object.keys(actualAccessInfo.permissionsByDataOwnerId)).to.have.members(Object.keys(expectedDataOwnersWithAccess))\n expect(actualAccessInfo.hasUnknownAnonymousDataOwners).to.equal(expectedHasUnknownAnonymousDataOwners)\n for (const [dataOwnerId, expectedLevel] of Object.entries(expectedDataOwnersWithAccess)) {\n expect(actualAccessInfo.permissionsByDataOwnerId[dataOwnerId]).to.equal(expectedLevel)\n }\n }\n\n it('without de-anonymisation metadata the data owners should be able to identify anonymous delegates only if they are part of the delegation with that delegate.', async () => {\n const apiA = await createUserAndApi('explicit')\n const apiB = await createUserAndApi('explicit')\n const apiP1 = await createUserAndApi('anonymous')\n const apiP2 = await createUserAndApi('anonymous')\n let entity: CalendarItem = await apiA.api.calendarItemApi.createCalendarItemWithHcParty(\n apiA.userInfo.user,\n await apiA.api.calendarItemApi.newInstance(apiA.userInfo.user, { note: 'Calendar item note' })\n )\n /*\n * A->A\n */\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n { [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE },\n false\n )\n entity = await apiA.api.calendarItemApi.shareWith(apiB.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n /*\n * A->A A->B\n */\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n await checkAccessInfo(\n await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n /*\n * A->A A->B\n * A->P1\n */\n entity = await apiA.api.calendarItemApi.shareWith(apiP1.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n await apiP1.api.cryptoApi.forceReload()\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n await checkAccessInfo(\n await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n await checkAccessInfo(\n await apiP1.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n /*\n * A->A A->B B->P1\n * A->P1\n */\n entity = await apiB.api.calendarItemApi.shareWith(apiP1.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_READ })\n await apiP1.api.cryptoApi.forceReload()\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n await checkAccessInfo(\n await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.READ,\n },\n true\n )\n await checkAccessInfo(\n await apiP1.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n /*\n * A->A A->B B->P1\n * A->P1 P1->P2\n */\n entity = await apiP1.api.calendarItemApi.shareWith(apiP2.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_READ })\n await apiP2.api.cryptoApi.forceReload()\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n await checkAccessInfo(\n await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.READ,\n },\n true\n )\n await checkAccessInfo(\n await apiP1.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.READ,\n },\n false\n )\n await checkAccessInfo(\n await apiP2.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.READ, // P2 is only aware of the P1->P2 delegation\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.READ,\n },\n true\n )\n /*\n * A->A A->B B->P1\n * A->P1 P1->P2\n * A->P2\n */\n entity = await apiA.api.calendarItemApi.shareWith(apiP2.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n await apiP2.api.cryptoApi.forceReload()\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n await checkAccessInfo(\n await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.READ,\n },\n true\n )\n await checkAccessInfo(\n await apiP1.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.READ,\n },\n true\n )\n await checkAccessInfo(\n await apiP2.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.READ, // P2 is only aware of the P1->P2 delegation\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n })\n\n it('without de-anonymisation metadata the data owners should be able to identify anonymous delegates only if their parent is part of the delegation with that delegate.', async () => {\n const { parentApi: childApi, parentUser: childUser, grandApi: parentApi, grandUser: parentUser } = await createHcpHierarchyApis(env) // Want to use only hcp with one parent\n const patientInfo = await createUserAndApi('anonymous')\n let entity: Message = await parentApi.messageApi.createMessageWithUser(\n parentUser,\n await parentApi.messageApi.newInstanceWithPatient(parentUser, null, { subject: 'A simple subject' })\n )\n entity = await parentApi.messageApi.shareWith(patientInfo.userInfo.dataOwnerId, entity, [], { requestedPermissions: FULL_WRITE })\n await patientInfo.api.cryptoApi.forceReload()\n const expectedAccess = {\n // No child user: has no direct access, only access through parent delegation\n [parentUser.healthcarePartyId!]: AccessLevelEnum.WRITE,\n [patientInfo.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n }\n await checkAccessInfo(await childApi.messageApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await parentApi.messageApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await patientInfo.api.messageApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n })\n\n it('de-anonymisation metadata should allow data owners that are not part of a delegation to figure out the members of that delegation.', async () => {\n const apiA = await createUserAndApi('explicit')\n const apiB = await createUserAndApi('explicit')\n const apiP1 = await createUserAndApi('anonymous')\n const apiP2 = await createUserAndApi('anonymous')\n let entity: CalendarItem = await apiA.api.calendarItemApi.createCalendarItemWithHcParty(\n apiA.userInfo.user,\n await apiA.api.calendarItemApi.newInstance(apiA.userInfo.user, { note: 'Calendar item note' })\n )\n entity = await apiA.api.calendarItemApi.shareWith(apiB.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await apiA.api.calendarItemApi.shareWith(apiP1.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await apiB.api.calendarItemApi.shareWith(apiP1.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_READ })\n await apiP1.api.cryptoApi.forceReload()\n entity = await apiP1.api.calendarItemApi.shareWith(apiP2.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_READ })\n entity = await apiA.api.calendarItemApi.shareWith(apiP2.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n /*\n * A->A A->B B->?P1\n * A->?P1 P1->?P2\n * A->?P2\n */\n await apiA.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiB.userInfo.dataOwnerId, apiP1.userInfo.dataOwnerId, apiP2.userInfo.dataOwnerId]\n )\n /*\n * A can create de-anonymization metadata for his delegations.\n * A->A A->B B->?P1\n * A->P1 P1->?P2\n * A->P2\n */\n await apiP1.api.cryptoApi.forceReload()\n await apiP2.api.cryptoApi.forceReload()\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n await checkAccessInfo(\n await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n await checkAccessInfo(\n await apiP1.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n await checkAccessInfo(\n await apiP2.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n await apiP1.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiB.userInfo.dataOwnerId, apiA.userInfo.dataOwnerId, apiP2.userInfo.dataOwnerId]\n )\n /* Both delegator and delegate can create de-anonymization metadata for a delegation.\n * A->A A->B B->P1\n * A->P1 P1->P2\n * A->P2\n */\n await apiP1.api.cryptoApi.forceReload()\n await apiP2.api.cryptoApi.forceReload()\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n await checkAccessInfo(\n await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n await checkAccessInfo(\n await apiP1.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n await checkAccessInfo(\n await apiP2.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n })\n\n it('Hcp should be able to use de-anonymization metadata for parent', async () => {\n const hierarchy = await createHcpHierarchyApis(env)\n const patientInfo = await createUserAndApi('anonymous')\n let entity: CalendarItem = await hierarchy.parentApi.calendarItemApi.createCalendarItemWithHcParty(\n hierarchy.parentUser,\n await hierarchy.parentApi.calendarItemApi.newInstance(hierarchy.parentUser, { note: 'Calendar item note' })\n ) // Auto-shared with grandApi, but no de-anonymization metadata\n entity = await hierarchy.parentApi.calendarItemApi.shareWith(patientInfo.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n await hierarchy.parentApi.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [hierarchy.grandUser.healthcarePartyId!]\n )\n await patientInfo.api.cryptoApi.forceReload()\n const expectedAccess = {\n [hierarchy.parentUser.healthcarePartyId!]: AccessLevelEnum.WRITE,\n [hierarchy.grandUser.healthcarePartyId!]: AccessLevelEnum.WRITE,\n [patientInfo.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n }\n await checkAccessInfo(await hierarchy.parentApi.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await hierarchy.grandApi.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await hierarchy.child2Api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await patientInfo.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n })\n\n it('De-anonymization metadata should encrypt delegator and delegate, and its creation should be optimised', async () => {\n const apiA = await createUserAndApi('explicit')\n const apiB = await createUserAndApi('explicit')\n const apiP = await createUserAndApi('anonymous')\n let entity: CalendarItem = await apiA.api.calendarItemApi.createCalendarItemWithHcParty(\n apiA.userInfo.user,\n await apiA.api.calendarItemApi.newInstance(apiA.userInfo.user, { note: 'Calendar item note' })\n )\n entity = await apiA.api.calendarItemApi.shareWith(apiB.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await apiA.api.calendarItemApi.shareWith(apiP.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n await apiA.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiB.userInfo.dataOwnerId, apiP.userInfo.dataOwnerId]\n )\n const secureDelegationKeyMapApi = new IccSecureDelegationKeyMapApi(env.iCureUrl, {}, apiA.api.authApi.authenticationProvider, fetch)\n const secureDelegationKeyMaps = await secureDelegationKeyMapApi.getByDelegationKeys(\n { ids: Object.keys(entity.securityMetadata!.secureDelegations!) },\n []\n )\n expect(secureDelegationKeyMaps).to.have.length(1) // Only 1 is necessary -> only 1 is created\n expect(secureDelegationKeyMaps[0].delegator).to.be.undefined\n expect(secureDelegationKeyMaps[0].delegate).to.be.undefined\n const delegationKeyToPatient = Object.entries(entity.securityMetadata!.secureDelegations!).find(([_, v]) => v.delegate === undefined)![0]\n expect(delegationKeyToPatient).to.not.be.undefined\n expect(delegationKeyToPatient).to.not.be.empty\n expect(secureDelegationKeyMaps[0].delegationKey).to.equal(delegationKeyToPatient)\n })\n\n it('De-anonymization metadata should be usable for different entities of the same type', async () => {\n const apiA = await createUserAndApi('explicit')\n const apiB = await createUserAndApi('explicit')\n const apiP = await createUserAndApi('anonymous')\n let entity1: CalendarItem = await apiA.api.calendarItemApi.createCalendarItemWithHcParty(\n apiA.userInfo.user,\n await apiA.api.calendarItemApi.newInstance(apiA.userInfo.user, { note: 'Calendar item note' })\n )\n entity1 = await apiA.api.calendarItemApi.shareWith(apiB.userInfo.dataOwnerId, entity1, { requestedPermissions: FULL_WRITE })\n entity1 = await apiA.api.calendarItemApi.shareWith(apiP.userInfo.dataOwnerId, entity1, { requestedPermissions: FULL_WRITE })\n let entity2: CalendarItem = await apiA.api.calendarItemApi.createCalendarItemWithHcParty(\n apiA.userInfo.user,\n await apiA.api.calendarItemApi.newInstance(apiA.userInfo.user, { note: 'Calendar item note' })\n )\n entity2 = await apiA.api.calendarItemApi.shareWith(apiB.userInfo.dataOwnerId, entity2, { requestedPermissions: FULL_WRITE })\n entity2 = await apiA.api.calendarItemApi.shareWith(apiP.userInfo.dataOwnerId, entity2, { requestedPermissions: FULL_WRITE })\n await apiA.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity: entity1, type: EntityWithDelegationTypeName.CalendarItem },\n [apiB.userInfo.dataOwnerId]\n )\n const expectedAccess = {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n }\n await apiP.api.cryptoApi.forceReload()\n await checkAccessInfo(await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity1), expectedAccess, false)\n await checkAccessInfo(await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity1), expectedAccess, false)\n await checkAccessInfo(await apiP.api.calendarItemApi.getDataOwnersWithAccessTo(entity1), expectedAccess, false)\n await checkAccessInfo(await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity2), expectedAccess, false)\n await checkAccessInfo(await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity2), expectedAccess, false)\n await checkAccessInfo(await apiP.api.calendarItemApi.getDataOwnersWithAccessTo(entity2), expectedAccess, false)\n })\n\n it('De-anonymization metadata optimization: the metadata should not be re-shared with the anonymous delegator/delegate by third parties', async () => {\n const apiP1 = await createUserAndApi('anonymous')\n const apiP2 = await createUserAndApi('anonymous')\n const apiA = await createUserAndApi('explicit')\n let entity: CalendarItem = await apiP1.api.calendarItemApi.createCalendarItemWithHcParty(\n apiP1.userInfo.user,\n await apiP1.api.calendarItemApi.newInstance(apiP1.userInfo.user, { note: 'Calendar item note' })\n )\n entity = await apiP1.api.calendarItemApi.shareWith(apiP2.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await apiP1.api.calendarItemApi.shareWith(apiA.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n await apiP1.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiP2.userInfo.dataOwnerId, apiA.userInfo.dataOwnerId]\n )\n const p1ToP2DelegationKey = Object.entries(entity.securityMetadata!.secureDelegations!).find(\n ([_, v]) => v.delegate === undefined && v.delegator === undefined && v.parentDelegations !== undefined\n )![0]\n expect(p1ToP2DelegationKey).to.not.be.undefined\n expect(p1ToP2DelegationKey).to.not.be.empty\n const delegationMapApi = new IccSecureDelegationKeyMapApi(env.iCureUrl, {}, apiA.api.authApi.authenticationProvider, fetch)\n const delegationMapBeforeAttemptedResharingByA = (await delegationMapApi.getByDelegationKeys({ ids: [p1ToP2DelegationKey] }, []))[0]\n expect(delegationMapBeforeAttemptedResharingByA).to.not.be.undefined\n expect(Object.keys(delegationMapBeforeAttemptedResharingByA.securityMetadata!.secureDelegations!)).to.have.length(3)\n await apiA.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiP2.userInfo.dataOwnerId, apiP1.userInfo.dataOwnerId]\n )\n const delegationMapAfterAttemptedResharingByA = (await delegationMapApi.getByDelegationKeys({ ids: [p1ToP2DelegationKey] }, []))[0]\n expect(delegationMapAfterAttemptedResharingByA).to.not.be.undefined\n expect(Object.keys(delegationMapAfterAttemptedResharingByA.securityMetadata!.secureDelegations!)).to.have.length(3)\n expect(delegationMapAfterAttemptedResharingByA.rev).to.equal(delegationMapBeforeAttemptedResharingByA.rev)\n })\n\n it('De-anonymization metadata should be shared only with selected data owners', async () => {\n const apiA = await createUserAndApi('explicit')\n const apiB = await createUserAndApi('explicit')\n const apiC = await createUserAndApi('explicit')\n const apiP = await createUserAndApi('anonymous')\n let entity: CalendarItem = await apiA.api.calendarItemApi.createCalendarItemWithHcParty(\n apiA.userInfo.user,\n await apiA.api.calendarItemApi.newInstance(apiA.userInfo.user, { note: 'Calendar item note' })\n )\n entity = await apiA.api.calendarItemApi.shareWith(apiB.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await apiA.api.calendarItemApi.shareWith(apiC.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await apiA.api.calendarItemApi.shareWith(apiP.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n await apiA.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiB.userInfo.dataOwnerId]\n )\n const expectedAccess = {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiC.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n }\n await apiP.api.cryptoApi.forceReload()\n await checkAccessInfo(await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await apiP.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n // Except C does not know about P, because he was not given access to the relevant metadata.\n await checkAccessInfo(\n await apiC.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiC.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n })\n\n it('A member of a delegation should be able to update the corresponding de-anonymization metadata even if he was not the original creator', async () => {\n const hierarchy = await createHcpHierarchyApis(env)\n const apiA = await createUserAndApi('explicit')\n const apiB = await createUserAndApi('explicit')\n const apiC = await createUserAndApi('explicit')\n const apiP = await createUserAndApi('anonymous')\n // Parent -> A, B, C, P\n let entity: CalendarItem = await hierarchy.grandApi.calendarItemApi.createCalendarItemWithHcParty(\n hierarchy.grandUser,\n await hierarchy.grandApi.calendarItemApi.newInstance(hierarchy.grandUser, { note: 'Calendar item note' })\n )\n entity = await hierarchy.grandApi.calendarItemApi.shareWith(apiA.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await hierarchy.grandApi.calendarItemApi.shareWith(apiB.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await hierarchy.grandApi.calendarItemApi.shareWith(apiC.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await hierarchy.grandApi.calendarItemApi.shareWith(apiP.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n // Child shares deanon info with A\n await hierarchy.parentApi.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiA.userInfo.dataOwnerId]\n )\n // P shares with B\n await apiP.api.cryptoApi.forceReload()\n await apiP.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiB.userInfo.dataOwnerId]\n )\n // Parent shares with C\n await hierarchy.grandApi.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiC.userInfo.dataOwnerId]\n )\n const expectedAccess = {\n [hierarchy.grandUser.healthcarePartyId!]: AccessLevelEnum.WRITE,\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiC.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n }\n await checkAccessInfo(await hierarchy.grandApi.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await hierarchy.parentApi.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await apiC.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await apiP.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n const delegationKeyMapApi = new IccSecureDelegationKeyMapApi(env.iCureUrl, {}, hierarchy.grandApi.authApi.authenticationProvider, fetch)\n const delegationKeyToP = Object.entries(entity.securityMetadata!.secureDelegations!).find(([_, v]) => v.delegate === undefined)![0]\n expect(delegationKeyToP).to.not.be.undefined\n expect(delegationKeyToP).to.not.be.empty\n const delegationKeyMaps = await delegationKeyMapApi.getByDelegationKeys({ ids: Object.keys(entity.securityMetadata!.secureDelegations!) }, [])\n expect(delegationKeyMaps).to.have.length(1) // Only 1 anonymous, shared by everyone\n })\n\n typeCombinations.forEach(([delegatorType, delegateType]) => {\n it(`should allow delegate to find and decrypt an entity shared with him (${delegatorType}->${delegateType})`, async () => {\n const delegatorApi = await createUserAndApi(delegatorType)\n const delegateApi = await createUserAndApi(delegateType)\n const data = await createAndShareData(delegatorApi.api, delegatorApi.userInfo, delegateApi.userInfo)\n await delegateApi.api.cryptoApi.forceReload()\n await checkCanFindAndDecrypt(delegateApi.api, data)\n await checkCanFindAndDecrypt(delegatorApi.api, data)\n })\n\n it(`should allow delegator to find and decrypt an entity shared with others after give-access-back (${delegatorType}->${delegateType})`, async function () {\n if (delegatorType == delegateType || delegatorType != 'explicit') {\n const delegatorApi = await createUserAndApi(delegatorType)\n const delegateApi = await createUserAndApi(delegateType)\n const data = await createAndShareData(delegatorApi.api, delegatorApi.userInfo, delegateApi.userInfo)\n const delegatorApiAfterGiveAccessBack = await loseKeyAndGiveAccessBack(delegatorApi.userInfo, delegateApi.api, delegateApi.userInfo)\n await delegateApi.api.cryptoApi.forceReload()\n await checkCanFindAndDecrypt(delegateApi.api, data)\n await checkCanFindAndDecrypt(delegatorApi.api, data)\n await checkCanFindAndDecrypt(delegatorApiAfterGiveAccessBack, data)\n } else {\n console.warn('Currently not supported, will be in future')\n }\n })\n\n it(`should allow delegate to find and decrypt an entity shared with him after give-access-back (${delegatorType}->${delegateType})`, async function () {\n if (delegatorType == delegateType || delegateType != 'explicit') {\n const delegatorApi = await createUserAndApi(delegatorType)\n const delegateApi = await createUserAndApi(delegateType)\n const data = await createAndShareData(delegatorApi.api, delegatorApi.userInfo, delegateApi.userInfo)\n const delegateApiAfterGiveAccessBack = await loseKeyAndGiveAccessBack(delegateApi.userInfo, delegatorApi.api, delegatorApi.userInfo)\n await delegateApi.api.cryptoApi.forceReload()\n await checkCanFindAndDecrypt(delegateApi.api, data)\n await checkCanFindAndDecrypt(delegatorApi.api, data)\n await checkCanFindAndDecrypt(delegateApiAfterGiveAccessBack, data)\n } else {\n console.warn('Currently not supported, will be in future')\n }\n })\n })\n})\n"]}
|