@digitaldefiance/node-ecies-lib 4.4.9 → 4.4.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (385) hide show
  1. package/package.json +6 -5
  2. package/src/builders/ecies-builder.d.ts +11 -0
  3. package/src/builders/ecies-builder.d.ts.map +1 -0
  4. package/src/builders/ecies-builder.js +26 -0
  5. package/src/builders/ecies-builder.js.map +1 -0
  6. package/src/builders/{index.ts → index.d.ts} +1 -0
  7. package/src/builders/index.d.ts.map +1 -0
  8. package/src/builders/index.js +6 -0
  9. package/src/builders/index.js.map +1 -0
  10. package/src/builders/member-builder.d.ts +47 -0
  11. package/src/builders/member-builder.d.ts.map +1 -0
  12. package/src/builders/member-builder.js +99 -0
  13. package/src/builders/member-builder.js.map +1 -0
  14. package/src/constants.d.ts +38 -0
  15. package/src/constants.d.ts.map +1 -0
  16. package/src/constants.js +191 -0
  17. package/src/constants.js.map +1 -0
  18. package/src/core/errors/crypto-error.d.ts +6 -0
  19. package/src/core/errors/crypto-error.d.ts.map +1 -0
  20. package/src/core/errors/crypto-error.js +15 -0
  21. package/src/core/errors/crypto-error.js.map +1 -0
  22. package/src/core/{index.ts → index.d.ts} +1 -0
  23. package/src/core/index.d.ts.map +1 -0
  24. package/src/core/index.js +6 -0
  25. package/src/core/index.js.map +1 -0
  26. package/src/core/types/result.d.ts +8 -0
  27. package/src/core/types/result.d.ts.map +1 -0
  28. package/src/core/types/result.js +3 -0
  29. package/src/core/types/result.js.map +1 -0
  30. package/src/enumerations/index.d.ts +2 -0
  31. package/src/enumerations/index.d.ts.map +1 -0
  32. package/src/enumerations/index.js +5 -0
  33. package/src/enumerations/index.js.map +1 -0
  34. package/src/enumerations/pbkdf2-profile.d.ts +9 -0
  35. package/src/enumerations/pbkdf2-profile.d.ts.map +1 -0
  36. package/src/enumerations/pbkdf2-profile.js +13 -0
  37. package/src/enumerations/pbkdf2-profile.js.map +1 -0
  38. package/src/i18n/ecies-i18n-factory.d.ts +28 -0
  39. package/src/i18n/ecies-i18n-factory.d.ts.map +1 -0
  40. package/src/i18n/ecies-i18n-factory.js +89 -0
  41. package/src/i18n/ecies-i18n-factory.js.map +1 -0
  42. package/src/i18n/{index.ts → index.d.ts} +1 -3
  43. package/src/i18n/index.d.ts.map +1 -0
  44. package/src/i18n/index.js +8 -0
  45. package/src/i18n/index.js.map +1 -0
  46. package/src/i18n/node-ecies-i18n-setup.d.ts +5 -0
  47. package/src/i18n/node-ecies-i18n-setup.d.ts.map +1 -0
  48. package/src/i18n/node-ecies-i18n-setup.js +46 -0
  49. package/src/i18n/node-ecies-i18n-setup.js.map +1 -0
  50. package/src/i18n/node-keys.d.ts +57 -0
  51. package/src/i18n/node-keys.d.ts.map +1 -0
  52. package/src/i18n/node-keys.js +67 -0
  53. package/src/i18n/node-keys.js.map +1 -0
  54. package/src/i18n/translations/de.d.ts +3 -0
  55. package/src/i18n/translations/de.d.ts.map +1 -0
  56. package/src/i18n/translations/de.js +57 -0
  57. package/src/i18n/translations/de.js.map +1 -0
  58. package/src/i18n/translations/en-GB.d.ts +3 -0
  59. package/src/i18n/translations/en-GB.d.ts.map +1 -0
  60. package/src/i18n/translations/en-GB.js +61 -0
  61. package/src/i18n/translations/en-GB.js.map +1 -0
  62. package/src/i18n/translations/en-US.d.ts +6 -0
  63. package/src/i18n/translations/en-US.d.ts.map +1 -0
  64. package/src/i18n/translations/en-US.js +65 -0
  65. package/src/i18n/translations/en-US.js.map +1 -0
  66. package/src/i18n/translations/es.d.ts +3 -0
  67. package/src/i18n/translations/es.d.ts.map +1 -0
  68. package/src/i18n/translations/es.js +57 -0
  69. package/src/i18n/translations/es.js.map +1 -0
  70. package/src/i18n/translations/fr.d.ts +3 -0
  71. package/src/i18n/translations/fr.d.ts.map +1 -0
  72. package/src/i18n/translations/fr.js +57 -0
  73. package/src/i18n/translations/fr.js.map +1 -0
  74. package/src/i18n/translations/{index.ts → index.d.ts} +1 -0
  75. package/src/i18n/translations/index.d.ts.map +1 -0
  76. package/src/i18n/translations/index.js +20 -0
  77. package/src/i18n/translations/index.js.map +1 -0
  78. package/src/i18n/translations/ja.d.ts +3 -0
  79. package/src/i18n/translations/ja.d.ts.map +1 -0
  80. package/src/i18n/translations/ja.js +57 -0
  81. package/src/i18n/translations/ja.js.map +1 -0
  82. package/src/i18n/translations/uk.d.ts +3 -0
  83. package/src/i18n/translations/uk.d.ts.map +1 -0
  84. package/src/i18n/translations/uk.js +57 -0
  85. package/src/i18n/translations/uk.js.map +1 -0
  86. package/src/i18n/translations/zh-cn.d.ts +3 -0
  87. package/src/i18n/translations/zh-cn.d.ts.map +1 -0
  88. package/src/i18n/translations/zh-cn.js +57 -0
  89. package/src/i18n/translations/zh-cn.js.map +1 -0
  90. package/src/{index.ts → index.d.ts} +1 -5
  91. package/src/index.d.ts.map +1 -0
  92. package/src/index.js +31 -0
  93. package/src/index.js.map +1 -0
  94. package/src/interfaces/authenticated-cipher.d.ts +12 -0
  95. package/src/interfaces/authenticated-cipher.d.ts.map +1 -0
  96. package/src/interfaces/authenticated-cipher.js +3 -0
  97. package/src/interfaces/authenticated-cipher.js.map +1 -0
  98. package/src/interfaces/authenticated-decipher.d.ts +11 -0
  99. package/src/interfaces/authenticated-decipher.d.ts.map +1 -0
  100. package/src/interfaces/authenticated-decipher.js +3 -0
  101. package/src/interfaces/authenticated-decipher.js.map +1 -0
  102. package/src/interfaces/backend-member-operational.d.ts +48 -0
  103. package/src/interfaces/backend-member-operational.d.ts.map +1 -0
  104. package/src/interfaces/backend-member-operational.js +3 -0
  105. package/src/interfaces/backend-member-operational.js.map +1 -0
  106. package/src/interfaces/checksum-config.d.ts +5 -0
  107. package/src/interfaces/checksum-config.d.ts.map +1 -0
  108. package/src/interfaces/checksum-config.js +3 -0
  109. package/src/interfaces/checksum-config.js.map +1 -0
  110. package/src/interfaces/checksum-consts.d.ts +11 -0
  111. package/src/interfaces/checksum-consts.d.ts.map +1 -0
  112. package/src/interfaces/checksum-consts.js +3 -0
  113. package/src/interfaces/checksum-consts.js.map +1 -0
  114. package/src/interfaces/constants.d.ts +52 -0
  115. package/src/interfaces/constants.d.ts.map +1 -0
  116. package/src/interfaces/constants.js +3 -0
  117. package/src/interfaces/constants.js.map +1 -0
  118. package/src/interfaces/ecies-consts.d.ts +88 -0
  119. package/src/interfaces/ecies-consts.d.ts.map +1 -0
  120. package/src/interfaces/ecies-consts.js +3 -0
  121. package/src/interfaces/ecies-consts.js.map +1 -0
  122. package/src/interfaces/encrypted-chunk.d.ts +12 -0
  123. package/src/interfaces/encrypted-chunk.d.ts.map +1 -0
  124. package/src/interfaces/encrypted-chunk.js +3 -0
  125. package/src/interfaces/encrypted-chunk.js.map +1 -0
  126. package/src/interfaces/encryption-consts.d.ts +11 -0
  127. package/src/interfaces/encryption-consts.d.ts.map +1 -0
  128. package/src/interfaces/encryption-consts.js +3 -0
  129. package/src/interfaces/encryption-consts.js.map +1 -0
  130. package/src/interfaces/{index.ts → index.d.ts} +1 -0
  131. package/src/interfaces/index.d.ts.map +1 -0
  132. package/src/interfaces/index.js +30 -0
  133. package/src/interfaces/index.js.map +1 -0
  134. package/src/interfaces/keypair-buffer-with-un-encrypted-private-key.d.ts +6 -0
  135. package/src/interfaces/keypair-buffer-with-un-encrypted-private-key.d.ts.map +1 -0
  136. package/src/interfaces/keypair-buffer-with-un-encrypted-private-key.js +3 -0
  137. package/src/interfaces/keypair-buffer-with-un-encrypted-private-key.js.map +1 -0
  138. package/src/interfaces/keyring-consts.d.ts +6 -0
  139. package/src/interfaces/keyring-consts.d.ts.map +1 -0
  140. package/src/interfaces/keyring-consts.js +3 -0
  141. package/src/interfaces/keyring-consts.js.map +1 -0
  142. package/src/interfaces/{member-with-mnemonic.ts → member-with-mnemonic.d.ts} +3 -3
  143. package/src/interfaces/member-with-mnemonic.d.ts.map +1 -0
  144. package/src/interfaces/member-with-mnemonic.js +3 -0
  145. package/src/interfaces/member-with-mnemonic.js.map +1 -0
  146. package/src/interfaces/member.d.ts +47 -0
  147. package/src/interfaces/member.d.ts.map +1 -0
  148. package/src/interfaces/member.js +3 -0
  149. package/src/interfaces/member.js.map +1 -0
  150. package/src/interfaces/{multi-encrypted-message.ts → multi-encrypted-message.d.ts} +5 -5
  151. package/src/interfaces/multi-encrypted-message.d.ts.map +1 -0
  152. package/src/interfaces/multi-encrypted-message.js +3 -0
  153. package/src/interfaces/multi-encrypted-message.js.map +1 -0
  154. package/src/interfaces/multi-encrypted-parsed-header.d.ts +27 -0
  155. package/src/interfaces/multi-encrypted-parsed-header.d.ts.map +1 -0
  156. package/src/interfaces/multi-encrypted-parsed-header.js +3 -0
  157. package/src/interfaces/multi-encrypted-parsed-header.js.map +1 -0
  158. package/src/interfaces/multi-recipient-chunk.d.ts +26 -0
  159. package/src/interfaces/multi-recipient-chunk.d.ts.map +1 -0
  160. package/src/interfaces/multi-recipient-chunk.js +13 -0
  161. package/src/interfaces/multi-recipient-chunk.js.map +1 -0
  162. package/src/interfaces/{pbkdf-profiles.ts → pbkdf-profiles.d.ts} +2 -2
  163. package/src/interfaces/pbkdf-profiles.d.ts.map +1 -0
  164. package/src/interfaces/pbkdf-profiles.js +3 -0
  165. package/src/interfaces/pbkdf-profiles.js.map +1 -0
  166. package/src/interfaces/pbkdf2-result.d.ts +6 -0
  167. package/src/interfaces/pbkdf2-result.d.ts.map +1 -0
  168. package/src/interfaces/pbkdf2-result.js +3 -0
  169. package/src/interfaces/pbkdf2-result.js.map +1 -0
  170. package/src/interfaces/signing-key-private-key-info.d.ts +11 -0
  171. package/src/interfaces/signing-key-private-key-info.d.ts.map +1 -0
  172. package/src/interfaces/signing-key-private-key-info.js +3 -0
  173. package/src/interfaces/signing-key-private-key-info.js.map +1 -0
  174. package/src/interfaces/{simple-keypair-buffer.ts → simple-keypair-buffer.d.ts} +3 -3
  175. package/src/interfaces/simple-keypair-buffer.d.ts.map +1 -0
  176. package/src/interfaces/simple-keypair-buffer.js +3 -0
  177. package/src/interfaces/simple-keypair-buffer.js.map +1 -0
  178. package/src/interfaces/{simple-keypair.ts → simple-keypair.d.ts} +3 -3
  179. package/src/interfaces/simple-keypair.d.ts.map +1 -0
  180. package/src/interfaces/simple-keypair.js +3 -0
  181. package/src/interfaces/simple-keypair.js.map +1 -0
  182. package/src/interfaces/simple-public-key-only-buffer.d.ts +4 -0
  183. package/src/interfaces/simple-public-key-only-buffer.d.ts.map +1 -0
  184. package/src/interfaces/simple-public-key-only-buffer.js +3 -0
  185. package/src/interfaces/simple-public-key-only-buffer.js.map +1 -0
  186. package/src/interfaces/simple-public-key-only.d.ts +4 -0
  187. package/src/interfaces/simple-public-key-only.d.ts.map +1 -0
  188. package/src/interfaces/simple-public-key-only.js +3 -0
  189. package/src/interfaces/simple-public-key-only.js.map +1 -0
  190. package/src/interfaces/single-encrypted-parsed-header.d.ts +35 -0
  191. package/src/interfaces/single-encrypted-parsed-header.d.ts.map +1 -0
  192. package/src/interfaces/single-encrypted-parsed-header.js +3 -0
  193. package/src/interfaces/single-encrypted-parsed-header.js.map +1 -0
  194. package/src/interfaces/stream-config.d.ts +6 -0
  195. package/src/interfaces/stream-config.d.ts.map +1 -0
  196. package/src/interfaces/stream-config.js +8 -0
  197. package/src/interfaces/stream-config.js.map +1 -0
  198. package/src/interfaces/stream-progress.d.ts +8 -0
  199. package/src/interfaces/stream-progress.d.ts.map +1 -0
  200. package/src/interfaces/stream-progress.js +3 -0
  201. package/src/interfaces/stream-progress.js.map +1 -0
  202. package/src/interfaces/{wallet-seed.ts → wallet-seed.d.ts} +3 -3
  203. package/src/interfaces/wallet-seed.d.ts.map +1 -0
  204. package/src/interfaces/wallet-seed.js +3 -0
  205. package/src/interfaces/wallet-seed.js.map +1 -0
  206. package/src/interfaces/wrapped-key-consts.d.ts +7 -0
  207. package/src/interfaces/wrapped-key-consts.d.ts.map +1 -0
  208. package/src/interfaces/wrapped-key-consts.js +3 -0
  209. package/src/interfaces/wrapped-key-consts.js.map +1 -0
  210. package/src/lib/crypto-container.d.ts +13 -0
  211. package/src/lib/crypto-container.d.ts.map +1 -0
  212. package/src/lib/crypto-container.js +29 -0
  213. package/src/lib/crypto-container.js.map +1 -0
  214. package/src/lib/{index.ts → index.d.ts} +1 -0
  215. package/src/lib/index.d.ts.map +1 -0
  216. package/src/lib/index.js +7 -0
  217. package/src/lib/index.js.map +1 -0
  218. package/src/lib/invariant-validator.d.ts +62 -0
  219. package/src/lib/invariant-validator.d.ts.map +1 -0
  220. package/src/lib/invariant-validator.js +108 -0
  221. package/src/lib/invariant-validator.js.map +1 -0
  222. package/src/lib/invariants/{index.ts → index.d.ts} +2 -2
  223. package/src/lib/invariants/index.d.ts.map +1 -0
  224. package/src/lib/invariants/index.js +12 -0
  225. package/src/lib/invariants/index.js.map +1 -0
  226. package/src/lib/invariants/recipient-id-consistency.d.ts +22 -0
  227. package/src/lib/invariants/recipient-id-consistency.d.ts.map +1 -0
  228. package/src/lib/invariants/recipient-id-consistency.js +62 -0
  229. package/src/lib/invariants/recipient-id-consistency.js.map +1 -0
  230. package/src/member.d.ts +81 -0
  231. package/src/member.d.ts.map +1 -0
  232. package/src/member.js +285 -0
  233. package/src/member.js.map +1 -0
  234. package/src/services/aes-gcm.d.ts +66 -0
  235. package/src/services/aes-gcm.d.ts.map +1 -0
  236. package/src/services/aes-gcm.js +158 -0
  237. package/src/services/aes-gcm.js.map +1 -0
  238. package/src/services/chunk-processor.d.ts +15 -0
  239. package/src/services/chunk-processor.d.ts.map +1 -0
  240. package/src/services/chunk-processor.js +36 -0
  241. package/src/services/chunk-processor.js.map +1 -0
  242. package/src/services/ecies/crypto-core.d.ts +104 -0
  243. package/src/services/ecies/crypto-core.d.ts.map +1 -0
  244. package/src/services/ecies/crypto-core.js +237 -0
  245. package/src/services/ecies/crypto-core.js.map +1 -0
  246. package/src/services/ecies/file.d.ts +30 -0
  247. package/src/services/ecies/file.d.ts.map +1 -0
  248. package/src/services/ecies/file.js +112 -0
  249. package/src/services/ecies/file.js.map +1 -0
  250. package/src/services/ecies/{index.ts → index.d.ts} +1 -0
  251. package/src/services/ecies/index.d.ts.map +1 -0
  252. package/src/services/ecies/index.js +11 -0
  253. package/src/services/ecies/index.js.map +1 -0
  254. package/src/services/ecies/multi-recipient.d.ts +84 -0
  255. package/src/services/ecies/multi-recipient.d.ts.map +1 -0
  256. package/src/services/ecies/multi-recipient.js +496 -0
  257. package/src/services/ecies/multi-recipient.js.map +1 -0
  258. package/src/services/ecies/service.d.ts +69 -0
  259. package/src/services/ecies/service.d.ts.map +1 -0
  260. package/src/services/ecies/service.js +144 -0
  261. package/src/services/ecies/service.js.map +1 -0
  262. package/src/services/ecies/signature.d.ts +38 -0
  263. package/src/services/ecies/signature.d.ts.map +1 -0
  264. package/src/services/ecies/signature.js +69 -0
  265. package/src/services/ecies/signature.js.map +1 -0
  266. package/src/services/ecies/single-recipient.d.ts +83 -0
  267. package/src/services/ecies/single-recipient.d.ts.map +1 -0
  268. package/src/services/ecies/single-recipient.js +447 -0
  269. package/src/services/ecies/single-recipient.js.map +1 -0
  270. package/src/services/ecies/utilities.d.ts +33 -0
  271. package/src/services/ecies/utilities.d.ts.map +1 -0
  272. package/src/services/ecies/utilities.js +91 -0
  273. package/src/services/ecies/utilities.js.map +1 -0
  274. package/src/services/encryption-stream.d.ts +33 -0
  275. package/src/services/encryption-stream.d.ts.map +1 -0
  276. package/src/services/encryption-stream.js +207 -0
  277. package/src/services/encryption-stream.js.map +1 -0
  278. package/src/services/{index.ts → index.d.ts} +1 -0
  279. package/src/services/index.d.ts.map +1 -0
  280. package/src/services/index.js +11 -0
  281. package/src/services/index.js.map +1 -0
  282. package/src/services/multi-recipient-processor.d.ts +72 -0
  283. package/src/services/multi-recipient-processor.d.ts.map +1 -0
  284. package/src/services/multi-recipient-processor.js +322 -0
  285. package/src/services/multi-recipient-processor.js.map +1 -0
  286. package/src/services/pbkdf2.d.ts +105 -0
  287. package/src/services/pbkdf2.d.ts.map +1 -0
  288. package/src/services/pbkdf2.js +189 -0
  289. package/src/services/pbkdf2.js.map +1 -0
  290. package/src/services/progress-tracker.d.ts +9 -0
  291. package/src/services/progress-tracker.d.ts.map +1 -0
  292. package/src/services/progress-tracker.js +41 -0
  293. package/src/services/progress-tracker.js.map +1 -0
  294. package/src/test-mocks/index.d.ts +2 -0
  295. package/src/test-mocks/index.d.ts.map +1 -0
  296. package/src/test-mocks/index.js +5 -0
  297. package/src/test-mocks/index.js.map +1 -0
  298. package/src/test-mocks/mock-backend-member.d.ts +71 -0
  299. package/src/test-mocks/mock-backend-member.d.ts.map +1 -0
  300. package/src/test-mocks/mock-backend-member.js +133 -0
  301. package/src/test-mocks/mock-backend-member.js.map +1 -0
  302. package/src/testing.d.ts +2 -0
  303. package/src/testing.d.ts.map +1 -0
  304. package/src/testing.js +6 -0
  305. package/src/testing.js.map +1 -0
  306. package/src/types/id-guards.d.ts +39 -0
  307. package/src/types/id-guards.d.ts.map +1 -0
  308. package/src/types/id-guards.js +91 -0
  309. package/src/types/id-guards.js.map +1 -0
  310. package/src/types/index.d.ts +2 -0
  311. package/src/types/index.d.ts.map +1 -0
  312. package/src/types/index.js +5 -0
  313. package/src/types/index.js.map +1 -0
  314. package/src/{types.ts → types.d.ts} +9 -28
  315. package/src/types.d.ts.map +1 -0
  316. package/src/types.js +6 -0
  317. package/src/types.js.map +1 -0
  318. package/src/utils.d.ts +11 -0
  319. package/src/utils.d.ts.map +1 -0
  320. package/src/utils.js +82 -0
  321. package/src/utils.js.map +1 -0
  322. package/LICENSE +0 -21
  323. package/src/builders/ecies-builder.ts +0 -27
  324. package/src/builders/member-builder.ts +0 -158
  325. package/src/constants.ts +0 -251
  326. package/src/core/errors/crypto-error.ts +0 -10
  327. package/src/core/types/result.ts +0 -3
  328. package/src/enumerations/index.ts +0 -2
  329. package/src/enumerations/pbkdf2-profile.ts +0 -8
  330. package/src/i18n/ecies-i18n-factory.ts +0 -111
  331. package/src/i18n/node-ecies-i18n-setup.ts +0 -56
  332. package/src/i18n/node-keys.ts +0 -69
  333. package/src/i18n/translations/de.ts +0 -54
  334. package/src/i18n/translations/en-GB.ts +0 -83
  335. package/src/i18n/translations/en-US.ts +0 -88
  336. package/src/i18n/translations/es.ts +0 -54
  337. package/src/i18n/translations/fr.ts +0 -54
  338. package/src/i18n/translations/ja.ts +0 -54
  339. package/src/i18n/translations/uk.ts +0 -54
  340. package/src/i18n/translations/zh-cn.ts +0 -54
  341. package/src/interfaces/authenticated-cipher.ts +0 -10
  342. package/src/interfaces/authenticated-decipher.ts +0 -9
  343. package/src/interfaces/backend-member-operational.ts +0 -75
  344. package/src/interfaces/checksum-config.ts +0 -4
  345. package/src/interfaces/checksum-consts.ts +0 -13
  346. package/src/interfaces/constants.ts +0 -54
  347. package/src/interfaces/ecies-consts.ts +0 -99
  348. package/src/interfaces/encrypted-chunk.ts +0 -12
  349. package/src/interfaces/encryption-consts.ts +0 -10
  350. package/src/interfaces/keypair-buffer-with-un-encrypted-private-key.ts +0 -7
  351. package/src/interfaces/keyring-consts.ts +0 -5
  352. package/src/interfaces/member.ts +0 -76
  353. package/src/interfaces/multi-encrypted-parsed-header.ts +0 -28
  354. package/src/interfaces/multi-recipient-chunk.ts +0 -35
  355. package/src/interfaces/pbkdf2-result.ts +0 -5
  356. package/src/interfaces/signing-key-private-key-info.ts +0 -12
  357. package/src/interfaces/simple-public-key-only-buffer.ts +0 -3
  358. package/src/interfaces/simple-public-key-only.ts +0 -3
  359. package/src/interfaces/single-encrypted-parsed-header.ts +0 -35
  360. package/src/interfaces/stream-config.ts +0 -9
  361. package/src/interfaces/stream-progress.ts +0 -7
  362. package/src/interfaces/wrapped-key-consts.ts +0 -6
  363. package/src/lib/crypto-container.ts +0 -32
  364. package/src/lib/invariant-validator.ts +0 -124
  365. package/src/lib/invariants/recipient-id-consistency.ts +0 -77
  366. package/src/member.ts +0 -511
  367. package/src/services/aes-gcm.ts +0 -260
  368. package/src/services/chunk-processor.ts +0 -47
  369. package/src/services/ecies/crypto-core.ts +0 -319
  370. package/src/services/ecies/file.ts +0 -171
  371. package/src/services/ecies/multi-recipient.ts +0 -782
  372. package/src/services/ecies/service.ts +0 -316
  373. package/src/services/ecies/signature.ts +0 -91
  374. package/src/services/ecies/single-recipient.ts +0 -743
  375. package/src/services/ecies/utilities.ts +0 -128
  376. package/src/services/encryption-stream.ts +0 -432
  377. package/src/services/multi-recipient-processor.ts +0 -505
  378. package/src/services/pbkdf2.ts +0 -304
  379. package/src/services/progress-tracker.ts +0 -43
  380. package/src/test-mocks/index.ts +0 -1
  381. package/src/test-mocks/mock-backend-member.ts +0 -195
  382. package/src/testing.ts +0 -2
  383. package/src/types/id-guards.ts +0 -91
  384. package/src/types/index.ts +0 -1
  385. package/src/utils.ts +0 -124
@@ -1,782 +0,0 @@
1
- import {
2
- Constants as AppConstants,
3
- EciesCipherSuiteEnum,
4
- EciesEncryptionTypeEnum,
5
- ECIESError,
6
- ECIESErrorTypeEnum,
7
- EciesVersionEnum,
8
- } from '@digitaldefiance/ecies-lib';
9
- import {
10
- createCipheriv,
11
- createDecipheriv,
12
- createECDH,
13
- randomBytes,
14
- } from 'crypto';
15
- import { AuthenticatedCipher } from '../../interfaces/authenticated-cipher';
16
- import { AuthenticatedDecipher } from '../../interfaces/authenticated-decipher';
17
- import type { IMember } from '../../interfaces/member';
18
- import { IMultiEncryptedMessage } from '../../interfaces/multi-encrypted-message';
19
- import { IMultiEncryptedParsedHeader } from '../../interfaces/multi-encrypted-parsed-header';
20
- import { EciesCryptoCore } from './crypto-core';
21
- import { EciesSingleRecipientCore } from './single-recipient';
22
-
23
- /**
24
- * Multiple recipient encryption/decryption functions for ECIES
25
- */
26
- export class EciesMultiRecipient {
27
- protected readonly cryptoCore: EciesCryptoCore;
28
- protected readonly singleRecipientCore: EciesSingleRecipientCore;
29
-
30
- constructor(cryptoCore: EciesCryptoCore) {
31
- this.cryptoCore = cryptoCore;
32
- this.singleRecipientCore = new EciesSingleRecipientCore(cryptoCore.config);
33
- }
34
-
35
- /**
36
- * Get the size of the header for a given encryption type
37
- * @param recipientCount The number of recipients
38
- * @returns
39
- */
40
- public getHeaderSize(recipientCount: number): number {
41
- return (
42
- this.cryptoCore.consts.VERSION_SIZE +
43
- this.cryptoCore.consts.CIPHER_SUITE_SIZE +
44
- this.cryptoCore.consts.ENCRYPTION_TYPE_SIZE +
45
- this.cryptoCore.consts.PUBLIC_KEY_LENGTH + // Shared ephemeral public key
46
- this.cryptoCore.consts.MULTIPLE.DATA_LENGTH_SIZE +
47
- this.cryptoCore.consts.MULTIPLE.RECIPIENT_COUNT_SIZE +
48
- recipientCount * this.cryptoCore.consts.MULTIPLE.RECIPIENT_ID_SIZE +
49
- recipientCount * this.cryptoCore.consts.MULTIPLE.ENCRYPTED_KEY_SIZE
50
- );
51
- }
52
-
53
- /**
54
- * Encrypt a message symmetric key with a public key
55
- * @param receiverPublicKey The public key of the receiver
56
- * @param messageSymmetricKey The message to encrypt
57
- * @param ephemeralPrivateKey The ephemeral private key to use for encryption
58
- * @param aad Additional Authenticated Data (optional)
59
- * @returns The encrypted message
60
- */
61
- public encryptKey(
62
- receiverPublicKey: Buffer,
63
- messageSymmetricKey: Buffer,
64
- ephemeralPrivateKey: Buffer,
65
- aad?: Buffer
66
- ): Buffer {
67
- // Compute shared secret
68
- let sharedSecret: Buffer;
69
- try {
70
- // Make sure we normalize the receiver's public key
71
- const normalizedReceiverPublicKey =
72
- this.cryptoCore.normalizePublicKey(receiverPublicKey);
73
-
74
- // Create ECDH instance with the ephemeral private key
75
- const ecdh = createECDH(this.cryptoCore.config.curveName);
76
- ecdh.setPrivateKey(ephemeralPrivateKey);
77
-
78
- // Ensure we're using the properly formatted public key (with 0x04 prefix)
79
- sharedSecret = ecdh.computeSecret(normalizedReceiverPublicKey);
80
- } catch (error: unknown) {
81
- console.error('[ERROR][encrypt] Failed to compute shared secret:', error);
82
- if (error instanceof Error) {
83
- if (
84
- 'code' in error &&
85
- error.code === 'ERR_CRYPTO_ECDH_INVALID_PUBLIC_KEY'
86
- ) {
87
- throw new ECIESError(
88
- ECIESErrorTypeEnum.InvalidRecipientPublicKey,
89
- undefined,
90
- undefined,
91
- {
92
- nodeError: error.code,
93
- }
94
- );
95
- }
96
- throw new ECIESError(
97
- ECIESErrorTypeEnum.SecretComputationFailed,
98
- undefined,
99
- undefined,
100
- {
101
- error: error.message,
102
- }
103
- );
104
- }
105
- throw new ECIESError(ECIESErrorTypeEnum.SecretComputationFailed);
106
- }
107
-
108
- // Use HKDF to derive the key
109
- const symKey = this.cryptoCore.deriveSharedKey(
110
- sharedSecret,
111
- Buffer.alloc(0), // No salt
112
- Buffer.from('ecies-v2-key-derivation'), // Info
113
- this.cryptoCore.consts.SYMMETRIC.KEY_SIZE
114
- );
115
-
116
- const iv = randomBytes(this.cryptoCore.consts.IV_SIZE);
117
-
118
- // Create cipher with the derived symmetric key
119
- const cipher = createCipheriv(
120
- this.cryptoCore.consts.SYMMETRIC_ALGORITHM_CONFIGURATION,
121
- symKey,
122
- iv
123
- ) as AuthenticatedCipher;
124
-
125
- // Ensure auto padding is enabled
126
- cipher.setAutoPadding(true);
127
-
128
- // Set AAD if provided
129
- if (aad) {
130
- cipher.setAAD(aad);
131
- }
132
-
133
- // Encrypt the message
134
- let encrypted = cipher.update(messageSymmetricKey);
135
- encrypted = Buffer.concat([encrypted, cipher.final()]);
136
-
137
- // Get and explicitly set the authentication tag to max tag length for consistency
138
- const authTag = cipher.getAuthTag();
139
-
140
- // Format: iv (16) | authTag (16) | encryptedData (32)
141
- // Note: Ephemeral public key is now in the main header, not per-recipient
142
- return Buffer.concat([iv, authTag, encrypted]);
143
- }
144
-
145
- /**
146
- * Decrypts symmetric key encrypted with ECIES using a header
147
- * @param privateKey The private key to decrypt the data
148
- * @param encryptedKey The data to decrypt
149
- * @param ephemeralPublicKey The ephemeral public key from the header
150
- * @param aad Additional Authenticated Data (optional)
151
- * @returns The decrypted data buffer
152
- */
153
- public decryptKey(
154
- privateKey: Buffer,
155
- encryptedKey: Buffer,
156
- ephemeralPublicKey: Buffer,
157
- aad?: Buffer
158
- ): Buffer {
159
- if (
160
- encryptedKey.length !== this.cryptoCore.consts.MULTIPLE.ENCRYPTED_KEY_SIZE
161
- ) {
162
- throw new ECIESError(
163
- ECIESErrorTypeEnum.InvalidEncryptedKeyLength,
164
- undefined,
165
- undefined,
166
- {
167
- expected: String(this.cryptoCore.consts.MULTIPLE.ENCRYPTED_KEY_SIZE),
168
- actual: String(encryptedKey.length),
169
- }
170
- );
171
- }
172
-
173
- const iv = encryptedKey.subarray(0, this.cryptoCore.consts.IV_SIZE);
174
- const authTag = encryptedKey.subarray(
175
- this.cryptoCore.consts.IV_SIZE,
176
- this.cryptoCore.consts.IV_SIZE + this.cryptoCore.consts.AUTH_TAG_SIZE
177
- );
178
- const encrypted = encryptedKey.subarray(
179
- this.cryptoCore.consts.IV_SIZE + this.cryptoCore.consts.AUTH_TAG_SIZE
180
- );
181
-
182
- // Normalize the public key (ensuring 0x04 prefix)
183
- const normalizedKey =
184
- this.cryptoCore.normalizePublicKey(ephemeralPublicKey);
185
-
186
- // Compute shared secret
187
- const ecdh = createECDH(this.cryptoCore.config.curveName);
188
- ecdh.setPrivateKey(privateKey);
189
- const sharedSecret = ecdh.computeSecret(normalizedKey);
190
-
191
- // Use HKDF to derive the key
192
- const symKey = this.cryptoCore.deriveSharedKey(
193
- sharedSecret,
194
- Buffer.alloc(0), // No salt
195
- Buffer.from('ecies-v2-key-derivation'), // Info
196
- this.cryptoCore.consts.SYMMETRIC.KEY_SIZE
197
- );
198
-
199
- // Decrypt
200
- const decipher = createDecipheriv(
201
- this.cryptoCore.consts.SYMMETRIC_ALGORITHM_CONFIGURATION,
202
- symKey,
203
- iv
204
- ) as AuthenticatedDecipher;
205
-
206
- decipher.setAuthTag(authTag);
207
- if (aad) {
208
- decipher.setAAD(aad);
209
- }
210
-
211
- const decrypted = decipher.update(encrypted);
212
- const final = decipher.final();
213
- const decryptedMessage = Buffer.concat([decrypted, final]);
214
-
215
- if (decryptedMessage.length !== this.cryptoCore.consts.SYMMETRIC.KEY_SIZE) {
216
- throw new ECIESError(
217
- ECIESErrorTypeEnum.InvalidDataLength,
218
- undefined,
219
- undefined,
220
- {
221
- expected: String(this.cryptoCore.consts.SYMMETRIC.KEY_SIZE),
222
- actual: String(decryptedMessage.length),
223
- }
224
- );
225
- }
226
- return decryptedMessage;
227
- }
228
-
229
- /**
230
- * Encrypts a message for multiple recipients.
231
- * @param recipients The recipients to encrypt the message for.
232
- * @param message The message to encrypt.
233
- * @param preamble Optional preamble to include in the encrypted message.
234
- * @param senderPrivateKey Optional sender private key for signing.
235
- * @returns The encrypted message.
236
- * @throws EciesError if the number of recipients is greater than 65535.
237
- */
238
- public encryptMultiple(
239
- recipients: IMember[],
240
- message: Buffer,
241
- preamble?: Buffer,
242
- senderPrivateKey?: Buffer
243
- ): IMultiEncryptedMessage {
244
- if (recipients.length > AppConstants.UINT16_MAX) {
245
- throw new ECIESError(ECIESErrorTypeEnum.TooManyRecipients);
246
- }
247
-
248
- // Sign-then-Encrypt: If sender key provided, sign the message and prepend signature
249
- let messageToEncrypt = message;
250
- if (senderPrivateKey) {
251
- const signature = this.cryptoCore.sign(senderPrivateKey, message);
252
- messageToEncrypt = Buffer.concat([signature, message]);
253
- }
254
-
255
- if (messageToEncrypt.length > this.cryptoCore.consts.MAX_RAW_DATA_SIZE) {
256
- throw new ECIESError(ECIESErrorTypeEnum.FileSizeTooLarge);
257
- }
258
-
259
- const messageTypeBuffer = Buffer.alloc(1);
260
- messageTypeBuffer.writeUint8(EciesEncryptionTypeEnum.Multiple as number);
261
-
262
- // Generate a random symmetric key
263
- const symmetricKey = randomBytes(this.cryptoCore.consts.SYMMETRIC.KEY_SIZE);
264
-
265
- // Generate ONE ephemeral key pair for all recipients
266
- const ecdh = createECDH(this.cryptoCore.config.curveName);
267
- ecdh.generateKeys();
268
- const ephemeralPrivateKey = ecdh.getPrivateKey();
269
- let ephemeralPublicKey = ecdh.getPublicKey(null, 'compressed');
270
-
271
- // Ensure public key has 0x04 prefix
272
- if (
273
- ephemeralPublicKey.length === this.cryptoCore.consts.RAW_PUBLIC_KEY_LENGTH
274
- ) {
275
- ephemeralPublicKey = Buffer.concat([
276
- Buffer.from([this.cryptoCore.consts.PUBLIC_KEY_MAGIC]),
277
- ephemeralPublicKey,
278
- ]);
279
- }
280
-
281
- const encryptionResults = recipients.map((member) => ({
282
- id: member.id,
283
- encryptedKey: this.encryptKey(
284
- member.publicKey,
285
- symmetricKey,
286
- ephemeralPrivateKey,
287
- member.id as Buffer // Use Recipient ID as AAD
288
- ),
289
- }));
290
-
291
- const recipientIds = encryptionResults.map(({ id }) => id as Buffer);
292
- const recipientKeys = encryptionResults.map(
293
- ({ encryptedKey }) => encryptedKey
294
- );
295
-
296
- // Calculate header size
297
- const headerSize = this.calculateECIESMultipleRecipientOverhead(
298
- recipients.length,
299
- false,
300
- recipientKeys
301
- );
302
-
303
- // Build the header to use as AAD for message encryption
304
- // We need to construct a temporary object to build the header
305
- const tempHeaderData: IMultiEncryptedMessage = {
306
- dataLength: messageToEncrypt.length,
307
- recipientCount: recipients.length,
308
- recipientIds,
309
- recipientKeys,
310
- encryptedMessage: Buffer.alloc(0), // Placeholder
311
- headerSize,
312
- ephemeralPublicKey,
313
- };
314
-
315
- const headerBytes = this.buildECIESMultipleRecipientHeader(tempHeaderData);
316
-
317
- // Encrypt the message with the symmetric key and Header as AAD
318
- const iv = randomBytes(this.cryptoCore.consts.IV_SIZE);
319
- const cipher = createCipheriv(
320
- this.cryptoCore.consts.SYMMETRIC_ALGORITHM_CONFIGURATION,
321
- symmetricKey,
322
- iv
323
- ) as AuthenticatedCipher;
324
-
325
- cipher.setAAD(headerBytes);
326
-
327
- const encrypted = cipher.update(messageToEncrypt);
328
- const final = cipher.final();
329
- const authTag = cipher.getAuthTag();
330
-
331
- const encryptedMessage = Buffer.concat([encrypted, final]);
332
-
333
- const storedMessage = Buffer.concat([
334
- preamble ?? Buffer.alloc(0),
335
- iv,
336
- authTag,
337
- encryptedMessage,
338
- ]);
339
-
340
- // Verify the encrypted message size (just the encrypted content)
341
- if (encryptedMessage.length !== messageToEncrypt.length) {
342
- throw new ECIESError(ECIESErrorTypeEnum.MessageLengthMismatch);
343
- }
344
-
345
- return {
346
- dataLength: messageToEncrypt.length,
347
- recipientCount: recipients.length,
348
- recipientIds,
349
- recipientKeys,
350
- encryptedMessage: storedMessage,
351
- headerSize,
352
- ephemeralPublicKey,
353
- };
354
- }
355
-
356
- /**
357
- * Decrypts a message encrypted with multiple ECIE for a recipient.
358
- * @param encryptedData The encrypted data.
359
- * @param recipient The recipient.
360
- * @param senderPublicKey Optional sender public key for verification.
361
- * @returns The decrypted message.
362
- */
363
- public decryptMultipleECIEForRecipient(
364
- encryptedData: IMultiEncryptedMessage,
365
- recipient: IMember,
366
- senderPublicKey?: Buffer
367
- ): Buffer {
368
- if (recipient.privateKey === undefined) {
369
- throw new ECIESError(ECIESErrorTypeEnum.PrivateKeyNotLoaded);
370
- }
371
-
372
- // Find this recipient's encrypted key
373
- const recipientIndex: number = encryptedData.recipientIds.findIndex(
374
- (id: Buffer): boolean => id.equals(recipient.id as Buffer)
375
- );
376
- if (recipientIndex === -1) {
377
- throw new ECIESError(ECIESErrorTypeEnum.RecipientNotFound);
378
- }
379
-
380
- const encryptedKey = encryptedData.recipientKeys[recipientIndex];
381
-
382
- if (!encryptedData.ephemeralPublicKey) {
383
- throw new ECIESError(ECIESErrorTypeEnum.MissingEphemeralPublicKey);
384
- }
385
-
386
- // Decrypt the symmetric key using the detected encryption type
387
- const symmetricKey = this.decryptKey(
388
- Buffer.from(recipient.privateKey.value),
389
- encryptedKey,
390
- encryptedData.ephemeralPublicKey,
391
- recipient.id as Buffer // Use Recipient ID as AAD
392
- );
393
-
394
- // Rebuild header to use as AAD
395
- const headerBytes = this.buildECIESMultipleRecipientHeader(encryptedData);
396
-
397
- // Extract the IV and auth tag from the encrypted message
398
- const iv = encryptedData.encryptedMessage.subarray(
399
- 0,
400
- this.cryptoCore.consts.IV_SIZE
401
- );
402
- const authTag = encryptedData.encryptedMessage.subarray(
403
- this.cryptoCore.consts.IV_SIZE,
404
- this.cryptoCore.consts.IV_SIZE + this.cryptoCore.consts.AUTH_TAG_SIZE
405
- );
406
-
407
- // Extract the encrypted content (no CRC, AES-GCM provides authentication)
408
- const encrypted = encryptedData.encryptedMessage.subarray(
409
- this.cryptoCore.consts.IV_SIZE + this.cryptoCore.consts.AUTH_TAG_SIZE
410
- );
411
-
412
- // Decrypt the content with the symmetric key
413
- const decipher = createDecipheriv(
414
- this.cryptoCore.consts.SYMMETRIC_ALGORITHM_CONFIGURATION,
415
- symmetricKey,
416
- iv
417
- ) as AuthenticatedDecipher;
418
-
419
- decipher.setAuthTag(authTag);
420
- decipher.setAAD(headerBytes);
421
-
422
- const decrypted = decipher.update(encrypted);
423
- const final = decipher.final();
424
- const decryptedMessage = Buffer.concat([decrypted, final]);
425
-
426
- // The decrypted message should match the original data length
427
- if (decryptedMessage.length !== encryptedData.dataLength) {
428
- throw new ECIESError(ECIESErrorTypeEnum.InvalidDataLength);
429
- }
430
-
431
- // If sender public key is provided, verify signature
432
- if (senderPublicKey) {
433
- // Expect [Signature (64)][Message]
434
- if (decryptedMessage.length < 64) {
435
- throw new ECIESError(ECIESErrorTypeEnum.InvalidSignature);
436
- }
437
- const signature = decryptedMessage.subarray(0, 64);
438
- const message = decryptedMessage.subarray(64);
439
-
440
- const isValid = this.cryptoCore.verify(
441
- senderPublicKey,
442
- message,
443
- signature
444
- );
445
- if (!isValid) {
446
- throw new ECIESError(ECIESErrorTypeEnum.InvalidSignature);
447
- }
448
-
449
- return message;
450
- }
451
-
452
- return decryptedMessage;
453
- }
454
-
455
- /**
456
- * Calculate the overhead for a message encrypted for multiple recipients
457
- * @param recipientCount number of recipients
458
- * @param includeMessageOverhead whether to include the overhead for the encrypted message
459
- * @param encryptedKeys optional array of encrypted keys to calculate actual size
460
- * @returns the overhead size in bytes
461
- */
462
- public calculateECIESMultipleRecipientOverhead(
463
- recipientCount: number,
464
- includeMessageOverhead: boolean,
465
- encryptedKeys?: Buffer[]
466
- ): number {
467
- if (recipientCount < 1) {
468
- throw new ECIESError(ECIESErrorTypeEnum.InvalidRecipientCount);
469
- }
470
-
471
- // Calculate encrypted keys size
472
- let encryptedKeysSize: number;
473
- if (encryptedKeys) {
474
- encryptedKeysSize = encryptedKeys.reduce(
475
- (total, key) => total + key.length,
476
- 0
477
- );
478
- } else {
479
- // Default assumption: all keys use Simple encryption type (more efficient)
480
- encryptedKeysSize =
481
- recipientCount * this.cryptoCore.consts.MULTIPLE.ENCRYPTED_KEY_SIZE;
482
- }
483
-
484
- const baseOverhead =
485
- this.cryptoCore.consts.VERSION_SIZE +
486
- this.cryptoCore.consts.CIPHER_SUITE_SIZE +
487
- this.cryptoCore.consts.ENCRYPTION_TYPE_SIZE +
488
- this.cryptoCore.consts.MULTIPLE.DATA_LENGTH_SIZE +
489
- this.cryptoCore.consts.MULTIPLE.RECIPIENT_COUNT_SIZE +
490
- recipientCount * this.cryptoCore.consts.MULTIPLE.RECIPIENT_ID_SIZE + // recipient ids (dynamic based on ID provider)
491
- encryptedKeysSize; // actual encrypted keys size
492
-
493
- return includeMessageOverhead
494
- ? baseOverhead + this.cryptoCore.consts.MULTIPLE.FIXED_OVERHEAD_SIZE
495
- : baseOverhead;
496
- }
497
-
498
- /**
499
- * Builds the header for a message encrypted for multiple recipients
500
- * @param data The encrypted message data including recipients and encrypted keys
501
- * @returns The header buffer for the message
502
- * @throws EciesError if the number of recipients is greater than the maximum allowed
503
- * @throws EciesError if the number of encrypted keys does not match the number of recipients
504
- */
505
- public buildECIESMultipleRecipientHeader(
506
- data: IMultiEncryptedMessage
507
- ): Buffer {
508
- if (
509
- data.recipientIds.length > this.cryptoCore.consts.MULTIPLE.MAX_RECIPIENTS
510
- ) {
511
- throw new ECIESError(ECIESErrorTypeEnum.TooManyRecipients);
512
- } else if (data.recipientIds.length !== data.recipientKeys.length) {
513
- throw new ECIESError(ECIESErrorTypeEnum.RecipientKeyCountMismatch);
514
- } else if (
515
- data.dataLength < 0 ||
516
- data.dataLength > this.cryptoCore.consts.MAX_RAW_DATA_SIZE
517
- ) {
518
- throw new ECIESError(ECIESErrorTypeEnum.FileSizeTooLarge);
519
- }
520
-
521
- if (!data.ephemeralPublicKey) {
522
- throw new ECIESError(ECIESErrorTypeEnum.MissingEphemeralPublicKey);
523
- }
524
-
525
- // Create version buffer
526
- const versionBuffer = Buffer.alloc(this.cryptoCore.consts.VERSION_SIZE);
527
- versionBuffer.writeUInt8(EciesVersionEnum.V1);
528
-
529
- // Create cipher suite buffer
530
- const cipherSuiteBuffer = Buffer.alloc(
531
- this.cryptoCore.consts.CIPHER_SUITE_SIZE
532
- );
533
- cipherSuiteBuffer.writeUInt8(
534
- EciesCipherSuiteEnum.Secp256k1_Aes256Gcm_Sha256
535
- );
536
-
537
- // Create encryption type buffer
538
- const encryptionTypeBuffer = Buffer.alloc(
539
- this.cryptoCore.consts.ENCRYPTION_TYPE_SIZE
540
- );
541
- encryptionTypeBuffer.writeUInt8(EciesEncryptionTypeEnum.Multiple as number);
542
-
543
- // Create data length buffer
544
- // We use the most significant byte (MSB) to store the recipient ID size
545
- const recipientIdSize = this.cryptoCore.consts.MULTIPLE.RECIPIENT_ID_SIZE;
546
- if (recipientIdSize > 255) {
547
- throw new ECIESError(ECIESErrorTypeEnum.RecipientIdSizeTooLarge);
548
- }
549
-
550
- const dataLengthBigInt = BigInt(data.dataLength);
551
- const recipientIdSizeBigInt = BigInt(recipientIdSize);
552
- const combinedLength = (recipientIdSizeBigInt << 56n) | dataLengthBigInt;
553
-
554
- const dataLengthBuffer = Buffer.alloc(
555
- this.cryptoCore.consts.MULTIPLE.DATA_LENGTH_SIZE
556
- );
557
- dataLengthBuffer.writeBigUInt64BE(combinedLength);
558
-
559
- // Create recipient count buffer
560
- const recipientCountBuffer = Buffer.alloc(
561
- this.cryptoCore.consts.MULTIPLE.RECIPIENT_COUNT_SIZE
562
- );
563
- recipientCountBuffer.writeUInt16BE(data.recipientIds.length);
564
-
565
- // Create recipients buffer
566
- const recipientsBuffer = Buffer.alloc(
567
- data.recipientIds.length *
568
- this.cryptoCore.consts.MULTIPLE.RECIPIENT_ID_SIZE
569
- );
570
- data.recipientIds.forEach((recipientId: Buffer, index: number) => {
571
- recipientsBuffer.set(
572
- recipientId,
573
- index * this.cryptoCore.consts.MULTIPLE.RECIPIENT_ID_SIZE
574
- );
575
- });
576
-
577
- // Validate encrypted key lengths based on their encryption type
578
- data.recipientKeys.forEach((encryptedKey: Buffer) => {
579
- if (encryptedKey.length === 0) {
580
- throw new ECIESError(ECIESErrorTypeEnum.InvalidEncryptedKeyLength);
581
- }
582
-
583
- if (
584
- encryptedKey.length !==
585
- this.cryptoCore.consts.MULTIPLE.ENCRYPTED_KEY_SIZE
586
- ) {
587
- throw new ECIESError(
588
- ECIESErrorTypeEnum.InvalidEncryptedKeyLength,
589
- undefined,
590
- undefined,
591
- {
592
- expected: String(
593
- this.cryptoCore.consts.MULTIPLE.ENCRYPTED_KEY_SIZE
594
- ),
595
- actual: String(encryptedKey.length),
596
- }
597
- );
598
- }
599
- });
600
-
601
- // Create encrypted keys buffer with variable-length keys
602
- const encryptedKeysBuffer = Buffer.concat(data.recipientKeys);
603
-
604
- // Combine all buffers to form the header
605
- return Buffer.concat([
606
- versionBuffer,
607
- cipherSuiteBuffer,
608
- encryptionTypeBuffer,
609
- data.ephemeralPublicKey,
610
- dataLengthBuffer,
611
- recipientCountBuffer,
612
- recipientsBuffer,
613
- encryptedKeysBuffer,
614
- ]);
615
- }
616
-
617
- /**
618
- * Parses a multi-encrypted header.
619
- * @param data - The data to parse.
620
- * @returns The parsed header.
621
- */
622
- public parseMultiEncryptedHeader(data: Buffer): IMultiEncryptedParsedHeader {
623
- // Ensure there's enough data to read headers
624
- // minimum: 1 (ver) + 1 (suite) + 1 (type) + 33 (pubkey) + 8 (len) + 2 (count) = 46
625
- if (data.length < 46) {
626
- throw new ECIESError(ECIESErrorTypeEnum.InvalidDataLength);
627
- }
628
-
629
- let offset = 0;
630
-
631
- // Read Version
632
- const version = data.readUInt8(offset);
633
- offset += this.cryptoCore.consts.VERSION_SIZE;
634
- if (version !== EciesVersionEnum.V1) {
635
- throw new ECIESError(
636
- ECIESErrorTypeEnum.InvalidVersion,
637
- undefined,
638
- undefined,
639
- { version: String(version) }
640
- );
641
- }
642
-
643
- // Read CipherSuite
644
- const cipherSuite = data.readUInt8(offset);
645
- offset += this.cryptoCore.consts.CIPHER_SUITE_SIZE;
646
- if (cipherSuite !== EciesCipherSuiteEnum.Secp256k1_Aes256Gcm_Sha256) {
647
- throw new ECIESError(
648
- ECIESErrorTypeEnum.InvalidCipherSuite,
649
- undefined,
650
- undefined,
651
- { cipherSuite: String(cipherSuite) }
652
- );
653
- }
654
-
655
- // Read Encryption Type
656
- const encryptionType = data.readUInt8(offset);
657
- offset += this.cryptoCore.consts.ENCRYPTION_TYPE_SIZE;
658
- if (encryptionType !== EciesEncryptionTypeEnum.Multiple) {
659
- throw new ECIESError(
660
- ECIESErrorTypeEnum.InvalidEncryptionType,
661
- undefined,
662
- undefined,
663
- { encryptionType: encryptionType.toString(16) }
664
- );
665
- }
666
-
667
- // Read Ephemeral Public Key
668
- const ephemeralPublicKey = data.subarray(
669
- offset,
670
- offset + this.cryptoCore.consts.PUBLIC_KEY_LENGTH
671
- );
672
- offset += this.cryptoCore.consts.PUBLIC_KEY_LENGTH;
673
-
674
- // Read data length and recipient ID size
675
- const combinedLength = data.readBigUInt64BE(offset);
676
- offset += this.cryptoCore.consts.MULTIPLE.DATA_LENGTH_SIZE; // 8 bytes
677
-
678
- // Extract recipient ID size from MSB (top 8 bits)
679
- const storedRecipientIdSize = Number(combinedLength >> 56n);
680
-
681
- // Extract data length from lower 56 bits
682
- const dataLength = Number(combinedLength & 0x00ffffffffffffffn);
683
-
684
- if (
685
- dataLength <= 0 ||
686
- dataLength > this.cryptoCore.consts.MAX_RAW_DATA_SIZE
687
- ) {
688
- throw new ECIESError(ECIESErrorTypeEnum.InvalidDataLength);
689
- }
690
-
691
- // Use stored recipient ID size if available (non-legacy), otherwise fallback to config
692
- const recipientIdSize =
693
- storedRecipientIdSize > 0
694
- ? storedRecipientIdSize
695
- : this.cryptoCore.consts.MULTIPLE.RECIPIENT_ID_SIZE;
696
-
697
- // Read recipient count
698
- const recipientCount = data.readUInt16BE(offset);
699
- if (
700
- recipientCount <= 0 ||
701
- recipientCount > this.cryptoCore.consts.MULTIPLE.MAX_RECIPIENTS
702
- ) {
703
- throw new ECIESError(ECIESErrorTypeEnum.InvalidRecipientCount);
704
- }
705
- offset += this.cryptoCore.consts.MULTIPLE.RECIPIENT_COUNT_SIZE; // 2 bytes
706
-
707
- // Ensure there's enough data for all recipients
708
- // Note: We can't use calculateECIESMultipleRecipientOverhead here easily because it assumes fixed ID size
709
- // But we can calculate manually
710
- const remainingHeaderSize =
711
- recipientCount * recipientIdSize +
712
- recipientCount * this.cryptoCore.consts.MULTIPLE.ENCRYPTED_KEY_SIZE;
713
-
714
- if (data.length < offset + remainingHeaderSize) {
715
- throw new ECIESError(ECIESErrorTypeEnum.InvalidDataLength);
716
- }
717
-
718
- // Read recipient IDs
719
- const recipientIds: Buffer[] = [];
720
- for (let i = 0; i < recipientCount; i++) {
721
- recipientIds.push(data.subarray(offset, offset + recipientIdSize));
722
- offset += recipientIdSize;
723
- }
724
-
725
- // Read encrypted keys with variable lengths based on encryption type
726
- const recipientKeys: Buffer[] = [];
727
- for (let i = 0; i < recipientCount; i++) {
728
- if (offset >= data.length) {
729
- throw new ECIESError(ECIESErrorTypeEnum.InvalidDataLength);
730
- }
731
-
732
- if (
733
- offset + this.cryptoCore.consts.MULTIPLE.ENCRYPTED_KEY_SIZE >
734
- data.length
735
- ) {
736
- throw new ECIESError(
737
- ECIESErrorTypeEnum.InvalidDataLength,
738
- undefined,
739
- undefined,
740
- {
741
- required: String(
742
- this.cryptoCore.consts.MULTIPLE.ENCRYPTED_KEY_SIZE
743
- ),
744
- available: String(data.length - offset),
745
- }
746
- );
747
- }
748
-
749
- recipientKeys.push(
750
- data.subarray(
751
- offset,
752
- offset + this.cryptoCore.consts.MULTIPLE.ENCRYPTED_KEY_SIZE
753
- )
754
- );
755
- offset += this.cryptoCore.consts.MULTIPLE.ENCRYPTED_KEY_SIZE;
756
- }
757
-
758
- return {
759
- dataLength,
760
- recipientCount,
761
- recipientIds,
762
- recipientKeys,
763
- headerSize: offset,
764
- ephemeralPublicKey,
765
- };
766
- }
767
-
768
- /**
769
- * Parses a multi-encrypted buffer into its components.
770
- * @param data - The multi-encrypted buffer to parse.
771
- * @returns The parsed multi-encrypted buffer.
772
- */
773
- public parseMultiEncryptedBuffer(data: Buffer): IMultiEncryptedMessage {
774
- const header = this.parseMultiEncryptedHeader(data);
775
- const encryptedMessage = data.subarray(header.headerSize);
776
-
777
- return {
778
- ...header,
779
- encryptedMessage,
780
- };
781
- }
782
- }