@digitaldefiance/node-ecies-lib 1.1.22 → 1.1.23

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 (212) hide show
  1. package/README.md +4 -0
  2. package/package.json +6 -5
  3. package/src/constants.d.ts +32 -0
  4. package/src/constants.d.ts.map +1 -0
  5. package/src/constants.js +137 -0
  6. package/src/constants.js.map +1 -0
  7. package/src/enumerations/index.d.ts +2 -0
  8. package/src/enumerations/index.d.ts.map +1 -0
  9. package/src/enumerations/index.js +5 -0
  10. package/src/enumerations/index.js.map +1 -0
  11. package/src/enumerations/pbkdf2-profile.d.ts +9 -0
  12. package/src/enumerations/pbkdf2-profile.d.ts.map +1 -0
  13. package/src/enumerations/pbkdf2-profile.js +13 -0
  14. package/src/enumerations/pbkdf2-profile.js.map +1 -0
  15. package/src/i18n/ecies-i18n-factory.d.ts +54 -0
  16. package/src/i18n/ecies-i18n-factory.d.ts.map +1 -0
  17. package/src/i18n/ecies-i18n-factory.js +333 -0
  18. package/src/i18n/ecies-i18n-factory.js.map +1 -0
  19. package/src/i18n/{index.ts → index.d.ts} +1 -0
  20. package/src/i18n/index.d.ts.map +1 -0
  21. package/src/i18n/index.js +5 -0
  22. package/src/i18n/index.js.map +1 -0
  23. package/src/{index.ts → index.d.ts} +1 -0
  24. package/src/index.d.ts.map +1 -0
  25. package/src/index.js +11 -0
  26. package/src/index.js.map +1 -0
  27. package/src/interfaces/authenticated-cipher.d.ts +10 -0
  28. package/src/interfaces/authenticated-cipher.d.ts.map +1 -0
  29. package/src/interfaces/authenticated-cipher.js +3 -0
  30. package/src/interfaces/authenticated-cipher.js.map +1 -0
  31. package/src/interfaces/authenticated-decipher.d.ts +9 -0
  32. package/src/interfaces/authenticated-decipher.d.ts.map +1 -0
  33. package/src/interfaces/authenticated-decipher.js +3 -0
  34. package/src/interfaces/authenticated-decipher.js.map +1 -0
  35. package/src/interfaces/checksum-config.d.ts +5 -0
  36. package/src/interfaces/checksum-config.d.ts.map +1 -0
  37. package/src/interfaces/checksum-config.js +3 -0
  38. package/src/interfaces/checksum-config.js.map +1 -0
  39. package/src/interfaces/checksum-consts.d.ts +11 -0
  40. package/src/interfaces/checksum-consts.d.ts.map +1 -0
  41. package/src/interfaces/checksum-consts.js +3 -0
  42. package/src/interfaces/checksum-consts.js.map +1 -0
  43. package/src/interfaces/constants.d.ts +43 -0
  44. package/src/interfaces/constants.d.ts.map +1 -0
  45. package/src/interfaces/constants.js +3 -0
  46. package/src/interfaces/constants.js.map +1 -0
  47. package/src/interfaces/ecies-consts.d.ts +88 -0
  48. package/src/interfaces/ecies-consts.d.ts.map +1 -0
  49. package/src/interfaces/ecies-consts.js +3 -0
  50. package/src/interfaces/ecies-consts.js.map +1 -0
  51. package/src/interfaces/encryption-consts.d.ts +11 -0
  52. package/src/interfaces/encryption-consts.d.ts.map +1 -0
  53. package/src/interfaces/encryption-consts.js +3 -0
  54. package/src/interfaces/encryption-consts.js.map +1 -0
  55. package/src/interfaces/{index.ts → index.d.ts} +1 -0
  56. package/src/interfaces/index.d.ts.map +1 -0
  57. package/src/interfaces/index.js +21 -0
  58. package/src/interfaces/index.js.map +1 -0
  59. package/src/interfaces/keypair-buffer-with-un-encrypted-private-key.d.ts +6 -0
  60. package/src/interfaces/keypair-buffer-with-un-encrypted-private-key.d.ts.map +1 -0
  61. package/src/interfaces/keypair-buffer-with-un-encrypted-private-key.js +3 -0
  62. package/src/interfaces/keypair-buffer-with-un-encrypted-private-key.js.map +1 -0
  63. package/src/interfaces/keyring-consts.d.ts +6 -0
  64. package/src/interfaces/keyring-consts.d.ts.map +1 -0
  65. package/src/interfaces/keyring-consts.js +3 -0
  66. package/src/interfaces/keyring-consts.js.map +1 -0
  67. package/src/interfaces/member-operational.d.ts +36 -0
  68. package/src/interfaces/member-operational.d.ts.map +1 -0
  69. package/src/interfaces/member-operational.js +3 -0
  70. package/src/interfaces/member-operational.js.map +1 -0
  71. package/src/interfaces/{member-with-mnemonic.ts → member-with-mnemonic.d.ts} +3 -3
  72. package/src/interfaces/member-with-mnemonic.d.ts.map +1 -0
  73. package/src/interfaces/member-with-mnemonic.js +3 -0
  74. package/src/interfaces/member-with-mnemonic.js.map +1 -0
  75. package/src/interfaces/{multi-encrypted-message.ts → multi-encrypted-message.d.ts} +5 -5
  76. package/src/interfaces/multi-encrypted-message.d.ts.map +1 -0
  77. package/src/interfaces/multi-encrypted-message.js +3 -0
  78. package/src/interfaces/multi-encrypted-message.js.map +1 -0
  79. package/src/interfaces/multi-encrypted-parsed-header.d.ts +24 -0
  80. package/src/interfaces/multi-encrypted-parsed-header.d.ts.map +1 -0
  81. package/src/interfaces/multi-encrypted-parsed-header.js +3 -0
  82. package/src/interfaces/multi-encrypted-parsed-header.js.map +1 -0
  83. package/src/interfaces/{pbkdf-profiles.ts → pbkdf-profiles.d.ts} +2 -2
  84. package/src/interfaces/pbkdf-profiles.d.ts.map +1 -0
  85. package/src/interfaces/pbkdf-profiles.js +3 -0
  86. package/src/interfaces/pbkdf-profiles.js.map +1 -0
  87. package/src/interfaces/pbkdf2-result.d.ts +6 -0
  88. package/src/interfaces/pbkdf2-result.d.ts.map +1 -0
  89. package/src/interfaces/pbkdf2-result.js +3 -0
  90. package/src/interfaces/pbkdf2-result.js.map +1 -0
  91. package/src/interfaces/signing-key-private-key-info.d.ts +11 -0
  92. package/src/interfaces/signing-key-private-key-info.d.ts.map +1 -0
  93. package/src/interfaces/signing-key-private-key-info.js +3 -0
  94. package/src/interfaces/signing-key-private-key-info.js.map +1 -0
  95. package/src/interfaces/{simple-keypair-buffer.ts → simple-keypair-buffer.d.ts} +3 -3
  96. package/src/interfaces/simple-keypair-buffer.d.ts.map +1 -0
  97. package/src/interfaces/simple-keypair-buffer.js +3 -0
  98. package/src/interfaces/simple-keypair-buffer.js.map +1 -0
  99. package/src/interfaces/{simple-keypair.ts → simple-keypair.d.ts} +3 -3
  100. package/src/interfaces/simple-keypair.d.ts.map +1 -0
  101. package/src/interfaces/simple-keypair.js +3 -0
  102. package/src/interfaces/simple-keypair.js.map +1 -0
  103. package/src/interfaces/simple-public-key-only-buffer.d.ts +4 -0
  104. package/src/interfaces/simple-public-key-only-buffer.d.ts.map +1 -0
  105. package/src/interfaces/simple-public-key-only-buffer.js +3 -0
  106. package/src/interfaces/simple-public-key-only-buffer.js.map +1 -0
  107. package/src/interfaces/simple-public-key-only.d.ts +4 -0
  108. package/src/interfaces/simple-public-key-only.d.ts.map +1 -0
  109. package/src/interfaces/simple-public-key-only.js +3 -0
  110. package/src/interfaces/simple-public-key-only.js.map +1 -0
  111. package/src/interfaces/single-encrypted-parsed-header.d.ts +35 -0
  112. package/src/interfaces/single-encrypted-parsed-header.d.ts.map +1 -0
  113. package/src/interfaces/single-encrypted-parsed-header.js +3 -0
  114. package/src/interfaces/single-encrypted-parsed-header.js.map +1 -0
  115. package/src/interfaces/{wallet-seed.ts → wallet-seed.d.ts} +3 -3
  116. package/src/interfaces/wallet-seed.d.ts.map +1 -0
  117. package/src/interfaces/wallet-seed.js +3 -0
  118. package/src/interfaces/wallet-seed.js.map +1 -0
  119. package/src/interfaces/wrapped-key-consts.d.ts +7 -0
  120. package/src/interfaces/wrapped-key-consts.d.ts.map +1 -0
  121. package/src/interfaces/wrapped-key-consts.js +3 -0
  122. package/src/interfaces/wrapped-key-consts.js.map +1 -0
  123. package/src/member.d.ts +74 -0
  124. package/src/member.d.ts.map +1 -0
  125. package/src/member.js +273 -0
  126. package/src/member.js.map +1 -0
  127. package/src/services/aes-gcm.d.ts +66 -0
  128. package/src/services/aes-gcm.d.ts.map +1 -0
  129. package/src/services/aes-gcm.js +115 -0
  130. package/src/services/aes-gcm.js.map +1 -0
  131. package/src/services/ecies/crypto-core.d.ts +83 -0
  132. package/src/services/ecies/crypto-core.d.ts.map +1 -0
  133. package/src/services/ecies/crypto-core.js +166 -0
  134. package/src/services/ecies/crypto-core.js.map +1 -0
  135. package/src/services/ecies/file.d.ts +30 -0
  136. package/src/services/ecies/file.d.ts.map +1 -0
  137. package/src/services/ecies/file.js +112 -0
  138. package/src/services/ecies/file.js.map +1 -0
  139. package/src/services/ecies/{index.ts → index.d.ts} +1 -0
  140. package/src/services/ecies/index.d.ts.map +1 -0
  141. package/src/services/ecies/index.js +11 -0
  142. package/src/services/ecies/index.js.map +1 -0
  143. package/src/services/ecies/multi-recipient.d.ts +82 -0
  144. package/src/services/ecies/multi-recipient.d.ts.map +1 -0
  145. package/src/services/ecies/multi-recipient.js +360 -0
  146. package/src/services/ecies/multi-recipient.js.map +1 -0
  147. package/src/services/ecies/service.d.ts +70 -0
  148. package/src/services/ecies/service.d.ts.map +1 -0
  149. package/src/services/ecies/service.js +167 -0
  150. package/src/services/ecies/service.js.map +1 -0
  151. package/src/services/ecies/signature.d.ts +38 -0
  152. package/src/services/ecies/signature.d.ts.map +1 -0
  153. package/src/services/ecies/signature.js +69 -0
  154. package/src/services/ecies/signature.js.map +1 -0
  155. package/src/services/ecies/single-recipient.d.ts +85 -0
  156. package/src/services/ecies/single-recipient.d.ts.map +1 -0
  157. package/src/services/ecies/single-recipient.js +399 -0
  158. package/src/services/ecies/single-recipient.js.map +1 -0
  159. package/src/services/ecies/utilities.d.ts +22 -0
  160. package/src/services/ecies/utilities.d.ts.map +1 -0
  161. package/src/services/ecies/utilities.js +75 -0
  162. package/src/services/ecies/utilities.js.map +1 -0
  163. package/src/services/index.d.ts +4 -0
  164. package/src/services/index.d.ts.map +1 -0
  165. package/src/services/index.js +7 -0
  166. package/src/services/index.js.map +1 -0
  167. package/src/services/pbkdf2.d.ts +106 -0
  168. package/src/services/pbkdf2.d.ts.map +1 -0
  169. package/src/services/pbkdf2.js +195 -0
  170. package/src/services/pbkdf2.js.map +1 -0
  171. package/src/{types.ts → types.d.ts} +9 -26
  172. package/src/types.d.ts.map +1 -0
  173. package/src/types.js +3 -0
  174. package/src/types.js.map +1 -0
  175. package/src/utils.d.ts +11 -0
  176. package/src/utils.d.ts.map +1 -0
  177. package/src/utils.js +82 -0
  178. package/src/utils.js.map +1 -0
  179. package/LICENSE +0 -21
  180. package/src/constants.ts +0 -182
  181. package/src/enumerations/index.ts +0 -1
  182. package/src/enumerations/pbkdf2-profile.ts +0 -8
  183. package/src/i18n/ecies-i18n-factory.ts +0 -435
  184. package/src/interfaces/authenticated-cipher.ts +0 -9
  185. package/src/interfaces/authenticated-decipher.ts +0 -8
  186. package/src/interfaces/checksum-config.ts +0 -4
  187. package/src/interfaces/checksum-consts.ts +0 -13
  188. package/src/interfaces/constants.ts +0 -43
  189. package/src/interfaces/ecies-consts.ts +0 -99
  190. package/src/interfaces/encryption-consts.ts +0 -10
  191. package/src/interfaces/keypair-buffer-with-un-encrypted-private-key.ts +0 -7
  192. package/src/interfaces/keyring-consts.ts +0 -5
  193. package/src/interfaces/member-operational.ts +0 -52
  194. package/src/interfaces/multi-encrypted-parsed-header.ts +0 -24
  195. package/src/interfaces/pbkdf2-result.ts +0 -5
  196. package/src/interfaces/signing-key-private-key-info.ts +0 -12
  197. package/src/interfaces/simple-public-key-only-buffer.ts +0 -3
  198. package/src/interfaces/simple-public-key-only.ts +0 -3
  199. package/src/interfaces/single-encrypted-parsed-header.ts +0 -35
  200. package/src/interfaces/wrapped-key-consts.ts +0 -6
  201. package/src/member.ts +0 -463
  202. package/src/services/aes-gcm.ts +0 -160
  203. package/src/services/ecies/crypto-core.ts +0 -213
  204. package/src/services/ecies/file.ts +0 -174
  205. package/src/services/ecies/multi-recipient.ts +0 -583
  206. package/src/services/ecies/service.ts +0 -351
  207. package/src/services/ecies/signature.ts +0 -91
  208. package/src/services/ecies/single-recipient.ts +0 -676
  209. package/src/services/ecies/utilities.ts +0 -111
  210. package/src/services/index.ts +0 -3
  211. package/src/services/pbkdf2.ts +0 -307
  212. package/src/utils.ts +0 -104
@@ -1,213 +0,0 @@
1
- import {
2
- ECIESError,
3
- ECIESErrorTypeEnum,
4
- IECIESConfig,
5
- IECIESConstants,
6
- SecureBuffer,
7
- SecureString,
8
- } from '@digitaldefiance/ecies-lib';
9
- import { hdkey, Wallet } from '@ethereumjs/wallet';
10
- import { generateMnemonic, mnemonicToSeedSync, validateMnemonic } from 'bip39';
11
- import { secp256k1 } from 'ethereum-cryptography/secp256k1.js';
12
- import { createEciesTranslationEngine, getEciesPluginI18nEngine, NodeEciesComponentId, NodeEciesStringKey } from '../../i18n/ecies-i18n-factory';
13
- import { ISimpleKeyPairBuffer } from '../../interfaces/simple-keypair-buffer';
14
- import { IWalletSeed } from '../../interfaces/wallet-seed';
15
- import { Constants } from '../../constants';
16
-
17
- /**
18
- * Core encryption and decryption functions for ECIES
19
- * Includes coverage for simple and single modes, does not cover multiple mode which is in a separate module
20
- */
21
- export class EciesCryptoCore {
22
- protected readonly _config: IECIESConfig;
23
- protected readonly _consts: IECIESConstants;
24
- public get config(): IECIESConfig {
25
- return this._config;
26
- }
27
-
28
- public get consts(): IECIESConstants {
29
- return this._consts;
30
- }
31
-
32
- constructor(config: IECIESConfig, eciesParams: IECIESConstants = Constants.ECIES) {
33
- this._config = config;
34
- this._consts = eciesParams;
35
- }
36
-
37
- /**
38
- * Validates and normalizes a public key for ECIES operations
39
- * @param publicKey The public key to normalize
40
- * @returns Properly formatted public key
41
- */
42
- public normalizePublicKey(publicKey: Buffer): Buffer {
43
- if (!publicKey) {
44
- const engine = createEciesTranslationEngine();
45
- const pluginEngine = getEciesPluginI18nEngine();
46
- throw new ECIESError(
47
- ECIESErrorTypeEnum.InvalidEphemeralPublicKey,
48
- engine,
49
- undefined,
50
- undefined,
51
- {
52
- error: pluginEngine.translate(NodeEciesComponentId, NodeEciesStringKey.Error_InvalidPublicKey),
53
- },
54
- );
55
- }
56
-
57
- const keyLength = publicKey.length;
58
-
59
- // Already in correct format (65 bytes with 0x04 prefix)
60
- if (
61
- keyLength === this._consts.PUBLIC_KEY_LENGTH &&
62
- publicKey[0] === this._consts.PUBLIC_KEY_MAGIC
63
- ) {
64
- return publicKey;
65
- }
66
-
67
- // Raw key without prefix (64 bytes) - add the 0x04 prefix
68
- if (keyLength === this._consts.RAW_PUBLIC_KEY_LENGTH) {
69
- return Buffer.concat([Buffer.from([this._consts.PUBLIC_KEY_MAGIC]), publicKey]);
70
- }
71
-
72
- const engine = createEciesTranslationEngine();
73
- const pluginEngine = getEciesPluginI18nEngine();
74
- // Invalid format
75
- throw new ECIESError(
76
- ECIESErrorTypeEnum.InvalidEphemeralPublicKey,
77
- engine,
78
- undefined,
79
- undefined,
80
- {
81
- error: pluginEngine.translate(NodeEciesComponentId, NodeEciesStringKey.Error_InvalidPublicKeyFormat),
82
- keyLength: String(keyLength),
83
- expectedLength64: String(this._consts.RAW_PUBLIC_KEY_LENGTH),
84
- expectedLength65: String(this._consts.PUBLIC_KEY_LENGTH),
85
- keyPrefix: keyLength > 0 ? String(publicKey[0]) : 'N/A',
86
- expectedPrefix: String(this._consts.PUBLIC_KEY_MAGIC),
87
- },
88
- );
89
- }
90
-
91
- /**
92
- * Generate a new mnemonic
93
- * @returns {SecureString} The new mnemonic
94
- */
95
- public generateNewMnemonic(): SecureString {
96
- return new SecureString(generateMnemonic(this._config.mnemonicStrength));
97
- }
98
-
99
- /**
100
- * Generate a new wallet from a seed
101
- * @param seed {Buffer} The seed to generate the wallet from
102
- * @returns {Wallet} The new wallet
103
- */
104
- public walletFromSeed(seed: Buffer): Wallet {
105
- const hdWallet = hdkey.EthereumHDKey.fromMasterSeed(seed);
106
- return hdWallet
107
- .derivePath(this._config.primaryKeyDerivationPath)
108
- .getWallet();
109
- }
110
-
111
- /**
112
- * Generate a new wallet and seed from a mnemonic
113
- * @param mnemonic {SecureString} The mnemonic to generate the wallet and seed from
114
- * @returns {IWalletSeed} The new wallet and seed
115
- */
116
- public walletAndSeedFromMnemonic(mnemonic: SecureString): IWalletSeed {
117
- if (!mnemonic.value || !validateMnemonic(mnemonic.value)) {
118
- throw new ECIESError(
119
- ECIESErrorTypeEnum.InvalidMnemonic,
120
- createEciesTranslationEngine(),
121
- );
122
- }
123
-
124
- const seed = mnemonicToSeedSync(mnemonic.value);
125
- const wallet = this.walletFromSeed(seed);
126
-
127
- return {
128
- seed: new SecureBuffer(seed),
129
- wallet,
130
- };
131
- }
132
-
133
- /**
134
- * Generate a new wallet and seed from a mnemonic
135
- * @param wallet {Wallet} The wallet to generate the key pair from
136
- * @returns {ISimpleKeyPairBuffer} The new key pair
137
- */
138
- public walletToSimpleKeyPairBuffer(wallet: Wallet): ISimpleKeyPairBuffer {
139
- const privateKey = Buffer.from(wallet.getPrivateKey());
140
- const buf04 = new Uint8Array(1);
141
- buf04[0] = this._consts.PUBLIC_KEY_MAGIC;
142
- const publicKey = Buffer.concat([buf04, wallet.getPublicKey()]);
143
-
144
- return {
145
- privateKey,
146
- publicKey,
147
- };
148
- }
149
-
150
- /**
151
- * Create a simple key pair from a seed
152
- * @param seed {Buffer} The seed to generate the key pair from
153
- * @returns {ISimpleKeyPairBuffer} The new key pair
154
- */
155
- public seedToSimpleKeyPairBuffer(seed: Buffer): ISimpleKeyPairBuffer {
156
- const wallet = this.walletFromSeed(seed);
157
- return this.walletToSimpleKeyPairBuffer(wallet);
158
- }
159
-
160
- /**
161
- * Create a simple key pair from a mnemonic
162
- * @param mnemonic {SecureString} The mnemonic to generate the key pair from
163
- * @returns {ISimpleKeyPairBuffer} The new key pair
164
- */
165
- public mnemonicToSimpleKeyPairBuffer(
166
- mnemonic: SecureString,
167
- ): ISimpleKeyPairBuffer {
168
- const { seed } = this.walletAndSeedFromMnemonic(mnemonic);
169
- return this.seedToSimpleKeyPairBuffer(Buffer.from(seed.value));
170
- }
171
-
172
- /**
173
- * Generate a random private key
174
- * @returns {Buffer} The new private key
175
- */
176
- public generatePrivateKey(): Buffer {
177
- return Buffer.from(secp256k1.utils.randomPrivateKey());
178
- }
179
-
180
- /**
181
- * Get public key from private key
182
- * @param privateKey {Buffer} The private key
183
- * @returns {Buffer} The public key
184
- */
185
- public getPublicKey(privateKey: Buffer): Buffer {
186
- const publicKey = secp256k1.getPublicKey(privateKey, false);
187
- return Buffer.from(publicKey);
188
- }
189
-
190
- /**
191
- * Generate ephemeral key pair for ECIES
192
- * @returns {Promise<ISimpleKeyPairBuffer>} The key pair
193
- */
194
- public async generateEphemeralKeyPair(): Promise<{
195
- privateKey: Buffer;
196
- publicKey: Buffer;
197
- }> {
198
- const privateKey = this.generatePrivateKey();
199
- const publicKey = this.getPublicKey(privateKey);
200
- return { privateKey, publicKey };
201
- }
202
-
203
- /**
204
- * Compute ECDH shared secret
205
- * @param privateKey {Buffer} The private key
206
- * @param publicKey {Buffer} The public key
207
- * @returns {Buffer} The shared secret
208
- */
209
- public computeSharedSecret(privateKey: Buffer, publicKey: Buffer): Buffer {
210
- const sharedSecret = secp256k1.getSharedSecret(privateKey, publicKey, true);
211
- return Buffer.from(sharedSecret.slice(1)); // Remove the 0x02/0x03 prefix
212
- }
213
- }
@@ -1,174 +0,0 @@
1
- import * as fs from 'fs';
2
- import { ECIESService } from './service';
3
-
4
- interface ChunkedFileHeader {
5
- version: number;
6
- chunkSize: number;
7
- totalChunks: number;
8
- originalSize: number;
9
- }
10
-
11
- export class EciesFileService {
12
- protected readonly eciesService: ECIESService;
13
- protected readonly userPrivateKey: Buffer;
14
- protected readonly config: { chunkSize: number; headerSize: number };
15
-
16
- constructor(
17
- eciesService: ECIESService,
18
- userPrivateKey: Buffer,
19
- config: { chunkSize: number; headerSize: number } = {
20
- chunkSize: 1024 * 1024, // 1MB chunks
21
- headerSize: 20,
22
- }
23
- ) {
24
- this.eciesService = eciesService;
25
- this.userPrivateKey = userPrivateKey;
26
- this.config = Object.freeze(config);
27
- }
28
-
29
- decryptFile(encryptedData: Buffer): Buffer {
30
- const { header, chunks } = this.parseEncryptedFile(encryptedData);
31
- const decryptedChunks: Buffer[] = [];
32
-
33
- for (const chunk of chunks) {
34
- const decrypted = this.eciesService.decryptSimpleOrSingleWithHeader(
35
- false,
36
- this.userPrivateKey,
37
- chunk,
38
- );
39
- decryptedChunks.push(decrypted);
40
- }
41
-
42
- const result = Buffer.alloc(header.originalSize);
43
- let offset = 0;
44
- for (const chunk of decryptedChunks) {
45
- const copyLength = Math.min(chunk.length, header.originalSize - offset);
46
- chunk.copy(result, offset, 0, copyLength);
47
- offset += copyLength;
48
- }
49
- return result;
50
- }
51
-
52
- encryptFileFromPath(filePath: string, recipientPublicKey: Buffer): Buffer {
53
- const stats = fs.statSync(filePath);
54
- const totalChunks = Math.ceil(stats.size / this.config.chunkSize);
55
- const header: ChunkedFileHeader = {
56
- version: 1,
57
- chunkSize: this.config.chunkSize,
58
- totalChunks,
59
- originalSize: stats.size,
60
- };
61
-
62
- const headerBytes = this.serializeHeader(header);
63
- const encryptedHeader = this.eciesService.encryptSimpleOrSingle(
64
- false,
65
- recipientPublicKey,
66
- headerBytes,
67
- );
68
-
69
- const chunks: Buffer[] = [encryptedHeader];
70
- const fd = fs.openSync(filePath, 'r');
71
-
72
- try {
73
- for (let i = 0; i < totalChunks; i++) {
74
- const offset = i * this.config.chunkSize;
75
- const chunkSize = Math.min(
76
- this.config.chunkSize,
77
- stats.size - offset,
78
- );
79
- const chunkData = Buffer.alloc(chunkSize);
80
- fs.readSync(fd, chunkData, 0, chunkSize, offset);
81
-
82
- const encryptedChunk = this.eciesService.encryptSimpleOrSingle(
83
- false,
84
- recipientPublicKey,
85
- chunkData,
86
- );
87
- chunks.push(encryptedChunk);
88
- }
89
- } finally {
90
- fs.closeSync(fd);
91
- }
92
-
93
- return Buffer.concat(chunks);
94
- }
95
-
96
- decryptFileToPath(encryptedData: Buffer, outputPath: string): void {
97
- const { header, chunks } = this.parseEncryptedFile(encryptedData);
98
- const fd = fs.openSync(outputPath, 'w');
99
- let offset = 0;
100
-
101
- try {
102
- for (const chunk of chunks) {
103
- const decrypted = this.eciesService.decryptSimpleOrSingleWithHeader(
104
- false,
105
- this.userPrivateKey,
106
- chunk,
107
- );
108
- const writeLength = Math.min(
109
- decrypted.length,
110
- header.originalSize - offset,
111
- );
112
- fs.writeSync(fd, decrypted, 0, writeLength, offset);
113
- offset += writeLength;
114
- }
115
- } finally {
116
- fs.closeSync(fd);
117
- }
118
- }
119
-
120
- protected serializeHeader(header: ChunkedFileHeader): Buffer {
121
- const buffer = Buffer.alloc(this.config.headerSize);
122
- buffer.writeUInt32BE(header.version, 0);
123
- buffer.writeUInt32BE(header.chunkSize, 4);
124
- buffer.writeUInt32BE(header.totalChunks, 8);
125
- buffer.writeUInt32BE(header.originalSize, 12);
126
- return buffer;
127
- }
128
-
129
- protected deserializeHeader(data: Buffer): ChunkedFileHeader {
130
- return {
131
- version: data.readUInt32BE(0),
132
- chunkSize: data.readUInt32BE(4),
133
- totalChunks: data.readUInt32BE(8),
134
- originalSize: data.readUInt32BE(12),
135
- };
136
- }
137
-
138
- protected parseEncryptedFile(encryptedData: Buffer): {
139
- header: ChunkedFileHeader;
140
- chunks: Buffer[];
141
- } {
142
- const headerLength = this.eciesService.computeEncryptedLengthFromDataLength(
143
- this.config.headerSize,
144
- 'single',
145
- );
146
-
147
- const encryptedHeader = encryptedData.subarray(0, headerLength);
148
- const decryptedHeaderBytes =
149
- this.eciesService.decryptSimpleOrSingleWithHeader(
150
- false,
151
- this.userPrivateKey,
152
- encryptedHeader,
153
- );
154
-
155
- const header = this.deserializeHeader(decryptedHeaderBytes);
156
- const chunks: Buffer[] = [];
157
- let offset = headerLength;
158
-
159
- for (let i = 0; i < header.totalChunks; i++) {
160
- const chunkLength =
161
- this.eciesService.computeEncryptedLengthFromDataLength(
162
- i === header.totalChunks - 1
163
- ? header.originalSize % header.chunkSize || header.chunkSize
164
- : header.chunkSize,
165
- 'single',
166
- );
167
-
168
- chunks.push(encryptedData.subarray(offset, offset + chunkLength));
169
- offset += chunkLength;
170
- }
171
-
172
- return { header, chunks };
173
- }
174
- }