@icure/api 8.0.7 → 8.0.9

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 (259) hide show
  1. package/icc-api/model/models.d.ts +1 -0
  2. package/icc-api/model/models.js +1 -0
  3. package/icc-api/model/models.js.map +1 -1
  4. package/icc-x-api/crypto/ExchangeDataManager.js +3 -2
  5. package/icc-x-api/crypto/ExchangeDataManager.js.map +1 -1
  6. package/icc-x-api/crypto/KeyRecovery.js +5 -4
  7. package/icc-x-api/crypto/KeyRecovery.js.map +1 -1
  8. package/icc-x-api/crypto/RSA.d.ts +4 -1
  9. package/icc-x-api/crypto/RSA.js +6 -1
  10. package/icc-x-api/crypto/RSA.js.map +1 -1
  11. package/icc-x-api/crypto/SecureDelegationsManager.js +2 -1
  12. package/icc-x-api/crypto/SecureDelegationsManager.js.map +1 -1
  13. package/icc-x-api/crypto/TransferKeysManager.js +4 -3
  14. package/icc-x-api/crypto/TransferKeysManager.js.map +1 -1
  15. package/icc-x-api/crypto/UserEncryptionKeysManager.js +2 -1
  16. package/icc-x-api/crypto/UserEncryptionKeysManager.js.map +1 -1
  17. package/icc-x-api/crypto/utils.d.ts +1 -4
  18. package/icc-x-api/crypto/utils.js +6 -8
  19. package/icc-x-api/crypto/utils.js.map +1 -1
  20. package/icc-x-api/icc-accesslog-x-api.js +16 -14
  21. package/icc-x-api/icc-accesslog-x-api.js.map +1 -1
  22. package/icc-x-api/icc-calendar-item-x-api.d.ts +2 -2
  23. package/icc-x-api/icc-calendar-item-x-api.js +17 -17
  24. package/icc-x-api/icc-calendar-item-x-api.js.map +1 -1
  25. package/icc-x-api/icc-classification-x-api.js +12 -11
  26. package/icc-x-api/icc-classification-x-api.js.map +1 -1
  27. package/icc-x-api/icc-contact-x-api.d.ts +2 -2
  28. package/icc-x-api/icc-contact-x-api.js +23 -20
  29. package/icc-x-api/icc-contact-x-api.js.map +1 -1
  30. package/icc-x-api/icc-document-x-api.js +17 -16
  31. package/icc-x-api/icc-document-x-api.js.map +1 -1
  32. package/icc-x-api/icc-form-x-api.js +13 -12
  33. package/icc-x-api/icc-form-x-api.js.map +1 -1
  34. package/icc-x-api/icc-helement-x-api.js +18 -16
  35. package/icc-x-api/icc-helement-x-api.js.map +1 -1
  36. package/icc-x-api/icc-invoice-x-api.js +12 -11
  37. package/icc-x-api/icc-invoice-x-api.js.map +1 -1
  38. package/icc-x-api/icc-maintenance-task-x-api.js +11 -11
  39. package/icc-x-api/icc-maintenance-task-x-api.js.map +1 -1
  40. package/icc-x-api/icc-message-x-api.js +14 -14
  41. package/icc-x-api/icc-message-x-api.js.map +1 -1
  42. package/icc-x-api/icc-patient-x-api.js +28 -27
  43. package/icc-x-api/icc-patient-x-api.js.map +1 -1
  44. package/icc-x-api/icc-receipt-x-api.js +11 -10
  45. package/icc-x-api/icc-receipt-x-api.js.map +1 -1
  46. package/icc-x-api/icc-recovery-x-api.js +3 -2
  47. package/icc-x-api/icc-recovery-x-api.js.map +1 -1
  48. package/icc-x-api/icc-time-table-x-api.js +9 -8
  49. package/icc-x-api/icc-time-table-x-api.js.map +1 -1
  50. package/icc-x-api/icc-topic-x-api.js +13 -13
  51. package/icc-x-api/icc-topic-x-api.js.map +1 -1
  52. package/icc-x-api/utils/EntityWithDelegationTypeName.d.ts +17 -1
  53. package/icc-x-api/utils/EntityWithDelegationTypeName.js +33 -15
  54. package/icc-x-api/utils/EntityWithDelegationTypeName.js.map +1 -1
  55. package/icc-x-api/utils/index.d.ts +1 -0
  56. package/icc-x-api/utils/index.js +1 -0
  57. package/icc-x-api/utils/index.js.map +1 -1
  58. package/package.json +1 -1
  59. package/test/icc-api/api/IccAnonymousAccessApi.d.ts +1 -0
  60. package/test/icc-api/api/IccAnonymousAccessApi.js +58 -0
  61. package/test/icc-api/api/IccAnonymousAccessApi.js.map +1 -0
  62. package/test/icc-api/api/IccDocumentApi.d.ts +1 -0
  63. package/test/icc-api/api/IccDocumentApi.js +208 -0
  64. package/test/icc-api/api/IccDocumentApi.js.map +1 -0
  65. package/test/icc-api/api/IccGroupApi.d.ts +1 -0
  66. package/test/icc-api/api/IccGroupApi.js +50 -0
  67. package/test/icc-api/api/IccGroupApi.js.map +1 -0
  68. package/test/icc-api/api/IccRecoveryDataApi.d.ts +1 -0
  69. package/test/icc-api/api/IccRecoveryDataApi.js +95 -0
  70. package/test/icc-api/api/IccRecoveryDataApi.js.map +1 -0
  71. package/test/icc-api/api/IccRoleApi.d.ts +1 -0
  72. package/test/icc-api/api/IccRoleApi.js +34 -0
  73. package/test/icc-api/api/IccRoleApi.js.map +1 -0
  74. package/test/icc-api/api/IccUserApi.d.ts +1 -0
  75. package/test/icc-api/api/IccUserApi.js +96 -0
  76. package/test/icc-api/api/IccUserApi.js.map +1 -0
  77. package/test/icc-api/e2e/IccCalendarItemApi.d.ts +1 -0
  78. package/test/icc-api/e2e/IccCalendarItemApi.js +46 -0
  79. package/test/icc-api/e2e/IccCalendarItemApi.js.map +1 -0
  80. package/test/icc-api/model/modelHelpersTest.d.ts +1 -0
  81. package/test/icc-api/model/modelHelpersTest.js +45 -0
  82. package/test/icc-api/model/modelHelpersTest.js.map +1 -0
  83. package/test/icc-x-api/auth/group-switch-test.d.ts +1 -0
  84. package/test/icc-x-api/auth/group-switch-test.js +81 -0
  85. package/test/icc-x-api/auth/group-switch-test.js.map +1 -0
  86. package/test/icc-x-api/auth/jwt-concurrency-test.d.ts +2 -0
  87. package/test/icc-x-api/auth/jwt-concurrency-test.js +113 -0
  88. package/test/icc-x-api/auth/jwt-concurrency-test.js.map +1 -0
  89. package/test/icc-x-api/auth/smart-auth-provider-test.d.ts +1 -0
  90. package/test/icc-x-api/auth/smart-auth-provider-test.js +224 -0
  91. package/test/icc-x-api/auth/smart-auth-provider-test.js.map +1 -0
  92. package/test/icc-x-api/autofix-anonymity-test.d.ts +1 -0
  93. package/test/icc-x-api/autofix-anonymity-test.js +108 -0
  94. package/test/icc-x-api/autofix-anonymity-test.js.map +1 -0
  95. package/test/icc-x-api/confidential-entities-test.d.ts +1 -0
  96. package/test/icc-x-api/confidential-entities-test.js +110 -0
  97. package/test/icc-x-api/confidential-entities-test.js.map +1 -0
  98. package/test/icc-x-api/crud/comprehensive-crud-test.d.ts +1 -0
  99. package/test/icc-x-api/crud/comprehensive-crud-test.js +276 -0
  100. package/test/icc-x-api/crud/comprehensive-crud-test.js.map +1 -0
  101. package/test/icc-x-api/crud/entities-crud-test-interface.d.ts +16 -0
  102. package/test/icc-x-api/crud/entities-crud-test-interface.js +422 -0
  103. package/test/icc-x-api/crud/entities-crud-test-interface.js.map +1 -0
  104. package/test/icc-x-api/crypto/anonymous-delegations-test.d.ts +1 -0
  105. package/test/icc-x-api/crypto/anonymous-delegations-test.js +588 -0
  106. package/test/icc-x-api/crypto/anonymous-delegations-test.js.map +1 -0
  107. package/test/icc-x-api/crypto/concurrency.d.ts +1 -0
  108. package/test/icc-x-api/crypto/concurrency.js +35 -0
  109. package/test/icc-x-api/crypto/concurrency.js.map +1 -0
  110. package/test/icc-x-api/crypto/crypto-utils.d.ts +1 -0
  111. package/test/icc-x-api/crypto/crypto-utils.js +80 -0
  112. package/test/icc-x-api/crypto/crypto-utils.js.map +1 -0
  113. package/test/icc-x-api/crypto/cryptoTest.d.ts +2 -0
  114. package/test/icc-x-api/crypto/cryptoTest.js +302 -0
  115. package/test/icc-x-api/crypto/cryptoTest.js.map +1 -0
  116. package/test/icc-x-api/crypto/delegate-ci-to-patient-with-missing-keys-test.d.ts +1 -0
  117. package/test/icc-x-api/crypto/delegate-ci-to-patient-with-missing-keys-test.js +166 -0
  118. package/test/icc-x-api/crypto/delegate-ci-to-patient-with-missing-keys-test.js.map +1 -0
  119. package/test/icc-x-api/crypto/exchange-data-manager-test.d.ts +1 -0
  120. package/test/icc-x-api/crypto/exchange-data-manager-test.js +690 -0
  121. package/test/icc-x-api/crypto/exchange-data-manager-test.js.map +1 -0
  122. package/test/icc-x-api/crypto/full-crypto-test.d.ts +1 -0
  123. package/test/icc-x-api/crypto/full-crypto-test.js +457 -0
  124. package/test/icc-x-api/crypto/full-crypto-test.js.map +1 -0
  125. package/test/icc-x-api/crypto/secure-delegations-manager-test.d.ts +1 -0
  126. package/test/icc-x-api/crypto/secure-delegations-manager-test.js +266 -0
  127. package/test/icc-x-api/crypto/secure-delegations-manager-test.js.map +1 -0
  128. package/test/icc-x-api/crypto/secure-delegations-metadata-decryptor-test.d.ts +1 -0
  129. package/test/icc-x-api/crypto/secure-delegations-metadata-decryptor-test.js +393 -0
  130. package/test/icc-x-api/crypto/secure-delegations-metadata-decryptor-test.js.map +1 -0
  131. package/test/icc-x-api/crypto/security-metadata-decryptor-chain-test.d.ts +1 -0
  132. package/test/icc-x-api/crypto/security-metadata-decryptor-chain-test.js +213 -0
  133. package/test/icc-x-api/crypto/security-metadata-decryptor-chain-test.js.map +1 -0
  134. package/test/icc-x-api/crypto/shamir.d.ts +2 -0
  135. package/test/icc-x-api/crypto/shamir.js +166 -0
  136. package/test/icc-x-api/crypto/shamir.js.map +1 -0
  137. package/test/icc-x-api/crypto/share-to-newly-created-patient-from-hcp.d.ts +1 -0
  138. package/test/icc-x-api/crypto/share-to-newly-created-patient-from-hcp.js +71 -0
  139. package/test/icc-x-api/crypto/share-to-newly-created-patient-from-hcp.js.map +1 -0
  140. package/test/icc-x-api/crypto/signature-keys-manager-test.d.ts +1 -0
  141. package/test/icc-x-api/crypto/signature-keys-manager-test.js +44 -0
  142. package/test/icc-x-api/crypto/signature-keys-manager-test.js.map +1 -0
  143. package/test/icc-x-api/crypto/user-encryption-keys-manager-test.d.ts +1 -0
  144. package/test/icc-x-api/crypto/user-encryption-keys-manager-test.js +246 -0
  145. package/test/icc-x-api/crypto/user-encryption-keys-manager-test.js.map +1 -0
  146. package/test/icc-x-api/entity-with-attachments-api-test.d.ts +1 -0
  147. package/test/icc-x-api/entity-with-attachments-api-test.js +142 -0
  148. package/test/icc-x-api/entity-with-attachments-api-test.js.map +1 -0
  149. package/test/icc-x-api/filters/filters.d.ts +1 -0
  150. package/test/icc-x-api/filters/filters.js +49 -0
  151. package/test/icc-x-api/filters/filters.js.map +1 -0
  152. package/test/icc-x-api/icc-accesslog-x-api.d.ts +1 -0
  153. package/test/icc-x-api/icc-accesslog-x-api.js +106 -0
  154. package/test/icc-x-api/icc-accesslog-x-api.js.map +1 -0
  155. package/test/icc-x-api/icc-auth-api.d.ts +1 -0
  156. package/test/icc-x-api/icc-auth-api.js +47 -0
  157. package/test/icc-x-api/icc-auth-api.js.map +1 -0
  158. package/test/icc-x-api/icc-calendar-item-x-api.d.ts +1 -0
  159. package/test/icc-x-api/icc-calendar-item-x-api.js +150 -0
  160. package/test/icc-x-api/icc-calendar-item-x-api.js.map +1 -0
  161. package/test/icc-x-api/icc-contact-x-api.d.ts +1 -0
  162. package/test/icc-x-api/icc-contact-x-api.js +279 -0
  163. package/test/icc-x-api/icc-contact-x-api.js.map +1 -0
  164. package/test/icc-x-api/icc-form-x-api.d.ts +1 -0
  165. package/test/icc-x-api/icc-form-x-api.js +98 -0
  166. package/test/icc-x-api/icc-form-x-api.js.map +1 -0
  167. package/test/icc-x-api/icc-helement-x-api-test.d.ts +1 -0
  168. package/test/icc-x-api/icc-helement-x-api-test.js +153 -0
  169. package/test/icc-x-api/icc-helement-x-api-test.js.map +1 -0
  170. package/test/icc-x-api/icc-invoice-x-api.d.ts +1 -0
  171. package/test/icc-x-api/icc-invoice-x-api.js +99 -0
  172. package/test/icc-x-api/icc-invoice-x-api.js.map +1 -0
  173. package/test/icc-x-api/icc-maintenance-task-x-api-test.d.ts +1 -0
  174. package/test/icc-x-api/icc-maintenance-task-x-api-test.js +221 -0
  175. package/test/icc-x-api/icc-maintenance-task-x-api-test.js.map +1 -0
  176. package/test/icc-x-api/icc-message-x-api.d.ts +1 -0
  177. package/test/icc-x-api/icc-message-x-api.js +328 -0
  178. package/test/icc-x-api/icc-message-x-api.js.map +1 -0
  179. package/test/icc-x-api/icc-patient-x-api-test.d.ts +1 -0
  180. package/test/icc-x-api/icc-patient-x-api-test.js +158 -0
  181. package/test/icc-x-api/icc-patient-x-api-test.js.map +1 -0
  182. package/test/icc-x-api/icc-recovery-x-api.d.ts +1 -0
  183. package/test/icc-x-api/icc-recovery-x-api.js +170 -0
  184. package/test/icc-x-api/icc-recovery-x-api.js.map +1 -0
  185. package/test/icc-x-api/icc-time-table-x-api.d.ts +1 -0
  186. package/test/icc-x-api/icc-time-table-x-api.js +100 -0
  187. package/test/icc-x-api/icc-time-table-x-api.js.map +1 -0
  188. package/test/icc-x-api/icc-topic-x-api.d.ts +1 -0
  189. package/test/icc-x-api/icc-topic-x-api.js +269 -0
  190. package/test/icc-x-api/icc-topic-x-api.js.map +1 -0
  191. package/test/icc-x-api/icc-user-x-api-test.d.ts +1 -0
  192. package/test/icc-x-api/icc-user-x-api-test.js +99 -0
  193. package/test/icc-x-api/icc-user-x-api-test.js.map +1 -0
  194. package/test/icc-x-api/patient-user.d.ts +2 -0
  195. package/test/icc-x-api/patient-user.js +104 -0
  196. package/test/icc-x-api/patient-user.js.map +1 -0
  197. package/test/icc-x-api/storage/storage.d.ts +1 -0
  198. package/test/icc-x-api/storage/storage.js +48 -0
  199. package/test/icc-x-api/storage/storage.js.map +1 -0
  200. package/test/icc-x-api/test-api-no-parent.d.ts +1 -0
  201. package/test/icc-x-api/test-api-no-parent.js +79 -0
  202. package/test/icc-x-api/test-api-no-parent.js.map +1 -0
  203. package/test/icc-x-api/test-legacy-data-support.d.ts +1 -0
  204. package/test/icc-x-api/test-legacy-data-support.js +376 -0
  205. package/test/icc-x-api/test-legacy-data-support.js.map +1 -0
  206. package/test/icc-x-api/utils/graph-test.d.ts +1 -0
  207. package/test/icc-x-api/utils/graph-test.js +54 -0
  208. package/test/icc-x-api/utils/graph-test.js.map +1 -0
  209. package/test/icc-x-api/utils/lru-temporised-async-cache-test.d.ts +1 -0
  210. package/test/icc-x-api/utils/lru-temporised-async-cache-test.js +364 -0
  211. package/test/icc-x-api/utils/lru-temporised-async-cache-test.js.map +1 -0
  212. package/test/support/CSM-185.d.ts +1 -0
  213. package/test/support/CSM-185.js +124 -0
  214. package/test/support/CSM-185.js.map +1 -0
  215. package/test/support/CSM-243.d.ts +1 -0
  216. package/test/support/CSM-243.js +120 -0
  217. package/test/support/CSM-243.js.map +1 -0
  218. package/test/support/CSM-87.d.ts +0 -0
  219. package/test/support/CSM-87.js +21 -0
  220. package/test/support/CSM-87.js.map +1 -0
  221. package/test/support/CSM-93.d.ts +1 -0
  222. package/test/support/CSM-93.js +112 -0
  223. package/test/support/CSM-93.js.map +1 -0
  224. package/test/utils/FakeDataOwnerApi.d.ts +32 -0
  225. package/test/utils/FakeDataOwnerApi.js +136 -0
  226. package/test/utils/FakeDataOwnerApi.js.map +1 -0
  227. package/test/utils/FakeEncryptionKeysManager.d.ts +35 -0
  228. package/test/utils/FakeEncryptionKeysManager.js +87 -0
  229. package/test/utils/FakeEncryptionKeysManager.js.map +1 -0
  230. package/test/utils/FakeExchangeDataApi.d.ts +30 -0
  231. package/test/utils/FakeExchangeDataApi.js +74 -0
  232. package/test/utils/FakeExchangeDataApi.js.map +1 -0
  233. package/test/utils/FakeExchangeDataManager.d.ts +40 -0
  234. package/test/utils/FakeExchangeDataManager.js +89 -0
  235. package/test/utils/FakeExchangeDataManager.js.map +1 -0
  236. package/test/utils/FakeExchangeDataMapManager.d.ts +12 -0
  237. package/test/utils/FakeExchangeDataMapManager.js +38 -0
  238. package/test/utils/FakeExchangeDataMapManager.js.map +1 -0
  239. package/test/utils/FakeGenericApi.d.ts +16 -0
  240. package/test/utils/FakeGenericApi.js +65 -0
  241. package/test/utils/FakeGenericApi.js.map +1 -0
  242. package/test/utils/FakeSignatureKeysManager.d.ts +16 -0
  243. package/test/utils/FakeSignatureKeysManager.js +54 -0
  244. package/test/utils/FakeSignatureKeysManager.js.map +1 -0
  245. package/test/utils/TestApi.d.ts +3 -0
  246. package/test/utils/TestApi.js +30 -0
  247. package/test/utils/TestApi.js.map +1 -0
  248. package/test/utils/TestCollectionUtils.d.ts +1 -0
  249. package/test/utils/TestCollectionUtils.js +109 -0
  250. package/test/utils/TestCollectionUtils.js.map +1 -0
  251. package/test/utils/TestCryptoStrategies.d.ts +42 -0
  252. package/test/utils/TestCryptoStrategies.js +80 -0
  253. package/test/utils/TestCryptoStrategies.js.map +1 -0
  254. package/test/utils/TestStorage.d.ts +23 -0
  255. package/test/utils/TestStorage.js +61 -0
  256. package/test/utils/TestStorage.js.map +1 -0
  257. package/test/utils/test_utils.d.ts +76 -0
  258. package/test/utils/test_utils.js +419 -0
  259. package/test/utils/test_utils.js.map +1 -0
@@ -0,0 +1,213 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __await = (this && this.__await) || function (v) { return this instanceof __await ? (this.v = v, this) : new __await(v); }
12
+ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
13
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
14
+ var g = generator.apply(thisArg, _arguments || []), i, q = [];
15
+ return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
16
+ function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
17
+ function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
18
+ function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
19
+ function fulfill(value) { resume("next", value); }
20
+ function reject(value) { resume("throw", value); }
21
+ function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
22
+ };
23
+ Object.defineProperty(exports, "__esModule", { value: true });
24
+ const mocha_1 = require("mocha");
25
+ const chai_1 = require("chai");
26
+ const SecurityMetadataDecryptor_1 = require("../../../icc-x-api/crypto/SecurityMetadataDecryptor");
27
+ const lodash_1 = require("lodash");
28
+ const EntityWithDelegationTypeName_1 = require("../../../icc-x-api/utils/EntityWithDelegationTypeName");
29
+ const SecureDelegation_1 = require("../../../icc-api/model/SecureDelegation");
30
+ var AccessLevel = SecureDelegation_1.SecureDelegation.AccessLevelEnum;
31
+ const baseDecryptor = {
32
+ decryptEncryptionKeysOf: () => {
33
+ throw new Error('This should not be called');
34
+ },
35
+ decryptOwningEntityIdsOf: () => {
36
+ throw new Error('This should not be called');
37
+ },
38
+ decryptSecretIdsOf: () => {
39
+ throw new Error('This should not be called');
40
+ },
41
+ getEntityAccessLevel: () => {
42
+ throw new Error('This should not be called');
43
+ },
44
+ hasAnyEncryptionKeys() {
45
+ throw new Error('This should not be called');
46
+ },
47
+ getDataOwnersWithAccessTo() {
48
+ throw new Error('This should not be called');
49
+ },
50
+ };
51
+ (0, mocha_1.describe)('Security metadata decryptor chain', function () {
52
+ return __awaiter(this, void 0, void 0, function* () {
53
+ const expectedEntity = { entity: {}, type: EntityWithDelegationTypeName_1.EntityWithDelegationTypeName.Patient };
54
+ const expectedDataOwnerHierarchySubset = ['a', 'b'];
55
+ it('should return all elements in order for encryption keys', function () {
56
+ var _a, _b, _c, _d;
57
+ return __awaiter(this, void 0, void 0, function* () {
58
+ const chained = new SecurityMetadataDecryptor_1.SecurityMetadataDecryptorChain([
59
+ Object.assign(Object.assign({}, baseDecryptor), { decryptEncryptionKeysOf(typedEntity, dataOwnersHierarchySubset) {
60
+ (0, chai_1.expect)(typedEntity).to.equal(expectedEntity);
61
+ (0, chai_1.expect)(dataOwnersHierarchySubset).to.equal(expectedDataOwnerHierarchySubset);
62
+ function generator() {
63
+ return __asyncGenerator(this, arguments, function* generator_1() {
64
+ yield yield __await({ decrypted: '1', dataOwnersWithAccess: ['1'] });
65
+ yield yield __await({ decrypted: '2', dataOwnersWithAccess: ['2'] });
66
+ yield yield __await({ decrypted: '3', dataOwnersWithAccess: ['3'] });
67
+ });
68
+ }
69
+ return generator();
70
+ } }),
71
+ Object.assign(Object.assign({}, baseDecryptor), { decryptEncryptionKeysOf(typedEntity, dataOwnersHierarchySubset) {
72
+ (0, chai_1.expect)(typedEntity).to.equal(expectedEntity);
73
+ (0, chai_1.expect)(dataOwnersHierarchySubset).to.equal(expectedDataOwnerHierarchySubset);
74
+ function generator() {
75
+ return __asyncGenerator(this, arguments, function* generator_2() {
76
+ yield yield __await({ decrypted: '4', dataOwnersWithAccess: ['4'] });
77
+ yield yield __await({ decrypted: '5', dataOwnersWithAccess: ['5'] });
78
+ yield yield __await({ decrypted: '6', dataOwnersWithAccess: ['6'] });
79
+ });
80
+ }
81
+ return generator();
82
+ } }),
83
+ ]);
84
+ let generator = chained.decryptEncryptionKeysOf(expectedEntity, expectedDataOwnerHierarchySubset);
85
+ let next = yield generator.next();
86
+ for (let i = 1; i <= 6; i++) {
87
+ const si = (0, lodash_1.toString)(i);
88
+ (0, chai_1.expect)((_a = next.value) === null || _a === void 0 ? void 0 : _a.decrypted).to.equal(si);
89
+ (0, chai_1.expect)((_c = (_b = next.value) === null || _b === void 0 ? void 0 : _b.dataOwnersWithAccess) === null || _c === void 0 ? void 0 : _c[0]).to.equal(si);
90
+ (0, chai_1.expect)((_d = next.value) === null || _d === void 0 ? void 0 : _d.dataOwnersWithAccess).to.have.length(1);
91
+ (0, chai_1.expect)(next.done).to.be.false;
92
+ next = yield generator.next();
93
+ }
94
+ (0, chai_1.expect)(next.value).to.be.undefined;
95
+ (0, chai_1.expect)(next.done).to.be.true;
96
+ });
97
+ });
98
+ it('should return all elements in order for secret ids', function () {
99
+ var _a, _b, _c, _d;
100
+ return __awaiter(this, void 0, void 0, function* () {
101
+ const chained = new SecurityMetadataDecryptor_1.SecurityMetadataDecryptorChain([
102
+ Object.assign(Object.assign({}, baseDecryptor), { decryptSecretIdsOf(typedEntity, dataOwnersHierarchySubset) {
103
+ (0, chai_1.expect)(typedEntity).to.equal(expectedEntity);
104
+ (0, chai_1.expect)(dataOwnersHierarchySubset).to.equal(expectedDataOwnerHierarchySubset);
105
+ function generator() {
106
+ return __asyncGenerator(this, arguments, function* generator_3() {
107
+ yield yield __await({ decrypted: '1', dataOwnersWithAccess: ['1'] });
108
+ yield yield __await({ decrypted: '2', dataOwnersWithAccess: ['2'] });
109
+ yield yield __await({ decrypted: '3', dataOwnersWithAccess: ['3'] });
110
+ });
111
+ }
112
+ return generator();
113
+ } }),
114
+ Object.assign(Object.assign({}, baseDecryptor), { decryptSecretIdsOf(typedEntity, dataOwnersHierarchySubset) {
115
+ (0, chai_1.expect)(typedEntity).to.equal(expectedEntity);
116
+ (0, chai_1.expect)(dataOwnersHierarchySubset).to.equal(expectedDataOwnerHierarchySubset);
117
+ function generator() {
118
+ return __asyncGenerator(this, arguments, function* generator_4() {
119
+ yield yield __await({ decrypted: '4', dataOwnersWithAccess: ['4'] });
120
+ yield yield __await({ decrypted: '5', dataOwnersWithAccess: ['5'] });
121
+ yield yield __await({ decrypted: '6', dataOwnersWithAccess: ['6'] });
122
+ });
123
+ }
124
+ return generator();
125
+ } }),
126
+ ]);
127
+ let generator = chained.decryptSecretIdsOf(expectedEntity, expectedDataOwnerHierarchySubset);
128
+ let next = yield generator.next();
129
+ for (let i = 1; i <= 6; i++) {
130
+ const si = (0, lodash_1.toString)(i);
131
+ (0, chai_1.expect)((_a = next.value) === null || _a === void 0 ? void 0 : _a.decrypted).to.equal(si);
132
+ (0, chai_1.expect)((_c = (_b = next.value) === null || _b === void 0 ? void 0 : _b.dataOwnersWithAccess) === null || _c === void 0 ? void 0 : _c[0]).to.equal(si);
133
+ (0, chai_1.expect)((_d = next.value) === null || _d === void 0 ? void 0 : _d.dataOwnersWithAccess).to.have.length(1);
134
+ (0, chai_1.expect)(next.done).to.be.false;
135
+ next = yield generator.next();
136
+ }
137
+ (0, chai_1.expect)(next.value).to.be.undefined;
138
+ (0, chai_1.expect)(next.done).to.be.true;
139
+ });
140
+ });
141
+ it('should return all elements in order for owning entity id', function () {
142
+ var _a, _b, _c, _d;
143
+ return __awaiter(this, void 0, void 0, function* () {
144
+ const chained = new SecurityMetadataDecryptor_1.SecurityMetadataDecryptorChain([
145
+ Object.assign(Object.assign({}, baseDecryptor), { decryptOwningEntityIdsOf(typedEntity, dataOwnersHierarchySubset) {
146
+ (0, chai_1.expect)(typedEntity).to.equal(expectedEntity);
147
+ (0, chai_1.expect)(dataOwnersHierarchySubset).to.equal(expectedDataOwnerHierarchySubset);
148
+ function generator() {
149
+ return __asyncGenerator(this, arguments, function* generator_5() {
150
+ yield yield __await({ decrypted: '1', dataOwnersWithAccess: ['1'] });
151
+ yield yield __await({ decrypted: '2', dataOwnersWithAccess: ['2'] });
152
+ yield yield __await({ decrypted: '3', dataOwnersWithAccess: ['3'] });
153
+ });
154
+ }
155
+ return generator();
156
+ } }),
157
+ Object.assign(Object.assign({}, baseDecryptor), { decryptOwningEntityIdsOf(typedEntity, dataOwnersHierarchySubset) {
158
+ (0, chai_1.expect)(typedEntity).to.equal(expectedEntity);
159
+ (0, chai_1.expect)(dataOwnersHierarchySubset).to.equal(expectedDataOwnerHierarchySubset);
160
+ function generator() {
161
+ return __asyncGenerator(this, arguments, function* generator_6() {
162
+ yield yield __await({ decrypted: '4', dataOwnersWithAccess: ['4'] });
163
+ yield yield __await({ decrypted: '5', dataOwnersWithAccess: ['5'] });
164
+ yield yield __await({ decrypted: '6', dataOwnersWithAccess: ['6'] });
165
+ });
166
+ }
167
+ return generator();
168
+ } }),
169
+ ]);
170
+ let generator = chained.decryptOwningEntityIdsOf(expectedEntity, expectedDataOwnerHierarchySubset);
171
+ let next = yield generator.next();
172
+ for (let i = 1; i <= 6; i++) {
173
+ const si = (0, lodash_1.toString)(i);
174
+ (0, chai_1.expect)((_a = next.value) === null || _a === void 0 ? void 0 : _a.decrypted).to.equal(si);
175
+ (0, chai_1.expect)((_c = (_b = next.value) === null || _b === void 0 ? void 0 : _b.dataOwnersWithAccess) === null || _c === void 0 ? void 0 : _c[0]).to.equal(si);
176
+ (0, chai_1.expect)((_d = next.value) === null || _d === void 0 ? void 0 : _d.dataOwnersWithAccess).to.have.length(1);
177
+ (0, chai_1.expect)(next.done).to.be.false;
178
+ next = yield generator.next();
179
+ }
180
+ (0, chai_1.expect)(next.value).to.be.undefined;
181
+ (0, chai_1.expect)(next.done).to.be.true;
182
+ });
183
+ });
184
+ it('should return the best access level across all decryptors of the chain', function () {
185
+ return __awaiter(this, void 0, void 0, function* () {
186
+ function newAccessLevelDecryptor(accessLevel) {
187
+ return Object.assign(Object.assign({}, baseDecryptor), { getEntityAccessLevel: (typedEntity, dataOwnersHierarchySubset) => {
188
+ (0, chai_1.expect)(typedEntity).to.equal(expectedEntity);
189
+ (0, chai_1.expect)(dataOwnersHierarchySubset).to.equal(expectedDataOwnerHierarchySubset);
190
+ return Promise.resolve(accessLevel);
191
+ } });
192
+ }
193
+ (0, chai_1.expect)(yield new SecurityMetadataDecryptor_1.SecurityMetadataDecryptorChain([newAccessLevelDecryptor(undefined), newAccessLevelDecryptor(AccessLevel.READ)]).getEntityAccessLevel(expectedEntity, expectedDataOwnerHierarchySubset)).to.equal(AccessLevel.READ);
194
+ (0, chai_1.expect)(yield new SecurityMetadataDecryptor_1.SecurityMetadataDecryptorChain([newAccessLevelDecryptor(AccessLevel.READ), newAccessLevelDecryptor(undefined)]).getEntityAccessLevel(expectedEntity, expectedDataOwnerHierarchySubset)).to.equal(AccessLevel.READ);
195
+ (0, chai_1.expect)(yield new SecurityMetadataDecryptor_1.SecurityMetadataDecryptorChain([
196
+ newAccessLevelDecryptor(AccessLevel.READ),
197
+ newAccessLevelDecryptor(undefined),
198
+ newAccessLevelDecryptor(AccessLevel.WRITE),
199
+ newAccessLevelDecryptor(AccessLevel.READ),
200
+ ]).getEntityAccessLevel(expectedEntity, expectedDataOwnerHierarchySubset)).to.equal(AccessLevel.WRITE);
201
+ (0, chai_1.expect)(yield new SecurityMetadataDecryptor_1.SecurityMetadataDecryptorChain([newAccessLevelDecryptor(undefined), newAccessLevelDecryptor(undefined)]).getEntityAccessLevel(expectedEntity, expectedDataOwnerHierarchySubset)).to.equal(undefined);
202
+ (0, chai_1.expect)(yield new SecurityMetadataDecryptor_1.SecurityMetadataDecryptorChain([
203
+ newAccessLevelDecryptor(undefined),
204
+ newAccessLevelDecryptor(AccessLevel.READ),
205
+ newAccessLevelDecryptor(AccessLevel.READ),
206
+ newAccessLevelDecryptor(undefined),
207
+ newAccessLevelDecryptor(AccessLevel.WRITE),
208
+ ]).getEntityAccessLevel(expectedEntity, expectedDataOwnerHierarchySubset)).to.equal(AccessLevel.WRITE);
209
+ });
210
+ });
211
+ });
212
+ });
213
+ //# sourceMappingURL=security-metadata-decryptor-chain-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-metadata-decryptor-chain-test.js","sourceRoot":"","sources":["../../../../test/icc-x-api/crypto/security-metadata-decryptor-chain-test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe } from 'mocha'\nimport { expect } from 'chai'\nimport { SecurityMetadataDecryptor, SecurityMetadataDecryptorChain } from '../../../icc-x-api/crypto/SecurityMetadataDecryptor'\nimport { EncryptedEntityStub } from '../../../icc-api/model/models'\nimport { toString } from 'lodash'\nimport { EncryptedEntityWithType, EntityWithDelegationTypeName } from '../../../icc-x-api/utils/EntityWithDelegationTypeName'\nimport { SecureDelegation } from '../../../icc-api/model/SecureDelegation'\nimport AccessLevel = SecureDelegation.AccessLevelEnum\n\nconst baseDecryptor = {\n decryptEncryptionKeysOf: () => {\n throw new Error('This should not be called')\n },\n decryptOwningEntityIdsOf: () => {\n throw new Error('This should not be called')\n },\n decryptSecretIdsOf: () => {\n throw new Error('This should not be called')\n },\n getEntityAccessLevel: () => {\n throw new Error('This should not be called')\n },\n hasAnyEncryptionKeys(): boolean {\n throw new Error('This should not be called')\n },\n getDataOwnersWithAccessTo() {\n throw new Error('This should not be called')\n },\n}\n\ndescribe('Security metadata decryptor chain', async function () {\n const expectedEntity: EncryptedEntityWithType = { entity: {} as EncryptedEntityStub, type: EntityWithDelegationTypeName.Patient }\n const expectedDataOwnerHierarchySubset = ['a', 'b']\n\n it('should return all elements in order for encryption keys', async function () {\n const chained = new SecurityMetadataDecryptorChain([\n {\n ...baseDecryptor,\n decryptEncryptionKeysOf(\n typedEntity: EncryptedEntityWithType,\n dataOwnersHierarchySubset: string[]\n ): AsyncGenerator<{ decrypted: string; dataOwnersWithAccess: string[] }, void, never> {\n expect(typedEntity).to.equal(expectedEntity)\n expect(dataOwnersHierarchySubset).to.equal(expectedDataOwnerHierarchySubset)\n async function* generator(): AsyncGenerator<{ decrypted: string; dataOwnersWithAccess: string[] }, void, never> {\n yield { decrypted: '1', dataOwnersWithAccess: ['1'] }\n yield { decrypted: '2', dataOwnersWithAccess: ['2'] }\n yield { decrypted: '3', dataOwnersWithAccess: ['3'] }\n }\n return generator()\n },\n },\n {\n ...baseDecryptor,\n decryptEncryptionKeysOf(\n typedEntity: EncryptedEntityWithType,\n dataOwnersHierarchySubset: string[]\n ): AsyncGenerator<{ decrypted: string; dataOwnersWithAccess: string[] }, void, never> {\n expect(typedEntity).to.equal(expectedEntity)\n expect(dataOwnersHierarchySubset).to.equal(expectedDataOwnerHierarchySubset)\n async function* generator(): AsyncGenerator<{ decrypted: string; dataOwnersWithAccess: string[] }, void, never> {\n yield { decrypted: '4', dataOwnersWithAccess: ['4'] }\n yield { decrypted: '5', dataOwnersWithAccess: ['5'] }\n yield { decrypted: '6', dataOwnersWithAccess: ['6'] }\n }\n return generator()\n },\n },\n ])\n let generator = chained.decryptEncryptionKeysOf(expectedEntity, expectedDataOwnerHierarchySubset)\n let next = await generator.next()\n for (let i = 1; i <= 6; i++) {\n const si = toString(i)\n expect(next.value?.decrypted).to.equal(si)\n expect(next.value?.dataOwnersWithAccess?.[0]).to.equal(si)\n expect(next.value?.dataOwnersWithAccess).to.have.length(1)\n expect(next.done).to.be.false\n next = await generator.next()\n }\n expect(next.value).to.be.undefined\n expect(next.done).to.be.true\n })\n\n it('should return all elements in order for secret ids', async function () {\n const chained = new SecurityMetadataDecryptorChain([\n {\n ...baseDecryptor,\n decryptSecretIdsOf(\n typedEntity: EncryptedEntityWithType,\n dataOwnersHierarchySubset: string[]\n ): AsyncGenerator<{ decrypted: string; dataOwnersWithAccess: string[] }, void, never> {\n expect(typedEntity).to.equal(expectedEntity)\n expect(dataOwnersHierarchySubset).to.equal(expectedDataOwnerHierarchySubset)\n async function* generator(): AsyncGenerator<{ decrypted: string; dataOwnersWithAccess: string[] }, void, never> {\n yield { decrypted: '1', dataOwnersWithAccess: ['1'] }\n yield { decrypted: '2', dataOwnersWithAccess: ['2'] }\n yield { decrypted: '3', dataOwnersWithAccess: ['3'] }\n }\n return generator()\n },\n },\n {\n ...baseDecryptor,\n decryptSecretIdsOf(\n typedEntity: EncryptedEntityWithType,\n dataOwnersHierarchySubset: string[]\n ): AsyncGenerator<{ decrypted: string; dataOwnersWithAccess: string[] }, void, never> {\n expect(typedEntity).to.equal(expectedEntity)\n expect(dataOwnersHierarchySubset).to.equal(expectedDataOwnerHierarchySubset)\n async function* generator(): AsyncGenerator<{ decrypted: string; dataOwnersWithAccess: string[] }, void, never> {\n yield { decrypted: '4', dataOwnersWithAccess: ['4'] }\n yield { decrypted: '5', dataOwnersWithAccess: ['5'] }\n yield { decrypted: '6', dataOwnersWithAccess: ['6'] }\n }\n return generator()\n },\n },\n ])\n let generator = chained.decryptSecretIdsOf(expectedEntity, expectedDataOwnerHierarchySubset)\n let next = await generator.next()\n for (let i = 1; i <= 6; i++) {\n const si = toString(i)\n expect(next.value?.decrypted).to.equal(si)\n expect(next.value?.dataOwnersWithAccess?.[0]).to.equal(si)\n expect(next.value?.dataOwnersWithAccess).to.have.length(1)\n expect(next.done).to.be.false\n next = await generator.next()\n }\n expect(next.value).to.be.undefined\n expect(next.done).to.be.true\n })\n\n it('should return all elements in order for owning entity id', async function () {\n const chained = new SecurityMetadataDecryptorChain([\n {\n ...baseDecryptor,\n decryptOwningEntityIdsOf(\n typedEntity: EncryptedEntityWithType,\n dataOwnersHierarchySubset: string[]\n ): AsyncGenerator<{ decrypted: string; dataOwnersWithAccess: string[] }, void, never> {\n expect(typedEntity).to.equal(expectedEntity)\n expect(dataOwnersHierarchySubset).to.equal(expectedDataOwnerHierarchySubset)\n async function* generator(): AsyncGenerator<{ decrypted: string; dataOwnersWithAccess: string[] }, void, never> {\n yield { decrypted: '1', dataOwnersWithAccess: ['1'] }\n yield { decrypted: '2', dataOwnersWithAccess: ['2'] }\n yield { decrypted: '3', dataOwnersWithAccess: ['3'] }\n }\n return generator()\n },\n },\n {\n ...baseDecryptor,\n decryptOwningEntityIdsOf(\n typedEntity: EncryptedEntityWithType,\n dataOwnersHierarchySubset: string[]\n ): AsyncGenerator<{ decrypted: string; dataOwnersWithAccess: string[] }, void, never> {\n expect(typedEntity).to.equal(expectedEntity)\n expect(dataOwnersHierarchySubset).to.equal(expectedDataOwnerHierarchySubset)\n async function* generator(): AsyncGenerator<{ decrypted: string; dataOwnersWithAccess: string[] }, void, never> {\n yield { decrypted: '4', dataOwnersWithAccess: ['4'] }\n yield { decrypted: '5', dataOwnersWithAccess: ['5'] }\n yield { decrypted: '6', dataOwnersWithAccess: ['6'] }\n }\n return generator()\n },\n },\n ])\n let generator = chained.decryptOwningEntityIdsOf(expectedEntity, expectedDataOwnerHierarchySubset)\n let next = await generator.next()\n for (let i = 1; i <= 6; i++) {\n const si = toString(i)\n expect(next.value?.decrypted).to.equal(si)\n expect(next.value?.dataOwnersWithAccess?.[0]).to.equal(si)\n expect(next.value?.dataOwnersWithAccess).to.have.length(1)\n expect(next.done).to.be.false\n next = await generator.next()\n }\n expect(next.value).to.be.undefined\n expect(next.done).to.be.true\n })\n\n it('should return the best access level across all decryptors of the chain', async function () {\n function newAccessLevelDecryptor(accessLevel: AccessLevel | undefined): SecurityMetadataDecryptor {\n return {\n ...baseDecryptor,\n getEntityAccessLevel: (typedEntity, dataOwnersHierarchySubset) => {\n expect(typedEntity).to.equal(expectedEntity)\n expect(dataOwnersHierarchySubset).to.equal(expectedDataOwnerHierarchySubset)\n return Promise.resolve(accessLevel)\n },\n }\n }\n expect(\n await new SecurityMetadataDecryptorChain([newAccessLevelDecryptor(undefined), newAccessLevelDecryptor(AccessLevel.READ)]).getEntityAccessLevel(\n expectedEntity,\n expectedDataOwnerHierarchySubset\n )\n ).to.equal(AccessLevel.READ)\n expect(\n await new SecurityMetadataDecryptorChain([newAccessLevelDecryptor(AccessLevel.READ), newAccessLevelDecryptor(undefined)]).getEntityAccessLevel(\n expectedEntity,\n expectedDataOwnerHierarchySubset\n )\n ).to.equal(AccessLevel.READ)\n expect(\n await new SecurityMetadataDecryptorChain([\n newAccessLevelDecryptor(AccessLevel.READ),\n newAccessLevelDecryptor(undefined),\n newAccessLevelDecryptor(AccessLevel.WRITE),\n newAccessLevelDecryptor(AccessLevel.READ),\n ]).getEntityAccessLevel(expectedEntity, expectedDataOwnerHierarchySubset)\n ).to.equal(AccessLevel.WRITE)\n expect(\n await new SecurityMetadataDecryptorChain([newAccessLevelDecryptor(undefined), newAccessLevelDecryptor(undefined)]).getEntityAccessLevel(\n expectedEntity,\n expectedDataOwnerHierarchySubset\n )\n ).to.equal(undefined)\n expect(\n await new SecurityMetadataDecryptorChain([\n newAccessLevelDecryptor(undefined),\n newAccessLevelDecryptor(AccessLevel.READ),\n newAccessLevelDecryptor(AccessLevel.READ),\n newAccessLevelDecryptor(undefined),\n newAccessLevelDecryptor(AccessLevel.WRITE),\n ]).getEntityAccessLevel(expectedEntity, expectedDataOwnerHierarchySubset)\n ).to.equal(AccessLevel.WRITE)\n })\n})\n"]}
@@ -0,0 +1,2 @@
1
+ import 'isomorphic-fetch';
2
+ import 'mocha';
@@ -0,0 +1,166 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ require("isomorphic-fetch");
13
+ const shamir_1 = require("../../../icc-x-api/crypto/shamir");
14
+ const chai_1 = require("chai");
15
+ require("mocha");
16
+ const icc_x_api_1 = require("../../../icc-x-api");
17
+ const test_utils_1 = require("../../utils/test_utils");
18
+ var initApi = test_utils_1.TestUtils.initApi;
19
+ const mocha_1 = require("mocha");
20
+ const TestStorage_1 = require("../../utils/TestStorage");
21
+ const crypto_1 = require("crypto");
22
+ const TestCryptoStrategies_1 = require("../../utils/TestCryptoStrategies");
23
+ const FilterChainMaintenanceTask_1 = require("../../../icc-api/model/FilterChainMaintenanceTask");
24
+ const MaintenanceTaskAfterDateFilter_1 = require("../../../icc-x-api/filters/MaintenanceTaskAfterDateFilter");
25
+ const KeyPairUpdateRequest_1 = require("../../../icc-x-api/maintenance/KeyPairUpdateRequest");
26
+ const RSA_1 = require("../../../icc-x-api/crypto/RSA");
27
+ const types_1 = require("@icure/test-setup/types");
28
+ const utils_1 = require("../../../icc-x-api/crypto/utils");
29
+ // Data was randomly generated, not based on any real key
30
+ const data = '77b3bb3ac6852a388b2aea8ba1794e63c95a87d10753afbdf8672b607b0ca7c03b39b30b2303bc417de1c78b326cf52810469914ea7dd8128b9f2e5d8f376cdb16b75a8e9dffb12b7c839d6fcf9ef8b6e220ab7973ad76e057038988d9a084f06a9d83cc9c3ee998ad0fcc317bb6c7a1bed8126ceb8463d59e84b50087d15d293970606cfe61f874e3f4efb182107aa971304a88b9821e74b1e6c88e7d0bb8882ab0ba35591e4e8d829fb973a26b480fe7432537b025c1177077689e86b5ff65b39a9d618e1cd8c129ae2b2a981664074301e9265e9842ec0c9e9a95f27a1066336578e06e3f3373d3a98b3b8182e55accc6795bbe9aaaf758179d09eccecc8a21f9f77e660a99e0e652cf39077ef083020d9c9d479fb6751de39e29feb7bcf9c73ee9e9d25f54683d55a82768f603b910b40ccb006d96c25f23ccf88e620c20d5495e11e83859d38bb5314a763c76149b3bcf6d987e6e98b83583f028fd6cfc363cb544673eb5d6cf5a7f9887d78a5a5d5b0a862ca3127a6d359a1a2ea8f332360fb7c4a8fe855eac200735322cd322eab431e659377ad9f9289a2d97152598333f4ca97e8003bdbc2d8b714a72a3bdd4f1b124674d6c2eda71b59f07f073de030795c562658c1a63e03d7de12f6ff57e328f83e05462c588ec7371af9b19f726f04162db61860e2c40e3d01b46cdab6f38a526ba555d09bdbde5702d6ae977f38e51314b20d333e84e645fc08ccc59be6e87aa349ec30e9b3a6c06c9b58693b8d67e8a7259be86b240431f44fb75c05d6a8578ffced3514fecc10e5ed7a052c85484d8b86276f7cd74a57402d79e0de85cb8006272b4c61d6f71ebe6cb039c0604fd4ab6bf2e5c686c5cb10be41a06087c3a598c6115153ad0ff6fd6644de8838b877b63a1c9ad348806e6e5e4962630ce84926b0596028c9bf4fb78cad55a0c7dac4e1b46eef6f76cea2707afc5499c055e56b9545501029b714cff01e3aea3ae955607b686d21f6c453bd6291627cad9502a1d200deb13ca47f45aae1a88c7ee288d5e59c10ea5aecdd681c1f30b67720ba045c6a1174b4b1bf2ba5af90a22d6be4f281d946666015dda5ad79a20bd0c7c43c4e52ddbe10776464e76ae2e883bc5cd2ba965c775227b3ce482f1f764a95a99888ca68c023a530df6ebe0193742f233db700a100cd568342a3d4bd648ee18b6d1de8a9b7cefdcee7858feb886c013286fbafd489d57a46f70b1b676bf6a7cf74a52f13c6d09a7b23cff8a366e78d35c5c69952445739fe1cf5a5815c111808d731d37f6a33f477cee2dcfbaccba65a43e1e1b5dad4c81549a1ebef5ac1bb5814cdf58ba5849ec66095f1e3bb5a1ea48f9fa746553c15580cf98f1a06f630d0b86b95711f3d9381d50711c1f6b8e63e677c77a21a772b921935ccb17a017ce4955e8fcf8fca4bb72e9c4457bf80c471004083676b1410e697b15db4ae9026b9dd2bc222faf9e68a9e4a2eb7bf1ffbd23b23500b1f97e49f1348f64a467fae59a0d2a34c4a7d084d445a86018a48aedad5b0f7b523e5e1af3d3d66a9323cd4fd1a6f1d78611a85204fb5baf09c5b3c559e6e7b574cec7d3a62d81f3b36c43f93de072fa8477b898e824aa18cf971983f931257dccd902fac7766ef934a2e942dfe6a4bb06b103fba46e77d15e780cc58ccc343b83b310f548f46e8a49ed1750722dade4c9acb8cbc0c0fa0de153';
31
+ const shares = [
32
+ '801231b3513d19f3eaa4dad6cbb40fe4fa000a0df070eda11224feda86242674698a8fa533db9790d9dbc195ca209d012ed20fb1f8c31bb4d27873521036c820f508efd74c566e73975956e54ba00174e6979a6f29ff026a452f8899d5376779020050cd5cc4d05e8c27e545fa6eb4ef25f78df9b4a3ee38ee227b26e41c71356c3408e6da6013ea1981145c7a67d1106f391d78dfd7c8b91d0aebe30901de9646e9db7f74883d05228082b71d0489c9f1214bf8910124e5be4fead82b170faa2d046ef33c27da7a6c1ff8a4c875698eea3f5a1d685ba98674ed69beaa3c2eebce9732ca3c930f5c35a3747953e6ebeae58f976cc090016ecfb5604bf65d0b87ffe4aa5ee6cc57f69b3653397857b41116141b88f3b7942a88eb98dc160d0059267300e351c740461bb440ff329ff3f1abf3b2a75f3b603b6e48165c8c032b0c1b025fed43645af4bcfe9cdfdba00aec8627f82b8c72815a00431acd2b253891085c5f47064bfa015231c62a1711a4ac6792eb39c5c2820e0d6cc2d959874302494add79ac668fa6fb226a25a3b76caafb702eb5cf63ea05e8a5506ea9fcda3530ea22f9bc9602f476868db253cc1ce9b9cd311a67613c90fad0524587ccfb43e1b36133c69e4663b2bc1f157eeda3c7e64c54b17881a485ca6434d09ef6800036fccea47be3f31c21fe015844563015153743df86f98e60f2aef6d5ee7b969818c186160117e524b9b3c2299feb934d0a08f07978447672bf021e15c40d92721694566889df7826631bae3314075e1a1db00767e1d8e7b009c66a3adaf7260c7db97a2244cafca971a7adb5d1babbb115fb178acf08e2d70640bd123538a7f71947b714a38c2b20654feb3b92f261e64481354580570ada0884951ae24684983b1b012ea66901da7f5a0df3057b3f8f0db2519bf2e02c24b109a318d4af4ce5db59f08edad34c8fbd0189c93dd91f73b19c1f6614302d6c94129d7f12671e7c8af884a932932aa59a22442191f806515c5c3facadb6d7f9ab1ae2d178976a1b35b7578a0fed708bba2da6e795a945126d0c9c5e31e945b1e17db4467a2717ccc55dcc03a11325ab5027b613416642bcdc40d9fd495f6939d2cd93bfbaaa81eac6af48ef8e07a8bcf1afc2bc0e1dd5dbfe9622c881c56176e004c0a93faa7ecb0c1aa63d980ee3832ee7ce7d2460618a52471aa2f54477ee97cb23a10c1c183ad243159839c50efacf15ec07961ddd5a7bd68205ea071695486c4801fc77f79372441a353ad23c17397976d4ffd87b5ba2ae189ec496b6de3a6648a90a8a7ba870bcbf307a847205cf3e76222e1cda233a1d96140df29b70480462eb48674925045668c2605efd0777b1fe4aab30a961d3b937bb938962849b9a70fc7def66f837e5a3509fda88e571d631f5aa53d2faa3403a8f9da43ddfd75318721ed6a70c00179696b1ba1ecaa27e7495193cbceffb7e50ff9778ecfa2c0d7525c91b7b9c3e13b9defd5d132eacbdd8d4494bab9b097cd1f0f61356e2635f6428e3d32206d4874c6aa04ee27e3b61495b491d5b855133d9ad19591cfa6a1f58acf101db2427fa4d8eca7dc69dd9c9ebab86d171adbcf1020973ad07b966e6872dd2128e7898c15538695cb80b71a8dace9561b9672639e08406f21a11cefa788c2e950d49fec187d4fb6b4e8ae95763f518c2341d9df697ab7ab87d665eabf28951cbf7aedef2139',
33
+ '802bb4d49a350355bf17d5d888ef07ebb785be0321a99f45052578da97781985baf80a14120a4ca53805efd6a0ec53136a6d5c05192f509216b18f76f09c64338988d3a34e80ca3fc09fbf58adca1229f6e603532415b3e5ded28491c7674d1301e84ab2c80f99e88622d1b1c513f4e305887dd98331e731881b07a31c81a3a7cc1ebae004151b5e7b3aa2ff543fd5c010587ba32ebf72abf3367937d6a661ffbd21fc44f7159c35bee305da1eb588b00f197bbced404b8e099ee5e0d4c6918d5699c406454775efb5b6105eb32fa52ed054f5802fd64941bc6345de8e1a4dc3fcdd332473e398b364c793f0e6a6448c8da5f9556faac7d619ac507107da425cd24e519db5c694a355f1d86b5f73635894b5cb91596f9f58484a35f121af3df11cd1e4381327b50f7e1f965d4b0e5224cf353e8e78e1a3b6a7430d1eaa64488b9c7e0c32be8fa9631c6fbf8ce7bd0b087d53f131227c69da2462a358c626101c0a8ab59b9b55a82c1de8475db77866883934b60ab80ed53b4224a87ce8553d692c7ed3888c5972c7e6ed825845bb25639c98ce68bb0b4426c0d7a08412b423fda3d0efa16e70658bffe6e9803fe38e032048e779ff68fd6123d1fa257239dd7bf97730a79eac8f2f96b25f4ececd851cab99c31099b49d337323eb859242f1e8253a795b5c42886f7ae9cad580706f226180e79004023efb8a7c495971350e5c5773925699d37b92abf232f95cbc547b2ac3fa094f62d360810be979d0ef01ea23a034bb8146778e830f47cbf26ce9a7024fcd1d6d6c361223c9d0aafdeb0a0699da86c80d424ada0365d62edea06bfa9ec09c9729d143bcf75dbbc37cf24b21cd02a4e41f1bb709974a87958d0d8b3f50f500edb2b946523fe85d6a02ebb823c16c42635d1c1dc8c02c9928a31cb23347817658e7cbb8caa6f1cbceeccefb0cb6e2945d443f6f0365468e1bfe119d3a337fd2e844641ec5219be34d94a5377d45f07149499e3cb1cc54d2df0637dd2633f1c7cb4423ba98b087fc8c0372ab2d9a4f4b985f0306815edaf2b94dae983fe7461a462e8d52c5888dae1555d3545db71cd7866daf2cac2d2ef07f820dbec9dddbe88afe6e76fa5f08332c23b74c8146a086a34e757a2f804c9aa5d1a79db6d90e6ceb508f6fda86bf3c073b8747b9f6a995a5ad9e41d5f8544e9e0d8f7e14935b53120c56406845f02893e46bba020243a3ca7139ab2a642ed1da217d3c197de68d14677e40253e777f204473e3010d90d622d19ea7fe72d52ad2cfc798dbe31758ecaec114527e2603da3169128dcdc5db997b1b89a69e04679b303950c02f2c9683ce1b0c71ca1756948276e3cc0c69314b0b218fe5b2b331deb05634fa279053e202c9a54e4a1525752f6dc024f5e613bceb63da013e9b66dfc853ac7805c1ea1c998df9d6dd5ea06dccffd2e56adc126ea007c80415a7fbbbeacf57bcd433090b4cf2f062f08f073712272108da2672254a301a8401908dc0832719d90624371b086d5f2a0742b9ddf17b8678de11b83fad7934e30c65ad14bce2c695bb11229ccb357c3f72ec84fd84a91c00097e6f4df74f3a260fb383af46d163e0564750bf73e0babb4578fc0121d349bc115a70c9268d0a39c7926ea8168cb102f15df4e0b734d961e1d54f5e39c0392c097d7377a48872a14d3dd080a2f64841ad6253e6e5f0890edead0d2e7112b1e694a63be',
34
+ '8039921cf0bbb6ce071087bcedf3b218d963889b79a462912dfa598663ea3841190e8602bae16905da1a399d76b47d348bedd2b0887d05811948d49d124f74e00a4d8d1f777e4d93acd45e75dfbcefa4fffaf71e075d26b54c9309782ac8a7f00ba71cd64cf78075e49cbe24c3be57b74c05ebcdb6b4c7b12004256db3cddaefb5f82191d873c7527d3cf89c60a31cf178cbf1c8f5c0318acfdbd9cab32f58b94040a590883ef4a1788b5f44f8263b5f4ab8ce304e121469ebc0783f8958764c246bf1ccd0b6b7741425fa6099e865215c2bdbad591f852e4ca0eca9cd8f3c0f934c62d818fe910ca253dab32df3177e467fc2f5c8af7d517cb645bb8857d717c16259dccc7d2535675985370bd7473e6da9e0397311df0b3bc6fcf30e40a243416d78a8ac7e686c90ed55772313d75a04fd1d226716738b10673eb01aa8eb61a7be5e8b680aed14250c1be86f09a6873c1540a912f83107c2c83216b53c2a02d41929bf564a145ea484ed8207904a592603f8e6cd6435ff7e6fcc76e873dc81ea072d91db43b7eef59a02bfe67f1aebaadace763776cbb05fdf6f7832ea20b9c1634e6b262cf097895bbff0b498864db3be0b2c831b87850fc345c7eeacd6471ff9b1a4216e9f6a7ccfe665b3f7f8c9bb2ac042c9cd07b3ff6b87dbcb836b11a259c59023b756c543772949ca1b5e83186d12bc08a9db3e2d02245741199a12e1256b787dd78a041f72ce5425123b3eec0e9196df5c065bd2391edfb222ff036d5d595e6f71a88d7bfc82dce25a43f2a8a3cfac24e35e5ec73aae6eeb0cc9e79e66d06f01c53df555ad074c454d9066f2db55982d59a74cda516707bed452ba647cd390f343374200e0aa28da34fa6755d4552ff14bd44e263d9bddef5bc1ddbea9cb754302aa28a3ec47932609e3e2035144cffd62b25e4e98401f872e0065c0eec4144428c238b6a868a40d6af2337eb7544e05b1583cf0d96e1b31d6e6f1d1321fda9258766f3e1bb708539c6615fecf84ca7c97ccb31b43af61df9a849c4e50906cb266a3ef78e7be0434dab531957a306f3fde132803e16ee79e4b6834ddd1b9a8a758fb86a44f200cd6b659d878393aa770f5238ddf181e83ee79a98ceaed26cf7c2e0029e7bf2f4bf80986250887386944e39624acd33c8da11de61c44b2a0ec1ab39fe1d612802e7f6c5d3d15a12d3e18995a9b3a92bcfc15b945bd5feb3e3e49ce232b04efb408cd2616481d5764e72ab622155908f1f1227f375d8777aaf066795e2fd2fe185109e1ff75e4381c63725f75bd973f2140cf94a7c76182c862a7c5b842b08fcb6dd630c342fede5a5678b183cc779891fb54d7ca7cf9dce2d375dbfd7d62449aa80e3e91627b3362afa1907fa144fe4ab4c10373dbd3c246549287359838ef4d5d499267b76a30aa9278cd515785c237d5999e5b752e9c3b78d5ccd68e34bee43ae3157ce272f9f764fd33c1b31ea088eb3db6c4deca8274e44cbf3289fd264a832ef3a10af912a0945027a91ac75197881ae5e0248c977e1da3ed032dc0b1c7aa1450a02d8c8bc90d06917aaa058bbd4bf08888919474be98016762d5ad2d24e8bd3a7095f58d64723fde63050c363c577a4f458e2817dc80d7ee2120e1e679f6ac417f0338f75e4a25eb3d1a649f5cc228ef72828aa9132393bbf0e8e7d28844b560f31ad8305a9cea4fd6b25e4a656cac654a47ea8a3d4',
35
+ '804b7acd1c25024cabe3468cb1d9a9b62d9cc506b9acab173873873cf8c11eb89723a0643fa37858e21b85d7d44567b7ac25cc1c60b5d2835fef2071c89b575c893a0f5cc5db6ee8b6868fd4323ae1556574e3092508952ff36aaadc52f19f07ab62ec166cb0e2c53b162a5dfd28b709f16f3c6672ef7dcbb6955811e552afa54b6f0bda5d8ad171c78852877522a90c65990a8bd7a647994ce800565d928f84e2775e88af9991ec7be785b38274cb9ff13a0c8548ca823563920328d36b52250c94c7985d3f501cd3dcbb06e74371ea549695afdd623a61e1dcb3b3048b1f6877f57cdd710c2a6ba435555a13676e85ee635bed1f3b1272db83a5d2c7446fa250bbbe58d86bd46b77a885d5c3531a129b1250639f1abe460c79578f20254b3711197fec3f23e0765e6547d2d841f4b7e909bf7058cd882e957f691a4cd4977f305b2e484aacbf3b1f8eeb6c8bc5b56723b9144a1c5a29a32e93211ef6ac0bf48d5c6175f738b7543163975f03fb8f9ba17bbf0379bf853f3dc03117cc8e6f420544649e6293a3d25608acd282f22e43e88fcca256699989f86204e1d3301fd8730065f80cd6a1874488b7b897933c5f4b3405f0a485cffb8d1cd74f0e0292c717604b5db39fe05c0b50ed21937d5c0f9f903749dcfb96343f1a14e0e08603f792fcf85a2d3110b43ca66d87ed8ef87a38de4b1e6dfa183ebe4fe830afbb6bda48591d9c5f9679563dc2b5e58054706d2d6ee5bd3a4a49a0c96ec44d840be2213022a166554119d3db14a9ed718b4fb0c97061765c626c8a2c966ff49d46a8df4d11240317775712fac30b85083f30ab0e99cda6b1c7cebcbc6aed2f8df5cbfba1f6434cdb36238ca18279832ec1614f6ce47c6b4b998d5b6c988173ab595bfc239fa860735cb117fb480cc2d069aa39e9a9886fc9790228afef2ad08fdfb2b004f0b8758fc0e8dfab8b6fc17757a16537de26023e6be05dc40f9507d69fb28c316522dc734c894462c54618c7b033f7536cec432104eb5449aa61e50446e9b698b264fc33cce60af1601b0c4737e4328c334aeeed33ede2b8eade8723336fcbfe75ca062ea29e9ccd99f05982c4566a6df360e6f1c7d9b9fd106af106bc9c7b96264ce4f3c675345e126477e84e4c72f6a4dc5f4a1d027176bddf4b0323f2f2ceecfdebebf5d3eb87cb26353820927ac0dd00036b6bb08baadbf72984f6819ae86af8bad1f44ef423801683e4f39b0d583c24a3fe8d9e2641a083397fa9b06a9643360de82100aba32fc5251ff81a96b84bb044af38137220f41954197beda08cb7d0ad581a7311b28be59238d541423f300282b270edaf9fa9169f41bc61b42163e818b0ce4be07d37b3b42cbd41a58f8dc346a7ed649b97a5fbf34c5aa4436ba145c5f234c24f1285e882cd19bff4d3581e6ca874aeb79369225f514b7fdaf15d0fa7d128428dacbbc1ef9797fbafceb5a811a748ef8019d44e69852b9346f100966a29e2c9aa04047a09ae8b4f928bba3f4a0e6340a51a111403868c286101c5541aa6a0be2bef4685723f42617b365abbe2be3d88a676c80648a28951354f1508b0473de6f1f59c24bb2e9c0e2545b6c793207b2ebafe78dca6c0054d7c8e23c848873829b707ab8fc24b8416c150f4dc9be9137d9b6d296e13f24a2e5f1ad45ef07736b9f5068a11a7efcdf089acd21f175f9880f3eb008e112db5f870fc18470',
36
+ '80595c0576abb7d713e414e8d4c51c45437af39ee1a156c310aca6600c533f7c34d52c7297485df80004539c021d49904da542a9f1e7879050167b9a2a48478f0aff51e0fc25e944dacd6ef9404c1cd86c6817440640007f612b2735bf5e75e4a12dba72e848fb5859a845c8fb85145db8e2aa72476a5d4b1e8a7adf4a1ed6ed328990ab81ec0d7dc18e08e441be603d0d0a80e00cd904b87005a0ab381bb6c21f16075cd0b2f978bd8fdf2d64e77870b49bb909eb98ddd281cc9ef78ef5b5e47e66f252c8ce9287724f5138cd84b1e5d8e9bb82ababf60e111f1ac4471e6ea418642d211a1123d462a11c19d8323d7725b9604db83ea8f5be99b01848c9fae94397b619a1d065fd4500d88997f73e74620e7bcbb564fe157ff59e8d0fcad4854ca5e37c807a3d15b09784f8b05c71c922c19cdc473a5813225b5ab4fc1834950b9b7cf19c29fb4c26ed4f08037118e862ffa5d22cde717ec839b05085b631ea53cffd513a270b26880f3d80b313a34abe4cf1ef0cd565fb018b551dcca88eaac33d9a87358966fb457f2c35213611cbdecdccbcda14161f676acb1df36e1c9c11b3c432448a349b3235e1c81ce83411d8c2e9a5d8f6b51fa10e68ad929799fbf1eeca5e0c5df019e12d540aee4721da8f23341b8c820cb4b35278beb947990e159f449152c4ce1e05388e1ba7e5c9db4133be326151fdfb1931853e9f97ff94fe0fe4b2bb9288c089424948f9fa1f28eba38e22aa749c9b9a5c33ebe6c61cc87edfcc83bb76c6d023e76cfa61bde5e5639c63c715ed04c6c86511308ba16b3e4aad72a41bf0203dac0bdae793d2cb37628204a9b54f2a4c916631eb4fd3d26008883438376ea3c73628543e79f8101769c529a9086b1f47754d47c446e922025c5a21766d4206f79888d279557cfbe8ad79baf8d3d008bc4786a101e43f49d972fce83c8fd745e47865897e842cce6c7a16a0a47fbea6a4154d185173ec6300a5a74c4fa88ac39a908a23cf921b88c49e52af4219b09d7fe26e3208d8aec6074cadbf08dea94364d75d57b13e43c93cfe0f60c7fc60ac0f33861e75e8ab53a294b8a428e45549b644f8202ad67fb17bc811b2cb7f5c8cce7d00475ecb7279763a6bec88c19d0f3239e1d199c1e057e1272d88dd5e71fb8f5cd1dfc199b953577cf7c8a25cd80ddfa98de8854ac3b15346277e2f7fa4aa78d5b9634675247e25b5c2654ee903c6f54341735108a8b15c388dcd50b345fc1626df0de819a564361ca44adf5fc6f97a0304f7a6d9de7d38bf64f4cb73a6729dc9ed3bcee78658ea20f0c35684c442f59c004964dedcd2c0eec2ce5704da62122226d1f0971d4804d4d63b80ce343978adc018c292d5e43dd32ef20b04b4be74994e9432a23417bc4d85102d8bd02dd614f1c3004cd8743bbca95ee249340636cbf5b5e7042af64ab51d26b1a4e35c078da2de6e9e4dd0f1687f567e1689de51f7fbc1b5aaba7690e1a490ab2f6de1a7f8b2bd4a035ff741748ca8c55629b695da023a566d124e3d53439238a83489e52392efcc97f007c301c0507373998e3301af3ffed6a8c5a4d21fd965b115be02570283fcd5771d50e67cf35e6c45f704b7361cf09b99414eb76e6401765b02ae21df989cf149d8c0995e76317bcc99e0e8637d8fe36565f199003ea440053bbcac654963f85b4bd2d980166d5027df4f6be7e653f0c203d1823441a',
37
+ ];
38
+ const crypto = crypto_1.webcrypto;
39
+ (0, test_utils_1.setLocalStorage)(fetch);
40
+ describe('Shamir split', () => {
41
+ it('should return 5 splits', () => {
42
+ const result = new shamir_1.ShamirClass(crypto).share(data, 5, 3);
43
+ (0, chai_1.expect)(result.length).to.equal(5);
44
+ });
45
+ it('should be able to split and recombine a private key', () => __awaiter(void 0, void 0, void 0, function* () {
46
+ const rsa = new RSA_1.RSAUtils(crypto);
47
+ const key = (0, icc_x_api_1.ua2hex)(yield rsa.exportKey((yield rsa.generateKeyPair(icc_x_api_1.ShaVersion.Sha256)).privateKey, 'pkcs8'));
48
+ const shamir = new shamir_1.ShamirClass(crypto);
49
+ const splits = shamir.share(key, 4, 3);
50
+ const combined = shamir.combine([splits[1], splits[0], splits[3]]);
51
+ (0, chai_1.expect)(combined).to.equal(key);
52
+ }));
53
+ });
54
+ describe('Shamir combine', () => {
55
+ it('should return combined data from all shares', () => {
56
+ (0, chai_1.expect)(new shamir_1.ShamirClass(crypto).combine(shares)).to.equal(data);
57
+ });
58
+ it('should return combined data with some shares', () => {
59
+ for (let i = 0; i < 4; i++) {
60
+ for (let j = i + 1; j < 5; j++) {
61
+ (0, chai_1.expect)(new shamir_1.ShamirClass(crypto).combine(shares.filter((x, idx) => idx !== i && idx !== j))).to.equal(data);
62
+ }
63
+ }
64
+ });
65
+ it('should fail miserably because it has not enough shares', () => {
66
+ for (let i = 0; i < 4; i++) {
67
+ for (let j = i + 1; j < 5; j++) {
68
+ (0, chai_1.expect)(new shamir_1.ShamirClass(crypto).combine(shares.filter((x, idx) => idx === i && idx === j))).to.equal('');
69
+ }
70
+ }
71
+ });
72
+ });
73
+ describe('Shamir key recovery', function () {
74
+ return __awaiter(this, void 0, void 0, function* () {
75
+ this.timeout(600000);
76
+ let env;
77
+ (0, mocha_1.before)(function () {
78
+ return __awaiter(this, void 0, void 0, function* () {
79
+ const initializer = yield (0, test_utils_1.getEnvironmentInitializer)();
80
+ env = yield initializer.execute((0, types_1.getEnvVariables)());
81
+ });
82
+ });
83
+ it('should automatically load recoverable keys on startup', () => __awaiter(this, void 0, void 0, function* () {
84
+ const hierarchyApis = yield (0, test_utils_1.createHcpHierarchyApis)(env);
85
+ const api = hierarchyApis.childApi;
86
+ const user = hierarchyApis.childUser;
87
+ const notariesApis = [
88
+ yield initApi(env, test_utils_1.hcp1Username),
89
+ yield initApi(env, test_utils_1.hcp2Username),
90
+ yield initApi(env, test_utils_1.hcp3Username),
91
+ hierarchyApis.child2Api,
92
+ ];
93
+ const notariesIds = (yield Promise.all(notariesApis.map((x) => x.healthcarePartyApi.getCurrentHealthcareParty()))).map((x) => x.id);
94
+ const pat = yield api.patientApi.initConfidentialSecretId(yield api.patientApi.newInstance(user), user);
95
+ const descr = 'Confidential info';
96
+ const confidentialData = yield api.healthcareElementApi.createHealthElementWithUser(user, yield api.healthcareElementApi.newInstance(user, pat, { descr }, { confidential: true }));
97
+ yield api.cryptoApi.shamirKeysManager.updateSelfSplits({ [(0, utils_1.fingerprintV1)(hierarchyApis.childCredentials.publicKey)]: { notariesIds, minShares: 3 } }, []);
98
+ const lostKeyStorage = yield (0, TestStorage_1.testStorageWithKeys)([
99
+ {
100
+ dataOwnerId: hierarchyApis.grandCredentials.dataOwnerId,
101
+ pairs: [
102
+ {
103
+ keyPair: { privateKey: hierarchyApis.grandCredentials.privateKey, publicKey: hierarchyApis.grandCredentials.publicKey },
104
+ shaVersion: icc_x_api_1.ShaVersion.Sha1,
105
+ },
106
+ ],
107
+ },
108
+ {
109
+ dataOwnerId: hierarchyApis.parentCredentials.dataOwnerId,
110
+ pairs: [
111
+ {
112
+ keyPair: { privateKey: hierarchyApis.parentCredentials.privateKey, publicKey: hierarchyApis.parentCredentials.publicKey },
113
+ shaVersion: icc_x_api_1.ShaVersion.Sha1,
114
+ },
115
+ ],
116
+ },
117
+ ]);
118
+ const newKey = yield api.cryptoApi.primitives.RSA.generateKeyPair(icc_x_api_1.ShaVersion.Sha256);
119
+ const lostKeyApi = yield icc_x_api_1.IcureApi.initialise(env.iCureUrl, {
120
+ username: hierarchyApis.childCredentials.user,
121
+ password: hierarchyApis.childCredentials.password,
122
+ }, new TestCryptoStrategies_1.TestCryptoStrategies(newKey), crypto_1.webcrypto, fetch, {
123
+ storage: lostKeyStorage.storage,
124
+ keyStorage: lostKeyStorage.keyStorage,
125
+ entryKeysFactory: lostKeyStorage.keyFactory,
126
+ });
127
+ const lostUser = yield lostKeyApi.userApi.getCurrentUser();
128
+ const lostPatient = yield lostKeyApi.patientApi.getPatientWithUser(lostUser, pat.id);
129
+ function checkNotRecovered() {
130
+ return __awaiter(this, void 0, void 0, function* () {
131
+ yield lostKeyApi.cryptoApi.forceReload();
132
+ (0, chai_1.expect)(Object.keys(lostKeyApi.cryptoApi.userKeysManager.getDecryptionKeys())).to.have.length(3);
133
+ (0, chai_1.expect)(yield lostKeyApi.healthcareElementApi.findBy(lostUser.healthcarePartyId, lostPatient)).to.be.empty;
134
+ });
135
+ }
136
+ function giveBackAccess(notaryId) {
137
+ return __awaiter(this, void 0, void 0, function* () {
138
+ const notaryApi = notariesApis[notaryId];
139
+ yield notaryApi.cryptoApi.forceReload();
140
+ const delegateUser = yield notaryApi.userApi.getCurrentUser();
141
+ const notifications = (yield notaryApi.maintenanceTaskApi.filterMaintenanceTasksByWithUser(delegateUser, undefined, undefined, new FilterChainMaintenanceTask_1.FilterChainMaintenanceTask({
142
+ filter: new MaintenanceTaskAfterDateFilter_1.MaintenanceTaskAfterDateFilter({
143
+ date: new Date().getTime() - 100000,
144
+ }),
145
+ }))).rows.map((x) => KeyPairUpdateRequest_1.KeyPairUpdateRequest.fromMaintenanceTask(x));
146
+ const filteredNotifications = notifications.filter((x) => x.concernedDataOwnerId === lostUser.healthcarePartyId);
147
+ (0, chai_1.expect)(filteredNotifications).to.have.length(1);
148
+ yield notaryApi.icureMaintenanceTaskApi.applyKeyPairUpdate(filteredNotifications[0]);
149
+ });
150
+ }
151
+ yield checkNotRecovered();
152
+ yield giveBackAccess(0);
153
+ yield checkNotRecovered();
154
+ yield giveBackAccess(1);
155
+ yield checkNotRecovered();
156
+ yield giveBackAccess(2);
157
+ yield giveBackAccess(3);
158
+ yield lostKeyApi.cryptoApi.forceReload();
159
+ (0, chai_1.expect)(Object.keys(lostKeyApi.cryptoApi.userKeysManager.getDecryptionKeys())).to.have.length(4);
160
+ const retrievedAfterRecovery = yield lostKeyApi.healthcareElementApi.findBy(lostUser.healthcarePartyId, lostPatient);
161
+ (0, chai_1.expect)(retrievedAfterRecovery).to.have.length(1);
162
+ (0, chai_1.expect)(retrievedAfterRecovery[0].descr).to.equal(descr);
163
+ }));
164
+ });
165
+ });
166
+ //# sourceMappingURL=shamir.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shamir.js","sourceRoot":"","sources":["../../../../test/icc-x-api/crypto/shamir.ts"],"names":[],"mappings":"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","sourcesContent":["import 'isomorphic-fetch'\nimport { ShamirClass } from '../../../icc-x-api/crypto/shamir'\nimport { expect } from 'chai'\nimport 'mocha'\nimport { IcureApi, ShaVersion, ua2hex } from '../../../icc-x-api'\nimport {\n createHcpHierarchyApis,\n getEnvironmentInitializer,\n hcp1Username,\n hcp2Username,\n hcp3Username,\n setLocalStorage,\n TestUtils,\n} from '../../utils/test_utils'\nimport initApi = TestUtils.initApi\nimport { before } from 'mocha'\nimport { testStorageWithKeys } from '../../utils/TestStorage'\nimport { webcrypto } from 'crypto'\nimport { TestCryptoStrategies } from '../../utils/TestCryptoStrategies'\nimport { FilterChainMaintenanceTask } from '../../../icc-api/model/FilterChainMaintenanceTask'\nimport { MaintenanceTaskAfterDateFilter } from '../../../icc-x-api/filters/MaintenanceTaskAfterDateFilter'\nimport { KeyPairUpdateRequest } from '../../../icc-x-api/maintenance/KeyPairUpdateRequest'\nimport { RSAUtils } from '../../../icc-x-api/crypto/RSA'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { fingerprintV1, fingerprintV1toV2, fingerprintV2 } from '../../../icc-x-api/crypto/utils'\n\n// Data was randomly generated, not based on any real key\nconst data =\n '77b3bb3ac6852a388b2aea8ba1794e63c95a87d10753afbdf8672b607b0ca7c03b39b30b2303bc417de1c78b326cf52810469914ea7dd8128b9f2e5d8f376cdb16b75a8e9dffb12b7c839d6fcf9ef8b6e220ab7973ad76e057038988d9a084f06a9d83cc9c3ee998ad0fcc317bb6c7a1bed8126ceb8463d59e84b50087d15d293970606cfe61f874e3f4efb182107aa971304a88b9821e74b1e6c88e7d0bb8882ab0ba35591e4e8d829fb973a26b480fe7432537b025c1177077689e86b5ff65b39a9d618e1cd8c129ae2b2a981664074301e9265e9842ec0c9e9a95f27a1066336578e06e3f3373d3a98b3b8182e55accc6795bbe9aaaf758179d09eccecc8a21f9f77e660a99e0e652cf39077ef083020d9c9d479fb6751de39e29feb7bcf9c73ee9e9d25f54683d55a82768f603b910b40ccb006d96c25f23ccf88e620c20d5495e11e83859d38bb5314a763c76149b3bcf6d987e6e98b83583f028fd6cfc363cb544673eb5d6cf5a7f9887d78a5a5d5b0a862ca3127a6d359a1a2ea8f332360fb7c4a8fe855eac200735322cd322eab431e659377ad9f9289a2d97152598333f4ca97e8003bdbc2d8b714a72a3bdd4f1b124674d6c2eda71b59f07f073de030795c562658c1a63e03d7de12f6ff57e328f83e05462c588ec7371af9b19f726f04162db61860e2c40e3d01b46cdab6f38a526ba555d09bdbde5702d6ae977f38e51314b20d333e84e645fc08ccc59be6e87aa349ec30e9b3a6c06c9b58693b8d67e8a7259be86b240431f44fb75c05d6a8578ffced3514fecc10e5ed7a052c85484d8b86276f7cd74a57402d79e0de85cb8006272b4c61d6f71ebe6cb039c0604fd4ab6bf2e5c686c5cb10be41a06087c3a598c6115153ad0ff6fd6644de8838b877b63a1c9ad348806e6e5e4962630ce84926b0596028c9bf4fb78cad55a0c7dac4e1b46eef6f76cea2707afc5499c055e56b9545501029b714cff01e3aea3ae955607b686d21f6c453bd6291627cad9502a1d200deb13ca47f45aae1a88c7ee288d5e59c10ea5aecdd681c1f30b67720ba045c6a1174b4b1bf2ba5af90a22d6be4f281d946666015dda5ad79a20bd0c7c43c4e52ddbe10776464e76ae2e883bc5cd2ba965c775227b3ce482f1f764a95a99888ca68c023a530df6ebe0193742f233db700a100cd568342a3d4bd648ee18b6d1de8a9b7cefdcee7858feb886c013286fbafd489d57a46f70b1b676bf6a7cf74a52f13c6d09a7b23cff8a366e78d35c5c69952445739fe1cf5a5815c111808d731d37f6a33f477cee2dcfbaccba65a43e1e1b5dad4c81549a1ebef5ac1bb5814cdf58ba5849ec66095f1e3bb5a1ea48f9fa746553c15580cf98f1a06f630d0b86b95711f3d9381d50711c1f6b8e63e677c77a21a772b921935ccb17a017ce4955e8fcf8fca4bb72e9c4457bf80c471004083676b1410e697b15db4ae9026b9dd2bc222faf9e68a9e4a2eb7bf1ffbd23b23500b1f97e49f1348f64a467fae59a0d2a34c4a7d084d445a86018a48aedad5b0f7b523e5e1af3d3d66a9323cd4fd1a6f1d78611a85204fb5baf09c5b3c559e6e7b574cec7d3a62d81f3b36c43f93de072fa8477b898e824aa18cf971983f931257dccd902fac7766ef934a2e942dfe6a4bb06b103fba46e77d15e780cc58ccc343b83b310f548f46e8a49ed1750722dade4c9acb8cbc0c0fa0de153'\nconst shares = [\n '801231b3513d19f3eaa4dad6cbb40fe4fa000a0df070eda11224feda86242674698a8fa533db9790d9dbc195ca209d012ed20fb1f8c31bb4d27873521036c820f508efd74c566e73975956e54ba00174e6979a6f29ff026a452f8899d5376779020050cd5cc4d05e8c27e545fa6eb4ef25f78df9b4a3ee38ee227b26e41c71356c3408e6da6013ea1981145c7a67d1106f391d78dfd7c8b91d0aebe30901de9646e9db7f74883d05228082b71d0489c9f1214bf8910124e5be4fead82b170faa2d046ef33c27da7a6c1ff8a4c875698eea3f5a1d685ba98674ed69beaa3c2eebce9732ca3c930f5c35a3747953e6ebeae58f976cc090016ecfb5604bf65d0b87ffe4aa5ee6cc57f69b3653397857b41116141b88f3b7942a88eb98dc160d0059267300e351c740461bb440ff329ff3f1abf3b2a75f3b603b6e48165c8c032b0c1b025fed43645af4bcfe9cdfdba00aec8627f82b8c72815a00431acd2b253891085c5f47064bfa015231c62a1711a4ac6792eb39c5c2820e0d6cc2d959874302494add79ac668fa6fb226a25a3b76caafb702eb5cf63ea05e8a5506ea9fcda3530ea22f9bc9602f476868db253cc1ce9b9cd311a67613c90fad0524587ccfb43e1b36133c69e4663b2bc1f157eeda3c7e64c54b17881a485ca6434d09ef6800036fccea47be3f31c21fe015844563015153743df86f98e60f2aef6d5ee7b969818c186160117e524b9b3c2299feb934d0a08f07978447672bf021e15c40d92721694566889df7826631bae3314075e1a1db00767e1d8e7b009c66a3adaf7260c7db97a2244cafca971a7adb5d1babbb115fb178acf08e2d70640bd123538a7f71947b714a38c2b20654feb3b92f261e64481354580570ada0884951ae24684983b1b012ea66901da7f5a0df3057b3f8f0db2519bf2e02c24b109a318d4af4ce5db59f08edad34c8fbd0189c93dd91f73b19c1f6614302d6c94129d7f12671e7c8af884a932932aa59a22442191f806515c5c3facadb6d7f9ab1ae2d178976a1b35b7578a0fed708bba2da6e795a945126d0c9c5e31e945b1e17db4467a2717ccc55dcc03a11325ab5027b613416642bcdc40d9fd495f6939d2cd93bfbaaa81eac6af48ef8e07a8bcf1afc2bc0e1dd5dbfe9622c881c56176e004c0a93faa7ecb0c1aa63d980ee3832ee7ce7d2460618a52471aa2f54477ee97cb23a10c1c183ad243159839c50efacf15ec07961ddd5a7bd68205ea071695486c4801fc77f79372441a353ad23c17397976d4ffd87b5ba2ae189ec496b6de3a6648a90a8a7ba870bcbf307a847205cf3e76222e1cda233a1d96140df29b70480462eb48674925045668c2605efd0777b1fe4aab30a961d3b937bb938962849b9a70fc7def66f837e5a3509fda88e571d631f5aa53d2faa3403a8f9da43ddfd75318721ed6a70c00179696b1ba1ecaa27e7495193cbceffb7e50ff9778ecfa2c0d7525c91b7b9c3e13b9defd5d132eacbdd8d4494bab9b097cd1f0f61356e2635f6428e3d32206d4874c6aa04ee27e3b61495b491d5b855133d9ad19591cfa6a1f58acf101db2427fa4d8eca7dc69dd9c9ebab86d171adbcf1020973ad07b966e6872dd2128e7898c15538695cb80b71a8dace9561b9672639e08406f21a11cefa788c2e950d49fec187d4fb6b4e8ae95763f518c2341d9df697ab7ab87d665eabf28951cbf7aedef2139',\n '802bb4d49a350355bf17d5d888ef07ebb785be0321a99f45052578da97781985baf80a14120a4ca53805efd6a0ec53136a6d5c05192f509216b18f76f09c64338988d3a34e80ca3fc09fbf58adca1229f6e603532415b3e5ded28491c7674d1301e84ab2c80f99e88622d1b1c513f4e305887dd98331e731881b07a31c81a3a7cc1ebae004151b5e7b3aa2ff543fd5c010587ba32ebf72abf3367937d6a661ffbd21fc44f7159c35bee305da1eb588b00f197bbced404b8e099ee5e0d4c6918d5699c406454775efb5b6105eb32fa52ed054f5802fd64941bc6345de8e1a4dc3fcdd332473e398b364c793f0e6a6448c8da5f9556faac7d619ac507107da425cd24e519db5c694a355f1d86b5f73635894b5cb91596f9f58484a35f121af3df11cd1e4381327b50f7e1f965d4b0e5224cf353e8e78e1a3b6a7430d1eaa64488b9c7e0c32be8fa9631c6fbf8ce7bd0b087d53f131227c69da2462a358c626101c0a8ab59b9b55a82c1de8475db77866883934b60ab80ed53b4224a87ce8553d692c7ed3888c5972c7e6ed825845bb25639c98ce68bb0b4426c0d7a08412b423fda3d0efa16e70658bffe6e9803fe38e032048e779ff68fd6123d1fa257239dd7bf97730a79eac8f2f96b25f4ececd851cab99c31099b49d337323eb859242f1e8253a795b5c42886f7ae9cad580706f226180e79004023efb8a7c495971350e5c5773925699d37b92abf232f95cbc547b2ac3fa094f62d360810be979d0ef01ea23a034bb8146778e830f47cbf26ce9a7024fcd1d6d6c361223c9d0aafdeb0a0699da86c80d424ada0365d62edea06bfa9ec09c9729d143bcf75dbbc37cf24b21cd02a4e41f1bb709974a87958d0d8b3f50f500edb2b946523fe85d6a02ebb823c16c42635d1c1dc8c02c9928a31cb23347817658e7cbb8caa6f1cbceeccefb0cb6e2945d443f6f0365468e1bfe119d3a337fd2e844641ec5219be34d94a5377d45f07149499e3cb1cc54d2df0637dd2633f1c7cb4423ba98b087fc8c0372ab2d9a4f4b985f0306815edaf2b94dae983fe7461a462e8d52c5888dae1555d3545db71cd7866daf2cac2d2ef07f820dbec9dddbe88afe6e76fa5f08332c23b74c8146a086a34e757a2f804c9aa5d1a79db6d90e6ceb508f6fda86bf3c073b8747b9f6a995a5ad9e41d5f8544e9e0d8f7e14935b53120c56406845f02893e46bba020243a3ca7139ab2a642ed1da217d3c197de68d14677e40253e777f204473e3010d90d622d19ea7fe72d52ad2cfc798dbe31758ecaec114527e2603da3169128dcdc5db997b1b89a69e04679b303950c02f2c9683ce1b0c71ca1756948276e3cc0c69314b0b218fe5b2b331deb05634fa279053e202c9a54e4a1525752f6dc024f5e613bceb63da013e9b66dfc853ac7805c1ea1c998df9d6dd5ea06dccffd2e56adc126ea007c80415a7fbbbeacf57bcd433090b4cf2f062f08f073712272108da2672254a301a8401908dc0832719d90624371b086d5f2a0742b9ddf17b8678de11b83fad7934e30c65ad14bce2c695bb11229ccb357c3f72ec84fd84a91c00097e6f4df74f3a260fb383af46d163e0564750bf73e0babb4578fc0121d349bc115a70c9268d0a39c7926ea8168cb102f15df4e0b734d961e1d54f5e39c0392c097d7377a48872a14d3dd080a2f64841ad6253e6e5f0890edead0d2e7112b1e694a63be',\n '8039921cf0bbb6ce071087bcedf3b218d963889b79a462912dfa598663ea3841190e8602bae16905da1a399d76b47d348bedd2b0887d05811948d49d124f74e00a4d8d1f777e4d93acd45e75dfbcefa4fffaf71e075d26b54c9309782ac8a7f00ba71cd64cf78075e49cbe24c3be57b74c05ebcdb6b4c7b12004256db3cddaefb5f82191d873c7527d3cf89c60a31cf178cbf1c8f5c0318acfdbd9cab32f58b94040a590883ef4a1788b5f44f8263b5f4ab8ce304e121469ebc0783f8958764c246bf1ccd0b6b7741425fa6099e865215c2bdbad591f852e4ca0eca9cd8f3c0f934c62d818fe910ca253dab32df3177e467fc2f5c8af7d517cb645bb8857d717c16259dccc7d2535675985370bd7473e6da9e0397311df0b3bc6fcf30e40a243416d78a8ac7e686c90ed55772313d75a04fd1d226716738b10673eb01aa8eb61a7be5e8b680aed14250c1be86f09a6873c1540a912f83107c2c83216b53c2a02d41929bf564a145ea484ed8207904a592603f8e6cd6435ff7e6fcc76e873dc81ea072d91db43b7eef59a02bfe67f1aebaadace763776cbb05fdf6f7832ea20b9c1634e6b262cf097895bbff0b498864db3be0b2c831b87850fc345c7eeacd6471ff9b1a4216e9f6a7ccfe665b3f7f8c9bb2ac042c9cd07b3ff6b87dbcb836b11a259c59023b756c543772949ca1b5e83186d12bc08a9db3e2d02245741199a12e1256b787dd78a041f72ce5425123b3eec0e9196df5c065bd2391edfb222ff036d5d595e6f71a88d7bfc82dce25a43f2a8a3cfac24e35e5ec73aae6eeb0cc9e79e66d06f01c53df555ad074c454d9066f2db55982d59a74cda516707bed452ba647cd390f343374200e0aa28da34fa6755d4552ff14bd44e263d9bddef5bc1ddbea9cb754302aa28a3ec47932609e3e2035144cffd62b25e4e98401f872e0065c0eec4144428c238b6a868a40d6af2337eb7544e05b1583cf0d96e1b31d6e6f1d1321fda9258766f3e1bb708539c6615fecf84ca7c97ccb31b43af61df9a849c4e50906cb266a3ef78e7be0434dab531957a306f3fde132803e16ee79e4b6834ddd1b9a8a758fb86a44f200cd6b659d878393aa770f5238ddf181e83ee79a98ceaed26cf7c2e0029e7bf2f4bf80986250887386944e39624acd33c8da11de61c44b2a0ec1ab39fe1d612802e7f6c5d3d15a12d3e18995a9b3a92bcfc15b945bd5feb3e3e49ce232b04efb408cd2616481d5764e72ab622155908f1f1227f375d8777aaf066795e2fd2fe185109e1ff75e4381c63725f75bd973f2140cf94a7c76182c862a7c5b842b08fcb6dd630c342fede5a5678b183cc779891fb54d7ca7cf9dce2d375dbfd7d62449aa80e3e91627b3362afa1907fa144fe4ab4c10373dbd3c246549287359838ef4d5d499267b76a30aa9278cd515785c237d5999e5b752e9c3b78d5ccd68e34bee43ae3157ce272f9f764fd33c1b31ea088eb3db6c4deca8274e44cbf3289fd264a832ef3a10af912a0945027a91ac75197881ae5e0248c977e1da3ed032dc0b1c7aa1450a02d8c8bc90d06917aaa058bbd4bf08888919474be98016762d5ad2d24e8bd3a7095f58d64723fde63050c363c577a4f458e2817dc80d7ee2120e1e679f6ac417f0338f75e4a25eb3d1a649f5cc228ef72828aa9132393bbf0e8e7d28844b560f31ad8305a9cea4fd6b25e4a656cac654a47ea8a3d4',\n '804b7acd1c25024cabe3468cb1d9a9b62d9cc506b9acab173873873cf8c11eb89723a0643fa37858e21b85d7d44567b7ac25cc1c60b5d2835fef2071c89b575c893a0f5cc5db6ee8b6868fd4323ae1556574e3092508952ff36aaadc52f19f07ab62ec166cb0e2c53b162a5dfd28b709f16f3c6672ef7dcbb6955811e552afa54b6f0bda5d8ad171c78852877522a90c65990a8bd7a647994ce800565d928f84e2775e88af9991ec7be785b38274cb9ff13a0c8548ca823563920328d36b52250c94c7985d3f501cd3dcbb06e74371ea549695afdd623a61e1dcb3b3048b1f6877f57cdd710c2a6ba435555a13676e85ee635bed1f3b1272db83a5d2c7446fa250bbbe58d86bd46b77a885d5c3531a129b1250639f1abe460c79578f20254b3711197fec3f23e0765e6547d2d841f4b7e909bf7058cd882e957f691a4cd4977f305b2e484aacbf3b1f8eeb6c8bc5b56723b9144a1c5a29a32e93211ef6ac0bf48d5c6175f738b7543163975f03fb8f9ba17bbf0379bf853f3dc03117cc8e6f420544649e6293a3d25608acd282f22e43e88fcca256699989f86204e1d3301fd8730065f80cd6a1874488b7b897933c5f4b3405f0a485cffb8d1cd74f0e0292c717604b5db39fe05c0b50ed21937d5c0f9f903749dcfb96343f1a14e0e08603f792fcf85a2d3110b43ca66d87ed8ef87a38de4b1e6dfa183ebe4fe830afbb6bda48591d9c5f9679563dc2b5e58054706d2d6ee5bd3a4a49a0c96ec44d840be2213022a166554119d3db14a9ed718b4fb0c97061765c626c8a2c966ff49d46a8df4d11240317775712fac30b85083f30ab0e99cda6b1c7cebcbc6aed2f8df5cbfba1f6434cdb36238ca18279832ec1614f6ce47c6b4b998d5b6c988173ab595bfc239fa860735cb117fb480cc2d069aa39e9a9886fc9790228afef2ad08fdfb2b004f0b8758fc0e8dfab8b6fc17757a16537de26023e6be05dc40f9507d69fb28c316522dc734c894462c54618c7b033f7536cec432104eb5449aa61e50446e9b698b264fc33cce60af1601b0c4737e4328c334aeeed33ede2b8eade8723336fcbfe75ca062ea29e9ccd99f05982c4566a6df360e6f1c7d9b9fd106af106bc9c7b96264ce4f3c675345e126477e84e4c72f6a4dc5f4a1d027176bddf4b0323f2f2ceecfdebebf5d3eb87cb26353820927ac0dd00036b6bb08baadbf72984f6819ae86af8bad1f44ef423801683e4f39b0d583c24a3fe8d9e2641a083397fa9b06a9643360de82100aba32fc5251ff81a96b84bb044af38137220f41954197beda08cb7d0ad581a7311b28be59238d541423f300282b270edaf9fa9169f41bc61b42163e818b0ce4be07d37b3b42cbd41a58f8dc346a7ed649b97a5fbf34c5aa4436ba145c5f234c24f1285e882cd19bff4d3581e6ca874aeb79369225f514b7fdaf15d0fa7d128428dacbbc1ef9797fbafceb5a811a748ef8019d44e69852b9346f100966a29e2c9aa04047a09ae8b4f928bba3f4a0e6340a51a111403868c286101c5541aa6a0be2bef4685723f42617b365abbe2be3d88a676c80648a28951354f1508b0473de6f1f59c24bb2e9c0e2545b6c793207b2ebafe78dca6c0054d7c8e23c848873829b707ab8fc24b8416c150f4dc9be9137d9b6d296e13f24a2e5f1ad45ef07736b9f5068a11a7efcdf089acd21f175f9880f3eb008e112db5f870fc18470',\n '80595c0576abb7d713e414e8d4c51c45437af39ee1a156c310aca6600c533f7c34d52c7297485df80004539c021d49904da542a9f1e7879050167b9a2a48478f0aff51e0fc25e944dacd6ef9404c1cd86c6817440640007f612b2735bf5e75e4a12dba72e848fb5859a845c8fb85145db8e2aa72476a5d4b1e8a7adf4a1ed6ed328990ab81ec0d7dc18e08e441be603d0d0a80e00cd904b87005a0ab381bb6c21f16075cd0b2f978bd8fdf2d64e77870b49bb909eb98ddd281cc9ef78ef5b5e47e66f252c8ce9287724f5138cd84b1e5d8e9bb82ababf60e111f1ac4471e6ea418642d211a1123d462a11c19d8323d7725b9604db83ea8f5be99b01848c9fae94397b619a1d065fd4500d88997f73e74620e7bcbb564fe157ff59e8d0fcad4854ca5e37c807a3d15b09784f8b05c71c922c19cdc473a5813225b5ab4fc1834950b9b7cf19c29fb4c26ed4f08037118e862ffa5d22cde717ec839b05085b631ea53cffd513a270b26880f3d80b313a34abe4cf1ef0cd565fb018b551dcca88eaac33d9a87358966fb457f2c35213611cbdecdccbcda14161f676acb1df36e1c9c11b3c432448a349b3235e1c81ce83411d8c2e9a5d8f6b51fa10e68ad929799fbf1eeca5e0c5df019e12d540aee4721da8f23341b8c820cb4b35278beb947990e159f449152c4ce1e05388e1ba7e5c9db4133be326151fdfb1931853e9f97ff94fe0fe4b2bb9288c089424948f9fa1f28eba38e22aa749c9b9a5c33ebe6c61cc87edfcc83bb76c6d023e76cfa61bde5e5639c63c715ed04c6c86511308ba16b3e4aad72a41bf0203dac0bdae793d2cb37628204a9b54f2a4c916631eb4fd3d26008883438376ea3c73628543e79f8101769c529a9086b1f47754d47c446e922025c5a21766d4206f79888d279557cfbe8ad79baf8d3d008bc4786a101e43f49d972fce83c8fd745e47865897e842cce6c7a16a0a47fbea6a4154d185173ec6300a5a74c4fa88ac39a908a23cf921b88c49e52af4219b09d7fe26e3208d8aec6074cadbf08dea94364d75d57b13e43c93cfe0f60c7fc60ac0f33861e75e8ab53a294b8a428e45549b644f8202ad67fb17bc811b2cb7f5c8cce7d00475ecb7279763a6bec88c19d0f3239e1d199c1e057e1272d88dd5e71fb8f5cd1dfc199b953577cf7c8a25cd80ddfa98de8854ac3b15346277e2f7fa4aa78d5b9634675247e25b5c2654ee903c6f54341735108a8b15c388dcd50b345fc1626df0de819a564361ca44adf5fc6f97a0304f7a6d9de7d38bf64f4cb73a6729dc9ed3bcee78658ea20f0c35684c442f59c004964dedcd2c0eec2ce5704da62122226d1f0971d4804d4d63b80ce343978adc018c292d5e43dd32ef20b04b4be74994e9432a23417bc4d85102d8bd02dd614f1c3004cd8743bbca95ee249340636cbf5b5e7042af64ab51d26b1a4e35c078da2de6e9e4dd0f1687f567e1689de51f7fbc1b5aaba7690e1a490ab2f6de1a7f8b2bd4a035ff741748ca8c55629b695da023a566d124e3d53439238a83489e52392efcc97f007c301c0507373998e3301af3ffed6a8c5a4d21fd965b115be02570283fcd5771d50e67cf35e6c45f704b7361cf09b99414eb76e6401765b02ae21df989cf149d8c0995e76317bcc99e0e8637d8fe36565f199003ea440053bbcac654963f85b4bd2d980166d5027df4f6be7e653f0c203d1823441a',\n]\n\nconst crypto = webcrypto as any\nsetLocalStorage(fetch)\n\ndescribe('Shamir split', () => {\n it('should return 5 splits', () => {\n const result = new ShamirClass(crypto).share(data, 5, 3)\n expect(result.length).to.equal(5)\n })\n\n it('should be able to split and recombine a private key', async () => {\n const rsa = new RSAUtils(crypto)\n const key = ua2hex(await rsa.exportKey((await rsa.generateKeyPair(ShaVersion.Sha256)).privateKey, 'pkcs8'))\n const shamir = new ShamirClass(crypto)\n const splits = shamir.share(key, 4, 3)\n const combined = shamir.combine([splits[1], splits[0], splits[3]])\n expect(combined).to.equal(key)\n })\n})\n\ndescribe('Shamir combine', () => {\n it('should return combined data from all shares', () => {\n expect(new ShamirClass(crypto).combine(shares)).to.equal(data)\n })\n\n it('should return combined data with some shares', () => {\n for (let i = 0; i < 4; i++) {\n for (let j = i + 1; j < 5; j++) {\n expect(new ShamirClass(crypto).combine(shares.filter((x, idx) => idx !== i && idx !== j))).to.equal(data)\n }\n }\n })\n\n it('should fail miserably because it has not enough shares', () => {\n for (let i = 0; i < 4; i++) {\n for (let j = i + 1; j < 5; j++) {\n expect(new ShamirClass(crypto).combine(shares.filter((x, idx) => idx === i && idx === j))).to.equal('')\n }\n }\n })\n})\n\ndescribe('Shamir key recovery', async function () {\n this.timeout(600000)\n let env: TestVars\n\n before(async function () {\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n })\n\n it('should automatically load recoverable keys on startup', async () => {\n const hierarchyApis = await createHcpHierarchyApis(env)\n const api = hierarchyApis.childApi\n const user = hierarchyApis.childUser\n const notariesApis = [\n await initApi(env, hcp1Username),\n await initApi(env, hcp2Username),\n await initApi(env, hcp3Username),\n hierarchyApis.child2Api,\n ]\n const notariesIds = (await Promise.all(notariesApis.map((x) => x.healthcarePartyApi.getCurrentHealthcareParty()))).map((x) => x.id!)\n const pat = await api.patientApi.initConfidentialSecretId(await api.patientApi.newInstance(user), user)\n const descr = 'Confidential info'\n const confidentialData = await api.healthcareElementApi.createHealthElementWithUser(\n user,\n await api.healthcareElementApi.newInstance(user, pat, { descr }, { confidential: true })\n )\n await api.cryptoApi.shamirKeysManager.updateSelfSplits(\n { [fingerprintV1(hierarchyApis.childCredentials.publicKey)]: { notariesIds, minShares: 3 } },\n []\n )\n const lostKeyStorage = await testStorageWithKeys([\n {\n dataOwnerId: hierarchyApis.grandCredentials.dataOwnerId,\n pairs: [\n {\n keyPair: { privateKey: hierarchyApis.grandCredentials.privateKey, publicKey: hierarchyApis.grandCredentials.publicKey },\n shaVersion: ShaVersion.Sha1,\n },\n ],\n },\n {\n dataOwnerId: hierarchyApis.parentCredentials.dataOwnerId,\n pairs: [\n {\n keyPair: { privateKey: hierarchyApis.parentCredentials.privateKey, publicKey: hierarchyApis.parentCredentials.publicKey },\n shaVersion: ShaVersion.Sha1,\n },\n ],\n },\n ])\n const newKey = await api.cryptoApi.primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const lostKeyApi = await IcureApi.initialise(\n env.iCureUrl,\n {\n username: hierarchyApis.childCredentials.user,\n password: hierarchyApis.childCredentials.password,\n },\n new TestCryptoStrategies(newKey),\n webcrypto as any,\n fetch,\n {\n storage: lostKeyStorage.storage,\n keyStorage: lostKeyStorage.keyStorage,\n entryKeysFactory: lostKeyStorage.keyFactory,\n }\n )\n const lostUser = await lostKeyApi.userApi.getCurrentUser()\n const lostPatient = await lostKeyApi.patientApi.getPatientWithUser(lostUser, pat.id!)\n\n async function checkNotRecovered() {\n await lostKeyApi.cryptoApi.forceReload()\n expect(Object.keys(lostKeyApi.cryptoApi.userKeysManager.getDecryptionKeys())).to.have.length(3)\n expect(await lostKeyApi.healthcareElementApi.findBy(lostUser.healthcarePartyId!, lostPatient)).to.be.empty\n }\n\n async function giveBackAccess(notaryId: number) {\n const notaryApi = notariesApis[notaryId]\n await notaryApi.cryptoApi.forceReload()\n const delegateUser = await notaryApi.userApi.getCurrentUser()\n const notifications = (\n await notaryApi.maintenanceTaskApi.filterMaintenanceTasksByWithUser(\n delegateUser!,\n undefined,\n undefined,\n new FilterChainMaintenanceTask({\n filter: new MaintenanceTaskAfterDateFilter({\n date: new Date().getTime() - 100000,\n }),\n })\n )\n ).rows!.map((x) => KeyPairUpdateRequest.fromMaintenanceTask(x))\n const filteredNotifications = notifications.filter((x) => x.concernedDataOwnerId === lostUser.healthcarePartyId)\n expect(filteredNotifications).to.have.length(1)\n await notaryApi.icureMaintenanceTaskApi.applyKeyPairUpdate(filteredNotifications[0])\n }\n\n await checkNotRecovered()\n await giveBackAccess(0)\n await checkNotRecovered()\n await giveBackAccess(1)\n await checkNotRecovered()\n await giveBackAccess(2)\n await giveBackAccess(3)\n await lostKeyApi.cryptoApi.forceReload()\n expect(Object.keys(lostKeyApi.cryptoApi.userKeysManager.getDecryptionKeys())).to.have.length(4)\n const retrievedAfterRecovery = await lostKeyApi.healthcareElementApi.findBy(lostUser.healthcarePartyId!, lostPatient)\n expect(retrievedAfterRecovery).to.have.length(1)\n expect(retrievedAfterRecovery[0].descr).to.equal(descr)\n })\n})\n"]}
@@ -0,0 +1 @@
1
+ import 'isomorphic-fetch';
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const uuid_1 = require("uuid");
13
+ const User_1 = require("../../../icc-api/model/User");
14
+ const mocha_1 = require("mocha");
15
+ const crypto_1 = require("crypto");
16
+ require("isomorphic-fetch");
17
+ const icc_api_1 = require("../../../icc-api");
18
+ const chai_1 = require("chai");
19
+ const test_utils_1 = require("../../utils/test_utils");
20
+ const TestStorage_1 = require("../../utils/TestStorage");
21
+ const TestCryptoStrategies_1 = require("../../utils/TestCryptoStrategies");
22
+ const types_1 = require("@icure/test-setup/types");
23
+ const icc_x_api_1 = require("../../../icc-x-api");
24
+ const icc_x_api_2 = require("../../../icc-x-api");
25
+ (0, test_utils_1.setLocalStorage)(fetch);
26
+ let env;
27
+ (0, mocha_1.describe)('Full battery of tests on crypto and keys', function () {
28
+ return __awaiter(this, void 0, void 0, function* () {
29
+ this.timeout(600000);
30
+ (0, mocha_1.before)(function () {
31
+ return __awaiter(this, void 0, void 0, function* () {
32
+ const initializer = yield (0, test_utils_1.getEnvironmentInitializer)();
33
+ env = yield initializer.execute((0, types_1.getEnvVariables)());
34
+ });
35
+ });
36
+ (0, mocha_1.it)(`Share patient from hcp to patient`, () => __awaiter(this, void 0, void 0, function* () {
37
+ var _a;
38
+ const { childApi: api, childUser: u } = yield (0, test_utils_1.createHcpHierarchyApis)(env);
39
+ const patient = yield api.patientApi.createPatientWithUser(u, yield api.patientApi.newInstance(u, { id: (0, uuid_1.v4)(), firstName: 'test', lastName: 'test', note: 'secure' }));
40
+ const heNote = 'Some encrypted note';
41
+ const he = yield api.healthcareElementApi.createHealthElementWithUser(u, yield api.healthcareElementApi.newInstance(u, patient, { note: heNote }));
42
+ const check = yield api.patientApi.getPatientWithUser(u, patient.id);
43
+ (0, chai_1.expect)(check.note).to.equal('secure');
44
+ const newPatientUser = yield api.userApi.createUser(new User_1.User({
45
+ id: `user-${patient.id}-patient`,
46
+ login: `patient-${patient.id}`,
47
+ status: 'ACTIVE',
48
+ passwordHash: 'LetMeInForReal',
49
+ patientId: patient.id,
50
+ }));
51
+ const apiAsPatient = yield icc_x_api_1.IcureApi.initialise(env.iCureUrl, { username: newPatientUser.login, password: 'LetMeInForReal' }, new TestCryptoStrategies_1.TestCryptoStrategies(yield api.cryptoApi.primitives.RSA.generateKeyPair(icc_x_api_1.ShaVersion.Sha256)), crypto_1.webcrypto, fetch, {
52
+ storage: new TestStorage_1.TestStorage(),
53
+ keyStorage: new TestStorage_1.TestKeyStorage(),
54
+ });
55
+ const patientBaseApi = new icc_api_1.IccPatientApi(env.iCureUrl, {}, new icc_x_api_2.BasicAuthenticationProvider(newPatientUser.login, 'LetMeInForReal'));
56
+ const pat = yield patientBaseApi.getPatient(patient.id);
57
+ (0, chai_1.expect)((_a = pat.note) !== null && _a !== void 0 ? _a : undefined).to.be.undefined;
58
+ yield api.patientApi.shareAllDataOfPatient(u, patient.id, u.healthcarePartyId, [patient.id], { [patient.id]: ['all'] });
59
+ yield apiAsPatient.cryptoApi.forceReload();
60
+ const patUser = yield apiAsPatient.userApi.getCurrentUser();
61
+ const entity = yield apiAsPatient.patientApi.getPatientWithUser(patUser, patient.id);
62
+ const retrievedHe = yield apiAsPatient.healthcareElementApi.getHealthElementWithUser(patUser, he.id);
63
+ (0, chai_1.expect)(entity.id).to.be.not.null;
64
+ (0, chai_1.expect)(entity.rev).to.be.not.null;
65
+ (0, chai_1.expect)(entity.note).to.equal('secure');
66
+ (0, chai_1.expect)(retrievedHe.id).to.equal(he.id);
67
+ (0, chai_1.expect)(retrievedHe.note).to.equal(heNote);
68
+ }));
69
+ });
70
+ });
71
+ //# sourceMappingURL=share-to-newly-created-patient-from-hcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"share-to-newly-created-patient-from-hcp.js","sourceRoot":"","sources":["../../../../test/icc-x-api/crypto/share-to-newly-created-patient-from-hcp.ts"],"names":[],"mappings":"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","sourcesContent":["import { v4 as uuid } from 'uuid'\nimport { User } from '../../../icc-api/model/User'\nimport { before, describe, it } from 'mocha'\n\nimport { webcrypto } from 'crypto'\nimport 'isomorphic-fetch'\n\nimport { IccPatientApi } from '../../../icc-api'\nimport { expect } from 'chai'\n\nimport { createHcpHierarchyApis, getEnvironmentInitializer, setLocalStorage } from '../../utils/test_utils'\nimport { TestKeyStorage, TestStorage } from '../../utils/TestStorage'\nimport { TestCryptoStrategies } from '../../utils/TestCryptoStrategies'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { IcureApi, ShaVersion } from '../../../icc-x-api'\nimport { BasicAuthenticationProvider } from '../../../icc-x-api'\n\nsetLocalStorage(fetch)\n\nlet env: TestVars\n\ndescribe('Full battery of tests on crypto and keys', async function () {\n this.timeout(600000)\n\n before(async function () {\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n })\n\n it(`Share patient from hcp to patient`, async () => {\n const { childApi: api, childUser: u } = await createHcpHierarchyApis(env!)\n\n const patient = await api.patientApi.createPatientWithUser(\n u,\n await api.patientApi.newInstance(u, { id: uuid(), firstName: 'test', lastName: 'test', note: 'secure' })\n )\n const heNote = 'Some encrypted note'\n const he = await api.healthcareElementApi.createHealthElementWithUser(u, await api.healthcareElementApi.newInstance(u, patient, { note: heNote }))\n const check = await api.patientApi.getPatientWithUser(u, patient.id)\n\n expect(check.note).to.equal('secure')\n\n const newPatientUser = await api.userApi.createUser(\n new User({\n id: `user-${patient.id}-patient`,\n login: `patient-${patient.id}`,\n status: 'ACTIVE',\n passwordHash: 'LetMeInForReal',\n patientId: patient.id,\n })\n )\n\n const apiAsPatient = await IcureApi.initialise(\n env!.iCureUrl,\n { username: newPatientUser.login!, password: 'LetMeInForReal' },\n new TestCryptoStrategies(await api.cryptoApi.primitives.RSA.generateKeyPair(ShaVersion.Sha256)),\n webcrypto as unknown as Crypto,\n fetch,\n {\n storage: new TestStorage(),\n keyStorage: new TestKeyStorage(),\n }\n )\n\n const patientBaseApi = new IccPatientApi(env!.iCureUrl, {}, new BasicAuthenticationProvider(newPatientUser.login!, 'LetMeInForReal'))\n\n const pat = await patientBaseApi.getPatient(patient.id)\n\n expect(pat.note ?? undefined).to.be.undefined\n\n await api.patientApi.shareAllDataOfPatient(u, patient.id, u.healthcarePartyId!, [patient.id], { [patient.id]: ['all'] })\n await apiAsPatient.cryptoApi.forceReload()\n const patUser = await apiAsPatient.userApi.getCurrentUser()\n const entity = await apiAsPatient.patientApi.getPatientWithUser(patUser, patient.id)\n const retrievedHe = await apiAsPatient.healthcareElementApi.getHealthElementWithUser(patUser, he.id!)\n\n expect(entity.id).to.be.not.null\n expect(entity.rev).to.be.not.null\n expect(entity.note).to.equal('secure')\n expect(retrievedHe.id).to.equal(he.id)\n expect(retrievedHe.note).to.equal(heNote)\n })\n})\n"]}