@icure/api 8.2.3 → 8.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (337) hide show
  1. package/icc-api/api/IccAuthApi.js +1 -1
  2. package/icc-api/api/IccAuthApi.js.map +1 -1
  3. package/icc-api/api/IccDocumentApi.js.map +1 -1
  4. package/icc-api/api/IccFormApi.js.map +1 -1
  5. package/icc-api/api/IccReceiptApi.js.map +1 -1
  6. package/icc-api/api/IccRestApiPath.js +1 -2
  7. package/icc-api/api/IccRestApiPath.js.map +1 -1
  8. package/icc-api/api/XHR.js +17 -8
  9. package/icc-api/api/XHR.js.map +1 -1
  10. package/icc-api/model/Address.js +1 -1
  11. package/icc-api/model/Address.js.map +1 -1
  12. package/icc-api/model/Amp.js +1 -1
  13. package/icc-api/model/Amp.js.map +1 -1
  14. package/icc-api/model/AmpComponent.js +1 -1
  15. package/icc-api/model/AmpComponent.js.map +1 -1
  16. package/icc-api/model/Ampp.js +1 -1
  17. package/icc-api/model/Ampp.js.map +1 -1
  18. package/icc-api/model/AmppComponent.js +1 -1
  19. package/icc-api/model/AmppComponent.js.map +1 -1
  20. package/icc-api/model/CareTeamMember.js +1 -1
  21. package/icc-api/model/CareTeamMember.js.map +1 -1
  22. package/icc-api/model/CareTeamMembership.js +1 -1
  23. package/icc-api/model/CareTeamMembership.js.map +1 -1
  24. package/icc-api/model/Code.js +1 -1
  25. package/icc-api/model/Code.js.map +1 -1
  26. package/icc-api/model/Contact.js.map +1 -1
  27. package/icc-api/model/Content.js.map +1 -1
  28. package/icc-api/model/DataOwnerTypeEnum.js +1 -1
  29. package/icc-api/model/DataOwnerTypeEnum.js.map +1 -1
  30. package/icc-api/model/DataOwnerWithType.js +1 -1
  31. package/icc-api/model/DataOwnerWithType.js.map +1 -1
  32. package/icc-api/model/DatabaseSynchronization.js +1 -1
  33. package/icc-api/model/DatabaseSynchronization.js.map +1 -1
  34. package/icc-api/model/Dmpp.js +1 -1
  35. package/icc-api/model/Dmpp.js.map +1 -1
  36. package/icc-api/model/Document.js +1 -1
  37. package/icc-api/model/Document.js.map +1 -1
  38. package/icc-api/model/DocumentTemplate.d.ts +1 -1
  39. package/icc-api/model/DocumentTemplate.js +1 -1
  40. package/icc-api/model/DocumentTemplate.js.map +1 -1
  41. package/icc-api/model/Editor.js +1 -1
  42. package/icc-api/model/Editor.js.map +1 -1
  43. package/icc-api/model/EfactInvoice.js +1 -1
  44. package/icc-api/model/EfactInvoice.js.map +1 -1
  45. package/icc-api/model/EmailOrSmsMessage.js +1 -1
  46. package/icc-api/model/EmailOrSmsMessage.js.map +1 -1
  47. package/icc-api/model/FlatRateTarification.js +1 -1
  48. package/icc-api/model/FlatRateTarification.js.map +1 -1
  49. package/icc-api/model/Formula.js +1 -1
  50. package/icc-api/model/Formula.js.map +1 -1
  51. package/icc-api/model/FrontEndMigration.js +1 -1
  52. package/icc-api/model/FrontEndMigration.js.map +1 -1
  53. package/icc-api/model/HealthElement.js +1 -1
  54. package/icc-api/model/HealthElement.js.map +1 -1
  55. package/icc-api/model/HealthcareParty.js +1 -1
  56. package/icc-api/model/HealthcareParty.js.map +1 -1
  57. package/icc-api/model/HealthcarePartyHistoryStatus.js +1 -1
  58. package/icc-api/model/HealthcarePartyHistoryStatus.js.map +1 -1
  59. package/icc-api/model/Ingredient.js +1 -1
  60. package/icc-api/model/Ingredient.js.map +1 -1
  61. package/icc-api/model/Invoice.js +1 -1
  62. package/icc-api/model/Invoice.js.map +1 -1
  63. package/icc-api/model/InvoiceItem.js +1 -1
  64. package/icc-api/model/InvoiceItem.js.map +1 -1
  65. package/icc-api/model/InvoicingCode.js +1 -1
  66. package/icc-api/model/InvoicingCode.js.map +1 -1
  67. package/icc-api/model/MaintenanceTask.js +1 -1
  68. package/icc-api/model/MaintenanceTask.js.map +1 -1
  69. package/icc-api/model/Measure.js.map +1 -1
  70. package/icc-api/model/MedicalHouseContract.js +1 -1
  71. package/icc-api/model/MedicalHouseContract.js.map +1 -1
  72. package/icc-api/model/ModelHelper.js +9 -10
  73. package/icc-api/model/ModelHelper.js.map +1 -1
  74. package/icc-api/model/Partnership.js +1 -1
  75. package/icc-api/model/Partnership.js.map +1 -1
  76. package/icc-api/model/Patient.js +1 -1
  77. package/icc-api/model/Patient.js.map +1 -1
  78. package/icc-api/model/PatientByHcPartyGenderEducationProfession.js +1 -1
  79. package/icc-api/model/PatientByHcPartyGenderEducationProfession.js.map +1 -1
  80. package/icc-api/model/PatientHealthCareParty.js +1 -1
  81. package/icc-api/model/PatientHealthCareParty.js.map +1 -1
  82. package/icc-api/model/Payment.js +1 -1
  83. package/icc-api/model/Payment.js.map +1 -1
  84. package/icc-api/model/PermissionCriterion.js +1 -1
  85. package/icc-api/model/PermissionCriterion.js.map +1 -1
  86. package/icc-api/model/PermissionItem.js +1 -1
  87. package/icc-api/model/PermissionItem.js.map +1 -1
  88. package/icc-api/model/PersonName.js +1 -1
  89. package/icc-api/model/PersonName.js.map +1 -1
  90. package/icc-api/model/PropertyTypeStub.js +1 -1
  91. package/icc-api/model/PropertyTypeStub.js.map +1 -1
  92. package/icc-api/model/Reimbursement.js +1 -1
  93. package/icc-api/model/Reimbursement.js.map +1 -1
  94. package/icc-api/model/RoleSourceEnum.js +1 -1
  95. package/icc-api/model/RoleSourceEnum.js.map +1 -1
  96. package/icc-api/model/SecureDelegation.js +1 -1
  97. package/icc-api/model/SecureDelegation.js.map +1 -1
  98. package/icc-api/model/Service.js.map +1 -1
  99. package/icc-api/model/StandardSubstance.js +1 -1
  100. package/icc-api/model/StandardSubstance.js.map +1 -1
  101. package/icc-api/model/SumehrValidity.js +1 -1
  102. package/icc-api/model/SumehrValidity.js.map +1 -1
  103. package/icc-api/model/Tarification.js +1 -1
  104. package/icc-api/model/Tarification.js.map +1 -1
  105. package/icc-api/model/Telecom.js +1 -1
  106. package/icc-api/model/Telecom.js.map +1 -1
  107. package/icc-api/model/Topic.js +1 -1
  108. package/icc-api/model/Topic.js.map +1 -1
  109. package/icc-api/model/TypedValueObject.js +1 -1
  110. package/icc-api/model/TypedValueObject.js.map +1 -1
  111. package/icc-api/model/User.js +1 -1
  112. package/icc-api/model/User.js.map +1 -1
  113. package/icc-api/model/UserTypeEnum.js +1 -1
  114. package/icc-api/model/UserTypeEnum.js.map +1 -1
  115. package/icc-api/model/VirtualIngredient.js +1 -1
  116. package/icc-api/model/VirtualIngredient.js.map +1 -1
  117. package/icc-api/model/internal/RecoveryData.js +1 -1
  118. package/icc-api/model/internal/RecoveryData.js.map +1 -1
  119. package/icc-api/model/requests/EntityBulkShareResult.js.map +1 -1
  120. package/icc-api/model/requests/EntityShareOrMetadataUpdateRequest.js.map +1 -1
  121. package/icc-api/model/requests/EntityShareRequest.js +1 -1
  122. package/icc-api/model/requests/EntityShareRequest.js.map +1 -1
  123. package/icc-api/model/requests/EntitySharedMetadataUpdateRequest.js +1 -1
  124. package/icc-api/model/requests/EntitySharedMetadataUpdateRequest.js.map +1 -1
  125. package/icc-x-api/auth/AuthenticationProvider.js.map +1 -1
  126. package/icc-x-api/auth/BasicAuthService.js.map +1 -1
  127. package/icc-x-api/auth/EnsembleAuthService.js.map +1 -1
  128. package/icc-x-api/auth/JwtAuthService.js.map +1 -1
  129. package/icc-x-api/auth/JwtBridgedAuthService.d.ts +1 -1
  130. package/icc-x-api/auth/JwtBridgedAuthService.js +1 -1
  131. package/icc-x-api/auth/JwtBridgedAuthService.js.map +1 -1
  132. package/icc-x-api/auth/JwtUtils.js +3 -4
  133. package/icc-x-api/auth/JwtUtils.js.map +1 -1
  134. package/icc-x-api/auth/NoAuthService.js.map +1 -1
  135. package/icc-x-api/auth/SmartAuthProvider.d.ts +1 -1
  136. package/icc-x-api/auth/SmartAuthProvider.js +1 -1
  137. package/icc-x-api/auth/SmartAuthProvider.js.map +1 -1
  138. package/icc-x-api/crypto/AES.js.map +1 -1
  139. package/icc-x-api/crypto/AccessControlKeysHeadersProvider.js.map +1 -1
  140. package/icc-x-api/crypto/AccessControlSecretUtils.js.map +1 -1
  141. package/icc-x-api/crypto/BaseExchangeDataManager.js +10 -10
  142. package/icc-x-api/crypto/BaseExchangeDataManager.js.map +1 -1
  143. package/icc-x-api/crypto/BaseExchangeKeysManager.js +4 -4
  144. package/icc-x-api/crypto/BaseExchangeKeysManager.js.map +1 -1
  145. package/icc-x-api/crypto/CryptoStrategies.d.ts +5 -7
  146. package/icc-x-api/crypto/CryptoStrategies.js.map +1 -1
  147. package/icc-x-api/crypto/DelegationsDeAnonymization.js +1 -1
  148. package/icc-x-api/crypto/DelegationsDeAnonymization.js.map +1 -1
  149. package/icc-x-api/crypto/ExchangeDataManager.js +7 -8
  150. package/icc-x-api/crypto/ExchangeDataManager.js.map +1 -1
  151. package/icc-x-api/crypto/ExchangeDataMapManager.js.map +1 -1
  152. package/icc-x-api/crypto/ExchangeKeysManager.js +1 -1
  153. package/icc-x-api/crypto/ExchangeKeysManager.js.map +1 -1
  154. package/icc-x-api/crypto/ExtendedApisUtilsImpl.js +11 -10
  155. package/icc-x-api/crypto/ExtendedApisUtilsImpl.js.map +1 -1
  156. package/icc-x-api/crypto/HMACUtils.js.map +1 -1
  157. package/icc-x-api/crypto/KeyRecovery.js +5 -5
  158. package/icc-x-api/crypto/KeyRecovery.js.map +1 -1
  159. package/icc-x-api/crypto/NativeCryptoPrimitivesBridge.js +3 -3
  160. package/icc-x-api/crypto/NativeCryptoPrimitivesBridge.js.map +1 -1
  161. package/icc-x-api/crypto/RSA.js +4 -4
  162. package/icc-x-api/crypto/RSA.js.map +1 -1
  163. package/icc-x-api/crypto/RecoveryDataEncryption.js +1 -1
  164. package/icc-x-api/crypto/RecoveryDataEncryption.js.map +1 -1
  165. package/icc-x-api/crypto/SecretIdUseOption.js +1 -1
  166. package/icc-x-api/crypto/SecretIdUseOption.js.map +1 -1
  167. package/icc-x-api/crypto/SecureDelegationsEncryption.js +4 -4
  168. package/icc-x-api/crypto/SecureDelegationsEncryption.js.map +1 -1
  169. package/icc-x-api/crypto/SecureDelegationsManager.js +1 -1
  170. package/icc-x-api/crypto/SecureDelegationsManager.js.map +1 -1
  171. package/icc-x-api/crypto/SecurityMetadataDecryptor.d.ts +1 -1
  172. package/icc-x-api/crypto/SecurityMetadataDecryptor.js +9 -9
  173. package/icc-x-api/crypto/SecurityMetadataDecryptor.js.map +1 -1
  174. package/icc-x-api/crypto/ShamirKeysManager.js.map +1 -1
  175. package/icc-x-api/crypto/ShareMetadataBehaviour.js +1 -1
  176. package/icc-x-api/crypto/ShareMetadataBehaviour.js.map +1 -1
  177. package/icc-x-api/crypto/TransferKeysManager.js +1 -1
  178. package/icc-x-api/crypto/TransferKeysManager.js.map +1 -1
  179. package/icc-x-api/crypto/UserEncryptionKeysManager.js +2 -2
  180. package/icc-x-api/crypto/UserEncryptionKeysManager.js.map +1 -1
  181. package/icc-x-api/crypto/shamir.d.ts +2 -2
  182. package/icc-x-api/crypto/shamir.js +4 -4
  183. package/icc-x-api/crypto/shamir.js.map +1 -1
  184. package/icc-x-api/crypto/utils.js +14 -15
  185. package/icc-x-api/crypto/utils.js.map +1 -1
  186. package/icc-x-api/icc-accesslog-x-api.js +10 -10
  187. package/icc-x-api/icc-accesslog-x-api.js.map +1 -1
  188. package/icc-x-api/icc-bekmehr-x-api.js.map +1 -1
  189. package/icc-x-api/icc-calendar-item-x-api.js +7 -7
  190. package/icc-x-api/icc-calendar-item-x-api.js.map +1 -1
  191. package/icc-x-api/icc-classification-x-api.js +5 -5
  192. package/icc-x-api/icc-classification-x-api.js.map +1 -1
  193. package/icc-x-api/icc-code-x-api.js.map +1 -1
  194. package/icc-x-api/icc-contact-x-api.js +12 -12
  195. package/icc-x-api/icc-contact-x-api.js.map +1 -1
  196. package/icc-x-api/icc-data-owner-x-api.js.map +1 -1
  197. package/icc-x-api/icc-device-x-api.js +2 -2
  198. package/icc-x-api/icc-device-x-api.js.map +1 -1
  199. package/icc-x-api/icc-doctemplate-x-api.js.map +1 -1
  200. package/icc-x-api/icc-document-x-api.js +15 -15
  201. package/icc-x-api/icc-document-x-api.js.map +1 -1
  202. package/icc-x-api/icc-form-x-api.js +7 -7
  203. package/icc-x-api/icc-form-x-api.js.map +1 -1
  204. package/icc-x-api/icc-hcparty-x-api.js +4 -4
  205. package/icc-x-api/icc-hcparty-x-api.js.map +1 -1
  206. package/icc-x-api/icc-helement-x-api.js +10 -10
  207. package/icc-x-api/icc-helement-x-api.js.map +1 -1
  208. package/icc-x-api/icc-icure-maintenance-x-api.js.map +1 -1
  209. package/icc-x-api/icc-invoice-x-api.js +7 -7
  210. package/icc-x-api/icc-invoice-x-api.js.map +1 -1
  211. package/icc-x-api/icc-maintenance-task-x-api.js +7 -7
  212. package/icc-x-api/icc-maintenance-task-x-api.js.map +1 -1
  213. package/icc-x-api/icc-message-x-api.js +8 -8
  214. package/icc-x-api/icc-message-x-api.js.map +1 -1
  215. package/icc-x-api/icc-patient-x-api.js +11 -11
  216. package/icc-x-api/icc-patient-x-api.js.map +1 -1
  217. package/icc-x-api/icc-receipt-x-api.js +10 -10
  218. package/icc-x-api/icc-receipt-x-api.js.map +1 -1
  219. package/icc-x-api/icc-recovery-x-api.js +4 -4
  220. package/icc-x-api/icc-recovery-x-api.js.map +1 -1
  221. package/icc-x-api/icc-time-table-x-api.js +5 -5
  222. package/icc-x-api/icc-time-table-x-api.js.map +1 -1
  223. package/icc-x-api/icc-topic-x-api.js +9 -9
  224. package/icc-x-api/icc-topic-x-api.js.map +1 -1
  225. package/icc-x-api/icc-user-x-api.js +4 -4
  226. package/icc-x-api/icc-user-x-api.js.map +1 -1
  227. package/icc-x-api/index.js +22 -22
  228. package/icc-x-api/index.js.map +1 -1
  229. package/icc-x-api/maintenance/KeyPairUpdateRequest.js +2 -2
  230. package/icc-x-api/maintenance/KeyPairUpdateRequest.js.map +1 -1
  231. package/icc-x-api/storage/IcureStorageFacade.js +1 -1
  232. package/icc-x-api/storage/IcureStorageFacade.js.map +1 -1
  233. package/icc-x-api/storage/LocalStorageImpl.js +1 -1
  234. package/icc-x-api/storage/LocalStorageImpl.js.map +1 -1
  235. package/icc-x-api/utils/EntityWithDelegationTypeName.js +4 -4
  236. package/icc-x-api/utils/EntityWithDelegationTypeName.js.map +1 -1
  237. package/icc-x-api/utils/asn1-packer.js +2 -3
  238. package/icc-x-api/utils/asn1-packer.js.map +1 -1
  239. package/icc-x-api/utils/asn1-parser.js +1 -2
  240. package/icc-x-api/utils/asn1-parser.js.map +1 -1
  241. package/icc-x-api/utils/binary-utils.js +11 -11
  242. package/icc-x-api/utils/binary-utils.js.map +1 -1
  243. package/icc-x-api/utils/code-util.js +1 -2
  244. package/icc-x-api/utils/code-util.js.map +1 -1
  245. package/icc-x-api/utils/collection-utils.js +5 -6
  246. package/icc-x-api/utils/collection-utils.js.map +1 -1
  247. package/icc-x-api/utils/crypto-utils.d.ts +1 -1
  248. package/icc-x-api/utils/crypto-utils.js +17 -18
  249. package/icc-x-api/utils/crypto-utils.js.map +1 -1
  250. package/icc-x-api/utils/formatting-util.js +21 -21
  251. package/icc-x-api/utils/formatting-util.js.map +1 -1
  252. package/icc-x-api/utils/functional-util.js +3 -4
  253. package/icc-x-api/utils/functional-util.js.map +1 -1
  254. package/icc-x-api/utils/graph-utils.js +3 -4
  255. package/icc-x-api/utils/graph-utils.js.map +1 -1
  256. package/icc-x-api/utils/hcp-util.js +4 -4
  257. package/icc-x-api/utils/hcp-util.js.map +1 -1
  258. package/icc-x-api/utils/insurability-util.js +6 -7
  259. package/icc-x-api/utils/insurability-util.js.map +1 -1
  260. package/icc-x-api/utils/lru-temporised-async-cache.js.map +1 -1
  261. package/icc-x-api/utils/net-utils.js +3 -4
  262. package/icc-x-api/utils/net-utils.js.map +1 -1
  263. package/icc-x-api/utils/person-util.js +3 -4
  264. package/icc-x-api/utils/person-util.js.map +1 -1
  265. package/icc-x-api/utils/proxy-utils.js.map +1 -1
  266. package/icc-x-api/utils/simple-lru-cache.js.map +1 -1
  267. package/icc-x-api/utils/uuid-encoder.js +2 -2
  268. package/icc-x-api/utils/uuid-encoder.js.map +1 -1
  269. package/icc-x-api/utils/websocket.d.ts +0 -1
  270. package/icc-x-api/utils/websocket.js +3 -3
  271. package/icc-x-api/utils/websocket.js.map +1 -1
  272. package/package.json +3 -3
  273. package/test/icc-api/api/IccAgendaApi.js.map +1 -1
  274. package/test/icc-api/api/IccCalendarItemApi.js.map +1 -1
  275. package/test/icc-api/api/IccCalendarItemTypeApi.js +2 -2
  276. package/test/icc-api/api/IccCalendarItemTypeApi.js.map +1 -1
  277. package/test/icc-api/api/IccDocumentApi.js.map +1 -1
  278. package/test/icc-api/api/IccKeywordApi.js.map +1 -1
  279. package/test/icc-api/api/IccMedicalLocationApi.js.map +1 -1
  280. package/test/icc-api/api/IccPlaceApi.js.map +1 -1
  281. package/test/icc-api/api/IccUserApi.js +6 -6
  282. package/test/icc-x-api/auth/group-switch-test.js.map +1 -1
  283. package/test/icc-x-api/auth/jwt-concurrency-test.js +1 -2
  284. package/test/icc-x-api/auth/jwt-concurrency-test.js.map +1 -1
  285. package/test/icc-x-api/auth/jwt-provider-test.js.map +1 -1
  286. package/test/icc-x-api/auth/smart-auth-provider-test.js.map +1 -1
  287. package/test/icc-x-api/autofix-anonymity-test.js.map +1 -1
  288. package/test/icc-x-api/confidential-entities-test.js +1 -1
  289. package/test/icc-x-api/confidential-entities-test.js.map +1 -1
  290. package/test/icc-x-api/crud/comprehensive-crud-test.js.map +1 -1
  291. package/test/icc-x-api/crud/entities-crud-test-interface.js +24 -24
  292. package/test/icc-x-api/crud/entities-crud-test-interface.js.map +1 -1
  293. package/test/icc-x-api/crypto/anonymous-delegations-test.js +2 -2
  294. package/test/icc-x-api/crypto/anonymous-delegations-test.js.map +1 -1
  295. package/test/icc-x-api/crypto/cryptoTest.js.map +1 -1
  296. package/test/icc-x-api/crypto/delegate-ci-to-patient-with-missing-keys-test.js.map +1 -1
  297. package/test/icc-x-api/crypto/exchange-data-manager-test.js +4 -4
  298. package/test/icc-x-api/crypto/exchange-data-manager-test.js.map +1 -1
  299. package/test/icc-x-api/crypto/full-crypto-test.js +5 -5
  300. package/test/icc-x-api/crypto/full-crypto-test.js.map +1 -1
  301. package/test/icc-x-api/crypto/legacy-metadata-migration-test.js +7 -7
  302. package/test/icc-x-api/crypto/legacy-metadata-migration-test.js.map +1 -1
  303. package/test/icc-x-api/crypto/secure-delegations-manager-test.js +2 -2
  304. package/test/icc-x-api/crypto/secure-delegations-manager-test.js.map +1 -1
  305. package/test/icc-x-api/crypto/shamir.js.map +1 -1
  306. package/test/icc-x-api/crypto/soft-deleted-data-owners.js +3 -3
  307. package/test/icc-x-api/crypto/soft-deleted-data-owners.js.map +1 -1
  308. package/test/icc-x-api/entity-with-attachments-api-test.js +2 -2
  309. package/test/icc-x-api/entity-with-attachments-api-test.js.map +1 -1
  310. package/test/icc-x-api/icc-maintenance-task-x-api-test.js +4 -4
  311. package/test/icc-x-api/icc-message-x-api.js +1 -1
  312. package/test/icc-x-api/icc-message-x-api.js.map +1 -1
  313. package/test/icc-x-api/icc-patient-x-api-test.js.map +1 -1
  314. package/test/icc-x-api/icc-recovery-x-api.js.map +1 -1
  315. package/test/icc-x-api/icc-topic-x-api.js.map +1 -1
  316. package/test/icc-x-api/icc-user-x-api-test.js.map +1 -1
  317. package/test/icc-x-api/patient-user.js.map +1 -1
  318. package/test/icc-x-api/test-legacy-data-support.js.map +1 -1
  319. package/test/icc-x-api/utils/graph-test.js.map +1 -1
  320. package/test/icc-x-api/utils/lru-temporised-async-cache-test.js.map +1 -1
  321. package/test/support/CSM-243.js +2 -2
  322. package/test/support/CSM-243.js.map +1 -1
  323. package/test/support/CSM-93.js +1 -1
  324. package/test/support/CSM-93.js.map +1 -1
  325. package/test/utils/FakeDataOwnerApi.js.map +1 -1
  326. package/test/utils/FakeEncryptionKeysManager.js +2 -2
  327. package/test/utils/FakeEncryptionKeysManager.js.map +1 -1
  328. package/test/utils/FakeExchangeDataApi.js.map +1 -1
  329. package/test/utils/FakeExchangeDataManager.js.map +1 -1
  330. package/test/utils/FakeGenericApi.js.map +1 -1
  331. package/test/utils/TestApi.js +2 -2
  332. package/test/utils/TestApi.js.map +1 -1
  333. package/test/utils/TestCryptoStrategies.js.map +1 -1
  334. package/test/utils/TestStorage.js +2 -2
  335. package/test/utils/TestStorage.js.map +1 -1
  336. package/test/utils/test_utils.js +22 -22
  337. package/test/utils/test_utils.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"delegate-ci-to-patient-with-missing-keys-test.js","sourceRoot":"","sources":["../../../../test/icc-x-api/crypto/delegate-ci-to-patient-with-missing-keys-test.ts"],"names":[],"mappings":"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","sourcesContent":["import { Apis, IcureApi, ShaVersion, ua2hex } from '../../../icc-x-api'\nimport { CalendarItem } from '../../../icc-api/model/CalendarItem'\nimport { FilterChainMaintenanceTask, MaintenanceTask, PaginatedListMaintenanceTask } from '../../../icc-api/model/models'\nimport { before, describe, it } from 'mocha'\n\nimport { webcrypto } from 'crypto'\nimport 'isomorphic-fetch'\n\nimport { expect } from 'chai'\nimport { MaintenanceTaskAfterDateFilter } from '../../../icc-x-api/filters/MaintenanceTaskAfterDateFilter'\nimport { createNewHcpApi, getApiAndAddPrivateKeysForUser, getEnvironmentInitializer, patUsername, setLocalStorage } from '../../utils/test_utils'\nimport { TestKeyStorage, TestStorage } from '../../utils/TestStorage'\nimport { TestCryptoStrategies } from '../../utils/TestCryptoStrategies'\nimport { KeyPairUpdateRequest } from '../../../icc-x-api/maintenance/KeyPairUpdateRequest'\nimport { SecureDelegation } from '../../../icc-api/model/SecureDelegation'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport AccessLevel = SecureDelegation.AccessLevelEnum\n\nasync function _getHcpKeyUpdateMaintenanceTask(delegateApi: Apis): Promise<MaintenanceTask> {\n const delegateUser = await delegateApi.userApi.getCurrentUser()\n const notifications: PaginatedListMaintenanceTask = await delegateApi.maintenanceTaskApi.filterMaintenanceTasksByWithUser(\n delegateUser!,\n undefined,\n undefined,\n new FilterChainMaintenanceTask({\n filter: new MaintenanceTaskAfterDateFilter({\n date: new Date().getTime() - 100000,\n }),\n })\n )\n\n return notifications.rows!.sort((a, b) => a.created! - b.created!)[notifications.rows!.length - 1]\n}\n\nsetLocalStorage(fetch)\n\nlet env: TestVars\n\ndescribe('Full battery of tests on crypto and keys', async function () {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n })\n\n // TODO should give access back to old and new keys\n it(`Create calendar item as a patient and get access back`, async () => {\n async function decryptDataForPair(\n api: Apis,\n dataOwner1: string,\n dataOwner2: string\n ): Promise<{\n failedDecryptionsCount: number\n successfulDecryptions: { rawKey: string; accessControlSecret: string }[]\n }> {\n const allExchangeData = [\n ...(await api.cryptoApi.exchangeData.base.getExchangeDataByDelegatorDelegatePair(dataOwner1, dataOwner2)),\n ...(await api.cryptoApi.exchangeData.base.getExchangeDataByDelegatorDelegatePair(dataOwner2, dataOwner1)),\n ]\n let failedDecryptionsCount = 0\n const successfulDecryptions: { rawKey: string; accessControlSecret: string }[] = []\n for (const exchangeData of allExchangeData) {\n const decryptedKey = await api.cryptoApi.exchangeData.base.tryDecryptExchangeKeys(\n [exchangeData],\n api.cryptoApi.userKeysManager.getDecryptionKeys()\n )\n const decryptedAccessControlSecret = await api.cryptoApi.exchangeData.base.tryDecryptAccessControlSecret(\n [exchangeData],\n api.cryptoApi.userKeysManager.getDecryptionKeys()\n )\n if (decryptedKey.failedDecryptions.length > 0 || decryptedAccessControlSecret.failedDecryptions.length > 0) {\n failedDecryptionsCount++\n } else {\n successfulDecryptions.push({\n rawKey: ua2hex(await api.cryptoApi.primitives.AES.exportKey(decryptedKey.successfulDecryptions[0], 'raw')),\n accessControlSecret: decryptedAccessControlSecret.successfulDecryptions[0],\n })\n }\n }\n return { failedDecryptionsCount, successfulDecryptions }\n }\n\n function checkDecryptedDataHas(\n decryptedData: { rawKey: string; accessControlSecret: string }[],\n expected: { rawKey: string; accessControlSecret: string }\n ) {\n expect(decryptedData.filter((d) => d.rawKey === expected.rawKey && d.accessControlSecret === expected.accessControlSecret)).to.have.length(1)\n }\n\n const previousPubKey = env!.dataOwnerDetails[patUsername].publicKey\n const api = await getApiAndAddPrivateKeysForUser(env!.iCureUrl, env!.dataOwnerDetails[patUsername])\n const u = await api.userApi.getCurrentUser()\n\n const delegateInfo = await createNewHcpApi(env!)\n const delegateApi = delegateInfo.api\n const delegateUser = delegateInfo.user\n const delegateHcp = await delegateApi.healthcarePartyApi.getHealthcareParty(delegateUser.healthcarePartyId!)\n\n const patient = await api.patientApi.getPatientWithUser(u, u.patientId!)\n\n // Create a Record to share with delegateHcp: this will trigger the creation of a new aes exchange key as well\n const initialRecordToDelegate = await api.calendarItemApi.createCalendarItemWithHcParty(\n u,\n await api.calendarItemApi.newInstance(u, new CalendarItem({ id: `${u.id}-ci-initial-to`, title: 'CI-INITIAL-TO' }), {\n additionalDelegates: {\n [delegateHcp!.id!]: AccessLevel.WRITE,\n },\n })\n )\n const initialRecordFromDelegate = await delegateApi.calendarItemApi.createCalendarItemWithHcParty(\n u,\n await delegateApi.calendarItemApi.newInstance(delegateUser, new CalendarItem({ id: `${u.id}-ci-initial-from`, title: 'CI-INITIAL-FROM' }), {\n additionalDelegates: {\n [u.patientId!]: AccessLevel.WRITE,\n },\n })\n )\n\n // Decrypting this AES Key to compare it with AES key decrypted with new key in the next steps\n await api.cryptoApi.forceReload()\n const originalDecryptedData = await decryptDataForPair(api, u.patientId!, delegateUser.healthcarePartyId!)\n expect(originalDecryptedData.failedDecryptionsCount).to.equal(0)\n expect(originalDecryptedData.successfulDecryptions.length).to.equal(2)\n\n // And creates a new one\n const newKey = await api.cryptoApi.primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const publicKey = ua2hex(await api.cryptoApi.primitives.RSA.exportKey(newKey.publicKey, 'spki'))\n const apiAfterNewKey = await IcureApi.initialise(\n env!.iCureUrl,\n {\n username: env!.dataOwnerDetails[patUsername].user,\n password: env!.dataOwnerDetails[patUsername].password,\n },\n new TestCryptoStrategies(newKey),\n webcrypto as unknown as Crypto,\n fetch,\n {\n storage: new TestStorage(),\n keyStorage: new TestKeyStorage(),\n }\n )\n const user = await apiAfterNewKey.userApi.getCurrentUser()\n await apiAfterNewKey.icureMaintenanceTaskApi.createMaintenanceTasksForNewKeypair(user, newKey)\n\n // User can get not encrypted information from iCure (HCP, ...)\n const hcp = await apiAfterNewKey.healthcarePartyApi.getHealthcareParty(delegateUser!.healthcarePartyId!)\n\n // User can create new data, using its new keyPair\n const newRecordToDelegate = await apiAfterNewKey.calendarItemApi.createCalendarItemWithHcParty(\n u,\n await apiAfterNewKey.calendarItemApi.newInstance(u, new CalendarItem({ id: `${u.id}-ci-to`, title: 'CI-TO' }), {\n additionalDelegates: {\n [hcp!.id!]: SecureDelegation.AccessLevelEnum.WRITE,\n },\n })\n )\n expect(newRecordToDelegate.id).to.be.not.null\n expect(newRecordToDelegate.rev).to.be.not.null\n\n // But user can not decrypt data he previously created\n const decryptedWithNewKey = await decryptDataForPair(apiAfterNewKey, u.patientId!, delegateUser.healthcarePartyId!)\n expect(decryptedWithNewKey.failedDecryptionsCount).to.equal(2)\n expect(decryptedWithNewKey.successfulDecryptions.length).to.equal(1)\n\n // Delegate user will therefore give user access back to data he previously created\n\n // Hcp gets his maintenance tasks\n await delegateApi.cryptoApi.forceReload()\n const maintenanceTask = KeyPairUpdateRequest.fromMaintenanceTask(await _getHcpKeyUpdateMaintenanceTask(delegateApi))\n\n expect(maintenanceTask.concernedDataOwnerId).equals(patient.id)\n expect(maintenanceTask.newPublicKey).equals(publicKey)\n\n await delegateApi.icureMaintenanceTaskApi.applyKeyPairUpdate(maintenanceTask)\n const updatedDataOwner = await delegateApi.dataOwnerApi.getCryptoActorStub(maintenanceTask.concernedDataOwnerId)\n\n expect(updatedDataOwner.type).to.be.equal('patient')\n expect(updatedDataOwner.stub).to.not.be.undefined\n expect(updatedDataOwner.stub).to.not.be.null\n\n const apiAfterSharedBack = await IcureApi.initialise(\n env!.iCureUrl,\n {\n username: env!.dataOwnerDetails[patUsername].user,\n password: env!.dataOwnerDetails[patUsername].password,\n },\n new TestCryptoStrategies(newKey),\n webcrypto as unknown as Crypto,\n fetch,\n {\n storage: new TestStorage(),\n keyStorage: new TestKeyStorage(),\n }\n )\n // User can access his previous data again\n await apiAfterSharedBack.cryptoApi.forceReload()\n const decryptedAfterShareBack = await decryptDataForPair(apiAfterSharedBack, u.patientId!, delegateUser.healthcarePartyId!)\n expect(decryptedAfterShareBack.failedDecryptionsCount).to.equal(0)\n expect(decryptedAfterShareBack.successfulDecryptions.length).to.equal(3)\n checkDecryptedDataHas(decryptedAfterShareBack.successfulDecryptions, originalDecryptedData.successfulDecryptions[0])\n checkDecryptedDataHas(decryptedAfterShareBack.successfulDecryptions, originalDecryptedData.successfulDecryptions[1])\n checkDecryptedDataHas(decryptedAfterShareBack.successfulDecryptions, decryptedWithNewKey.successfulDecryptions[0])\n\n const initialRecordFromDelegateAfterSharedBack = await apiAfterSharedBack.calendarItemApi.getCalendarItemWithUser(\n u,\n initialRecordFromDelegate.id!\n )\n expect(initialRecordFromDelegateAfterSharedBack.id).to.be.equal(initialRecordFromDelegate.id)\n expect(initialRecordFromDelegateAfterSharedBack.rev).to.be.equal(initialRecordFromDelegate.rev)\n expect(initialRecordFromDelegateAfterSharedBack.title).to.be.equal(initialRecordFromDelegate.title)\n const initialRecordToDelegateAfterSharedBack = await apiAfterSharedBack.calendarItemApi.getCalendarItemWithUser(u, initialRecordToDelegate.id!)\n expect(initialRecordToDelegateAfterSharedBack.id).to.be.equal(initialRecordToDelegate.id)\n expect(initialRecordToDelegateAfterSharedBack.rev).to.be.equal(initialRecordToDelegate.rev)\n expect(initialRecordToDelegateAfterSharedBack.title).to.be.equal(initialRecordToDelegate.title)\n })\n})\n\n// TODO test that EXACTLY ONE maintenance task is created for each delegator AND delegate in a exchange key with the data owner with the new key\n"]}
1
+ {"version":3,"file":"delegate-ci-to-patient-with-missing-keys-test.js","sourceRoot":"","sources":["../../../../test/icc-x-api/crypto/delegate-ci-to-patient-with-missing-keys-test.ts"],"names":[],"mappings":"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","sourcesContent":["import { Apis, IcureApi, ShaVersion, ua2hex } from '../../../icc-x-api'\nimport { CalendarItem } from '../../../icc-api/model/CalendarItem'\nimport { FilterChainMaintenanceTask, MaintenanceTask, PaginatedListMaintenanceTask } from '../../../icc-api/model/models'\nimport { before, describe, it } from 'mocha'\n\nimport { webcrypto } from 'crypto'\nimport 'isomorphic-fetch'\n\nimport { expect } from 'chai'\nimport { MaintenanceTaskAfterDateFilter } from '../../../icc-x-api/filters/MaintenanceTaskAfterDateFilter'\nimport { createNewHcpApi, getApiAndAddPrivateKeysForUser, getEnvironmentInitializer, patUsername, setLocalStorage } from '../../utils/test_utils'\nimport { TestKeyStorage, TestStorage } from '../../utils/TestStorage'\nimport { TestCryptoStrategies } from '../../utils/TestCryptoStrategies'\nimport { KeyPairUpdateRequest } from '../../../icc-x-api/maintenance/KeyPairUpdateRequest'\nimport { SecureDelegation } from '../../../icc-api/model/SecureDelegation'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport AccessLevel = SecureDelegation.AccessLevelEnum\n\nasync function _getHcpKeyUpdateMaintenanceTask(delegateApi: Apis): Promise<MaintenanceTask> {\n const delegateUser = await delegateApi.userApi.getCurrentUser()\n const notifications: PaginatedListMaintenanceTask = await delegateApi.maintenanceTaskApi.filterMaintenanceTasksByWithUser(\n delegateUser!,\n undefined,\n undefined,\n new FilterChainMaintenanceTask({\n filter: new MaintenanceTaskAfterDateFilter({\n date: new Date().getTime() - 100000,\n }),\n })\n )\n\n return notifications.rows!.sort((a, b) => a.created! - b.created!)[notifications.rows!.length - 1]\n}\n\nsetLocalStorage(fetch)\n\nlet env: TestVars\n\ndescribe('Full battery of tests on crypto and keys', async function () {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n })\n\n // TODO should give access back to old and new keys\n it(`Create calendar item as a patient and get access back`, async () => {\n async function decryptDataForPair(\n api: Apis,\n dataOwner1: string,\n dataOwner2: string\n ): Promise<{\n failedDecryptionsCount: number\n successfulDecryptions: { rawKey: string; accessControlSecret: string }[]\n }> {\n const allExchangeData = [\n ...(await api.cryptoApi.exchangeData.base.getExchangeDataByDelegatorDelegatePair(dataOwner1, dataOwner2)),\n ...(await api.cryptoApi.exchangeData.base.getExchangeDataByDelegatorDelegatePair(dataOwner2, dataOwner1)),\n ]\n let failedDecryptionsCount = 0\n const successfulDecryptions: { rawKey: string; accessControlSecret: string }[] = []\n for (const exchangeData of allExchangeData) {\n const decryptedKey = await api.cryptoApi.exchangeData.base.tryDecryptExchangeKeys(\n [exchangeData],\n api.cryptoApi.userKeysManager.getDecryptionKeys()\n )\n const decryptedAccessControlSecret = await api.cryptoApi.exchangeData.base.tryDecryptAccessControlSecret(\n [exchangeData],\n api.cryptoApi.userKeysManager.getDecryptionKeys()\n )\n if (decryptedKey.failedDecryptions.length > 0 || decryptedAccessControlSecret.failedDecryptions.length > 0) {\n failedDecryptionsCount++\n } else {\n successfulDecryptions.push({\n rawKey: ua2hex(await api.cryptoApi.primitives.AES.exportKey(decryptedKey.successfulDecryptions[0], 'raw')),\n accessControlSecret: decryptedAccessControlSecret.successfulDecryptions[0],\n })\n }\n }\n return { failedDecryptionsCount, successfulDecryptions }\n }\n\n function checkDecryptedDataHas(\n decryptedData: { rawKey: string; accessControlSecret: string }[],\n expected: { rawKey: string; accessControlSecret: string }\n ) {\n expect(decryptedData.filter((d) => d.rawKey === expected.rawKey && d.accessControlSecret === expected.accessControlSecret)).to.have.length(1)\n }\n\n const previousPubKey = env!.dataOwnerDetails[patUsername].publicKey\n const api = await getApiAndAddPrivateKeysForUser(env!.iCureUrl, env!.dataOwnerDetails[patUsername])\n const u = await api.userApi.getCurrentUser()\n\n const delegateInfo = await createNewHcpApi(env!)\n const delegateApi = delegateInfo.api\n const delegateUser = delegateInfo.user\n const delegateHcp = await delegateApi.healthcarePartyApi.getHealthcareParty(delegateUser.healthcarePartyId!)\n\n const patient = await api.patientApi.getPatientWithUser(u, u.patientId!)\n\n // Create a Record to share with delegateHcp: this will trigger the creation of a new aes exchange key as well\n const initialRecordToDelegate = await api.calendarItemApi.createCalendarItemWithHcParty(\n u,\n await api.calendarItemApi.newInstance(u, new CalendarItem({ id: `${u.id}-ci-initial-to`, title: 'CI-INITIAL-TO' }), {\n additionalDelegates: {\n [delegateHcp!.id!]: AccessLevel.WRITE,\n },\n })\n )\n const initialRecordFromDelegate = await delegateApi.calendarItemApi.createCalendarItemWithHcParty(\n u,\n await delegateApi.calendarItemApi.newInstance(delegateUser, new CalendarItem({ id: `${u.id}-ci-initial-from`, title: 'CI-INITIAL-FROM' }), {\n additionalDelegates: {\n [u.patientId!]: AccessLevel.WRITE,\n },\n })\n )\n\n // Decrypting this AES Key to compare it with AES key decrypted with new key in the next steps\n await api.cryptoApi.forceReload()\n const originalDecryptedData = await decryptDataForPair(api, u.patientId!, delegateUser.healthcarePartyId!)\n expect(originalDecryptedData.failedDecryptionsCount).to.equal(0)\n expect(originalDecryptedData.successfulDecryptions.length).to.equal(2)\n\n // And creates a new one\n const newKey = await api.cryptoApi.primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const publicKey = ua2hex(await api.cryptoApi.primitives.RSA.exportKey(newKey.publicKey, 'spki'))\n const apiAfterNewKey = await IcureApi.initialise(\n env!.iCureUrl,\n {\n username: env!.dataOwnerDetails[patUsername].user,\n password: env!.dataOwnerDetails[patUsername].password,\n },\n new TestCryptoStrategies(newKey),\n webcrypto as unknown as Crypto,\n fetch,\n {\n storage: new TestStorage(),\n keyStorage: new TestKeyStorage(),\n }\n )\n const user = await apiAfterNewKey.userApi.getCurrentUser()\n await apiAfterNewKey.icureMaintenanceTaskApi.createMaintenanceTasksForNewKeypair(user, newKey)\n\n // User can get not encrypted information from iCure (HCP, ...)\n const hcp = await apiAfterNewKey.healthcarePartyApi.getHealthcareParty(delegateUser!.healthcarePartyId!)\n\n // User can create new data, using its new keyPair\n const newRecordToDelegate = await apiAfterNewKey.calendarItemApi.createCalendarItemWithHcParty(\n u,\n await apiAfterNewKey.calendarItemApi.newInstance(u, new CalendarItem({ id: `${u.id}-ci-to`, title: 'CI-TO' }), {\n additionalDelegates: {\n [hcp!.id!]: SecureDelegation.AccessLevelEnum.WRITE,\n },\n })\n )\n expect(newRecordToDelegate.id).to.be.not.null\n expect(newRecordToDelegate.rev).to.be.not.null\n\n // But user can not decrypt data he previously created\n const decryptedWithNewKey = await decryptDataForPair(apiAfterNewKey, u.patientId!, delegateUser.healthcarePartyId!)\n expect(decryptedWithNewKey.failedDecryptionsCount).to.equal(2)\n expect(decryptedWithNewKey.successfulDecryptions.length).to.equal(1)\n\n // Delegate user will therefore give user access back to data he previously created\n\n // Hcp gets his maintenance tasks\n await delegateApi.cryptoApi.forceReload()\n const maintenanceTask = KeyPairUpdateRequest.fromMaintenanceTask(await _getHcpKeyUpdateMaintenanceTask(delegateApi))\n\n expect(maintenanceTask.concernedDataOwnerId).equals(patient.id)\n expect(maintenanceTask.newPublicKey).equals(publicKey)\n\n await delegateApi.icureMaintenanceTaskApi.applyKeyPairUpdate(maintenanceTask)\n const updatedDataOwner = await delegateApi.dataOwnerApi.getCryptoActorStub(maintenanceTask.concernedDataOwnerId)\n\n expect(updatedDataOwner.type).to.be.equal('patient')\n expect(updatedDataOwner.stub).to.not.be.undefined\n expect(updatedDataOwner.stub).to.not.be.null\n\n const apiAfterSharedBack = await IcureApi.initialise(\n env!.iCureUrl,\n {\n username: env!.dataOwnerDetails[patUsername].user,\n password: env!.dataOwnerDetails[patUsername].password,\n },\n new TestCryptoStrategies(newKey),\n webcrypto as unknown as Crypto,\n fetch,\n {\n storage: new TestStorage(),\n keyStorage: new TestKeyStorage(),\n }\n )\n // User can access his previous data again\n await apiAfterSharedBack.cryptoApi.forceReload()\n const decryptedAfterShareBack = await decryptDataForPair(apiAfterSharedBack, u.patientId!, delegateUser.healthcarePartyId!)\n expect(decryptedAfterShareBack.failedDecryptionsCount).to.equal(0)\n expect(decryptedAfterShareBack.successfulDecryptions.length).to.equal(3)\n checkDecryptedDataHas(decryptedAfterShareBack.successfulDecryptions, originalDecryptedData.successfulDecryptions[0])\n checkDecryptedDataHas(decryptedAfterShareBack.successfulDecryptions, originalDecryptedData.successfulDecryptions[1])\n checkDecryptedDataHas(decryptedAfterShareBack.successfulDecryptions, decryptedWithNewKey.successfulDecryptions[0])\n\n const initialRecordFromDelegateAfterSharedBack = await apiAfterSharedBack.calendarItemApi.getCalendarItemWithUser(\n u,\n initialRecordFromDelegate.id!\n )\n expect(initialRecordFromDelegateAfterSharedBack.id).to.be.equal(initialRecordFromDelegate.id)\n expect(initialRecordFromDelegateAfterSharedBack.rev).to.be.equal(initialRecordFromDelegate.rev)\n expect(initialRecordFromDelegateAfterSharedBack.title).to.be.equal(initialRecordFromDelegate.title)\n const initialRecordToDelegateAfterSharedBack = await apiAfterSharedBack.calendarItemApi.getCalendarItemWithUser(u, initialRecordToDelegate.id!)\n expect(initialRecordToDelegateAfterSharedBack.id).to.be.equal(initialRecordToDelegate.id)\n expect(initialRecordToDelegateAfterSharedBack.rev).to.be.equal(initialRecordToDelegate.rev)\n expect(initialRecordToDelegateAfterSharedBack.title).to.be.equal(initialRecordToDelegate.title)\n })\n})\n\n// TODO test that EXACTLY ONE maintenance task is created for each delegator AND delegate in a exchange key with the data owner with the new key\n"]}
@@ -50,8 +50,8 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
50
50
  let baseExchangeData;
51
51
  let exchangeData;
52
52
  let encryptionKeysManager;
53
- function initialiseComponents(allowFullExchangeDataLoad, optionalParameters = {}) {
54
- return __awaiter(this, void 0, void 0, function* () {
53
+ function initialiseComponents(allowFullExchangeDataLoad_1) {
54
+ return __awaiter(this, arguments, void 0, function* (allowFullExchangeDataLoad, optionalParameters = {}) {
55
55
  const dataOwnerType = allowFullExchangeDataLoad ? DataOwnerTypeEnum_1.DataOwnerTypeEnum.Patient : DataOwnerTypeEnum_1.DataOwnerTypeEnum.Hcp;
56
56
  selfId = primitives.randomUuid();
57
57
  selfKeypair = yield primitives.RSA.generateKeyPair(icc_x_api_1.ShaVersion.Sha256);
@@ -176,8 +176,8 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
176
176
  it('should create new encryption keys when none is available', function () {
177
177
  return __awaiter(this, void 0, void 0, function* () {
178
178
  function doTest(allowFullExchangeDataLoad) {
179
- var _a;
180
179
  return __awaiter(this, void 0, void 0, function* () {
180
+ var _a;
181
181
  yield initialiseComponents(allowFullExchangeDataLoad);
182
182
  const sfk = primitives.randomUuid();
183
183
  const initialisedCount = exchangeDataApi.callCount;
@@ -213,8 +213,8 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
213
213
  it('should create encryption keys to self when none is available', function () {
214
214
  return __awaiter(this, void 0, void 0, function* () {
215
215
  function doTest(allowFullExchangeDataLoad) {
216
- var _a;
217
216
  return __awaiter(this, void 0, void 0, function* () {
217
+ var _a;
218
218
  yield initialiseComponents(allowFullExchangeDataLoad);
219
219
  const createdData = yield exchangeData.getOrCreateEncryptionDataTo(selfId);
220
220
  (0, chai_1.expect)(createdData.exchangeData.delegator).to.equal(selfId);
@@ -1 +1 @@
1
- {"version":3,"file":"exchange-data-manager-test.js","sourceRoot":"","sources":["../../../../test/icc-x-api/crypto/exchange-data-manager-test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe } from 'mocha'\nimport {\n ExchangeDataManager,\n ExchangeDataManagerOptionalParameters,\n initialiseExchangeDataManagerForCurrentDataOwner,\n} from '../../../icc-x-api/crypto/ExchangeDataManager'\nimport { WebCryptoPrimitives } from '../../../icc-x-api/crypto/CryptoPrimitives'\nimport { webcrypto } from 'crypto'\nimport { BaseExchangeDataManager } from '../../../icc-x-api/crypto/BaseExchangeDataManager'\nimport { FakeExchangeDataApi } from '../../utils/FakeExchangeDataApi'\nimport { FakeDataOwnerApi } from '../../utils/FakeDataOwnerApi'\nimport { TestCryptoStrategies } from '../../utils/TestCryptoStrategies'\nimport { EntityWithDelegationTypeName, ShaVersion, ua2b64, ua2hex } from '../../../icc-x-api'\nimport { FakeEncryptionKeysManager } from '../../utils/FakeEncryptionKeysManager'\nimport { AccessControlSecretUtils } from '../../../icc-x-api/crypto/AccessControlSecretUtils'\nimport { ExchangeData } from '../../../icc-api/model/internal/ExchangeData'\nimport { expect } from 'chai'\nimport { setEquals } from '../../../icc-x-api/utils/collection-utils'\nimport { KeyPair } from '../../../icc-x-api/crypto/RSA'\nimport * as _ from 'lodash'\nimport { fingerprintV1, fingerprintV1toV2, fingerprintV2 } from '../../../icc-x-api/crypto/utils'\nimport { DataOwnerTypeEnum } from '../../../icc-api/model/DataOwnerTypeEnum'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { createNewHcpApi, getEnvironmentInitializer, setLocalStorage } from '../../utils/test_utils'\nimport 'isomorphic-fetch'\nimport { IccExchangeDataApi } from '../../../icc-api/api/internal/IccExchangeDataApi'\n\nsetLocalStorage(fetch)\n\ndescribe('Exchange data manager - unit', async function () {\n const primitives = new WebCryptoPrimitives(webcrypto as any)\n const accessControlSecretUtils = new AccessControlSecretUtils(primitives)\n let selfId: string\n let selfKeyFpV1: string\n let selfKeyFpV2: string\n let selfKeypair: KeyPair<CryptoKey>\n let delegateId: string\n let delegateKeyFp: string\n let delegateKeypair: KeyPair<CryptoKey>\n let delegate2Id: string\n let delegate2KeyFp: string\n let delegate2Keypair: KeyPair<CryptoKey>\n let dataOwnerApi: FakeDataOwnerApi\n let exchangeDataApi: FakeExchangeDataApi\n let baseExchangeData: BaseExchangeDataManager\n let exchangeData: ExchangeDataManager\n let encryptionKeysManager: FakeEncryptionKeysManager\n\n async function initialiseComponents(\n allowFullExchangeDataLoad: boolean,\n optionalParameters: ExchangeDataManagerOptionalParameters & { verifiedDelegateKeys?: Set<string> } = {}\n ) {\n const dataOwnerType = allowFullExchangeDataLoad ? DataOwnerTypeEnum.Patient : DataOwnerTypeEnum.Hcp\n selfId = primitives.randomUuid()\n selfKeypair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n selfKeyFpV1 = fingerprintV1(ua2hex(await primitives.RSA.exportKey(selfKeypair.publicKey, 'spki')))\n selfKeyFpV2 = fingerprintV1toV2(selfKeyFpV1)\n delegateId = primitives.randomUuid()\n delegateKeypair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n delegateKeyFp = fingerprintV1(ua2hex(await primitives.RSA.exportKey(delegateKeypair.publicKey, 'spki')))\n delegate2Id = primitives.randomUuid()\n delegate2Keypair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n delegate2KeyFp = fingerprintV1(ua2hex(await primitives.RSA.exportKey(delegate2Keypair.publicKey, 'spki')))\n dataOwnerApi = new FakeDataOwnerApi(\n {\n id: selfId,\n type: dataOwnerType,\n publicKeysForOaepWithSha256: [ua2hex(await primitives.RSA.exportKey(selfKeypair.publicKey, 'spki'))],\n },\n [\n {\n id: delegateId,\n type: dataOwnerType,\n publicKeysForOaepWithSha256: [ua2hex(await primitives.RSA.exportKey(delegateKeypair.publicKey, 'spki'))],\n },\n {\n id: delegate2Id,\n type: dataOwnerType,\n publicKeysForOaepWithSha256: [ua2hex(await primitives.RSA.exportKey(delegate2Keypair.publicKey, 'spki'))],\n },\n ]\n )\n const cryptoStrategies = new TestCryptoStrategies(undefined, undefined, optionalParameters.verifiedDelegateKeys)\n exchangeDataApi = new FakeExchangeDataApi()\n baseExchangeData = new BaseExchangeDataManager(exchangeDataApi, dataOwnerApi, primitives, allowFullExchangeDataLoad, false)\n encryptionKeysManager = await FakeEncryptionKeysManager.create(primitives, [selfKeypair])\n exchangeData = await initialiseExchangeDataManagerForCurrentDataOwner(\n baseExchangeData,\n encryptionKeysManager,\n accessControlSecretUtils,\n cryptoStrategies,\n dataOwnerApi,\n primitives,\n true,\n optionalParameters\n )\n }\n\n async function checkDataEqual(\n actual: { exchangeData: ExchangeData; accessControlSecret?: string; exchangeKey: CryptoKey | undefined } | undefined,\n expected: { exchangeData: ExchangeData; accessControlSecret?: string; exchangeKey: CryptoKey | undefined }\n ) {\n expect(actual).to.not.be.undefined\n expect(_.isEqual(_.omit(expected.exchangeData, ['rev']), _.omit(actual!.exchangeData, ['rev']))).to.equal(\n true,\n `Data should be equivalent\\nExpected: ${JSON.stringify(expected.exchangeData, undefined, 2)}\\nActual: ${JSON.stringify(\n actual!.exchangeData,\n undefined,\n 2\n )}\\n`\n )\n expect(expected.accessControlSecret).to.equal(actual!.accessControlSecret)\n await checkAesKeysEquality(actual!.exchangeKey, expected.exchangeKey)\n }\n\n async function checkAesKeysEquality(actual: CryptoKey | undefined, expected: CryptoKey | undefined) {\n if (!actual && !expected) return\n expect(!actual).to.equal(!expected, !expected ? 'Key should not have been decrypted' : 'Key should have been decrypted')\n expect(ua2hex(await primitives.AES.exportKey(expected!, 'raw'))).to.equal(ua2hex(await primitives.AES.exportKey(actual!, 'raw')))\n }\n\n async function createDataFromRandomToSelf(): Promise<{ exchangeData: ExchangeData; exchangeKey: CryptoKey; accessControlSecret: string }> {\n const encryptionKey = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const encryptionFp = ua2hex(await primitives.RSA.exportKey(encryptionKey.publicKey, 'spki')).slice(-32)\n const signatureKey = await primitives.RSA.generateKeyPair(ShaVersion.Sha1)\n const signatureFp = ua2hex(await primitives.RSA.exportKey(signatureKey.publicKey, 'spki')).slice(-32)\n const created = await baseExchangeData.createExchangeData(\n selfId,\n { [signatureFp]: signatureKey.privateKey },\n { [encryptionFp]: encryptionKey.publicKey, [selfKeyFpV1]: selfKeypair.publicKey }\n )\n const modified = await exchangeDataApi.modifyExchangeData(\n new ExchangeData({\n ...created.exchangeData,\n delegator: primitives.randomUuid(),\n })\n )\n return { exchangeData: modified, exchangeKey: created.exchangeKey, accessControlSecret: created.accessControlSecret }\n }\n\n async function generateEncryptionKeys(n: number): Promise<{ pair: KeyPair<CryptoKey>; fingerprintV2: string; hexPub: string }[]> {\n return await Promise.all(\n Array(n)\n .fill(null)\n .map(async () => {\n const pair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const hexPub = ua2hex(await primitives.RSA.exportKey(pair.publicKey, 'spki'))\n const fingerprint = fingerprintV2(hexPub)\n return { pair, fingerprintV2: fingerprint, hexPub }\n })\n )\n }\n\n it('base should be able to retrieve all exchange data for the current data owner if allowed by the crypto strategies', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const expectedData = await Promise.all(\n Array.from(Array(3500), async (_, i) => {\n const data = new ExchangeData({\n id: primitives.randomUuid(),\n delegate: i % 2 === 0 ? selfId : primitives.randomUuid(),\n delegator: i % 2 === 0 ? primitives.randomUuid() : selfId,\n exchangeKey: { not: 'important' },\n accessControlSecret: { not: 'important' },\n sharedSignatureKey: { not: 'important' },\n delegatorSignature: { not: 'important' },\n sharedSignature: 'not important',\n })\n await exchangeDataApi.createExchangeData(data)\n return data\n })\n )\n await Promise.all(\n Array.from(Array(500), async () => {\n // Should not be in result\n const data = new ExchangeData({\n id: primitives.randomUuid(),\n delegate: primitives.randomUuid(),\n delegator: primitives.randomUuid(),\n exchangeKey: { not: 'important' },\n accessControlSecret: { not: 'important' },\n sharedSignatureKey: { not: 'important' },\n delegatorSignature: { not: 'important' },\n sharedSignature: 'not important',\n })\n await exchangeDataApi.createExchangeData(data)\n })\n )\n const retrieved = await baseExchangeData.getAllExchangeDataForCurrentDataOwnerIfAllowed()\n if (allowFullExchangeDataLoad) {\n expect(retrieved).to.not.be.undefined\n expect(retrieved).to.have.length(expectedData.length)\n expect(setEquals(new Set(expectedData.map((x) => x.id)), new Set(retrieved!.map((x) => x.id))), 'Retrieved and expected ids').to.be.true\n } else {\n expect(retrieved).to.be.undefined\n }\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should create new encryption keys when none is available', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const sfk = primitives.randomUuid()\n const initialisedCount = exchangeDataApi.callCount\n const createdData = await exchangeData.getOrCreateEncryptionDataTo(delegateId)\n const retrievedCachedData = await exchangeData.getOrCreateEncryptionDataTo(delegateId)\n exchangeDataApi.compareCallCountFromBaseline(initialisedCount, {\n createExchangeData: 1,\n // If we could fully preload we already know whether the exchange key already exists or not, otherwise we have to request from the api\n getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 1,\n modifyExchangeData: 0,\n getExchangeDataByIds: 0,\n getExchangeDataByParticipant: 0,\n })\n await checkDataEqual(retrievedCachedData, createdData)\n const decryptedKeyByDelegate = await baseExchangeData.tryDecryptExchangeKeys([createdData.exchangeData], { [delegateKeyFp]: delegateKeypair })\n const decryptedAccessControlSecretByDelegate = await baseExchangeData.tryDecryptAccessControlSecret([createdData.exchangeData], {\n [delegateKeyFp]: delegateKeypair,\n })\n await checkAesKeysEquality(decryptedKeyByDelegate.successfulDecryptions[0], createdData.exchangeKey)\n expect(decryptedAccessControlSecretByDelegate.successfulDecryptions[0]).to.equal(createdData.accessControlSecret)\n expect(retrievedCachedData.exchangeData.delegator).to.equal(selfId)\n expect(retrievedCachedData.exchangeData.delegate).to.equal(delegateId)\n expect(Object.keys(retrievedCachedData.exchangeData.delegatorSignature ?? {})).to.have.length(1)\n expect(Object.keys(retrievedCachedData.exchangeData.exchangeKey)).to.have.length(2)\n expect(Object.keys(retrievedCachedData.exchangeData.accessControlSecret)).to.have.length(2)\n expect(Object.keys(retrievedCachedData.exchangeData.sharedSignatureKey)).to.have.length(2)\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should create encryption keys to self when none is available', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdData = await exchangeData.getOrCreateEncryptionDataTo(selfId)\n expect(createdData.exchangeData.delegator).to.equal(selfId)\n expect(createdData.exchangeData.delegate).to.equal(selfId)\n expect(Object.keys(createdData.exchangeData.delegatorSignature ?? {})).to.have.length(1)\n expect(Object.keys(createdData.exchangeData.sharedSignatureKey)).to.have.length(1)\n expect(Object.keys(createdData.exchangeData.exchangeKey)).to.have.length(1)\n expect(Object.keys(createdData.exchangeData.accessControlSecret)).to.have.length(1)\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should ignore unverified keys when creating new exchange data', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n const delegateVerifiedKeys = await generateEncryptionKeys(5)\n const extraDelegateUnverifiedKeys = await generateEncryptionKeys(5)\n const extraDelegatorVerifiedKeys = await generateEncryptionKeys(5)\n const delegatorUnverifiedKeys = await generateEncryptionKeys(5)\n await initialiseComponents(allowFullExchangeDataLoad, { verifiedDelegateKeys: new Set(delegateVerifiedKeys.map((x) => x.hexPub)) })\n for (const keyData of [...delegateVerifiedKeys, ...extraDelegateUnverifiedKeys]) {\n await dataOwnerApi.addPublicKeyForOwner(delegateId, keyData.pair)\n }\n for (const keyData of extraDelegatorVerifiedKeys) {\n await dataOwnerApi.addPublicKeyForOwner(selfId, keyData.pair)\n await encryptionKeysManager.addOrUpdateKey(primitives, keyData.pair, true)\n }\n for (const keyData of delegatorUnverifiedKeys) {\n await dataOwnerApi.addPublicKeyForOwner(selfId, keyData.pair)\n await encryptionKeysManager.addOrUpdateKey(primitives, keyData.pair, false)\n }\n const created = await exchangeData.getOrCreateEncryptionDataTo(delegateId)\n expect(\n setEquals(new Set(Object.keys(created.exchangeData.exchangeKey)), new Set(Object.keys(created.exchangeData.accessControlSecret))),\n 'Keys used for encryption of exchange key and access control secret must be the same.'\n ).to.be.true\n expect(\n setEquals(\n new Set(Object.keys(created.exchangeData.exchangeKey)),\n new Set([...delegateVerifiedKeys.map((x) => x.fingerprintV2), ...extraDelegatorVerifiedKeys.map((x) => x.fingerprintV2), selfKeyFpV2])\n ),\n 'Only verified keys of delegate and delegator should be used for encryption of exchange key and access control secret.'\n ).to.be.true\n for (const keyData of [{ pair: selfKeypair, fingerprintV2: selfKeyFpV1 }, ...extraDelegatorVerifiedKeys, ...delegateVerifiedKeys]) {\n await checkAesKeysEquality(\n (\n await baseExchangeData.tryDecryptExchangeKeys([created.exchangeData], { [keyData.fingerprintV2]: keyData.pair })\n ).successfulDecryptions[0],\n created.exchangeKey\n )\n expect(\n (await baseExchangeData.tryDecryptAccessControlSecret([created.exchangeData], { [keyData.fingerprintV2]: keyData.pair }))\n .successfulDecryptions[0]\n ).to.equal(created.accessControlSecret)\n }\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should reuse existing exchange data for encryption when it can be verified', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdData = await exchangeData.getOrCreateEncryptionDataTo(delegateId)\n await exchangeData.clearOrRepopulateCache()\n const countAfterCacheClear = exchangeDataApi.callCount\n const reloadedData = await exchangeData.getOrCreateEncryptionDataTo(delegateId)\n exchangeDataApi.compareCallCountFromBaseline(countAfterCacheClear, {\n createExchangeData: 0,\n getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 1,\n modifyExchangeData: 0,\n getExchangeDataByIds: 0,\n getExchangeDataByParticipant: 0,\n })\n await checkDataEqual(reloadedData, createdData)\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should create new exchange data for encryption when the existing data can not be verified due to unavailable verification key', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdData = await exchangeData.getOrCreateEncryptionDataTo(delegateId)\n await encryptionKeysManager.unverifyExistingKeysAndCreateNewVerified(primitives)\n await exchangeData.clearOrRepopulateCache()\n const countAfterCacheClear = exchangeDataApi.callCount\n const newData = await exchangeData.getOrCreateEncryptionDataTo(delegateId)\n exchangeDataApi.compareCallCountFromBaseline(countAfterCacheClear, {\n createExchangeData: 1,\n getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 1,\n modifyExchangeData: 0,\n getExchangeDataByIds: 0,\n getExchangeDataByParticipant: 0,\n })\n expect(_.isEqual(_.omit(createdData.exchangeData, ['rev']), _.omit(newData.exchangeData, ['rev']))).to.equal(\n false,\n 'Exchange data manager should have created new exchange data for encryption'\n )\n expect(ua2hex(await primitives.AES.exportKey(createdData.exchangeKey, 'raw'))).to.not.equal(\n ua2hex(await primitives.AES.exportKey(newData.exchangeKey, 'raw'))\n )\n expect(createdData.accessControlSecret).to.not.equal(newData.accessControlSecret)\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should create new exchange data for encryption when the existing data can not be verified due to tampering of the encrypted access control secret and/or encrypted exchange key', async function () {\n async function doTest(\n allowFullExchangeDataLoad: boolean,\n tamper: (exchangeData: ExchangeData, selfKeyPair: KeyPair<CryptoKey>, selfKeyFp: string) => Promise<ExchangeData>\n ) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const sfk = primitives.randomUuid()\n const createdData = await exchangeData.getOrCreateEncryptionDataTo(delegateId)\n // Tamper with exchange data\n await exchangeDataApi.modifyExchangeData(await tamper(createdData.exchangeData, selfKeypair, selfKeyFpV2))\n await exchangeData.clearOrRepopulateCache()\n const countAfterCacheClear = exchangeDataApi.callCount\n const newData = await exchangeData.getOrCreateEncryptionDataTo(delegateId)\n exchangeDataApi.compareCallCountFromBaseline(countAfterCacheClear, {\n createExchangeData: 1,\n getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 1,\n modifyExchangeData: 0,\n getExchangeDataByIds: 0,\n getExchangeDataByParticipant: 0,\n })\n expect(createdData.exchangeData.id).not.to.equal(\n newData.exchangeData.id,\n 'Exchange data manager should have created new exchange data for encryption'\n )\n expect(ua2hex(await primitives.AES.exportKey(createdData.exchangeKey, 'raw'))).to.not.equal(\n ua2hex(await primitives.AES.exportKey(newData.exchangeKey, 'raw'))\n )\n expect(createdData.accessControlSecret).to.not.equal(newData.accessControlSecret)\n const updatedUnverifiedOldData = (await exchangeData.getDecryptionDataKeyByIds([createdData.exchangeData.id!], true))[\n createdData.exchangeData.id!\n ]\n expect(updatedUnverifiedOldData).to.not.be.undefined\n }\n const extraKeyPair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const extraKeyPairFp = fingerprintV2(ua2hex(await primitives.RSA.exportKey(extraKeyPair.publicKey, 'spki')))\n const fakeKey = primitives.randomBytes(16)\n const tamperByChangingEncryptionKey = async (exchangeData: ExchangeData, selfKeyPair: KeyPair<CryptoKey>, selfKeyFp: string) =>\n new ExchangeData({\n ...exchangeData,\n exchangeKey: {\n ...exchangeData.exchangeKey,\n [selfKeyFp]: ua2b64(await primitives.RSA.encrypt(selfKeyPair.publicKey, fakeKey)),\n },\n })\n const tamperByChangingAccessControlSecret = async (exchangeData: ExchangeData, selfKeyPair: KeyPair<CryptoKey>, selfKeyFp: string) =>\n new ExchangeData({\n ...exchangeData,\n accessControlSecret: {\n ...exchangeData.accessControlSecret,\n [selfKeyFp]: ua2b64(await primitives.RSA.encrypt(selfKeyPair.publicKey, fakeKey)),\n },\n })\n const tamperByChangingBoth = async (exchangeData: ExchangeData, selfKeyPair: KeyPair<CryptoKey>, selfKeyFp: string) =>\n tamperByChangingEncryptionKey(await tamperByChangingAccessControlSecret(exchangeData, selfKeyPair, selfKeyFp), selfKeyPair, selfKeyFp)\n const tamperByAddingEncryptionKey = async (exchangeData: ExchangeData) =>\n new ExchangeData({\n ...exchangeData,\n exchangeKey: {\n ...exchangeData.exchangeKey,\n [extraKeyPairFp]: ua2b64(await primitives.RSA.encrypt(extraKeyPair.publicKey, fakeKey)),\n },\n })\n await doTest(true, tamperByChangingEncryptionKey)\n await doTest(false, tamperByChangingEncryptionKey)\n await doTest(true, tamperByChangingAccessControlSecret)\n await doTest(false, tamperByChangingAccessControlSecret)\n await doTest(true, tamperByChangingBoth)\n await doTest(false, tamperByChangingBoth)\n await doTest(true, tamperByAddingEncryptionKey)\n await doTest(false, tamperByAddingEncryptionKey)\n })\n\n it('should create new exchange data for encryption when the existing data can not be verified due to tampering of the delegate id', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdData = await exchangeData.getOrCreateEncryptionDataTo(delegateId)\n // Tamper with exchange data\n await exchangeDataApi.modifyExchangeData({\n ...createdData.exchangeData,\n delegate: delegate2Id,\n })\n await exchangeData.clearOrRepopulateCache()\n const countAfterCacheClear = exchangeDataApi.callCount\n const newDataToDelegate = await exchangeData.getOrCreateEncryptionDataTo(delegateId)\n const newDataToDelegate2 = await exchangeData.getOrCreateEncryptionDataTo(delegate2Id)\n exchangeDataApi.compareCallCountFromBaseline(countAfterCacheClear, {\n createExchangeData: 2,\n getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 2,\n modifyExchangeData: 0,\n getExchangeDataByIds: 0,\n getExchangeDataByParticipant: 0,\n })\n expect(createdData.exchangeData.id).to.not.equal(\n newDataToDelegate.exchangeData.id,\n 'Exchange data manager should have created new exchange data for encryption to delegate'\n )\n expect(createdData.exchangeData.id).to.not.equal(\n newDataToDelegate2.exchangeData.id,\n 'Exchange data manager should have created new exchange data for encryption to delegate 2'\n )\n expect(ua2hex(await primitives.AES.exportKey(createdData.exchangeKey, 'raw'))).to.not.equal(\n ua2hex(await primitives.AES.exportKey(newDataToDelegate.exchangeKey, 'raw'))\n )\n expect(ua2hex(await primitives.AES.exportKey(createdData.exchangeKey, 'raw'))).to.not.equal(\n ua2hex(await primitives.AES.exportKey(newDataToDelegate2.exchangeKey, 'raw'))\n )\n expect(createdData.accessControlSecret).to.not.equal(newDataToDelegate.accessControlSecret)\n expect(createdData.accessControlSecret).to.not.equal(newDataToDelegate2.accessControlSecret)\n const updatedUnverifiedOldData = (await exchangeData.getDecryptionDataKeyByIds([createdData.exchangeData.id!], true))[\n createdData.exchangeData.id!\n ]\n expect(updatedUnverifiedOldData).to.not.be.undefined\n expect(ua2hex(await primitives.AES.exportKey(updatedUnverifiedOldData!.exchangeKey!, 'raw'))).to.equal(\n ua2hex(await primitives.AES.exportKey(createdData.exchangeKey, 'raw'))\n )\n expect(updatedUnverifiedOldData!.accessControlSecret).to.equal(createdData.accessControlSecret)\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should return existing exchange data keys for decryption even if the data authenticity could not be verified', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdData1 = await exchangeData.getOrCreateEncryptionDataTo(delegateId)\n const createdData2 = await createDataFromRandomToSelf()\n await encryptionKeysManager.unverifyExistingKeysAndCreateNewVerified(primitives)\n await exchangeData.clearOrRepopulateCache()\n await checkDataEqual(\n (\n await exchangeData.getDecryptionDataKeyByIds([createdData1.exchangeData.id!], true)\n )[createdData1.exchangeData.id!],\n createdData1\n )\n await checkDataEqual(\n (\n await exchangeData.getDecryptionDataKeyByIds([createdData2.exchangeData.id!], true)\n )[createdData2.exchangeData.id!],\n createdData2\n )\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('newly created data or data retrieved by id should be cached and retrievable by hash', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdData1 = await exchangeData.getOrCreateEncryptionDataTo(delegateId)\n const hashes1 = await accessControlSecretUtils.allSecureDelegationKeysFor(createdData1.accessControlSecret)\n const retrievedKeys1 = await exchangeData.getCachedDecryptionDataKeyByAccessControlHash(hashes1)\n for (const hash of hashes1) {\n await checkDataEqual(retrievedKeys1[hash], createdData1)\n }\n if (!allowFullExchangeDataLoad) {\n const createdData2 = await createDataFromRandomToSelf()\n const hashes2 = await accessControlSecretUtils.allSecureDelegationKeysFor(createdData2.accessControlSecret)\n await checkDataEqual(\n (\n await exchangeData.getDecryptionDataKeyByIds([createdData2.exchangeData.id!], true)\n )[createdData2.exchangeData.id!],\n createdData2\n )\n const retrievedKeys2 = await exchangeData.getCachedDecryptionDataKeyByAccessControlHash([...hashes1, ...hashes2])\n for (const hash of hashes2) {\n await checkDataEqual(retrievedKeys2[hash], createdData2)\n }\n }\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('if data can not be decrypted the retrieval method should return undefined', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdBySelf = await exchangeData.getOrCreateEncryptionDataTo(selfId)\n const createdByOther = await createDataFromRandomToSelf()\n const newKey = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n await dataOwnerApi.addPublicKeyForOwner(selfId, newKey)\n // Simulate loss of key\n encryptionKeysManager.deleteKey(selfKeyFpV1)\n await encryptionKeysManager.addOrUpdateKey(primitives, newKey, true)\n await exchangeData.clearOrRepopulateCache()\n await checkDataEqual((await exchangeData.getDecryptionDataKeyByIds([createdBySelf.exchangeData.id!], true))[createdBySelf.exchangeData.id!], {\n exchangeData: createdBySelf.exchangeData,\n exchangeKey: undefined,\n })\n await checkDataEqual((await exchangeData.getDecryptionDataKeyByIds([createdByOther.exchangeData.id!], true))[createdByOther.exchangeData.id!], {\n exchangeData: createdByOther.exchangeData,\n exchangeKey: undefined,\n })\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('unverified keys should still be usable for decryption of data', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdBySelf = await exchangeData.getOrCreateEncryptionDataTo(selfId)\n const createdByOther = await createDataFromRandomToSelf()\n await encryptionKeysManager.addOrUpdateKey(primitives, selfKeypair, false)\n await exchangeData.clearOrRepopulateCache()\n await checkDataEqual(\n (\n await exchangeData.getDecryptionDataKeyByIds([createdBySelf.exchangeData.id!], true)\n )[createdBySelf.exchangeData.id!],\n createdBySelf\n )\n await checkDataEqual(\n (\n await exchangeData.getDecryptionDataKeyByIds([createdByOther.exchangeData.id!], true)\n )[createdByOther.exchangeData.id!],\n createdByOther\n )\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('implementation with limited cache should trigger eviction of delegate and hash cache on eviction of data by id cache', async function () {\n await initialiseComponents(false, { lruCacheSize: 3 })\n const entityType = EntityWithDelegationTypeName.Contact\n const sfks = [primitives.randomUuid(), primitives.randomUuid(), primitives.randomUuid()]\n\n async function verifyCached(data: { exchangeData: ExchangeData; accessControlSecret: string; exchangeKey: CryptoKey }) {\n const apiCallsBaseline = exchangeDataApi.callCount\n const hashes = await accessControlSecretUtils.allSecureDelegationKeysFor(data.accessControlSecret)\n for (const hash of hashes) {\n await checkDataEqual((await exchangeData.getCachedDecryptionDataKeyByAccessControlHash([hash]))[hash], data)\n }\n if (data.exchangeData.delegator === selfId) {\n await checkDataEqual(await exchangeData.getOrCreateEncryptionDataTo(data.exchangeData.delegate), data)\n }\n await checkDataEqual((await exchangeData.getDecryptionDataKeyByIds([data.exchangeData.id!], true))[data.exchangeData.id!], data)\n exchangeDataApi.compareCallCountFromBaseline(apiCallsBaseline, {\n getExchangeDataByIds: 0,\n createExchangeData: 0,\n modifyExchangeData: 0,\n getExchangeDataByParticipant: 0,\n getExchangeDataByDelegatorDelegate: 0,\n })\n }\n\n async function verifyNotCachedThenCache(data: { exchangeData: ExchangeData; accessControlSecret: string; exchangeKey: CryptoKey }) {\n const apiCallsBaseline = exchangeDataApi.callCount\n const hashes = [await accessControlSecretUtils.secureDelegationKeyFor(data.accessControlSecret, entityType)]\n for (const hash of hashes) {\n expect(Object.keys(await exchangeData.getCachedDecryptionDataKeyByAccessControlHash([hash]))).to.have.length(0)\n }\n if (data.exchangeData.delegator === selfId) {\n await checkDataEqual(await exchangeData.getOrCreateEncryptionDataTo(data.exchangeData.delegate), data)\n exchangeDataApi.compareCallCountFromBaseline(apiCallsBaseline, {\n getExchangeDataByIds: 0,\n createExchangeData: 0,\n modifyExchangeData: 0,\n getExchangeDataByParticipant: 0,\n getExchangeDataByDelegatorDelegate: 1,\n })\n } else {\n await checkDataEqual((await exchangeData.getDecryptionDataKeyByIds([data.exchangeData.id!], true))[data.exchangeData.id!], data)\n exchangeDataApi.compareCallCountFromBaseline(apiCallsBaseline, {\n getExchangeDataByIds: 1,\n createExchangeData: 0,\n modifyExchangeData: 0,\n getExchangeDataByParticipant: 0,\n getExchangeDataByDelegatorDelegate: 0,\n })\n }\n }\n\n const createdBySelf1 = await exchangeData.getOrCreateEncryptionDataTo(selfId)\n const createdBySelf2 = await exchangeData.getOrCreateEncryptionDataTo(delegateId)\n const createdByOther1 = await createDataFromRandomToSelf() // Not automatically cached: created by someone else\n const createdByOther2 = await createDataFromRandomToSelf() // Not automatically cached: created by someone else\n // noinspection DuplicatedCode\n await verifyCached(createdBySelf1)\n await verifyCached(createdBySelf2)\n await verifyNotCachedThenCache(createdByOther1)\n await verifyCached(createdBySelf1)\n await verifyCached(createdBySelf2)\n await verifyCached(createdByOther1)\n await verifyNotCachedThenCache(createdByOther2)\n await verifyCached(createdBySelf2)\n await verifyCached(createdByOther1)\n await verifyCached(createdByOther2)\n await verifyNotCachedThenCache(createdBySelf1)\n await verifyCached(createdByOther1)\n await verifyCached(createdByOther2)\n await verifyCached(createdBySelf1)\n await verifyNotCachedThenCache(createdBySelf2)\n await verifyCached(createdByOther2)\n // noinspection DuplicatedCode\n await verifyCached(createdBySelf1)\n await verifyCached(createdBySelf2)\n await verifyNotCachedThenCache(createdByOther1)\n await verifyCached(createdBySelf1)\n await verifyCached(createdBySelf2)\n await verifyCached(createdByOther1)\n await verifyNotCachedThenCache(createdByOther2)\n await verifyCached(createdBySelf2)\n await verifyCached(createdByOther1)\n await verifyCached(createdByOther2)\n })\n\n it('implementation with unlimited cache should preload all existing exchange data on creation', async function () {\n await initialiseComponents(true)\n const createdBySelf = await exchangeData.getOrCreateEncryptionDataTo(selfId)\n const createdByOther = await createDataFromRandomToSelf()\n const recreatedExchangeData = await initialiseExchangeDataManagerForCurrentDataOwner(\n baseExchangeData,\n encryptionKeysManager,\n accessControlSecretUtils,\n new TestCryptoStrategies(),\n dataOwnerApi,\n primitives,\n true\n )\n const apiCallsAfterCreation = exchangeDataApi.callCount\n await checkDataEqual(\n (\n await recreatedExchangeData.getDecryptionDataKeyByIds([createdBySelf.exchangeData.id!], false)\n )[createdBySelf.exchangeData.id!],\n createdBySelf\n )\n await checkDataEqual(\n (\n await recreatedExchangeData.getDecryptionDataKeyByIds([createdByOther.exchangeData.id!], false)\n )[createdByOther.exchangeData.id!],\n createdByOther\n )\n exchangeDataApi.compareCallCountFromBaseline(apiCallsAfterCreation, {\n getExchangeDataByIds: 0,\n createExchangeData: 0,\n modifyExchangeData: 0,\n getExchangeDataByParticipant: 0,\n getExchangeDataByDelegatorDelegate: 0,\n })\n })\n})\n\nlet env: TestVars\n\ndescribe('Exchange data manager - e2e', async function () {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n })\n\n it('give access back should not invalidate existing and valid exchange data', async function () {\n const hcp1Details = await createNewHcpApi(env)\n const hcp2Details = await createNewHcpApi(env)\n const ed1to2 = await hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId)\n const ed2to1 = await hcp2Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp1Details.credentials.dataOwnerId)\n await hcp1Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n await hcp2Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n const newKeyPair = await hcp1Details.api.cryptoApi.primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const exportedPub = ua2hex(await hcp1Details.api.cryptoApi.primitives.RSA.exportKey(newKeyPair.publicKey, 'spki'))\n const hcp2 = await hcp2Details.api.healthcarePartyApi.getHealthcareParty(hcp2Details.credentials.dataOwnerId)\n await hcp2Details.api.healthcarePartyApi.modifyHealthcareParty({\n ...hcp2,\n publicKeysForOaepWithSha256: [...hcp2.publicKeysForOaepWithSha256, exportedPub],\n })\n await hcp1Details.api.cryptoApi.exchangeData.giveAccessBackTo(hcp2Details.credentials.dataOwnerId, exportedPub)\n await hcp1Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n await hcp2Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n const updatedEd1to2 = await hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId)\n const updatedEd2to1 = await hcp2Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp1Details.credentials.dataOwnerId)\n expect(updatedEd1to2.exchangeData.id).to.equal(ed1to2.exchangeData.id)\n expect(Object.keys(updatedEd2to1.exchangeData.exchangeKey).length).to.be.greaterThan(Object.keys(ed2to1.exchangeData.exchangeKey).length)\n expect(Object.keys(updatedEd2to1.exchangeData.exchangeKey).length).to.equal(Object.keys(updatedEd2to1.exchangeData.accessControlSecret).length)\n expect(Object.keys(updatedEd2to1.exchangeData.exchangeKey).length).to.equal(Object.keys(updatedEd2to1.exchangeData.sharedSignatureKey).length)\n expect(updatedEd2to1.exchangeData.id).to.equal(ed2to1.exchangeData.id)\n expect(Object.keys(updatedEd1to2.exchangeData.exchangeKey).length).to.be.greaterThan(Object.keys(ed1to2.exchangeData.exchangeKey).length)\n expect(Object.keys(updatedEd1to2.exchangeData.exchangeKey).length).to.equal(Object.keys(updatedEd1to2.exchangeData.accessControlSecret).length)\n expect(Object.keys(updatedEd1to2.exchangeData.exchangeKey).length).to.equal(Object.keys(updatedEd1to2.exchangeData.sharedSignatureKey).length)\n })\n\n it('invalid exchange data should not be re-validated by give access back', async function () {\n const hcp1Details = await createNewHcpApi(env)\n const hcp2Details = await createNewHcpApi(env)\n const ed1to2 = await hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId)\n const ed2to1 = await hcp2Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp1Details.credentials.dataOwnerId)\n await hcp1Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n await hcp2Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n const exchangeDataApi = new IccExchangeDataApi(env.iCureUrl, {}, hcp1Details.api.authApi.authenticationProvider, fetch)\n const extraKeyPair = await hcp1Details.api.cryptoApi.primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const extraKeyPairPub = ua2hex(await hcp1Details.api.cryptoApi.primitives.RSA.exportKey(extraKeyPair.publicKey, 'spki'))\n const extraKeyPairFp = fingerprintV2(extraKeyPairPub)\n const fakeData = await hcp1Details.api.cryptoApi.primitives.randomBytes(16)\n async function tamperWithData(data: ExchangeData) {\n await exchangeDataApi.modifyExchangeData({\n ...data,\n exchangeKey: {\n ...data.exchangeKey,\n [extraKeyPairFp]: ua2b64(await hcp1Details.api.cryptoApi.primitives.RSA.encrypt(extraKeyPair.publicKey, fakeData)),\n },\n accessControlSecret: {\n ...data.accessControlSecret,\n [extraKeyPairFp]: ua2b64(await hcp1Details.api.cryptoApi.primitives.RSA.encrypt(extraKeyPair.publicKey, fakeData)),\n },\n sharedSignatureKey: {\n ...data.sharedSignatureKey,\n [extraKeyPairFp]: ua2b64(await hcp1Details.api.cryptoApi.primitives.RSA.encrypt(extraKeyPair.publicKey, fakeData)),\n },\n })\n }\n await tamperWithData(ed1to2.exchangeData)\n await tamperWithData(ed2to1.exchangeData)\n const newKeyPair = await hcp1Details.api.cryptoApi.primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const exportedPub = ua2hex(await hcp1Details.api.cryptoApi.primitives.RSA.exportKey(newKeyPair.publicKey, 'spki'))\n const hcp2 = await hcp2Details.api.healthcarePartyApi.getHealthcareParty(hcp2Details.credentials.dataOwnerId)\n await hcp2Details.api.healthcarePartyApi.modifyHealthcareParty({\n ...hcp2,\n publicKeysForOaepWithSha256: [...hcp2.publicKeysForOaepWithSha256, exportedPub, extraKeyPairPub],\n })\n await hcp1Details.api.cryptoApi.exchangeData.giveAccessBackTo(hcp2Details.credentials.dataOwnerId, exportedPub)\n await hcp1Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n await hcp2Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n const updatedEd1to2 = await hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId)\n const updatedEd2to1 = await hcp2Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp1Details.credentials.dataOwnerId)\n expect(updatedEd1to2.exchangeData.id).to.not.equal(ed1to2.exchangeData.id)\n expect(updatedEd2to1.exchangeData.id).to.not.equal(ed2to1.exchangeData.id)\n const decData1to2 = (await hcp1Details.api.cryptoApi.exchangeData.getDecryptionDataKeyByIds([ed1to2.exchangeData.id!], true))[\n ed1to2.exchangeData.id!\n ]\n expect(decData1to2).to.not.be.undefined\n expect(decData1to2!.exchangeKey).to.not.be.undefined\n expect(decData1to2!.accessControlSecret).to.not.be.undefined\n const decData2to1 = (await hcp2Details.api.cryptoApi.exchangeData.getDecryptionDataKeyByIds([ed2to1.exchangeData.id!], true))[\n ed2to1.exchangeData.id!\n ]\n expect(decData2to1).to.not.be.undefined\n expect(decData2to1!.exchangeKey).to.not.be.undefined\n expect(decData2to1!.accessControlSecret).to.not.be.undefined\n })\n})\n"]}
1
+ {"version":3,"file":"exchange-data-manager-test.js","sourceRoot":"","sources":["../../../../test/icc-x-api/crypto/exchange-data-manager-test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe } from 'mocha'\nimport {\n ExchangeDataManager,\n ExchangeDataManagerOptionalParameters,\n initialiseExchangeDataManagerForCurrentDataOwner,\n} from '../../../icc-x-api/crypto/ExchangeDataManager'\nimport { WebCryptoPrimitives } from '../../../icc-x-api/crypto/CryptoPrimitives'\nimport { webcrypto } from 'crypto'\nimport { BaseExchangeDataManager } from '../../../icc-x-api/crypto/BaseExchangeDataManager'\nimport { FakeExchangeDataApi } from '../../utils/FakeExchangeDataApi'\nimport { FakeDataOwnerApi } from '../../utils/FakeDataOwnerApi'\nimport { TestCryptoStrategies } from '../../utils/TestCryptoStrategies'\nimport { EntityWithDelegationTypeName, ShaVersion, ua2b64, ua2hex } from '../../../icc-x-api'\nimport { FakeEncryptionKeysManager } from '../../utils/FakeEncryptionKeysManager'\nimport { AccessControlSecretUtils } from '../../../icc-x-api/crypto/AccessControlSecretUtils'\nimport { ExchangeData } from '../../../icc-api/model/internal/ExchangeData'\nimport { expect } from 'chai'\nimport { setEquals } from '../../../icc-x-api/utils/collection-utils'\nimport { KeyPair } from '../../../icc-x-api/crypto/RSA'\nimport * as _ from 'lodash'\nimport { fingerprintV1, fingerprintV1toV2, fingerprintV2 } from '../../../icc-x-api/crypto/utils'\nimport { DataOwnerTypeEnum } from '../../../icc-api/model/DataOwnerTypeEnum'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { createNewHcpApi, getEnvironmentInitializer, setLocalStorage } from '../../utils/test_utils'\nimport 'isomorphic-fetch'\nimport { IccExchangeDataApi } from '../../../icc-api/api/internal/IccExchangeDataApi'\n\nsetLocalStorage(fetch)\n\ndescribe('Exchange data manager - unit', async function () {\n const primitives = new WebCryptoPrimitives(webcrypto as any)\n const accessControlSecretUtils = new AccessControlSecretUtils(primitives)\n let selfId: string\n let selfKeyFpV1: string\n let selfKeyFpV2: string\n let selfKeypair: KeyPair<CryptoKey>\n let delegateId: string\n let delegateKeyFp: string\n let delegateKeypair: KeyPair<CryptoKey>\n let delegate2Id: string\n let delegate2KeyFp: string\n let delegate2Keypair: KeyPair<CryptoKey>\n let dataOwnerApi: FakeDataOwnerApi\n let exchangeDataApi: FakeExchangeDataApi\n let baseExchangeData: BaseExchangeDataManager\n let exchangeData: ExchangeDataManager\n let encryptionKeysManager: FakeEncryptionKeysManager\n\n async function initialiseComponents(\n allowFullExchangeDataLoad: boolean,\n optionalParameters: ExchangeDataManagerOptionalParameters & { verifiedDelegateKeys?: Set<string> } = {}\n ) {\n const dataOwnerType = allowFullExchangeDataLoad ? DataOwnerTypeEnum.Patient : DataOwnerTypeEnum.Hcp\n selfId = primitives.randomUuid()\n selfKeypair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n selfKeyFpV1 = fingerprintV1(ua2hex(await primitives.RSA.exportKey(selfKeypair.publicKey, 'spki')))\n selfKeyFpV2 = fingerprintV1toV2(selfKeyFpV1)\n delegateId = primitives.randomUuid()\n delegateKeypair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n delegateKeyFp = fingerprintV1(ua2hex(await primitives.RSA.exportKey(delegateKeypair.publicKey, 'spki')))\n delegate2Id = primitives.randomUuid()\n delegate2Keypair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n delegate2KeyFp = fingerprintV1(ua2hex(await primitives.RSA.exportKey(delegate2Keypair.publicKey, 'spki')))\n dataOwnerApi = new FakeDataOwnerApi(\n {\n id: selfId,\n type: dataOwnerType,\n publicKeysForOaepWithSha256: [ua2hex(await primitives.RSA.exportKey(selfKeypair.publicKey, 'spki'))],\n },\n [\n {\n id: delegateId,\n type: dataOwnerType,\n publicKeysForOaepWithSha256: [ua2hex(await primitives.RSA.exportKey(delegateKeypair.publicKey, 'spki'))],\n },\n {\n id: delegate2Id,\n type: dataOwnerType,\n publicKeysForOaepWithSha256: [ua2hex(await primitives.RSA.exportKey(delegate2Keypair.publicKey, 'spki'))],\n },\n ]\n )\n const cryptoStrategies = new TestCryptoStrategies(undefined, undefined, optionalParameters.verifiedDelegateKeys)\n exchangeDataApi = new FakeExchangeDataApi()\n baseExchangeData = new BaseExchangeDataManager(exchangeDataApi, dataOwnerApi, primitives, allowFullExchangeDataLoad, false)\n encryptionKeysManager = await FakeEncryptionKeysManager.create(primitives, [selfKeypair])\n exchangeData = await initialiseExchangeDataManagerForCurrentDataOwner(\n baseExchangeData,\n encryptionKeysManager,\n accessControlSecretUtils,\n cryptoStrategies,\n dataOwnerApi,\n primitives,\n true,\n optionalParameters\n )\n }\n\n async function checkDataEqual(\n actual: { exchangeData: ExchangeData; accessControlSecret?: string; exchangeKey: CryptoKey | undefined } | undefined,\n expected: { exchangeData: ExchangeData; accessControlSecret?: string; exchangeKey: CryptoKey | undefined }\n ) {\n expect(actual).to.not.be.undefined\n expect(_.isEqual(_.omit(expected.exchangeData, ['rev']), _.omit(actual!.exchangeData, ['rev']))).to.equal(\n true,\n `Data should be equivalent\\nExpected: ${JSON.stringify(expected.exchangeData, undefined, 2)}\\nActual: ${JSON.stringify(\n actual!.exchangeData,\n undefined,\n 2\n )}\\n`\n )\n expect(expected.accessControlSecret).to.equal(actual!.accessControlSecret)\n await checkAesKeysEquality(actual!.exchangeKey, expected.exchangeKey)\n }\n\n async function checkAesKeysEquality(actual: CryptoKey | undefined, expected: CryptoKey | undefined) {\n if (!actual && !expected) return\n expect(!actual).to.equal(!expected, !expected ? 'Key should not have been decrypted' : 'Key should have been decrypted')\n expect(ua2hex(await primitives.AES.exportKey(expected!, 'raw'))).to.equal(ua2hex(await primitives.AES.exportKey(actual!, 'raw')))\n }\n\n async function createDataFromRandomToSelf(): Promise<{ exchangeData: ExchangeData; exchangeKey: CryptoKey; accessControlSecret: string }> {\n const encryptionKey = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const encryptionFp = ua2hex(await primitives.RSA.exportKey(encryptionKey.publicKey, 'spki')).slice(-32)\n const signatureKey = await primitives.RSA.generateKeyPair(ShaVersion.Sha1)\n const signatureFp = ua2hex(await primitives.RSA.exportKey(signatureKey.publicKey, 'spki')).slice(-32)\n const created = await baseExchangeData.createExchangeData(\n selfId,\n { [signatureFp]: signatureKey.privateKey },\n { [encryptionFp]: encryptionKey.publicKey, [selfKeyFpV1]: selfKeypair.publicKey }\n )\n const modified = await exchangeDataApi.modifyExchangeData(\n new ExchangeData({\n ...created.exchangeData,\n delegator: primitives.randomUuid(),\n })\n )\n return { exchangeData: modified, exchangeKey: created.exchangeKey, accessControlSecret: created.accessControlSecret }\n }\n\n async function generateEncryptionKeys(n: number): Promise<{ pair: KeyPair<CryptoKey>; fingerprintV2: string; hexPub: string }[]> {\n return await Promise.all(\n Array(n)\n .fill(null)\n .map(async () => {\n const pair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const hexPub = ua2hex(await primitives.RSA.exportKey(pair.publicKey, 'spki'))\n const fingerprint = fingerprintV2(hexPub)\n return { pair, fingerprintV2: fingerprint, hexPub }\n })\n )\n }\n\n it('base should be able to retrieve all exchange data for the current data owner if allowed by the crypto strategies', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const expectedData = await Promise.all(\n Array.from(Array(3500), async (_, i) => {\n const data = new ExchangeData({\n id: primitives.randomUuid(),\n delegate: i % 2 === 0 ? selfId : primitives.randomUuid(),\n delegator: i % 2 === 0 ? primitives.randomUuid() : selfId,\n exchangeKey: { not: 'important' },\n accessControlSecret: { not: 'important' },\n sharedSignatureKey: { not: 'important' },\n delegatorSignature: { not: 'important' },\n sharedSignature: 'not important',\n })\n await exchangeDataApi.createExchangeData(data)\n return data\n })\n )\n await Promise.all(\n Array.from(Array(500), async () => {\n // Should not be in result\n const data = new ExchangeData({\n id: primitives.randomUuid(),\n delegate: primitives.randomUuid(),\n delegator: primitives.randomUuid(),\n exchangeKey: { not: 'important' },\n accessControlSecret: { not: 'important' },\n sharedSignatureKey: { not: 'important' },\n delegatorSignature: { not: 'important' },\n sharedSignature: 'not important',\n })\n await exchangeDataApi.createExchangeData(data)\n })\n )\n const retrieved = await baseExchangeData.getAllExchangeDataForCurrentDataOwnerIfAllowed()\n if (allowFullExchangeDataLoad) {\n expect(retrieved).to.not.be.undefined\n expect(retrieved).to.have.length(expectedData.length)\n expect(setEquals(new Set(expectedData.map((x) => x.id)), new Set(retrieved!.map((x) => x.id))), 'Retrieved and expected ids').to.be.true\n } else {\n expect(retrieved).to.be.undefined\n }\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should create new encryption keys when none is available', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const sfk = primitives.randomUuid()\n const initialisedCount = exchangeDataApi.callCount\n const createdData = await exchangeData.getOrCreateEncryptionDataTo(delegateId)\n const retrievedCachedData = await exchangeData.getOrCreateEncryptionDataTo(delegateId)\n exchangeDataApi.compareCallCountFromBaseline(initialisedCount, {\n createExchangeData: 1,\n // If we could fully preload we already know whether the exchange key already exists or not, otherwise we have to request from the api\n getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 1,\n modifyExchangeData: 0,\n getExchangeDataByIds: 0,\n getExchangeDataByParticipant: 0,\n })\n await checkDataEqual(retrievedCachedData, createdData)\n const decryptedKeyByDelegate = await baseExchangeData.tryDecryptExchangeKeys([createdData.exchangeData], { [delegateKeyFp]: delegateKeypair })\n const decryptedAccessControlSecretByDelegate = await baseExchangeData.tryDecryptAccessControlSecret([createdData.exchangeData], {\n [delegateKeyFp]: delegateKeypair,\n })\n await checkAesKeysEquality(decryptedKeyByDelegate.successfulDecryptions[0], createdData.exchangeKey)\n expect(decryptedAccessControlSecretByDelegate.successfulDecryptions[0]).to.equal(createdData.accessControlSecret)\n expect(retrievedCachedData.exchangeData.delegator).to.equal(selfId)\n expect(retrievedCachedData.exchangeData.delegate).to.equal(delegateId)\n expect(Object.keys(retrievedCachedData.exchangeData.delegatorSignature ?? {})).to.have.length(1)\n expect(Object.keys(retrievedCachedData.exchangeData.exchangeKey)).to.have.length(2)\n expect(Object.keys(retrievedCachedData.exchangeData.accessControlSecret)).to.have.length(2)\n expect(Object.keys(retrievedCachedData.exchangeData.sharedSignatureKey)).to.have.length(2)\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should create encryption keys to self when none is available', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdData = await exchangeData.getOrCreateEncryptionDataTo(selfId)\n expect(createdData.exchangeData.delegator).to.equal(selfId)\n expect(createdData.exchangeData.delegate).to.equal(selfId)\n expect(Object.keys(createdData.exchangeData.delegatorSignature ?? {})).to.have.length(1)\n expect(Object.keys(createdData.exchangeData.sharedSignatureKey)).to.have.length(1)\n expect(Object.keys(createdData.exchangeData.exchangeKey)).to.have.length(1)\n expect(Object.keys(createdData.exchangeData.accessControlSecret)).to.have.length(1)\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should ignore unverified keys when creating new exchange data', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n const delegateVerifiedKeys = await generateEncryptionKeys(5)\n const extraDelegateUnverifiedKeys = await generateEncryptionKeys(5)\n const extraDelegatorVerifiedKeys = await generateEncryptionKeys(5)\n const delegatorUnverifiedKeys = await generateEncryptionKeys(5)\n await initialiseComponents(allowFullExchangeDataLoad, { verifiedDelegateKeys: new Set(delegateVerifiedKeys.map((x) => x.hexPub)) })\n for (const keyData of [...delegateVerifiedKeys, ...extraDelegateUnverifiedKeys]) {\n await dataOwnerApi.addPublicKeyForOwner(delegateId, keyData.pair)\n }\n for (const keyData of extraDelegatorVerifiedKeys) {\n await dataOwnerApi.addPublicKeyForOwner(selfId, keyData.pair)\n await encryptionKeysManager.addOrUpdateKey(primitives, keyData.pair, true)\n }\n for (const keyData of delegatorUnverifiedKeys) {\n await dataOwnerApi.addPublicKeyForOwner(selfId, keyData.pair)\n await encryptionKeysManager.addOrUpdateKey(primitives, keyData.pair, false)\n }\n const created = await exchangeData.getOrCreateEncryptionDataTo(delegateId)\n expect(\n setEquals(new Set(Object.keys(created.exchangeData.exchangeKey)), new Set(Object.keys(created.exchangeData.accessControlSecret))),\n 'Keys used for encryption of exchange key and access control secret must be the same.'\n ).to.be.true\n expect(\n setEquals(\n new Set(Object.keys(created.exchangeData.exchangeKey)),\n new Set([...delegateVerifiedKeys.map((x) => x.fingerprintV2), ...extraDelegatorVerifiedKeys.map((x) => x.fingerprintV2), selfKeyFpV2])\n ),\n 'Only verified keys of delegate and delegator should be used for encryption of exchange key and access control secret.'\n ).to.be.true\n for (const keyData of [{ pair: selfKeypair, fingerprintV2: selfKeyFpV1 }, ...extraDelegatorVerifiedKeys, ...delegateVerifiedKeys]) {\n await checkAesKeysEquality(\n (\n await baseExchangeData.tryDecryptExchangeKeys([created.exchangeData], { [keyData.fingerprintV2]: keyData.pair })\n ).successfulDecryptions[0],\n created.exchangeKey\n )\n expect(\n (await baseExchangeData.tryDecryptAccessControlSecret([created.exchangeData], { [keyData.fingerprintV2]: keyData.pair }))\n .successfulDecryptions[0]\n ).to.equal(created.accessControlSecret)\n }\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should reuse existing exchange data for encryption when it can be verified', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdData = await exchangeData.getOrCreateEncryptionDataTo(delegateId)\n await exchangeData.clearOrRepopulateCache()\n const countAfterCacheClear = exchangeDataApi.callCount\n const reloadedData = await exchangeData.getOrCreateEncryptionDataTo(delegateId)\n exchangeDataApi.compareCallCountFromBaseline(countAfterCacheClear, {\n createExchangeData: 0,\n getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 1,\n modifyExchangeData: 0,\n getExchangeDataByIds: 0,\n getExchangeDataByParticipant: 0,\n })\n await checkDataEqual(reloadedData, createdData)\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should create new exchange data for encryption when the existing data can not be verified due to unavailable verification key', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdData = await exchangeData.getOrCreateEncryptionDataTo(delegateId)\n await encryptionKeysManager.unverifyExistingKeysAndCreateNewVerified(primitives)\n await exchangeData.clearOrRepopulateCache()\n const countAfterCacheClear = exchangeDataApi.callCount\n const newData = await exchangeData.getOrCreateEncryptionDataTo(delegateId)\n exchangeDataApi.compareCallCountFromBaseline(countAfterCacheClear, {\n createExchangeData: 1,\n getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 1,\n modifyExchangeData: 0,\n getExchangeDataByIds: 0,\n getExchangeDataByParticipant: 0,\n })\n expect(_.isEqual(_.omit(createdData.exchangeData, ['rev']), _.omit(newData.exchangeData, ['rev']))).to.equal(\n false,\n 'Exchange data manager should have created new exchange data for encryption'\n )\n expect(ua2hex(await primitives.AES.exportKey(createdData.exchangeKey, 'raw'))).to.not.equal(\n ua2hex(await primitives.AES.exportKey(newData.exchangeKey, 'raw'))\n )\n expect(createdData.accessControlSecret).to.not.equal(newData.accessControlSecret)\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should create new exchange data for encryption when the existing data can not be verified due to tampering of the encrypted access control secret and/or encrypted exchange key', async function () {\n async function doTest(\n allowFullExchangeDataLoad: boolean,\n tamper: (exchangeData: ExchangeData, selfKeyPair: KeyPair<CryptoKey>, selfKeyFp: string) => Promise<ExchangeData>\n ) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const sfk = primitives.randomUuid()\n const createdData = await exchangeData.getOrCreateEncryptionDataTo(delegateId)\n // Tamper with exchange data\n await exchangeDataApi.modifyExchangeData(await tamper(createdData.exchangeData, selfKeypair, selfKeyFpV2))\n await exchangeData.clearOrRepopulateCache()\n const countAfterCacheClear = exchangeDataApi.callCount\n const newData = await exchangeData.getOrCreateEncryptionDataTo(delegateId)\n exchangeDataApi.compareCallCountFromBaseline(countAfterCacheClear, {\n createExchangeData: 1,\n getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 1,\n modifyExchangeData: 0,\n getExchangeDataByIds: 0,\n getExchangeDataByParticipant: 0,\n })\n expect(createdData.exchangeData.id).not.to.equal(\n newData.exchangeData.id,\n 'Exchange data manager should have created new exchange data for encryption'\n )\n expect(ua2hex(await primitives.AES.exportKey(createdData.exchangeKey, 'raw'))).to.not.equal(\n ua2hex(await primitives.AES.exportKey(newData.exchangeKey, 'raw'))\n )\n expect(createdData.accessControlSecret).to.not.equal(newData.accessControlSecret)\n const updatedUnverifiedOldData = (await exchangeData.getDecryptionDataKeyByIds([createdData.exchangeData.id!], true))[\n createdData.exchangeData.id!\n ]\n expect(updatedUnverifiedOldData).to.not.be.undefined\n }\n const extraKeyPair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const extraKeyPairFp = fingerprintV2(ua2hex(await primitives.RSA.exportKey(extraKeyPair.publicKey, 'spki')))\n const fakeKey = primitives.randomBytes(16)\n const tamperByChangingEncryptionKey = async (exchangeData: ExchangeData, selfKeyPair: KeyPair<CryptoKey>, selfKeyFp: string) =>\n new ExchangeData({\n ...exchangeData,\n exchangeKey: {\n ...exchangeData.exchangeKey,\n [selfKeyFp]: ua2b64(await primitives.RSA.encrypt(selfKeyPair.publicKey, fakeKey)),\n },\n })\n const tamperByChangingAccessControlSecret = async (exchangeData: ExchangeData, selfKeyPair: KeyPair<CryptoKey>, selfKeyFp: string) =>\n new ExchangeData({\n ...exchangeData,\n accessControlSecret: {\n ...exchangeData.accessControlSecret,\n [selfKeyFp]: ua2b64(await primitives.RSA.encrypt(selfKeyPair.publicKey, fakeKey)),\n },\n })\n const tamperByChangingBoth = async (exchangeData: ExchangeData, selfKeyPair: KeyPair<CryptoKey>, selfKeyFp: string) =>\n tamperByChangingEncryptionKey(await tamperByChangingAccessControlSecret(exchangeData, selfKeyPair, selfKeyFp), selfKeyPair, selfKeyFp)\n const tamperByAddingEncryptionKey = async (exchangeData: ExchangeData) =>\n new ExchangeData({\n ...exchangeData,\n exchangeKey: {\n ...exchangeData.exchangeKey,\n [extraKeyPairFp]: ua2b64(await primitives.RSA.encrypt(extraKeyPair.publicKey, fakeKey)),\n },\n })\n await doTest(true, tamperByChangingEncryptionKey)\n await doTest(false, tamperByChangingEncryptionKey)\n await doTest(true, tamperByChangingAccessControlSecret)\n await doTest(false, tamperByChangingAccessControlSecret)\n await doTest(true, tamperByChangingBoth)\n await doTest(false, tamperByChangingBoth)\n await doTest(true, tamperByAddingEncryptionKey)\n await doTest(false, tamperByAddingEncryptionKey)\n })\n\n it('should create new exchange data for encryption when the existing data can not be verified due to tampering of the delegate id', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdData = await exchangeData.getOrCreateEncryptionDataTo(delegateId)\n // Tamper with exchange data\n await exchangeDataApi.modifyExchangeData({\n ...createdData.exchangeData,\n delegate: delegate2Id,\n })\n await exchangeData.clearOrRepopulateCache()\n const countAfterCacheClear = exchangeDataApi.callCount\n const newDataToDelegate = await exchangeData.getOrCreateEncryptionDataTo(delegateId)\n const newDataToDelegate2 = await exchangeData.getOrCreateEncryptionDataTo(delegate2Id)\n exchangeDataApi.compareCallCountFromBaseline(countAfterCacheClear, {\n createExchangeData: 2,\n getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 2,\n modifyExchangeData: 0,\n getExchangeDataByIds: 0,\n getExchangeDataByParticipant: 0,\n })\n expect(createdData.exchangeData.id).to.not.equal(\n newDataToDelegate.exchangeData.id,\n 'Exchange data manager should have created new exchange data for encryption to delegate'\n )\n expect(createdData.exchangeData.id).to.not.equal(\n newDataToDelegate2.exchangeData.id,\n 'Exchange data manager should have created new exchange data for encryption to delegate 2'\n )\n expect(ua2hex(await primitives.AES.exportKey(createdData.exchangeKey, 'raw'))).to.not.equal(\n ua2hex(await primitives.AES.exportKey(newDataToDelegate.exchangeKey, 'raw'))\n )\n expect(ua2hex(await primitives.AES.exportKey(createdData.exchangeKey, 'raw'))).to.not.equal(\n ua2hex(await primitives.AES.exportKey(newDataToDelegate2.exchangeKey, 'raw'))\n )\n expect(createdData.accessControlSecret).to.not.equal(newDataToDelegate.accessControlSecret)\n expect(createdData.accessControlSecret).to.not.equal(newDataToDelegate2.accessControlSecret)\n const updatedUnverifiedOldData = (await exchangeData.getDecryptionDataKeyByIds([createdData.exchangeData.id!], true))[\n createdData.exchangeData.id!\n ]\n expect(updatedUnverifiedOldData).to.not.be.undefined\n expect(ua2hex(await primitives.AES.exportKey(updatedUnverifiedOldData!.exchangeKey!, 'raw'))).to.equal(\n ua2hex(await primitives.AES.exportKey(createdData.exchangeKey, 'raw'))\n )\n expect(updatedUnverifiedOldData!.accessControlSecret).to.equal(createdData.accessControlSecret)\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should return existing exchange data keys for decryption even if the data authenticity could not be verified', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdData1 = await exchangeData.getOrCreateEncryptionDataTo(delegateId)\n const createdData2 = await createDataFromRandomToSelf()\n await encryptionKeysManager.unverifyExistingKeysAndCreateNewVerified(primitives)\n await exchangeData.clearOrRepopulateCache()\n await checkDataEqual(\n (\n await exchangeData.getDecryptionDataKeyByIds([createdData1.exchangeData.id!], true)\n )[createdData1.exchangeData.id!],\n createdData1\n )\n await checkDataEqual(\n (\n await exchangeData.getDecryptionDataKeyByIds([createdData2.exchangeData.id!], true)\n )[createdData2.exchangeData.id!],\n createdData2\n )\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('newly created data or data retrieved by id should be cached and retrievable by hash', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdData1 = await exchangeData.getOrCreateEncryptionDataTo(delegateId)\n const hashes1 = await accessControlSecretUtils.allSecureDelegationKeysFor(createdData1.accessControlSecret)\n const retrievedKeys1 = await exchangeData.getCachedDecryptionDataKeyByAccessControlHash(hashes1)\n for (const hash of hashes1) {\n await checkDataEqual(retrievedKeys1[hash], createdData1)\n }\n if (!allowFullExchangeDataLoad) {\n const createdData2 = await createDataFromRandomToSelf()\n const hashes2 = await accessControlSecretUtils.allSecureDelegationKeysFor(createdData2.accessControlSecret)\n await checkDataEqual(\n (\n await exchangeData.getDecryptionDataKeyByIds([createdData2.exchangeData.id!], true)\n )[createdData2.exchangeData.id!],\n createdData2\n )\n const retrievedKeys2 = await exchangeData.getCachedDecryptionDataKeyByAccessControlHash([...hashes1, ...hashes2])\n for (const hash of hashes2) {\n await checkDataEqual(retrievedKeys2[hash], createdData2)\n }\n }\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('if data can not be decrypted the retrieval method should return undefined', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdBySelf = await exchangeData.getOrCreateEncryptionDataTo(selfId)\n const createdByOther = await createDataFromRandomToSelf()\n const newKey = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n await dataOwnerApi.addPublicKeyForOwner(selfId, newKey)\n // Simulate loss of key\n encryptionKeysManager.deleteKey(selfKeyFpV1)\n await encryptionKeysManager.addOrUpdateKey(primitives, newKey, true)\n await exchangeData.clearOrRepopulateCache()\n await checkDataEqual((await exchangeData.getDecryptionDataKeyByIds([createdBySelf.exchangeData.id!], true))[createdBySelf.exchangeData.id!], {\n exchangeData: createdBySelf.exchangeData,\n exchangeKey: undefined,\n })\n await checkDataEqual((await exchangeData.getDecryptionDataKeyByIds([createdByOther.exchangeData.id!], true))[createdByOther.exchangeData.id!], {\n exchangeData: createdByOther.exchangeData,\n exchangeKey: undefined,\n })\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('unverified keys should still be usable for decryption of data', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdBySelf = await exchangeData.getOrCreateEncryptionDataTo(selfId)\n const createdByOther = await createDataFromRandomToSelf()\n await encryptionKeysManager.addOrUpdateKey(primitives, selfKeypair, false)\n await exchangeData.clearOrRepopulateCache()\n await checkDataEqual(\n (\n await exchangeData.getDecryptionDataKeyByIds([createdBySelf.exchangeData.id!], true)\n )[createdBySelf.exchangeData.id!],\n createdBySelf\n )\n await checkDataEqual(\n (\n await exchangeData.getDecryptionDataKeyByIds([createdByOther.exchangeData.id!], true)\n )[createdByOther.exchangeData.id!],\n createdByOther\n )\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('implementation with limited cache should trigger eviction of delegate and hash cache on eviction of data by id cache', async function () {\n await initialiseComponents(false, { lruCacheSize: 3 })\n const entityType = EntityWithDelegationTypeName.Contact\n const sfks = [primitives.randomUuid(), primitives.randomUuid(), primitives.randomUuid()]\n\n async function verifyCached(data: { exchangeData: ExchangeData; accessControlSecret: string; exchangeKey: CryptoKey }) {\n const apiCallsBaseline = exchangeDataApi.callCount\n const hashes = await accessControlSecretUtils.allSecureDelegationKeysFor(data.accessControlSecret)\n for (const hash of hashes) {\n await checkDataEqual((await exchangeData.getCachedDecryptionDataKeyByAccessControlHash([hash]))[hash], data)\n }\n if (data.exchangeData.delegator === selfId) {\n await checkDataEqual(await exchangeData.getOrCreateEncryptionDataTo(data.exchangeData.delegate), data)\n }\n await checkDataEqual((await exchangeData.getDecryptionDataKeyByIds([data.exchangeData.id!], true))[data.exchangeData.id!], data)\n exchangeDataApi.compareCallCountFromBaseline(apiCallsBaseline, {\n getExchangeDataByIds: 0,\n createExchangeData: 0,\n modifyExchangeData: 0,\n getExchangeDataByParticipant: 0,\n getExchangeDataByDelegatorDelegate: 0,\n })\n }\n\n async function verifyNotCachedThenCache(data: { exchangeData: ExchangeData; accessControlSecret: string; exchangeKey: CryptoKey }) {\n const apiCallsBaseline = exchangeDataApi.callCount\n const hashes = [await accessControlSecretUtils.secureDelegationKeyFor(data.accessControlSecret, entityType)]\n for (const hash of hashes) {\n expect(Object.keys(await exchangeData.getCachedDecryptionDataKeyByAccessControlHash([hash]))).to.have.length(0)\n }\n if (data.exchangeData.delegator === selfId) {\n await checkDataEqual(await exchangeData.getOrCreateEncryptionDataTo(data.exchangeData.delegate), data)\n exchangeDataApi.compareCallCountFromBaseline(apiCallsBaseline, {\n getExchangeDataByIds: 0,\n createExchangeData: 0,\n modifyExchangeData: 0,\n getExchangeDataByParticipant: 0,\n getExchangeDataByDelegatorDelegate: 1,\n })\n } else {\n await checkDataEqual((await exchangeData.getDecryptionDataKeyByIds([data.exchangeData.id!], true))[data.exchangeData.id!], data)\n exchangeDataApi.compareCallCountFromBaseline(apiCallsBaseline, {\n getExchangeDataByIds: 1,\n createExchangeData: 0,\n modifyExchangeData: 0,\n getExchangeDataByParticipant: 0,\n getExchangeDataByDelegatorDelegate: 0,\n })\n }\n }\n\n const createdBySelf1 = await exchangeData.getOrCreateEncryptionDataTo(selfId)\n const createdBySelf2 = await exchangeData.getOrCreateEncryptionDataTo(delegateId)\n const createdByOther1 = await createDataFromRandomToSelf() // Not automatically cached: created by someone else\n const createdByOther2 = await createDataFromRandomToSelf() // Not automatically cached: created by someone else\n // noinspection DuplicatedCode\n await verifyCached(createdBySelf1)\n await verifyCached(createdBySelf2)\n await verifyNotCachedThenCache(createdByOther1)\n await verifyCached(createdBySelf1)\n await verifyCached(createdBySelf2)\n await verifyCached(createdByOther1)\n await verifyNotCachedThenCache(createdByOther2)\n await verifyCached(createdBySelf2)\n await verifyCached(createdByOther1)\n await verifyCached(createdByOther2)\n await verifyNotCachedThenCache(createdBySelf1)\n await verifyCached(createdByOther1)\n await verifyCached(createdByOther2)\n await verifyCached(createdBySelf1)\n await verifyNotCachedThenCache(createdBySelf2)\n await verifyCached(createdByOther2)\n // noinspection DuplicatedCode\n await verifyCached(createdBySelf1)\n await verifyCached(createdBySelf2)\n await verifyNotCachedThenCache(createdByOther1)\n await verifyCached(createdBySelf1)\n await verifyCached(createdBySelf2)\n await verifyCached(createdByOther1)\n await verifyNotCachedThenCache(createdByOther2)\n await verifyCached(createdBySelf2)\n await verifyCached(createdByOther1)\n await verifyCached(createdByOther2)\n })\n\n it('implementation with unlimited cache should preload all existing exchange data on creation', async function () {\n await initialiseComponents(true)\n const createdBySelf = await exchangeData.getOrCreateEncryptionDataTo(selfId)\n const createdByOther = await createDataFromRandomToSelf()\n const recreatedExchangeData = await initialiseExchangeDataManagerForCurrentDataOwner(\n baseExchangeData,\n encryptionKeysManager,\n accessControlSecretUtils,\n new TestCryptoStrategies(),\n dataOwnerApi,\n primitives,\n true\n )\n const apiCallsAfterCreation = exchangeDataApi.callCount\n await checkDataEqual(\n (\n await recreatedExchangeData.getDecryptionDataKeyByIds([createdBySelf.exchangeData.id!], false)\n )[createdBySelf.exchangeData.id!],\n createdBySelf\n )\n await checkDataEqual(\n (\n await recreatedExchangeData.getDecryptionDataKeyByIds([createdByOther.exchangeData.id!], false)\n )[createdByOther.exchangeData.id!],\n createdByOther\n )\n exchangeDataApi.compareCallCountFromBaseline(apiCallsAfterCreation, {\n getExchangeDataByIds: 0,\n createExchangeData: 0,\n modifyExchangeData: 0,\n getExchangeDataByParticipant: 0,\n getExchangeDataByDelegatorDelegate: 0,\n })\n })\n})\n\nlet env: TestVars\n\ndescribe('Exchange data manager - e2e', async function () {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n })\n\n it('give access back should not invalidate existing and valid exchange data', async function () {\n const hcp1Details = await createNewHcpApi(env)\n const hcp2Details = await createNewHcpApi(env)\n const ed1to2 = await hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId)\n const ed2to1 = await hcp2Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp1Details.credentials.dataOwnerId)\n await hcp1Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n await hcp2Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n const newKeyPair = await hcp1Details.api.cryptoApi.primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const exportedPub = ua2hex(await hcp1Details.api.cryptoApi.primitives.RSA.exportKey(newKeyPair.publicKey, 'spki'))\n const hcp2 = await hcp2Details.api.healthcarePartyApi.getHealthcareParty(hcp2Details.credentials.dataOwnerId)\n await hcp2Details.api.healthcarePartyApi.modifyHealthcareParty({\n ...hcp2,\n publicKeysForOaepWithSha256: [...hcp2.publicKeysForOaepWithSha256, exportedPub],\n })\n await hcp1Details.api.cryptoApi.exchangeData.giveAccessBackTo(hcp2Details.credentials.dataOwnerId, exportedPub)\n await hcp1Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n await hcp2Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n const updatedEd1to2 = await hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId)\n const updatedEd2to1 = await hcp2Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp1Details.credentials.dataOwnerId)\n expect(updatedEd1to2.exchangeData.id).to.equal(ed1to2.exchangeData.id)\n expect(Object.keys(updatedEd2to1.exchangeData.exchangeKey).length).to.be.greaterThan(Object.keys(ed2to1.exchangeData.exchangeKey).length)\n expect(Object.keys(updatedEd2to1.exchangeData.exchangeKey).length).to.equal(Object.keys(updatedEd2to1.exchangeData.accessControlSecret).length)\n expect(Object.keys(updatedEd2to1.exchangeData.exchangeKey).length).to.equal(Object.keys(updatedEd2to1.exchangeData.sharedSignatureKey).length)\n expect(updatedEd2to1.exchangeData.id).to.equal(ed2to1.exchangeData.id)\n expect(Object.keys(updatedEd1to2.exchangeData.exchangeKey).length).to.be.greaterThan(Object.keys(ed1to2.exchangeData.exchangeKey).length)\n expect(Object.keys(updatedEd1to2.exchangeData.exchangeKey).length).to.equal(Object.keys(updatedEd1to2.exchangeData.accessControlSecret).length)\n expect(Object.keys(updatedEd1to2.exchangeData.exchangeKey).length).to.equal(Object.keys(updatedEd1to2.exchangeData.sharedSignatureKey).length)\n })\n\n it('invalid exchange data should not be re-validated by give access back', async function () {\n const hcp1Details = await createNewHcpApi(env)\n const hcp2Details = await createNewHcpApi(env)\n const ed1to2 = await hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId)\n const ed2to1 = await hcp2Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp1Details.credentials.dataOwnerId)\n await hcp1Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n await hcp2Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n const exchangeDataApi = new IccExchangeDataApi(env.iCureUrl, {}, hcp1Details.api.authApi.authenticationProvider, fetch)\n const extraKeyPair = await hcp1Details.api.cryptoApi.primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const extraKeyPairPub = ua2hex(await hcp1Details.api.cryptoApi.primitives.RSA.exportKey(extraKeyPair.publicKey, 'spki'))\n const extraKeyPairFp = fingerprintV2(extraKeyPairPub)\n const fakeData = await hcp1Details.api.cryptoApi.primitives.randomBytes(16)\n async function tamperWithData(data: ExchangeData) {\n await exchangeDataApi.modifyExchangeData({\n ...data,\n exchangeKey: {\n ...data.exchangeKey,\n [extraKeyPairFp]: ua2b64(await hcp1Details.api.cryptoApi.primitives.RSA.encrypt(extraKeyPair.publicKey, fakeData)),\n },\n accessControlSecret: {\n ...data.accessControlSecret,\n [extraKeyPairFp]: ua2b64(await hcp1Details.api.cryptoApi.primitives.RSA.encrypt(extraKeyPair.publicKey, fakeData)),\n },\n sharedSignatureKey: {\n ...data.sharedSignatureKey,\n [extraKeyPairFp]: ua2b64(await hcp1Details.api.cryptoApi.primitives.RSA.encrypt(extraKeyPair.publicKey, fakeData)),\n },\n })\n }\n await tamperWithData(ed1to2.exchangeData)\n await tamperWithData(ed2to1.exchangeData)\n const newKeyPair = await hcp1Details.api.cryptoApi.primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const exportedPub = ua2hex(await hcp1Details.api.cryptoApi.primitives.RSA.exportKey(newKeyPair.publicKey, 'spki'))\n const hcp2 = await hcp2Details.api.healthcarePartyApi.getHealthcareParty(hcp2Details.credentials.dataOwnerId)\n await hcp2Details.api.healthcarePartyApi.modifyHealthcareParty({\n ...hcp2,\n publicKeysForOaepWithSha256: [...hcp2.publicKeysForOaepWithSha256, exportedPub, extraKeyPairPub],\n })\n await hcp1Details.api.cryptoApi.exchangeData.giveAccessBackTo(hcp2Details.credentials.dataOwnerId, exportedPub)\n await hcp1Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n await hcp2Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n const updatedEd1to2 = await hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId)\n const updatedEd2to1 = await hcp2Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp1Details.credentials.dataOwnerId)\n expect(updatedEd1to2.exchangeData.id).to.not.equal(ed1to2.exchangeData.id)\n expect(updatedEd2to1.exchangeData.id).to.not.equal(ed2to1.exchangeData.id)\n const decData1to2 = (await hcp1Details.api.cryptoApi.exchangeData.getDecryptionDataKeyByIds([ed1to2.exchangeData.id!], true))[\n ed1to2.exchangeData.id!\n ]\n expect(decData1to2).to.not.be.undefined\n expect(decData1to2!.exchangeKey).to.not.be.undefined\n expect(decData1to2!.accessControlSecret).to.not.be.undefined\n const decData2to1 = (await hcp2Details.api.cryptoApi.exchangeData.getDecryptionDataKeyByIds([ed2to1.exchangeData.id!], true))[\n ed2to1.exchangeData.id!\n ]\n expect(decData2to1).to.not.be.undefined\n expect(decData2to1!.exchangeKey).to.not.be.undefined\n expect(decData2to1!.accessControlSecret).to.not.be.undefined\n })\n})\n"]}
@@ -139,7 +139,7 @@ const userDefinitions = {
139
139
  return { user, apis: apiWithOnlyNewKey };
140
140
  }),
141
141
  'two available keys': (user, password, originalKey) => __awaiter(void 0, void 0, void 0, function* () {
142
- var _c;
142
+ var _a;
143
143
  const newKey = yield primitives.RSA.generateKeyPair(icc_x_api_1.ShaVersion.Sha256);
144
144
  const apiWithOnlyNewKey = yield icc_x_api_1.IcureApi.initialise(env.iCureUrl, { username: user.login, password }, new TestCryptoStrategies_1.TestCryptoStrategies(newKey), crypto_1.webcrypto, fetch, {
145
145
  storage: new TestStorage_1.TestStorage(),
@@ -153,7 +153,7 @@ const userDefinitions = {
153
153
  })));
154
154
  const storage = yield (0, TestStorage_1.testStorageWithKeys)([
155
155
  {
156
- dataOwnerId: (_c = user.healthcarePartyId) !== null && _c !== void 0 ? _c : user.patientId,
156
+ dataOwnerId: (_a = user.healthcarePartyId) !== null && _a !== void 0 ? _a : user.patientId,
157
157
  pairs: keyStrings.map((key) => {
158
158
  return { keyPair: key, shaVersion: icc_x_api_1.ShaVersion.Sha256 };
159
159
  }),
@@ -265,7 +265,7 @@ let apis;
265
265
  delegate: yield (0, TestApi_1.TestApi)(env.iCureUrl, delegateUser.login, delegateHcpPassword, crypto_1.webcrypto),
266
266
  givingAccessBack: yield (0, TestApi_1.TestApi)(env.iCureUrl, userGivingAccessBack.login, userGivingAccessBackPassword, crypto_1.webcrypto),
267
267
  };
268
- yield Object.entries(userDefinitions).reduce((p, [login, creationProcess]) => __awaiter(this, void 0, void 0, function* () {
268
+ yield Object.entries(userDefinitions).reduce((p_1, _a) => __awaiter(this, [p_1, _a], void 0, function* (p, [login, creationProcess]) {
269
269
  yield p;
270
270
  const newPatientEmail = (0, test_utils_1.getTempEmail)();
271
271
  const patientToCreate = yield patientApi.newInstance(user, new Patient_1.Patient({ id: (0, uuid_1.v4)(), firstName: 'test', lastName: 'test' }));
@@ -340,8 +340,8 @@ let apis;
340
340
  });
341
341
  });
342
342
  (0, mocha_1.it)(`Create ${f[0]} as delegate with delegation for ${uType} with ${uId}`, function () {
343
- var _a, _b;
344
343
  return __awaiter(this, void 0, void 0, function* () {
344
+ var _a, _b;
345
345
  const { user } = users.find((it) => it.user.name === `${uType}-${uId}`);
346
346
  const facade = f[1];
347
347
  const api = apis['delegate'];
@@ -423,8 +423,8 @@ let apis;
423
423
  ['patient', 'hcp'].forEach((duType) => {
424
424
  Object.keys(userDefinitions).forEach((duId) => {
425
425
  (0, mocha_1.it)(`Share ${f[0]} as a ${uType} with ${uId} to a ${duType} with ${duId}`, function () {
426
- var _a;
427
426
  return __awaiter(this, void 0, void 0, function* () {
427
+ var _a;
428
428
  if (f[0] === 'Patient' && uType === 'patient') {
429
429
  this.skip();
430
430
  }