@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
@@ -0,0 +1,186 @@
1
+ import { ECIES } from '../../constants';
2
+ import { EciesEncryptionTypeEnum, } from '../../enumerations/ecies-encryption-type';
3
+ import { EciesCryptoCore } from './crypto-core';
4
+ import { EciesSignature } from './signature';
5
+ import { EciesSingleRecipient } from './single-recipient';
6
+ /**
7
+ * Browser-compatible ECIES service that mirrors the server-side functionality
8
+ * Uses Web Crypto API and @scure/@noble libraries for browser compatibility
9
+ */
10
+ export class ECIESService {
11
+ _config;
12
+ cryptoCore;
13
+ signature;
14
+ singleRecipient;
15
+ constructor(config) {
16
+ this._config = {
17
+ curveName: ECIES.CURVE_NAME,
18
+ primaryKeyDerivationPath: ECIES.PRIMARY_KEY_DERIVATION_PATH,
19
+ mnemonicStrength: ECIES.MNEMONIC_STRENGTH,
20
+ symmetricAlgorithm: ECIES.SYMMETRIC.ALGORITHM,
21
+ symmetricKeyBits: ECIES.SYMMETRIC.KEY_BITS,
22
+ symmetricKeyMode: ECIES.SYMMETRIC.MODE,
23
+ ...config,
24
+ };
25
+ // Initialize components
26
+ this.cryptoCore = new EciesCryptoCore(this._config);
27
+ this.signature = new EciesSignature(this.cryptoCore);
28
+ this.singleRecipient = new EciesSingleRecipient(this._config);
29
+ }
30
+ get core() {
31
+ return this.cryptoCore;
32
+ }
33
+ get config() {
34
+ return this._config;
35
+ }
36
+ get curveName() {
37
+ return this._config.curveName;
38
+ }
39
+ // === Key Management Methods ===
40
+ /**
41
+ * Generate a new mnemonic
42
+ */
43
+ generateNewMnemonic() {
44
+ return this.cryptoCore.generateNewMnemonic();
45
+ }
46
+ /**
47
+ * Generate wallet and seed from mnemonic
48
+ */
49
+ walletAndSeedFromMnemonic(mnemonic) {
50
+ return this.cryptoCore.walletAndSeedFromMnemonic(mnemonic);
51
+ }
52
+ /**
53
+ * Create simple key pair from seed
54
+ */
55
+ seedToSimpleKeyPair(seed) {
56
+ return this.cryptoCore.seedToSimpleKeyPair(seed);
57
+ }
58
+ /**
59
+ * Create simple key pair from mnemonic
60
+ */
61
+ mnemonicToSimpleKeyPair(mnemonic) {
62
+ return this.cryptoCore.mnemonicToSimpleKeyPair(mnemonic);
63
+ }
64
+ /**
65
+ * Get public key from private key
66
+ */
67
+ getPublicKey(privateKey) {
68
+ return this.cryptoCore.getPublicKey(privateKey);
69
+ }
70
+ // === Core Encryption/Decryption Methods ===
71
+ /**
72
+ * Encrypt for single recipient (simple or single mode)
73
+ */
74
+ async encryptSimpleOrSingle(encryptSimple, receiverPublicKey, message, preamble = new Uint8Array(0)) {
75
+ return this.singleRecipient.encrypt(encryptSimple, receiverPublicKey, message, preamble);
76
+ }
77
+ /**
78
+ * Parse single encrypted header
79
+ */
80
+ parseSingleEncryptedHeader(encryptionType, data, preambleSize = 0, options) {
81
+ const { header } = this.singleRecipient.parseEncryptedMessage(encryptionType, data, preambleSize, options);
82
+ return header;
83
+ }
84
+ /**
85
+ * Decrypt with header
86
+ */
87
+ async decryptSimpleOrSingleWithHeader(decryptSimple, privateKey, encryptedData, preambleSize = 0, options) {
88
+ return await this.singleRecipient.decryptWithHeader(decryptSimple
89
+ ? EciesEncryptionTypeEnum.Simple
90
+ : EciesEncryptionTypeEnum.Single, privateKey, encryptedData, preambleSize, options);
91
+ }
92
+ /**
93
+ * Extended decrypt with header
94
+ */
95
+ async decryptSimpleOrSingleWithHeaderEx(encryptionType, privateKey, encryptedData, preambleSize = 0, options) {
96
+ return this.singleRecipient.decryptWithHeaderEx(encryptionType, privateKey, encryptedData, preambleSize, options);
97
+ }
98
+ /**
99
+ * Decrypt with individual components
100
+ */
101
+ async decryptSingleWithComponents(privateKey, ephemeralPublicKey, iv, authTag, encrypted) {
102
+ const decrypted = await this.singleRecipient.decryptWithComponents(privateKey, ephemeralPublicKey, iv, authTag, encrypted);
103
+ return { decrypted, ciphertextLength: encrypted.length };
104
+ }
105
+ // === Signature Methods ===
106
+ /**
107
+ * Sign a message
108
+ */
109
+ signMessage(privateKey, data) {
110
+ return this.signature.signMessage(privateKey, data);
111
+ }
112
+ /**
113
+ * Verify a message signature
114
+ */
115
+ verifyMessage(publicKey, data, signature) {
116
+ return this.signature.verifyMessage(publicKey, data, signature);
117
+ }
118
+ /**
119
+ * Convert signature string to buffer
120
+ */
121
+ signatureStringToSignatureUint8Array(signatureString) {
122
+ return this.signature.signatureStringToSignatureUint8Array(signatureString);
123
+ }
124
+ /**
125
+ * Convert signature buffer to string
126
+ */
127
+ signatureUint8ArrayToSignatureString(signatureArray) {
128
+ return this.signature.signatureUint8ArrayToSignatureString(signatureArray);
129
+ }
130
+ // === Utility Methods ===
131
+ /**
132
+ * Compute encrypted length from data length
133
+ */
134
+ computeEncryptedLengthFromDataLength(dataLength, encryptionMode, recipientCount) {
135
+ if (dataLength < 0) {
136
+ throw new Error('Invalid data length');
137
+ }
138
+ switch (encryptionMode) {
139
+ case 'simple':
140
+ return dataLength + ECIES.SIMPLE.FIXED_OVERHEAD_SIZE;
141
+ case 'single':
142
+ return dataLength + ECIES.SINGLE.FIXED_OVERHEAD_SIZE;
143
+ case 'multiple':
144
+ // Basic calculation for multiple recipients
145
+ return (dataLength +
146
+ ECIES.MULTIPLE.FIXED_OVERHEAD_SIZE +
147
+ (recipientCount ?? 1) * ECIES.MULTIPLE.ENCRYPTED_KEY_SIZE);
148
+ default:
149
+ throw new Error('Invalid encryption type');
150
+ }
151
+ }
152
+ /**
153
+ * Compute decrypted length from encrypted data length
154
+ */
155
+ computeDecryptedLengthFromEncryptedDataLength(encryptedDataLength, padding) {
156
+ if (encryptedDataLength < 0) {
157
+ throw new Error('Invalid encrypted data length');
158
+ }
159
+ const overhead = ECIES.SINGLE.FIXED_OVERHEAD_SIZE;
160
+ const actualPadding = padding !== undefined ? padding : 0;
161
+ const decryptedLength = encryptedDataLength - overhead - actualPadding;
162
+ if (decryptedLength < 0) {
163
+ throw new Error('Computed decrypted length is negative');
164
+ }
165
+ return decryptedLength;
166
+ }
167
+ /**
168
+ * Generic encrypt method
169
+ */
170
+ async encrypt(encryptionType, recipients, message, preamble) {
171
+ if ((encryptionType === EciesEncryptionTypeEnum.Simple ||
172
+ EciesEncryptionTypeEnum.Single) &&
173
+ recipients.length === 1) {
174
+ return this.singleRecipient.encrypt(encryptionType === EciesEncryptionTypeEnum.Simple, recipients[0].publicKey, message, preamble);
175
+ }
176
+ else if (encryptionType === EciesEncryptionTypeEnum.Multiple &&
177
+ recipients.length > 1) {
178
+ // TODO: Implement multi-recipient encryption
179
+ throw new Error('Multi-recipient encryption not yet implemented');
180
+ }
181
+ else {
182
+ throw new Error(`Invalid encryption type or number of recipients: ${encryptionType}, ${recipients.length}`);
183
+ }
184
+ }
185
+ }
186
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/services/ecies/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { SignatureString, SignatureUint8Array } from '../../types';
2
+ import { EciesCryptoCore } from './crypto-core';
3
+ /**
4
+ * Browser-compatible ECDSA signature operations
5
+ */
6
+ export declare class EciesSignature {
7
+ private readonly cryptoCore;
8
+ constructor(cryptoCore: EciesCryptoCore);
9
+ /**
10
+ * Sign arbitrary binary data with a secp256k1 private key.
11
+ * Returns 64 bytes: [r(32) | s(32)]
12
+ */
13
+ signMessage(privateKey: Uint8Array, data: Uint8Array): SignatureUint8Array;
14
+ /**
15
+ * Verify signature (64 bytes: [r|s]) over arbitrary binary data against a public key.
16
+ */
17
+ verifyMessage(publicKey: Uint8Array, data: Uint8Array, signature: SignatureUint8Array): boolean;
18
+ /**
19
+ * Convert signature string to signature Uint8Array
20
+ */
21
+ signatureStringToSignatureUint8Array(signatureString: SignatureString): SignatureUint8Array;
22
+ /**
23
+ * Convert signature buffer to signature string
24
+ */
25
+ signatureUint8ArrayToSignatureString(signatureArray: SignatureUint8Array): SignatureString;
26
+ }
27
+ //# sourceMappingURL=signature.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signature.d.ts","sourceRoot":"","sources":["../../../src/services/ecies/signature.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEnE,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;gBAEjC,UAAU,EAAE,eAAe;IAIvC;;;OAGG;IACI,WAAW,CAChB,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,UAAU,GACf,mBAAmB;IAUtB;;OAEG;IACI,aAAa,CAClB,SAAS,EAAE,UAAU,EACrB,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE,mBAAmB,GAC7B,OAAO;IA8BV;;OAEG;IACI,oCAAoC,CACzC,eAAe,EAAE,eAAe,GAC/B,mBAAmB;IAStB;;OAEG;IACI,oCAAoC,CACzC,cAAc,EAAE,mBAAmB,GAClC,eAAe;CAGnB"}
@@ -0,0 +1,72 @@
1
+ import { secp256k1 } from '@noble/curves/secp256k1.js';
2
+ import { sha256 } from '@noble/hashes/sha2.js';
3
+ import { uint8ArrayToHex } from '../../utils';
4
+ /**
5
+ * Browser-compatible ECDSA signature operations
6
+ */
7
+ export class EciesSignature {
8
+ cryptoCore;
9
+ constructor(cryptoCore) {
10
+ this.cryptoCore = cryptoCore;
11
+ }
12
+ /**
13
+ * Sign arbitrary binary data with a secp256k1 private key.
14
+ * Returns 64 bytes: [r(32) | s(32)]
15
+ */
16
+ signMessage(privateKey, data) {
17
+ const hash = sha256(data);
18
+ // Use deterministic signatures (RFC 6979) for consistency
19
+ const signature = secp256k1.sign(hash, privateKey, {
20
+ format: 'compact',
21
+ extraEntropy: false,
22
+ });
23
+ return signature;
24
+ }
25
+ /**
26
+ * Verify signature (64 bytes: [r|s]) over arbitrary binary data against a public key.
27
+ */
28
+ verifyMessage(publicKey, data, signature) {
29
+ try {
30
+ if (!signature || signature.length !== 64)
31
+ return false;
32
+ const hash = sha256(data);
33
+ const normalizedPublicKey = this.cryptoCore.normalizePublicKey(publicKey);
34
+ // Try direct verification first
35
+ try {
36
+ const directResult = secp256k1.verify(signature, hash, normalizedPublicKey);
37
+ if (directResult)
38
+ return true;
39
+ }
40
+ catch {
41
+ // Continue to alternative verification methods
42
+ }
43
+ // If direct verification fails, the signature might be from a different library
44
+ // that uses different nonce generation. Since we can't make @noble/curves
45
+ // verify signatures from ethereumjs-util directly, we'll return false here.
46
+ // The calling code should handle cross-platform verification at a higher level.
47
+ return false;
48
+ }
49
+ catch (err) {
50
+ console.error('Signature verification failed:', err);
51
+ return false;
52
+ }
53
+ }
54
+ /**
55
+ * Convert signature string to signature Uint8Array
56
+ */
57
+ signatureStringToSignatureUint8Array(signatureString) {
58
+ const cleanHex = signatureString.replace(/^0x/, '');
59
+ const result = new Uint8Array(cleanHex.length / 2);
60
+ for (let i = 0; i < cleanHex.length; i += 2) {
61
+ result[i / 2] = parseInt(cleanHex.substring(i, i + 2), 16);
62
+ }
63
+ return result;
64
+ }
65
+ /**
66
+ * Convert signature buffer to signature string
67
+ */
68
+ signatureUint8ArrayToSignatureString(signatureArray) {
69
+ return uint8ArrayToHex(signatureArray);
70
+ }
71
+ }
72
+ //# sourceMappingURL=signature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signature.js","sourceRoot":"","sources":["../../../src/services/ecies/signature.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG9C;;GAEG;AACH,MAAM,OAAO,cAAc;IACR,UAAU,CAAkB;IAE7C,YAAY,UAA2B;QACrC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACI,WAAW,CAChB,UAAsB,EACtB,IAAgB;QAEhB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1B,0DAA0D;QAC1D,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE;YACjD,MAAM,EAAE,SAAS;YACjB,YAAY,EAAE,KAAK;SACpB,CAAC,CAAC;QACH,OAAO,SAAgC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACI,aAAa,CAClB,SAAqB,EACrB,IAAgB,EAChB,SAA8B;QAE9B,IAAI,CAAC;YACH,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,EAAE;gBAAE,OAAO,KAAK,CAAC;YACxD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;YAC1B,MAAM,mBAAmB,GAAG,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;YAE1E,gCAAgC;YAChC,IAAI,CAAC;gBACH,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,CACnC,SAAS,EACT,IAAI,EACJ,mBAAmB,CACpB,CAAC;gBACF,IAAI,YAAY;oBAAE,OAAO,IAAI,CAAC;YAChC,CAAC;YAAC,MAAM,CAAC;gBACP,+CAA+C;YACjD,CAAC;YAED,gFAAgF;YAChF,0EAA0E;YAC1E,4EAA4E;YAC5E,gFAAgF;YAEhF,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAC;YACrD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACI,oCAAoC,CACzC,eAAgC;QAEhC,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5C,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,MAA6B,CAAC;IACvC,CAAC;IAED;;OAEG;IACI,oCAAoC,CACzC,cAAmC;QAEnC,OAAO,eAAe,CAAC,cAAc,CAAoB,CAAC;IAC5D,CAAC;CACF"}
@@ -0,0 +1,43 @@
1
+ import { EciesEncryptionTypeEnum } from '../../enumerations/ecies-encryption-type';
2
+ import { IECIESConfig } from '../../interfaces/ecies-config';
3
+ import { IDecryptionResult, ISingleEncryptedParsedHeader } from './interfaces';
4
+ /**
5
+ * Browser-compatible single recipient ECIES encryption/decryption
6
+ */
7
+ export declare class EciesSingleRecipient {
8
+ private readonly cryptoCore;
9
+ private readonly config;
10
+ constructor(config: IECIESConfig);
11
+ /**
12
+ * Encrypt a message for a single recipient
13
+ */
14
+ encrypt(encryptSimple: boolean, receiverPublicKey: Uint8Array, message: Uint8Array, preamble?: Uint8Array): Promise<Uint8Array>;
15
+ /**
16
+ * Parse encrypted message header
17
+ */
18
+ parseEncryptedMessage(encryptionType: EciesEncryptionTypeEnum | undefined, data: Uint8Array, preambleSize?: number, options?: {
19
+ dataLength?: number;
20
+ }): {
21
+ header: ISingleEncryptedParsedHeader;
22
+ data: Uint8Array;
23
+ remainder: Uint8Array;
24
+ };
25
+ /**
26
+ * Decrypt with header
27
+ */
28
+ decryptWithHeader(encryptionType: EciesEncryptionTypeEnum | undefined, privateKey: Uint8Array, encryptedData: Uint8Array, preambleSize?: number, options?: {
29
+ dataLength?: number;
30
+ }): Promise<Uint8Array>;
31
+ /**
32
+ * Extended decrypt with header that returns additional info
33
+ */
34
+ decryptWithHeaderEx(encryptionType: EciesEncryptionTypeEnum | undefined, privateKey: Uint8Array, encryptedData: Uint8Array, preambleSize?: number, options?: {
35
+ dataLength?: number;
36
+ }): Promise<IDecryptionResult>;
37
+ /**
38
+ * Decrypt with individual components
39
+ */
40
+ decryptWithComponents(privateKey: Uint8Array, ephemeralPublicKey: Uint8Array, iv: Uint8Array, authTag: Uint8Array, encrypted: Uint8Array): Promise<Uint8Array>;
41
+ private arraysEqual;
42
+ }
43
+ //# sourceMappingURL=single-recipient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"single-recipient.d.ts","sourceRoot":"","sources":["../../../src/services/ecies/single-recipient.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,uBAAuB,EACxB,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAI7D,OAAO,EAAE,iBAAiB,EAAE,4BAA4B,EAAE,MAAM,cAAc,CAAC;AAE/E;;GAEG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;gBAE1B,MAAM,EAAE,YAAY;IAKhC;;OAEG;IACU,OAAO,CAClB,aAAa,EAAE,OAAO,EACtB,iBAAiB,EAAE,UAAU,EAC7B,OAAO,EAAE,UAAU,EACnB,QAAQ,GAAE,UAA8B,GACvC,OAAO,CAAC,UAAU,CAAC;IA+EtB;;OAEG;IACI,qBAAqB,CAC1B,cAAc,EAAE,uBAAuB,GAAG,SAAS,EACnD,IAAI,EAAE,UAAU,EAChB,YAAY,GAAE,MAAU,EACxB,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAChC;QACD,MAAM,EAAE,4BAA4B,CAAC;QACrC,IAAI,EAAE,UAAU,CAAC;QACjB,SAAS,EAAE,UAAU,CAAC;KACvB;IAsHD;;OAEG;IACU,iBAAiB,CAC5B,cAAc,EAAE,uBAAuB,GAAG,SAAS,EACnD,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,UAAU,EACzB,YAAY,GAAE,MAAU,EACxB,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAChC,OAAO,CAAC,UAAU,CAAC;IAWtB;;OAEG;IACU,mBAAmB,CAC9B,cAAc,EAAE,uBAAuB,GAAG,SAAS,EACnD,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,UAAU,EACzB,YAAY,GAAE,MAAU,EACxB,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAChC,OAAO,CAAC,iBAAiB,CAAC;IAsB7B;;OAEG;IACU,qBAAqB,CAChC,UAAU,EAAE,UAAU,EACtB,kBAAkB,EAAE,UAAU,EAC9B,EAAE,EAAE,UAAU,EACd,OAAO,EAAE,UAAU,EACnB,SAAS,EAAE,UAAU,GACpB,OAAO,CAAC,UAAU,CAAC;IAwBtB,OAAO,CAAC,WAAW;CAOpB"}
@@ -0,0 +1,196 @@
1
+ import { ECIES } from '../../constants';
2
+ import { EciesEncryptionTypeEnum, } from '../../enumerations/ecies-encryption-type';
3
+ import { AESGCMService } from '../aes-gcm';
4
+ import { EciesCryptoCore } from './crypto-core';
5
+ /**
6
+ * Browser-compatible single recipient ECIES encryption/decryption
7
+ */
8
+ export class EciesSingleRecipient {
9
+ cryptoCore;
10
+ config;
11
+ constructor(config) {
12
+ this.config = config;
13
+ this.cryptoCore = new EciesCryptoCore(config);
14
+ }
15
+ /**
16
+ * Encrypt a message for a single recipient
17
+ */
18
+ async encrypt(encryptSimple, receiverPublicKey, message, preamble = new Uint8Array(0)) {
19
+ const encryptionType = encryptSimple
20
+ ? 'simple'
21
+ : 'single';
22
+ const encryptionTypeArray = new Uint8Array([
23
+ encryptionType === 'simple'
24
+ ? ECIES.ENCRYPTION_TYPE.SIMPLE
25
+ : ECIES.ENCRYPTION_TYPE.SINGLE,
26
+ ]);
27
+ if (message.length > ECIES.MAX_RAW_DATA_SIZE) {
28
+ throw new Error(`Message length exceeds maximum allowed size: ${message.length}`);
29
+ }
30
+ // Generate ephemeral key pair
31
+ const ephemeralPrivateKey = this.cryptoCore.generatePrivateKey();
32
+ const ephemeralPublicKey = this.cryptoCore.getPublicKey(ephemeralPrivateKey);
33
+ // Compute shared secret
34
+ const normalizedReceiverPublicKey = this.cryptoCore.normalizePublicKey(receiverPublicKey);
35
+ const sharedSecret = this.cryptoCore.computeSharedSecret(ephemeralPrivateKey, normalizedReceiverPublicKey);
36
+ // Use first 32 bytes as symmetric key
37
+ const symKey = sharedSecret.slice(0, ECIES.SYMMETRIC.KEY_SIZE);
38
+ // Encrypt using AES-GCM
39
+ const encryptResult = await AESGCMService.encrypt(message, symKey, true);
40
+ const { encrypted, iv } = encryptResult;
41
+ const authTag = encryptResult.tag;
42
+ if (!authTag) {
43
+ throw new Error('Authentication tag is required for ECIES encryption');
44
+ }
45
+ // Add length prefix for single mode
46
+ const lengthArray = encryptionType === 'simple' ? new Uint8Array(0) : new Uint8Array(8);
47
+ if (encryptionType === 'single') {
48
+ const view = new DataView(lengthArray.buffer);
49
+ view.setBigUint64(0, BigInt(message.length), false); // big-endian
50
+ }
51
+ // Format: [preamble] | type (1) | ephemeralPublicKey (65) | iv (16) | authTag (16) | length (8) | encryptedData
52
+ const result = new Uint8Array(preamble.length +
53
+ encryptionTypeArray.length +
54
+ ephemeralPublicKey.length +
55
+ iv.length +
56
+ authTag.length +
57
+ lengthArray.length +
58
+ encrypted.length);
59
+ let offset = 0;
60
+ result.set(preamble, offset);
61
+ offset += preamble.length;
62
+ result.set(encryptionTypeArray, offset);
63
+ offset += encryptionTypeArray.length;
64
+ result.set(ephemeralPublicKey, offset);
65
+ offset += ephemeralPublicKey.length;
66
+ result.set(iv, offset);
67
+ offset += iv.length;
68
+ result.set(authTag, offset);
69
+ offset += authTag.length;
70
+ result.set(lengthArray, offset);
71
+ offset += lengthArray.length;
72
+ result.set(encrypted, offset);
73
+ return result;
74
+ }
75
+ /**
76
+ * Parse encrypted message header
77
+ */
78
+ parseEncryptedMessage(encryptionType, data, preambleSize = 0, options) {
79
+ // Read encryption type from first byte after preamble
80
+ const actualEncryptionTypeByte = data[preambleSize];
81
+ let actualEncryptionType;
82
+ switch (actualEncryptionTypeByte) {
83
+ case ECIES.ENCRYPTION_TYPE.SIMPLE:
84
+ actualEncryptionType = EciesEncryptionTypeEnum.Simple;
85
+ break;
86
+ case ECIES.ENCRYPTION_TYPE.SINGLE:
87
+ actualEncryptionType = EciesEncryptionTypeEnum.Single;
88
+ break;
89
+ case ECIES.ENCRYPTION_TYPE.MULTIPLE:
90
+ throw new Error('Multiple encryption type not supported in single recipient mode');
91
+ default:
92
+ throw new Error(`Invalid encryption type: ${actualEncryptionTypeByte}`);
93
+ }
94
+ if (encryptionType !== undefined &&
95
+ actualEncryptionType !== encryptionType) {
96
+ throw new Error(`Encryption type mismatch: expected ${encryptionType}, got ${actualEncryptionType}`);
97
+ }
98
+ const includeLengthAndCrc = actualEncryptionType === EciesEncryptionTypeEnum.Single;
99
+ const requiredSize = includeLengthAndCrc
100
+ ? ECIES.SINGLE.FIXED_OVERHEAD_SIZE
101
+ : ECIES.SIMPLE.FIXED_OVERHEAD_SIZE;
102
+ if (data.length < requiredSize) {
103
+ throw new Error(`Data too short: required ${requiredSize}, got ${data.length}`);
104
+ }
105
+ let offset = preambleSize;
106
+ const preamble = data.slice(0, preambleSize);
107
+ // Skip encryption type byte
108
+ offset += 1;
109
+ // Extract header components
110
+ const ephemeralPublicKey = data.slice(offset, offset + ECIES.PUBLIC_KEY_LENGTH);
111
+ offset += ECIES.PUBLIC_KEY_LENGTH;
112
+ const normalizedKey = this.cryptoCore.normalizePublicKey(ephemeralPublicKey);
113
+ const iv = data.slice(offset, offset + ECIES.IV_SIZE);
114
+ offset += ECIES.IV_SIZE;
115
+ const authTag = data.slice(offset, offset + ECIES.AUTH_TAG_SIZE);
116
+ offset += ECIES.AUTH_TAG_SIZE;
117
+ // Extract length for single mode
118
+ const dataLengthArray = includeLengthAndCrc
119
+ ? data.slice(offset, offset + ECIES.SINGLE.DATA_LENGTH_SIZE)
120
+ : new Uint8Array(0);
121
+ if (includeLengthAndCrc) {
122
+ offset += ECIES.SINGLE.DATA_LENGTH_SIZE;
123
+ }
124
+ const dataLength = includeLengthAndCrc
125
+ ? Number(new DataView(dataLengthArray.buffer, dataLengthArray.byteOffset, dataLengthArray.byteLength).getBigUint64(0, false))
126
+ : options?.dataLength ?? -1;
127
+ if (includeLengthAndCrc &&
128
+ options?.dataLength !== undefined &&
129
+ dataLength !== options.dataLength) {
130
+ throw new Error(`Data length mismatch: expected ${dataLength}, got ${options.dataLength}`);
131
+ }
132
+ // No CRC in Single encryption (AES-GCM provides authentication)
133
+ // For single mode, read all remaining data as encrypted data
134
+ // The dataLength represents the original message length, not encrypted length
135
+ const encryptedData = data.slice(offset);
136
+ const remainder = new Uint8Array(0);
137
+ // No CRC validation needed (AES-GCM provides authentication)
138
+ return {
139
+ header: {
140
+ encryptionType: actualEncryptionType,
141
+ ephemeralPublicKey: normalizedKey,
142
+ iv,
143
+ authTag,
144
+ dataLength,
145
+ headerSize: includeLengthAndCrc
146
+ ? ECIES.SINGLE.FIXED_OVERHEAD_SIZE
147
+ : ECIES.SIMPLE.FIXED_OVERHEAD_SIZE,
148
+ },
149
+ data: encryptedData,
150
+ remainder,
151
+ };
152
+ }
153
+ /**
154
+ * Decrypt with header
155
+ */
156
+ async decryptWithHeader(encryptionType, privateKey, encryptedData, preambleSize = 0, options) {
157
+ const result = await this.decryptWithHeaderEx(encryptionType, privateKey, encryptedData, preambleSize, options);
158
+ return result.decrypted;
159
+ }
160
+ /**
161
+ * Extended decrypt with header that returns additional info
162
+ */
163
+ async decryptWithHeaderEx(encryptionType, privateKey, encryptedData, preambleSize = 0, options) {
164
+ const { data, header } = this.parseEncryptedMessage(encryptionType, encryptedData, preambleSize, options);
165
+ const decrypted = await this.decryptWithComponents(privateKey, header.ephemeralPublicKey, header.iv, header.authTag, data);
166
+ return {
167
+ decrypted,
168
+ consumedBytes: preambleSize + header.headerSize + data.length,
169
+ };
170
+ }
171
+ /**
172
+ * Decrypt with individual components
173
+ */
174
+ async decryptWithComponents(privateKey, ephemeralPublicKey, iv, authTag, encrypted) {
175
+ // Normalize ephemeral public key
176
+ const normalizedEphemeralKey = this.cryptoCore.normalizePublicKey(ephemeralPublicKey);
177
+ // Compute shared secret
178
+ const sharedSecret = this.cryptoCore.computeSharedSecret(privateKey, normalizedEphemeralKey);
179
+ // Use first 32 bytes as symmetric key
180
+ const symKey = sharedSecret.slice(0, ECIES.SYMMETRIC.KEY_SIZE);
181
+ // Combine encrypted data with auth tag for AES-GCM
182
+ const encryptedWithTag = AESGCMService.combineEncryptedDataAndTag(encrypted, authTag);
183
+ // Decrypt
184
+ return await AESGCMService.decrypt(iv, encryptedWithTag, symKey, true);
185
+ }
186
+ arraysEqual(a, b) {
187
+ if (a.length !== b.length)
188
+ return false;
189
+ for (let i = 0; i < a.length; i++) {
190
+ if (a[i] !== b[i])
191
+ return false;
192
+ }
193
+ return true;
194
+ }
195
+ }
196
+ //# sourceMappingURL=single-recipient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"single-recipient.js","sourceRoot":"","sources":["../../../src/services/ecies/single-recipient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export * from './aes-gcm';
2
+ export * from './ecies';
3
+ export * from './password-login';
4
+ export * from './pbkdf2';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from './aes-gcm';
2
+ export * from './ecies';
3
+ export * from './password-login';
4
+ export * from './pbkdf2';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { Wallet } from '@ethereumjs/wallet';
2
+ import { SecureString } from '../secure-string';
3
+ import { ECIESService } from './ecies/service';
4
+ export declare class PasswordLoginService {
5
+ private readonly eciesService;
6
+ static readonly privateKeyStorageKey = "encryptedPrivateKey";
7
+ static readonly saltStorageKey = "passwordLoginSalt";
8
+ static readonly encryptedMnemonicStorageKey = "encryptedMnemonic";
9
+ constructor(eciesService: ECIESService);
10
+ createPasswordLoginBundle(mnemonic: SecureString, password: SecureString): Promise<{
11
+ salt: Uint8Array;
12
+ encryptedPrivateKey: Uint8Array;
13
+ encryptedMnemonic: Uint8Array;
14
+ wallet: Wallet;
15
+ }>;
16
+ /**
17
+ * Set up password login by deriving a key from the password and using it to encrypt
18
+ * @param mnemonic The user's mnemonic
19
+ * @param password The user's password
20
+ */
21
+ setupPasswordLoginLocalStorageBundle(mnemonic: SecureString, password: SecureString): Promise<Wallet>;
22
+ getWalletAndMnemonicFromEncryptedPasswordBundle(salt: Uint8Array, encryptedPrivateKey: Uint8Array, encryptedMnemonic: Uint8Array, password: SecureString): Promise<{
23
+ wallet: Wallet;
24
+ mnemonic: SecureString;
25
+ }>;
26
+ /**
27
+ * Recover wallet and mnemonic from password
28
+ * @param password The user's password
29
+ * @returns The user's wallet and mnemonic
30
+ */
31
+ getWalletAndMnemonicFromLocalStorageBundle(password: SecureString): Promise<{
32
+ wallet: Wallet;
33
+ mnemonic: SecureString;
34
+ }>;
35
+ /**
36
+ *
37
+ * @returns True if password login is set up (i.e. salt and encrypted private key are in local storage)
38
+ */
39
+ static isPasswordLoginSetup(): boolean;
40
+ }
41
+ //# sourceMappingURL=password-login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"password-login.d.ts","sourceRoot":"","sources":["../../src/services/password-login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG5C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGhD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAG/C,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,gBAAuB,oBAAoB,yBAAyB;IACpE,gBAAuB,cAAc,uBAAuB;IAC5D,gBAAuB,2BAA2B,uBAAuB;gBAE7D,YAAY,EAAE,YAAY;IAIzB,yBAAyB,CACpC,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,YAAY,GACrB,OAAO,CAAC;QACT,IAAI,EAAE,UAAU,CAAC;QACjB,mBAAmB,EAAE,UAAU,CAAC;QAChC,iBAAiB,EAAE,UAAU,CAAC;QAC9B,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IAqCF;;;;OAIG;IACU,oCAAoC,CAC/C,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,YAAY,GACrB,OAAO,CAAC,MAAM,CAAC;IAoBL,+CAA+C,CAC1D,IAAI,EAAE,UAAU,EAChB,mBAAmB,EAAE,UAAU,EAC/B,iBAAiB,EAAE,UAAU,EAC7B,QAAQ,EAAE,YAAY,GACrB,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,YAAY,CAAA;KAAE,CAAC;IAqCtD;;;;OAIG;IACU,0CAA0C,CACrD,QAAQ,EAAE,YAAY,GACrB,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,YAAY,CAAA;KAAE,CAAC;IAgCtD;;;OAGG;WACW,oBAAoB,IAAI,OAAO;CAkB9C"}