@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
package/src/member.ts ADDED
@@ -0,0 +1,429 @@
1
+ import { Wallet } from '@ethereumjs/wallet';
2
+ import { ECIES } from './constants';
3
+ import { EmailString } from './email-string';
4
+ import MemberErrorType from './enumerations/member-error-type';
5
+ import MemberType from './enumerations/member-type';
6
+ import { MemberError } from './errors/member';
7
+ import { GuidV4 } from './guid';
8
+ import { getEciesI18nEngine } from './i18n-setup';
9
+ import { IMemberOperational } from './interfaces/member-operational';
10
+ import { IMemberStorageData } from './interfaces/member-storage';
11
+ import { IMemberWithMnemonic } from './interfaces/member-with-mnemonic';
12
+ import { SecureBuffer } from './secure-buffer';
13
+ import { SecureString } from './secure-string';
14
+ import { ECIESService } from './services/ecies/service';
15
+ import { SignatureUint8Array } from './types';
16
+ import {
17
+ base64ToUint8Array,
18
+ uint8ArrayToBase64,
19
+ uint8ArrayToHex,
20
+ } from './utils';
21
+ import { IECIESConstants } from './interfaces/ecies-consts';
22
+
23
+ /**
24
+ * Represents a member with cryptographic capabilities.
25
+ * This class provides methods for signing, verifying, encrypting, and decrypting data.
26
+ * It also manages the member's keys and wallet.
27
+ */
28
+ export class Member implements IMemberOperational {
29
+ private readonly _eciesService: ECIESService;
30
+ private readonly _id: GuidV4;
31
+ private readonly _type: MemberType;
32
+ private readonly _name: string;
33
+ private readonly _email: EmailString;
34
+ private readonly _publicKey: Uint8Array;
35
+ private readonly _creatorId: GuidV4;
36
+ private readonly _dateCreated: Date;
37
+ private readonly _dateUpdated: Date;
38
+ private _privateKey?: SecureBuffer;
39
+ private _wallet?: Wallet;
40
+
41
+ constructor(
42
+ // Add injected services as parameters
43
+ eciesService: ECIESService,
44
+ // Original parameters
45
+ type: MemberType,
46
+ name: string,
47
+ email: EmailString,
48
+ publicKey: Uint8Array,
49
+ privateKey?: SecureBuffer,
50
+ wallet?: Wallet,
51
+ id?: GuidV4,
52
+ dateCreated?: Date,
53
+ dateUpdated?: Date,
54
+ creatorId?: GuidV4,
55
+ ) {
56
+ // Assign injected services
57
+ this._eciesService = eciesService;
58
+ // Assign original parameters
59
+ this._type = type;
60
+ this._id = id ?? GuidV4.new();
61
+ this._name = name;
62
+ if (!this._name || this._name.length == 0) {
63
+ throw new MemberError(
64
+ MemberErrorType.MissingMemberName,
65
+ getEciesI18nEngine() as any,
66
+ );
67
+ }
68
+ if (this._name.trim() != this._name) {
69
+ throw new MemberError(
70
+ MemberErrorType.InvalidMemberNameWhitespace,
71
+ getEciesI18nEngine() as any,
72
+ );
73
+ }
74
+ this._email = email;
75
+ this._publicKey = publicKey;
76
+ this._privateKey = privateKey;
77
+ this._wallet = wallet;
78
+
79
+ // don't create a new date object with nearly identical values to the existing one
80
+ let _now: null | Date = null;
81
+ const now = function () {
82
+ if (!_now) {
83
+ _now = new Date();
84
+ }
85
+ return _now;
86
+ };
87
+ this._dateCreated = dateCreated ?? now();
88
+ this._dateUpdated = dateUpdated ?? now();
89
+ this._creatorId = creatorId ?? this._id;
90
+ }
91
+
92
+ // Required getters
93
+ public get id(): GuidV4 {
94
+ return this._id;
95
+ }
96
+ public get type(): MemberType {
97
+ return this._type;
98
+ }
99
+ public get name(): string {
100
+ return this._name;
101
+ }
102
+ public get email(): EmailString {
103
+ return this._email;
104
+ }
105
+ public get publicKey(): Uint8Array {
106
+ return this._publicKey;
107
+ }
108
+ public get creatorId(): GuidV4 {
109
+ return this._creatorId;
110
+ }
111
+ public get dateCreated(): Date {
112
+ return this._dateCreated;
113
+ }
114
+ public get dateUpdated(): Date {
115
+ return this._dateUpdated;
116
+ }
117
+
118
+ // Optional private data getters
119
+ public get privateKey(): SecureBuffer | undefined {
120
+ return this._privateKey;
121
+ }
122
+ public get wallet(): Wallet {
123
+ if (!this._wallet) {
124
+ throw new MemberError(
125
+ MemberErrorType.NoWallet,
126
+ getEciesI18nEngine() as any,
127
+ );
128
+ }
129
+ return this._wallet;
130
+ }
131
+
132
+ // State getters
133
+ public get hasPrivateKey(): boolean {
134
+ return this._privateKey !== undefined;
135
+ }
136
+
137
+ public unloadPrivateKey(): void {
138
+ // Do not dispose here; tests expect the same SecureBuffer instance to remain usable
139
+ // when reloaded into another member in the same process.
140
+ this._privateKey = undefined;
141
+ }
142
+
143
+ public unloadWallet(): void {
144
+ this._wallet = undefined;
145
+ }
146
+
147
+ public unloadWalletAndPrivateKey(): void {
148
+ this.unloadWallet();
149
+ this.unloadPrivateKey();
150
+ }
151
+
152
+ public loadWallet(mnemonic: SecureString, eciesParams?: IECIESConstants): void {
153
+ if (this._wallet) {
154
+ throw new MemberError(
155
+ MemberErrorType.WalletAlreadyLoaded,
156
+ getEciesI18nEngine() as any,
157
+ );
158
+ }
159
+ const eciesConsts = eciesParams ?? ECIES;
160
+ const { wallet } = this._eciesService.walletAndSeedFromMnemonic(mnemonic);
161
+ const privateKey = wallet.getPrivateKey();
162
+ const publicKey = wallet.getPublicKey();
163
+ const publicKeyWithPrefix = new Uint8Array(publicKey.length + 1);
164
+ publicKeyWithPrefix[0] = eciesConsts.PUBLIC_KEY_MAGIC;
165
+ publicKeyWithPrefix.set(publicKey, 1);
166
+
167
+ if (
168
+ uint8ArrayToHex(publicKeyWithPrefix) !== uint8ArrayToHex(this._publicKey)
169
+ ) {
170
+ throw new MemberError(
171
+ MemberErrorType.InvalidMnemonic,
172
+ getEciesI18nEngine() as any,
173
+ );
174
+ }
175
+ this._wallet = wallet;
176
+ this._privateKey?.dispose();
177
+ this._privateKey = new SecureBuffer(privateKey);
178
+ }
179
+
180
+ /**
181
+ * Loads the private key and optionally the voting private key.
182
+ *
183
+ * @param privateKey The private key to load.
184
+ * @param votingPrivateKey The voting private key to load.
185
+ */
186
+ public loadPrivateKey(privateKey: SecureBuffer): void {
187
+ this._privateKey = privateKey;
188
+ }
189
+
190
+ public sign(data: Uint8Array): SignatureUint8Array {
191
+ if (!this._privateKey) {
192
+ throw new MemberError(
193
+ MemberErrorType.MissingPrivateKey,
194
+ getEciesI18nEngine() as any,
195
+ );
196
+ }
197
+ return this._eciesService.signMessage(this._privateKey.value, data);
198
+ }
199
+
200
+ public signData(data: Uint8Array): SignatureUint8Array {
201
+ if (!this._privateKey) {
202
+ throw new MemberError(
203
+ MemberErrorType.MissingPrivateKey,
204
+ getEciesI18nEngine() as any,
205
+ );
206
+ }
207
+ return this._eciesService.signMessage(
208
+ new Uint8Array(this._privateKey.value),
209
+ data,
210
+ );
211
+ }
212
+
213
+ public verify(signature: SignatureUint8Array, data: Uint8Array): boolean {
214
+ return this._eciesService.verifyMessage(this._publicKey, data, signature);
215
+ }
216
+
217
+ public verifySignature(
218
+ data: Uint8Array,
219
+ signature: Uint8Array,
220
+ publicKey: Uint8Array,
221
+ ): boolean {
222
+ return this._eciesService.verifyMessage(
223
+ publicKey,
224
+ data,
225
+ signature as SignatureUint8Array,
226
+ );
227
+ }
228
+
229
+ private static readonly MAX_ENCRYPTION_SIZE = 1024 * 1024 * 10; // 10MB limit
230
+ private static readonly VALID_STRING_REGEX = /^[\x20-\x7E\n\r\t]*$/; // Printable ASCII + common whitespace
231
+
232
+ public async encryptData(
233
+ data: string | Uint8Array,
234
+ recipientPublicKey?: Uint8Array,
235
+ ): Promise<Uint8Array> {
236
+ // Validate input
237
+ if (!data) {
238
+ throw new MemberError(
239
+ MemberErrorType.MissingEncryptionData,
240
+ getEciesI18nEngine() as any,
241
+ );
242
+ }
243
+
244
+ // Check size limit
245
+ const arr: Uint8Array =
246
+ data instanceof Uint8Array ? data : new TextEncoder().encode(data);
247
+ if (arr.length > Member.MAX_ENCRYPTION_SIZE) {
248
+ throw new MemberError(
249
+ MemberErrorType.EncryptionDataTooLarge,
250
+ getEciesI18nEngine() as any,
251
+ );
252
+ }
253
+
254
+ // Use recipient public key or self public key
255
+ const targetPublicKey = recipientPublicKey || this._publicKey;
256
+
257
+ return await this._eciesService.encryptSimpleOrSingle(
258
+ false,
259
+ targetPublicKey,
260
+ arr,
261
+ );
262
+ }
263
+
264
+ public async decryptData(encryptedData: Uint8Array): Promise<Uint8Array> {
265
+ if (!this._privateKey) {
266
+ throw new MemberError(
267
+ MemberErrorType.MissingPrivateKey,
268
+ getEciesI18nEngine() as any,
269
+ );
270
+ }
271
+ // decryptSingleWithHeader now returns the Uint8Array directly
272
+ return await this._eciesService.decryptSimpleOrSingleWithHeader(
273
+ false,
274
+ new Uint8Array(this._privateKey.value),
275
+ encryptedData,
276
+ );
277
+ }
278
+
279
+ public toJson(): string {
280
+ const storage: IMemberStorageData = {
281
+ id: this._id.toString(),
282
+ type: this._type,
283
+ name: this._name,
284
+ email: this._email.toString(),
285
+ publicKey: uint8ArrayToBase64(this._publicKey),
286
+ creatorId: this._creatorId.toString(),
287
+ dateCreated: this._dateCreated.toISOString(),
288
+ dateUpdated: this._dateUpdated.toISOString(),
289
+ };
290
+ return JSON.stringify(storage);
291
+ }
292
+
293
+ public dispose(): void {
294
+ // Ensure secret material is zeroized when disposing
295
+ try {
296
+ this._privateKey?.dispose();
297
+ } finally {
298
+ this.unloadWalletAndPrivateKey();
299
+ }
300
+ }
301
+
302
+ public static fromJson(
303
+ json: string,
304
+ // Add injected services as parameters
305
+ eciesService: ECIESService,
306
+ ): Member {
307
+ let storage: IMemberStorageData;
308
+ try {
309
+ storage = JSON.parse(json);
310
+ } catch (error) {
311
+ throw new MemberError(
312
+ MemberErrorType.InvalidMemberData,
313
+ getEciesI18nEngine() as any,
314
+ );
315
+ }
316
+ const email = new EmailString(storage.email);
317
+
318
+ // Pass injected services to constructor
319
+ const dateCreated = new Date(storage.dateCreated);
320
+ return new Member(
321
+ eciesService,
322
+ storage.type,
323
+ storage.name,
324
+ email,
325
+ base64ToUint8Array(storage.publicKey),
326
+ undefined,
327
+ undefined,
328
+ new GuidV4(storage.id),
329
+ dateCreated,
330
+ new Date(storage.dateUpdated),
331
+ new GuidV4(storage.creatorId),
332
+ );
333
+ }
334
+
335
+ public static fromMnemonic(
336
+ mnemonic: SecureString,
337
+ eciesService: ECIESService,
338
+ eciesParams?: IECIESConstants,
339
+ ): Member {
340
+ const eciesConsts = eciesParams ?? ECIES;
341
+ const { wallet } = eciesService.walletAndSeedFromMnemonic(mnemonic);
342
+ const privateKey = wallet.getPrivateKey();
343
+ const publicKey = wallet.getPublicKey();
344
+ const publicKeyWithPrefix = new Uint8Array(publicKey.length + 1);
345
+ publicKeyWithPrefix[0] = eciesConsts.PUBLIC_KEY_MAGIC;
346
+ publicKeyWithPrefix.set(publicKey, 1);
347
+
348
+ return new Member(
349
+ eciesService,
350
+ MemberType.User,
351
+ 'Test User',
352
+ new EmailString('test@example.com'),
353
+ publicKeyWithPrefix,
354
+ new SecureBuffer(privateKey),
355
+ wallet,
356
+ );
357
+ }
358
+
359
+ public static newMember(
360
+ // Add injected services as parameters
361
+ eciesService: ECIESService,
362
+ // Original parameters
363
+ type: MemberType,
364
+ name: string,
365
+ email: EmailString,
366
+ forceMnemonic?: SecureString,
367
+ createdBy?: GuidV4,
368
+ eciesParams?: IECIESConstants,
369
+ ): IMemberWithMnemonic {
370
+ // Validate inputs first
371
+ if (!name || name.length == 0) {
372
+ throw new MemberError(
373
+ MemberErrorType.MissingMemberName,
374
+ getEciesI18nEngine() as any,
375
+ );
376
+ }
377
+ if (name.trim() != name) {
378
+ throw new MemberError(
379
+ MemberErrorType.InvalidMemberNameWhitespace,
380
+ getEciesI18nEngine() as any,
381
+ );
382
+ }
383
+ if (!email || email.toString().length == 0) {
384
+ throw new MemberError(
385
+ MemberErrorType.MissingEmail,
386
+ getEciesI18nEngine() as any,
387
+ );
388
+ }
389
+ if (email.toString().trim() != email.toString()) {
390
+ throw new MemberError(
391
+ MemberErrorType.InvalidEmailWhitespace,
392
+ getEciesI18nEngine() as any,
393
+ );
394
+ }
395
+
396
+ const eciesConsts = eciesParams ?? ECIES;
397
+ // Use injected services
398
+ const mnemonic = forceMnemonic ?? eciesService.generateNewMnemonic();
399
+ const { wallet } = eciesService.walletAndSeedFromMnemonic(mnemonic);
400
+
401
+ // Get private key from wallet
402
+ const privateKey = wallet.getPrivateKey();
403
+ // Get public key with 0x04 prefix
404
+ const publicKey = wallet.getPublicKey();
405
+ const publicKeyWithPrefix = new Uint8Array(publicKey.length + 1);
406
+ publicKeyWithPrefix[0] = eciesConsts.PUBLIC_KEY_MAGIC;
407
+ publicKeyWithPrefix.set(publicKey, 1);
408
+
409
+ const newId = GuidV4.new();
410
+ const dateCreated = new Date();
411
+ return {
412
+ // Pass injected services to constructor
413
+ member: new Member(
414
+ eciesService,
415
+ type,
416
+ name,
417
+ email,
418
+ publicKeyWithPrefix,
419
+ new SecureBuffer(privateKey),
420
+ wallet,
421
+ newId,
422
+ dateCreated,
423
+ dateCreated,
424
+ createdBy ?? newId,
425
+ ),
426
+ mnemonic,
427
+ };
428
+ }
429
+ }
@@ -1,6 +1,6 @@
1
1
  import { Pbkdf2ProfileEnum } from './enumerations/pbkdf2-profile';
2
2
  import { IPbkdf2Config } from './interfaces/pbkdf2-config';
3
+
3
4
  export type Pbkdf2Profiles = {
4
- [key in Pbkdf2ProfileEnum]: IPbkdf2Config;
5
+ [key in Pbkdf2ProfileEnum]: IPbkdf2Config;
5
6
  };
6
- //# sourceMappingURL=pbkdf2-profiles.d.ts.map
@@ -0,0 +1,18 @@
1
+ import { EciesStringKey } from './enumerations';
2
+ import { EciesComponentId, getEciesI18nEngine } from './i18n-setup';
3
+ import { PhoneNumberRegex } from './regexes';
4
+
5
+ export class PhoneNumber {
6
+ private readonly _number: string;
7
+ constructor(number: string) {
8
+ // make sure the phone number fits the regex
9
+ if (!PhoneNumberRegex.test(number)) {
10
+ const engine = getEciesI18nEngine();
11
+ throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_PhoneNumber_InvalidTemplate, { phoneNumber: number }));
12
+ }
13
+ this._number = number;
14
+ }
15
+ public get number(): string {
16
+ return this._number;
17
+ }
18
+ }
package/src/regexes.ts ADDED
@@ -0,0 +1,10 @@
1
+ export const PASSWORD_REGEX =
2
+ /^(?=.*[A-Za-z])(?=.*\d)(?=.*[!@#$%^&*()_+\-=[\]{};':"\\|,.<>/?])[A-Za-z\d!@#$%^&*()_+\-=[\]{};':"\\|,.<>/?]{8,}$/;
3
+
4
+ export const MNEMONIC_REGEX =
5
+ /^(?:\w+\s){11}\w+$|^(?:\w+\s){14}\w+$|^(?:\w+\s){17}\w+$|^(?:\w+\s){20}\w+$|^(?:\w+\s){23}\w+$/i;
6
+
7
+ /**
8
+ * Phone number regex to validate phone numbers
9
+ */
10
+ export const PhoneNumberRegex = /^(\+\d{1,3}[- ]?)?\d{10}$/; // Matches international phone numbers with optional country code
@@ -0,0 +1,183 @@
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
+ * The buffer is encrypted with a key derived from a GUID.
13
+ * The GUID is stored in the clear, but the buffer is encrypted with a key derived from the GUID.
14
+ * This allows the buffer to be decrypted, but only if the GUID and salt are known.
15
+ */
16
+ export class SecureBuffer {
17
+ private _disposed: boolean = false;
18
+ private readonly _id: GuidV4;
19
+ private readonly _length: number;
20
+ private readonly _obfuscatedValue: Uint8Array;
21
+ private readonly _key: Uint8Array;
22
+ private readonly _obfuscatedChecksum: Uint8Array;
23
+ private _disposedAt?: string;
24
+ constructor(data?: Uint8Array) {
25
+ this._id = GuidV4.new();
26
+ // don't bother encrypting an empty buffer
27
+ if (data === undefined || data.length === 0) {
28
+ this._length = 0;
29
+ this._obfuscatedValue = new Uint8Array(0);
30
+ this._key = new Uint8Array(0);
31
+ this._obfuscatedChecksum = new Uint8Array(0);
32
+ return;
33
+ }
34
+ this._length = data.length;
35
+ this._key = this.idUint8Array;
36
+ this._obfuscatedValue = this.obfuscateData(data);
37
+ // Create a simple checksum without crypto for synchronous operation
38
+ this._obfuscatedChecksum = this.createSimpleObfuscatedChecksum(data);
39
+ }
40
+ public dispose(): void {
41
+ const err = new DisposedError();
42
+ if (typeof (Error as any).captureStackTrace === 'function') {
43
+ (Error as any).captureStackTrace(err, this.dispose);
44
+ }
45
+ this._disposedAt = err.stack ?? 'stack unavailable';
46
+ this._obfuscatedValue.fill(0);
47
+ this._key.fill(0);
48
+ this._obfuscatedChecksum.fill(0);
49
+ this._disposed = true;
50
+ }
51
+ private assertNotDisposed(): void {
52
+ if (this._disposed) {
53
+ const e = new DisposedError();
54
+ try {
55
+ (e as any).disposedAt = this._disposedAt;
56
+ } catch {
57
+ // ignore if Error object is sealed/frozen
58
+ }
59
+ throw e;
60
+ }
61
+ }
62
+ public static fromString(data: string): SecureBuffer {
63
+ return new SecureBuffer(new TextEncoder().encode(data));
64
+ }
65
+ public get disposedAtStack(): string | undefined {
66
+ return this._disposedAt;
67
+ }
68
+ public get id(): FullHexGuid {
69
+ this.assertNotDisposed();
70
+ return this._id.asFullHexGuid;
71
+ }
72
+ public get idUint8Array(): RawGuidUint8Array {
73
+ this.assertNotDisposed();
74
+ return this._id.asRawGuidUint8Array;
75
+ }
76
+ public get originalLength(): number {
77
+ this.assertNotDisposed();
78
+ return this._length;
79
+ }
80
+ public get value(): Uint8Array {
81
+ this.assertNotDisposed();
82
+ if (this._length === 0) {
83
+ return new Uint8Array(0);
84
+ }
85
+ try {
86
+ const deobfuscatedResult = this.deobfuscateData(this._obfuscatedValue);
87
+ if (deobfuscatedResult.length !== this._length) {
88
+ throw new SecureStorageError(
89
+ SecureStorageErrorType.DecryptedValueLengthMismatch,
90
+ getEciesI18nEngine() as any,
91
+ );
92
+ }
93
+ if (!this.validateObfuscatedChecksum(deobfuscatedResult)) {
94
+ throw new SecureStorageError(
95
+ SecureStorageErrorType.DecryptedValueChecksumMismatch,
96
+ getEciesI18nEngine() as any,
97
+ );
98
+ }
99
+ return deobfuscatedResult;
100
+ } catch (error) {
101
+ // If it's already a SecureStorageError, re-throw it
102
+ if (error instanceof SecureStorageError) {
103
+ throw error;
104
+ }
105
+ // Convert any other error (including AES-GCM authentication errors) to SecureStorageError
106
+ throw new SecureStorageError(
107
+ SecureStorageErrorType.DecryptedValueChecksumMismatch,
108
+ getEciesI18nEngine() as any,
109
+ );
110
+ }
111
+ }
112
+ public get valueAsString(): string {
113
+ this.assertNotDisposed();
114
+ return new TextDecoder().decode(this.value);
115
+ }
116
+ public get valueAsHexString(): string {
117
+ this.assertNotDisposed();
118
+ return uint8ArrayToHex(this.value);
119
+ }
120
+ public get valueAsBase64String(): string {
121
+ this.assertNotDisposed();
122
+ return btoa(String.fromCharCode(...this.value));
123
+ }
124
+ public get checksum(): string {
125
+ this.assertNotDisposed();
126
+ const deobfuscatedChecksum = new TextDecoder().decode(
127
+ this.deobfuscateData(this._obfuscatedChecksum),
128
+ );
129
+ return deobfuscatedChecksum;
130
+ }
131
+ private generateSimpleChecksum(data: string | Uint8Array): string {
132
+ const dataBytes =
133
+ typeof data === 'string' ? new TextEncoder().encode(data) : data;
134
+ let hash = 0;
135
+ for (let i = 0; i < dataBytes.length; i++) {
136
+ hash = ((hash << 5) - hash + dataBytes[i]) & 0xffffffff;
137
+ }
138
+ return hash.toString(16);
139
+ }
140
+ private createSimpleObfuscatedChecksum(
141
+ data: string | Uint8Array,
142
+ ): Uint8Array {
143
+ const checksum = this.generateSimpleChecksum(data);
144
+ const result = this.obfuscateData(new TextEncoder().encode(checksum));
145
+ return result;
146
+ }
147
+ private validateSimpleChecksum(
148
+ data: string | Uint8Array,
149
+ checksum: string,
150
+ ): boolean {
151
+ const generatedChecksum = this.generateSimpleChecksum(data);
152
+ const a = new TextEncoder().encode(generatedChecksum);
153
+ const b = new TextEncoder().encode(checksum);
154
+ return this.timingSafeEqual(a, b);
155
+ }
156
+
157
+ private timingSafeEqual(a: Uint8Array, b: Uint8Array): boolean {
158
+ if (a.length !== b.length) {
159
+ return false;
160
+ }
161
+ let result = 0;
162
+ for (let i = 0; i < a.length; i++) {
163
+ result |= a[i] ^ b[i];
164
+ }
165
+ return result === 0;
166
+ }
167
+ private validateObfuscatedChecksum(data: string | Uint8Array): boolean {
168
+ const deobfuscatedChecksum = new TextDecoder().decode(
169
+ this.deobfuscateData(this._obfuscatedChecksum),
170
+ );
171
+ return this.validateSimpleChecksum(data, deobfuscatedChecksum);
172
+ }
173
+ private obfuscateData(data: Uint8Array): Uint8Array {
174
+ return XorService.xor(data, this._key);
175
+ }
176
+ private deobfuscateData(data: Uint8Array): Uint8Array {
177
+ return XorService.xor(data, this._key);
178
+ }
179
+ public get length(): number {
180
+ this.assertNotDisposed();
181
+ return this._length;
182
+ }
183
+ }