@digitaldefiance/node-ecies-lib 1.1.21 → 1.1.22
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 +14 -35
- package/src/constants.ts +182 -0
- package/src/enumerations/index.ts +1 -0
- package/src/enumerations/pbkdf2-profile.ts +8 -0
- package/src/i18n/ecies-i18n-factory.ts +435 -0
- package/{dist/i18n/index.d.ts → src/i18n/index.ts} +0 -1
- package/{dist/index.d.ts → src/index.ts} +0 -1
- package/src/interfaces/authenticated-cipher.ts +9 -0
- package/src/interfaces/authenticated-decipher.ts +8 -0
- package/src/interfaces/checksum-config.ts +4 -0
- package/src/interfaces/checksum-consts.ts +13 -0
- package/src/interfaces/constants.ts +43 -0
- package/src/interfaces/ecies-consts.ts +99 -0
- package/src/interfaces/encryption-consts.ts +10 -0
- package/{dist/interfaces/index.d.ts → src/interfaces/index.ts} +0 -1
- package/src/interfaces/keypair-buffer-with-un-encrypted-private-key.ts +7 -0
- package/src/interfaces/keyring-consts.ts +5 -0
- package/src/interfaces/member-operational.ts +52 -0
- package/{dist/interfaces/member-with-mnemonic.d.ts → src/interfaces/member-with-mnemonic.ts} +3 -3
- package/{dist/interfaces/multi-encrypted-message.d.ts → src/interfaces/multi-encrypted-message.ts} +5 -5
- package/src/interfaces/multi-encrypted-parsed-header.ts +24 -0
- package/{dist/interfaces/pbkdf-profiles.d.ts → src/interfaces/pbkdf-profiles.ts} +2 -2
- package/src/interfaces/pbkdf2-result.ts +5 -0
- package/src/interfaces/signing-key-private-key-info.ts +12 -0
- package/{dist/interfaces/simple-keypair-buffer.d.ts → src/interfaces/simple-keypair-buffer.ts} +3 -3
- package/{dist/interfaces/simple-keypair.d.ts → src/interfaces/simple-keypair.ts} +3 -3
- package/src/interfaces/simple-public-key-only-buffer.ts +3 -0
- package/src/interfaces/simple-public-key-only.ts +3 -0
- package/src/interfaces/single-encrypted-parsed-header.ts +35 -0
- package/{dist/interfaces/wallet-seed.d.ts → src/interfaces/wallet-seed.ts} +3 -3
- package/src/interfaces/wrapped-key-consts.ts +6 -0
- package/src/member.ts +463 -0
- package/src/services/aes-gcm.ts +160 -0
- package/src/services/ecies/crypto-core.ts +213 -0
- package/src/services/ecies/file.ts +174 -0
- package/{dist/services/ecies/index.d.ts → src/services/ecies/index.ts} +0 -1
- package/src/services/ecies/multi-recipient.ts +583 -0
- package/src/services/ecies/service.ts +351 -0
- package/src/services/ecies/signature.ts +91 -0
- package/src/services/ecies/single-recipient.ts +676 -0
- package/src/services/ecies/utilities.ts +111 -0
- package/src/services/index.ts +3 -0
- package/src/services/pbkdf2.ts +307 -0
- package/{dist/types.d.ts → src/types.ts} +26 -9
- package/src/utils.ts +104 -0
- package/dist/constants.d.ts +0 -32
- package/dist/constants.d.ts.map +0 -1
- package/dist/constants.js +0 -137
- package/dist/constants.js.map +0 -1
- package/dist/enumerations/index.d.ts +0 -2
- package/dist/enumerations/index.d.ts.map +0 -1
- package/dist/enumerations/index.js +0 -18
- package/dist/enumerations/index.js.map +0 -1
- package/dist/enumerations/pbkdf2-profile.d.ts +0 -9
- package/dist/enumerations/pbkdf2-profile.d.ts.map +0 -1
- package/dist/enumerations/pbkdf2-profile.js +0 -13
- package/dist/enumerations/pbkdf2-profile.js.map +0 -1
- package/dist/i18n/ecies-i18n-factory.d.ts +0 -54
- package/dist/i18n/ecies-i18n-factory.d.ts.map +0 -1
- package/dist/i18n/ecies-i18n-factory.js +0 -333
- package/dist/i18n/ecies-i18n-factory.js.map +0 -1
- package/dist/i18n/index.d.ts.map +0 -1
- package/dist/i18n/index.js +0 -18
- package/dist/i18n/index.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -24
- package/dist/index.js.map +0 -1
- package/dist/interfaces/authenticated-cipher.d.ts +0 -10
- package/dist/interfaces/authenticated-cipher.d.ts.map +0 -1
- package/dist/interfaces/authenticated-cipher.js +0 -3
- package/dist/interfaces/authenticated-cipher.js.map +0 -1
- package/dist/interfaces/authenticated-decipher.d.ts +0 -9
- package/dist/interfaces/authenticated-decipher.d.ts.map +0 -1
- package/dist/interfaces/authenticated-decipher.js +0 -3
- package/dist/interfaces/authenticated-decipher.js.map +0 -1
- package/dist/interfaces/checksum-config.d.ts +0 -5
- package/dist/interfaces/checksum-config.d.ts.map +0 -1
- package/dist/interfaces/checksum-config.js +0 -3
- package/dist/interfaces/checksum-config.js.map +0 -1
- package/dist/interfaces/checksum-consts.d.ts +0 -11
- package/dist/interfaces/checksum-consts.d.ts.map +0 -1
- package/dist/interfaces/checksum-consts.js +0 -3
- package/dist/interfaces/checksum-consts.js.map +0 -1
- package/dist/interfaces/constants.d.ts +0 -43
- package/dist/interfaces/constants.d.ts.map +0 -1
- package/dist/interfaces/constants.js +0 -3
- package/dist/interfaces/constants.js.map +0 -1
- package/dist/interfaces/ecies-consts.d.ts +0 -88
- package/dist/interfaces/ecies-consts.d.ts.map +0 -1
- package/dist/interfaces/ecies-consts.js +0 -3
- package/dist/interfaces/ecies-consts.js.map +0 -1
- package/dist/interfaces/encryption-consts.d.ts +0 -11
- package/dist/interfaces/encryption-consts.d.ts.map +0 -1
- package/dist/interfaces/encryption-consts.js +0 -3
- package/dist/interfaces/encryption-consts.js.map +0 -1
- package/dist/interfaces/index.d.ts.map +0 -1
- package/dist/interfaces/index.js +0 -34
- package/dist/interfaces/index.js.map +0 -1
- package/dist/interfaces/keypair-buffer-with-un-encrypted-private-key.d.ts +0 -6
- package/dist/interfaces/keypair-buffer-with-un-encrypted-private-key.d.ts.map +0 -1
- package/dist/interfaces/keypair-buffer-with-un-encrypted-private-key.js +0 -3
- package/dist/interfaces/keypair-buffer-with-un-encrypted-private-key.js.map +0 -1
- package/dist/interfaces/keyring-consts.d.ts +0 -6
- package/dist/interfaces/keyring-consts.d.ts.map +0 -1
- package/dist/interfaces/keyring-consts.js +0 -3
- package/dist/interfaces/keyring-consts.js.map +0 -1
- package/dist/interfaces/member-operational.d.ts +0 -36
- package/dist/interfaces/member-operational.d.ts.map +0 -1
- package/dist/interfaces/member-operational.js +0 -3
- package/dist/interfaces/member-operational.js.map +0 -1
- package/dist/interfaces/member-with-mnemonic.d.ts.map +0 -1
- package/dist/interfaces/member-with-mnemonic.js +0 -3
- package/dist/interfaces/member-with-mnemonic.js.map +0 -1
- package/dist/interfaces/multi-encrypted-message.d.ts.map +0 -1
- package/dist/interfaces/multi-encrypted-message.js +0 -3
- package/dist/interfaces/multi-encrypted-message.js.map +0 -1
- package/dist/interfaces/multi-encrypted-parsed-header.d.ts +0 -24
- package/dist/interfaces/multi-encrypted-parsed-header.d.ts.map +0 -1
- package/dist/interfaces/multi-encrypted-parsed-header.js +0 -3
- package/dist/interfaces/multi-encrypted-parsed-header.js.map +0 -1
- package/dist/interfaces/pbkdf-profiles.d.ts.map +0 -1
- package/dist/interfaces/pbkdf-profiles.js +0 -3
- package/dist/interfaces/pbkdf-profiles.js.map +0 -1
- package/dist/interfaces/pbkdf2-result.d.ts +0 -6
- package/dist/interfaces/pbkdf2-result.d.ts.map +0 -1
- package/dist/interfaces/pbkdf2-result.js +0 -3
- package/dist/interfaces/pbkdf2-result.js.map +0 -1
- package/dist/interfaces/signing-key-private-key-info.d.ts +0 -11
- package/dist/interfaces/signing-key-private-key-info.d.ts.map +0 -1
- package/dist/interfaces/signing-key-private-key-info.js +0 -3
- package/dist/interfaces/signing-key-private-key-info.js.map +0 -1
- package/dist/interfaces/simple-keypair-buffer.d.ts.map +0 -1
- package/dist/interfaces/simple-keypair-buffer.js +0 -3
- package/dist/interfaces/simple-keypair-buffer.js.map +0 -1
- package/dist/interfaces/simple-keypair.d.ts.map +0 -1
- package/dist/interfaces/simple-keypair.js +0 -3
- package/dist/interfaces/simple-keypair.js.map +0 -1
- package/dist/interfaces/simple-public-key-only-buffer.d.ts +0 -4
- package/dist/interfaces/simple-public-key-only-buffer.d.ts.map +0 -1
- package/dist/interfaces/simple-public-key-only-buffer.js +0 -3
- package/dist/interfaces/simple-public-key-only-buffer.js.map +0 -1
- package/dist/interfaces/simple-public-key-only.d.ts +0 -4
- package/dist/interfaces/simple-public-key-only.d.ts.map +0 -1
- package/dist/interfaces/simple-public-key-only.js +0 -3
- package/dist/interfaces/simple-public-key-only.js.map +0 -1
- package/dist/interfaces/single-encrypted-parsed-header.d.ts +0 -35
- package/dist/interfaces/single-encrypted-parsed-header.d.ts.map +0 -1
- package/dist/interfaces/single-encrypted-parsed-header.js +0 -3
- package/dist/interfaces/single-encrypted-parsed-header.js.map +0 -1
- package/dist/interfaces/wallet-seed.d.ts.map +0 -1
- package/dist/interfaces/wallet-seed.js +0 -3
- package/dist/interfaces/wallet-seed.js.map +0 -1
- package/dist/interfaces/wrapped-key-consts.d.ts +0 -7
- package/dist/interfaces/wrapped-key-consts.d.ts.map +0 -1
- package/dist/interfaces/wrapped-key-consts.js +0 -3
- package/dist/interfaces/wrapped-key-consts.js.map +0 -1
- package/dist/member.d.ts +0 -74
- package/dist/member.d.ts.map +0 -1
- package/dist/member.js +0 -273
- package/dist/member.js.map +0 -1
- package/dist/services/aes-gcm.d.ts +0 -66
- package/dist/services/aes-gcm.d.ts.map +0 -1
- package/dist/services/aes-gcm.js +0 -115
- package/dist/services/aes-gcm.js.map +0 -1
- package/dist/services/ecies/crypto-core.d.ts +0 -83
- package/dist/services/ecies/crypto-core.d.ts.map +0 -1
- package/dist/services/ecies/crypto-core.js +0 -166
- package/dist/services/ecies/crypto-core.js.map +0 -1
- package/dist/services/ecies/file.d.ts +0 -30
- package/dist/services/ecies/file.d.ts.map +0 -1
- package/dist/services/ecies/file.js +0 -144
- package/dist/services/ecies/file.js.map +0 -1
- package/dist/services/ecies/index.d.ts.map +0 -1
- package/dist/services/ecies/index.js +0 -24
- package/dist/services/ecies/index.js.map +0 -1
- package/dist/services/ecies/multi-recipient.d.ts +0 -82
- package/dist/services/ecies/multi-recipient.d.ts.map +0 -1
- package/dist/services/ecies/multi-recipient.js +0 -360
- package/dist/services/ecies/multi-recipient.js.map +0 -1
- package/dist/services/ecies/service.d.ts +0 -70
- package/dist/services/ecies/service.d.ts.map +0 -1
- package/dist/services/ecies/service.js +0 -167
- package/dist/services/ecies/service.js.map +0 -1
- package/dist/services/ecies/signature.d.ts +0 -38
- package/dist/services/ecies/signature.d.ts.map +0 -1
- package/dist/services/ecies/signature.js +0 -69
- package/dist/services/ecies/signature.js.map +0 -1
- package/dist/services/ecies/single-recipient.d.ts +0 -85
- package/dist/services/ecies/single-recipient.d.ts.map +0 -1
- package/dist/services/ecies/single-recipient.js +0 -399
- package/dist/services/ecies/single-recipient.js.map +0 -1
- package/dist/services/ecies/utilities.d.ts +0 -22
- package/dist/services/ecies/utilities.d.ts.map +0 -1
- package/dist/services/ecies/utilities.js +0 -75
- package/dist/services/ecies/utilities.js.map +0 -1
- package/dist/services/index.d.ts +0 -4
- package/dist/services/index.d.ts.map +0 -1
- package/dist/services/index.js +0 -20
- package/dist/services/index.js.map +0 -1
- package/dist/services/pbkdf2.d.ts +0 -106
- package/dist/services/pbkdf2.d.ts.map +0 -1
- package/dist/services/pbkdf2.js +0 -195
- package/dist/services/pbkdf2.js.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -3
- package/dist/types.js.map +0 -1
- package/dist/utils.d.ts +0 -11
- package/dist/utils.d.ts.map +0 -1
- package/dist/utils.js +0 -82
- package/dist/utils.js.map +0 -1
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
import {
|
|
2
|
+
EciesEncryptionType,
|
|
3
|
+
EciesEncryptionTypeEnum,
|
|
4
|
+
ECIESError,
|
|
5
|
+
ECIESErrorTypeEnum,
|
|
6
|
+
HexString,
|
|
7
|
+
IECIESConfig,
|
|
8
|
+
IECIESConstants,
|
|
9
|
+
SecureString,
|
|
10
|
+
} from '@digitaldefiance/ecies-lib';
|
|
11
|
+
import { Wallet } from '@ethereumjs/wallet';
|
|
12
|
+
import {
|
|
13
|
+
createEciesTranslationEngine,
|
|
14
|
+
getEciesPluginI18nEngine,
|
|
15
|
+
NodeEciesComponentId,
|
|
16
|
+
NodeEciesStringKey,
|
|
17
|
+
} from '../../i18n/ecies-i18n-factory';
|
|
18
|
+
import { Member } from '../../member';
|
|
19
|
+
|
|
20
|
+
// Import all the modular components
|
|
21
|
+
import { CoreLanguageCode, PluginI18nEngine } from '@digitaldefiance/i18n-lib';
|
|
22
|
+
import { Constants } from '../../constants';
|
|
23
|
+
import { IWalletSeed } from '../../interfaces';
|
|
24
|
+
import { IMultiEncryptedMessage } from '../../interfaces/multi-encrypted-message';
|
|
25
|
+
import { IMultiEncryptedParsedHeader } from '../../interfaces/multi-encrypted-parsed-header';
|
|
26
|
+
import { ISingleEncryptedParsedHeader } from '../../interfaces/single-encrypted-parsed-header';
|
|
27
|
+
import { SignatureBuffer, SignatureString } from '../../types';
|
|
28
|
+
import { EciesCryptoCore } from './crypto-core';
|
|
29
|
+
import { EciesMultiRecipient } from './multi-recipient';
|
|
30
|
+
import { EciesSignature } from './signature';
|
|
31
|
+
import { EciesSingleRecipientCore } from './single-recipient';
|
|
32
|
+
import { EciesUtilities } from './utilities';
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Unified ECIES service that integrates all the modular components
|
|
36
|
+
*/
|
|
37
|
+
export class ECIESService {
|
|
38
|
+
protected readonly _config: IECIESConfig;
|
|
39
|
+
protected readonly cryptoCore: EciesCryptoCore;
|
|
40
|
+
protected readonly signature: EciesSignature;
|
|
41
|
+
protected readonly singleRecipient: EciesSingleRecipientCore;
|
|
42
|
+
protected readonly multiRecipient: EciesMultiRecipient;
|
|
43
|
+
protected readonly utilities: EciesUtilities;
|
|
44
|
+
protected readonly engine: PluginI18nEngine<CoreLanguageCode>;
|
|
45
|
+
|
|
46
|
+
constructor(
|
|
47
|
+
engineOrConfig?: PluginI18nEngine<CoreLanguageCode> | Partial<IECIESConfig>,
|
|
48
|
+
config?: Partial<IECIESConfig>,
|
|
49
|
+
eciesParams: IECIESConstants = Constants.ECIES
|
|
50
|
+
) {
|
|
51
|
+
// Determine if first parameter is engine or config
|
|
52
|
+
let engine: PluginI18nEngine<CoreLanguageCode>;
|
|
53
|
+
let actualConfig: Partial<IECIESConfig>;
|
|
54
|
+
|
|
55
|
+
if (engineOrConfig && 'translate' in engineOrConfig) {
|
|
56
|
+
// First parameter is an engine
|
|
57
|
+
engine = engineOrConfig as PluginI18nEngine<CoreLanguageCode>;
|
|
58
|
+
actualConfig = config || {};
|
|
59
|
+
} else {
|
|
60
|
+
// First parameter is config or undefined
|
|
61
|
+
engine = createEciesTranslationEngine();
|
|
62
|
+
actualConfig = (engineOrConfig as Partial<IECIESConfig>) || {};
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const eciesConsts = eciesParams;
|
|
66
|
+
this._config = {
|
|
67
|
+
...config,
|
|
68
|
+
curveName: eciesConsts.CURVE_NAME,
|
|
69
|
+
primaryKeyDerivationPath: eciesConsts.PRIMARY_KEY_DERIVATION_PATH,
|
|
70
|
+
mnemonicStrength: eciesConsts.MNEMONIC_STRENGTH,
|
|
71
|
+
symmetricAlgorithm: eciesConsts.SYMMETRIC.ALGORITHM,
|
|
72
|
+
symmetricKeyBits: eciesConsts.SYMMETRIC.KEY_BITS,
|
|
73
|
+
symmetricKeyMode: eciesConsts.SYMMETRIC.MODE,
|
|
74
|
+
...actualConfig,
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
// Initialize all components
|
|
78
|
+
this.engine = engine;
|
|
79
|
+
this.cryptoCore = new EciesCryptoCore(this._config, eciesParams);
|
|
80
|
+
this.signature = new EciesSignature(this.cryptoCore);
|
|
81
|
+
this.singleRecipient = new EciesSingleRecipientCore(this._config, engine);
|
|
82
|
+
this.multiRecipient = new EciesMultiRecipient(this.cryptoCore, engine);
|
|
83
|
+
this.utilities = new EciesUtilities();
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
public get core(): EciesCryptoCore {
|
|
87
|
+
return this.cryptoCore;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
public get config(): IECIESConfig {
|
|
91
|
+
return this._config;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* The name of the elliptic curve used for ECIES encryption/decryption
|
|
96
|
+
*/
|
|
97
|
+
public get curveName(): string {
|
|
98
|
+
return this._config.curveName;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// === Key Management Methods ===
|
|
102
|
+
|
|
103
|
+
public generateNewMnemonic(): SecureString {
|
|
104
|
+
return this.cryptoCore.generateNewMnemonic();
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
public walletFromSeed(seed: Buffer): Wallet {
|
|
108
|
+
return this.cryptoCore.walletFromSeed(seed);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
public walletAndSeedFromMnemonic(mnemonic: SecureString): IWalletSeed {
|
|
112
|
+
return this.cryptoCore.walletAndSeedFromMnemonic(mnemonic);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
public walletToSimpleKeyPairBuffer(wallet: Wallet) {
|
|
116
|
+
return this.cryptoCore.walletToSimpleKeyPairBuffer(wallet);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
public seedToSimpleKeyPairBuffer(seed: Buffer) {
|
|
120
|
+
return this.cryptoCore.seedToSimpleKeyPairBuffer(seed);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
public mnemonicToSimpleKeyPairBuffer(mnemonic: SecureString) {
|
|
124
|
+
return this.cryptoCore.mnemonicToSimpleKeyPairBuffer(mnemonic);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// === Core Encryption/Decryption Methods ===
|
|
128
|
+
|
|
129
|
+
public encryptSimpleOrSingle(
|
|
130
|
+
encryptSimple: boolean,
|
|
131
|
+
receiverPublicKey: Buffer,
|
|
132
|
+
message: Buffer,
|
|
133
|
+
preamble: Buffer = Buffer.alloc(0)
|
|
134
|
+
): Buffer {
|
|
135
|
+
return this.singleRecipient.encrypt(
|
|
136
|
+
encryptSimple,
|
|
137
|
+
receiverPublicKey,
|
|
138
|
+
message,
|
|
139
|
+
preamble
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
public parseSingleEncryptedHeader(
|
|
144
|
+
encryptionType: EciesEncryptionTypeEnum,
|
|
145
|
+
data: Buffer,
|
|
146
|
+
preambleSize: number = 0,
|
|
147
|
+
options?: {
|
|
148
|
+
dataLength?: number;
|
|
149
|
+
}
|
|
150
|
+
): ISingleEncryptedParsedHeader {
|
|
151
|
+
const { header } = this.singleRecipient.parseEncryptedMessage(
|
|
152
|
+
encryptionType,
|
|
153
|
+
data,
|
|
154
|
+
preambleSize,
|
|
155
|
+
options
|
|
156
|
+
);
|
|
157
|
+
return header;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
public decryptSimpleOrSingleWithHeader(
|
|
161
|
+
decryptSimple: boolean,
|
|
162
|
+
privateKey: Buffer,
|
|
163
|
+
encryptedData: Buffer,
|
|
164
|
+
preambleSize: number = 0,
|
|
165
|
+
options?: {
|
|
166
|
+
dataLength?: number;
|
|
167
|
+
}
|
|
168
|
+
): Buffer {
|
|
169
|
+
return this.singleRecipient.decryptWithHeader(
|
|
170
|
+
decryptSimple
|
|
171
|
+
? EciesEncryptionTypeEnum.Simple
|
|
172
|
+
: EciesEncryptionTypeEnum.Single,
|
|
173
|
+
privateKey,
|
|
174
|
+
encryptedData,
|
|
175
|
+
preambleSize,
|
|
176
|
+
options
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
public decryptSimpleOrSingleWithHeaderEx(
|
|
181
|
+
encryptionType: EciesEncryptionTypeEnum,
|
|
182
|
+
privateKey: Buffer,
|
|
183
|
+
encryptedData: Buffer,
|
|
184
|
+
preambleSize: number = 0,
|
|
185
|
+
options?: {
|
|
186
|
+
dataLength?: number;
|
|
187
|
+
}
|
|
188
|
+
): { decrypted: Buffer; consumedBytes: number } {
|
|
189
|
+
return this.singleRecipient.decryptWithHeaderEx(
|
|
190
|
+
encryptionType,
|
|
191
|
+
privateKey,
|
|
192
|
+
encryptedData,
|
|
193
|
+
preambleSize,
|
|
194
|
+
options
|
|
195
|
+
);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
public decryptSingleWithComponents(
|
|
199
|
+
privateKey: Buffer,
|
|
200
|
+
ephemeralPublicKey: Buffer,
|
|
201
|
+
iv: Buffer,
|
|
202
|
+
authTag: Buffer,
|
|
203
|
+
encrypted: Buffer
|
|
204
|
+
): { decrypted: Buffer; ciphertextLength?: number } {
|
|
205
|
+
const decrypted = this.singleRecipient.decryptWithComponents(
|
|
206
|
+
privateKey,
|
|
207
|
+
ephemeralPublicKey,
|
|
208
|
+
iv,
|
|
209
|
+
authTag,
|
|
210
|
+
encrypted
|
|
211
|
+
);
|
|
212
|
+
|
|
213
|
+
// Return an object with a 'decrypted' property for compatibility with existing code
|
|
214
|
+
return { decrypted, ciphertextLength: encrypted.length };
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
// === Signature Methods ===
|
|
218
|
+
|
|
219
|
+
public signMessage(privateKey: Buffer, data: Buffer): SignatureBuffer {
|
|
220
|
+
return this.signature.signMessage(privateKey, data);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
public verifyMessage(
|
|
224
|
+
publicKey: Buffer,
|
|
225
|
+
data: Buffer,
|
|
226
|
+
signature: SignatureBuffer
|
|
227
|
+
): boolean {
|
|
228
|
+
return this.signature.verifyMessage(publicKey, data, signature);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
public signatureStringToSignatureBuffer(
|
|
232
|
+
signatureString: HexString
|
|
233
|
+
): SignatureBuffer {
|
|
234
|
+
return this.signature.signatureStringToSignatureBuffer(signatureString);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
public signatureBufferToSignatureString(
|
|
238
|
+
signatureBuffer: SignatureBuffer
|
|
239
|
+
): SignatureString {
|
|
240
|
+
return this.signature.signatureBufferToSignatureString(signatureBuffer);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// === Multi-Recipient Methods ===
|
|
244
|
+
|
|
245
|
+
public encryptMultiple(
|
|
246
|
+
recipients: Member[],
|
|
247
|
+
message: Buffer
|
|
248
|
+
): IMultiEncryptedMessage {
|
|
249
|
+
return this.multiRecipient.encryptMultiple(recipients, message);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
public decryptMultipleECIEForRecipient(
|
|
253
|
+
encryptedData: IMultiEncryptedMessage,
|
|
254
|
+
recipient: Member
|
|
255
|
+
): Buffer {
|
|
256
|
+
return this.multiRecipient.decryptMultipleECIEForRecipient(
|
|
257
|
+
encryptedData,
|
|
258
|
+
recipient
|
|
259
|
+
);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
public calculateECIESMultipleRecipientOverhead(
|
|
263
|
+
recipientCount: number,
|
|
264
|
+
includeMessageOverhead: boolean
|
|
265
|
+
): number {
|
|
266
|
+
return this.multiRecipient.calculateECIESMultipleRecipientOverhead(
|
|
267
|
+
recipientCount,
|
|
268
|
+
includeMessageOverhead
|
|
269
|
+
);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
public buildECIESMultipleRecipientHeader(
|
|
273
|
+
data: IMultiEncryptedMessage
|
|
274
|
+
): Buffer {
|
|
275
|
+
return this.multiRecipient.buildECIESMultipleRecipientHeader(data);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
public parseMultiEncryptedHeader(data: Buffer): IMultiEncryptedParsedHeader {
|
|
279
|
+
return this.multiRecipient.parseMultiEncryptedHeader(data);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
public parseMultiEncryptedBuffer(data: Buffer): IMultiEncryptedMessage {
|
|
283
|
+
return this.multiRecipient.parseMultiEncryptedBuffer(data);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// === Utility Methods ===
|
|
287
|
+
|
|
288
|
+
public computeEncryptedLengthFromDataLength(
|
|
289
|
+
dataLength: number,
|
|
290
|
+
encryptionMode: EciesEncryptionType,
|
|
291
|
+
recipientCount?: number
|
|
292
|
+
): number {
|
|
293
|
+
return this.utilities.computeEncryptedLengthFromDataLength(
|
|
294
|
+
dataLength,
|
|
295
|
+
encryptionMode,
|
|
296
|
+
recipientCount
|
|
297
|
+
);
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
public computeDecryptedLengthFromEncryptedDataLength(
|
|
301
|
+
encryptedDataLength: number,
|
|
302
|
+
padding?: number
|
|
303
|
+
): number {
|
|
304
|
+
return this.utilities.computeDecryptedLengthFromEncryptedDataLength(
|
|
305
|
+
encryptedDataLength,
|
|
306
|
+
padding
|
|
307
|
+
);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
public encrypt(
|
|
311
|
+
encryptionType: EciesEncryptionType,
|
|
312
|
+
recipients: Member[],
|
|
313
|
+
message: Buffer,
|
|
314
|
+
preamble?: Buffer
|
|
315
|
+
): Buffer {
|
|
316
|
+
if (
|
|
317
|
+
(encryptionType === 'simple' || encryptionType === 'single') &&
|
|
318
|
+
recipients.length === 1
|
|
319
|
+
) {
|
|
320
|
+
return this.singleRecipient.encrypt(
|
|
321
|
+
encryptionType === 'simple',
|
|
322
|
+
recipients[0].publicKey,
|
|
323
|
+
message,
|
|
324
|
+
preamble
|
|
325
|
+
);
|
|
326
|
+
} else if (encryptionType === 'multiple' && recipients.length > 1) {
|
|
327
|
+
const result = this.multiRecipient.encryptMultiple(
|
|
328
|
+
recipients,
|
|
329
|
+
message,
|
|
330
|
+
preamble
|
|
331
|
+
);
|
|
332
|
+
return result.encryptedMessage;
|
|
333
|
+
} else {
|
|
334
|
+
const pluginEngine = getEciesPluginI18nEngine();
|
|
335
|
+
throw new ECIESError(
|
|
336
|
+
ECIESErrorTypeEnum.InvalidEncryptionType,
|
|
337
|
+
this.engine,
|
|
338
|
+
undefined,
|
|
339
|
+
undefined,
|
|
340
|
+
{
|
|
341
|
+
error: pluginEngine.translate(
|
|
342
|
+
NodeEciesComponentId,
|
|
343
|
+
NodeEciesStringKey.Error_InvalidEncryptionTypeOrNumberOfRecipients
|
|
344
|
+
),
|
|
345
|
+
encryptionType: encryptionType,
|
|
346
|
+
recipients: String(recipients.length),
|
|
347
|
+
}
|
|
348
|
+
);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ECIESError,
|
|
3
|
+
ECIESErrorTypeEnum,
|
|
4
|
+
HexString,
|
|
5
|
+
} from '@digitaldefiance/ecies-lib';
|
|
6
|
+
import { secp256k1 } from '@noble/curves/secp256k1.js';
|
|
7
|
+
import { sha256 } from '@noble/hashes/sha2.js';
|
|
8
|
+
import { createEciesTranslationEngine } from '../../i18n/ecies-i18n-factory';
|
|
9
|
+
import { SignatureBuffer, SignatureString } from '../../types';
|
|
10
|
+
import { EciesCryptoCore } from './crypto-core';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Signature-related functions for ECIES
|
|
14
|
+
*/
|
|
15
|
+
export class EciesSignature {
|
|
16
|
+
private readonly cryptoCore: EciesCryptoCore;
|
|
17
|
+
|
|
18
|
+
constructor(cryptoCore: EciesCryptoCore) {
|
|
19
|
+
this.cryptoCore = cryptoCore;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Signs arbitrary binary data with the given private key.
|
|
24
|
+
* @param privateKey The private key to sign the message with.
|
|
25
|
+
* @param data The data to sign.
|
|
26
|
+
* @returns The signature (64 bytes: r + s).
|
|
27
|
+
*/
|
|
28
|
+
public signMessage(privateKey: Buffer, data: Buffer): SignatureBuffer {
|
|
29
|
+
const hash = sha256(data);
|
|
30
|
+
const signature = secp256k1.sign(hash, privateKey, {
|
|
31
|
+
format: 'compact',
|
|
32
|
+
extraEntropy: false,
|
|
33
|
+
});
|
|
34
|
+
return Buffer.from(signature) as SignatureBuffer;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Verifies arbitrary binary data with the given public key.
|
|
39
|
+
* @param publicKey The public key to verify the message with.
|
|
40
|
+
* @param data The data to verify.
|
|
41
|
+
* @param signature The signature to verify (64 bytes: r + s).
|
|
42
|
+
* @returns True if the signature is valid, false otherwise.
|
|
43
|
+
*/
|
|
44
|
+
public verifyMessage(
|
|
45
|
+
publicKey: Buffer,
|
|
46
|
+
data: Buffer,
|
|
47
|
+
signature: SignatureBuffer,
|
|
48
|
+
): boolean {
|
|
49
|
+
if (signature.length !== 64) {
|
|
50
|
+
throw new ECIESError(
|
|
51
|
+
ECIESErrorTypeEnum.InvalidSignature,
|
|
52
|
+
createEciesTranslationEngine(),
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Normalize and validate the public key
|
|
57
|
+
try {
|
|
58
|
+
publicKey = this.cryptoCore.normalizePublicKey(publicKey);
|
|
59
|
+
} catch {
|
|
60
|
+
throw new ECIESError(
|
|
61
|
+
ECIESErrorTypeEnum.InvalidSenderPublicKey,
|
|
62
|
+
createEciesTranslationEngine(),
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const hash = sha256(data);
|
|
67
|
+
return secp256k1.verify(signature, hash, publicKey);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Converts a signature string to a signature buffer.
|
|
72
|
+
* @param signatureString - The signature string to convert.
|
|
73
|
+
* @returns The signature buffer.
|
|
74
|
+
*/
|
|
75
|
+
public signatureStringToSignatureBuffer(
|
|
76
|
+
signatureString: HexString,
|
|
77
|
+
): SignatureBuffer {
|
|
78
|
+
return Buffer.from(signatureString, 'hex') as SignatureBuffer;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Converts a signature buffer to a signature string.
|
|
83
|
+
* @param signatureBuffer - The signature buffer to convert.
|
|
84
|
+
* @returns The signature string.
|
|
85
|
+
*/
|
|
86
|
+
public signatureBufferToSignatureString(
|
|
87
|
+
signatureBuffer: SignatureBuffer,
|
|
88
|
+
): SignatureString {
|
|
89
|
+
return signatureBuffer.toString('hex') as SignatureString;
|
|
90
|
+
}
|
|
91
|
+
}
|