@digitaldefiance/node-ecies-lib 4.4.8 → 4.4.10

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 +183 -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,743 +0,0 @@
1
- import {
2
- EciesCipherSuiteEnum,
3
- EciesEncryptionType,
4
- EciesEncryptionTypeEnum,
5
- EciesEncryptionTypeMap,
6
- ECIESError,
7
- ECIESErrorTypeEnum,
8
- EciesVersionEnum,
9
- encryptionTypeToString,
10
- ensureEciesEncryptionTypeEnum,
11
- IECIESConfig,
12
- UINT32_MAX,
13
- UINT64_SIZE,
14
- } from '@digitaldefiance/ecies-lib';
15
- import { createCipheriv, createDecipheriv, randomBytes } from 'crypto';
16
- import {
17
- getEciesPluginI18nEngine,
18
- NodeEciesComponentId,
19
- NodeEciesStringKey,
20
- } from '../../i18n/ecies-i18n-factory';
21
- import { AuthenticatedCipher } from '../../interfaces/authenticated-cipher';
22
- import { AuthenticatedDecipher } from '../../interfaces/authenticated-decipher';
23
- import { ISingleEncryptedParsedHeader } from '../../interfaces/single-encrypted-parsed-header';
24
- import { EciesCryptoCore } from './crypto-core';
25
-
26
- export class EciesSingleRecipientCore {
27
- protected readonly cryptoCore: EciesCryptoCore;
28
- protected readonly config: IECIESConfig;
29
-
30
- constructor(config: IECIESConfig) {
31
- this.config = config;
32
- this.cryptoCore = new EciesCryptoCore(config);
33
- }
34
-
35
- /**
36
- * Get the size of the header for a given encryption type
37
- * @param encryptionType The encryption type (single, simple, etc.)
38
- * @returns
39
- */
40
- public getHeaderSize(encryptionType: EciesEncryptionType): number {
41
- switch (encryptionType) {
42
- case 'simple':
43
- return this.cryptoCore.consts.SIMPLE.FIXED_OVERHEAD_SIZE;
44
- case 'single':
45
- return this.cryptoCore.consts.SINGLE.FIXED_OVERHEAD_SIZE;
46
- default:
47
- throw new ECIESError(ECIESErrorTypeEnum.InvalidEncryptionType);
48
- }
49
- }
50
-
51
- /**
52
- * Encrypt a message with a public key
53
- * @param encryptSimple Whether to simple encrypt (without crc, length)
54
- * @param receiverPublicKey The public key of the receiver
55
- * @param message The message to encrypt
56
- * @param preamble Optional preamble to prepend to the encrypted message
57
- * @param options Optional encryption options
58
- * @param options.recipientCount The number of recipients for multiple encryption mode
59
- * @returns The encrypted message
60
- */
61
- public encrypt(
62
- encryptSimple: boolean,
63
- receiverPublicKey: Buffer,
64
- message: Buffer,
65
- preamble: Buffer = Buffer.alloc(0)
66
- ): Buffer {
67
- // Security fix 4: Message size validation
68
- if (message.length === 0) {
69
- throw new ECIESError(ECIESErrorTypeEnum.CannotEncryptEmptyData);
70
- }
71
- if (message.length > 0x7fffffff) {
72
- throw new ECIESError(ECIESErrorTypeEnum.MessageTooLarge);
73
- }
74
-
75
- const encryptionType: EciesEncryptionType = encryptSimple
76
- ? 'simple'
77
- : 'single';
78
- const encryptionTypeBuffer = Buffer.alloc(1);
79
- encryptionTypeBuffer.writeUint8(
80
- EciesEncryptionTypeMap[
81
- encryptionType as keyof typeof EciesEncryptionTypeMap
82
- ] as number
83
- );
84
-
85
- const versionBuffer = Buffer.alloc(1);
86
- versionBuffer.writeUint8(EciesVersionEnum.V1);
87
-
88
- const cipherSuiteBuffer = Buffer.alloc(1);
89
- cipherSuiteBuffer.writeUint8(
90
- EciesCipherSuiteEnum.Secp256k1_Aes256Gcm_Sha256
91
- );
92
-
93
- if (message.length > this.cryptoCore.consts.MAX_RAW_DATA_SIZE) {
94
- const pluginEngine = getEciesPluginI18nEngine();
95
- throw new ECIESError(
96
- ECIESErrorTypeEnum.InvalidDataLength,
97
- undefined,
98
- undefined,
99
- {
100
- error: pluginEngine.translate(
101
- NodeEciesComponentId,
102
- NodeEciesStringKey.Error_MessageLengthExceedsMaximumAllowedSize
103
- ),
104
- maxLength: String(UINT32_MAX),
105
- messageLength: String(message.length),
106
- }
107
- );
108
- }
109
- // Generate ephemeral ECDH key pair
110
- // Use cryptoCore to generate keys to ensure compatibility with computeSharedSecret
111
- const ephemeralPrivateKey = this.cryptoCore.generatePrivateKey();
112
- let ephemeralPublicKey = this.cryptoCore.getPublicKey(ephemeralPrivateKey);
113
-
114
- // Compute shared secret
115
- let sharedSecret: Buffer;
116
- try {
117
- // Make sure we normalize the receiver's public key
118
- const normalizedReceiverPublicKey =
119
- this.cryptoCore.normalizePublicKey(receiverPublicKey);
120
-
121
- // Use cryptoCore to compute shared secret (handles compressed keys better)
122
- sharedSecret = this.cryptoCore.computeSharedSecret(
123
- ephemeralPrivateKey,
124
- normalizedReceiverPublicKey
125
- );
126
- } catch (error: unknown) {
127
- if (process.env.NODE_ENV !== 'test') {
128
- console.error(
129
- '[ERROR][encrypt] Failed to compute shared secret:',
130
- error
131
- );
132
- }
133
- if (error instanceof Error) {
134
- if (
135
- 'code' in error &&
136
- (error as any).code === 'ERR_CRYPTO_ECDH_INVALID_PUBLIC_KEY'
137
- ) {
138
- throw new ECIESError(
139
- ECIESErrorTypeEnum.InvalidRecipientPublicKey,
140
- undefined,
141
- undefined,
142
- {
143
- nodeError: (error as any).code,
144
- }
145
- );
146
- }
147
- throw new ECIESError(
148
- ECIESErrorTypeEnum.SecretComputationFailed,
149
- undefined,
150
- undefined,
151
- {
152
- error: error.message,
153
- }
154
- );
155
- }
156
- throw new ECIESError(ECIESErrorTypeEnum.SecretComputationFailed);
157
- }
158
-
159
- // Get the ephemeral public key and ensure it has the 0x04 prefix
160
- // ephemeralPublicKey is already set above and is compressed.
161
-
162
- // Generate random IV
163
- const iv = randomBytes(this.cryptoCore.consts.IV_SIZE);
164
-
165
- // Use HKDF to derive the key
166
- const symKey = this.cryptoCore.deriveSharedKey(
167
- sharedSecret,
168
- Buffer.alloc(0), // No salt
169
- Buffer.from('ecies-v2-key-derivation'), // Info
170
- this.cryptoCore.consts.SYMMETRIC.KEY_SIZE
171
- );
172
-
173
- // Create cipher with the derived symmetric key
174
- const cipher = createCipheriv(
175
- this.cryptoCore.consts.SYMMETRIC_ALGORITHM_CONFIGURATION,
176
- symKey,
177
- iv
178
- ) as AuthenticatedCipher;
179
-
180
- // Ensure auto padding is enabled
181
- cipher.setAutoPadding(true);
182
-
183
- // Construct AAD
184
- // AAD = Preamble + Version + CipherSuite + EncryptionType + EphemeralPublicKey
185
- // We don't include IV in AAD as it's already authenticated by GCM mechanism
186
- // We don't include Length in AAD because it's variable/optional and might complicate things?
187
- // Actually, let's include what we can.
188
- // For now, let's stick to the metadata that identifies the context.
189
- const aad = Buffer.concat([
190
- preamble,
191
- versionBuffer,
192
- cipherSuiteBuffer,
193
- encryptionTypeBuffer,
194
- ephemeralPublicKey,
195
- ]);
196
- cipher.setAAD(aad);
197
-
198
- // Encrypt the message
199
- let encrypted = cipher.update(message);
200
- encrypted = Buffer.concat([encrypted, cipher.final()]);
201
-
202
- // Get and explicitly set the authentication tag to max tag length for consistency
203
- const authTag = cipher.getAuthTag();
204
-
205
- // Add a length prefix to the encrypted data to ensure we can extract the exact number of bytes during decryption
206
- const lengthBuffer =
207
- encryptionType === 'simple' ? Buffer.alloc(0) : Buffer.alloc(UINT64_SIZE);
208
- if (encryptionType === 'single') {
209
- lengthBuffer.writeBigUInt64BE(BigInt(encrypted.length));
210
- }
211
-
212
- // Security fix 5: Encrypted size validation
213
- const maxExpectedSize = message.length + 1024;
214
- if (encrypted.length > maxExpectedSize) {
215
- throw new ECIESError(ECIESErrorTypeEnum.EncryptedSizeExceedsExpected);
216
- }
217
-
218
- // Format: [optional preamble] | version (1) | cipherSuite (1) | type (1) | ephemeralPublicKey (65) | iv (16) | authTag (16) | length (8) | encryptedData
219
- return Buffer.concat([
220
- preamble,
221
- versionBuffer,
222
- cipherSuiteBuffer,
223
- encryptionTypeBuffer,
224
- ephemeralPublicKey,
225
- iv,
226
- authTag,
227
- lengthBuffer,
228
- encrypted,
229
- ]);
230
- }
231
-
232
- /**
233
- * Parse the header from encrypted data
234
- * @param encryptionType The type of encryption (single, simple, etc.) or undefined if not known
235
- * @param data The encrypted data
236
- * @param preambleSize The size of the preamble, if any
237
- * @param options Optional parsing options
238
- * @param options.dataLength The expected length of the data
239
- * @returns The parsed header components
240
- */
241
- public parseEncryptedMessage(
242
- encryptionType: EciesEncryptionTypeEnum | undefined,
243
- data: Buffer,
244
- preambleSize: number = 0,
245
- options?: {
246
- dataLength?: number;
247
- }
248
- ): { header: ISingleEncryptedParsedHeader; data: Buffer; remainder: Buffer } {
249
- let offset = 0;
250
- const preamble = data.subarray(0, preambleSize);
251
- offset += preambleSize;
252
-
253
- // Read Version
254
- const version = data.readUInt8(offset);
255
- offset += this.cryptoCore.consts.VERSION_SIZE;
256
- if (version !== EciesVersionEnum.V1) {
257
- throw new ECIESError(
258
- ECIESErrorTypeEnum.InvalidVersionTemplate,
259
- undefined,
260
- undefined,
261
- { version: String(version) }
262
- );
263
- }
264
-
265
- // Read CipherSuite
266
- const cipherSuite = data.readUInt8(offset);
267
- offset += this.cryptoCore.consts.CIPHER_SUITE_SIZE;
268
- if (cipherSuite !== EciesCipherSuiteEnum.Secp256k1_Aes256Gcm_Sha256) {
269
- throw new ECIESError(
270
- ECIESErrorTypeEnum.InvalidCipherSuiteTemplate,
271
- undefined,
272
- undefined,
273
- { cipherSuite: String(cipherSuite) }
274
- );
275
- }
276
-
277
- // read the encryption type from the first byte after the preamble and version/suite
278
- const actualEncryptionTypeEnum = ensureEciesEncryptionTypeEnum(
279
- data.readUInt8(offset)
280
- );
281
- // if a type is provided, ensure it matches the actual type
282
- if (
283
- encryptionType !== undefined &&
284
- actualEncryptionTypeEnum !== encryptionType
285
- ) {
286
- throw new ECIESError(
287
- ECIESErrorTypeEnum.InvalidEncryptionType,
288
- undefined,
289
- undefined,
290
- {
291
- expected: encryptionTypeToString(encryptionType),
292
- actual: encryptionTypeToString(actualEncryptionTypeEnum),
293
- }
294
- );
295
- }
296
-
297
- if (actualEncryptionTypeEnum === EciesEncryptionTypeEnum.Multiple) {
298
- throw new ECIESError(
299
- ECIESErrorTypeEnum.InvalidEncryptionType,
300
- undefined,
301
- undefined,
302
- {
303
- expected: 'single or simple',
304
- actual: encryptionTypeToString(actualEncryptionTypeEnum),
305
- }
306
- );
307
- }
308
- const includeLengthAndCrc =
309
- actualEncryptionTypeEnum === EciesEncryptionTypeEnum.Single;
310
-
311
- // Security fix 6: Minimum encrypted data size
312
- const minSize = includeLengthAndCrc
313
- ? this.cryptoCore.consts.SINGLE.FIXED_OVERHEAD_SIZE
314
- : this.cryptoCore.consts.SIMPLE.FIXED_OVERHEAD_SIZE;
315
- if (data.length < minSize) {
316
- throw new ECIESError(ECIESErrorTypeEnum.InvalidEncryptedDataLength);
317
- }
318
-
319
- // skip the already-read encryption type
320
- offset += 1;
321
-
322
- // Extract components from the header
323
- const ephemeralPublicKey = data.subarray(
324
- offset,
325
- offset + this.cryptoCore.consts.PUBLIC_KEY_LENGTH
326
- );
327
- offset += this.cryptoCore.consts.PUBLIC_KEY_LENGTH;
328
-
329
- // Make sure we normalize the ephemeral public key
330
- const normalizedKey =
331
- this.cryptoCore.normalizePublicKey(ephemeralPublicKey);
332
-
333
- const iv = data.subarray(offset, offset + this.cryptoCore.consts.IV_SIZE);
334
- offset += this.cryptoCore.consts.IV_SIZE;
335
-
336
- const authTag = data.subarray(
337
- offset,
338
- offset + this.cryptoCore.consts.AUTH_TAG_SIZE
339
- );
340
- offset += this.cryptoCore.consts.AUTH_TAG_SIZE;
341
-
342
- // Extract the length prefix (4 bytes) after the header components
343
- const dataLengthBuffer = includeLengthAndCrc
344
- ? data.subarray(
345
- offset,
346
- offset + this.cryptoCore.consts.SINGLE.DATA_LENGTH_SIZE
347
- )
348
- : Buffer.alloc(0);
349
- if (includeLengthAndCrc) {
350
- offset += this.cryptoCore.consts.SINGLE.DATA_LENGTH_SIZE;
351
- }
352
-
353
- const dataLength = includeLengthAndCrc
354
- ? Number(dataLengthBuffer.readBigUInt64BE(0))
355
- : options?.dataLength ?? -1;
356
-
357
- if (
358
- includeLengthAndCrc &&
359
- options?.dataLength !== undefined &&
360
- dataLength !== options.dataLength
361
- ) {
362
- const pluginEngine = getEciesPluginI18nEngine();
363
- throw new ECIESError(
364
- ECIESErrorTypeEnum.InvalidEncryptedDataLength,
365
- undefined,
366
- undefined,
367
- {
368
- error: pluginEngine.translate(
369
- NodeEciesComponentId,
370
- NodeEciesStringKey.Error_EncryptedDataLengthMismatch
371
- ),
372
- expected: String(dataLength),
373
- actual: String(options.dataLength),
374
- }
375
- );
376
- }
377
-
378
- // No CRC in Single encryption (AES-GCM provides authentication)
379
-
380
- const encryptedData =
381
- dataLength > 0
382
- ? data.subarray(offset, offset + dataLength)
383
- : data.subarray(offset);
384
- if (includeLengthAndCrc) {
385
- offset += dataLength;
386
- }
387
-
388
- if (includeLengthAndCrc && encryptedData.length !== dataLength) {
389
- throw new ECIESError(
390
- ECIESErrorTypeEnum.InvalidEncryptedDataLength,
391
- undefined,
392
- undefined,
393
- {
394
- expected: String(dataLength),
395
- actual: String(encryptedData.length),
396
- }
397
- );
398
- }
399
-
400
- const remainder = includeLengthAndCrc
401
- ? data.subarray(offset)
402
- : Buffer.alloc(0);
403
-
404
- // No CRC validation needed (AES-GCM provides authentication)
405
-
406
- // Security fix 7: Component extraction validation
407
- if (normalizedKey.length !== this.cryptoCore.consts.PUBLIC_KEY_LENGTH) {
408
- const pluginEngine = getEciesPluginI18nEngine();
409
- throw new ECIESError(
410
- ECIESErrorTypeEnum.InvalidEphemeralPublicKey,
411
- undefined,
412
- undefined,
413
- {
414
- error: pluginEngine.translate(
415
- NodeEciesComponentId,
416
- NodeEciesStringKey.Error_EphemeralPublicKeyLengthMismatch
417
- ),
418
- expected: String(this.cryptoCore.consts.PUBLIC_KEY_LENGTH),
419
- actual: String(normalizedKey.length),
420
- }
421
- );
422
- }
423
-
424
- if (iv.length !== this.cryptoCore.consts.IV_SIZE) {
425
- throw new ECIESError(
426
- ECIESErrorTypeEnum.InvalidIVLength,
427
- undefined,
428
- undefined,
429
- {
430
- expected: String(this.cryptoCore.consts.IV_SIZE),
431
- actual: String(iv.length),
432
- }
433
- );
434
- }
435
-
436
- if (authTag.length !== this.cryptoCore.consts.AUTH_TAG_SIZE) {
437
- throw new ECIESError(
438
- ECIESErrorTypeEnum.InvalidAuthTagLength,
439
- undefined,
440
- undefined,
441
- {
442
- expected: String(this.cryptoCore.consts.AUTH_TAG_SIZE),
443
- actual: String(authTag.length),
444
- }
445
- );
446
- }
447
-
448
- return {
449
- header: {
450
- preamble,
451
- encryptionType: actualEncryptionTypeEnum,
452
- ephemeralPublicKey: normalizedKey,
453
- iv,
454
- authTag,
455
- dataLength,
456
- headerSize: includeLengthAndCrc
457
- ? this.cryptoCore.consts.SINGLE.FIXED_OVERHEAD_SIZE
458
- : this.cryptoCore.consts.SIMPLE.FIXED_OVERHEAD_SIZE,
459
- },
460
- data: encryptedData,
461
- remainder,
462
- };
463
- }
464
-
465
- /**
466
- * Decrypts data encrypted with ECIES using a header
467
- * This method maintains backward compatibility with the original implementation
468
- * by returning just the Buffer. For detailed information, use decryptSingleWithHeaderEx
469
- * @param encryptionType The type of encryption (single, simple, etc.)
470
- * @param privateKey The private key to decrypt the data
471
- * @param encryptedData The data to decrypt
472
- * @param preambleSize The size of the preamble, if any
473
- * @param options Optional decryption options
474
- * @param options.dataLength The expected length of the data
475
- * @returns The decrypted data buffer
476
- */
477
- public decryptWithHeader(
478
- encryptionType: EciesEncryptionTypeEnum | undefined,
479
- privateKey: Buffer,
480
- encryptedData: Buffer,
481
- preambleSize: number = 0,
482
- options?: {
483
- dataLength?: number;
484
- }
485
- ): Buffer {
486
- try {
487
- // Call the extended version and return only the decrypted buffer for backward compatibility
488
- const result = this.decryptWithHeaderEx(
489
- encryptionType,
490
- privateKey,
491
- encryptedData,
492
- preambleSize,
493
- options
494
- );
495
- return result.decrypted;
496
- } catch (error) {
497
- if (error instanceof ECIESError) {
498
- throw error;
499
- }
500
- throw new ECIESError(
501
- ECIESErrorTypeEnum.DecryptionFailed,
502
- undefined,
503
- undefined,
504
- {
505
- error: error instanceof Error ? error.message : String(error),
506
- }
507
- );
508
- }
509
- }
510
-
511
- /**
512
- * Extended version of decryptSingleWithHeader that provides more detailed information
513
- * @param encryptionType The type of encryption (single, simple, etc.)
514
- * @param privateKey The private key to decrypt the data
515
- * @param encryptedData The data to decrypt
516
- * @param preambleSize The size of the preamble, if any
517
- * @param options Optional decryption options
518
- * @param options.dataLength The expected length of the data
519
- * @returns The decrypted data and the number of bytes consumed from the input buffer
520
- */
521
- public decryptWithHeaderEx(
522
- encryptionType: EciesEncryptionTypeEnum | undefined,
523
- privateKey: Buffer,
524
- encryptedData: Buffer,
525
- preambleSize: number = 0,
526
- options?: {
527
- dataLength?: number;
528
- }
529
- ): { decrypted: Buffer; consumedBytes: number } {
530
- try {
531
- const { data, header } = this.parseEncryptedMessage(
532
- encryptionType,
533
- encryptedData,
534
- preambleSize,
535
- options
536
- );
537
-
538
- // Normalize the public key (ensuring 0x04 prefix)
539
- const normalizedKey = this.cryptoCore.normalizePublicKey(
540
- header.ephemeralPublicKey
541
- );
542
-
543
- // Construct AAD
544
- const versionBuffer = Buffer.alloc(1);
545
- versionBuffer.writeUint8(EciesVersionEnum.V1);
546
-
547
- const cipherSuiteBuffer = Buffer.alloc(1);
548
- cipherSuiteBuffer.writeUint8(
549
- EciesCipherSuiteEnum.Secp256k1_Aes256Gcm_Sha256
550
- );
551
-
552
- const encryptionTypeBuffer = Buffer.alloc(1);
553
- encryptionTypeBuffer.writeUint8(header.encryptionType);
554
-
555
- const aad = Buffer.concat([
556
- header.preamble ?? Buffer.alloc(preambleSize),
557
- versionBuffer,
558
- cipherSuiteBuffer,
559
- encryptionTypeBuffer,
560
- normalizedKey,
561
- ]);
562
-
563
- // Decrypt using components with the normalized key
564
- const decrypted = this.decryptWithComponents(
565
- privateKey,
566
- normalizedKey,
567
- header.iv,
568
- header.authTag,
569
- data,
570
- aad
571
- );
572
-
573
- return {
574
- decrypted,
575
- consumedBytes: header.dataLength + header.headerSize,
576
- };
577
- } catch (error) {
578
- if (error instanceof ECIESError) {
579
- throw error;
580
- }
581
- throw new ECIESError(
582
- ECIESErrorTypeEnum.DecryptionFailed,
583
- undefined,
584
- undefined,
585
- {
586
- error: error instanceof Error ? error.message : String(error),
587
- }
588
- );
589
- }
590
- }
591
-
592
- /**
593
- * Decrypts data encrypted with ECIES using components
594
- * @param privateKey The private key to decrypt the data
595
- * @param ephemeralPublicKey The ephemeral public key used to encrypt the data
596
- * @param iv The initialization vector used to encrypt the data
597
- * @param authTag The authentication tag used to encrypt the data
598
- * @param encrypted The encrypted data
599
- * @returns The decrypted data
600
- */
601
- public decryptWithComponents(
602
- privateKey: Buffer,
603
- ephemeralPublicKey: Buffer,
604
- iv: Buffer,
605
- authTag: Buffer,
606
- encrypted: Buffer,
607
- aad?: Buffer
608
- ): Buffer {
609
- try {
610
- // Ensure the ephemeral public key has the correct format
611
- const normalizedEphemeralKey =
612
- this.cryptoCore.normalizePublicKey(ephemeralPublicKey);
613
-
614
- // Use cryptoCore to compute shared secret (handles compressed keys better)
615
- let sharedSecret: Buffer;
616
- try {
617
- sharedSecret = this.cryptoCore.computeSharedSecret(
618
- privateKey,
619
- normalizedEphemeralKey
620
- );
621
- } catch (err) {
622
- if (process.env.NODE_ENV !== 'test') {
623
- console.error(
624
- '[ERROR][decrypt] Failed to compute shared secret:',
625
- err
626
- );
627
- }
628
- throw new ECIESError(
629
- ECIESErrorTypeEnum.DecryptionFailed,
630
- undefined,
631
- undefined,
632
- {
633
- originalError: err instanceof Error ? err.message : String(err),
634
- stage: 'shared_secret_computation',
635
- }
636
- );
637
- }
638
-
639
- // Use HKDF to derive the key
640
- const symKey = this.cryptoCore.deriveSharedKey(
641
- sharedSecret,
642
- Buffer.alloc(0), // No salt
643
- Buffer.from('ecies-v2-key-derivation'), // Info
644
- this.cryptoCore.consts.SYMMETRIC.KEY_SIZE
645
- );
646
-
647
- // Create decipher with shared secret-derived key
648
- const decipher = createDecipheriv(
649
- this.cryptoCore.consts.SYMMETRIC_ALGORITHM_CONFIGURATION,
650
- symKey,
651
- iv
652
- ) as AuthenticatedDecipher;
653
-
654
- // Validate the tag and IV
655
- if (authTag.length !== this.cryptoCore.consts.AUTH_TAG_SIZE) {
656
- throw new ECIESError(
657
- ECIESErrorTypeEnum.DecryptionFailed,
658
- undefined,
659
- undefined,
660
- {
661
- expected: String(this.cryptoCore.consts.AUTH_TAG_SIZE),
662
- actual: String(authTag.length),
663
- stage: 'auth_tag_validation',
664
- }
665
- );
666
- }
667
-
668
- if (iv.length !== this.cryptoCore.consts.IV_SIZE) {
669
- throw new ECIESError(
670
- ECIESErrorTypeEnum.DecryptionFailed,
671
- undefined,
672
- undefined,
673
- {
674
- expected: String(this.cryptoCore.consts.IV_SIZE),
675
- actual: String(iv.length),
676
- stage: 'iv_validation',
677
- }
678
- );
679
- }
680
-
681
- // Set the authentication tag for GCM mode
682
- decipher.setAuthTag(authTag);
683
-
684
- if (aad) {
685
- decipher.setAAD(aad);
686
- }
687
-
688
- // Decrypt the data
689
- try {
690
- // Handle edge case where encrypted data might be empty or malformed
691
- const pluginEngine = getEciesPluginI18nEngine();
692
- if (encrypted.length === 0) {
693
- throw new Error(
694
- pluginEngine.translate(
695
- NodeEciesComponentId,
696
- NodeEciesStringKey.Error_EncryptedDataIsEmpty
697
- )
698
- );
699
- }
700
-
701
- const firstPart = decipher.update(encrypted);
702
- const finalPart = decipher.final();
703
- const result = Buffer.concat([firstPart, finalPart]);
704
-
705
- // Security fix 8: Decrypted data validation
706
- if (result.length === 0) {
707
- throw new ECIESError(ECIESErrorTypeEnum.DecryptionFailed);
708
- }
709
-
710
- return result;
711
- } catch (err) {
712
- throw new ECIESError(
713
- ECIESErrorTypeEnum.DecryptionFailed,
714
- undefined,
715
- undefined,
716
- {
717
- error: err instanceof Error ? err.message : String(err),
718
- stage: 'decipher_operation',
719
- }
720
- );
721
- }
722
- } catch (error) {
723
- if (error instanceof ECIESError) {
724
- throw error;
725
- }
726
-
727
- // Wrap non-EciesError in an EciesError
728
- throw new ECIESError(
729
- ECIESErrorTypeEnum.DecryptionFailed,
730
- undefined,
731
- undefined,
732
- {
733
- error: error instanceof Error ? error.message : String(error),
734
- privateKeyLength: String(privateKey.length),
735
- ephemeralPublicKeyLength: String(ephemeralPublicKey.length),
736
- ivLength: String(iv.length),
737
- authTagLength: String(authTag.length),
738
- encryptedLength: String(encrypted.length),
739
- }
740
- );
741
- }
742
- }
743
- }