@digitaldefiance/ecies-lib 4.4.2 → 4.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (589) hide show
  1. package/LICENSE +21 -0
  2. package/package.json +9 -6
  3. package/src/builders/ecies-builder.ts +39 -0
  4. package/src/builders/{index.js → index.ts} +1 -1
  5. package/src/builders/member-builder.ts +155 -0
  6. package/src/constants.ts +609 -0
  7. package/src/core/errors/crypto-error.ts +78 -0
  8. package/src/core/{index.js → index.ts} +1 -1
  9. package/src/core/types/result.ts +19 -0
  10. package/src/email-string.ts +82 -0
  11. package/src/enumerations/disposed-error-type.ts +11 -0
  12. package/src/enumerations/ecies-cipher-suite.ts +4 -0
  13. package/src/enumerations/ecies-encryption-type.ts +41 -0
  14. package/src/enumerations/ecies-error-type.ts +43 -0
  15. package/src/enumerations/ecies-string-key.ts +205 -0
  16. package/src/enumerations/ecies-version.ts +3 -0
  17. package/src/enumerations/guid-brand-type.ts +26 -0
  18. package/src/enumerations/guid-error-type.ts +6 -0
  19. package/src/enumerations/id-provider-error-type.ts +50 -0
  20. package/src/enumerations/{index.js → index.ts} +0 -1
  21. package/src/enumerations/invalid-email-type.ts +5 -0
  22. package/src/enumerations/length-encoding-type.ts +6 -0
  23. package/src/enumerations/length-error-type.ts +5 -0
  24. package/src/enumerations/member-error-type.ts +106 -0
  25. package/src/enumerations/{member-type.d.ts → member-type.ts} +7 -6
  26. package/src/enumerations/password-login-error-type.ts +4 -0
  27. package/src/enumerations/pbkdf2-error-type.ts +5 -0
  28. package/src/enumerations/pbkdf2-profile.ts +5 -0
  29. package/src/enumerations/secure-storage-error-type.ts +5 -0
  30. package/src/errors/disposed.ts +36 -0
  31. package/src/errors/ecies.ts +153 -0
  32. package/src/errors/guid.ts +130 -0
  33. package/src/errors/id-provider.ts +40 -0
  34. package/src/errors/{index.d.ts → index.ts} +0 -1
  35. package/src/errors/invalid-email.ts +23 -0
  36. package/src/errors/length.ts +19 -0
  37. package/src/errors/member.ts +20 -0
  38. package/src/errors/pbkdf2.ts +20 -0
  39. package/src/errors/secure-storage.ts +17 -0
  40. package/src/errors/simple-ecies.ts +21 -0
  41. package/src/errors/simple-test-error.ts +6 -0
  42. package/src/i18n-setup.ts +130 -0
  43. package/src/{index.js → index.ts} +64 -7
  44. package/src/interfaces/checksum-config.ts +4 -0
  45. package/src/interfaces/checksum-consts.ts +13 -0
  46. package/src/interfaces/configuration-provenance.ts +54 -0
  47. package/src/interfaces/constants.ts +75 -0
  48. package/src/interfaces/ecies-config.ts +8 -0
  49. package/src/interfaces/ecies-consts.ts +74 -0
  50. package/src/interfaces/ecies-file-service.ts +6 -0
  51. package/src/interfaces/encrypted-chunk.ts +64 -0
  52. package/src/interfaces/encryption-state.ts +19 -0
  53. package/src/interfaces/frontend-member-operational.ts +77 -0
  54. package/src/interfaces/guid.ts +86 -0
  55. package/src/interfaces/id-provider.ts +152 -0
  56. package/src/interfaces/{index.d.ts → index.ts} +0 -1
  57. package/src/interfaces/invariant.ts +60 -0
  58. package/src/interfaces/library-error.ts +23 -0
  59. package/src/interfaces/{member-storage.d.ts → member-storage.ts} +11 -10
  60. package/src/interfaces/{member-with-mnemonic.d.ts → member-with-mnemonic.ts} +3 -3
  61. package/src/interfaces/member.ts +84 -0
  62. package/src/interfaces/multi-recipient-chunk.ts +61 -0
  63. package/src/interfaces/pbkdf2-config.ts +6 -0
  64. package/src/interfaces/pbkdf2-consts.ts +10 -0
  65. package/src/interfaces/pbkdf2-result.ts +5 -0
  66. package/src/interfaces/stream-config.ts +17 -0
  67. package/src/interfaces/stream-header.ts +34 -0
  68. package/src/interfaces/stream-progress.ts +31 -0
  69. package/src/lib/configuration-provenance-utils.ts +26 -0
  70. package/src/lib/crypto-container.ts +64 -0
  71. package/src/lib/guid.ts +1097 -0
  72. package/src/lib/id-providers/custom-provider.ts +109 -0
  73. package/src/lib/id-providers/guidv4-provider.ts +141 -0
  74. package/src/lib/id-providers/{index.d.ts → index.ts} +6 -5
  75. package/src/lib/id-providers/objectid-provider.ts +125 -0
  76. package/src/lib/id-providers/uuid-provider.ts +133 -0
  77. package/src/lib/{index.js → index.ts} +2 -2
  78. package/src/lib/invariant-validator.ts +133 -0
  79. package/src/lib/invariants/encryption-algorithm-consistency.ts +73 -0
  80. package/src/lib/invariants/{index.js → index.ts} +0 -1
  81. package/src/lib/invariants/pbkdf2-profiles-validity.ts +78 -0
  82. package/src/lib/invariants/recipient-id-consistency.ts +46 -0
  83. package/src/lib/multi-recipient-chunk-utils.ts +63 -0
  84. package/src/member.ts +495 -0
  85. package/src/{pbkdf2-profiles.d.ts → pbkdf2-profiles.ts} +2 -2
  86. package/src/phone-number.ts +18 -0
  87. package/src/regexes.ts +10 -0
  88. package/src/secure-buffer.ts +226 -0
  89. package/src/secure-string.ts +244 -0
  90. package/src/services/aes-gcm.ts +220 -0
  91. package/src/services/chunk-processor.ts +188 -0
  92. package/src/services/ecies/README.md +147 -0
  93. package/src/services/ecies/crypto-core.ts +292 -0
  94. package/src/services/ecies/example.ts +185 -0
  95. package/src/services/ecies/file.ts +167 -0
  96. package/src/services/ecies/{index.js → index.ts} +2 -1
  97. package/src/services/ecies/integration.ts +241 -0
  98. package/src/services/ecies/interfaces.ts +62 -0
  99. package/src/services/ecies/manual-test.ts +219 -0
  100. package/src/services/ecies/multi-recipient.ts +545 -0
  101. package/src/services/ecies/service.ts +370 -0
  102. package/src/services/ecies/signature.ts +93 -0
  103. package/src/services/ecies/single-recipient.ts +476 -0
  104. package/src/services/encryption-stream.ts +435 -0
  105. package/src/services/{index.js → index.ts} +0 -1
  106. package/src/services/multi-recipient-processor.ts +377 -0
  107. package/src/services/password-login.ts +226 -0
  108. package/src/services/pbkdf2.ts +169 -0
  109. package/src/services/progress-tracker.ts +128 -0
  110. package/src/services/resumable-encryption.ts +135 -0
  111. package/src/services/xor.ts +65 -0
  112. package/src/test-mocks/index.ts +1 -0
  113. package/src/test-mocks/mock-frontend-member.ts +276 -0
  114. package/src/{testing.js → testing.ts} +0 -1
  115. package/src/translations/{de.js → de.ts} +112 -56
  116. package/src/translations/{en-US.js → en-US.ts} +116 -58
  117. package/src/translations/{es.js → es.ts} +134 -67
  118. package/src/translations/{fr.js → fr.ts} +129 -64
  119. package/src/translations/{ja.js → ja.ts} +111 -55
  120. package/src/translations/{uk.js → uk.ts} +132 -67
  121. package/src/translations/{zh-cn.js → zh-cn.ts} +60 -29
  122. package/src/types/deep-partial.ts +11 -0
  123. package/src/{types.d.ts → types.ts} +15 -7
  124. package/src/utils/encryption-type-utils.ts +76 -0
  125. package/src/utils.ts +329 -0
  126. package/src/builders/ecies-builder.d.ts +0 -18
  127. package/src/builders/ecies-builder.d.ts.map +0 -1
  128. package/src/builders/ecies-builder.js +0 -30
  129. package/src/builders/ecies-builder.js.map +0 -1
  130. package/src/builders/index.d.ts +0 -6
  131. package/src/builders/index.d.ts.map +0 -1
  132. package/src/builders/index.js.map +0 -1
  133. package/src/builders/member-builder.d.ts +0 -51
  134. package/src/builders/member-builder.d.ts.map +0 -1
  135. package/src/builders/member-builder.js +0 -97
  136. package/src/builders/member-builder.js.map +0 -1
  137. package/src/constants.d.ts +0 -60
  138. package/src/constants.d.ts.map +0 -1
  139. package/src/constants.js +0 -446
  140. package/src/constants.js.map +0 -1
  141. package/src/core/errors/crypto-error.d.ts +0 -34
  142. package/src/core/errors/crypto-error.d.ts.map +0 -1
  143. package/src/core/errors/crypto-error.js +0 -56
  144. package/src/core/errors/crypto-error.js.map +0 -1
  145. package/src/core/index.d.ts +0 -6
  146. package/src/core/index.d.ts.map +0 -1
  147. package/src/core/index.js.map +0 -1
  148. package/src/core/types/result.d.ts +0 -16
  149. package/src/core/types/result.d.ts.map +0 -1
  150. package/src/core/types/result.js +0 -12
  151. package/src/core/types/result.js.map +0 -1
  152. package/src/email-string.d.ts +0 -42
  153. package/src/email-string.d.ts.map +0 -1
  154. package/src/email-string.js +0 -67
  155. package/src/email-string.js.map +0 -1
  156. package/src/enumerations/disposed-error-type.d.ts +0 -12
  157. package/src/enumerations/disposed-error-type.d.ts.map +0 -1
  158. package/src/enumerations/disposed-error-type.js +0 -13
  159. package/src/enumerations/disposed-error-type.js.map +0 -1
  160. package/src/enumerations/ecies-cipher-suite.d.ts +0 -4
  161. package/src/enumerations/ecies-cipher-suite.d.ts.map +0 -1
  162. package/src/enumerations/ecies-cipher-suite.js +0 -6
  163. package/src/enumerations/ecies-cipher-suite.js.map +0 -1
  164. package/src/enumerations/ecies-encryption-type.d.ts +0 -11
  165. package/src/enumerations/ecies-encryption-type.d.ts.map +0 -1
  166. package/src/enumerations/ecies-encryption-type.js +0 -27
  167. package/src/enumerations/ecies-encryption-type.js.map +0 -1
  168. package/src/enumerations/ecies-error-type.d.ts +0 -44
  169. package/src/enumerations/ecies-error-type.d.ts.map +0 -1
  170. package/src/enumerations/ecies-error-type.js +0 -45
  171. package/src/enumerations/ecies-error-type.js.map +0 -1
  172. package/src/enumerations/ecies-string-key.d.ts +0 -192
  173. package/src/enumerations/ecies-string-key.d.ts.map +0 -1
  174. package/src/enumerations/ecies-string-key.js +0 -199
  175. package/src/enumerations/ecies-string-key.js.map +0 -1
  176. package/src/enumerations/ecies-version.d.ts +0 -4
  177. package/src/enumerations/ecies-version.d.ts.map +0 -1
  178. package/src/enumerations/ecies-version.js +0 -5
  179. package/src/enumerations/ecies-version.js.map +0 -1
  180. package/src/enumerations/guid-brand-type.d.ts +0 -27
  181. package/src/enumerations/guid-brand-type.d.ts.map +0 -1
  182. package/src/enumerations/guid-brand-type.js +0 -28
  183. package/src/enumerations/guid-brand-type.js.map +0 -1
  184. package/src/enumerations/guid-error-type.d.ts +0 -7
  185. package/src/enumerations/guid-error-type.d.ts.map +0 -1
  186. package/src/enumerations/guid-error-type.js +0 -8
  187. package/src/enumerations/guid-error-type.js.map +0 -1
  188. package/src/enumerations/id-provider-error-type.d.ts +0 -43
  189. package/src/enumerations/id-provider-error-type.d.ts.map +0 -1
  190. package/src/enumerations/id-provider-error-type.js +0 -44
  191. package/src/enumerations/id-provider-error-type.js.map +0 -1
  192. package/src/enumerations/index.d.ts +0 -18
  193. package/src/enumerations/index.d.ts.map +0 -1
  194. package/src/enumerations/index.js.map +0 -1
  195. package/src/enumerations/invalid-email-type.d.ts +0 -6
  196. package/src/enumerations/invalid-email-type.d.ts.map +0 -1
  197. package/src/enumerations/invalid-email-type.js +0 -7
  198. package/src/enumerations/invalid-email-type.js.map +0 -1
  199. package/src/enumerations/length-encoding-type.d.ts +0 -7
  200. package/src/enumerations/length-encoding-type.d.ts.map +0 -1
  201. package/src/enumerations/length-encoding-type.js +0 -8
  202. package/src/enumerations/length-encoding-type.js.map +0 -1
  203. package/src/enumerations/length-error-type.d.ts +0 -6
  204. package/src/enumerations/length-error-type.d.ts.map +0 -1
  205. package/src/enumerations/length-error-type.js +0 -7
  206. package/src/enumerations/length-error-type.js.map +0 -1
  207. package/src/enumerations/member-error-type.d.ts +0 -87
  208. package/src/enumerations/member-error-type.d.ts.map +0 -1
  209. package/src/enumerations/member-error-type.js +0 -88
  210. package/src/enumerations/member-error-type.js.map +0 -1
  211. package/src/enumerations/member-type.d.ts.map +0 -1
  212. package/src/enumerations/member-type.js +0 -16
  213. package/src/enumerations/member-type.js.map +0 -1
  214. package/src/enumerations/password-login-error-type.d.ts +0 -5
  215. package/src/enumerations/password-login-error-type.d.ts.map +0 -1
  216. package/src/enumerations/password-login-error-type.js +0 -6
  217. package/src/enumerations/password-login-error-type.js.map +0 -1
  218. package/src/enumerations/pbkdf2-error-type.d.ts +0 -6
  219. package/src/enumerations/pbkdf2-error-type.d.ts.map +0 -1
  220. package/src/enumerations/pbkdf2-error-type.js +0 -7
  221. package/src/enumerations/pbkdf2-error-type.js.map +0 -1
  222. package/src/enumerations/pbkdf2-profile.d.ts +0 -6
  223. package/src/enumerations/pbkdf2-profile.d.ts.map +0 -1
  224. package/src/enumerations/pbkdf2-profile.js +0 -7
  225. package/src/enumerations/pbkdf2-profile.js.map +0 -1
  226. package/src/enumerations/secure-storage-error-type.d.ts +0 -6
  227. package/src/enumerations/secure-storage-error-type.d.ts.map +0 -1
  228. package/src/enumerations/secure-storage-error-type.js +0 -7
  229. package/src/enumerations/secure-storage-error-type.js.map +0 -1
  230. package/src/errors/disposed.d.ts +0 -22
  231. package/src/errors/disposed.d.ts.map +0 -1
  232. package/src/errors/disposed.js +0 -28
  233. package/src/errors/disposed.js.map +0 -1
  234. package/src/errors/ecies.d.ts +0 -52
  235. package/src/errors/ecies.d.ts.map +0 -1
  236. package/src/errors/ecies.js +0 -78
  237. package/src/errors/ecies.js.map +0 -1
  238. package/src/errors/guid.d.ts +0 -49
  239. package/src/errors/guid.d.ts.map +0 -1
  240. package/src/errors/guid.js +0 -96
  241. package/src/errors/guid.js.map +0 -1
  242. package/src/errors/id-provider.d.ts +0 -23
  243. package/src/errors/id-provider.d.ts.map +0 -1
  244. package/src/errors/id-provider.js +0 -29
  245. package/src/errors/id-provider.js.map +0 -1
  246. package/src/errors/index.d.ts.map +0 -1
  247. package/src/errors/index.js +0 -10
  248. package/src/errors/index.js.map +0 -1
  249. package/src/errors/invalid-email.d.ts +0 -8
  250. package/src/errors/invalid-email.d.ts.map +0 -1
  251. package/src/errors/invalid-email.js +0 -15
  252. package/src/errors/invalid-email.js.map +0 -1
  253. package/src/errors/length.d.ts +0 -7
  254. package/src/errors/length.d.ts.map +0 -1
  255. package/src/errors/length.js +0 -11
  256. package/src/errors/length.js.map +0 -1
  257. package/src/errors/member.d.ts +0 -7
  258. package/src/errors/member.d.ts.map +0 -1
  259. package/src/errors/member.js +0 -11
  260. package/src/errors/member.js.map +0 -1
  261. package/src/errors/pbkdf2.d.ts +0 -7
  262. package/src/errors/pbkdf2.d.ts.map +0 -1
  263. package/src/errors/pbkdf2.js +0 -11
  264. package/src/errors/pbkdf2.js.map +0 -1
  265. package/src/errors/secure-storage.d.ts +0 -7
  266. package/src/errors/secure-storage.d.ts.map +0 -1
  267. package/src/errors/secure-storage.js +0 -12
  268. package/src/errors/secure-storage.js.map +0 -1
  269. package/src/errors/simple-ecies.d.ts +0 -6
  270. package/src/errors/simple-ecies.d.ts.map +0 -1
  271. package/src/errors/simple-ecies.js +0 -12
  272. package/src/errors/simple-ecies.js.map +0 -1
  273. package/src/errors/simple-test-error.d.ts +0 -4
  274. package/src/errors/simple-test-error.d.ts.map +0 -1
  275. package/src/errors/simple-test-error.js +0 -7
  276. package/src/errors/simple-test-error.js.map +0 -1
  277. package/src/i18n-setup.d.ts +0 -32
  278. package/src/i18n-setup.d.ts.map +0 -1
  279. package/src/i18n-setup.js +0 -101
  280. package/src/i18n-setup.js.map +0 -1
  281. package/src/index.d.ts +0 -80
  282. package/src/index.d.ts.map +0 -1
  283. package/src/index.js.map +0 -1
  284. package/src/interfaces/checksum-config.d.ts +0 -5
  285. package/src/interfaces/checksum-config.d.ts.map +0 -1
  286. package/src/interfaces/checksum-config.js +0 -2
  287. package/src/interfaces/checksum-config.js.map +0 -1
  288. package/src/interfaces/checksum-consts.d.ts +0 -11
  289. package/src/interfaces/checksum-consts.d.ts.map +0 -1
  290. package/src/interfaces/checksum-consts.js +0 -2
  291. package/src/interfaces/checksum-consts.js.map +0 -1
  292. package/src/interfaces/configuration-provenance.d.ts +0 -43
  293. package/src/interfaces/configuration-provenance.d.ts.map +0 -1
  294. package/src/interfaces/configuration-provenance.js +0 -3
  295. package/src/interfaces/configuration-provenance.js.map +0 -1
  296. package/src/interfaces/constants.d.ts +0 -70
  297. package/src/interfaces/constants.d.ts.map +0 -1
  298. package/src/interfaces/constants.js +0 -2
  299. package/src/interfaces/constants.js.map +0 -1
  300. package/src/interfaces/ecies-config.d.ts +0 -9
  301. package/src/interfaces/ecies-config.d.ts.map +0 -1
  302. package/src/interfaces/ecies-config.js +0 -2
  303. package/src/interfaces/ecies-config.js.map +0 -1
  304. package/src/interfaces/ecies-consts.d.ts +0 -61
  305. package/src/interfaces/ecies-consts.d.ts.map +0 -1
  306. package/src/interfaces/ecies-consts.js +0 -2
  307. package/src/interfaces/ecies-consts.js.map +0 -1
  308. package/src/interfaces/ecies-file-service.d.ts +0 -7
  309. package/src/interfaces/ecies-file-service.d.ts.map +0 -1
  310. package/src/interfaces/ecies-file-service.js +0 -2
  311. package/src/interfaces/ecies-file-service.js.map +0 -1
  312. package/src/interfaces/encrypted-chunk.d.ts +0 -55
  313. package/src/interfaces/encrypted-chunk.d.ts.map +0 -1
  314. package/src/interfaces/encrypted-chunk.js +0 -12
  315. package/src/interfaces/encrypted-chunk.js.map +0 -1
  316. package/src/interfaces/encryption-state.d.ts +0 -18
  317. package/src/interfaces/encryption-state.d.ts.map +0 -1
  318. package/src/interfaces/encryption-state.js +0 -2
  319. package/src/interfaces/encryption-state.js.map +0 -1
  320. package/src/interfaces/frontend-member-operational.d.ts +0 -51
  321. package/src/interfaces/frontend-member-operational.d.ts.map +0 -1
  322. package/src/interfaces/frontend-member-operational.js +0 -2
  323. package/src/interfaces/frontend-member-operational.js.map +0 -1
  324. package/src/interfaces/guid.d.ts +0 -78
  325. package/src/interfaces/guid.d.ts.map +0 -1
  326. package/src/interfaces/guid.js +0 -2
  327. package/src/interfaces/guid.js.map +0 -1
  328. package/src/interfaces/id-provider.d.ts +0 -107
  329. package/src/interfaces/id-provider.d.ts.map +0 -1
  330. package/src/interfaces/id-provider.js +0 -52
  331. package/src/interfaces/id-provider.js.map +0 -1
  332. package/src/interfaces/index.d.ts.map +0 -1
  333. package/src/interfaces/index.js +0 -13
  334. package/src/interfaces/index.js.map +0 -1
  335. package/src/interfaces/invariant.d.ts +0 -46
  336. package/src/interfaces/invariant.d.ts.map +0 -1
  337. package/src/interfaces/invariant.js +0 -18
  338. package/src/interfaces/invariant.js.map +0 -1
  339. package/src/interfaces/library-error.d.ts +0 -23
  340. package/src/interfaces/library-error.d.ts.map +0 -1
  341. package/src/interfaces/library-error.js +0 -2
  342. package/src/interfaces/library-error.js.map +0 -1
  343. package/src/interfaces/member-storage.d.ts.map +0 -1
  344. package/src/interfaces/member-storage.js +0 -2
  345. package/src/interfaces/member-storage.js.map +0 -1
  346. package/src/interfaces/member-with-mnemonic.d.ts.map +0 -1
  347. package/src/interfaces/member-with-mnemonic.js +0 -2
  348. package/src/interfaces/member-with-mnemonic.js.map +0 -1
  349. package/src/interfaces/member.d.ts +0 -55
  350. package/src/interfaces/member.d.ts.map +0 -1
  351. package/src/interfaces/member.js +0 -2
  352. package/src/interfaces/member.js.map +0 -1
  353. package/src/interfaces/multi-recipient-chunk.d.ts +0 -54
  354. package/src/interfaces/multi-recipient-chunk.d.ts.map +0 -1
  355. package/src/interfaces/multi-recipient-chunk.js +0 -11
  356. package/src/interfaces/multi-recipient-chunk.js.map +0 -1
  357. package/src/interfaces/pbkdf2-config.d.ts +0 -7
  358. package/src/interfaces/pbkdf2-config.d.ts.map +0 -1
  359. package/src/interfaces/pbkdf2-config.js +0 -2
  360. package/src/interfaces/pbkdf2-config.js.map +0 -1
  361. package/src/interfaces/pbkdf2-consts.d.ts +0 -9
  362. package/src/interfaces/pbkdf2-consts.d.ts.map +0 -1
  363. package/src/interfaces/pbkdf2-consts.js +0 -2
  364. package/src/interfaces/pbkdf2-consts.js.map +0 -1
  365. package/src/interfaces/pbkdf2-result.d.ts +0 -6
  366. package/src/interfaces/pbkdf2-result.d.ts.map +0 -1
  367. package/src/interfaces/pbkdf2-result.js +0 -2
  368. package/src/interfaces/pbkdf2-result.js.map +0 -1
  369. package/src/interfaces/stream-config.d.ts +0 -14
  370. package/src/interfaces/stream-config.d.ts.map +0 -1
  371. package/src/interfaces/stream-config.js +0 -8
  372. package/src/interfaces/stream-config.js.map +0 -1
  373. package/src/interfaces/stream-header.d.ts +0 -29
  374. package/src/interfaces/stream-header.d.ts.map +0 -1
  375. package/src/interfaces/stream-header.js +0 -9
  376. package/src/interfaces/stream-header.js.map +0 -1
  377. package/src/interfaces/stream-progress.d.ts +0 -33
  378. package/src/interfaces/stream-progress.d.ts.map +0 -1
  379. package/src/interfaces/stream-progress.js +0 -2
  380. package/src/interfaces/stream-progress.js.map +0 -1
  381. package/src/lib/configuration-provenance-utils.d.ts +0 -11
  382. package/src/lib/configuration-provenance-utils.d.ts.map +0 -1
  383. package/src/lib/configuration-provenance-utils.js +0 -23
  384. package/src/lib/configuration-provenance-utils.js.map +0 -1
  385. package/src/lib/crypto-container.d.ts +0 -25
  386. package/src/lib/crypto-container.d.ts.map +0 -1
  387. package/src/lib/crypto-container.js +0 -46
  388. package/src/lib/crypto-container.js.map +0 -1
  389. package/src/lib/guid.d.ts +0 -344
  390. package/src/lib/guid.d.ts.map +0 -1
  391. package/src/lib/guid.js +0 -914
  392. package/src/lib/guid.js.map +0 -1
  393. package/src/lib/id-providers/custom-provider.d.ts +0 -46
  394. package/src/lib/id-providers/custom-provider.d.ts.map +0 -1
  395. package/src/lib/id-providers/custom-provider.js +0 -85
  396. package/src/lib/id-providers/custom-provider.js.map +0 -1
  397. package/src/lib/id-providers/guidv4-provider.d.ts +0 -56
  398. package/src/lib/id-providers/guidv4-provider.d.ts.map +0 -1
  399. package/src/lib/id-providers/guidv4-provider.js +0 -122
  400. package/src/lib/id-providers/guidv4-provider.js.map +0 -1
  401. package/src/lib/id-providers/index.d.ts.map +0 -1
  402. package/src/lib/id-providers/index.js +0 -29
  403. package/src/lib/id-providers/index.js.map +0 -1
  404. package/src/lib/id-providers/objectid-provider.d.ts +0 -43
  405. package/src/lib/id-providers/objectid-provider.d.ts.map +0 -1
  406. package/src/lib/id-providers/objectid-provider.js +0 -104
  407. package/src/lib/id-providers/objectid-provider.js.map +0 -1
  408. package/src/lib/id-providers/uuid-provider.d.ts +0 -52
  409. package/src/lib/id-providers/uuid-provider.d.ts.map +0 -1
  410. package/src/lib/id-providers/uuid-provider.js +0 -110
  411. package/src/lib/id-providers/uuid-provider.js.map +0 -1
  412. package/src/lib/index.d.ts +0 -6
  413. package/src/lib/index.d.ts.map +0 -1
  414. package/src/lib/index.js.map +0 -1
  415. package/src/lib/invariant-validator.d.ts +0 -59
  416. package/src/lib/invariant-validator.d.ts.map +0 -1
  417. package/src/lib/invariant-validator.js +0 -97
  418. package/src/lib/invariant-validator.js.map +0 -1
  419. package/src/lib/invariants/encryption-algorithm-consistency.d.ts +0 -17
  420. package/src/lib/invariants/encryption-algorithm-consistency.d.ts.map +0 -1
  421. package/src/lib/invariants/encryption-algorithm-consistency.js +0 -49
  422. package/src/lib/invariants/encryption-algorithm-consistency.js.map +0 -1
  423. package/src/lib/invariants/index.d.ts +0 -4
  424. package/src/lib/invariants/index.d.ts.map +0 -1
  425. package/src/lib/invariants/index.js.map +0 -1
  426. package/src/lib/invariants/pbkdf2-profiles-validity.d.ts +0 -16
  427. package/src/lib/invariants/pbkdf2-profiles-validity.d.ts.map +0 -1
  428. package/src/lib/invariants/pbkdf2-profiles-validity.js +0 -58
  429. package/src/lib/invariants/pbkdf2-profiles-validity.js.map +0 -1
  430. package/src/lib/invariants/recipient-id-consistency.d.ts +0 -18
  431. package/src/lib/invariants/recipient-id-consistency.d.ts.map +0 -1
  432. package/src/lib/invariants/recipient-id-consistency.js +0 -31
  433. package/src/lib/invariants/recipient-id-consistency.js.map +0 -1
  434. package/src/lib/multi-recipient-chunk-utils.d.ts +0 -38
  435. package/src/lib/multi-recipient-chunk-utils.d.ts.map +0 -1
  436. package/src/lib/multi-recipient-chunk-utils.js +0 -41
  437. package/src/lib/multi-recipient-chunk-utils.js.map +0 -1
  438. package/src/member.d.ts +0 -92
  439. package/src/member.d.ts.map +0 -1
  440. package/src/member.js +0 -322
  441. package/src/member.js.map +0 -1
  442. package/src/pbkdf2-profiles.d.ts.map +0 -1
  443. package/src/pbkdf2-profiles.js +0 -2
  444. package/src/pbkdf2-profiles.js.map +0 -1
  445. package/src/phone-number.d.ts +0 -6
  446. package/src/phone-number.d.ts.map +0 -1
  447. package/src/phone-number.js +0 -18
  448. package/src/phone-number.js.map +0 -1
  449. package/src/regexes.d.ts +0 -7
  450. package/src/regexes.d.ts.map +0 -1
  451. package/src/regexes.js +0 -7
  452. package/src/regexes.js.map +0 -1
  453. package/src/secure-buffer.d.ts +0 -61
  454. package/src/secure-buffer.d.ts.map +0 -1
  455. package/src/secure-buffer.js +0 -201
  456. package/src/secure-buffer.js.map +0 -1
  457. package/src/secure-string.d.ts +0 -46
  458. package/src/secure-string.d.ts.map +0 -1
  459. package/src/secure-string.js +0 -206
  460. package/src/secure-string.js.map +0 -1
  461. package/src/services/aes-gcm.d.ts +0 -57
  462. package/src/services/aes-gcm.d.ts.map +0 -1
  463. package/src/services/aes-gcm.js +0 -142
  464. package/src/services/aes-gcm.js.map +0 -1
  465. package/src/services/chunk-processor.d.ts +0 -31
  466. package/src/services/chunk-processor.d.ts.map +0 -1
  467. package/src/services/chunk-processor.js +0 -145
  468. package/src/services/chunk-processor.js.map +0 -1
  469. package/src/services/ecies/crypto-core.d.ts +0 -72
  470. package/src/services/ecies/crypto-core.d.ts.map +0 -1
  471. package/src/services/ecies/crypto-core.js +0 -205
  472. package/src/services/ecies/crypto-core.js.map +0 -1
  473. package/src/services/ecies/example.d.ts +0 -25
  474. package/src/services/ecies/example.d.ts.map +0 -1
  475. package/src/services/ecies/example.js +0 -121
  476. package/src/services/ecies/example.js.map +0 -1
  477. package/src/services/ecies/file.d.ts +0 -18
  478. package/src/services/ecies/file.d.ts.map +0 -1
  479. package/src/services/ecies/file.js +0 -106
  480. package/src/services/ecies/file.js.map +0 -1
  481. package/src/services/ecies/index.d.ts +0 -38
  482. package/src/services/ecies/index.d.ts.map +0 -1
  483. package/src/services/ecies/index.js.map +0 -1
  484. package/src/services/ecies/integration.d.ts +0 -59
  485. package/src/services/ecies/integration.d.ts.map +0 -1
  486. package/src/services/ecies/integration.js +0 -167
  487. package/src/services/ecies/integration.js.map +0 -1
  488. package/src/services/ecies/interfaces.d.ts +0 -54
  489. package/src/services/ecies/interfaces.d.ts.map +0 -1
  490. package/src/services/ecies/interfaces.js +0 -5
  491. package/src/services/ecies/interfaces.js.map +0 -1
  492. package/src/services/ecies/manual-test.d.ts +0 -29
  493. package/src/services/ecies/manual-test.d.ts.map +0 -1
  494. package/src/services/ecies/manual-test.js +0 -163
  495. package/src/services/ecies/manual-test.js.map +0 -1
  496. package/src/services/ecies/multi-recipient.d.ts +0 -56
  497. package/src/services/ecies/multi-recipient.d.ts.map +0 -1
  498. package/src/services/ecies/multi-recipient.js +0 -344
  499. package/src/services/ecies/multi-recipient.js.map +0 -1
  500. package/src/services/ecies/service.d.ts +0 -120
  501. package/src/services/ecies/service.d.ts.map +0 -1
  502. package/src/services/ecies/service.js +0 -210
  503. package/src/services/ecies/service.js.map +0 -1
  504. package/src/services/ecies/signature.d.ts +0 -27
  505. package/src/services/ecies/signature.d.ts.map +0 -1
  506. package/src/services/ecies/signature.js +0 -72
  507. package/src/services/ecies/signature.js.map +0 -1
  508. package/src/services/ecies/single-recipient.d.ts +0 -46
  509. package/src/services/ecies/single-recipient.d.ts.map +0 -1
  510. package/src/services/ecies/single-recipient.js +0 -322
  511. package/src/services/ecies/single-recipient.js.map +0 -1
  512. package/src/services/encryption-stream.d.ts +0 -71
  513. package/src/services/encryption-stream.d.ts.map +0 -1
  514. package/src/services/encryption-stream.js +0 -295
  515. package/src/services/encryption-stream.js.map +0 -1
  516. package/src/services/index.d.ts +0 -11
  517. package/src/services/index.d.ts.map +0 -1
  518. package/src/services/index.js.map +0 -1
  519. package/src/services/multi-recipient-processor.d.ts +0 -35
  520. package/src/services/multi-recipient-processor.d.ts.map +0 -1
  521. package/src/services/multi-recipient-processor.js +0 -289
  522. package/src/services/multi-recipient-processor.js.map +0 -1
  523. package/src/services/password-login.d.ts +0 -47
  524. package/src/services/password-login.d.ts.map +0 -1
  525. package/src/services/password-login.js +0 -115
  526. package/src/services/password-login.js.map +0 -1
  527. package/src/services/pbkdf2.d.ts +0 -54
  528. package/src/services/pbkdf2.d.ts.map +0 -1
  529. package/src/services/pbkdf2.js +0 -108
  530. package/src/services/pbkdf2.js.map +0 -1
  531. package/src/services/progress-tracker.d.ts +0 -23
  532. package/src/services/progress-tracker.d.ts.map +0 -1
  533. package/src/services/progress-tracker.js +0 -103
  534. package/src/services/progress-tracker.js.map +0 -1
  535. package/src/services/resumable-encryption.d.ts +0 -19
  536. package/src/services/resumable-encryption.d.ts.map +0 -1
  537. package/src/services/resumable-encryption.js +0 -105
  538. package/src/services/resumable-encryption.js.map +0 -1
  539. package/src/services/xor.d.ts +0 -37
  540. package/src/services/xor.d.ts.map +0 -1
  541. package/src/services/xor.js +0 -63
  542. package/src/services/xor.js.map +0 -1
  543. package/src/test-mocks/index.d.ts +0 -2
  544. package/src/test-mocks/index.d.ts.map +0 -1
  545. package/src/test-mocks/index.js +0 -2
  546. package/src/test-mocks/index.js.map +0 -1
  547. package/src/test-mocks/mock-frontend-member.d.ts +0 -85
  548. package/src/test-mocks/mock-frontend-member.d.ts.map +0 -1
  549. package/src/test-mocks/mock-frontend-member.js +0 -190
  550. package/src/test-mocks/mock-frontend-member.js.map +0 -1
  551. package/src/testing.d.ts +0 -2
  552. package/src/testing.d.ts.map +0 -1
  553. package/src/testing.js.map +0 -1
  554. package/src/translations/de.d.ts +0 -4
  555. package/src/translations/de.d.ts.map +0 -1
  556. package/src/translations/de.js.map +0 -1
  557. package/src/translations/en-US.d.ts +0 -4
  558. package/src/translations/en-US.d.ts.map +0 -1
  559. package/src/translations/en-US.js.map +0 -1
  560. package/src/translations/es.d.ts +0 -4
  561. package/src/translations/es.d.ts.map +0 -1
  562. package/src/translations/es.js.map +0 -1
  563. package/src/translations/fr.d.ts +0 -4
  564. package/src/translations/fr.d.ts.map +0 -1
  565. package/src/translations/fr.js.map +0 -1
  566. package/src/translations/ja.d.ts +0 -4
  567. package/src/translations/ja.d.ts.map +0 -1
  568. package/src/translations/ja.js.map +0 -1
  569. package/src/translations/uk.d.ts +0 -4
  570. package/src/translations/uk.d.ts.map +0 -1
  571. package/src/translations/uk.js.map +0 -1
  572. package/src/translations/zh-cn.d.ts +0 -4
  573. package/src/translations/zh-cn.d.ts.map +0 -1
  574. package/src/translations/zh-cn.js.map +0 -1
  575. package/src/types/deep-partial.d.ts +0 -4
  576. package/src/types/deep-partial.d.ts.map +0 -1
  577. package/src/types/deep-partial.js +0 -2
  578. package/src/types/deep-partial.js.map +0 -1
  579. package/src/types.d.ts.map +0 -1
  580. package/src/types.js +0 -2
  581. package/src/types.js.map +0 -1
  582. package/src/utils/encryption-type-utils.d.ts +0 -29
  583. package/src/utils/encryption-type-utils.d.ts.map +0 -1
  584. package/src/utils/encryption-type-utils.js +0 -61
  585. package/src/utils/encryption-type-utils.js.map +0 -1
  586. package/src/utils.d.ts +0 -68
  587. package/src/utils.d.ts.map +0 -1
  588. package/src/utils.js +0 -273
  589. package/src/utils.js.map +0 -1
@@ -0,0 +1,169 @@
1
+ import { CoreLanguageCode } from '@digitaldefiance/i18n-lib';
2
+ import { Constants } from '../constants';
3
+ import { Pbkdf2ErrorType } from '../enumerations/pbkdf2-error-type';
4
+ import { Pbkdf2ProfileEnum } from '../enumerations/pbkdf2-profile';
5
+ import { Pbkdf2Error } from '../errors/pbkdf2';
6
+ import { IPbkdf2Config } from '../interfaces/pbkdf2-config';
7
+ import { IPbkdf2Result } from '../interfaces/pbkdf2-result';
8
+ import { IECIESConstants } from '../interfaces/ecies-consts';
9
+ import { IPBkdf2Consts } from '../interfaces/pbkdf2-consts';
10
+
11
+ /**
12
+ * Service for handling PBKDF2 (Password-Based Key Derivation Function 2) operations.
13
+ * This service provides functionality for:
14
+ * - Generating secure key derivation configurations
15
+ * - Deriving cryptographic keys from passwords
16
+ * - Managing salt and iteration parameters
17
+ * - Both synchronous and asynchronous key derivation
18
+ */
19
+ export class Pbkdf2Service {
20
+ protected readonly profiles: Record<string, IPbkdf2Config>;
21
+ protected readonly eciesConsts: IECIESConstants;
22
+ protected readonly pbkdf2Consts: IPBkdf2Consts;
23
+
24
+ constructor(
25
+ profiles: Record<string, IPbkdf2Config> = Constants.PBKDF2_PROFILES,
26
+ eciesParams: IECIESConstants = Constants.ECIES,
27
+ pbkdf2Params: IPBkdf2Consts = Constants.PBKDF2,
28
+ ) {
29
+ this.profiles = profiles;
30
+ this.eciesConsts = eciesParams;
31
+ this.pbkdf2Consts = pbkdf2Params;
32
+ }
33
+ /**
34
+ * Get a predefined configuration profile for common use cases
35
+ * @param profile The name of the profile to use
36
+ * @returns Configuration object for the specified profile
37
+ */
38
+ public getProfileConfig(
39
+ profile: string,
40
+ ): IPbkdf2Config {
41
+ const profileConfig = this.profiles[profile];
42
+ if (!profileConfig) {
43
+ throw new Pbkdf2Error(Pbkdf2ErrorType.InvalidProfile);
44
+ }
45
+ return {
46
+ hashBytes: profileConfig.hashBytes,
47
+ saltBytes: profileConfig.saltBytes,
48
+ iterations: profileConfig.iterations,
49
+ algorithm: profileConfig.algorithm,
50
+ };
51
+ }
52
+
53
+ /**
54
+ * Generate an options object for pbkdf2
55
+ * @param iterations Optional number of iterations (defaults to Pbkdf2IterationsPerSecond)
56
+ * @param saltBytes Optional salt size in bytes (defaults to PBKDF2.SALT_BYTES)
57
+ * @param hashBytes Optional hash size in bytes (defaults to ECIES.SYMMETRIC.KEY_SIZE)
58
+ * @param algorithm Optional hash algorithm (defaults to PBKDF2.ALGORITHM)
59
+ * @returns Configuration object for PBKDF2
60
+ */
61
+ public getConfig(
62
+ iterations?: number,
63
+ saltBytes?: number,
64
+ hashBytes?: number,
65
+ algorithm?: string,
66
+ ): IPbkdf2Config {
67
+ // larger numbers mean better security, less
68
+ return {
69
+ // size of the generated hash
70
+ hashBytes: hashBytes ?? this.eciesConsts.SYMMETRIC.KEY_SIZE,
71
+ // larger salt means hashed passwords are more resistant to rainbow table, but
72
+ // you get diminishing returns pretty fast
73
+ saltBytes: saltBytes ?? this.pbkdf2Consts.SALT_BYTES,
74
+ // more iterations means an attacker has to take longer to brute force an
75
+ // individual password, so larger is better. however, larger also means longer
76
+ // to hash the password. tune so that hashing the password takes about a
77
+ // second
78
+ iterations: iterations ?? this.pbkdf2Consts.ITERATIONS_PER_SECOND,
79
+ // hash algorithm
80
+ algorithm: algorithm ?? this.pbkdf2Consts.ALGORITHM,
81
+ };
82
+ }
83
+
84
+ /**
85
+ * Given a password, use pbkdf2 to generate an appropriately sized key for AES encryption
86
+ * @param password The password to derive a key from
87
+ * @param salt Optional salt (will be randomly generated if not provided)
88
+ * @param iterations Optional number of iterations
89
+ * @param saltBytes Optional salt size in bytes
90
+ * @param keySize Optional key size in bytes
91
+ * @param algorithm Optional hash algorithm
92
+ * @returns Object containing the derived key, salt, and iteration count
93
+ */
94
+ public async deriveKeyFromPasswordAsync(
95
+ password: Uint8Array,
96
+ salt?: Uint8Array,
97
+ iterations?: number,
98
+ saltBytes?: number,
99
+ keySize?: number,
100
+ algorithm?: string,
101
+ ): Promise<IPbkdf2Result> {
102
+ const config = this.getConfig(
103
+ iterations,
104
+ saltBytes,
105
+ keySize,
106
+ algorithm,
107
+ );
108
+ const saltBytes_ =
109
+ salt ?? crypto.getRandomValues(new Uint8Array(config.saltBytes));
110
+
111
+ if (saltBytes_.length !== config.saltBytes) {
112
+ throw new Pbkdf2Error(Pbkdf2ErrorType.InvalidSaltLength);
113
+ }
114
+
115
+ const keyMaterial = await crypto.subtle.importKey(
116
+ 'raw',
117
+ new Uint8Array(password),
118
+ 'PBKDF2',
119
+ false,
120
+ ['deriveBits'],
121
+ );
122
+
123
+ const keyArray = await crypto.subtle.deriveBits(
124
+ {
125
+ name: 'PBKDF2',
126
+ salt: new Uint8Array(saltBytes_),
127
+ iterations: config.iterations,
128
+ hash: config.algorithm,
129
+ },
130
+ keyMaterial,
131
+ config.hashBytes * 8,
132
+ );
133
+
134
+ const keyBytes = new Uint8Array(keyArray);
135
+
136
+ if (keyBytes.length !== config.hashBytes) {
137
+ throw new Pbkdf2Error(Pbkdf2ErrorType.InvalidHashLength);
138
+ }
139
+
140
+ return {
141
+ salt: saltBytes_,
142
+ hash: keyBytes,
143
+ iterations: config.iterations,
144
+ };
145
+ }
146
+
147
+ /**
148
+ * Derive a key using a predefined configuration profile
149
+ * @param password The password to derive a key from
150
+ * @param profile The configuration profile to use
151
+ * @param salt Optional salt (will be randomly generated if not provided)
152
+ * @returns Object containing the derived key, salt, and iteration count
153
+ */
154
+ public async deriveKeyFromPasswordWithProfileAsync(
155
+ password: Uint8Array,
156
+ profile: Pbkdf2ProfileEnum,
157
+ salt?: Uint8Array,
158
+ ): Promise<IPbkdf2Result> {
159
+ const config = this.getProfileConfig(profile);
160
+ return await this.deriveKeyFromPasswordAsync(
161
+ password,
162
+ salt,
163
+ config.iterations,
164
+ config.saltBytes,
165
+ config.hashBytes,
166
+ config.algorithm,
167
+ );
168
+ }
169
+ }
@@ -0,0 +1,128 @@
1
+ import { EciesStringKey } from '../enumerations/ecies-string-key';
2
+ import { EciesComponentId, getEciesI18nEngine } from '../i18n-setup';
3
+ import { IStreamProgress } from '../interfaces/stream-progress';
4
+
5
+ /**
6
+ * Tracks progress for streaming operations
7
+ */
8
+ export class ProgressTracker {
9
+ private startTime: number;
10
+ private lastUpdateTime: number;
11
+ private bytesProcessed: number = 0;
12
+ private chunksProcessed: number = 0;
13
+ private recentThroughputs: number[] = [];
14
+ private readonly maxThroughputSamples = 5;
15
+
16
+ constructor(private readonly totalBytes?: number) {
17
+ this.startTime = Date.now();
18
+ this.lastUpdateTime = this.startTime;
19
+ }
20
+
21
+ /**
22
+ * Update progress with new chunk
23
+ */
24
+ update(chunkBytes: number): IStreamProgress {
25
+ // Validate input
26
+ if (chunkBytes < 0) {
27
+ const engine = getEciesI18nEngine();
28
+ throw new Error(
29
+ engine.translate(
30
+ EciesComponentId,
31
+ EciesStringKey.Error_Progress_ChunkBytesCannotBeNegative,
32
+ ),
33
+ );
34
+ }
35
+
36
+ this.bytesProcessed += chunkBytes;
37
+ this.chunksProcessed++;
38
+
39
+ const now = Date.now();
40
+ const elapsedTime = Math.max(0, now - this.startTime);
41
+ const timeSinceLastUpdate = Math.max(0, now - this.lastUpdateTime);
42
+
43
+ // Calculate instantaneous throughput (use elapsed time if same millisecond)
44
+ const timeWindow =
45
+ timeSinceLastUpdate > 0 ? timeSinceLastUpdate : Math.max(1, elapsedTime);
46
+ if (chunkBytes > 0 && timeWindow > 0) {
47
+ const instantThroughput = (chunkBytes / timeWindow) * 1000;
48
+ // Guard against unrealistic throughput (>10GB/s)
49
+ if (
50
+ isFinite(instantThroughput) &&
51
+ instantThroughput < 10 * 1024 * 1024 * 1024
52
+ ) {
53
+ this.recentThroughputs.push(instantThroughput);
54
+ if (this.recentThroughputs.length > this.maxThroughputSamples) {
55
+ this.recentThroughputs.shift();
56
+ }
57
+ }
58
+ }
59
+
60
+ this.lastUpdateTime = now;
61
+
62
+ // Calculate average throughput
63
+ const throughput =
64
+ this.recentThroughputs.length > 0
65
+ ? this.recentThroughputs.reduce((a, b) => a + b, 0) /
66
+ this.recentThroughputs.length
67
+ : 0;
68
+
69
+ // Calculate ETA (guard against negative)
70
+ let estimatedTimeRemaining: number | undefined;
71
+ if (
72
+ this.totalBytes &&
73
+ throughput > 0 &&
74
+ this.bytesProcessed < this.totalBytes
75
+ ) {
76
+ const remainingBytes = this.totalBytes - this.bytesProcessed;
77
+ estimatedTimeRemaining = Math.max(0, remainingBytes / throughput);
78
+ }
79
+
80
+ return {
81
+ bytesProcessed: this.bytesProcessed,
82
+ totalBytes: this.totalBytes,
83
+ chunksProcessed: this.chunksProcessed,
84
+ percentComplete: this.totalBytes
85
+ ? Math.min(100, (this.bytesProcessed / this.totalBytes) * 100)
86
+ : undefined,
87
+ throughputBytesPerSec: throughput,
88
+ estimatedTimeRemaining,
89
+ startTime: this.startTime,
90
+ elapsedTime,
91
+ };
92
+ }
93
+
94
+ /**
95
+ * Get current progress without update
96
+ */
97
+ getProgress(): IStreamProgress {
98
+ const elapsedTime = Math.max(0, Date.now() - this.startTime);
99
+ const throughput =
100
+ this.recentThroughputs.length > 0
101
+ ? this.recentThroughputs.reduce((a, b) => a + b, 0) /
102
+ this.recentThroughputs.length
103
+ : 0;
104
+
105
+ let estimatedTimeRemaining: number | undefined;
106
+ if (
107
+ this.totalBytes &&
108
+ throughput > 0 &&
109
+ this.bytesProcessed < this.totalBytes
110
+ ) {
111
+ const remainingBytes = this.totalBytes - this.bytesProcessed;
112
+ estimatedTimeRemaining = Math.max(0, remainingBytes / throughput);
113
+ }
114
+
115
+ return {
116
+ bytesProcessed: this.bytesProcessed,
117
+ totalBytes: this.totalBytes,
118
+ chunksProcessed: this.chunksProcessed,
119
+ percentComplete: this.totalBytes
120
+ ? Math.min(100, (this.bytesProcessed / this.totalBytes) * 100)
121
+ : undefined,
122
+ throughputBytesPerSec: throughput,
123
+ estimatedTimeRemaining,
124
+ startTime: this.startTime,
125
+ elapsedTime,
126
+ };
127
+ }
128
+ }
@@ -0,0 +1,135 @@
1
+ import { IEncryptionState, ENCRYPTION_STATE_VERSION } from '../interfaces/encryption-state';
2
+ import { IEncryptedChunk } from '../interfaces/encrypted-chunk';
3
+ import { EncryptionStream } from './encryption-stream';
4
+ import { IEncryptStreamOptions } from './encryption-stream';
5
+ import { uint8ArrayToHex, hexToUint8Array } from '../utils';
6
+ import { EciesEncryptionTypeEnum } from '../enumerations/ecies-encryption-type';
7
+ import { getEciesI18nEngine, EciesComponentId } from '../i18n-setup';
8
+ import { EciesStringKey } from '../enumerations/ecies-string-key';
9
+
10
+
11
+ export interface IResumableOptions extends IEncryptStreamOptions {
12
+ autoSaveInterval?: number;
13
+ onStateSaved?: (state: IEncryptionState) => void | Promise<void>;
14
+ }
15
+
16
+ export class ResumableEncryption {
17
+ private state: IEncryptionState | null = null;
18
+
19
+ constructor(
20
+ private readonly stream: EncryptionStream,
21
+ initialState?: IEncryptionState
22
+ ) {
23
+ if (initialState) {
24
+ this.validateState(initialState);
25
+ this.state = initialState;
26
+ }
27
+ }
28
+
29
+ async *encrypt(
30
+ source: AsyncIterable<Uint8Array>,
31
+ publicKey: Uint8Array,
32
+ options: IResumableOptions = {}
33
+ ): AsyncGenerator<IEncryptedChunk, void, unknown> {
34
+ const engine = getEciesI18nEngine();
35
+ const autoSaveInterval = options.autoSaveInterval ?? 10;
36
+ if (autoSaveInterval <= 0) {
37
+ throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_Resumable_AutoSaveIntervalMustBePositive));
38
+ }
39
+
40
+ const publicKeyHex = uint8ArrayToHex(publicKey);
41
+ if (this.state) {
42
+ if (this.state.publicKey !== publicKeyHex) {
43
+ throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_Resumable_PublicKeyMismatch));
44
+ }
45
+ if (this.state.chunkSize !== (options.chunkSize ?? 1024 * 1024)) {
46
+ throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_Resumable_ChunkSizeMismatch));
47
+ }
48
+ if (this.state.includeChecksums !== (options.includeChecksums ?? false)) {
49
+ throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_Resumable_IncludeChecksumsMismatch));
50
+ }
51
+ }
52
+
53
+ const startIndex = this.state?.chunkIndex ?? 0;
54
+
55
+ let chunkIndex = 0;
56
+ for await (const chunk of this.stream.encryptStream(source, publicKey, options)) {
57
+ if (chunkIndex < startIndex) {
58
+ chunkIndex++;
59
+ continue;
60
+ }
61
+
62
+ yield chunk;
63
+
64
+ this.state = {
65
+ version: ENCRYPTION_STATE_VERSION,
66
+ chunkIndex: chunk.index + 1,
67
+ bytesProcessed: (this.state?.bytesProcessed ?? 0) + (chunk.metadata?.originalSize ?? 0),
68
+ publicKey: publicKeyHex,
69
+ encryptionType: EciesEncryptionTypeEnum.Single,
70
+ chunkSize: options.chunkSize ?? 1024 * 1024,
71
+ includeChecksums: options.includeChecksums ?? false,
72
+ timestamp: Date.now(),
73
+ };
74
+
75
+ if (options.onStateSaved && (chunk.index + 1) % autoSaveInterval === 0) {
76
+ await options.onStateSaved({ ...this.state });
77
+ }
78
+
79
+ chunkIndex++;
80
+ }
81
+ }
82
+
83
+ saveState(): IEncryptionState {
84
+ if (!this.state) {
85
+ const engine = getEciesI18nEngine();
86
+ throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_Resumable_NoStateToSave));
87
+ }
88
+ const state = { ...this.state };
89
+ // Add HMAC for integrity
90
+ state.hmac = this.calculateStateHMAC(state);
91
+ return state;
92
+ }
93
+
94
+ private calculateStateHMAC(state: IEncryptionState): string {
95
+ const data = `${state.version}|${state.chunkIndex}|${state.bytesProcessed}|${state.publicKey}|${state.chunkSize}|${state.includeChecksums}|${state.timestamp}`;
96
+ const hash = new Uint8Array(32);
97
+ // Simple hash for integrity check (not cryptographic HMAC)
98
+ const bytes = new TextEncoder().encode(data);
99
+ for (let i = 0; i < bytes.length; i++) {
100
+ hash[i % 32] ^= bytes[i];
101
+ }
102
+ return uint8ArrayToHex(hash);
103
+ }
104
+
105
+ static resume(
106
+ stream: EncryptionStream,
107
+ state: IEncryptionState
108
+ ): ResumableEncryption {
109
+ return new ResumableEncryption(stream, state);
110
+ }
111
+
112
+ private validateState(state: IEncryptionState): void {
113
+ const engine = getEciesI18nEngine();
114
+ if (state.version !== ENCRYPTION_STATE_VERSION) {
115
+ throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_Resumable_UnsupportedStateVersionTemplate, { version: state.version }));
116
+ }
117
+ if (state.chunkIndex < 0) {
118
+ throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_Resumable_InvalidChunkIndex));
119
+ }
120
+ const age = Date.now() - state.timestamp;
121
+ if (age > 24 * 60 * 60 * 1000) {
122
+ throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_Resumable_StateTooOld));
123
+ }
124
+ if (!state.publicKey || state.publicKey.length === 0) {
125
+ throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_Resumable_InvalidPublicKeyInState));
126
+ }
127
+ // Verify HMAC if present
128
+ if (state.hmac) {
129
+ const expectedHMAC = this.calculateStateHMAC(state);
130
+ if (state.hmac !== expectedHMAC) {
131
+ throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_Resumable_StateIntegrityCheckFailed));
132
+ }
133
+ }
134
+ }
135
+ }
@@ -0,0 +1,65 @@
1
+ /**
2
+ * A simple and fast XOR cipher for obfuscating data in memory for browser environments.
3
+ * This is not a substitute for strong cryptography but provides a lightweight way
4
+ * to prevent sensitive data from being stored in plaintext in memory.
5
+ */
6
+ export class XorService {
7
+ /**
8
+ * Encrypts or decrypts data using a simple XOR cipher.
9
+ * The key is XORed with the data. The same function is used for
10
+ * both encryption and decryption.
11
+ *
12
+ * @param data The data to process.
13
+ * @param key The key to use for the XOR operation.
14
+ * @returns A new Uint8Array containing the result of the XOR operation.
15
+ */
16
+ public static xor(data: Uint8Array, key: Uint8Array): Uint8Array {
17
+ const result = new Uint8Array(data.length);
18
+ for (let i = 0; i < data.length; i++) {
19
+ result[i] = data[i] ^ key[i % key.length];
20
+ }
21
+ return result;
22
+ }
23
+
24
+ /**
25
+ * Generates a random key of a specified length.
26
+ * @param length The length of the key in bytes.
27
+ * @returns A Uint8Array containing the random key.
28
+ * @throws Error if crypto API is not available.
29
+ */
30
+ public static generateKey(length: number): Uint8Array {
31
+ const randomBytes = new Uint8Array(length);
32
+
33
+ // Check if running in a browser with crypto support
34
+ if (typeof window !== 'undefined' && window.crypto) {
35
+ window.crypto.getRandomValues(randomBytes);
36
+ } else if (typeof crypto !== 'undefined') {
37
+ // For environments where crypto is global (some newer JS runtimes)
38
+ crypto.getRandomValues(randomBytes);
39
+ } else {
40
+ throw new Error('Crypto API not available in this environment');
41
+ }
42
+
43
+ return randomBytes;
44
+ }
45
+
46
+ /**
47
+ * Helper method to convert a string to a Uint8Array.
48
+ * @param str The string to convert.
49
+ * @returns A Uint8Array representation of the string.
50
+ */
51
+ public static stringToBytes(str: string): Uint8Array {
52
+ const encoder = new TextEncoder();
53
+ return encoder.encode(str);
54
+ }
55
+
56
+ /**
57
+ * Helper method to convert a Uint8Array to a string.
58
+ * @param bytes The Uint8Array to convert.
59
+ * @returns A string representation of the Uint8Array.
60
+ */
61
+ public static bytesToString(bytes: Uint8Array): string {
62
+ const decoder = new TextDecoder();
63
+ return decoder.decode(bytes);
64
+ }
65
+ }
@@ -0,0 +1 @@
1
+ export * from './mock-frontend-member';