@digitaldefiance/ecies-lib 1.1.24 → 1.1.26

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 (348) hide show
  1. package/README.md +8 -0
  2. package/package.json +5 -4
  3. package/src/constants.d.ts +46 -0
  4. package/src/constants.d.ts.map +1 -0
  5. package/src/constants.js +358 -0
  6. package/src/constants.js.map +1 -0
  7. package/src/email-string.d.ts +42 -0
  8. package/src/email-string.d.ts.map +1 -0
  9. package/src/email-string.js +73 -0
  10. package/src/email-string.js.map +1 -0
  11. package/src/enumerations/ecies-encryption-type.d.ts +15 -0
  12. package/src/enumerations/ecies-encryption-type.d.ts.map +1 -0
  13. package/src/enumerations/ecies-encryption-type.js +71 -0
  14. package/src/enumerations/ecies-encryption-type.js.map +1 -0
  15. package/src/enumerations/ecies-error-type.d.ts +32 -0
  16. package/src/enumerations/ecies-error-type.d.ts.map +1 -0
  17. package/src/enumerations/ecies-error-type.js +36 -0
  18. package/src/enumerations/ecies-error-type.js.map +1 -0
  19. package/src/enumerations/ecies-string-key.d.ts +96 -0
  20. package/src/enumerations/ecies-string-key.d.ts.map +1 -0
  21. package/src/enumerations/ecies-string-key.js +105 -0
  22. package/src/enumerations/ecies-string-key.js.map +1 -0
  23. package/src/enumerations/guid-brand-type.d.ts +27 -0
  24. package/src/enumerations/guid-brand-type.d.ts.map +1 -0
  25. package/src/enumerations/guid-brand-type.js +31 -0
  26. package/src/enumerations/guid-brand-type.js.map +1 -0
  27. package/src/enumerations/guid-error-type.d.ts +7 -0
  28. package/src/enumerations/guid-error-type.d.ts.map +1 -0
  29. package/src/enumerations/guid-error-type.js +11 -0
  30. package/src/enumerations/guid-error-type.js.map +1 -0
  31. package/src/enumerations/{index.ts → index.d.ts} +1 -0
  32. package/src/enumerations/index.d.ts.map +1 -0
  33. package/src/enumerations/index.js +18 -0
  34. package/src/enumerations/index.js.map +1 -0
  35. package/src/enumerations/invalid-email-type.d.ts +6 -0
  36. package/src/enumerations/invalid-email-type.d.ts.map +1 -0
  37. package/src/enumerations/invalid-email-type.js +10 -0
  38. package/src/enumerations/invalid-email-type.js.map +1 -0
  39. package/src/enumerations/length-encoding-type.d.ts +7 -0
  40. package/src/enumerations/length-encoding-type.d.ts.map +1 -0
  41. package/src/enumerations/length-encoding-type.js +11 -0
  42. package/src/enumerations/length-encoding-type.js.map +1 -0
  43. package/src/enumerations/length-error-type.d.ts +6 -0
  44. package/src/enumerations/length-error-type.d.ts.map +1 -0
  45. package/src/enumerations/length-error-type.js +10 -0
  46. package/src/enumerations/length-error-type.js.map +1 -0
  47. package/src/enumerations/member-error-type.d.ts +87 -0
  48. package/src/enumerations/member-error-type.d.ts.map +1 -0
  49. package/src/enumerations/member-error-type.js +91 -0
  50. package/src/enumerations/member-error-type.js.map +1 -0
  51. package/src/enumerations/{member-type.ts → member-type.d.ts} +6 -7
  52. package/src/enumerations/member-type.d.ts.map +1 -0
  53. package/src/enumerations/member-type.js +19 -0
  54. package/src/enumerations/member-type.js.map +1 -0
  55. package/src/enumerations/password-login-error-type.d.ts +5 -0
  56. package/src/enumerations/password-login-error-type.d.ts.map +1 -0
  57. package/src/enumerations/password-login-error-type.js +9 -0
  58. package/src/enumerations/password-login-error-type.js.map +1 -0
  59. package/src/enumerations/pbkdf2-error-type.d.ts +6 -0
  60. package/src/enumerations/pbkdf2-error-type.d.ts.map +1 -0
  61. package/src/enumerations/pbkdf2-error-type.js +10 -0
  62. package/src/enumerations/pbkdf2-error-type.js.map +1 -0
  63. package/src/enumerations/pbkdf2-profile.d.ts +6 -0
  64. package/src/enumerations/pbkdf2-profile.d.ts.map +1 -0
  65. package/src/enumerations/pbkdf2-profile.js +10 -0
  66. package/src/enumerations/pbkdf2-profile.js.map +1 -0
  67. package/src/enumerations/secure-storage-error-type.d.ts +6 -0
  68. package/src/enumerations/secure-storage-error-type.d.ts.map +1 -0
  69. package/src/enumerations/secure-storage-error-type.js +10 -0
  70. package/src/enumerations/secure-storage-error-type.js.map +1 -0
  71. package/src/errors/disposed.d.ts +4 -0
  72. package/src/errors/disposed.d.ts.map +1 -0
  73. package/src/errors/disposed.js +20 -0
  74. package/src/errors/disposed.js.map +1 -0
  75. package/src/errors/ecies.d.ts +7 -0
  76. package/src/errors/ecies.d.ts.map +1 -0
  77. package/src/errors/ecies.js +15 -0
  78. package/src/errors/ecies.js.map +1 -0
  79. package/src/errors/guid.d.ts +15 -0
  80. package/src/errors/guid.d.ts.map +1 -0
  81. package/src/errors/guid.js +26 -0
  82. package/src/errors/guid.js.map +1 -0
  83. package/src/errors/{index.ts → index.d.ts} +1 -0
  84. package/src/errors/index.d.ts.map +1 -0
  85. package/src/errors/index.js +12 -0
  86. package/src/errors/index.js.map +1 -0
  87. package/src/errors/invalid-email.d.ts +7 -0
  88. package/src/errors/invalid-email.d.ts.map +1 -0
  89. package/src/errors/invalid-email.js +14 -0
  90. package/src/errors/invalid-email.js.map +1 -0
  91. package/src/errors/length.d.ts +7 -0
  92. package/src/errors/length.d.ts.map +1 -0
  93. package/src/errors/length.js +14 -0
  94. package/src/errors/length.js.map +1 -0
  95. package/src/errors/member.d.ts +7 -0
  96. package/src/errors/member.d.ts.map +1 -0
  97. package/src/errors/member.js +14 -0
  98. package/src/errors/member.js.map +1 -0
  99. package/src/errors/pbkdf2.d.ts +7 -0
  100. package/src/errors/pbkdf2.d.ts.map +1 -0
  101. package/src/errors/pbkdf2.js +14 -0
  102. package/src/errors/pbkdf2.js.map +1 -0
  103. package/src/errors/secure-storage.d.ts +7 -0
  104. package/src/errors/secure-storage.d.ts.map +1 -0
  105. package/src/errors/secure-storage.js +15 -0
  106. package/src/errors/secure-storage.js.map +1 -0
  107. package/src/errors/simple-ecies.d.ts +6 -0
  108. package/src/errors/simple-ecies.d.ts.map +1 -0
  109. package/src/errors/simple-ecies.js +15 -0
  110. package/src/errors/simple-ecies.js.map +1 -0
  111. package/src/errors/simple-test-error.d.ts +4 -0
  112. package/src/errors/simple-test-error.d.ts.map +1 -0
  113. package/src/errors/simple-test-error.js +11 -0
  114. package/src/errors/simple-test-error.js.map +1 -0
  115. package/src/guid.d.ts +153 -0
  116. package/src/guid.d.ts.map +1 -0
  117. package/src/guid.js +615 -0
  118. package/src/guid.js.map +1 -0
  119. package/src/i18n-setup.d.ts +24 -0
  120. package/src/i18n-setup.d.ts.map +1 -0
  121. package/src/i18n-setup.js +837 -0
  122. package/src/i18n-setup.js.map +1 -0
  123. package/src/{index.ts → index.d.ts} +1 -0
  124. package/src/index.d.ts.map +1 -0
  125. package/src/index.js +19 -0
  126. package/src/index.js.map +1 -0
  127. package/src/interfaces/checksum-config.d.ts +5 -0
  128. package/src/interfaces/checksum-config.d.ts.map +1 -0
  129. package/src/interfaces/checksum-config.js +3 -0
  130. package/src/interfaces/checksum-config.js.map +1 -0
  131. package/src/interfaces/checksum-consts.d.ts +11 -0
  132. package/src/interfaces/checksum-consts.d.ts.map +1 -0
  133. package/src/interfaces/checksum-consts.js +3 -0
  134. package/src/interfaces/checksum-consts.js.map +1 -0
  135. package/src/interfaces/constants.d.ts +45 -0
  136. package/src/interfaces/constants.d.ts.map +1 -0
  137. package/src/interfaces/constants.js +3 -0
  138. package/src/interfaces/constants.js.map +1 -0
  139. package/src/interfaces/ecies-config.d.ts +9 -0
  140. package/src/interfaces/ecies-config.d.ts.map +1 -0
  141. package/src/interfaces/ecies-config.js +3 -0
  142. package/src/interfaces/ecies-config.js.map +1 -0
  143. package/src/interfaces/ecies-consts.d.ts +58 -0
  144. package/src/interfaces/ecies-consts.d.ts.map +1 -0
  145. package/src/interfaces/ecies-consts.js +3 -0
  146. package/src/interfaces/ecies-consts.js.map +1 -0
  147. package/src/interfaces/ecies-file-service.d.ts +7 -0
  148. package/src/interfaces/ecies-file-service.d.ts.map +1 -0
  149. package/src/interfaces/ecies-file-service.js +3 -0
  150. package/src/interfaces/ecies-file-service.js.map +1 -0
  151. package/src/interfaces/guid.d.ts +45 -0
  152. package/src/interfaces/guid.d.ts.map +1 -0
  153. package/src/interfaces/guid.js +3 -0
  154. package/src/interfaces/guid.js.map +1 -0
  155. package/src/interfaces/{index.ts → index.d.ts} +1 -0
  156. package/src/interfaces/index.d.ts.map +1 -0
  157. package/src/interfaces/index.js +17 -0
  158. package/src/interfaces/index.js.map +1 -0
  159. package/src/interfaces/library-error.d.ts +23 -0
  160. package/src/interfaces/library-error.d.ts.map +1 -0
  161. package/src/interfaces/library-error.js +3 -0
  162. package/src/interfaces/library-error.js.map +1 -0
  163. package/src/interfaces/member-operational.d.ts +40 -0
  164. package/src/interfaces/member-operational.d.ts.map +1 -0
  165. package/src/interfaces/member-operational.js +3 -0
  166. package/src/interfaces/member-operational.js.map +1 -0
  167. package/src/interfaces/{member-storage.ts → member-storage.d.ts} +10 -11
  168. package/src/interfaces/member-storage.d.ts.map +1 -0
  169. package/src/interfaces/member-storage.js +3 -0
  170. package/src/interfaces/member-storage.js.map +1 -0
  171. package/src/interfaces/{member-with-mnemonic.ts → member-with-mnemonic.d.ts} +3 -3
  172. package/src/interfaces/member-with-mnemonic.d.ts.map +1 -0
  173. package/src/interfaces/member-with-mnemonic.js +3 -0
  174. package/src/interfaces/member-with-mnemonic.js.map +1 -0
  175. package/src/interfaces/pbkdf2-config.d.ts +7 -0
  176. package/src/interfaces/pbkdf2-config.d.ts.map +1 -0
  177. package/src/interfaces/pbkdf2-config.js +3 -0
  178. package/src/interfaces/pbkdf2-config.js.map +1 -0
  179. package/src/interfaces/pbkdf2-consts.d.ts +9 -0
  180. package/src/interfaces/pbkdf2-consts.d.ts.map +1 -0
  181. package/src/interfaces/pbkdf2-consts.js +3 -0
  182. package/src/interfaces/pbkdf2-consts.js.map +1 -0
  183. package/src/interfaces/pbkdf2-result.d.ts +6 -0
  184. package/src/interfaces/pbkdf2-result.d.ts.map +1 -0
  185. package/src/interfaces/pbkdf2-result.js +3 -0
  186. package/src/interfaces/pbkdf2-result.js.map +1 -0
  187. package/src/member.d.ts +66 -0
  188. package/src/member.d.ts.map +1 -0
  189. package/src/member.js +269 -0
  190. package/src/member.js.map +1 -0
  191. package/src/{pbkdf2-profiles.ts → pbkdf2-profiles.d.ts} +2 -2
  192. package/src/pbkdf2-profiles.d.ts.map +1 -0
  193. package/src/pbkdf2-profiles.js +3 -0
  194. package/src/pbkdf2-profiles.js.map +1 -0
  195. package/src/phone-number.d.ts +6 -0
  196. package/src/phone-number.d.ts.map +1 -0
  197. package/src/phone-number.js +22 -0
  198. package/src/phone-number.js.map +1 -0
  199. package/src/regexes.d.ts +7 -0
  200. package/src/regexes.d.ts.map +1 -0
  201. package/src/regexes.js +10 -0
  202. package/src/regexes.js.map +1 -0
  203. package/src/secure-buffer.d.ts +38 -0
  204. package/src/secure-buffer.d.ts.map +1 -0
  205. package/src/secure-buffer.js +168 -0
  206. package/src/secure-buffer.js.map +1 -0
  207. package/src/secure-string.d.ts +39 -0
  208. package/src/secure-string.d.ts.map +1 -0
  209. package/src/secure-string.js +195 -0
  210. package/src/secure-string.js.map +1 -0
  211. package/src/services/aes-gcm.d.ts +57 -0
  212. package/src/services/aes-gcm.d.ts.map +1 -0
  213. package/src/services/aes-gcm.js +111 -0
  214. package/src/services/aes-gcm.js.map +1 -0
  215. package/src/services/ecies/crypto-core.d.ts +51 -0
  216. package/src/services/ecies/crypto-core.d.ts.map +1 -0
  217. package/src/services/ecies/crypto-core.js +139 -0
  218. package/src/services/ecies/crypto-core.js.map +1 -0
  219. package/src/services/ecies/example.d.ts +25 -0
  220. package/src/services/ecies/example.d.ts.map +1 -0
  221. package/src/services/ecies/example.js +128 -0
  222. package/src/services/ecies/example.js.map +1 -0
  223. package/src/services/ecies/file.d.ts +18 -0
  224. package/src/services/ecies/file.d.ts.map +1 -0
  225. package/src/services/ecies/file.js +110 -0
  226. package/src/services/ecies/file.js.map +1 -0
  227. package/src/services/ecies/{index.ts → index.d.ts} +1 -3
  228. package/src/services/ecies/index.d.ts.map +1 -0
  229. package/src/services/ecies/index.js +44 -0
  230. package/src/services/ecies/index.js.map +1 -0
  231. package/src/services/ecies/integration.d.ts +59 -0
  232. package/src/services/ecies/integration.d.ts.map +1 -0
  233. package/src/services/ecies/integration.js +172 -0
  234. package/src/services/ecies/integration.js.map +1 -0
  235. package/src/services/ecies/interfaces.d.ts +51 -0
  236. package/src/services/ecies/interfaces.d.ts.map +1 -0
  237. package/src/services/ecies/interfaces.js +6 -0
  238. package/src/services/ecies/interfaces.js.map +1 -0
  239. package/src/services/ecies/manual-test.d.ts +29 -0
  240. package/src/services/ecies/manual-test.d.ts.map +1 -0
  241. package/src/services/ecies/manual-test.js +171 -0
  242. package/src/services/ecies/manual-test.js.map +1 -0
  243. package/src/services/ecies/multi-recipient.d.ts +52 -0
  244. package/src/services/ecies/multi-recipient.d.ts.map +1 -0
  245. package/src/services/ecies/multi-recipient.js +243 -0
  246. package/src/services/ecies/multi-recipient.js.map +1 -0
  247. package/src/services/ecies/service.d.ts +104 -0
  248. package/src/services/ecies/service.d.ts.map +1 -0
  249. package/src/services/ecies/service.js +192 -0
  250. package/src/services/ecies/service.js.map +1 -0
  251. package/src/services/ecies/signature.d.ts +27 -0
  252. package/src/services/ecies/signature.d.ts.map +1 -0
  253. package/src/services/ecies/signature.js +76 -0
  254. package/src/services/ecies/signature.js.map +1 -0
  255. package/src/services/ecies/single-recipient.d.ts +46 -0
  256. package/src/services/ecies/single-recipient.d.ts.map +1 -0
  257. package/src/services/ecies/single-recipient.js +212 -0
  258. package/src/services/ecies/single-recipient.js.map +1 -0
  259. package/src/services/{index.ts → index.d.ts} +1 -0
  260. package/src/services/index.d.ts.map +1 -0
  261. package/src/services/index.js +9 -0
  262. package/src/services/index.js.map +1 -0
  263. package/src/services/password-login.d.ts +49 -0
  264. package/src/services/password-login.d.ts.map +1 -0
  265. package/src/services/password-login.js +121 -0
  266. package/src/services/password-login.js.map +1 -0
  267. package/src/services/pbkdf2.d.ts +56 -0
  268. package/src/services/pbkdf2.d.ts.map +1 -0
  269. package/src/services/pbkdf2.js +114 -0
  270. package/src/services/pbkdf2.js.map +1 -0
  271. package/src/services/xor.d.ts +37 -0
  272. package/src/services/xor.d.ts.map +1 -0
  273. package/src/services/xor.js +67 -0
  274. package/src/services/xor.js.map +1 -0
  275. package/src/types/deep-partial.d.ts +4 -0
  276. package/src/types/deep-partial.d.ts.map +1 -0
  277. package/src/types/deep-partial.js +3 -0
  278. package/src/types/deep-partial.js.map +1 -0
  279. package/src/{types.ts → types.d.ts} +4 -10
  280. package/src/types.d.ts.map +1 -0
  281. package/src/types.js +3 -0
  282. package/src/types.js.map +1 -0
  283. package/src/utils.d.ts +68 -0
  284. package/src/utils.d.ts.map +1 -0
  285. package/src/utils.js +288 -0
  286. package/src/utils.js.map +1 -0
  287. package/LICENSE +0 -21
  288. package/src/constants.ts +0 -474
  289. package/src/email-string.ts +0 -83
  290. package/src/enumerations/ecies-encryption-type.ts +0 -102
  291. package/src/enumerations/ecies-error-type.ts +0 -31
  292. package/src/enumerations/ecies-string-key.ts +0 -108
  293. package/src/enumerations/guid-brand-type.ts +0 -26
  294. package/src/enumerations/guid-error-type.ts +0 -6
  295. package/src/enumerations/invalid-email-type.ts +0 -5
  296. package/src/enumerations/length-encoding-type.ts +0 -6
  297. package/src/enumerations/length-error-type.ts +0 -5
  298. package/src/enumerations/member-error-type.ts +0 -106
  299. package/src/enumerations/password-login-error-type.ts +0 -4
  300. package/src/enumerations/pbkdf2-error-type.ts +0 -5
  301. package/src/enumerations/pbkdf2-profile.ts +0 -5
  302. package/src/enumerations/secure-storage-error-type.ts +0 -5
  303. package/src/errors/disposed.ts +0 -15
  304. package/src/errors/ecies.ts +0 -34
  305. package/src/errors/guid.ts +0 -34
  306. package/src/errors/invalid-email.ts +0 -11
  307. package/src/errors/length.ts +0 -11
  308. package/src/errors/member.ts +0 -12
  309. package/src/errors/pbkdf2.ts +0 -12
  310. package/src/errors/secure-storage.ts +0 -13
  311. package/src/errors/simple-ecies.ts +0 -18
  312. package/src/errors/simple-test-error.ts +0 -6
  313. package/src/guid.ts +0 -800
  314. package/src/i18n-setup.ts +0 -1312
  315. package/src/interfaces/checksum-config.ts +0 -4
  316. package/src/interfaces/checksum-consts.ts +0 -13
  317. package/src/interfaces/constants.ts +0 -48
  318. package/src/interfaces/ecies-config.ts +0 -8
  319. package/src/interfaces/ecies-consts.ts +0 -70
  320. package/src/interfaces/ecies-file-service.ts +0 -6
  321. package/src/interfaces/guid.ts +0 -53
  322. package/src/interfaces/library-error.ts +0 -23
  323. package/src/interfaces/member-operational.ts +0 -54
  324. package/src/interfaces/pbkdf2-config.ts +0 -6
  325. package/src/interfaces/pbkdf2-consts.ts +0 -10
  326. package/src/interfaces/pbkdf2-result.ts +0 -5
  327. package/src/member.ts +0 -429
  328. package/src/phone-number.ts +0 -18
  329. package/src/regexes.ts +0 -10
  330. package/src/secure-buffer.ts +0 -183
  331. package/src/secure-string.ts +0 -229
  332. package/src/services/aes-gcm.ts +0 -177
  333. package/src/services/ecies/README.md +0 -147
  334. package/src/services/ecies/crypto-core.ts +0 -180
  335. package/src/services/ecies/example.ts +0 -185
  336. package/src/services/ecies/file.ts +0 -167
  337. package/src/services/ecies/integration.ts +0 -241
  338. package/src/services/ecies/interfaces.ts +0 -59
  339. package/src/services/ecies/manual-test.ts +0 -219
  340. package/src/services/ecies/multi-recipient.ts +0 -394
  341. package/src/services/ecies/service.ts +0 -317
  342. package/src/services/ecies/signature.ts +0 -93
  343. package/src/services/ecies/single-recipient.ts +0 -340
  344. package/src/services/password-login.ts +0 -228
  345. package/src/services/pbkdf2.ts +0 -172
  346. package/src/services/xor.ts +0 -65
  347. package/src/types/deep-partial.ts +0 -11
  348. package/src/utils.ts +0 -331
@@ -1,229 +0,0 @@
1
- import { SecureStorageErrorType } from './enumerations/secure-storage-error-type';
2
- import { DisposedError } from './errors/disposed';
3
- import { SecureStorageError } from './errors/secure-storage';
4
- import { GuidV4 } from './guid';
5
- import { getEciesI18nEngine } from './i18n-setup';
6
- import { XorService } from './services/xor';
7
- import { FullHexGuid, RawGuidUint8Array } from './types';
8
- import { uint8ArrayToHex } from './utils';
9
-
10
- /**
11
- * A secure string buffer is a buffer whose intent is to prevent the raw password from being stored in memory.
12
- */
13
- export class SecureString {
14
- private _disposed: boolean = false;
15
- private readonly _isNull: boolean;
16
- private readonly _id: GuidV4;
17
- private readonly _length: number;
18
- private readonly _obfuscatedValue: Uint8Array;
19
- private readonly _key: Uint8Array;
20
- private readonly _obfuscatedChecksum: Uint8Array;
21
- private _disposedAt?: string;
22
- constructor(data?: string | Uint8Array | null) {
23
- this._id = GuidV4.new();
24
- // only treat null/undefined as null, empty strings/arrays are valid empty data
25
- if (data === null || data === undefined) {
26
- this._isNull = true;
27
- this._length = 0;
28
- this._obfuscatedValue = new Uint8Array(0);
29
- this._key = new Uint8Array(0);
30
- this._obfuscatedChecksum = new Uint8Array(0);
31
- return;
32
- }
33
- this._isNull = false;
34
- this._key = this.idUint8Array;
35
- const dataAsUint8Array =
36
- typeof data === 'string'
37
- ? new TextEncoder().encode(data)
38
- : (data as Uint8Array);
39
- // Store the byte length, not the character length
40
- this._length = dataAsUint8Array.length;
41
- this._obfuscatedValue = this.obfuscateData(dataAsUint8Array);
42
- this._obfuscatedChecksum =
43
- this.createSimpleObfuscatedChecksum(dataAsUint8Array);
44
- }
45
- private assertNotDisposed(): void {
46
- if (this._disposed) {
47
- const e = new DisposedError();
48
- try {
49
- (e as any).disposedAt = this._disposedAt;
50
- } catch {
51
- // ignore if Error object is sealed/frozen
52
- }
53
- throw e;
54
- }
55
- }
56
- public dispose(): void {
57
- const err = new DisposedError();
58
- if (typeof (Error as any).captureStackTrace === 'function') {
59
- (Error as any).captureStackTrace(err, this.dispose);
60
- }
61
- this._disposedAt = err.stack ?? 'stack unavailable';
62
- this._obfuscatedValue.fill(0);
63
- this._key.fill(0);
64
- this._obfuscatedChecksum.fill(0);
65
- this._disposed = true;
66
- }
67
- public get disposedAtStack(): string | undefined {
68
- return this._disposedAt;
69
- }
70
- public get id(): FullHexGuid {
71
- this.assertNotDisposed();
72
- return this._id.asFullHexGuid;
73
- }
74
- public get idUint8Array(): RawGuidUint8Array {
75
- this.assertNotDisposed();
76
- return this._id.asRawGuidUint8Array;
77
- }
78
- public get originalLength(): number {
79
- this.assertNotDisposed();
80
- return this._length;
81
- }
82
- public get valueAsUint8Array(): Uint8Array {
83
- this.assertNotDisposed();
84
- if (this._isNull) {
85
- return new Uint8Array(0);
86
- }
87
- try {
88
- const deobfuscatedResult = this.deobfuscateData(this._obfuscatedValue);
89
- if (deobfuscatedResult.length !== this._length) {
90
- throw new SecureStorageError(
91
- SecureStorageErrorType.DecryptedValueLengthMismatch,
92
- getEciesI18nEngine() as any,
93
- );
94
- }
95
-
96
- // Validate checksum
97
- const expectedChecksum = this.createSimpleChecksum(deobfuscatedResult);
98
- const storedChecksum = new TextDecoder().decode(
99
- this.deobfuscateData(this._obfuscatedChecksum),
100
- );
101
-
102
- const expectedBytes = new TextEncoder().encode(expectedChecksum);
103
- const storedBytes = new TextEncoder().encode(storedChecksum);
104
- if (!this.timingSafeEqual(expectedBytes, storedBytes)) {
105
- throw new SecureStorageError(
106
- SecureStorageErrorType.DecryptedValueChecksumMismatch,
107
- getEciesI18nEngine() as any,
108
- );
109
- }
110
-
111
- return deobfuscatedResult;
112
- } catch (error) {
113
- // If it's already a SecureStorageError, re-throw it
114
- if (error instanceof SecureStorageError) {
115
- throw error;
116
- }
117
- // Convert any other error to SecureStorageError
118
- throw new SecureStorageError(
119
- SecureStorageErrorType.DecryptedValueChecksumMismatch,
120
- getEciesI18nEngine() as any,
121
- );
122
- }
123
- }
124
- public get value(): string | null {
125
- this.assertNotDisposed();
126
- if (this._isNull) {
127
- return null;
128
- }
129
- return new TextDecoder().decode(this.valueAsUint8Array);
130
- }
131
- public get notNullValue(): string {
132
- this.assertNotDisposed();
133
- if (this._isNull) {
134
- throw new SecureStorageError(
135
- SecureStorageErrorType.ValueIsNull,
136
- getEciesI18nEngine() as any,
137
- );
138
- }
139
- return new TextDecoder().decode(this.valueAsUint8Array);
140
- }
141
- public get valueAsHexString(): string {
142
- this.assertNotDisposed();
143
- return uint8ArrayToHex(this.valueAsUint8Array);
144
- }
145
- public get valueAsBase64String(): string {
146
- this.assertNotDisposed();
147
- return btoa(String.fromCharCode(...this.valueAsUint8Array));
148
- }
149
- public get hasValue(): boolean {
150
- this.assertNotDisposed();
151
- return !this._isNull && this._length > 0;
152
- }
153
- public get checksum(): string {
154
- this.assertNotDisposed();
155
- const deobfuscatedChecksum = new TextDecoder().decode(
156
- this.deobfuscateData(this._obfuscatedChecksum),
157
- );
158
- return deobfuscatedChecksum;
159
- }
160
- public get length(): number {
161
- this.assertNotDisposed();
162
- return this._length;
163
- }
164
- private async generateChecksum(data: string | Uint8Array): Promise<string> {
165
- const dataBytes =
166
- typeof data === 'string' ? new TextEncoder().encode(data) : data;
167
- const hashArray = await crypto.subtle.digest(
168
- 'SHA-256',
169
- new Uint8Array(dataBytes),
170
- );
171
- return uint8ArrayToHex(new Uint8Array(hashArray));
172
- }
173
- private createSimpleChecksum(data: Uint8Array): string {
174
- let hash = 0;
175
- for (let i = 0; i < data.length; i++) {
176
- hash = ((hash << 5) - hash + data[i]) & 0xffffffff;
177
- }
178
- return hash.toString(16);
179
- }
180
-
181
- private createSimpleObfuscatedChecksum(
182
- data: string | Uint8Array,
183
- ): Uint8Array {
184
- const dataBytes =
185
- typeof data === 'string' ? new TextEncoder().encode(data) : data;
186
- const checksum = this.createSimpleChecksum(dataBytes);
187
- return this.obfuscateData(new TextEncoder().encode(checksum));
188
- }
189
-
190
- private async createObfuscatedChecksum(
191
- data: string | Uint8Array,
192
- ): Promise<Uint8Array> {
193
- const checksum = await this.generateChecksum(data);
194
- const result = this.obfuscateData(new TextEncoder().encode(checksum));
195
- return result;
196
- }
197
- private async validateChecksum(
198
- data: string | Uint8Array,
199
- checksum: string,
200
- ): Promise<boolean> {
201
- const generatedChecksum = await this.generateChecksum(data);
202
- return generatedChecksum === checksum;
203
- }
204
-
205
- private timingSafeEqual(a: Uint8Array, b: Uint8Array): boolean {
206
- if (a.length !== b.length) {
207
- return false;
208
- }
209
- let result = 0;
210
- for (let i = 0; i < a.length; i++) {
211
- result |= a[i] ^ b[i];
212
- }
213
- return result === 0;
214
- }
215
- private async validateObfuscatedChecksum(
216
- data: string | Uint8Array,
217
- ): Promise<boolean> {
218
- const deobfuscatedChecksum = new TextDecoder().decode(
219
- this.deobfuscateData(this._obfuscatedChecksum),
220
- );
221
- return this.validateChecksum(data, deobfuscatedChecksum);
222
- }
223
- private obfuscateData(data: Uint8Array): Uint8Array {
224
- return XorService.xor(data, this._key);
225
- }
226
- private deobfuscateData(data: Uint8Array): Uint8Array {
227
- return XorService.xor(data, this._key);
228
- }
229
- }
@@ -1,177 +0,0 @@
1
- import { IECIESConstants } from '../interfaces/ecies-consts';
2
- import { Constants } from '../constants';
3
- import { EciesComponentId, getEciesI18nEngine } from '../i18n-setup';
4
- import { EciesStringKey } from '../enumerations';
5
-
6
- export abstract class AESGCMService {
7
- public static readonly ALGORITHM_NAME = 'AES-GCM';
8
- /**
9
- * Encrypt data using AES-GCM
10
- * @param data Data to encrypt
11
- * @param key Key to use for encryption (must be 16, 24 or 32 bytes for AES)
12
- * @returns Encrypted data
13
- */
14
- public static async encrypt(
15
- data: Uint8Array,
16
- key: Uint8Array,
17
- authTag: boolean = false,
18
- eciesParams: IECIESConstants = Constants.ECIES,
19
- ): Promise<{ encrypted: Uint8Array; iv: Uint8Array; tag?: Uint8Array }> {
20
- const cryptoKey = await crypto.subtle.importKey(
21
- 'raw',
22
- new Uint8Array(key),
23
- { name: AESGCMService.ALGORITHM_NAME },
24
- false,
25
- ['encrypt'],
26
- );
27
-
28
- const eciesConsts = eciesParams;
29
- const iv = crypto.getRandomValues(new Uint8Array(eciesConsts.IV_SIZE));
30
- const encryptedResult = await crypto.subtle.encrypt(
31
- {
32
- name: AESGCMService.ALGORITHM_NAME,
33
- iv,
34
- ...(authTag && { tagLength: eciesConsts.AUTH_TAG_SIZE * 8 }),
35
- },
36
- cryptoKey,
37
- new Uint8Array(data),
38
- );
39
-
40
- const encryptedArray = new Uint8Array(encryptedResult);
41
- if (!authTag) {
42
- return { encrypted: encryptedArray, iv };
43
- }
44
- const authTagLengthBytes = eciesConsts.AUTH_TAG_SIZE;
45
- const encryptedBytes = encryptedArray.slice(0, -authTagLengthBytes); // Remove auth tag
46
- const authTagBytes = encryptedArray.slice(-authTagLengthBytes); // Last 16 bytes are auth tag
47
-
48
- return { encrypted: encryptedBytes, iv, tag: authTagBytes };
49
- }
50
-
51
- /**
52
- * Combine encrypted data and auth tag into a single Uint8Array
53
- * @param encryptedData The encrypted data
54
- * @param authTag The authentication tag
55
- * @returns The combined Uint8Array
56
- */
57
- public static combineEncryptedDataAndTag(
58
- encryptedData: Uint8Array,
59
- authTag: Uint8Array,
60
- ): Uint8Array {
61
- const combined = new Uint8Array(encryptedData.length + authTag.length);
62
- combined.set(encryptedData);
63
- combined.set(authTag, encryptedData.length);
64
- return combined;
65
- }
66
-
67
- /**
68
- * Combine IV and encrypted data (with optional auth tag) into a single Uint8Array
69
- * @param iv The initialization vector
70
- * @param encryptedDataWithTag The encrypted data with auth tag already appended (if applicable)
71
- * @returns The combined Uint8Array
72
- */
73
- public static combineIvAndEncryptedData(
74
- iv: Uint8Array,
75
- encryptedDataWithTag: Uint8Array,
76
- ): Uint8Array {
77
- const combined = new Uint8Array(iv.length + encryptedDataWithTag.length);
78
- combined.set(iv);
79
- combined.set(encryptedDataWithTag, iv.length);
80
- return combined;
81
- }
82
-
83
- /**
84
- * Combine IV, encrypted data and auth tag into a single Uint8Array
85
- * @param iv The initialization vector
86
- * @param encryptedData The encrypted data
87
- * @param authTag The authentication tag
88
- * @returns The combined Uint8Array
89
- */
90
- public static combineIvTagAndEncryptedData(
91
- iv: Uint8Array,
92
- encryptedData: Uint8Array,
93
- authTag: Uint8Array,
94
- ): Uint8Array {
95
- const encryptedWithTag = AESGCMService.combineEncryptedDataAndTag(
96
- encryptedData,
97
- authTag,
98
- );
99
- return AESGCMService.combineIvAndEncryptedData(iv, encryptedWithTag);
100
- }
101
-
102
- /**
103
- * Split combined encrypted data back into its components
104
- * @param combinedData The combined data containing IV, encrypted data, and optionally auth tag
105
- * @param hasAuthTag Whether the combined data includes an authentication tag
106
- * @returns Object containing the split components
107
- */
108
- public static splitEncryptedData(
109
- combinedData: Uint8Array,
110
- hasAuthTag: boolean = true,
111
- eciesParams: IECIESConstants = Constants.ECIES,
112
- ): { iv: Uint8Array; encryptedDataWithTag: Uint8Array } {
113
- const eciesConsts = eciesParams;
114
- const ivLength = eciesConsts.IV_SIZE;
115
- const tagLength = hasAuthTag ? eciesConsts.AUTH_TAG_SIZE : 0;
116
-
117
- if (combinedData.length < ivLength + tagLength) {
118
- const engine = getEciesI18nEngine();
119
- throw new Error(
120
- engine.translate(EciesComponentId, EciesStringKey.Error_ECIESError_CombinedDataTooShortForComponents),
121
- );
122
- }
123
-
124
- const iv = combinedData.slice(0, ivLength);
125
- const encryptedDataWithTag = combinedData.slice(ivLength);
126
-
127
- return { iv, encryptedDataWithTag };
128
- }
129
-
130
- /**
131
- * Decrypt data using AES-GCM
132
- * @param iv The initialization vector
133
- * @param encryptedData Data to decrypt (with auth tag appended if authTag is true)
134
- * @param key Key to use for decryption (must be 16, 24 or 32 bytes for AES)
135
- * @param authTag Whether the encrypted data includes an authentication tag
136
- * @returns Decrypted data
137
- */
138
- public static async decrypt(
139
- iv: Uint8Array,
140
- encryptedData: Uint8Array,
141
- key: Uint8Array,
142
- authTag: boolean = false,
143
- eciesParams: IECIESConstants = Constants.ECIES,
144
- ): Promise<Uint8Array> {
145
- const eciesConsts = eciesParams;
146
- const cryptoKey = await crypto.subtle.importKey(
147
- 'raw',
148
- new Uint8Array(key),
149
- { name: AESGCMService.ALGORITHM_NAME },
150
- false,
151
- ['decrypt'],
152
- );
153
-
154
- if (!authTag) {
155
- const decrypted = await crypto.subtle.decrypt(
156
- { name: AESGCMService.ALGORITHM_NAME, iv: new Uint8Array(iv) },
157
- cryptoKey,
158
- new Uint8Array(encryptedData),
159
- );
160
-
161
- return new Uint8Array(decrypted);
162
- }
163
-
164
- // Decrypt with auth tag (already appended to encryptedData)
165
- const decryptedResult = await crypto.subtle.decrypt(
166
- {
167
- name: AESGCMService.ALGORITHM_NAME,
168
- iv: new Uint8Array(iv),
169
- tagLength: eciesConsts.AUTH_TAG_SIZE * 8,
170
- },
171
- cryptoKey,
172
- new Uint8Array(encryptedData),
173
- );
174
-
175
- return new Uint8Array(decryptedResult);
176
- }
177
- }
@@ -1,147 +0,0 @@
1
- # Browser-Compatible ECIES Service
2
-
3
- This directory contains a web-based implementation of the ECIES (Elliptic Curve Integrated Encryption Scheme) service that mirrors the functionality of the server-side implementation but uses browser-compatible libraries.
4
-
5
- ## Overview
6
-
7
- The browser ECIES service provides the same cryptographic functionality as the server-side version, including:
8
-
9
- - **Mnemonic generation and wallet derivation** using BIP39/BIP32
10
- - **ECDH key exchange** using secp256k1 curve
11
- - **AES-GCM encryption** using Web Crypto API
12
- - **ECDSA signatures** using secp256k1
13
- - **Single and simple recipient encryption modes**
14
- - **CRC16 validation** for data integrity
15
-
16
- ## Dependencies
17
-
18
- The service uses the following browser-compatible libraries:
19
-
20
- - `@scure/bip39` - BIP39 mnemonic generation and validation
21
- - `@scure/bip32` - BIP32 hierarchical deterministic key derivation
22
- - `@noble/curves` - Elliptic curve cryptography (secp256k1)
23
- - `@noble/hashes` - Cryptographic hash functions
24
- - Web Crypto API - Native browser AES-GCM encryption
25
-
26
- ## Architecture
27
-
28
- ### Core Components
29
-
30
- 1. **`crypto-core.ts`** - Core cryptographic operations (key generation, ECDH)
31
- 2. **`single-recipient.ts`** - Single recipient encryption/decryption
32
- 3. **`signature.ts`** - ECDSA signature operations
33
- 4. **`service.ts`** - Main service that integrates all components
34
- 5. **`utils.ts`** - Utility functions (CRC16, hex conversion, etc.)
35
- 6. **`constants.ts`** - Cryptographic constants matching server-side
36
- 7. **`interfaces.ts`** - TypeScript interfaces
37
-
38
- ### Encryption Modes
39
-
40
- - **Simple Mode**: Basic encryption without CRC or length prefix
41
- - **Single Mode**: Encryption with data length and CRC16 validation
42
- - **Multiple Mode**: Multi-recipient encryption (planned for future implementation)
43
-
44
- ## Usage
45
-
46
- ### Basic Example
47
-
48
- ```typescript
49
- import { ECIESService } from './services/ecies';
50
-
51
- // Create service instance
52
- const ecies = new ECIESService();
53
-
54
- // Generate mnemonic and derive keys
55
- const mnemonic = ecies.generateNewMnemonic();
56
- const { privateKey, publicKey } = ecies.mnemonicToSimpleKeyPair(mnemonic);
57
-
58
- // Encrypt a message
59
- const message = new TextEncoder().encode('Hello, World!');
60
- const encrypted = await ecies.encryptSimpleOrSingle(false, publicKey, message);
61
-
62
- // Decrypt the message
63
- const decrypted = await ecies.decryptSimpleOrSingleWithHeader(false, privateKey, encrypted);
64
- const result = new TextDecoder().decode(decrypted);
65
- ```
66
-
67
- ### Wallet Derivation
68
-
69
- ```typescript
70
- // Generate new mnemonic
71
- const mnemonic = ecies.generateNewMnemonic();
72
-
73
- // Derive wallet from mnemonic
74
- const wallet = ecies.walletAndSeedFromMnemonic(mnemonic);
75
- console.log('Seed:', wallet.seed);
76
- console.log('Private Key:', wallet.privateKey);
77
- console.log('Public Key:', wallet.publicKey);
78
- ```
79
-
80
- ### Digital Signatures
81
-
82
- ```typescript
83
- // Sign a message
84
- const message = new TextEncoder().encode('Message to sign');
85
- const signature = ecies.signMessage(privateKey, message);
86
-
87
- // Verify signature
88
- const isValid = ecies.verifyMessage(publicKey, message, signature);
89
- ```
90
-
91
- ### Simple vs Single Mode
92
-
93
- ```typescript
94
- // Simple mode (no CRC, smaller overhead)
95
- const simpleEncrypted = await ecies.encryptSimpleOrSingle(true, publicKey, message);
96
- const simpleDecrypted = await ecies.decryptSimpleOrSingleWithHeader(true, privateKey, simpleEncrypted);
97
-
98
- // Single mode (with CRC and length validation)
99
- const singleEncrypted = await ecies.encryptSimpleOrSingle(false, publicKey, message);
100
- const singleDecrypted = await ecies.decryptSimpleOrSingleWithHeader(false, privateKey, singleEncrypted);
101
- ```
102
-
103
- ## Compatibility
104
-
105
- This implementation is designed to be fully compatible with the server-side ECIES service:
106
-
107
- - Uses the same cryptographic constants and algorithms
108
- - Produces identical encrypted output format
109
- - Supports the same key derivation paths
110
- - Implements the same CRC16 algorithm for data integrity
111
-
112
- ## Security Considerations
113
-
114
- - All cryptographic operations use well-established, audited libraries
115
- - Private keys are handled as Uint8Array and should be properly secured
116
- - The Web Crypto API provides secure random number generation
117
- - ECDH shared secrets are properly derived using secp256k1
118
-
119
- ## Testing
120
-
121
- Run the examples to test the functionality:
122
-
123
- ```typescript
124
- import { runAllExamples } from './services/ecies/example';
125
-
126
- // Run all examples in browser console
127
- runAllExamples();
128
- ```
129
-
130
- ## Future Enhancements
131
-
132
- - Multi-recipient encryption support
133
- - Key caching and management
134
- - Integration with browser storage APIs
135
- - Performance optimizations for large messages
136
-
137
- ## Error Handling
138
-
139
- The service throws descriptive errors for:
140
-
141
- - Invalid mnemonics
142
- - Malformed public/private keys
143
- - Encryption/decryption failures
144
- - CRC validation errors
145
- - Invalid encryption types
146
-
147
- Always wrap cryptographic operations in try-catch blocks for proper error handling.