@digitaldefiance/ecies-lib 4.4.2 → 4.4.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 (589) hide show
  1. package/LICENSE +21 -0
  2. package/package.json +9 -6
  3. package/src/builders/ecies-builder.ts +39 -0
  4. package/src/builders/{index.js → index.ts} +1 -1
  5. package/src/builders/member-builder.ts +155 -0
  6. package/src/constants.ts +609 -0
  7. package/src/core/errors/crypto-error.ts +78 -0
  8. package/src/core/{index.js → index.ts} +1 -1
  9. package/src/core/types/result.ts +19 -0
  10. package/src/email-string.ts +82 -0
  11. package/src/enumerations/disposed-error-type.ts +11 -0
  12. package/src/enumerations/ecies-cipher-suite.ts +4 -0
  13. package/src/enumerations/ecies-encryption-type.ts +41 -0
  14. package/src/enumerations/ecies-error-type.ts +43 -0
  15. package/src/enumerations/ecies-string-key.ts +205 -0
  16. package/src/enumerations/ecies-version.ts +3 -0
  17. package/src/enumerations/guid-brand-type.ts +26 -0
  18. package/src/enumerations/guid-error-type.ts +6 -0
  19. package/src/enumerations/id-provider-error-type.ts +50 -0
  20. package/src/enumerations/{index.js → index.ts} +0 -1
  21. package/src/enumerations/invalid-email-type.ts +5 -0
  22. package/src/enumerations/length-encoding-type.ts +6 -0
  23. package/src/enumerations/length-error-type.ts +5 -0
  24. package/src/enumerations/member-error-type.ts +106 -0
  25. package/src/enumerations/{member-type.d.ts → member-type.ts} +7 -6
  26. package/src/enumerations/password-login-error-type.ts +4 -0
  27. package/src/enumerations/pbkdf2-error-type.ts +5 -0
  28. package/src/enumerations/pbkdf2-profile.ts +5 -0
  29. package/src/enumerations/secure-storage-error-type.ts +5 -0
  30. package/src/errors/disposed.ts +36 -0
  31. package/src/errors/ecies.ts +153 -0
  32. package/src/errors/guid.ts +130 -0
  33. package/src/errors/id-provider.ts +40 -0
  34. package/src/errors/{index.d.ts → index.ts} +0 -1
  35. package/src/errors/invalid-email.ts +23 -0
  36. package/src/errors/length.ts +19 -0
  37. package/src/errors/member.ts +20 -0
  38. package/src/errors/pbkdf2.ts +20 -0
  39. package/src/errors/secure-storage.ts +17 -0
  40. package/src/errors/simple-ecies.ts +21 -0
  41. package/src/errors/simple-test-error.ts +6 -0
  42. package/src/i18n-setup.ts +130 -0
  43. package/src/{index.js → index.ts} +64 -7
  44. package/src/interfaces/checksum-config.ts +4 -0
  45. package/src/interfaces/checksum-consts.ts +13 -0
  46. package/src/interfaces/configuration-provenance.ts +54 -0
  47. package/src/interfaces/constants.ts +75 -0
  48. package/src/interfaces/ecies-config.ts +8 -0
  49. package/src/interfaces/ecies-consts.ts +74 -0
  50. package/src/interfaces/ecies-file-service.ts +6 -0
  51. package/src/interfaces/encrypted-chunk.ts +64 -0
  52. package/src/interfaces/encryption-state.ts +19 -0
  53. package/src/interfaces/frontend-member-operational.ts +77 -0
  54. package/src/interfaces/guid.ts +86 -0
  55. package/src/interfaces/id-provider.ts +152 -0
  56. package/src/interfaces/{index.d.ts → index.ts} +0 -1
  57. package/src/interfaces/invariant.ts +60 -0
  58. package/src/interfaces/library-error.ts +23 -0
  59. package/src/interfaces/{member-storage.d.ts → member-storage.ts} +11 -10
  60. package/src/interfaces/{member-with-mnemonic.d.ts → member-with-mnemonic.ts} +3 -3
  61. package/src/interfaces/member.ts +84 -0
  62. package/src/interfaces/multi-recipient-chunk.ts +61 -0
  63. package/src/interfaces/pbkdf2-config.ts +6 -0
  64. package/src/interfaces/pbkdf2-consts.ts +10 -0
  65. package/src/interfaces/pbkdf2-result.ts +5 -0
  66. package/src/interfaces/stream-config.ts +17 -0
  67. package/src/interfaces/stream-header.ts +34 -0
  68. package/src/interfaces/stream-progress.ts +31 -0
  69. package/src/lib/configuration-provenance-utils.ts +26 -0
  70. package/src/lib/crypto-container.ts +64 -0
  71. package/src/lib/guid.ts +1097 -0
  72. package/src/lib/id-providers/custom-provider.ts +109 -0
  73. package/src/lib/id-providers/guidv4-provider.ts +141 -0
  74. package/src/lib/id-providers/{index.d.ts → index.ts} +6 -5
  75. package/src/lib/id-providers/objectid-provider.ts +125 -0
  76. package/src/lib/id-providers/uuid-provider.ts +133 -0
  77. package/src/lib/{index.js → index.ts} +2 -2
  78. package/src/lib/invariant-validator.ts +133 -0
  79. package/src/lib/invariants/encryption-algorithm-consistency.ts +73 -0
  80. package/src/lib/invariants/{index.js → index.ts} +0 -1
  81. package/src/lib/invariants/pbkdf2-profiles-validity.ts +78 -0
  82. package/src/lib/invariants/recipient-id-consistency.ts +46 -0
  83. package/src/lib/multi-recipient-chunk-utils.ts +63 -0
  84. package/src/member.ts +495 -0
  85. package/src/{pbkdf2-profiles.d.ts → pbkdf2-profiles.ts} +2 -2
  86. package/src/phone-number.ts +18 -0
  87. package/src/regexes.ts +10 -0
  88. package/src/secure-buffer.ts +226 -0
  89. package/src/secure-string.ts +244 -0
  90. package/src/services/aes-gcm.ts +220 -0
  91. package/src/services/chunk-processor.ts +188 -0
  92. package/src/services/ecies/README.md +147 -0
  93. package/src/services/ecies/crypto-core.ts +292 -0
  94. package/src/services/ecies/example.ts +185 -0
  95. package/src/services/ecies/file.ts +167 -0
  96. package/src/services/ecies/{index.js → index.ts} +2 -1
  97. package/src/services/ecies/integration.ts +241 -0
  98. package/src/services/ecies/interfaces.ts +62 -0
  99. package/src/services/ecies/manual-test.ts +219 -0
  100. package/src/services/ecies/multi-recipient.ts +545 -0
  101. package/src/services/ecies/service.ts +370 -0
  102. package/src/services/ecies/signature.ts +93 -0
  103. package/src/services/ecies/single-recipient.ts +476 -0
  104. package/src/services/encryption-stream.ts +435 -0
  105. package/src/services/{index.js → index.ts} +0 -1
  106. package/src/services/multi-recipient-processor.ts +377 -0
  107. package/src/services/password-login.ts +226 -0
  108. package/src/services/pbkdf2.ts +169 -0
  109. package/src/services/progress-tracker.ts +128 -0
  110. package/src/services/resumable-encryption.ts +135 -0
  111. package/src/services/xor.ts +65 -0
  112. package/src/test-mocks/index.ts +1 -0
  113. package/src/test-mocks/mock-frontend-member.ts +276 -0
  114. package/src/{testing.js → testing.ts} +0 -1
  115. package/src/translations/{de.js → de.ts} +112 -56
  116. package/src/translations/{en-US.js → en-US.ts} +116 -58
  117. package/src/translations/{es.js → es.ts} +134 -67
  118. package/src/translations/{fr.js → fr.ts} +129 -64
  119. package/src/translations/{ja.js → ja.ts} +111 -55
  120. package/src/translations/{uk.js → uk.ts} +132 -67
  121. package/src/translations/{zh-cn.js → zh-cn.ts} +60 -29
  122. package/src/types/deep-partial.ts +11 -0
  123. package/src/{types.d.ts → types.ts} +15 -7
  124. package/src/utils/encryption-type-utils.ts +76 -0
  125. package/src/utils.ts +329 -0
  126. package/src/builders/ecies-builder.d.ts +0 -18
  127. package/src/builders/ecies-builder.d.ts.map +0 -1
  128. package/src/builders/ecies-builder.js +0 -30
  129. package/src/builders/ecies-builder.js.map +0 -1
  130. package/src/builders/index.d.ts +0 -6
  131. package/src/builders/index.d.ts.map +0 -1
  132. package/src/builders/index.js.map +0 -1
  133. package/src/builders/member-builder.d.ts +0 -51
  134. package/src/builders/member-builder.d.ts.map +0 -1
  135. package/src/builders/member-builder.js +0 -97
  136. package/src/builders/member-builder.js.map +0 -1
  137. package/src/constants.d.ts +0 -60
  138. package/src/constants.d.ts.map +0 -1
  139. package/src/constants.js +0 -446
  140. package/src/constants.js.map +0 -1
  141. package/src/core/errors/crypto-error.d.ts +0 -34
  142. package/src/core/errors/crypto-error.d.ts.map +0 -1
  143. package/src/core/errors/crypto-error.js +0 -56
  144. package/src/core/errors/crypto-error.js.map +0 -1
  145. package/src/core/index.d.ts +0 -6
  146. package/src/core/index.d.ts.map +0 -1
  147. package/src/core/index.js.map +0 -1
  148. package/src/core/types/result.d.ts +0 -16
  149. package/src/core/types/result.d.ts.map +0 -1
  150. package/src/core/types/result.js +0 -12
  151. package/src/core/types/result.js.map +0 -1
  152. package/src/email-string.d.ts +0 -42
  153. package/src/email-string.d.ts.map +0 -1
  154. package/src/email-string.js +0 -67
  155. package/src/email-string.js.map +0 -1
  156. package/src/enumerations/disposed-error-type.d.ts +0 -12
  157. package/src/enumerations/disposed-error-type.d.ts.map +0 -1
  158. package/src/enumerations/disposed-error-type.js +0 -13
  159. package/src/enumerations/disposed-error-type.js.map +0 -1
  160. package/src/enumerations/ecies-cipher-suite.d.ts +0 -4
  161. package/src/enumerations/ecies-cipher-suite.d.ts.map +0 -1
  162. package/src/enumerations/ecies-cipher-suite.js +0 -6
  163. package/src/enumerations/ecies-cipher-suite.js.map +0 -1
  164. package/src/enumerations/ecies-encryption-type.d.ts +0 -11
  165. package/src/enumerations/ecies-encryption-type.d.ts.map +0 -1
  166. package/src/enumerations/ecies-encryption-type.js +0 -27
  167. package/src/enumerations/ecies-encryption-type.js.map +0 -1
  168. package/src/enumerations/ecies-error-type.d.ts +0 -44
  169. package/src/enumerations/ecies-error-type.d.ts.map +0 -1
  170. package/src/enumerations/ecies-error-type.js +0 -45
  171. package/src/enumerations/ecies-error-type.js.map +0 -1
  172. package/src/enumerations/ecies-string-key.d.ts +0 -192
  173. package/src/enumerations/ecies-string-key.d.ts.map +0 -1
  174. package/src/enumerations/ecies-string-key.js +0 -199
  175. package/src/enumerations/ecies-string-key.js.map +0 -1
  176. package/src/enumerations/ecies-version.d.ts +0 -4
  177. package/src/enumerations/ecies-version.d.ts.map +0 -1
  178. package/src/enumerations/ecies-version.js +0 -5
  179. package/src/enumerations/ecies-version.js.map +0 -1
  180. package/src/enumerations/guid-brand-type.d.ts +0 -27
  181. package/src/enumerations/guid-brand-type.d.ts.map +0 -1
  182. package/src/enumerations/guid-brand-type.js +0 -28
  183. package/src/enumerations/guid-brand-type.js.map +0 -1
  184. package/src/enumerations/guid-error-type.d.ts +0 -7
  185. package/src/enumerations/guid-error-type.d.ts.map +0 -1
  186. package/src/enumerations/guid-error-type.js +0 -8
  187. package/src/enumerations/guid-error-type.js.map +0 -1
  188. package/src/enumerations/id-provider-error-type.d.ts +0 -43
  189. package/src/enumerations/id-provider-error-type.d.ts.map +0 -1
  190. package/src/enumerations/id-provider-error-type.js +0 -44
  191. package/src/enumerations/id-provider-error-type.js.map +0 -1
  192. package/src/enumerations/index.d.ts +0 -18
  193. package/src/enumerations/index.d.ts.map +0 -1
  194. package/src/enumerations/index.js.map +0 -1
  195. package/src/enumerations/invalid-email-type.d.ts +0 -6
  196. package/src/enumerations/invalid-email-type.d.ts.map +0 -1
  197. package/src/enumerations/invalid-email-type.js +0 -7
  198. package/src/enumerations/invalid-email-type.js.map +0 -1
  199. package/src/enumerations/length-encoding-type.d.ts +0 -7
  200. package/src/enumerations/length-encoding-type.d.ts.map +0 -1
  201. package/src/enumerations/length-encoding-type.js +0 -8
  202. package/src/enumerations/length-encoding-type.js.map +0 -1
  203. package/src/enumerations/length-error-type.d.ts +0 -6
  204. package/src/enumerations/length-error-type.d.ts.map +0 -1
  205. package/src/enumerations/length-error-type.js +0 -7
  206. package/src/enumerations/length-error-type.js.map +0 -1
  207. package/src/enumerations/member-error-type.d.ts +0 -87
  208. package/src/enumerations/member-error-type.d.ts.map +0 -1
  209. package/src/enumerations/member-error-type.js +0 -88
  210. package/src/enumerations/member-error-type.js.map +0 -1
  211. package/src/enumerations/member-type.d.ts.map +0 -1
  212. package/src/enumerations/member-type.js +0 -16
  213. package/src/enumerations/member-type.js.map +0 -1
  214. package/src/enumerations/password-login-error-type.d.ts +0 -5
  215. package/src/enumerations/password-login-error-type.d.ts.map +0 -1
  216. package/src/enumerations/password-login-error-type.js +0 -6
  217. package/src/enumerations/password-login-error-type.js.map +0 -1
  218. package/src/enumerations/pbkdf2-error-type.d.ts +0 -6
  219. package/src/enumerations/pbkdf2-error-type.d.ts.map +0 -1
  220. package/src/enumerations/pbkdf2-error-type.js +0 -7
  221. package/src/enumerations/pbkdf2-error-type.js.map +0 -1
  222. package/src/enumerations/pbkdf2-profile.d.ts +0 -6
  223. package/src/enumerations/pbkdf2-profile.d.ts.map +0 -1
  224. package/src/enumerations/pbkdf2-profile.js +0 -7
  225. package/src/enumerations/pbkdf2-profile.js.map +0 -1
  226. package/src/enumerations/secure-storage-error-type.d.ts +0 -6
  227. package/src/enumerations/secure-storage-error-type.d.ts.map +0 -1
  228. package/src/enumerations/secure-storage-error-type.js +0 -7
  229. package/src/enumerations/secure-storage-error-type.js.map +0 -1
  230. package/src/errors/disposed.d.ts +0 -22
  231. package/src/errors/disposed.d.ts.map +0 -1
  232. package/src/errors/disposed.js +0 -28
  233. package/src/errors/disposed.js.map +0 -1
  234. package/src/errors/ecies.d.ts +0 -52
  235. package/src/errors/ecies.d.ts.map +0 -1
  236. package/src/errors/ecies.js +0 -78
  237. package/src/errors/ecies.js.map +0 -1
  238. package/src/errors/guid.d.ts +0 -49
  239. package/src/errors/guid.d.ts.map +0 -1
  240. package/src/errors/guid.js +0 -96
  241. package/src/errors/guid.js.map +0 -1
  242. package/src/errors/id-provider.d.ts +0 -23
  243. package/src/errors/id-provider.d.ts.map +0 -1
  244. package/src/errors/id-provider.js +0 -29
  245. package/src/errors/id-provider.js.map +0 -1
  246. package/src/errors/index.d.ts.map +0 -1
  247. package/src/errors/index.js +0 -10
  248. package/src/errors/index.js.map +0 -1
  249. package/src/errors/invalid-email.d.ts +0 -8
  250. package/src/errors/invalid-email.d.ts.map +0 -1
  251. package/src/errors/invalid-email.js +0 -15
  252. package/src/errors/invalid-email.js.map +0 -1
  253. package/src/errors/length.d.ts +0 -7
  254. package/src/errors/length.d.ts.map +0 -1
  255. package/src/errors/length.js +0 -11
  256. package/src/errors/length.js.map +0 -1
  257. package/src/errors/member.d.ts +0 -7
  258. package/src/errors/member.d.ts.map +0 -1
  259. package/src/errors/member.js +0 -11
  260. package/src/errors/member.js.map +0 -1
  261. package/src/errors/pbkdf2.d.ts +0 -7
  262. package/src/errors/pbkdf2.d.ts.map +0 -1
  263. package/src/errors/pbkdf2.js +0 -11
  264. package/src/errors/pbkdf2.js.map +0 -1
  265. package/src/errors/secure-storage.d.ts +0 -7
  266. package/src/errors/secure-storage.d.ts.map +0 -1
  267. package/src/errors/secure-storage.js +0 -12
  268. package/src/errors/secure-storage.js.map +0 -1
  269. package/src/errors/simple-ecies.d.ts +0 -6
  270. package/src/errors/simple-ecies.d.ts.map +0 -1
  271. package/src/errors/simple-ecies.js +0 -12
  272. package/src/errors/simple-ecies.js.map +0 -1
  273. package/src/errors/simple-test-error.d.ts +0 -4
  274. package/src/errors/simple-test-error.d.ts.map +0 -1
  275. package/src/errors/simple-test-error.js +0 -7
  276. package/src/errors/simple-test-error.js.map +0 -1
  277. package/src/i18n-setup.d.ts +0 -32
  278. package/src/i18n-setup.d.ts.map +0 -1
  279. package/src/i18n-setup.js +0 -101
  280. package/src/i18n-setup.js.map +0 -1
  281. package/src/index.d.ts +0 -80
  282. package/src/index.d.ts.map +0 -1
  283. package/src/index.js.map +0 -1
  284. package/src/interfaces/checksum-config.d.ts +0 -5
  285. package/src/interfaces/checksum-config.d.ts.map +0 -1
  286. package/src/interfaces/checksum-config.js +0 -2
  287. package/src/interfaces/checksum-config.js.map +0 -1
  288. package/src/interfaces/checksum-consts.d.ts +0 -11
  289. package/src/interfaces/checksum-consts.d.ts.map +0 -1
  290. package/src/interfaces/checksum-consts.js +0 -2
  291. package/src/interfaces/checksum-consts.js.map +0 -1
  292. package/src/interfaces/configuration-provenance.d.ts +0 -43
  293. package/src/interfaces/configuration-provenance.d.ts.map +0 -1
  294. package/src/interfaces/configuration-provenance.js +0 -3
  295. package/src/interfaces/configuration-provenance.js.map +0 -1
  296. package/src/interfaces/constants.d.ts +0 -70
  297. package/src/interfaces/constants.d.ts.map +0 -1
  298. package/src/interfaces/constants.js +0 -2
  299. package/src/interfaces/constants.js.map +0 -1
  300. package/src/interfaces/ecies-config.d.ts +0 -9
  301. package/src/interfaces/ecies-config.d.ts.map +0 -1
  302. package/src/interfaces/ecies-config.js +0 -2
  303. package/src/interfaces/ecies-config.js.map +0 -1
  304. package/src/interfaces/ecies-consts.d.ts +0 -61
  305. package/src/interfaces/ecies-consts.d.ts.map +0 -1
  306. package/src/interfaces/ecies-consts.js +0 -2
  307. package/src/interfaces/ecies-consts.js.map +0 -1
  308. package/src/interfaces/ecies-file-service.d.ts +0 -7
  309. package/src/interfaces/ecies-file-service.d.ts.map +0 -1
  310. package/src/interfaces/ecies-file-service.js +0 -2
  311. package/src/interfaces/ecies-file-service.js.map +0 -1
  312. package/src/interfaces/encrypted-chunk.d.ts +0 -55
  313. package/src/interfaces/encrypted-chunk.d.ts.map +0 -1
  314. package/src/interfaces/encrypted-chunk.js +0 -12
  315. package/src/interfaces/encrypted-chunk.js.map +0 -1
  316. package/src/interfaces/encryption-state.d.ts +0 -18
  317. package/src/interfaces/encryption-state.d.ts.map +0 -1
  318. package/src/interfaces/encryption-state.js +0 -2
  319. package/src/interfaces/encryption-state.js.map +0 -1
  320. package/src/interfaces/frontend-member-operational.d.ts +0 -51
  321. package/src/interfaces/frontend-member-operational.d.ts.map +0 -1
  322. package/src/interfaces/frontend-member-operational.js +0 -2
  323. package/src/interfaces/frontend-member-operational.js.map +0 -1
  324. package/src/interfaces/guid.d.ts +0 -78
  325. package/src/interfaces/guid.d.ts.map +0 -1
  326. package/src/interfaces/guid.js +0 -2
  327. package/src/interfaces/guid.js.map +0 -1
  328. package/src/interfaces/id-provider.d.ts +0 -107
  329. package/src/interfaces/id-provider.d.ts.map +0 -1
  330. package/src/interfaces/id-provider.js +0 -52
  331. package/src/interfaces/id-provider.js.map +0 -1
  332. package/src/interfaces/index.d.ts.map +0 -1
  333. package/src/interfaces/index.js +0 -13
  334. package/src/interfaces/index.js.map +0 -1
  335. package/src/interfaces/invariant.d.ts +0 -46
  336. package/src/interfaces/invariant.d.ts.map +0 -1
  337. package/src/interfaces/invariant.js +0 -18
  338. package/src/interfaces/invariant.js.map +0 -1
  339. package/src/interfaces/library-error.d.ts +0 -23
  340. package/src/interfaces/library-error.d.ts.map +0 -1
  341. package/src/interfaces/library-error.js +0 -2
  342. package/src/interfaces/library-error.js.map +0 -1
  343. package/src/interfaces/member-storage.d.ts.map +0 -1
  344. package/src/interfaces/member-storage.js +0 -2
  345. package/src/interfaces/member-storage.js.map +0 -1
  346. package/src/interfaces/member-with-mnemonic.d.ts.map +0 -1
  347. package/src/interfaces/member-with-mnemonic.js +0 -2
  348. package/src/interfaces/member-with-mnemonic.js.map +0 -1
  349. package/src/interfaces/member.d.ts +0 -55
  350. package/src/interfaces/member.d.ts.map +0 -1
  351. package/src/interfaces/member.js +0 -2
  352. package/src/interfaces/member.js.map +0 -1
  353. package/src/interfaces/multi-recipient-chunk.d.ts +0 -54
  354. package/src/interfaces/multi-recipient-chunk.d.ts.map +0 -1
  355. package/src/interfaces/multi-recipient-chunk.js +0 -11
  356. package/src/interfaces/multi-recipient-chunk.js.map +0 -1
  357. package/src/interfaces/pbkdf2-config.d.ts +0 -7
  358. package/src/interfaces/pbkdf2-config.d.ts.map +0 -1
  359. package/src/interfaces/pbkdf2-config.js +0 -2
  360. package/src/interfaces/pbkdf2-config.js.map +0 -1
  361. package/src/interfaces/pbkdf2-consts.d.ts +0 -9
  362. package/src/interfaces/pbkdf2-consts.d.ts.map +0 -1
  363. package/src/interfaces/pbkdf2-consts.js +0 -2
  364. package/src/interfaces/pbkdf2-consts.js.map +0 -1
  365. package/src/interfaces/pbkdf2-result.d.ts +0 -6
  366. package/src/interfaces/pbkdf2-result.d.ts.map +0 -1
  367. package/src/interfaces/pbkdf2-result.js +0 -2
  368. package/src/interfaces/pbkdf2-result.js.map +0 -1
  369. package/src/interfaces/stream-config.d.ts +0 -14
  370. package/src/interfaces/stream-config.d.ts.map +0 -1
  371. package/src/interfaces/stream-config.js +0 -8
  372. package/src/interfaces/stream-config.js.map +0 -1
  373. package/src/interfaces/stream-header.d.ts +0 -29
  374. package/src/interfaces/stream-header.d.ts.map +0 -1
  375. package/src/interfaces/stream-header.js +0 -9
  376. package/src/interfaces/stream-header.js.map +0 -1
  377. package/src/interfaces/stream-progress.d.ts +0 -33
  378. package/src/interfaces/stream-progress.d.ts.map +0 -1
  379. package/src/interfaces/stream-progress.js +0 -2
  380. package/src/interfaces/stream-progress.js.map +0 -1
  381. package/src/lib/configuration-provenance-utils.d.ts +0 -11
  382. package/src/lib/configuration-provenance-utils.d.ts.map +0 -1
  383. package/src/lib/configuration-provenance-utils.js +0 -23
  384. package/src/lib/configuration-provenance-utils.js.map +0 -1
  385. package/src/lib/crypto-container.d.ts +0 -25
  386. package/src/lib/crypto-container.d.ts.map +0 -1
  387. package/src/lib/crypto-container.js +0 -46
  388. package/src/lib/crypto-container.js.map +0 -1
  389. package/src/lib/guid.d.ts +0 -344
  390. package/src/lib/guid.d.ts.map +0 -1
  391. package/src/lib/guid.js +0 -914
  392. package/src/lib/guid.js.map +0 -1
  393. package/src/lib/id-providers/custom-provider.d.ts +0 -46
  394. package/src/lib/id-providers/custom-provider.d.ts.map +0 -1
  395. package/src/lib/id-providers/custom-provider.js +0 -85
  396. package/src/lib/id-providers/custom-provider.js.map +0 -1
  397. package/src/lib/id-providers/guidv4-provider.d.ts +0 -56
  398. package/src/lib/id-providers/guidv4-provider.d.ts.map +0 -1
  399. package/src/lib/id-providers/guidv4-provider.js +0 -122
  400. package/src/lib/id-providers/guidv4-provider.js.map +0 -1
  401. package/src/lib/id-providers/index.d.ts.map +0 -1
  402. package/src/lib/id-providers/index.js +0 -29
  403. package/src/lib/id-providers/index.js.map +0 -1
  404. package/src/lib/id-providers/objectid-provider.d.ts +0 -43
  405. package/src/lib/id-providers/objectid-provider.d.ts.map +0 -1
  406. package/src/lib/id-providers/objectid-provider.js +0 -104
  407. package/src/lib/id-providers/objectid-provider.js.map +0 -1
  408. package/src/lib/id-providers/uuid-provider.d.ts +0 -52
  409. package/src/lib/id-providers/uuid-provider.d.ts.map +0 -1
  410. package/src/lib/id-providers/uuid-provider.js +0 -110
  411. package/src/lib/id-providers/uuid-provider.js.map +0 -1
  412. package/src/lib/index.d.ts +0 -6
  413. package/src/lib/index.d.ts.map +0 -1
  414. package/src/lib/index.js.map +0 -1
  415. package/src/lib/invariant-validator.d.ts +0 -59
  416. package/src/lib/invariant-validator.d.ts.map +0 -1
  417. package/src/lib/invariant-validator.js +0 -97
  418. package/src/lib/invariant-validator.js.map +0 -1
  419. package/src/lib/invariants/encryption-algorithm-consistency.d.ts +0 -17
  420. package/src/lib/invariants/encryption-algorithm-consistency.d.ts.map +0 -1
  421. package/src/lib/invariants/encryption-algorithm-consistency.js +0 -49
  422. package/src/lib/invariants/encryption-algorithm-consistency.js.map +0 -1
  423. package/src/lib/invariants/index.d.ts +0 -4
  424. package/src/lib/invariants/index.d.ts.map +0 -1
  425. package/src/lib/invariants/index.js.map +0 -1
  426. package/src/lib/invariants/pbkdf2-profiles-validity.d.ts +0 -16
  427. package/src/lib/invariants/pbkdf2-profiles-validity.d.ts.map +0 -1
  428. package/src/lib/invariants/pbkdf2-profiles-validity.js +0 -58
  429. package/src/lib/invariants/pbkdf2-profiles-validity.js.map +0 -1
  430. package/src/lib/invariants/recipient-id-consistency.d.ts +0 -18
  431. package/src/lib/invariants/recipient-id-consistency.d.ts.map +0 -1
  432. package/src/lib/invariants/recipient-id-consistency.js +0 -31
  433. package/src/lib/invariants/recipient-id-consistency.js.map +0 -1
  434. package/src/lib/multi-recipient-chunk-utils.d.ts +0 -38
  435. package/src/lib/multi-recipient-chunk-utils.d.ts.map +0 -1
  436. package/src/lib/multi-recipient-chunk-utils.js +0 -41
  437. package/src/lib/multi-recipient-chunk-utils.js.map +0 -1
  438. package/src/member.d.ts +0 -92
  439. package/src/member.d.ts.map +0 -1
  440. package/src/member.js +0 -322
  441. package/src/member.js.map +0 -1
  442. package/src/pbkdf2-profiles.d.ts.map +0 -1
  443. package/src/pbkdf2-profiles.js +0 -2
  444. package/src/pbkdf2-profiles.js.map +0 -1
  445. package/src/phone-number.d.ts +0 -6
  446. package/src/phone-number.d.ts.map +0 -1
  447. package/src/phone-number.js +0 -18
  448. package/src/phone-number.js.map +0 -1
  449. package/src/regexes.d.ts +0 -7
  450. package/src/regexes.d.ts.map +0 -1
  451. package/src/regexes.js +0 -7
  452. package/src/regexes.js.map +0 -1
  453. package/src/secure-buffer.d.ts +0 -61
  454. package/src/secure-buffer.d.ts.map +0 -1
  455. package/src/secure-buffer.js +0 -201
  456. package/src/secure-buffer.js.map +0 -1
  457. package/src/secure-string.d.ts +0 -46
  458. package/src/secure-string.d.ts.map +0 -1
  459. package/src/secure-string.js +0 -206
  460. package/src/secure-string.js.map +0 -1
  461. package/src/services/aes-gcm.d.ts +0 -57
  462. package/src/services/aes-gcm.d.ts.map +0 -1
  463. package/src/services/aes-gcm.js +0 -142
  464. package/src/services/aes-gcm.js.map +0 -1
  465. package/src/services/chunk-processor.d.ts +0 -31
  466. package/src/services/chunk-processor.d.ts.map +0 -1
  467. package/src/services/chunk-processor.js +0 -145
  468. package/src/services/chunk-processor.js.map +0 -1
  469. package/src/services/ecies/crypto-core.d.ts +0 -72
  470. package/src/services/ecies/crypto-core.d.ts.map +0 -1
  471. package/src/services/ecies/crypto-core.js +0 -205
  472. package/src/services/ecies/crypto-core.js.map +0 -1
  473. package/src/services/ecies/example.d.ts +0 -25
  474. package/src/services/ecies/example.d.ts.map +0 -1
  475. package/src/services/ecies/example.js +0 -121
  476. package/src/services/ecies/example.js.map +0 -1
  477. package/src/services/ecies/file.d.ts +0 -18
  478. package/src/services/ecies/file.d.ts.map +0 -1
  479. package/src/services/ecies/file.js +0 -106
  480. package/src/services/ecies/file.js.map +0 -1
  481. package/src/services/ecies/index.d.ts +0 -38
  482. package/src/services/ecies/index.d.ts.map +0 -1
  483. package/src/services/ecies/index.js.map +0 -1
  484. package/src/services/ecies/integration.d.ts +0 -59
  485. package/src/services/ecies/integration.d.ts.map +0 -1
  486. package/src/services/ecies/integration.js +0 -167
  487. package/src/services/ecies/integration.js.map +0 -1
  488. package/src/services/ecies/interfaces.d.ts +0 -54
  489. package/src/services/ecies/interfaces.d.ts.map +0 -1
  490. package/src/services/ecies/interfaces.js +0 -5
  491. package/src/services/ecies/interfaces.js.map +0 -1
  492. package/src/services/ecies/manual-test.d.ts +0 -29
  493. package/src/services/ecies/manual-test.d.ts.map +0 -1
  494. package/src/services/ecies/manual-test.js +0 -163
  495. package/src/services/ecies/manual-test.js.map +0 -1
  496. package/src/services/ecies/multi-recipient.d.ts +0 -56
  497. package/src/services/ecies/multi-recipient.d.ts.map +0 -1
  498. package/src/services/ecies/multi-recipient.js +0 -344
  499. package/src/services/ecies/multi-recipient.js.map +0 -1
  500. package/src/services/ecies/service.d.ts +0 -120
  501. package/src/services/ecies/service.d.ts.map +0 -1
  502. package/src/services/ecies/service.js +0 -210
  503. package/src/services/ecies/service.js.map +0 -1
  504. package/src/services/ecies/signature.d.ts +0 -27
  505. package/src/services/ecies/signature.d.ts.map +0 -1
  506. package/src/services/ecies/signature.js +0 -72
  507. package/src/services/ecies/signature.js.map +0 -1
  508. package/src/services/ecies/single-recipient.d.ts +0 -46
  509. package/src/services/ecies/single-recipient.d.ts.map +0 -1
  510. package/src/services/ecies/single-recipient.js +0 -322
  511. package/src/services/ecies/single-recipient.js.map +0 -1
  512. package/src/services/encryption-stream.d.ts +0 -71
  513. package/src/services/encryption-stream.d.ts.map +0 -1
  514. package/src/services/encryption-stream.js +0 -295
  515. package/src/services/encryption-stream.js.map +0 -1
  516. package/src/services/index.d.ts +0 -11
  517. package/src/services/index.d.ts.map +0 -1
  518. package/src/services/index.js.map +0 -1
  519. package/src/services/multi-recipient-processor.d.ts +0 -35
  520. package/src/services/multi-recipient-processor.d.ts.map +0 -1
  521. package/src/services/multi-recipient-processor.js +0 -289
  522. package/src/services/multi-recipient-processor.js.map +0 -1
  523. package/src/services/password-login.d.ts +0 -47
  524. package/src/services/password-login.d.ts.map +0 -1
  525. package/src/services/password-login.js +0 -115
  526. package/src/services/password-login.js.map +0 -1
  527. package/src/services/pbkdf2.d.ts +0 -54
  528. package/src/services/pbkdf2.d.ts.map +0 -1
  529. package/src/services/pbkdf2.js +0 -108
  530. package/src/services/pbkdf2.js.map +0 -1
  531. package/src/services/progress-tracker.d.ts +0 -23
  532. package/src/services/progress-tracker.d.ts.map +0 -1
  533. package/src/services/progress-tracker.js +0 -103
  534. package/src/services/progress-tracker.js.map +0 -1
  535. package/src/services/resumable-encryption.d.ts +0 -19
  536. package/src/services/resumable-encryption.d.ts.map +0 -1
  537. package/src/services/resumable-encryption.js +0 -105
  538. package/src/services/resumable-encryption.js.map +0 -1
  539. package/src/services/xor.d.ts +0 -37
  540. package/src/services/xor.d.ts.map +0 -1
  541. package/src/services/xor.js +0 -63
  542. package/src/services/xor.js.map +0 -1
  543. package/src/test-mocks/index.d.ts +0 -2
  544. package/src/test-mocks/index.d.ts.map +0 -1
  545. package/src/test-mocks/index.js +0 -2
  546. package/src/test-mocks/index.js.map +0 -1
  547. package/src/test-mocks/mock-frontend-member.d.ts +0 -85
  548. package/src/test-mocks/mock-frontend-member.d.ts.map +0 -1
  549. package/src/test-mocks/mock-frontend-member.js +0 -190
  550. package/src/test-mocks/mock-frontend-member.js.map +0 -1
  551. package/src/testing.d.ts +0 -2
  552. package/src/testing.d.ts.map +0 -1
  553. package/src/testing.js.map +0 -1
  554. package/src/translations/de.d.ts +0 -4
  555. package/src/translations/de.d.ts.map +0 -1
  556. package/src/translations/de.js.map +0 -1
  557. package/src/translations/en-US.d.ts +0 -4
  558. package/src/translations/en-US.d.ts.map +0 -1
  559. package/src/translations/en-US.js.map +0 -1
  560. package/src/translations/es.d.ts +0 -4
  561. package/src/translations/es.d.ts.map +0 -1
  562. package/src/translations/es.js.map +0 -1
  563. package/src/translations/fr.d.ts +0 -4
  564. package/src/translations/fr.d.ts.map +0 -1
  565. package/src/translations/fr.js.map +0 -1
  566. package/src/translations/ja.d.ts +0 -4
  567. package/src/translations/ja.d.ts.map +0 -1
  568. package/src/translations/ja.js.map +0 -1
  569. package/src/translations/uk.d.ts +0 -4
  570. package/src/translations/uk.d.ts.map +0 -1
  571. package/src/translations/uk.js.map +0 -1
  572. package/src/translations/zh-cn.d.ts +0 -4
  573. package/src/translations/zh-cn.d.ts.map +0 -1
  574. package/src/translations/zh-cn.js.map +0 -1
  575. package/src/types/deep-partial.d.ts +0 -4
  576. package/src/types/deep-partial.d.ts.map +0 -1
  577. package/src/types/deep-partial.js +0 -2
  578. package/src/types/deep-partial.js.map +0 -1
  579. package/src/types.d.ts.map +0 -1
  580. package/src/types.js +0 -2
  581. package/src/types.js.map +0 -1
  582. package/src/utils/encryption-type-utils.d.ts +0 -29
  583. package/src/utils/encryption-type-utils.d.ts.map +0 -1
  584. package/src/utils/encryption-type-utils.js +0 -61
  585. package/src/utils/encryption-type-utils.js.map +0 -1
  586. package/src/utils.d.ts +0 -68
  587. package/src/utils.d.ts.map +0 -1
  588. package/src/utils.js +0 -273
  589. package/src/utils.js.map +0 -1
@@ -0,0 +1,545 @@
1
+ import { IECIESConstants } from '../../interfaces/ecies-consts';
2
+ import { Constants } from '../../constants';
3
+ import { IECIESConfig } from '../../interfaces/ecies-config';
4
+ import { concatUint8Arrays } from '../../utils';
5
+ import { AESGCMService } from '../aes-gcm';
6
+ import { EciesCryptoCore } from './crypto-core';
7
+ import {
8
+ IMultiEncryptedMessage,
9
+ IMultiEncryptedParsedHeader,
10
+ IMultiRecipient,
11
+ } from './interfaces';
12
+ import { EciesComponentId, getEciesI18nEngine } from '../../i18n-setup';
13
+ import { EciesStringKey } from '../../enumerations';
14
+ import { EciesVersionEnum } from '../../enumerations/ecies-version';
15
+ import { EciesCipherSuiteEnum } from '../../enumerations/ecies-cipher-suite';
16
+ import { EciesEncryptionTypeEnum } from '../../enumerations/ecies-encryption-type';
17
+
18
+ /**
19
+ * Browser-compatible multi-recipient ECIES encryption/decryption
20
+ */
21
+ export class EciesMultiRecipient {
22
+ protected readonly cryptoCore: EciesCryptoCore;
23
+ protected readonly eciesConsts: IECIESConstants;
24
+
25
+ constructor(config: IECIESConfig, eciesParams: IECIESConstants = Constants.ECIES) {
26
+ this.cryptoCore = new EciesCryptoCore(config, eciesParams);
27
+ this.eciesConsts = eciesParams;
28
+ }
29
+
30
+ /**
31
+ * Get the header size for multi-recipient encryption
32
+ */
33
+ public getHeaderSize(recipientCount: number): number {
34
+ return (
35
+ this.eciesConsts.VERSION_SIZE +
36
+ this.eciesConsts.CIPHER_SUITE_SIZE +
37
+ this.eciesConsts.ENCRYPTION_TYPE_SIZE +
38
+ this.eciesConsts.PUBLIC_KEY_LENGTH + // Shared ephemeral public key
39
+ this.eciesConsts.MULTIPLE.DATA_LENGTH_SIZE +
40
+ this.eciesConsts.MULTIPLE.RECIPIENT_COUNT_SIZE +
41
+ recipientCount * this.eciesConsts.MULTIPLE.RECIPIENT_ID_SIZE +
42
+ recipientCount * this.eciesConsts.MULTIPLE.ENCRYPTED_KEY_SIZE
43
+ );
44
+ }
45
+
46
+ /**
47
+ * Encrypt a message symmetric key with a public key
48
+ * @param receiverPublicKey The public key of the receiver
49
+ * @param messageSymmetricKey The message to encrypt
50
+ * @param ephemeralPrivateKey The ephemeral private key to use for encryption
51
+ * @param aad Additional Authenticated Data (optional)
52
+ * @returns The encrypted message (IV + Tag + EncryptedKey)
53
+ */
54
+ public async encryptKey(
55
+ receiverPublicKey: Uint8Array,
56
+ messageSymmetricKey: Uint8Array,
57
+ ephemeralPrivateKey: Uint8Array,
58
+ aad?: Uint8Array,
59
+ ): Promise<Uint8Array> {
60
+ const sharedSecret = await this.cryptoCore.computeSharedSecret(
61
+ ephemeralPrivateKey,
62
+ receiverPublicKey,
63
+ );
64
+
65
+ // Use HKDF to derive the key
66
+ const symKey = this.cryptoCore.deriveSharedKey(
67
+ sharedSecret,
68
+ new Uint8Array(0), // No salt
69
+ new TextEncoder().encode('ecies-v2-key-derivation'), // Info
70
+ this.eciesConsts.SYMMETRIC.KEY_SIZE
71
+ );
72
+
73
+ const encryptResult = await AESGCMService.encrypt(
74
+ messageSymmetricKey,
75
+ symKey,
76
+ true,
77
+ this.eciesConsts,
78
+ aad
79
+ );
80
+ const { encrypted, iv } = encryptResult;
81
+ const authTag = encryptResult.tag;
82
+
83
+ if (!authTag) {
84
+ const engine = getEciesI18nEngine();
85
+ throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_ECIESError_AuthenticationTagIsRequiredForKeyEncryption));
86
+ }
87
+
88
+ return concatUint8Arrays(
89
+ iv,
90
+ authTag,
91
+ encrypted,
92
+ );
93
+ }
94
+
95
+ /**
96
+ * Decrypts symmetric key encrypted with ECIES
97
+ * @param privateKey The private key to decrypt the data
98
+ * @param encryptedKey The data to decrypt
99
+ * @param ephemeralPublicKey The ephemeral public key from the header
100
+ * @param aad Additional Authenticated Data (optional)
101
+ * @returns The decrypted data buffer
102
+ */
103
+ public async decryptKey(
104
+ privateKey: Uint8Array,
105
+ encryptedKey: Uint8Array,
106
+ ephemeralPublicKey: Uint8Array,
107
+ aad?: Uint8Array,
108
+ ): Promise<Uint8Array> {
109
+ if (encryptedKey.length !== this.eciesConsts.MULTIPLE.ENCRYPTED_KEY_SIZE) {
110
+ const engine = getEciesI18nEngine();
111
+ throw new Error(engine.translate(
112
+ EciesComponentId,
113
+ EciesStringKey.Error_ECIESError_InvalidEncryptedKeyLengthTemplate, {keySize: this.eciesConsts.MULTIPLE.ENCRYPTED_KEY_SIZE, encryptedKeyLength: encryptedKey.length}));
114
+ }
115
+
116
+ const iv = encryptedKey.slice(
117
+ 0,
118
+ this.eciesConsts.IV_SIZE,
119
+ );
120
+ const authTag = encryptedKey.slice(
121
+ this.eciesConsts.IV_SIZE,
122
+ this.eciesConsts.IV_SIZE + this.eciesConsts.AUTH_TAG_SIZE,
123
+ );
124
+ const encrypted = encryptedKey.slice(
125
+ this.eciesConsts.IV_SIZE + this.eciesConsts.AUTH_TAG_SIZE,
126
+ );
127
+
128
+ const sharedSecret = await this.cryptoCore.computeSharedSecret(
129
+ privateKey,
130
+ ephemeralPublicKey,
131
+ );
132
+
133
+ // Use HKDF to derive the key
134
+ const symKey = this.cryptoCore.deriveSharedKey(
135
+ sharedSecret,
136
+ new Uint8Array(0), // No salt
137
+ new TextEncoder().encode('ecies-v2-key-derivation'), // Info
138
+ this.eciesConsts.SYMMETRIC.KEY_SIZE
139
+ );
140
+
141
+ const encryptedWithTag = AESGCMService.combineEncryptedDataAndTag(
142
+ encrypted,
143
+ authTag,
144
+ );
145
+
146
+ try {
147
+ const decrypted = await AESGCMService.decrypt(
148
+ iv,
149
+ encryptedWithTag,
150
+ symKey,
151
+ true,
152
+ this.eciesConsts,
153
+ aad
154
+ );
155
+ if (decrypted.length !== this.eciesConsts.SYMMETRIC.KEY_SIZE) {
156
+ const engine = getEciesI18nEngine();
157
+ throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_ECIESError_InvalidDataLength));
158
+ }
159
+ return decrypted;
160
+ } catch (error) {
161
+ console.error('Failed to decrypt key:', error);
162
+ const engine = getEciesI18nEngine();
163
+ throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_ECIESError_FailedToDecryptKey));
164
+ }
165
+ }
166
+
167
+ /**
168
+ * Encrypt a message for multiple recipients
169
+ */
170
+ public async encryptMultiple(
171
+ recipients: IMultiRecipient[],
172
+ message: Uint8Array,
173
+ preamble: Uint8Array = new Uint8Array(0),
174
+ senderPrivateKey?: Uint8Array,
175
+ ): Promise<IMultiEncryptedMessage> {
176
+ const engine = getEciesI18nEngine();
177
+ if (recipients.length > this.eciesConsts.MULTIPLE.MAX_RECIPIENTS) {
178
+ throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_ECIESError_TooManyRecipientsTemplate, { recipientsCount: recipients.length }));
179
+ }
180
+
181
+ // Sign-then-Encrypt: If sender key provided, sign the message and prepend signature
182
+ let messageToEncrypt = message;
183
+ if (senderPrivateKey) {
184
+ const signature = this.cryptoCore.sign(senderPrivateKey, message);
185
+ messageToEncrypt = concatUint8Arrays(signature, message);
186
+ }
187
+
188
+ if (messageToEncrypt.length > this.eciesConsts.MAX_RAW_DATA_SIZE) {
189
+ throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_ECIESError_MessageTooLargeTemplate, { length: messageToEncrypt.length }));
190
+ }
191
+
192
+ // Generate symmetric key
193
+ const symmetricKey = crypto.getRandomValues(
194
+ new Uint8Array(this.eciesConsts.SYMMETRIC.KEY_SIZE),
195
+ );
196
+
197
+ // Generate ONE ephemeral key pair for all recipients
198
+ const ephemeralKeyPair = await this.cryptoCore.generateEphemeralKeyPair();
199
+
200
+ // Encrypt symmetric key for each recipient
201
+ const recipientIds: Uint8Array[] = [];
202
+ const recipientKeys: Uint8Array[] = [];
203
+
204
+ for (const recipient of recipients) {
205
+ // Use Recipient ID as AAD for key encryption to bind key to recipient
206
+ const encryptedKey = await this.encryptKey(
207
+ recipient.publicKey,
208
+ symmetricKey,
209
+ ephemeralKeyPair.privateKey,
210
+ recipient.id
211
+ );
212
+
213
+ recipientIds.push(recipient.id);
214
+ recipientKeys.push(encryptedKey);
215
+ }
216
+
217
+ const headerSize = this.getHeaderSize(recipients.length);
218
+
219
+ // Build the header to use as AAD for message encryption
220
+ // We need to construct a temporary object to build the header
221
+ const tempHeaderData: IMultiEncryptedMessage = {
222
+ dataLength: messageToEncrypt.length,
223
+ recipientCount: recipients.length,
224
+ recipientIds,
225
+ recipientKeys,
226
+ encryptedMessage: new Uint8Array(0), // Placeholder
227
+ headerSize,
228
+ ephemeralPublicKey: ephemeralKeyPair.publicKey,
229
+ };
230
+
231
+ const headerBytes = this.buildHeader(tempHeaderData);
232
+
233
+ // Encrypt message with symmetric key, using Header as AAD
234
+ const encryptResult = await AESGCMService.encrypt(
235
+ messageToEncrypt,
236
+ symmetricKey,
237
+ true,
238
+ this.eciesConsts,
239
+ headerBytes // Bind header to ciphertext
240
+ );
241
+ const { encrypted, iv } = encryptResult;
242
+ const authTag = encryptResult.tag;
243
+
244
+ if (!authTag) {
245
+ const engine = getEciesI18nEngine();
246
+ throw new Error(
247
+ engine.translate(EciesComponentId, EciesStringKey.Error_ECIESError_AuthenticationTagIsRequiredForMultiRecipientECIESEncryption),
248
+ );
249
+ }
250
+
251
+ // Create stored message: preamble + iv + authTag + encrypted
252
+ const storedMessage = concatUint8Arrays(preamble, iv, authTag, encrypted);
253
+
254
+ return {
255
+ dataLength: messageToEncrypt.length,
256
+ recipientCount: recipients.length,
257
+ recipientIds,
258
+ recipientKeys,
259
+ encryptedMessage: storedMessage,
260
+ headerSize,
261
+ ephemeralPublicKey: ephemeralKeyPair.publicKey,
262
+ };
263
+ }
264
+
265
+ /**
266
+ * Decrypt a multi-recipient message for a specific recipient
267
+ */
268
+ public async decryptMultipleForRecipient(
269
+ encryptedData: IMultiEncryptedMessage,
270
+ recipientId: Uint8Array,
271
+ privateKey: Uint8Array,
272
+ senderPublicKey?: Uint8Array,
273
+ ): Promise<Uint8Array> {
274
+ // Find recipient's encrypted key
275
+ const recipientIndex = encryptedData.recipientIds.findIndex((id) =>
276
+ this.arraysEqual(id, recipientId),
277
+ );
278
+
279
+ if (recipientIndex === -1) {
280
+ const engine = getEciesI18nEngine();
281
+ throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_ECIESError_RecipientNotFound));
282
+ }
283
+
284
+ const encryptedKey = encryptedData.recipientKeys[recipientIndex];
285
+
286
+ // Decrypt the symmetric key using the shared ephemeral public key
287
+ if (!encryptedData.ephemeralPublicKey) {
288
+ const engine = getEciesI18nEngine();
289
+ throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_ECIESError_MissingEphemeralPublicKey));
290
+ }
291
+
292
+ // Use Recipient ID as AAD for key decryption
293
+ const symmetricKey = await this.decryptKey(
294
+ privateKey,
295
+ encryptedKey,
296
+ encryptedData.ephemeralPublicKey,
297
+ recipientId
298
+ );
299
+
300
+ // Rebuild header to use as AAD
301
+ const headerBytes = this.buildHeader(encryptedData);
302
+
303
+ // Extract components from encrypted message
304
+ let offset = 0;
305
+ const iv = encryptedData.encryptedMessage.slice(
306
+ offset,
307
+ offset + this.eciesConsts.IV_SIZE,
308
+ );
309
+ offset += this.eciesConsts.IV_SIZE;
310
+
311
+ const authTag = encryptedData.encryptedMessage.slice(
312
+ offset,
313
+ offset + this.eciesConsts.AUTH_TAG_SIZE,
314
+ );
315
+ offset += this.eciesConsts.AUTH_TAG_SIZE;
316
+
317
+ const encrypted = encryptedData.encryptedMessage.slice(offset);
318
+
319
+ // AES-GCM provides authentication via auth tag (no separate CRC needed)
320
+
321
+ // Decrypt with symmetric key and Header as AAD
322
+ const encryptedWithTag = AESGCMService.combineEncryptedDataAndTag(
323
+ encrypted,
324
+ authTag,
325
+ );
326
+
327
+ const decrypted = await AESGCMService.decrypt(
328
+ iv,
329
+ encryptedWithTag,
330
+ symmetricKey,
331
+ true,
332
+ this.eciesConsts,
333
+ headerBytes
334
+ );
335
+
336
+ // Verify length
337
+ if (decrypted.length !== encryptedData.dataLength) {
338
+ const engine = getEciesI18nEngine();
339
+ throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_ECIESError_DecryptedDataLengthMismatch));
340
+ }
341
+
342
+ // If sender public key is provided, verify signature
343
+ if (senderPublicKey) {
344
+ // Expect [Signature (64)][Message]
345
+ if (decrypted.length < 64) {
346
+ throw new Error('Decrypted data too short to contain signature');
347
+ }
348
+ const signature = decrypted.slice(0, 64);
349
+ const message = decrypted.slice(64);
350
+
351
+ const isValid = this.cryptoCore.verify(senderPublicKey, message, signature);
352
+ if (!isValid) {
353
+ throw new Error('Invalid sender signature');
354
+ }
355
+
356
+ return message;
357
+ }
358
+
359
+ return decrypted;
360
+ }
361
+
362
+ /**
363
+ * Build header for multi-recipient message
364
+ */
365
+ public buildHeader(data: IMultiEncryptedMessage): Uint8Array {
366
+ if (data.recipientIds.length !== data.recipientKeys.length) {
367
+ const engine = getEciesI18nEngine();
368
+ throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_ECIESError_RecipientCountMismatch));
369
+ }
370
+
371
+ if (data.dataLength < 0 || data.dataLength > this.eciesConsts.MAX_RAW_DATA_SIZE) {
372
+ const engine = getEciesI18nEngine();
373
+ throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_ECIESError_InvalidDataLength));
374
+ }
375
+
376
+ const versionArray = new Uint8Array([EciesVersionEnum.V1]);
377
+ const cipherSuiteArray = new Uint8Array([EciesCipherSuiteEnum.Secp256k1_Aes256Gcm_Sha256]);
378
+ const encryptionTypeArray = new Uint8Array([EciesEncryptionTypeEnum.Multiple]);
379
+
380
+ if (!data.ephemeralPublicKey) {
381
+ const engine = getEciesI18nEngine();
382
+ throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_ECIESError_MissingEphemeralPublicKey));
383
+ }
384
+
385
+ // Data length (8 bytes)
386
+ // We use the most significant byte (MSB) to store the recipient ID size
387
+ // This allows parsing the header without knowing the configured ID provider
388
+ // Max data size is 2^53-1, so the top byte is always 0 for valid data lengths
389
+ const recipientIdSize = this.eciesConsts.MULTIPLE.RECIPIENT_ID_SIZE;
390
+ if (recipientIdSize > 255) {
391
+ const engine = getEciesI18nEngine();
392
+ throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_ECIESError_RecipientIdSizeTooLargeTemplate, { size: recipientIdSize }));
393
+ }
394
+
395
+ const dataLengthBigInt = BigInt(data.dataLength);
396
+ const recipientIdSizeBigInt = BigInt(recipientIdSize);
397
+ const combinedLength = (recipientIdSizeBigInt << 56n) | dataLengthBigInt;
398
+
399
+ const dataLengthUint8Array = new Uint8Array(8);
400
+ new DataView(dataLengthUint8Array.buffer).setBigUint64(
401
+ 0,
402
+ combinedLength,
403
+ false,
404
+ );
405
+
406
+ // Recipient count (2 bytes)
407
+ const recipientCountUint8Array = new Uint8Array(2);
408
+ new DataView(recipientCountUint8Array.buffer).setUint16(
409
+ 0,
410
+ data.recipientIds.length,
411
+ false,
412
+ );
413
+
414
+ // Recipient IDs
415
+ const recipientIdsUint8Array = concatUint8Arrays(...data.recipientIds);
416
+
417
+ // Encrypted keys
418
+ const encryptedKeysUint8Array = concatUint8Arrays(...data.recipientKeys);
419
+
420
+ return concatUint8Arrays(
421
+ versionArray,
422
+ cipherSuiteArray,
423
+ encryptionTypeArray,
424
+ data.ephemeralPublicKey,
425
+ dataLengthUint8Array,
426
+ recipientCountUint8Array,
427
+ recipientIdsUint8Array,
428
+ encryptedKeysUint8Array,
429
+ );
430
+ }
431
+
432
+ /**
433
+ * Parse multi-recipient header
434
+ */
435
+ public parseHeader(data: Uint8Array): IMultiEncryptedParsedHeader {
436
+ const engine = getEciesI18nEngine();
437
+ // minimum: 1 (ver) + 1 (suite) + 1 (type) + 33 (pubkey) + 8 (len) + 2 (count) = 46
438
+ if (data.length < 46) {
439
+ throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_ECIESError_DataTooShortForMultiRecipientHeader));
440
+ }
441
+
442
+ let offset = 0;
443
+ const view = new DataView(data.buffer, data.byteOffset);
444
+
445
+ // Read Version
446
+ const version = data[offset];
447
+ offset += this.eciesConsts.VERSION_SIZE;
448
+ if (version !== EciesVersionEnum.V1) {
449
+ throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_ECIESError_InvalidVersionTemplate, { version }));
450
+ }
451
+
452
+ // Read CipherSuite
453
+ const cipherSuite = data[offset];
454
+ offset += this.eciesConsts.CIPHER_SUITE_SIZE;
455
+ if (cipherSuite !== EciesCipherSuiteEnum.Secp256k1_Aes256Gcm_Sha256) {
456
+ throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_ECIESError_InvalidCipherSuiteTemplate, { cipherSuite }));
457
+ }
458
+
459
+ // Read Encryption Type
460
+ const encryptionType = data[offset];
461
+ offset += this.eciesConsts.ENCRYPTION_TYPE_SIZE;
462
+ if (encryptionType !== EciesEncryptionTypeEnum.Multiple) {
463
+ throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_ECIESError_InvalidEncryptionTypeTemplate, { encryptionType: encryptionType.toString(16) }));
464
+ }
465
+
466
+ // Read Ephemeral Public Key
467
+ const ephemeralPublicKey = data.slice(offset, offset + this.eciesConsts.PUBLIC_KEY_LENGTH);
468
+ offset += this.eciesConsts.PUBLIC_KEY_LENGTH;
469
+
470
+ // Read data length and recipient ID size
471
+ const combinedLength = view.getBigUint64(offset, false);
472
+ offset += 8;
473
+
474
+ // Extract recipient ID size from MSB (top 8 bits)
475
+ const storedRecipientIdSize = Number(combinedLength >> 56n);
476
+
477
+ // Extract data length from lower 56 bits
478
+ const dataLength = Number(combinedLength & 0x00FFFFFFFFFFFFFFn);
479
+
480
+ if (dataLength <= 0 || dataLength > this.eciesConsts.MAX_RAW_DATA_SIZE) {
481
+ throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_ECIESError_InvalidDataLength));
482
+ }
483
+
484
+ // Use stored recipient ID size if available (non-legacy), otherwise fallback to config
485
+ const recipientIdSize = storedRecipientIdSize > 0
486
+ ? storedRecipientIdSize
487
+ : this.eciesConsts.MULTIPLE.RECIPIENT_ID_SIZE;
488
+
489
+ // Read recipient count
490
+ const recipientCount = view.getUint16(offset, false);
491
+ offset += 2;
492
+
493
+ if (recipientCount <= 0 || recipientCount > this.eciesConsts.MULTIPLE.MAX_RECIPIENTS) {
494
+ throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_ECIESError_InvalidRecipientCount));
495
+ }
496
+
497
+ // Read recipient IDs
498
+ const recipientIds: Uint8Array[] = [];
499
+ for (let i = 0; i < recipientCount; i++) {
500
+ recipientIds.push(
501
+ data.slice(offset, offset + recipientIdSize),
502
+ );
503
+ offset += recipientIdSize;
504
+ }
505
+
506
+ // Read encrypted keys
507
+ const recipientKeys: Uint8Array[] = [];
508
+ for (let i = 0; i < recipientCount; i++) {
509
+ recipientKeys.push(
510
+ data.slice(offset, offset + this.eciesConsts.MULTIPLE.ENCRYPTED_KEY_SIZE),
511
+ );
512
+ offset += this.eciesConsts.MULTIPLE.ENCRYPTED_KEY_SIZE;
513
+ }
514
+
515
+ return {
516
+ dataLength,
517
+ recipientCount,
518
+ recipientIds,
519
+ recipientKeys,
520
+ headerSize: offset,
521
+ ephemeralPublicKey,
522
+ };
523
+ }
524
+
525
+ /**
526
+ * Parse complete multi-recipient message
527
+ */
528
+ public parseMessage(data: Uint8Array): IMultiEncryptedMessage {
529
+ const header = this.parseHeader(data);
530
+ const encryptedMessage = data.slice(header.headerSize);
531
+
532
+ return {
533
+ ...header,
534
+ encryptedMessage,
535
+ };
536
+ }
537
+
538
+ private arraysEqual(a: Uint8Array, b: Uint8Array): boolean {
539
+ if (a.length !== b.length) return false;
540
+ for (let i = 0; i < a.length; i++) {
541
+ if (a[i] !== b[i]) return false;
542
+ }
543
+ return true;
544
+ }
545
+ }