@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.
- package/README.md +4 -0
- package/package.json +6 -5
- package/src/constants.d.ts +32 -0
- package/src/constants.d.ts.map +1 -0
- package/src/constants.js +137 -0
- package/src/constants.js.map +1 -0
- package/src/enumerations/index.d.ts +2 -0
- package/src/enumerations/index.d.ts.map +1 -0
- package/src/enumerations/index.js +5 -0
- package/src/enumerations/index.js.map +1 -0
- package/src/enumerations/pbkdf2-profile.d.ts +9 -0
- package/src/enumerations/pbkdf2-profile.d.ts.map +1 -0
- package/src/enumerations/pbkdf2-profile.js +13 -0
- package/src/enumerations/pbkdf2-profile.js.map +1 -0
- package/src/i18n/ecies-i18n-factory.d.ts +54 -0
- package/src/i18n/ecies-i18n-factory.d.ts.map +1 -0
- package/src/i18n/ecies-i18n-factory.js +333 -0
- package/src/i18n/ecies-i18n-factory.js.map +1 -0
- package/src/i18n/{index.ts → index.d.ts} +1 -0
- package/src/i18n/index.d.ts.map +1 -0
- package/src/i18n/index.js +5 -0
- package/src/i18n/index.js.map +1 -0
- package/src/{index.ts → index.d.ts} +1 -0
- package/src/index.d.ts.map +1 -0
- package/src/index.js +11 -0
- package/src/index.js.map +1 -0
- package/src/interfaces/authenticated-cipher.d.ts +10 -0
- package/src/interfaces/authenticated-cipher.d.ts.map +1 -0
- package/src/interfaces/authenticated-cipher.js +3 -0
- package/src/interfaces/authenticated-cipher.js.map +1 -0
- package/src/interfaces/authenticated-decipher.d.ts +9 -0
- package/src/interfaces/authenticated-decipher.d.ts.map +1 -0
- package/src/interfaces/authenticated-decipher.js +3 -0
- package/src/interfaces/authenticated-decipher.js.map +1 -0
- package/src/interfaces/checksum-config.d.ts +5 -0
- package/src/interfaces/checksum-config.d.ts.map +1 -0
- package/src/interfaces/checksum-config.js +3 -0
- package/src/interfaces/checksum-config.js.map +1 -0
- package/src/interfaces/checksum-consts.d.ts +11 -0
- package/src/interfaces/checksum-consts.d.ts.map +1 -0
- package/src/interfaces/checksum-consts.js +3 -0
- package/src/interfaces/checksum-consts.js.map +1 -0
- package/src/interfaces/constants.d.ts +43 -0
- package/src/interfaces/constants.d.ts.map +1 -0
- package/src/interfaces/constants.js +3 -0
- package/src/interfaces/constants.js.map +1 -0
- package/src/interfaces/ecies-consts.d.ts +88 -0
- package/src/interfaces/ecies-consts.d.ts.map +1 -0
- package/src/interfaces/ecies-consts.js +3 -0
- package/src/interfaces/ecies-consts.js.map +1 -0
- package/src/interfaces/encryption-consts.d.ts +11 -0
- package/src/interfaces/encryption-consts.d.ts.map +1 -0
- package/src/interfaces/encryption-consts.js +3 -0
- package/src/interfaces/encryption-consts.js.map +1 -0
- package/src/interfaces/{index.ts → index.d.ts} +1 -0
- package/src/interfaces/index.d.ts.map +1 -0
- package/src/interfaces/index.js +21 -0
- package/src/interfaces/index.js.map +1 -0
- package/src/interfaces/keypair-buffer-with-un-encrypted-private-key.d.ts +6 -0
- package/src/interfaces/keypair-buffer-with-un-encrypted-private-key.d.ts.map +1 -0
- package/src/interfaces/keypair-buffer-with-un-encrypted-private-key.js +3 -0
- package/src/interfaces/keypair-buffer-with-un-encrypted-private-key.js.map +1 -0
- package/src/interfaces/keyring-consts.d.ts +6 -0
- package/src/interfaces/keyring-consts.d.ts.map +1 -0
- package/src/interfaces/keyring-consts.js +3 -0
- package/src/interfaces/keyring-consts.js.map +1 -0
- package/src/interfaces/member-operational.d.ts +36 -0
- package/src/interfaces/member-operational.d.ts.map +1 -0
- package/src/interfaces/member-operational.js +3 -0
- package/src/interfaces/member-operational.js.map +1 -0
- package/src/interfaces/{member-with-mnemonic.ts → member-with-mnemonic.d.ts} +3 -3
- package/src/interfaces/member-with-mnemonic.d.ts.map +1 -0
- package/src/interfaces/member-with-mnemonic.js +3 -0
- package/src/interfaces/member-with-mnemonic.js.map +1 -0
- package/src/interfaces/{multi-encrypted-message.ts → multi-encrypted-message.d.ts} +5 -5
- package/src/interfaces/multi-encrypted-message.d.ts.map +1 -0
- package/src/interfaces/multi-encrypted-message.js +3 -0
- package/src/interfaces/multi-encrypted-message.js.map +1 -0
- package/src/interfaces/multi-encrypted-parsed-header.d.ts +24 -0
- package/src/interfaces/multi-encrypted-parsed-header.d.ts.map +1 -0
- package/src/interfaces/multi-encrypted-parsed-header.js +3 -0
- package/src/interfaces/multi-encrypted-parsed-header.js.map +1 -0
- package/src/interfaces/{pbkdf-profiles.ts → pbkdf-profiles.d.ts} +2 -2
- package/src/interfaces/pbkdf-profiles.d.ts.map +1 -0
- package/src/interfaces/pbkdf-profiles.js +3 -0
- package/src/interfaces/pbkdf-profiles.js.map +1 -0
- package/src/interfaces/pbkdf2-result.d.ts +6 -0
- package/src/interfaces/pbkdf2-result.d.ts.map +1 -0
- package/src/interfaces/pbkdf2-result.js +3 -0
- package/src/interfaces/pbkdf2-result.js.map +1 -0
- package/src/interfaces/signing-key-private-key-info.d.ts +11 -0
- package/src/interfaces/signing-key-private-key-info.d.ts.map +1 -0
- package/src/interfaces/signing-key-private-key-info.js +3 -0
- package/src/interfaces/signing-key-private-key-info.js.map +1 -0
- package/src/interfaces/{simple-keypair-buffer.ts → simple-keypair-buffer.d.ts} +3 -3
- package/src/interfaces/simple-keypair-buffer.d.ts.map +1 -0
- package/src/interfaces/simple-keypair-buffer.js +3 -0
- package/src/interfaces/simple-keypair-buffer.js.map +1 -0
- package/src/interfaces/{simple-keypair.ts → simple-keypair.d.ts} +3 -3
- package/src/interfaces/simple-keypair.d.ts.map +1 -0
- package/src/interfaces/simple-keypair.js +3 -0
- package/src/interfaces/simple-keypair.js.map +1 -0
- package/src/interfaces/simple-public-key-only-buffer.d.ts +4 -0
- package/src/interfaces/simple-public-key-only-buffer.d.ts.map +1 -0
- package/src/interfaces/simple-public-key-only-buffer.js +3 -0
- package/src/interfaces/simple-public-key-only-buffer.js.map +1 -0
- package/src/interfaces/simple-public-key-only.d.ts +4 -0
- package/src/interfaces/simple-public-key-only.d.ts.map +1 -0
- package/src/interfaces/simple-public-key-only.js +3 -0
- package/src/interfaces/simple-public-key-only.js.map +1 -0
- package/src/interfaces/single-encrypted-parsed-header.d.ts +35 -0
- package/src/interfaces/single-encrypted-parsed-header.d.ts.map +1 -0
- package/src/interfaces/single-encrypted-parsed-header.js +3 -0
- package/src/interfaces/single-encrypted-parsed-header.js.map +1 -0
- package/src/interfaces/{wallet-seed.ts → wallet-seed.d.ts} +3 -3
- package/src/interfaces/wallet-seed.d.ts.map +1 -0
- package/src/interfaces/wallet-seed.js +3 -0
- package/src/interfaces/wallet-seed.js.map +1 -0
- package/src/interfaces/wrapped-key-consts.d.ts +7 -0
- package/src/interfaces/wrapped-key-consts.d.ts.map +1 -0
- package/src/interfaces/wrapped-key-consts.js +3 -0
- package/src/interfaces/wrapped-key-consts.js.map +1 -0
- package/src/member.d.ts +74 -0
- package/src/member.d.ts.map +1 -0
- package/src/member.js +273 -0
- package/src/member.js.map +1 -0
- package/src/services/aes-gcm.d.ts +66 -0
- package/src/services/aes-gcm.d.ts.map +1 -0
- package/src/services/aes-gcm.js +115 -0
- package/src/services/aes-gcm.js.map +1 -0
- package/src/services/ecies/crypto-core.d.ts +83 -0
- package/src/services/ecies/crypto-core.d.ts.map +1 -0
- package/src/services/ecies/crypto-core.js +166 -0
- package/src/services/ecies/crypto-core.js.map +1 -0
- package/src/services/ecies/file.d.ts +30 -0
- package/src/services/ecies/file.d.ts.map +1 -0
- package/src/services/ecies/file.js +112 -0
- package/src/services/ecies/file.js.map +1 -0
- package/src/services/ecies/{index.ts → index.d.ts} +1 -0
- package/src/services/ecies/index.d.ts.map +1 -0
- package/src/services/ecies/index.js +11 -0
- package/src/services/ecies/index.js.map +1 -0
- package/src/services/ecies/multi-recipient.d.ts +82 -0
- package/src/services/ecies/multi-recipient.d.ts.map +1 -0
- package/src/services/ecies/multi-recipient.js +360 -0
- package/src/services/ecies/multi-recipient.js.map +1 -0
- package/src/services/ecies/service.d.ts +70 -0
- package/src/services/ecies/service.d.ts.map +1 -0
- package/src/services/ecies/service.js +167 -0
- package/src/services/ecies/service.js.map +1 -0
- package/src/services/ecies/signature.d.ts +38 -0
- package/src/services/ecies/signature.d.ts.map +1 -0
- package/src/services/ecies/signature.js +69 -0
- package/src/services/ecies/signature.js.map +1 -0
- package/src/services/ecies/single-recipient.d.ts +85 -0
- package/src/services/ecies/single-recipient.d.ts.map +1 -0
- package/src/services/ecies/single-recipient.js +399 -0
- package/src/services/ecies/single-recipient.js.map +1 -0
- package/src/services/ecies/utilities.d.ts +22 -0
- package/src/services/ecies/utilities.d.ts.map +1 -0
- package/src/services/ecies/utilities.js +75 -0
- package/src/services/ecies/utilities.js.map +1 -0
- package/src/services/index.d.ts +4 -0
- package/src/services/index.d.ts.map +1 -0
- package/src/services/index.js +7 -0
- package/src/services/index.js.map +1 -0
- package/src/services/pbkdf2.d.ts +106 -0
- package/src/services/pbkdf2.d.ts.map +1 -0
- package/src/services/pbkdf2.js +195 -0
- package/src/services/pbkdf2.js.map +1 -0
- package/src/{types.ts → types.d.ts} +9 -26
- package/src/types.d.ts.map +1 -0
- package/src/types.js +3 -0
- package/src/types.js.map +1 -0
- package/src/utils.d.ts +11 -0
- package/src/utils.d.ts.map +1 -0
- package/src/utils.js +82 -0
- package/src/utils.js.map +1 -0
- package/LICENSE +0 -21
- package/src/constants.ts +0 -182
- package/src/enumerations/index.ts +0 -1
- package/src/enumerations/pbkdf2-profile.ts +0 -8
- package/src/i18n/ecies-i18n-factory.ts +0 -435
- package/src/interfaces/authenticated-cipher.ts +0 -9
- package/src/interfaces/authenticated-decipher.ts +0 -8
- package/src/interfaces/checksum-config.ts +0 -4
- package/src/interfaces/checksum-consts.ts +0 -13
- package/src/interfaces/constants.ts +0 -43
- package/src/interfaces/ecies-consts.ts +0 -99
- package/src/interfaces/encryption-consts.ts +0 -10
- package/src/interfaces/keypair-buffer-with-un-encrypted-private-key.ts +0 -7
- package/src/interfaces/keyring-consts.ts +0 -5
- package/src/interfaces/member-operational.ts +0 -52
- package/src/interfaces/multi-encrypted-parsed-header.ts +0 -24
- package/src/interfaces/pbkdf2-result.ts +0 -5
- package/src/interfaces/signing-key-private-key-info.ts +0 -12
- package/src/interfaces/simple-public-key-only-buffer.ts +0 -3
- package/src/interfaces/simple-public-key-only.ts +0 -3
- package/src/interfaces/single-encrypted-parsed-header.ts +0 -35
- package/src/interfaces/wrapped-key-consts.ts +0 -6
- package/src/member.ts +0 -463
- package/src/services/aes-gcm.ts +0 -160
- package/src/services/ecies/crypto-core.ts +0 -213
- package/src/services/ecies/file.ts +0 -174
- package/src/services/ecies/multi-recipient.ts +0 -583
- package/src/services/ecies/service.ts +0 -351
- package/src/services/ecies/signature.ts +0 -91
- package/src/services/ecies/single-recipient.ts +0 -676
- package/src/services/ecies/utilities.ts +0 -111
- package/src/services/index.ts +0 -3
- package/src/services/pbkdf2.ts +0 -307
- 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
|
-
}
|