@digitaldefiance/ecies-lib 1.1.23 → 1.1.24

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 (347) hide show
  1. package/README.md +4 -0
  2. package/package.json +13 -33
  3. package/src/constants.ts +474 -0
  4. package/src/email-string.ts +83 -0
  5. package/src/enumerations/ecies-encryption-type.ts +102 -0
  6. package/src/enumerations/ecies-error-type.ts +31 -0
  7. package/src/enumerations/ecies-string-key.ts +108 -0
  8. package/src/enumerations/guid-brand-type.ts +26 -0
  9. package/src/enumerations/guid-error-type.ts +6 -0
  10. package/{dist/enumerations/index.d.ts → src/enumerations/index.ts} +0 -1
  11. package/src/enumerations/invalid-email-type.ts +5 -0
  12. package/src/enumerations/length-encoding-type.ts +6 -0
  13. package/src/enumerations/length-error-type.ts +5 -0
  14. package/src/enumerations/member-error-type.ts +106 -0
  15. package/{dist/enumerations/member-type.d.ts → src/enumerations/member-type.ts} +7 -6
  16. package/src/enumerations/password-login-error-type.ts +4 -0
  17. package/src/enumerations/pbkdf2-error-type.ts +5 -0
  18. package/src/enumerations/pbkdf2-profile.ts +5 -0
  19. package/src/enumerations/secure-storage-error-type.ts +5 -0
  20. package/src/errors/disposed.ts +15 -0
  21. package/src/errors/ecies.ts +34 -0
  22. package/src/errors/guid.ts +34 -0
  23. package/{dist/errors/index.d.ts → src/errors/index.ts} +0 -1
  24. package/src/errors/invalid-email.ts +11 -0
  25. package/src/errors/length.ts +11 -0
  26. package/src/errors/member.ts +12 -0
  27. package/src/errors/pbkdf2.ts +12 -0
  28. package/src/errors/secure-storage.ts +13 -0
  29. package/src/errors/simple-ecies.ts +18 -0
  30. package/src/errors/simple-test-error.ts +6 -0
  31. package/src/guid.ts +800 -0
  32. package/src/i18n-setup.ts +1312 -0
  33. package/{dist/index.d.ts → src/index.ts} +0 -1
  34. package/src/interfaces/checksum-config.ts +4 -0
  35. package/src/interfaces/checksum-consts.ts +13 -0
  36. package/src/interfaces/constants.ts +48 -0
  37. package/src/interfaces/ecies-config.ts +8 -0
  38. package/src/interfaces/ecies-consts.ts +70 -0
  39. package/src/interfaces/ecies-file-service.ts +6 -0
  40. package/src/interfaces/guid.ts +53 -0
  41. package/{dist/interfaces/index.d.ts → src/interfaces/index.ts} +0 -1
  42. package/src/interfaces/library-error.ts +23 -0
  43. package/src/interfaces/member-operational.ts +54 -0
  44. package/{dist/interfaces/member-storage.d.ts → src/interfaces/member-storage.ts} +11 -10
  45. package/{dist/interfaces/member-with-mnemonic.d.ts → src/interfaces/member-with-mnemonic.ts} +3 -3
  46. package/src/interfaces/pbkdf2-config.ts +6 -0
  47. package/src/interfaces/pbkdf2-consts.ts +10 -0
  48. package/src/interfaces/pbkdf2-result.ts +5 -0
  49. package/src/member.ts +429 -0
  50. package/{dist/pbkdf2-profiles.d.ts → src/pbkdf2-profiles.ts} +2 -2
  51. package/src/phone-number.ts +18 -0
  52. package/src/regexes.ts +10 -0
  53. package/src/secure-buffer.ts +183 -0
  54. package/src/secure-string.ts +229 -0
  55. package/src/services/aes-gcm.ts +177 -0
  56. package/src/services/ecies/README.md +147 -0
  57. package/src/services/ecies/crypto-core.ts +180 -0
  58. package/src/services/ecies/example.ts +185 -0
  59. package/src/services/ecies/file.ts +167 -0
  60. package/{dist/services/ecies/index.d.ts → src/services/ecies/index.ts} +3 -1
  61. package/src/services/ecies/integration.ts +241 -0
  62. package/src/services/ecies/interfaces.ts +59 -0
  63. package/src/services/ecies/manual-test.ts +219 -0
  64. package/src/services/ecies/multi-recipient.ts +394 -0
  65. package/src/services/ecies/service.ts +317 -0
  66. package/src/services/ecies/signature.ts +93 -0
  67. package/src/services/ecies/single-recipient.ts +340 -0
  68. package/{dist/services/index.d.ts → src/services/index.ts} +0 -1
  69. package/src/services/password-login.ts +228 -0
  70. package/src/services/pbkdf2.ts +172 -0
  71. package/src/services/xor.ts +65 -0
  72. package/src/types/deep-partial.ts +11 -0
  73. package/{dist/types.d.ts → src/types.ts} +10 -4
  74. package/src/utils.ts +331 -0
  75. package/dist/constants.d.ts +0 -46
  76. package/dist/constants.d.ts.map +0 -1
  77. package/dist/constants.js +0 -358
  78. package/dist/constants.js.map +0 -1
  79. package/dist/email-string.d.ts +0 -42
  80. package/dist/email-string.d.ts.map +0 -1
  81. package/dist/email-string.js +0 -75
  82. package/dist/email-string.js.map +0 -1
  83. package/dist/enumerations/ecies-encryption-type.d.ts +0 -15
  84. package/dist/enumerations/ecies-encryption-type.d.ts.map +0 -1
  85. package/dist/enumerations/ecies-encryption-type.js +0 -71
  86. package/dist/enumerations/ecies-encryption-type.js.map +0 -1
  87. package/dist/enumerations/ecies-error-type.d.ts +0 -32
  88. package/dist/enumerations/ecies-error-type.d.ts.map +0 -1
  89. package/dist/enumerations/ecies-error-type.js +0 -36
  90. package/dist/enumerations/ecies-error-type.js.map +0 -1
  91. package/dist/enumerations/ecies-string-key.d.ts +0 -96
  92. package/dist/enumerations/ecies-string-key.d.ts.map +0 -1
  93. package/dist/enumerations/ecies-string-key.js +0 -105
  94. package/dist/enumerations/ecies-string-key.js.map +0 -1
  95. package/dist/enumerations/guid-brand-type.d.ts +0 -27
  96. package/dist/enumerations/guid-brand-type.d.ts.map +0 -1
  97. package/dist/enumerations/guid-brand-type.js +0 -31
  98. package/dist/enumerations/guid-brand-type.js.map +0 -1
  99. package/dist/enumerations/guid-error-type.d.ts +0 -7
  100. package/dist/enumerations/guid-error-type.d.ts.map +0 -1
  101. package/dist/enumerations/guid-error-type.js +0 -11
  102. package/dist/enumerations/guid-error-type.js.map +0 -1
  103. package/dist/enumerations/index.d.ts.map +0 -1
  104. package/dist/enumerations/index.js +0 -31
  105. package/dist/enumerations/index.js.map +0 -1
  106. package/dist/enumerations/invalid-email-type.d.ts +0 -6
  107. package/dist/enumerations/invalid-email-type.d.ts.map +0 -1
  108. package/dist/enumerations/invalid-email-type.js +0 -10
  109. package/dist/enumerations/invalid-email-type.js.map +0 -1
  110. package/dist/enumerations/length-encoding-type.d.ts +0 -7
  111. package/dist/enumerations/length-encoding-type.d.ts.map +0 -1
  112. package/dist/enumerations/length-encoding-type.js +0 -11
  113. package/dist/enumerations/length-encoding-type.js.map +0 -1
  114. package/dist/enumerations/length-error-type.d.ts +0 -6
  115. package/dist/enumerations/length-error-type.d.ts.map +0 -1
  116. package/dist/enumerations/length-error-type.js +0 -10
  117. package/dist/enumerations/length-error-type.js.map +0 -1
  118. package/dist/enumerations/member-error-type.d.ts +0 -87
  119. package/dist/enumerations/member-error-type.d.ts.map +0 -1
  120. package/dist/enumerations/member-error-type.js +0 -91
  121. package/dist/enumerations/member-error-type.js.map +0 -1
  122. package/dist/enumerations/member-type.d.ts.map +0 -1
  123. package/dist/enumerations/member-type.js +0 -19
  124. package/dist/enumerations/member-type.js.map +0 -1
  125. package/dist/enumerations/password-login-error-type.d.ts +0 -5
  126. package/dist/enumerations/password-login-error-type.d.ts.map +0 -1
  127. package/dist/enumerations/password-login-error-type.js +0 -9
  128. package/dist/enumerations/password-login-error-type.js.map +0 -1
  129. package/dist/enumerations/pbkdf2-error-type.d.ts +0 -6
  130. package/dist/enumerations/pbkdf2-error-type.d.ts.map +0 -1
  131. package/dist/enumerations/pbkdf2-error-type.js +0 -10
  132. package/dist/enumerations/pbkdf2-error-type.js.map +0 -1
  133. package/dist/enumerations/pbkdf2-profile.d.ts +0 -6
  134. package/dist/enumerations/pbkdf2-profile.d.ts.map +0 -1
  135. package/dist/enumerations/pbkdf2-profile.js +0 -10
  136. package/dist/enumerations/pbkdf2-profile.js.map +0 -1
  137. package/dist/enumerations/secure-storage-error-type.d.ts +0 -6
  138. package/dist/enumerations/secure-storage-error-type.d.ts.map +0 -1
  139. package/dist/enumerations/secure-storage-error-type.js +0 -10
  140. package/dist/enumerations/secure-storage-error-type.js.map +0 -1
  141. package/dist/errors/disposed.d.ts +0 -4
  142. package/dist/errors/disposed.d.ts.map +0 -1
  143. package/dist/errors/disposed.js +0 -20
  144. package/dist/errors/disposed.js.map +0 -1
  145. package/dist/errors/ecies.d.ts +0 -7
  146. package/dist/errors/ecies.d.ts.map +0 -1
  147. package/dist/errors/ecies.js +0 -15
  148. package/dist/errors/ecies.js.map +0 -1
  149. package/dist/errors/guid.d.ts +0 -15
  150. package/dist/errors/guid.d.ts.map +0 -1
  151. package/dist/errors/guid.js +0 -26
  152. package/dist/errors/guid.js.map +0 -1
  153. package/dist/errors/index.d.ts.map +0 -1
  154. package/dist/errors/index.js +0 -25
  155. package/dist/errors/index.js.map +0 -1
  156. package/dist/errors/invalid-email.d.ts +0 -7
  157. package/dist/errors/invalid-email.d.ts.map +0 -1
  158. package/dist/errors/invalid-email.js +0 -14
  159. package/dist/errors/invalid-email.js.map +0 -1
  160. package/dist/errors/length.d.ts +0 -7
  161. package/dist/errors/length.d.ts.map +0 -1
  162. package/dist/errors/length.js +0 -14
  163. package/dist/errors/length.js.map +0 -1
  164. package/dist/errors/member.d.ts +0 -7
  165. package/dist/errors/member.d.ts.map +0 -1
  166. package/dist/errors/member.js +0 -14
  167. package/dist/errors/member.js.map +0 -1
  168. package/dist/errors/pbkdf2.d.ts +0 -7
  169. package/dist/errors/pbkdf2.d.ts.map +0 -1
  170. package/dist/errors/pbkdf2.js +0 -14
  171. package/dist/errors/pbkdf2.js.map +0 -1
  172. package/dist/errors/secure-storage.d.ts +0 -7
  173. package/dist/errors/secure-storage.d.ts.map +0 -1
  174. package/dist/errors/secure-storage.js +0 -15
  175. package/dist/errors/secure-storage.js.map +0 -1
  176. package/dist/errors/simple-ecies.d.ts +0 -6
  177. package/dist/errors/simple-ecies.d.ts.map +0 -1
  178. package/dist/errors/simple-ecies.js +0 -15
  179. package/dist/errors/simple-ecies.js.map +0 -1
  180. package/dist/errors/simple-test-error.d.ts +0 -4
  181. package/dist/errors/simple-test-error.d.ts.map +0 -1
  182. package/dist/errors/simple-test-error.js +0 -11
  183. package/dist/errors/simple-test-error.js.map +0 -1
  184. package/dist/guid.d.ts +0 -153
  185. package/dist/guid.d.ts.map +0 -1
  186. package/dist/guid.js +0 -647
  187. package/dist/guid.js.map +0 -1
  188. package/dist/i18n-setup.d.ts +0 -24
  189. package/dist/i18n-setup.d.ts.map +0 -1
  190. package/dist/i18n-setup.js +0 -837
  191. package/dist/i18n-setup.js.map +0 -1
  192. package/dist/index.d.ts.map +0 -1
  193. package/dist/index.js +0 -32
  194. package/dist/index.js.map +0 -1
  195. package/dist/interfaces/checksum-config.d.ts +0 -5
  196. package/dist/interfaces/checksum-config.d.ts.map +0 -1
  197. package/dist/interfaces/checksum-config.js +0 -3
  198. package/dist/interfaces/checksum-config.js.map +0 -1
  199. package/dist/interfaces/checksum-consts.d.ts +0 -11
  200. package/dist/interfaces/checksum-consts.d.ts.map +0 -1
  201. package/dist/interfaces/checksum-consts.js +0 -3
  202. package/dist/interfaces/checksum-consts.js.map +0 -1
  203. package/dist/interfaces/constants.d.ts +0 -45
  204. package/dist/interfaces/constants.d.ts.map +0 -1
  205. package/dist/interfaces/constants.js +0 -3
  206. package/dist/interfaces/constants.js.map +0 -1
  207. package/dist/interfaces/ecies-config.d.ts +0 -9
  208. package/dist/interfaces/ecies-config.d.ts.map +0 -1
  209. package/dist/interfaces/ecies-config.js +0 -3
  210. package/dist/interfaces/ecies-config.js.map +0 -1
  211. package/dist/interfaces/ecies-consts.d.ts +0 -58
  212. package/dist/interfaces/ecies-consts.d.ts.map +0 -1
  213. package/dist/interfaces/ecies-consts.js +0 -3
  214. package/dist/interfaces/ecies-consts.js.map +0 -1
  215. package/dist/interfaces/ecies-file-service.d.ts +0 -7
  216. package/dist/interfaces/ecies-file-service.d.ts.map +0 -1
  217. package/dist/interfaces/ecies-file-service.js +0 -3
  218. package/dist/interfaces/ecies-file-service.js.map +0 -1
  219. package/dist/interfaces/guid.d.ts +0 -45
  220. package/dist/interfaces/guid.d.ts.map +0 -1
  221. package/dist/interfaces/guid.js +0 -3
  222. package/dist/interfaces/guid.js.map +0 -1
  223. package/dist/interfaces/index.d.ts.map +0 -1
  224. package/dist/interfaces/index.js +0 -30
  225. package/dist/interfaces/index.js.map +0 -1
  226. package/dist/interfaces/library-error.d.ts +0 -23
  227. package/dist/interfaces/library-error.d.ts.map +0 -1
  228. package/dist/interfaces/library-error.js +0 -3
  229. package/dist/interfaces/library-error.js.map +0 -1
  230. package/dist/interfaces/member-operational.d.ts +0 -40
  231. package/dist/interfaces/member-operational.d.ts.map +0 -1
  232. package/dist/interfaces/member-operational.js +0 -3
  233. package/dist/interfaces/member-operational.js.map +0 -1
  234. package/dist/interfaces/member-storage.d.ts.map +0 -1
  235. package/dist/interfaces/member-storage.js +0 -3
  236. package/dist/interfaces/member-storage.js.map +0 -1
  237. package/dist/interfaces/member-with-mnemonic.d.ts.map +0 -1
  238. package/dist/interfaces/member-with-mnemonic.js +0 -3
  239. package/dist/interfaces/member-with-mnemonic.js.map +0 -1
  240. package/dist/interfaces/pbkdf2-config.d.ts +0 -7
  241. package/dist/interfaces/pbkdf2-config.d.ts.map +0 -1
  242. package/dist/interfaces/pbkdf2-config.js +0 -3
  243. package/dist/interfaces/pbkdf2-config.js.map +0 -1
  244. package/dist/interfaces/pbkdf2-consts.d.ts +0 -9
  245. package/dist/interfaces/pbkdf2-consts.d.ts.map +0 -1
  246. package/dist/interfaces/pbkdf2-consts.js +0 -3
  247. package/dist/interfaces/pbkdf2-consts.js.map +0 -1
  248. package/dist/interfaces/pbkdf2-result.d.ts +0 -6
  249. package/dist/interfaces/pbkdf2-result.d.ts.map +0 -1
  250. package/dist/interfaces/pbkdf2-result.js +0 -3
  251. package/dist/interfaces/pbkdf2-result.js.map +0 -1
  252. package/dist/member.d.ts +0 -66
  253. package/dist/member.d.ts.map +0 -1
  254. package/dist/member.js +0 -271
  255. package/dist/member.js.map +0 -1
  256. package/dist/pbkdf2-profiles.d.ts.map +0 -1
  257. package/dist/pbkdf2-profiles.js +0 -3
  258. package/dist/pbkdf2-profiles.js.map +0 -1
  259. package/dist/phone-number.d.ts +0 -6
  260. package/dist/phone-number.d.ts.map +0 -1
  261. package/dist/phone-number.js +0 -22
  262. package/dist/phone-number.js.map +0 -1
  263. package/dist/regexes.d.ts +0 -7
  264. package/dist/regexes.d.ts.map +0 -1
  265. package/dist/regexes.js +0 -10
  266. package/dist/regexes.js.map +0 -1
  267. package/dist/secure-buffer.d.ts +0 -38
  268. package/dist/secure-buffer.d.ts.map +0 -1
  269. package/dist/secure-buffer.js +0 -168
  270. package/dist/secure-buffer.js.map +0 -1
  271. package/dist/secure-string.d.ts +0 -39
  272. package/dist/secure-string.d.ts.map +0 -1
  273. package/dist/secure-string.js +0 -195
  274. package/dist/secure-string.js.map +0 -1
  275. package/dist/services/aes-gcm.d.ts +0 -57
  276. package/dist/services/aes-gcm.d.ts.map +0 -1
  277. package/dist/services/aes-gcm.js +0 -111
  278. package/dist/services/aes-gcm.js.map +0 -1
  279. package/dist/services/ecies/crypto-core.d.ts +0 -51
  280. package/dist/services/ecies/crypto-core.d.ts.map +0 -1
  281. package/dist/services/ecies/crypto-core.js +0 -139
  282. package/dist/services/ecies/crypto-core.js.map +0 -1
  283. package/dist/services/ecies/example.d.ts +0 -25
  284. package/dist/services/ecies/example.d.ts.map +0 -1
  285. package/dist/services/ecies/example.js +0 -128
  286. package/dist/services/ecies/example.js.map +0 -1
  287. package/dist/services/ecies/file.d.ts +0 -18
  288. package/dist/services/ecies/file.d.ts.map +0 -1
  289. package/dist/services/ecies/file.js +0 -110
  290. package/dist/services/ecies/file.js.map +0 -1
  291. package/dist/services/ecies/index.d.ts.map +0 -1
  292. package/dist/services/ecies/index.js +0 -57
  293. package/dist/services/ecies/index.js.map +0 -1
  294. package/dist/services/ecies/integration.d.ts +0 -59
  295. package/dist/services/ecies/integration.d.ts.map +0 -1
  296. package/dist/services/ecies/integration.js +0 -172
  297. package/dist/services/ecies/integration.js.map +0 -1
  298. package/dist/services/ecies/interfaces.d.ts +0 -51
  299. package/dist/services/ecies/interfaces.d.ts.map +0 -1
  300. package/dist/services/ecies/interfaces.js +0 -6
  301. package/dist/services/ecies/interfaces.js.map +0 -1
  302. package/dist/services/ecies/manual-test.d.ts +0 -29
  303. package/dist/services/ecies/manual-test.d.ts.map +0 -1
  304. package/dist/services/ecies/manual-test.js +0 -171
  305. package/dist/services/ecies/manual-test.js.map +0 -1
  306. package/dist/services/ecies/multi-recipient.d.ts +0 -52
  307. package/dist/services/ecies/multi-recipient.d.ts.map +0 -1
  308. package/dist/services/ecies/multi-recipient.js +0 -243
  309. package/dist/services/ecies/multi-recipient.js.map +0 -1
  310. package/dist/services/ecies/service.d.ts +0 -104
  311. package/dist/services/ecies/service.d.ts.map +0 -1
  312. package/dist/services/ecies/service.js +0 -192
  313. package/dist/services/ecies/service.js.map +0 -1
  314. package/dist/services/ecies/signature.d.ts +0 -27
  315. package/dist/services/ecies/signature.d.ts.map +0 -1
  316. package/dist/services/ecies/signature.js +0 -76
  317. package/dist/services/ecies/signature.js.map +0 -1
  318. package/dist/services/ecies/single-recipient.d.ts +0 -46
  319. package/dist/services/ecies/single-recipient.d.ts.map +0 -1
  320. package/dist/services/ecies/single-recipient.js +0 -212
  321. package/dist/services/ecies/single-recipient.js.map +0 -1
  322. package/dist/services/index.d.ts.map +0 -1
  323. package/dist/services/index.js +0 -22
  324. package/dist/services/index.js.map +0 -1
  325. package/dist/services/password-login.d.ts +0 -49
  326. package/dist/services/password-login.d.ts.map +0 -1
  327. package/dist/services/password-login.js +0 -121
  328. package/dist/services/password-login.js.map +0 -1
  329. package/dist/services/pbkdf2.d.ts +0 -56
  330. package/dist/services/pbkdf2.d.ts.map +0 -1
  331. package/dist/services/pbkdf2.js +0 -114
  332. package/dist/services/pbkdf2.js.map +0 -1
  333. package/dist/services/xor.d.ts +0 -37
  334. package/dist/services/xor.d.ts.map +0 -1
  335. package/dist/services/xor.js +0 -67
  336. package/dist/services/xor.js.map +0 -1
  337. package/dist/types/deep-partial.d.ts +0 -4
  338. package/dist/types/deep-partial.d.ts.map +0 -1
  339. package/dist/types/deep-partial.js +0 -3
  340. package/dist/types/deep-partial.js.map +0 -1
  341. package/dist/types.d.ts.map +0 -1
  342. package/dist/types.js +0 -3
  343. package/dist/types.js.map +0 -1
  344. package/dist/utils.d.ts +0 -68
  345. package/dist/utils.d.ts.map +0 -1
  346. package/dist/utils.js +0 -288
  347. package/dist/utils.js.map +0 -1
@@ -0,0 +1,241 @@
1
+ /**
2
+ * Integration helpers for using the browser ECIES service with existing web-crypto functionality
3
+ */
4
+
5
+ import { EciesComponentId, getEciesI18nEngine } from '../../i18n-setup';
6
+ import { SecureString } from '../../secure-string';
7
+ import { SignatureUint8Array } from '../../types';
8
+ import {
9
+ hexToUint8Array,
10
+ stringToUint8Array,
11
+ uint8ArrayToHex,
12
+ uint8ArrayToString,
13
+ } from '../../utils';
14
+ import { IWalletSeed } from './interfaces';
15
+ import { ECIESService } from './service';
16
+ import { EciesStringKey } from '../../enumerations';
17
+
18
+ /**
19
+ * Enhanced web crypto service that uses the new ECIES implementation
20
+ */
21
+ export class EnhancedWebCryptoService {
22
+ private ecies: ECIESService;
23
+
24
+ constructor() {
25
+ this.ecies = new ECIESService();
26
+ }
27
+
28
+ /**
29
+ * Derive wallet from mnemonic using the new ECIES service
30
+ * This replaces the existing walletFromMnemonic method with better browser compatibility
31
+ */
32
+ public async walletFromMnemonic(
33
+ mnemonic: SecureString,
34
+ ): Promise<IWalletSeed> {
35
+ const { wallet, seed } = this.ecies.walletAndSeedFromMnemonic(mnemonic);
36
+ return {
37
+ wallet,
38
+ seed,
39
+ };
40
+ }
41
+
42
+ /**
43
+ * Decrypt challenge using the new ECIES service
44
+ * This provides better compatibility and error handling than the original implementation
45
+ */
46
+ public async decryptChallenge(
47
+ encryptedHex: string,
48
+ privateKey: Uint8Array,
49
+ ): Promise<Uint8Array> {
50
+ try {
51
+ const encryptedData = hexToUint8Array(encryptedHex);
52
+
53
+ // Try to decrypt using single mode first (most common)
54
+ try {
55
+ return await this.ecies.decryptSimpleOrSingleWithHeader(
56
+ false,
57
+ privateKey,
58
+ encryptedData,
59
+ );
60
+ } catch {
61
+ // Fallback to simple mode
62
+ return await this.ecies.decryptSimpleOrSingleWithHeader(
63
+ true,
64
+ privateKey,
65
+ encryptedData,
66
+ );
67
+ }
68
+ } catch (error) {
69
+ const engine = getEciesI18nEngine();
70
+ throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_ECIESError_FailedToDecryptChallengeTemplate, { error: String(error) }));
71
+ }
72
+ }
73
+
74
+ /**
75
+ * Encrypt data for a recipient
76
+ */
77
+ public async encryptForRecipient(
78
+ recipientPublicKey: Uint8Array,
79
+ data: Uint8Array,
80
+ useSimpleMode: boolean = false,
81
+ ): Promise<string> {
82
+ const encrypted = await this.ecies.encryptSimpleOrSingle(
83
+ !useSimpleMode,
84
+ recipientPublicKey,
85
+ data,
86
+ );
87
+ return uint8ArrayToHex(encrypted);
88
+ }
89
+
90
+ /**
91
+ * Sign data with private key
92
+ */
93
+ public signData(privateKey: Uint8Array, data: Uint8Array): string {
94
+ const signature = this.ecies.signMessage(privateKey, data);
95
+ return uint8ArrayToHex(signature);
96
+ }
97
+
98
+ /**
99
+ * Verify signature
100
+ */
101
+ public verifySignature(
102
+ publicKey: Uint8Array,
103
+ data: Uint8Array,
104
+ signatureHex: string,
105
+ ): boolean {
106
+ const signature = hexToUint8Array(signatureHex) as SignatureUint8Array;
107
+ return this.ecies.verifyMessage(publicKey, data, signature);
108
+ }
109
+
110
+ /**
111
+ * Generate new mnemonic
112
+ */
113
+ public generateMnemonic(): SecureString {
114
+ return this.ecies.generateNewMnemonic();
115
+ }
116
+
117
+ /**
118
+ * Complete client-side challenge verification (enhanced version)
119
+ */
120
+ public async verifyChallengeResponse(
121
+ encryptedChallenge: string,
122
+ mnemonic: SecureString,
123
+ systemPublicKeyHex: string,
124
+ ): Promise<string> {
125
+ // Derive keys from mnemonic
126
+ const { wallet } = await this.walletFromMnemonic(mnemonic);
127
+
128
+ // Decrypt the challenge
129
+ const decryptedPayload = await this.decryptChallenge(
130
+ encryptedChallenge,
131
+ wallet.getPrivateKey(),
132
+ );
133
+
134
+ // Extract nonce and signature (assuming 48 bytes payload + signature)
135
+ const payload = decryptedPayload.slice(0, 48);
136
+ const signature = decryptedPayload.slice(48);
137
+
138
+ // Convert system public key from hex
139
+ const systemPubKey = hexToUint8Array(systemPublicKeyHex);
140
+
141
+ // Verify system signature
142
+ const isValid = this.verifySignature(
143
+ systemPubKey,
144
+ payload,
145
+ uint8ArrayToHex(signature),
146
+ );
147
+
148
+ if (!isValid) {
149
+ const engine = getEciesI18nEngine();
150
+ const error = engine.translate(EciesComponentId, EciesStringKey.Error_ECIESError_InvalidChallengeSignature);
151
+ }
152
+
153
+ return uint8ArrayToHex(decryptedPayload);
154
+ }
155
+ }
156
+
157
+ /**
158
+ * Migration helper to transition from old WebCryptoService to new ECIES service
159
+ */
160
+ export class MigrationHelper {
161
+ /**
162
+ * Test compatibility between old and new implementations
163
+ */
164
+ public static async testCompatibility(mnemonic: SecureString): Promise<{
165
+ compatible: boolean;
166
+ details: {
167
+ mnemonicValid: boolean;
168
+ keysMatch: boolean;
169
+ encryptionWorks: boolean;
170
+ };
171
+ }> {
172
+ try {
173
+ const ecies = new ECIESService();
174
+ const enhanced = new EnhancedWebCryptoService();
175
+
176
+ // Test mnemonic validation
177
+ let mnemonicValid = false;
178
+ try {
179
+ ecies.walletAndSeedFromMnemonic(mnemonic);
180
+ mnemonicValid = true;
181
+ } catch {
182
+ mnemonicValid = false;
183
+ }
184
+
185
+ // Test key derivation
186
+ let keysMatch = false;
187
+ if (mnemonicValid) {
188
+ try {
189
+ const { wallet: wallet1 } = ecies.walletAndSeedFromMnemonic(mnemonic);
190
+ const { wallet: wallet2 } = await enhanced.walletFromMnemonic(
191
+ mnemonic,
192
+ );
193
+ keysMatch =
194
+ uint8ArrayToHex(wallet1.getPrivateKey()) ===
195
+ uint8ArrayToHex(wallet2.getPrivateKey());
196
+ } catch {
197
+ keysMatch = false;
198
+ }
199
+ }
200
+
201
+ // Test encryption roundtrip
202
+ let encryptionWorks = false;
203
+ if (keysMatch) {
204
+ try {
205
+ const { wallet } = await enhanced.walletFromMnemonic(mnemonic);
206
+ const testMessage = stringToUint8Array('Test message');
207
+ const encrypted = await enhanced.encryptForRecipient(
208
+ wallet.getPublicKey(),
209
+ testMessage,
210
+ );
211
+ const decrypted = await enhanced.decryptChallenge(
212
+ encrypted,
213
+ wallet.getPrivateKey(),
214
+ );
215
+ encryptionWorks =
216
+ uint8ArrayToString(testMessage) === uint8ArrayToString(decrypted);
217
+ } catch {
218
+ encryptionWorks = false;
219
+ }
220
+ }
221
+
222
+ return {
223
+ compatible: mnemonicValid && keysMatch && encryptionWorks,
224
+ details: {
225
+ mnemonicValid,
226
+ keysMatch,
227
+ encryptionWorks,
228
+ },
229
+ };
230
+ } catch {
231
+ return {
232
+ compatible: false,
233
+ details: {
234
+ mnemonicValid: false,
235
+ keysMatch: false,
236
+ encryptionWorks: false,
237
+ },
238
+ };
239
+ }
240
+ }
241
+ }
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Browser-compatible ECIES interfaces
3
+ */
4
+
5
+ import { Wallet } from '@ethereumjs/wallet';
6
+ import { EciesEncryptionTypeEnum } from '../../enumerations/ecies-encryption-type';
7
+
8
+ export interface ISimpleKeyPair {
9
+ privateKey: Uint8Array;
10
+ publicKey: Uint8Array;
11
+ }
12
+
13
+ export interface IWalletSeed {
14
+ wallet: Wallet;
15
+ seed: Uint8Array;
16
+ }
17
+
18
+ export interface ISingleEncryptedParsedHeader {
19
+ encryptionType: EciesEncryptionTypeEnum;
20
+ ephemeralPublicKey: Uint8Array;
21
+ iv: Uint8Array;
22
+ authTag: Uint8Array;
23
+ dataLength: number;
24
+ headerSize: number;
25
+ }
26
+
27
+ export interface IEncryptionResult {
28
+ encryptedData: Uint8Array;
29
+ ephemeralPublicKey: Uint8Array;
30
+ iv: Uint8Array;
31
+ authTag: Uint8Array;
32
+ }
33
+
34
+ export interface IDecryptionResult {
35
+ decrypted: Uint8Array;
36
+ consumedBytes: number;
37
+ }
38
+
39
+ export interface IMultiRecipient {
40
+ id: Uint8Array; // 16-byte ObjectId
41
+ publicKey: Uint8Array;
42
+ }
43
+
44
+ export interface IMultiEncryptedMessage {
45
+ dataLength: number;
46
+ recipientCount: number;
47
+ recipientIds: Uint8Array[];
48
+ recipientKeys: Uint8Array[];
49
+ encryptedMessage: Uint8Array;
50
+ headerSize: number;
51
+ }
52
+
53
+ export interface IMultiEncryptedParsedHeader {
54
+ dataLength: number;
55
+ recipientCount: number;
56
+ recipientIds: Uint8Array[];
57
+ recipientKeys: Uint8Array[];
58
+ headerSize: number;
59
+ }
@@ -0,0 +1,219 @@
1
+ /**
2
+ * Simple integration tests for the browser ECIES service
3
+ * These tests can be run in the browser console to verify functionality
4
+ */
5
+
6
+ import { SecureString } from '../../secure-string';
7
+ import {
8
+ stringToUint8Array,
9
+ uint8ArrayToHex,
10
+ uint8ArrayToString,
11
+ } from '../../utils';
12
+ import { ECIESService } from './service';
13
+
14
+ /**
15
+ * Test basic encryption/decryption roundtrip
16
+ */
17
+ export async function testBasicEncryption(): Promise<boolean> {
18
+ try {
19
+ const ecies = new ECIESService();
20
+ const mnemonic = ecies.generateNewMnemonic();
21
+ const { privateKey, publicKey } = ecies.mnemonicToSimpleKeyPair(mnemonic);
22
+
23
+ const message = stringToUint8Array('Test message');
24
+ const encrypted = await ecies.encryptSimpleOrSingle(
25
+ false,
26
+ publicKey,
27
+ message,
28
+ );
29
+ const decrypted = await ecies.decryptSimpleOrSingleWithHeader(
30
+ false,
31
+ privateKey,
32
+ encrypted,
33
+ );
34
+
35
+ return uint8ArrayToString(message) === uint8ArrayToString(decrypted);
36
+ } catch (error) {
37
+ console.error('Basic encryption test failed:', error);
38
+ return false;
39
+ }
40
+ }
41
+
42
+ /**
43
+ * Test simple mode encryption
44
+ */
45
+ export async function testSimpleEncryption(): Promise<boolean> {
46
+ try {
47
+ const ecies = new ECIESService();
48
+ const mnemonic = ecies.generateNewMnemonic();
49
+ const { privateKey, publicKey } = ecies.mnemonicToSimpleKeyPair(mnemonic);
50
+
51
+ const message = stringToUint8Array('Simple test message');
52
+ const encrypted = await ecies.encryptSimpleOrSingle(
53
+ true,
54
+ publicKey,
55
+ message,
56
+ );
57
+ const decrypted = await ecies.decryptSimpleOrSingleWithHeader(
58
+ true,
59
+ privateKey,
60
+ encrypted,
61
+ );
62
+
63
+ return uint8ArrayToString(message) === uint8ArrayToString(decrypted);
64
+ } catch (error) {
65
+ console.error('Simple encryption test failed:', error);
66
+ return false;
67
+ }
68
+ }
69
+
70
+ /**
71
+ * Test signature operations
72
+ */
73
+ export async function testSignatures(): Promise<boolean> {
74
+ try {
75
+ const ecies = new ECIESService();
76
+ const mnemonic = ecies.generateNewMnemonic();
77
+ const { privateKey, publicKey } = ecies.mnemonicToSimpleKeyPair(mnemonic);
78
+
79
+ const message = stringToUint8Array('Message to sign');
80
+ const signature = ecies.signMessage(privateKey, message);
81
+ const isValid = ecies.verifyMessage(publicKey, message, signature);
82
+
83
+ // Test with wrong message
84
+ const wrongMessage = stringToUint8Array('Wrong message');
85
+ const isInvalid = ecies.verifyMessage(publicKey, wrongMessage, signature);
86
+
87
+ return isValid && !isInvalid;
88
+ } catch (error) {
89
+ console.error('Signature test failed:', error);
90
+ return false;
91
+ }
92
+ }
93
+
94
+ /**
95
+ * Test mnemonic validation
96
+ */
97
+ export async function testMnemonicValidation(): Promise<boolean> {
98
+ try {
99
+ const ecies = new ECIESService();
100
+
101
+ // Test valid mnemonic
102
+ const validMnemonic = new SecureString(
103
+ 'abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about',
104
+ );
105
+ const { wallet: wallet1 } = ecies.walletAndSeedFromMnemonic(validMnemonic);
106
+ const { wallet: wallet2 } = ecies.walletAndSeedFromMnemonic(validMnemonic);
107
+
108
+ // Should produce same keys
109
+ const sameKeys =
110
+ uint8ArrayToHex(wallet1.getPrivateKey()) ===
111
+ uint8ArrayToHex(wallet2.getPrivateKey());
112
+
113
+ // Test invalid mnemonic
114
+ try {
115
+ ecies.walletAndSeedFromMnemonic(
116
+ new SecureString('invalid mnemonic phrase'),
117
+ );
118
+ return false; // Should have thrown
119
+ } catch {
120
+ return sameKeys; // Expected to throw
121
+ }
122
+ } catch (error) {
123
+ console.error('Mnemonic validation test failed:', error);
124
+ return false;
125
+ }
126
+ }
127
+
128
+ /**
129
+ * Test cross-party encryption (Alice encrypts for Bob)
130
+ */
131
+ export async function testCrossPartyEncryption(): Promise<boolean> {
132
+ try {
133
+ const ecies = new ECIESService();
134
+
135
+ // Alice generates her keys
136
+ const aliceMnemonic = ecies.generateNewMnemonic();
137
+ const aliceKeys = ecies.mnemonicToSimpleKeyPair(aliceMnemonic);
138
+
139
+ // Bob generates his keys
140
+ const bobMnemonic = ecies.generateNewMnemonic();
141
+ const bobKeys = ecies.mnemonicToSimpleKeyPair(bobMnemonic);
142
+
143
+ // Alice encrypts a message for Bob
144
+ const message = stringToUint8Array('Secret message from Alice to Bob');
145
+ const encrypted = await ecies.encryptSimpleOrSingle(
146
+ false,
147
+ bobKeys.publicKey,
148
+ message,
149
+ );
150
+
151
+ // Bob decrypts the message
152
+ const decrypted = await ecies.decryptSimpleOrSingleWithHeader(
153
+ false,
154
+ bobKeys.privateKey,
155
+ encrypted,
156
+ );
157
+
158
+ // Alice should not be able to decrypt (wrong private key)
159
+ try {
160
+ await ecies.decryptSimpleOrSingleWithHeader(
161
+ false,
162
+ aliceKeys.privateKey,
163
+ encrypted,
164
+ );
165
+ return false; // Should have failed
166
+ } catch {
167
+ // Expected to fail
168
+ }
169
+
170
+ return uint8ArrayToString(message) === uint8ArrayToString(decrypted);
171
+ } catch (error) {
172
+ console.error('Cross-party encryption test failed:', error);
173
+ return false;
174
+ }
175
+ }
176
+
177
+ /**
178
+ * Run all tests
179
+ */
180
+ export async function runAllTests(): Promise<void> {
181
+ console.log('Running browser ECIES service tests...\n');
182
+
183
+ const tests = [
184
+ { name: 'Basic Encryption', test: testBasicEncryption },
185
+ { name: 'Simple Encryption', test: testSimpleEncryption },
186
+ { name: 'Digital Signatures', test: testSignatures },
187
+ { name: 'Mnemonic Validation', test: testMnemonicValidation },
188
+ { name: 'Cross-Party Encryption', test: testCrossPartyEncryption },
189
+ ];
190
+
191
+ let passed = 0;
192
+ let failed = 0;
193
+
194
+ for (const { name, test } of tests) {
195
+ try {
196
+ const result = await test();
197
+ if (result) {
198
+ console.log(`✅ ${name}: PASSED`);
199
+ passed++;
200
+ } else {
201
+ console.log(`❌ ${name}: FAILED`);
202
+ failed++;
203
+ }
204
+ } catch (error) {
205
+ console.log(`❌ ${name}: ERROR - ${error}`);
206
+ failed++;
207
+ }
208
+ }
209
+
210
+ console.log(`\nTest Results: ${passed} passed, ${failed} failed`);
211
+
212
+ if (failed === 0) {
213
+ console.log(
214
+ '🎉 All tests passed! The browser ECIES service is working correctly.',
215
+ );
216
+ } else {
217
+ console.log('⚠️ Some tests failed. Please check the implementation.');
218
+ }
219
+ }