@digitaldefiance/ecies-lib 1.0.0

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 (267) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +237 -0
  3. package/dist/backup-code-string.d.ts +26 -0
  4. package/dist/backup-code-string.d.ts.map +1 -0
  5. package/dist/backup-code-string.js +69 -0
  6. package/dist/backup-code-string.js.map +1 -0
  7. package/dist/constants.d.ts +22 -0
  8. package/dist/constants.d.ts.map +1 -0
  9. package/dist/constants.js +177 -0
  10. package/dist/constants.js.map +1 -0
  11. package/dist/email-string.d.ts +42 -0
  12. package/dist/email-string.d.ts.map +1 -0
  13. package/dist/email-string.js +67 -0
  14. package/dist/email-string.js.map +1 -0
  15. package/dist/enumerations/ecies-encryption-type.d.ts +15 -0
  16. package/dist/enumerations/ecies-encryption-type.d.ts.map +1 -0
  17. package/dist/enumerations/ecies-encryption-type.js +63 -0
  18. package/dist/enumerations/ecies-encryption-type.js.map +1 -0
  19. package/dist/enumerations/ecies-error-type.d.ts +32 -0
  20. package/dist/enumerations/ecies-error-type.d.ts.map +1 -0
  21. package/dist/enumerations/ecies-error-type.js +33 -0
  22. package/dist/enumerations/ecies-error-type.js.map +1 -0
  23. package/dist/enumerations/guid-brand-type.d.ts +27 -0
  24. package/dist/enumerations/guid-brand-type.d.ts.map +1 -0
  25. package/dist/enumerations/guid-brand-type.js +28 -0
  26. package/dist/enumerations/guid-brand-type.js.map +1 -0
  27. package/dist/enumerations/guid-error-type.d.ts +7 -0
  28. package/dist/enumerations/guid-error-type.d.ts.map +1 -0
  29. package/dist/enumerations/guid-error-type.js +8 -0
  30. package/dist/enumerations/guid-error-type.js.map +1 -0
  31. package/dist/enumerations/index.d.ts +13 -0
  32. package/dist/enumerations/index.d.ts.map +1 -0
  33. package/dist/enumerations/index.js +13 -0
  34. package/dist/enumerations/index.js.map +1 -0
  35. package/dist/enumerations/invalid-email-type.d.ts +6 -0
  36. package/dist/enumerations/invalid-email-type.d.ts.map +1 -0
  37. package/dist/enumerations/invalid-email-type.js +7 -0
  38. package/dist/enumerations/invalid-email-type.js.map +1 -0
  39. package/dist/enumerations/length-encoding-type.d.ts +7 -0
  40. package/dist/enumerations/length-encoding-type.d.ts.map +1 -0
  41. package/dist/enumerations/length-encoding-type.js +8 -0
  42. package/dist/enumerations/length-encoding-type.js.map +1 -0
  43. package/dist/enumerations/length-error-type.d.ts +6 -0
  44. package/dist/enumerations/length-error-type.d.ts.map +1 -0
  45. package/dist/enumerations/length-error-type.js +7 -0
  46. package/dist/enumerations/length-error-type.js.map +1 -0
  47. package/dist/enumerations/member-error-type.d.ts +87 -0
  48. package/dist/enumerations/member-error-type.d.ts.map +1 -0
  49. package/dist/enumerations/member-error-type.js +88 -0
  50. package/dist/enumerations/member-error-type.js.map +1 -0
  51. package/dist/enumerations/member-type.d.ts +16 -0
  52. package/dist/enumerations/member-type.d.ts.map +1 -0
  53. package/dist/enumerations/member-type.js +17 -0
  54. package/dist/enumerations/member-type.js.map +1 -0
  55. package/dist/enumerations/pbkdf2-error-type.d.ts +5 -0
  56. package/dist/enumerations/pbkdf2-error-type.d.ts.map +1 -0
  57. package/dist/enumerations/pbkdf2-error-type.js +6 -0
  58. package/dist/enumerations/pbkdf2-error-type.js.map +1 -0
  59. package/dist/enumerations/pbkdf2-profile.d.ts +5 -0
  60. package/dist/enumerations/pbkdf2-profile.d.ts.map +1 -0
  61. package/dist/enumerations/pbkdf2-profile.js +6 -0
  62. package/dist/enumerations/pbkdf2-profile.js.map +1 -0
  63. package/dist/enumerations/secure-storage-error-type.d.ts +6 -0
  64. package/dist/enumerations/secure-storage-error-type.d.ts.map +1 -0
  65. package/dist/enumerations/secure-storage-error-type.js +7 -0
  66. package/dist/enumerations/secure-storage-error-type.js.map +1 -0
  67. package/dist/errors/disposed.d.ts +4 -0
  68. package/dist/errors/disposed.d.ts.map +1 -0
  69. package/dist/errors/disposed.js +8 -0
  70. package/dist/errors/disposed.js.map +1 -0
  71. package/dist/errors/ecies.d.ts +6 -0
  72. package/dist/errors/ecies.d.ts.map +1 -0
  73. package/dist/errors/ecies.js +8 -0
  74. package/dist/errors/ecies.js.map +1 -0
  75. package/dist/errors/guid.d.ts +14 -0
  76. package/dist/errors/guid.d.ts.map +1 -0
  77. package/dist/errors/guid.js +19 -0
  78. package/dist/errors/guid.js.map +1 -0
  79. package/dist/errors/index.d.ts +9 -0
  80. package/dist/errors/index.d.ts.map +1 -0
  81. package/dist/errors/index.js +9 -0
  82. package/dist/errors/index.js.map +1 -0
  83. package/dist/errors/invalid-backup-code.d.ts +4 -0
  84. package/dist/errors/invalid-backup-code.d.ts.map +1 -0
  85. package/dist/errors/invalid-backup-code.js +7 -0
  86. package/dist/errors/invalid-backup-code.js.map +1 -0
  87. package/dist/errors/invalid-email.d.ts +6 -0
  88. package/dist/errors/invalid-email.d.ts.map +1 -0
  89. package/dist/errors/invalid-email.js +9 -0
  90. package/dist/errors/invalid-email.js.map +1 -0
  91. package/dist/errors/length.d.ts +6 -0
  92. package/dist/errors/length.d.ts.map +1 -0
  93. package/dist/errors/length.js +9 -0
  94. package/dist/errors/length.js.map +1 -0
  95. package/dist/errors/member.d.ts +6 -0
  96. package/dist/errors/member.d.ts.map +1 -0
  97. package/dist/errors/member.js +8 -0
  98. package/dist/errors/member.js.map +1 -0
  99. package/dist/errors/pbkdf2.d.ts +6 -0
  100. package/dist/errors/pbkdf2.d.ts.map +1 -0
  101. package/dist/errors/pbkdf2.js +8 -0
  102. package/dist/errors/pbkdf2.js.map +1 -0
  103. package/dist/errors/secure-storage.d.ts +6 -0
  104. package/dist/errors/secure-storage.d.ts.map +1 -0
  105. package/dist/errors/secure-storage.js +8 -0
  106. package/dist/errors/secure-storage.js.map +1 -0
  107. package/dist/errors/typed.d.ts +5 -0
  108. package/dist/errors/typed.d.ts.map +1 -0
  109. package/dist/errors/typed.js +11 -0
  110. package/dist/errors/typed.js.map +1 -0
  111. package/dist/guid.d.ts +153 -0
  112. package/dist/guid.d.ts.map +1 -0
  113. package/dist/guid.js +604 -0
  114. package/dist/guid.js.map +1 -0
  115. package/dist/index.d.ts +13 -0
  116. package/dist/index.d.ts.map +1 -0
  117. package/dist/index.js +13 -0
  118. package/dist/index.js.map +1 -0
  119. package/dist/interfaces/backup-code-consts.d.ts +16 -0
  120. package/dist/interfaces/backup-code-consts.d.ts.map +1 -0
  121. package/dist/interfaces/backup-code-consts.js +2 -0
  122. package/dist/interfaces/backup-code-consts.js.map +1 -0
  123. package/dist/interfaces/backup-code.d.ts +7 -0
  124. package/dist/interfaces/backup-code.d.ts.map +1 -0
  125. package/dist/interfaces/backup-code.js +2 -0
  126. package/dist/interfaces/backup-code.js.map +1 -0
  127. package/dist/interfaces/constants.d.ts +45 -0
  128. package/dist/interfaces/constants.d.ts.map +1 -0
  129. package/dist/interfaces/constants.js +2 -0
  130. package/dist/interfaces/constants.js.map +1 -0
  131. package/dist/interfaces/ecies-config.d.ts +9 -0
  132. package/dist/interfaces/ecies-config.d.ts.map +1 -0
  133. package/dist/interfaces/ecies-config.js +2 -0
  134. package/dist/interfaces/ecies-config.js.map +1 -0
  135. package/dist/interfaces/ecies-consts.d.ts +58 -0
  136. package/dist/interfaces/ecies-consts.d.ts.map +1 -0
  137. package/dist/interfaces/ecies-consts.js +2 -0
  138. package/dist/interfaces/ecies-consts.js.map +1 -0
  139. package/dist/interfaces/ecies-file-service.d.ts +7 -0
  140. package/dist/interfaces/ecies-file-service.d.ts.map +1 -0
  141. package/dist/interfaces/ecies-file-service.js +2 -0
  142. package/dist/interfaces/ecies-file-service.js.map +1 -0
  143. package/dist/interfaces/guid.d.ts +45 -0
  144. package/dist/interfaces/guid.d.ts.map +1 -0
  145. package/dist/interfaces/guid.js +2 -0
  146. package/dist/interfaces/guid.js.map +1 -0
  147. package/dist/interfaces/index.d.ts +14 -0
  148. package/dist/interfaces/index.d.ts.map +1 -0
  149. package/dist/interfaces/index.js +14 -0
  150. package/dist/interfaces/index.js.map +1 -0
  151. package/dist/interfaces/member-operational.d.ts +39 -0
  152. package/dist/interfaces/member-operational.d.ts.map +1 -0
  153. package/dist/interfaces/member-operational.js +2 -0
  154. package/dist/interfaces/member-operational.js.map +1 -0
  155. package/dist/interfaces/member-storage.d.ts +21 -0
  156. package/dist/interfaces/member-storage.d.ts.map +1 -0
  157. package/dist/interfaces/member-storage.js +2 -0
  158. package/dist/interfaces/member-storage.js.map +1 -0
  159. package/dist/interfaces/member-with-mnemonic.d.ts +7 -0
  160. package/dist/interfaces/member-with-mnemonic.d.ts.map +1 -0
  161. package/dist/interfaces/member-with-mnemonic.js +2 -0
  162. package/dist/interfaces/member-with-mnemonic.js.map +1 -0
  163. package/dist/interfaces/pbkdf2-config.d.ts +7 -0
  164. package/dist/interfaces/pbkdf2-config.d.ts.map +1 -0
  165. package/dist/interfaces/pbkdf2-config.js +2 -0
  166. package/dist/interfaces/pbkdf2-config.js.map +1 -0
  167. package/dist/interfaces/pbkdf2-consts.d.ts +9 -0
  168. package/dist/interfaces/pbkdf2-consts.d.ts.map +1 -0
  169. package/dist/interfaces/pbkdf2-consts.js +2 -0
  170. package/dist/interfaces/pbkdf2-consts.js.map +1 -0
  171. package/dist/interfaces/pbkdf2-result.d.ts +6 -0
  172. package/dist/interfaces/pbkdf2-result.d.ts.map +1 -0
  173. package/dist/interfaces/pbkdf2-result.js +2 -0
  174. package/dist/interfaces/pbkdf2-result.js.map +1 -0
  175. package/dist/member.d.ts +68 -0
  176. package/dist/member.d.ts.map +1 -0
  177. package/dist/member.js +256 -0
  178. package/dist/member.js.map +1 -0
  179. package/dist/pbkdf2-profiles.d.ts +6 -0
  180. package/dist/pbkdf2-profiles.d.ts.map +1 -0
  181. package/dist/pbkdf2-profiles.js +2 -0
  182. package/dist/pbkdf2-profiles.js.map +1 -0
  183. package/dist/secure-buffer.d.ts +38 -0
  184. package/dist/secure-buffer.d.ts.map +1 -0
  185. package/dist/secure-buffer.js +161 -0
  186. package/dist/secure-buffer.js.map +1 -0
  187. package/dist/secure-string.d.ts +39 -0
  188. package/dist/secure-string.d.ts.map +1 -0
  189. package/dist/secure-string.js +188 -0
  190. package/dist/secure-string.js.map +1 -0
  191. package/dist/services/aes-gcm.d.ts +56 -0
  192. package/dist/services/aes-gcm.d.ts.map +1 -0
  193. package/dist/services/aes-gcm.js +101 -0
  194. package/dist/services/aes-gcm.js.map +1 -0
  195. package/dist/services/ecies/crypto-core.d.ts +53 -0
  196. package/dist/services/ecies/crypto-core.d.ts.map +1 -0
  197. package/dist/services/ecies/crypto-core.js +158 -0
  198. package/dist/services/ecies/crypto-core.js.map +1 -0
  199. package/dist/services/ecies/example.d.ts +25 -0
  200. package/dist/services/ecies/example.d.ts.map +1 -0
  201. package/dist/services/ecies/example.js +121 -0
  202. package/dist/services/ecies/example.js.map +1 -0
  203. package/dist/services/ecies/file.d.ts +18 -0
  204. package/dist/services/ecies/file.d.ts.map +1 -0
  205. package/dist/services/ecies/file.js +106 -0
  206. package/dist/services/ecies/file.js.map +1 -0
  207. package/dist/services/ecies/index.d.ts +38 -0
  208. package/dist/services/ecies/index.d.ts.map +1 -0
  209. package/dist/services/ecies/index.js +39 -0
  210. package/dist/services/ecies/index.js.map +1 -0
  211. package/dist/services/ecies/integration.d.ts +59 -0
  212. package/dist/services/ecies/integration.d.ts.map +1 -0
  213. package/dist/services/ecies/integration.js +163 -0
  214. package/dist/services/ecies/integration.js.map +1 -0
  215. package/dist/services/ecies/interfaces.d.ts +51 -0
  216. package/dist/services/ecies/interfaces.d.ts.map +1 -0
  217. package/dist/services/ecies/interfaces.js +5 -0
  218. package/dist/services/ecies/interfaces.js.map +1 -0
  219. package/dist/services/ecies/manual-test.d.ts +29 -0
  220. package/dist/services/ecies/manual-test.d.ts.map +1 -0
  221. package/dist/services/ecies/manual-test.js +163 -0
  222. package/dist/services/ecies/manual-test.js.map +1 -0
  223. package/dist/services/ecies/multi-recipient.d.ts +49 -0
  224. package/dist/services/ecies/multi-recipient.d.ts.map +1 -0
  225. package/dist/services/ecies/multi-recipient.js +222 -0
  226. package/dist/services/ecies/multi-recipient.js.map +1 -0
  227. package/dist/services/ecies/service.d.ts +100 -0
  228. package/dist/services/ecies/service.d.ts.map +1 -0
  229. package/dist/services/ecies/service.js +186 -0
  230. package/dist/services/ecies/service.js.map +1 -0
  231. package/dist/services/ecies/signature.d.ts +27 -0
  232. package/dist/services/ecies/signature.d.ts.map +1 -0
  233. package/dist/services/ecies/signature.js +72 -0
  234. package/dist/services/ecies/signature.js.map +1 -0
  235. package/dist/services/ecies/single-recipient.d.ts +43 -0
  236. package/dist/services/ecies/single-recipient.d.ts.map +1 -0
  237. package/dist/services/ecies/single-recipient.js +196 -0
  238. package/dist/services/ecies/single-recipient.js.map +1 -0
  239. package/dist/services/index.d.ts +5 -0
  240. package/dist/services/index.d.ts.map +1 -0
  241. package/dist/services/index.js +5 -0
  242. package/dist/services/index.js.map +1 -0
  243. package/dist/services/password-login.d.ts +41 -0
  244. package/dist/services/password-login.d.ts.map +1 -0
  245. package/dist/services/password-login.js +96 -0
  246. package/dist/services/password-login.js.map +1 -0
  247. package/dist/services/pbkdf2.d.ts +49 -0
  248. package/dist/services/pbkdf2.d.ts.map +1 -0
  249. package/dist/services/pbkdf2.js +97 -0
  250. package/dist/services/pbkdf2.js.map +1 -0
  251. package/dist/services/xor.d.ts +37 -0
  252. package/dist/services/xor.d.ts.map +1 -0
  253. package/dist/services/xor.js +63 -0
  254. package/dist/services/xor.js.map +1 -0
  255. package/dist/types.d.ts +29 -0
  256. package/dist/types.d.ts.map +1 -0
  257. package/dist/types.js +2 -0
  258. package/dist/types.js.map +1 -0
  259. package/dist/utils.d.ts +62 -0
  260. package/dist/utils.d.ts.map +1 -0
  261. package/dist/utils.js +244 -0
  262. package/dist/utils.js.map +1 -0
  263. package/dist/xor.d.ts +37 -0
  264. package/dist/xor.d.ts.map +1 -0
  265. package/dist/xor.js +63 -0
  266. package/dist/xor.js.map +1 -0
  267. package/package.json +60 -0
package/dist/member.js ADDED
@@ -0,0 +1,256 @@
1
+ import { ECIES } from './constants';
2
+ import { EmailString } from './email-string';
3
+ import MemberErrorType from './enumerations/member-error-type';
4
+ import MemberType from './enumerations/member-type';
5
+ import { MemberError } from './errors/member';
6
+ import { GuidV4 } from './guid';
7
+ import { SecureBuffer } from './secure-buffer';
8
+ import { base64ToUint8Array, uint8ArrayToBase64, uint8ArrayToHex, } from './utils';
9
+ /**
10
+ * A member of Brightchain.
11
+ * In the Owner Free Filesystem (OFF), members are used to:
12
+ * 1. Sign and verify data
13
+ * 2. Encrypt and decrypt data
14
+ * 3. Participate in voting
15
+ * 4. Establish ownership of data
16
+ */
17
+ export class Member {
18
+ _eciesService;
19
+ _id;
20
+ _type;
21
+ _name;
22
+ _email;
23
+ _publicKey;
24
+ _creatorId;
25
+ _dateCreated;
26
+ _dateUpdated;
27
+ _privateKey;
28
+ _wallet;
29
+ constructor(
30
+ // Add injected services as parameters
31
+ eciesService,
32
+ // Original parameters
33
+ type, name, email, publicKey, privateKey, wallet, id, dateCreated, dateUpdated, creatorId) {
34
+ // Assign injected services
35
+ this._eciesService = eciesService;
36
+ // Assign original parameters
37
+ this._type = type;
38
+ this._id = id ?? GuidV4.new();
39
+ this._name = name;
40
+ if (!this._name || this._name.length == 0) {
41
+ throw new MemberError(MemberErrorType.MissingMemberName);
42
+ }
43
+ if (this._name.trim() != this._name) {
44
+ throw new MemberError(MemberErrorType.InvalidMemberNameWhitespace);
45
+ }
46
+ this._email = email;
47
+ this._publicKey = publicKey;
48
+ this._privateKey = privateKey;
49
+ this._wallet = wallet;
50
+ // don't create a new date object with nearly identical values to the existing one
51
+ let _now = null;
52
+ const now = function () {
53
+ if (!_now) {
54
+ _now = new Date();
55
+ }
56
+ return _now;
57
+ };
58
+ this._dateCreated = dateCreated ?? now();
59
+ this._dateUpdated = dateUpdated ?? now();
60
+ this._creatorId = creatorId ?? this._id;
61
+ }
62
+ // Required getters
63
+ get id() {
64
+ return this._id;
65
+ }
66
+ get type() {
67
+ return this._type;
68
+ }
69
+ get name() {
70
+ return this._name;
71
+ }
72
+ get email() {
73
+ return this._email;
74
+ }
75
+ get publicKey() {
76
+ return this._publicKey;
77
+ }
78
+ get creatorId() {
79
+ return this._creatorId;
80
+ }
81
+ get dateCreated() {
82
+ return this._dateCreated;
83
+ }
84
+ get dateUpdated() {
85
+ return this._dateUpdated;
86
+ }
87
+ // Optional private data getters
88
+ get privateKey() {
89
+ return this._privateKey;
90
+ }
91
+ get wallet() {
92
+ if (!this._wallet) {
93
+ throw new MemberError(MemberErrorType.NoWallet);
94
+ }
95
+ return this._wallet;
96
+ }
97
+ // State getters
98
+ get hasPrivateKey() {
99
+ return this._privateKey !== undefined;
100
+ }
101
+ unloadPrivateKey() {
102
+ // Do not dispose here; tests expect the same SecureBuffer instance to remain usable
103
+ // when reloaded into another member in the same process.
104
+ this._privateKey = undefined;
105
+ }
106
+ unloadWallet() {
107
+ this._wallet = undefined;
108
+ }
109
+ unloadWalletAndPrivateKey() {
110
+ this.unloadWallet();
111
+ this.unloadPrivateKey();
112
+ }
113
+ loadWallet(mnemonic) {
114
+ if (this._wallet) {
115
+ throw new MemberError(MemberErrorType.WalletAlreadyLoaded);
116
+ }
117
+ const { wallet } = this._eciesService.walletAndSeedFromMnemonic(mnemonic);
118
+ const privateKey = wallet.getPrivateKey();
119
+ const publicKey = wallet.getPublicKey();
120
+ const publicKeyWithPrefix = new Uint8Array(publicKey.length + 1);
121
+ publicKeyWithPrefix[0] = ECIES.PUBLIC_KEY_MAGIC;
122
+ publicKeyWithPrefix.set(publicKey, 1);
123
+ if (uint8ArrayToHex(publicKeyWithPrefix) !== uint8ArrayToHex(this._publicKey)) {
124
+ throw new MemberError(MemberErrorType.InvalidMnemonic);
125
+ }
126
+ this._wallet = wallet;
127
+ this._privateKey = new SecureBuffer(privateKey);
128
+ }
129
+ /**
130
+ * Loads the private key and optionally the voting private key.
131
+ *
132
+ * @param privateKey The private key to load.
133
+ * @param votingPrivateKey The voting private key to load.
134
+ */
135
+ loadPrivateKey(privateKey) {
136
+ this._privateKey = privateKey;
137
+ }
138
+ sign(data) {
139
+ if (!this._privateKey) {
140
+ throw new MemberError(MemberErrorType.MissingPrivateKey);
141
+ }
142
+ return this._eciesService.signMessage(this._privateKey.value, data);
143
+ }
144
+ signData(data) {
145
+ if (!this._privateKey) {
146
+ throw new MemberError(MemberErrorType.MissingPrivateKey);
147
+ }
148
+ return this._eciesService.signMessage(new Uint8Array(this._privateKey.value), data);
149
+ }
150
+ verify(signature, data) {
151
+ return this._eciesService.verifyMessage(this._publicKey, data, signature);
152
+ }
153
+ verifySignature(data, signature, publicKey) {
154
+ return this._eciesService.verifyMessage(publicKey, data, signature);
155
+ }
156
+ static MAX_ENCRYPTION_SIZE = 1024 * 1024 * 10; // 10MB limit
157
+ static VALID_STRING_REGEX = /^[\x20-\x7E\n\r\t]*$/; // Printable ASCII + common whitespace
158
+ async encryptData(data, recipientPublicKey) {
159
+ // Validate input
160
+ if (!data) {
161
+ throw new MemberError(MemberErrorType.MissingEncryptionData);
162
+ }
163
+ // Check size limit
164
+ const arr = data instanceof Uint8Array ? data : new TextEncoder().encode(data);
165
+ if (arr.length > Member.MAX_ENCRYPTION_SIZE) {
166
+ throw new MemberError(MemberErrorType.EncryptionDataTooLarge);
167
+ }
168
+ // Use recipient public key or self public key
169
+ const targetPublicKey = recipientPublicKey || this._publicKey;
170
+ return await this._eciesService.encryptSimpleOrSingle(false, targetPublicKey, arr);
171
+ }
172
+ async decryptData(encryptedData) {
173
+ if (!this._privateKey) {
174
+ throw new MemberError(MemberErrorType.MissingPrivateKey);
175
+ }
176
+ // decryptSingleWithHeader now returns the Uint8Array directly
177
+ return await this._eciesService.decryptSimpleOrSingleWithHeader(false, new Uint8Array(this._privateKey.value), encryptedData);
178
+ }
179
+ toJson() {
180
+ const storage = {
181
+ id: this._id.toString(),
182
+ type: this._type,
183
+ name: this._name,
184
+ email: this._email.toString(),
185
+ publicKey: uint8ArrayToBase64(this._publicKey),
186
+ creatorId: this._creatorId.toString(),
187
+ dateCreated: this._dateCreated.toISOString(),
188
+ dateUpdated: this._dateUpdated.toISOString(),
189
+ };
190
+ return JSON.stringify(storage);
191
+ }
192
+ dispose() {
193
+ // Ensure secret material is zeroized when disposing
194
+ try {
195
+ this._privateKey?.dispose();
196
+ }
197
+ finally {
198
+ this.unloadWalletAndPrivateKey();
199
+ }
200
+ }
201
+ static fromJson(json,
202
+ // Add injected services as parameters
203
+ eciesService) {
204
+ const storage = JSON.parse(json);
205
+ const email = new EmailString(storage.email);
206
+ // Pass injected services to constructor
207
+ const dateCreated = new Date(storage.dateCreated);
208
+ return new Member(eciesService, storage.type, storage.name, email, base64ToUint8Array(storage.publicKey), undefined, undefined, new GuidV4(storage.id), dateCreated, new Date(storage.dateUpdated), new GuidV4(storage.creatorId));
209
+ }
210
+ static fromMnemonic(mnemonic, eciesService) {
211
+ const { wallet } = eciesService.walletAndSeedFromMnemonic(mnemonic);
212
+ const privateKey = wallet.getPrivateKey();
213
+ const publicKey = wallet.getPublicKey();
214
+ const publicKeyWithPrefix = new Uint8Array(publicKey.length + 1);
215
+ publicKeyWithPrefix[0] = ECIES.PUBLIC_KEY_MAGIC;
216
+ publicKeyWithPrefix.set(publicKey, 1);
217
+ return new Member(eciesService, MemberType.User, 'Test User', new EmailString('test@example.com'), publicKeyWithPrefix, new SecureBuffer(privateKey), wallet);
218
+ }
219
+ static newMember(
220
+ // Add injected services as parameters
221
+ eciesService,
222
+ // Original parameters
223
+ type, name, email, forceMnemonic, createdBy) {
224
+ // Validate inputs first
225
+ if (!name || name.length == 0) {
226
+ throw new MemberError(MemberErrorType.MissingMemberName);
227
+ }
228
+ if (name.trim() != name) {
229
+ throw new MemberError(MemberErrorType.InvalidMemberNameWhitespace);
230
+ }
231
+ if (!email || email.toString().length == 0) {
232
+ throw new MemberError(MemberErrorType.MissingEmail);
233
+ }
234
+ if (email.toString().trim() != email.toString()) {
235
+ throw new MemberError(MemberErrorType.InvalidEmailWhitespace);
236
+ }
237
+ // Use injected services
238
+ const mnemonic = forceMnemonic ?? eciesService.generateNewMnemonic();
239
+ const { wallet } = eciesService.walletAndSeedFromMnemonic(mnemonic);
240
+ // Get private key from wallet
241
+ const privateKey = wallet.getPrivateKey();
242
+ // Get public key with 0x04 prefix
243
+ const publicKey = wallet.getPublicKey();
244
+ const publicKeyWithPrefix = new Uint8Array(publicKey.length + 1);
245
+ publicKeyWithPrefix[0] = ECIES.PUBLIC_KEY_MAGIC;
246
+ publicKeyWithPrefix.set(publicKey, 1);
247
+ const newId = GuidV4.new();
248
+ const dateCreated = new Date();
249
+ return {
250
+ // Pass injected services to constructor
251
+ member: new Member(eciesService, type, name, email, publicKeyWithPrefix, new SecureBuffer(privateKey), wallet, newId, dateCreated, dateCreated, createdBy ?? newId),
252
+ mnemonic,
253
+ };
254
+ }
255
+ }
256
+ //# sourceMappingURL=member.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"member.js","sourceRoot":"","sources":["../src/member.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { Pbkdf2ProfileEnum } from './enumerations/pbkdf2-profile';
2
+ import { IPbkdf2Config } from './interfaces/pbkdf2-config';
3
+ export type Pbkdf2Profiles = {
4
+ [key in Pbkdf2ProfileEnum]: IPbkdf2Config;
5
+ };
6
+ //# sourceMappingURL=pbkdf2-profiles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pbkdf2-profiles.d.ts","sourceRoot":"","sources":["../src/pbkdf2-profiles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE3D,MAAM,MAAM,cAAc,GAAG;KAC1B,GAAG,IAAI,iBAAiB,GAAG,aAAa;CAC1C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=pbkdf2-profiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pbkdf2-profiles.js","sourceRoot":"","sources":["../src/pbkdf2-profiles.ts"],"names":[],"mappings":""}
@@ -0,0 +1,38 @@
1
+ import { FullHexGuid, RawGuidUint8Array } from './types';
2
+ /**
3
+ * A secure string buffer is a buffer whose intent is to prevent the raw password from being stored in memory.
4
+ * The buffer is encrypted with a key derived from a GUID.
5
+ * The GUID is stored in the clear, but the buffer is encrypted with a key derived from the GUID.
6
+ * This allows the buffer to be decrypted, but only if the GUID and salt are known.
7
+ */
8
+ export declare class SecureBuffer {
9
+ private _disposed;
10
+ private readonly _id;
11
+ private readonly _length;
12
+ private readonly _obfuscatedValue;
13
+ private readonly _key;
14
+ private readonly _obfuscatedChecksum;
15
+ private _disposedAt?;
16
+ constructor(data?: Uint8Array);
17
+ dispose(): void;
18
+ private assertNotDisposed;
19
+ static fromString(data: string): SecureBuffer;
20
+ get disposedAtStack(): string | undefined;
21
+ get id(): FullHexGuid;
22
+ get idUint8Array(): RawGuidUint8Array;
23
+ get originalLength(): number;
24
+ get value(): Uint8Array;
25
+ get valueAsString(): string;
26
+ get valueAsHexString(): string;
27
+ get valueAsBase64String(): string;
28
+ get checksum(): string;
29
+ private generateSimpleChecksum;
30
+ private createSimpleObfuscatedChecksum;
31
+ private validateSimpleChecksum;
32
+ private timingSafeEqual;
33
+ private validateObfuscatedChecksum;
34
+ private obfuscateData;
35
+ private deobfuscateData;
36
+ get length(): number;
37
+ }
38
+ //# sourceMappingURL=secure-buffer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secure-buffer.d.ts","sourceRoot":"","sources":["../src/secure-buffer.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAGzD;;;;;GAKG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAa;IAC9C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAa;IACjD,OAAO,CAAC,WAAW,CAAC,CAAS;gBACjB,IAAI,CAAC,EAAE,UAAU;IAgBtB,OAAO,IAAI,IAAI;IAWtB,OAAO,CAAC,iBAAiB;WAUX,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY;IAGpD,IAAW,eAAe,IAAI,MAAM,GAAG,SAAS,CAE/C;IACD,IAAW,EAAE,IAAI,WAAW,CAG3B;IACD,IAAW,YAAY,IAAI,iBAAiB,CAG3C;IACD,IAAW,cAAc,IAAI,MAAM,CAGlC;IACD,IAAW,KAAK,IAAI,UAAU,CA4B7B;IACD,IAAW,aAAa,IAAI,MAAM,CAGjC;IACD,IAAW,gBAAgB,IAAI,MAAM,CAGpC;IACD,IAAW,mBAAmB,IAAI,MAAM,CAGvC;IACD,IAAW,QAAQ,IAAI,MAAM,CAM5B;IACD,OAAO,CAAC,sBAAsB;IAS9B,OAAO,CAAC,8BAA8B;IAOtC,OAAO,CAAC,sBAAsB;IAQ9B,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,0BAA0B;IAMlC,OAAO,CAAC,aAAa;IAGrB,OAAO,CAAC,eAAe;IAGvB,IAAW,MAAM,IAAI,MAAM,CAG1B;CACF"}
@@ -0,0 +1,161 @@
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 { XorService } from './services/xor';
6
+ import { uint8ArrayToHex } from './utils';
7
+ /**
8
+ * A secure string buffer is a buffer whose intent is to prevent the raw password from being stored in memory.
9
+ * The buffer is encrypted with a key derived from a GUID.
10
+ * The GUID is stored in the clear, but the buffer is encrypted with a key derived from the GUID.
11
+ * This allows the buffer to be decrypted, but only if the GUID and salt are known.
12
+ */
13
+ export class SecureBuffer {
14
+ _disposed = false;
15
+ _id;
16
+ _length;
17
+ _obfuscatedValue;
18
+ _key;
19
+ _obfuscatedChecksum;
20
+ _disposedAt;
21
+ constructor(data) {
22
+ this._id = GuidV4.new();
23
+ // don't bother encrypting an empty buffer
24
+ if (data === undefined || data.length === 0) {
25
+ this._length = 0;
26
+ this._obfuscatedValue = new Uint8Array(0);
27
+ this._key = new Uint8Array(0);
28
+ this._obfuscatedChecksum = new Uint8Array(0);
29
+ return;
30
+ }
31
+ this._length = data.length;
32
+ this._key = this.idUint8Array;
33
+ this._obfuscatedValue = this.obfuscateData(data);
34
+ // Create a simple checksum without crypto for synchronous operation
35
+ this._obfuscatedChecksum = this.createSimpleObfuscatedChecksum(data);
36
+ }
37
+ dispose() {
38
+ const err = new DisposedError();
39
+ if (typeof Error.captureStackTrace === 'function') {
40
+ Error.captureStackTrace(err, this.dispose);
41
+ }
42
+ this._disposedAt = err.stack ?? 'stack unavailable';
43
+ this._obfuscatedValue.fill(0);
44
+ this._key.fill(0);
45
+ this._obfuscatedChecksum.fill(0);
46
+ this._disposed = true;
47
+ }
48
+ assertNotDisposed() {
49
+ if (!this._disposed)
50
+ return;
51
+ const e = new DisposedError();
52
+ try {
53
+ e.disposedAt = this._disposedAt;
54
+ }
55
+ catch {
56
+ // ignore if Error object is sealed/frozen
57
+ }
58
+ throw e;
59
+ }
60
+ static fromString(data) {
61
+ return new SecureBuffer(new TextEncoder().encode(data));
62
+ }
63
+ get disposedAtStack() {
64
+ return this._disposedAt;
65
+ }
66
+ get id() {
67
+ this.assertNotDisposed();
68
+ return this._id.asFullHexGuid;
69
+ }
70
+ get idUint8Array() {
71
+ this.assertNotDisposed();
72
+ return this._id.asRawGuidUint8Array;
73
+ }
74
+ get originalLength() {
75
+ this.assertNotDisposed();
76
+ return this._length;
77
+ }
78
+ get value() {
79
+ this.assertNotDisposed();
80
+ if (this._length === 0) {
81
+ return new Uint8Array(0);
82
+ }
83
+ try {
84
+ const deobfuscatedResult = this.deobfuscateData(this._obfuscatedValue);
85
+ if (deobfuscatedResult.length !== this._length) {
86
+ throw new SecureStorageError(SecureStorageErrorType.DecryptedValueLengthMismatch);
87
+ }
88
+ if (!this.validateObfuscatedChecksum(deobfuscatedResult)) {
89
+ throw new SecureStorageError(SecureStorageErrorType.DecryptedValueChecksumMismatch);
90
+ }
91
+ return deobfuscatedResult;
92
+ }
93
+ catch (error) {
94
+ // If it's already a SecureStorageError, re-throw it
95
+ if (error instanceof SecureStorageError) {
96
+ throw error;
97
+ }
98
+ // Convert any other error (including AES-GCM authentication errors) to SecureStorageError
99
+ throw new SecureStorageError(SecureStorageErrorType.DecryptedValueChecksumMismatch);
100
+ }
101
+ }
102
+ get valueAsString() {
103
+ this.assertNotDisposed();
104
+ return new TextDecoder().decode(this.value);
105
+ }
106
+ get valueAsHexString() {
107
+ this.assertNotDisposed();
108
+ return uint8ArrayToHex(this.value);
109
+ }
110
+ get valueAsBase64String() {
111
+ this.assertNotDisposed();
112
+ return btoa(String.fromCharCode(...this.value));
113
+ }
114
+ get checksum() {
115
+ this.assertNotDisposed();
116
+ const deobfuscatedChecksum = new TextDecoder().decode(this.deobfuscateData(this._obfuscatedChecksum));
117
+ return deobfuscatedChecksum;
118
+ }
119
+ generateSimpleChecksum(data) {
120
+ const dataBytes = typeof data === 'string' ? new TextEncoder().encode(data) : data;
121
+ let hash = 0;
122
+ for (let i = 0; i < dataBytes.length; i++) {
123
+ hash = ((hash << 5) - hash + dataBytes[i]) & 0xffffffff;
124
+ }
125
+ return hash.toString(16);
126
+ }
127
+ createSimpleObfuscatedChecksum(data) {
128
+ const checksum = this.generateSimpleChecksum(data);
129
+ const result = this.obfuscateData(new TextEncoder().encode(checksum));
130
+ return result;
131
+ }
132
+ validateSimpleChecksum(data, checksum) {
133
+ const generatedChecksum = this.generateSimpleChecksum(data);
134
+ return generatedChecksum === checksum;
135
+ }
136
+ timingSafeEqual(a, b) {
137
+ if (a.length !== b.length) {
138
+ return false;
139
+ }
140
+ let result = 0;
141
+ for (let i = 0; i < a.length; i++) {
142
+ result |= a[i] ^ b[i];
143
+ }
144
+ return result === 0;
145
+ }
146
+ validateObfuscatedChecksum(data) {
147
+ const deobfuscatedChecksum = new TextDecoder().decode(this.deobfuscateData(this._obfuscatedChecksum));
148
+ return this.validateSimpleChecksum(data, deobfuscatedChecksum);
149
+ }
150
+ obfuscateData(data) {
151
+ return XorService.xor(data, this._key);
152
+ }
153
+ deobfuscateData(data) {
154
+ return XorService.xor(data, this._key);
155
+ }
156
+ get length() {
157
+ this.assertNotDisposed();
158
+ return this._length;
159
+ }
160
+ }
161
+ //# sourceMappingURL=secure-buffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secure-buffer.js","sourceRoot":"","sources":["../src/secure-buffer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import { FullHexGuid, RawGuidUint8Array } from './types';
2
+ /**
3
+ * A secure string buffer is a buffer whose intent is to prevent the raw password from being stored in memory.
4
+ */
5
+ export declare class SecureString {
6
+ private _disposed;
7
+ private readonly _isNull;
8
+ private readonly _id;
9
+ private readonly _length;
10
+ private readonly _obfuscatedValue;
11
+ private readonly _key;
12
+ private readonly _obfuscatedChecksum;
13
+ private _disposedAt?;
14
+ constructor(data?: string | Uint8Array | null);
15
+ private assertNotDisposed;
16
+ dispose(): void;
17
+ get disposedAtStack(): string | undefined;
18
+ get id(): FullHexGuid;
19
+ get idUint8Array(): RawGuidUint8Array;
20
+ get originalLength(): number;
21
+ get valueAsUint8Array(): Uint8Array;
22
+ get value(): string | null;
23
+ get notNullValue(): string;
24
+ get valueAsHexString(): string;
25
+ get valueAsBase64String(): string;
26
+ get hasValue(): boolean;
27
+ get checksum(): string;
28
+ get length(): number;
29
+ private generateChecksum;
30
+ private createSimpleChecksum;
31
+ private createSimpleObfuscatedChecksum;
32
+ private createObfuscatedChecksum;
33
+ private validateChecksum;
34
+ private timingSafeEqual;
35
+ private validateObfuscatedChecksum;
36
+ private obfuscateData;
37
+ private deobfuscateData;
38
+ }
39
+ //# sourceMappingURL=secure-string.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secure-string.d.ts","sourceRoot":"","sources":["../src/secure-string.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAGzD;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAa;IAC9C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAa;IACjD,OAAO,CAAC,WAAW,CAAC,CAAS;gBACjB,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAuB7C,OAAO,CAAC,iBAAiB;IAUlB,OAAO,IAAI,IAAI;IAWtB,IAAW,eAAe,IAAI,MAAM,GAAG,SAAS,CAE/C;IACD,IAAW,EAAE,IAAI,WAAW,CAG3B;IACD,IAAW,YAAY,IAAI,iBAAiB,CAG3C;IACD,IAAW,cAAc,IAAI,MAAM,CAGlC;IACD,IAAW,iBAAiB,IAAI,UAAU,CAoCzC;IACD,IAAW,KAAK,IAAI,MAAM,GAAG,IAAI,CAMhC;IACD,IAAW,YAAY,IAAI,MAAM,CAMhC;IACD,IAAW,gBAAgB,IAAI,MAAM,CAGpC;IACD,IAAW,mBAAmB,IAAI,MAAM,CAGvC;IACD,IAAW,QAAQ,IAAI,OAAO,CAG7B;IACD,IAAW,QAAQ,IAAI,MAAM,CAM5B;IACD,IAAW,MAAM,IAAI,MAAM,CAG1B;YACa,gBAAgB;IAS9B,OAAO,CAAC,oBAAoB;IAQ5B,OAAO,CAAC,8BAA8B;YASxB,wBAAwB;YAOxB,gBAAgB;IAQ9B,OAAO,CAAC,eAAe;YAUT,0BAA0B;IAQxC,OAAO,CAAC,aAAa;IAGrB,OAAO,CAAC,eAAe;CAGxB"}