@digitaldefiance/ecies-lib 1.1.23 → 1.1.24
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 +13 -33
- package/src/constants.ts +474 -0
- package/src/email-string.ts +83 -0
- package/src/enumerations/ecies-encryption-type.ts +102 -0
- package/src/enumerations/ecies-error-type.ts +31 -0
- package/src/enumerations/ecies-string-key.ts +108 -0
- package/src/enumerations/guid-brand-type.ts +26 -0
- package/src/enumerations/guid-error-type.ts +6 -0
- package/{dist/enumerations/index.d.ts → src/enumerations/index.ts} +0 -1
- package/src/enumerations/invalid-email-type.ts +5 -0
- package/src/enumerations/length-encoding-type.ts +6 -0
- package/src/enumerations/length-error-type.ts +5 -0
- package/src/enumerations/member-error-type.ts +106 -0
- package/{dist/enumerations/member-type.d.ts → src/enumerations/member-type.ts} +7 -6
- package/src/enumerations/password-login-error-type.ts +4 -0
- package/src/enumerations/pbkdf2-error-type.ts +5 -0
- package/src/enumerations/pbkdf2-profile.ts +5 -0
- package/src/enumerations/secure-storage-error-type.ts +5 -0
- package/src/errors/disposed.ts +15 -0
- package/src/errors/ecies.ts +34 -0
- package/src/errors/guid.ts +34 -0
- package/{dist/errors/index.d.ts → src/errors/index.ts} +0 -1
- package/src/errors/invalid-email.ts +11 -0
- package/src/errors/length.ts +11 -0
- package/src/errors/member.ts +12 -0
- package/src/errors/pbkdf2.ts +12 -0
- package/src/errors/secure-storage.ts +13 -0
- package/src/errors/simple-ecies.ts +18 -0
- package/src/errors/simple-test-error.ts +6 -0
- package/src/guid.ts +800 -0
- package/src/i18n-setup.ts +1312 -0
- package/{dist/index.d.ts → src/index.ts} +0 -1
- package/src/interfaces/checksum-config.ts +4 -0
- package/src/interfaces/checksum-consts.ts +13 -0
- package/src/interfaces/constants.ts +48 -0
- package/src/interfaces/ecies-config.ts +8 -0
- package/src/interfaces/ecies-consts.ts +70 -0
- package/src/interfaces/ecies-file-service.ts +6 -0
- package/src/interfaces/guid.ts +53 -0
- package/{dist/interfaces/index.d.ts → src/interfaces/index.ts} +0 -1
- package/src/interfaces/library-error.ts +23 -0
- package/src/interfaces/member-operational.ts +54 -0
- package/{dist/interfaces/member-storage.d.ts → src/interfaces/member-storage.ts} +11 -10
- package/{dist/interfaces/member-with-mnemonic.d.ts → src/interfaces/member-with-mnemonic.ts} +3 -3
- package/src/interfaces/pbkdf2-config.ts +6 -0
- package/src/interfaces/pbkdf2-consts.ts +10 -0
- package/src/interfaces/pbkdf2-result.ts +5 -0
- package/src/member.ts +429 -0
- package/{dist/pbkdf2-profiles.d.ts → src/pbkdf2-profiles.ts} +2 -2
- package/src/phone-number.ts +18 -0
- package/src/regexes.ts +10 -0
- package/src/secure-buffer.ts +183 -0
- package/src/secure-string.ts +229 -0
- package/src/services/aes-gcm.ts +177 -0
- package/src/services/ecies/README.md +147 -0
- package/src/services/ecies/crypto-core.ts +180 -0
- package/src/services/ecies/example.ts +185 -0
- package/src/services/ecies/file.ts +167 -0
- package/{dist/services/ecies/index.d.ts → src/services/ecies/index.ts} +3 -1
- package/src/services/ecies/integration.ts +241 -0
- package/src/services/ecies/interfaces.ts +59 -0
- package/src/services/ecies/manual-test.ts +219 -0
- package/src/services/ecies/multi-recipient.ts +394 -0
- package/src/services/ecies/service.ts +317 -0
- package/src/services/ecies/signature.ts +93 -0
- package/src/services/ecies/single-recipient.ts +340 -0
- package/{dist/services/index.d.ts → src/services/index.ts} +0 -1
- package/src/services/password-login.ts +228 -0
- package/src/services/pbkdf2.ts +172 -0
- package/src/services/xor.ts +65 -0
- package/src/types/deep-partial.ts +11 -0
- package/{dist/types.d.ts → src/types.ts} +10 -4
- package/src/utils.ts +331 -0
- package/dist/constants.d.ts +0 -46
- package/dist/constants.d.ts.map +0 -1
- package/dist/constants.js +0 -358
- package/dist/constants.js.map +0 -1
- package/dist/email-string.d.ts +0 -42
- package/dist/email-string.d.ts.map +0 -1
- package/dist/email-string.js +0 -75
- package/dist/email-string.js.map +0 -1
- package/dist/enumerations/ecies-encryption-type.d.ts +0 -15
- package/dist/enumerations/ecies-encryption-type.d.ts.map +0 -1
- package/dist/enumerations/ecies-encryption-type.js +0 -71
- package/dist/enumerations/ecies-encryption-type.js.map +0 -1
- package/dist/enumerations/ecies-error-type.d.ts +0 -32
- package/dist/enumerations/ecies-error-type.d.ts.map +0 -1
- package/dist/enumerations/ecies-error-type.js +0 -36
- package/dist/enumerations/ecies-error-type.js.map +0 -1
- package/dist/enumerations/ecies-string-key.d.ts +0 -96
- package/dist/enumerations/ecies-string-key.d.ts.map +0 -1
- package/dist/enumerations/ecies-string-key.js +0 -105
- package/dist/enumerations/ecies-string-key.js.map +0 -1
- package/dist/enumerations/guid-brand-type.d.ts +0 -27
- package/dist/enumerations/guid-brand-type.d.ts.map +0 -1
- package/dist/enumerations/guid-brand-type.js +0 -31
- package/dist/enumerations/guid-brand-type.js.map +0 -1
- package/dist/enumerations/guid-error-type.d.ts +0 -7
- package/dist/enumerations/guid-error-type.d.ts.map +0 -1
- package/dist/enumerations/guid-error-type.js +0 -11
- package/dist/enumerations/guid-error-type.js.map +0 -1
- package/dist/enumerations/index.d.ts.map +0 -1
- package/dist/enumerations/index.js +0 -31
- package/dist/enumerations/index.js.map +0 -1
- package/dist/enumerations/invalid-email-type.d.ts +0 -6
- package/dist/enumerations/invalid-email-type.d.ts.map +0 -1
- package/dist/enumerations/invalid-email-type.js +0 -10
- package/dist/enumerations/invalid-email-type.js.map +0 -1
- package/dist/enumerations/length-encoding-type.d.ts +0 -7
- package/dist/enumerations/length-encoding-type.d.ts.map +0 -1
- package/dist/enumerations/length-encoding-type.js +0 -11
- package/dist/enumerations/length-encoding-type.js.map +0 -1
- package/dist/enumerations/length-error-type.d.ts +0 -6
- package/dist/enumerations/length-error-type.d.ts.map +0 -1
- package/dist/enumerations/length-error-type.js +0 -10
- package/dist/enumerations/length-error-type.js.map +0 -1
- package/dist/enumerations/member-error-type.d.ts +0 -87
- package/dist/enumerations/member-error-type.d.ts.map +0 -1
- package/dist/enumerations/member-error-type.js +0 -91
- package/dist/enumerations/member-error-type.js.map +0 -1
- package/dist/enumerations/member-type.d.ts.map +0 -1
- package/dist/enumerations/member-type.js +0 -19
- package/dist/enumerations/member-type.js.map +0 -1
- package/dist/enumerations/password-login-error-type.d.ts +0 -5
- package/dist/enumerations/password-login-error-type.d.ts.map +0 -1
- package/dist/enumerations/password-login-error-type.js +0 -9
- package/dist/enumerations/password-login-error-type.js.map +0 -1
- package/dist/enumerations/pbkdf2-error-type.d.ts +0 -6
- package/dist/enumerations/pbkdf2-error-type.d.ts.map +0 -1
- package/dist/enumerations/pbkdf2-error-type.js +0 -10
- package/dist/enumerations/pbkdf2-error-type.js.map +0 -1
- package/dist/enumerations/pbkdf2-profile.d.ts +0 -6
- package/dist/enumerations/pbkdf2-profile.d.ts.map +0 -1
- package/dist/enumerations/pbkdf2-profile.js +0 -10
- package/dist/enumerations/pbkdf2-profile.js.map +0 -1
- package/dist/enumerations/secure-storage-error-type.d.ts +0 -6
- package/dist/enumerations/secure-storage-error-type.d.ts.map +0 -1
- package/dist/enumerations/secure-storage-error-type.js +0 -10
- package/dist/enumerations/secure-storage-error-type.js.map +0 -1
- package/dist/errors/disposed.d.ts +0 -4
- package/dist/errors/disposed.d.ts.map +0 -1
- package/dist/errors/disposed.js +0 -20
- package/dist/errors/disposed.js.map +0 -1
- package/dist/errors/ecies.d.ts +0 -7
- package/dist/errors/ecies.d.ts.map +0 -1
- package/dist/errors/ecies.js +0 -15
- package/dist/errors/ecies.js.map +0 -1
- package/dist/errors/guid.d.ts +0 -15
- package/dist/errors/guid.d.ts.map +0 -1
- package/dist/errors/guid.js +0 -26
- package/dist/errors/guid.js.map +0 -1
- package/dist/errors/index.d.ts.map +0 -1
- package/dist/errors/index.js +0 -25
- package/dist/errors/index.js.map +0 -1
- package/dist/errors/invalid-email.d.ts +0 -7
- package/dist/errors/invalid-email.d.ts.map +0 -1
- package/dist/errors/invalid-email.js +0 -14
- package/dist/errors/invalid-email.js.map +0 -1
- package/dist/errors/length.d.ts +0 -7
- package/dist/errors/length.d.ts.map +0 -1
- package/dist/errors/length.js +0 -14
- package/dist/errors/length.js.map +0 -1
- package/dist/errors/member.d.ts +0 -7
- package/dist/errors/member.d.ts.map +0 -1
- package/dist/errors/member.js +0 -14
- package/dist/errors/member.js.map +0 -1
- package/dist/errors/pbkdf2.d.ts +0 -7
- package/dist/errors/pbkdf2.d.ts.map +0 -1
- package/dist/errors/pbkdf2.js +0 -14
- package/dist/errors/pbkdf2.js.map +0 -1
- package/dist/errors/secure-storage.d.ts +0 -7
- package/dist/errors/secure-storage.d.ts.map +0 -1
- package/dist/errors/secure-storage.js +0 -15
- package/dist/errors/secure-storage.js.map +0 -1
- package/dist/errors/simple-ecies.d.ts +0 -6
- package/dist/errors/simple-ecies.d.ts.map +0 -1
- package/dist/errors/simple-ecies.js +0 -15
- package/dist/errors/simple-ecies.js.map +0 -1
- package/dist/errors/simple-test-error.d.ts +0 -4
- package/dist/errors/simple-test-error.d.ts.map +0 -1
- package/dist/errors/simple-test-error.js +0 -11
- package/dist/errors/simple-test-error.js.map +0 -1
- package/dist/guid.d.ts +0 -153
- package/dist/guid.d.ts.map +0 -1
- package/dist/guid.js +0 -647
- package/dist/guid.js.map +0 -1
- package/dist/i18n-setup.d.ts +0 -24
- package/dist/i18n-setup.d.ts.map +0 -1
- package/dist/i18n-setup.js +0 -837
- package/dist/i18n-setup.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -32
- package/dist/index.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 -45
- 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-config.d.ts +0 -9
- package/dist/interfaces/ecies-config.d.ts.map +0 -1
- package/dist/interfaces/ecies-config.js +0 -3
- package/dist/interfaces/ecies-config.js.map +0 -1
- package/dist/interfaces/ecies-consts.d.ts +0 -58
- 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/ecies-file-service.d.ts +0 -7
- package/dist/interfaces/ecies-file-service.d.ts.map +0 -1
- package/dist/interfaces/ecies-file-service.js +0 -3
- package/dist/interfaces/ecies-file-service.js.map +0 -1
- package/dist/interfaces/guid.d.ts +0 -45
- package/dist/interfaces/guid.d.ts.map +0 -1
- package/dist/interfaces/guid.js +0 -3
- package/dist/interfaces/guid.js.map +0 -1
- package/dist/interfaces/index.d.ts.map +0 -1
- package/dist/interfaces/index.js +0 -30
- package/dist/interfaces/index.js.map +0 -1
- package/dist/interfaces/library-error.d.ts +0 -23
- package/dist/interfaces/library-error.d.ts.map +0 -1
- package/dist/interfaces/library-error.js +0 -3
- package/dist/interfaces/library-error.js.map +0 -1
- package/dist/interfaces/member-operational.d.ts +0 -40
- 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-storage.d.ts.map +0 -1
- package/dist/interfaces/member-storage.js +0 -3
- package/dist/interfaces/member-storage.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/pbkdf2-config.d.ts +0 -7
- package/dist/interfaces/pbkdf2-config.d.ts.map +0 -1
- package/dist/interfaces/pbkdf2-config.js +0 -3
- package/dist/interfaces/pbkdf2-config.js.map +0 -1
- package/dist/interfaces/pbkdf2-consts.d.ts +0 -9
- package/dist/interfaces/pbkdf2-consts.d.ts.map +0 -1
- package/dist/interfaces/pbkdf2-consts.js +0 -3
- package/dist/interfaces/pbkdf2-consts.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/member.d.ts +0 -66
- package/dist/member.d.ts.map +0 -1
- package/dist/member.js +0 -271
- package/dist/member.js.map +0 -1
- package/dist/pbkdf2-profiles.d.ts.map +0 -1
- package/dist/pbkdf2-profiles.js +0 -3
- package/dist/pbkdf2-profiles.js.map +0 -1
- package/dist/phone-number.d.ts +0 -6
- package/dist/phone-number.d.ts.map +0 -1
- package/dist/phone-number.js +0 -22
- package/dist/phone-number.js.map +0 -1
- package/dist/regexes.d.ts +0 -7
- package/dist/regexes.d.ts.map +0 -1
- package/dist/regexes.js +0 -10
- package/dist/regexes.js.map +0 -1
- package/dist/secure-buffer.d.ts +0 -38
- package/dist/secure-buffer.d.ts.map +0 -1
- package/dist/secure-buffer.js +0 -168
- package/dist/secure-buffer.js.map +0 -1
- package/dist/secure-string.d.ts +0 -39
- package/dist/secure-string.d.ts.map +0 -1
- package/dist/secure-string.js +0 -195
- package/dist/secure-string.js.map +0 -1
- package/dist/services/aes-gcm.d.ts +0 -57
- package/dist/services/aes-gcm.d.ts.map +0 -1
- package/dist/services/aes-gcm.js +0 -111
- package/dist/services/aes-gcm.js.map +0 -1
- package/dist/services/ecies/crypto-core.d.ts +0 -51
- package/dist/services/ecies/crypto-core.d.ts.map +0 -1
- package/dist/services/ecies/crypto-core.js +0 -139
- package/dist/services/ecies/crypto-core.js.map +0 -1
- package/dist/services/ecies/example.d.ts +0 -25
- package/dist/services/ecies/example.d.ts.map +0 -1
- package/dist/services/ecies/example.js +0 -128
- package/dist/services/ecies/example.js.map +0 -1
- package/dist/services/ecies/file.d.ts +0 -18
- package/dist/services/ecies/file.d.ts.map +0 -1
- package/dist/services/ecies/file.js +0 -110
- 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 -57
- package/dist/services/ecies/index.js.map +0 -1
- package/dist/services/ecies/integration.d.ts +0 -59
- package/dist/services/ecies/integration.d.ts.map +0 -1
- package/dist/services/ecies/integration.js +0 -172
- package/dist/services/ecies/integration.js.map +0 -1
- package/dist/services/ecies/interfaces.d.ts +0 -51
- package/dist/services/ecies/interfaces.d.ts.map +0 -1
- package/dist/services/ecies/interfaces.js +0 -6
- package/dist/services/ecies/interfaces.js.map +0 -1
- package/dist/services/ecies/manual-test.d.ts +0 -29
- package/dist/services/ecies/manual-test.d.ts.map +0 -1
- package/dist/services/ecies/manual-test.js +0 -171
- package/dist/services/ecies/manual-test.js.map +0 -1
- package/dist/services/ecies/multi-recipient.d.ts +0 -52
- package/dist/services/ecies/multi-recipient.d.ts.map +0 -1
- package/dist/services/ecies/multi-recipient.js +0 -243
- package/dist/services/ecies/multi-recipient.js.map +0 -1
- package/dist/services/ecies/service.d.ts +0 -104
- package/dist/services/ecies/service.d.ts.map +0 -1
- package/dist/services/ecies/service.js +0 -192
- package/dist/services/ecies/service.js.map +0 -1
- package/dist/services/ecies/signature.d.ts +0 -27
- package/dist/services/ecies/signature.d.ts.map +0 -1
- package/dist/services/ecies/signature.js +0 -76
- package/dist/services/ecies/signature.js.map +0 -1
- package/dist/services/ecies/single-recipient.d.ts +0 -46
- package/dist/services/ecies/single-recipient.d.ts.map +0 -1
- package/dist/services/ecies/single-recipient.js +0 -212
- package/dist/services/ecies/single-recipient.js.map +0 -1
- package/dist/services/index.d.ts.map +0 -1
- package/dist/services/index.js +0 -22
- package/dist/services/index.js.map +0 -1
- package/dist/services/password-login.d.ts +0 -49
- package/dist/services/password-login.d.ts.map +0 -1
- package/dist/services/password-login.js +0 -121
- package/dist/services/password-login.js.map +0 -1
- package/dist/services/pbkdf2.d.ts +0 -56
- package/dist/services/pbkdf2.d.ts.map +0 -1
- package/dist/services/pbkdf2.js +0 -114
- package/dist/services/pbkdf2.js.map +0 -1
- package/dist/services/xor.d.ts +0 -37
- package/dist/services/xor.d.ts.map +0 -1
- package/dist/services/xor.js +0 -67
- package/dist/services/xor.js.map +0 -1
- package/dist/types/deep-partial.d.ts +0 -4
- package/dist/types/deep-partial.d.ts.map +0 -1
- package/dist/types/deep-partial.js +0 -3
- package/dist/types/deep-partial.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 -68
- package/dist/utils.d.ts.map +0 -1
- package/dist/utils.js +0 -288
- package/dist/utils.js.map +0 -1
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration helpers for using the browser ECIES service with existing web-crypto functionality
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { EciesComponentId, getEciesI18nEngine } from '../../i18n-setup';
|
|
6
|
+
import { SecureString } from '../../secure-string';
|
|
7
|
+
import { SignatureUint8Array } from '../../types';
|
|
8
|
+
import {
|
|
9
|
+
hexToUint8Array,
|
|
10
|
+
stringToUint8Array,
|
|
11
|
+
uint8ArrayToHex,
|
|
12
|
+
uint8ArrayToString,
|
|
13
|
+
} from '../../utils';
|
|
14
|
+
import { IWalletSeed } from './interfaces';
|
|
15
|
+
import { ECIESService } from './service';
|
|
16
|
+
import { EciesStringKey } from '../../enumerations';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Enhanced web crypto service that uses the new ECIES implementation
|
|
20
|
+
*/
|
|
21
|
+
export class EnhancedWebCryptoService {
|
|
22
|
+
private ecies: ECIESService;
|
|
23
|
+
|
|
24
|
+
constructor() {
|
|
25
|
+
this.ecies = new ECIESService();
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Derive wallet from mnemonic using the new ECIES service
|
|
30
|
+
* This replaces the existing walletFromMnemonic method with better browser compatibility
|
|
31
|
+
*/
|
|
32
|
+
public async walletFromMnemonic(
|
|
33
|
+
mnemonic: SecureString,
|
|
34
|
+
): Promise<IWalletSeed> {
|
|
35
|
+
const { wallet, seed } = this.ecies.walletAndSeedFromMnemonic(mnemonic);
|
|
36
|
+
return {
|
|
37
|
+
wallet,
|
|
38
|
+
seed,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Decrypt challenge using the new ECIES service
|
|
44
|
+
* This provides better compatibility and error handling than the original implementation
|
|
45
|
+
*/
|
|
46
|
+
public async decryptChallenge(
|
|
47
|
+
encryptedHex: string,
|
|
48
|
+
privateKey: Uint8Array,
|
|
49
|
+
): Promise<Uint8Array> {
|
|
50
|
+
try {
|
|
51
|
+
const encryptedData = hexToUint8Array(encryptedHex);
|
|
52
|
+
|
|
53
|
+
// Try to decrypt using single mode first (most common)
|
|
54
|
+
try {
|
|
55
|
+
return await this.ecies.decryptSimpleOrSingleWithHeader(
|
|
56
|
+
false,
|
|
57
|
+
privateKey,
|
|
58
|
+
encryptedData,
|
|
59
|
+
);
|
|
60
|
+
} catch {
|
|
61
|
+
// Fallback to simple mode
|
|
62
|
+
return await this.ecies.decryptSimpleOrSingleWithHeader(
|
|
63
|
+
true,
|
|
64
|
+
privateKey,
|
|
65
|
+
encryptedData,
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
} catch (error) {
|
|
69
|
+
const engine = getEciesI18nEngine();
|
|
70
|
+
throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_ECIESError_FailedToDecryptChallengeTemplate, { error: String(error) }));
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Encrypt data for a recipient
|
|
76
|
+
*/
|
|
77
|
+
public async encryptForRecipient(
|
|
78
|
+
recipientPublicKey: Uint8Array,
|
|
79
|
+
data: Uint8Array,
|
|
80
|
+
useSimpleMode: boolean = false,
|
|
81
|
+
): Promise<string> {
|
|
82
|
+
const encrypted = await this.ecies.encryptSimpleOrSingle(
|
|
83
|
+
!useSimpleMode,
|
|
84
|
+
recipientPublicKey,
|
|
85
|
+
data,
|
|
86
|
+
);
|
|
87
|
+
return uint8ArrayToHex(encrypted);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Sign data with private key
|
|
92
|
+
*/
|
|
93
|
+
public signData(privateKey: Uint8Array, data: Uint8Array): string {
|
|
94
|
+
const signature = this.ecies.signMessage(privateKey, data);
|
|
95
|
+
return uint8ArrayToHex(signature);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Verify signature
|
|
100
|
+
*/
|
|
101
|
+
public verifySignature(
|
|
102
|
+
publicKey: Uint8Array,
|
|
103
|
+
data: Uint8Array,
|
|
104
|
+
signatureHex: string,
|
|
105
|
+
): boolean {
|
|
106
|
+
const signature = hexToUint8Array(signatureHex) as SignatureUint8Array;
|
|
107
|
+
return this.ecies.verifyMessage(publicKey, data, signature);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Generate new mnemonic
|
|
112
|
+
*/
|
|
113
|
+
public generateMnemonic(): SecureString {
|
|
114
|
+
return this.ecies.generateNewMnemonic();
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Complete client-side challenge verification (enhanced version)
|
|
119
|
+
*/
|
|
120
|
+
public async verifyChallengeResponse(
|
|
121
|
+
encryptedChallenge: string,
|
|
122
|
+
mnemonic: SecureString,
|
|
123
|
+
systemPublicKeyHex: string,
|
|
124
|
+
): Promise<string> {
|
|
125
|
+
// Derive keys from mnemonic
|
|
126
|
+
const { wallet } = await this.walletFromMnemonic(mnemonic);
|
|
127
|
+
|
|
128
|
+
// Decrypt the challenge
|
|
129
|
+
const decryptedPayload = await this.decryptChallenge(
|
|
130
|
+
encryptedChallenge,
|
|
131
|
+
wallet.getPrivateKey(),
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
// Extract nonce and signature (assuming 48 bytes payload + signature)
|
|
135
|
+
const payload = decryptedPayload.slice(0, 48);
|
|
136
|
+
const signature = decryptedPayload.slice(48);
|
|
137
|
+
|
|
138
|
+
// Convert system public key from hex
|
|
139
|
+
const systemPubKey = hexToUint8Array(systemPublicKeyHex);
|
|
140
|
+
|
|
141
|
+
// Verify system signature
|
|
142
|
+
const isValid = this.verifySignature(
|
|
143
|
+
systemPubKey,
|
|
144
|
+
payload,
|
|
145
|
+
uint8ArrayToHex(signature),
|
|
146
|
+
);
|
|
147
|
+
|
|
148
|
+
if (!isValid) {
|
|
149
|
+
const engine = getEciesI18nEngine();
|
|
150
|
+
const error = engine.translate(EciesComponentId, EciesStringKey.Error_ECIESError_InvalidChallengeSignature);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
return uint8ArrayToHex(decryptedPayload);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Migration helper to transition from old WebCryptoService to new ECIES service
|
|
159
|
+
*/
|
|
160
|
+
export class MigrationHelper {
|
|
161
|
+
/**
|
|
162
|
+
* Test compatibility between old and new implementations
|
|
163
|
+
*/
|
|
164
|
+
public static async testCompatibility(mnemonic: SecureString): Promise<{
|
|
165
|
+
compatible: boolean;
|
|
166
|
+
details: {
|
|
167
|
+
mnemonicValid: boolean;
|
|
168
|
+
keysMatch: boolean;
|
|
169
|
+
encryptionWorks: boolean;
|
|
170
|
+
};
|
|
171
|
+
}> {
|
|
172
|
+
try {
|
|
173
|
+
const ecies = new ECIESService();
|
|
174
|
+
const enhanced = new EnhancedWebCryptoService();
|
|
175
|
+
|
|
176
|
+
// Test mnemonic validation
|
|
177
|
+
let mnemonicValid = false;
|
|
178
|
+
try {
|
|
179
|
+
ecies.walletAndSeedFromMnemonic(mnemonic);
|
|
180
|
+
mnemonicValid = true;
|
|
181
|
+
} catch {
|
|
182
|
+
mnemonicValid = false;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// Test key derivation
|
|
186
|
+
let keysMatch = false;
|
|
187
|
+
if (mnemonicValid) {
|
|
188
|
+
try {
|
|
189
|
+
const { wallet: wallet1 } = ecies.walletAndSeedFromMnemonic(mnemonic);
|
|
190
|
+
const { wallet: wallet2 } = await enhanced.walletFromMnemonic(
|
|
191
|
+
mnemonic,
|
|
192
|
+
);
|
|
193
|
+
keysMatch =
|
|
194
|
+
uint8ArrayToHex(wallet1.getPrivateKey()) ===
|
|
195
|
+
uint8ArrayToHex(wallet2.getPrivateKey());
|
|
196
|
+
} catch {
|
|
197
|
+
keysMatch = false;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// Test encryption roundtrip
|
|
202
|
+
let encryptionWorks = false;
|
|
203
|
+
if (keysMatch) {
|
|
204
|
+
try {
|
|
205
|
+
const { wallet } = await enhanced.walletFromMnemonic(mnemonic);
|
|
206
|
+
const testMessage = stringToUint8Array('Test message');
|
|
207
|
+
const encrypted = await enhanced.encryptForRecipient(
|
|
208
|
+
wallet.getPublicKey(),
|
|
209
|
+
testMessage,
|
|
210
|
+
);
|
|
211
|
+
const decrypted = await enhanced.decryptChallenge(
|
|
212
|
+
encrypted,
|
|
213
|
+
wallet.getPrivateKey(),
|
|
214
|
+
);
|
|
215
|
+
encryptionWorks =
|
|
216
|
+
uint8ArrayToString(testMessage) === uint8ArrayToString(decrypted);
|
|
217
|
+
} catch {
|
|
218
|
+
encryptionWorks = false;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
return {
|
|
223
|
+
compatible: mnemonicValid && keysMatch && encryptionWorks,
|
|
224
|
+
details: {
|
|
225
|
+
mnemonicValid,
|
|
226
|
+
keysMatch,
|
|
227
|
+
encryptionWorks,
|
|
228
|
+
},
|
|
229
|
+
};
|
|
230
|
+
} catch {
|
|
231
|
+
return {
|
|
232
|
+
compatible: false,
|
|
233
|
+
details: {
|
|
234
|
+
mnemonicValid: false,
|
|
235
|
+
keysMatch: false,
|
|
236
|
+
encryptionWorks: false,
|
|
237
|
+
},
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser-compatible ECIES interfaces
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { Wallet } from '@ethereumjs/wallet';
|
|
6
|
+
import { EciesEncryptionTypeEnum } from '../../enumerations/ecies-encryption-type';
|
|
7
|
+
|
|
8
|
+
export interface ISimpleKeyPair {
|
|
9
|
+
privateKey: Uint8Array;
|
|
10
|
+
publicKey: Uint8Array;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface IWalletSeed {
|
|
14
|
+
wallet: Wallet;
|
|
15
|
+
seed: Uint8Array;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface ISingleEncryptedParsedHeader {
|
|
19
|
+
encryptionType: EciesEncryptionTypeEnum;
|
|
20
|
+
ephemeralPublicKey: Uint8Array;
|
|
21
|
+
iv: Uint8Array;
|
|
22
|
+
authTag: Uint8Array;
|
|
23
|
+
dataLength: number;
|
|
24
|
+
headerSize: number;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface IEncryptionResult {
|
|
28
|
+
encryptedData: Uint8Array;
|
|
29
|
+
ephemeralPublicKey: Uint8Array;
|
|
30
|
+
iv: Uint8Array;
|
|
31
|
+
authTag: Uint8Array;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface IDecryptionResult {
|
|
35
|
+
decrypted: Uint8Array;
|
|
36
|
+
consumedBytes: number;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface IMultiRecipient {
|
|
40
|
+
id: Uint8Array; // 16-byte ObjectId
|
|
41
|
+
publicKey: Uint8Array;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export interface IMultiEncryptedMessage {
|
|
45
|
+
dataLength: number;
|
|
46
|
+
recipientCount: number;
|
|
47
|
+
recipientIds: Uint8Array[];
|
|
48
|
+
recipientKeys: Uint8Array[];
|
|
49
|
+
encryptedMessage: Uint8Array;
|
|
50
|
+
headerSize: number;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export interface IMultiEncryptedParsedHeader {
|
|
54
|
+
dataLength: number;
|
|
55
|
+
recipientCount: number;
|
|
56
|
+
recipientIds: Uint8Array[];
|
|
57
|
+
recipientKeys: Uint8Array[];
|
|
58
|
+
headerSize: number;
|
|
59
|
+
}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple integration tests for the browser ECIES service
|
|
3
|
+
* These tests can be run in the browser console to verify functionality
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { SecureString } from '../../secure-string';
|
|
7
|
+
import {
|
|
8
|
+
stringToUint8Array,
|
|
9
|
+
uint8ArrayToHex,
|
|
10
|
+
uint8ArrayToString,
|
|
11
|
+
} from '../../utils';
|
|
12
|
+
import { ECIESService } from './service';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Test basic encryption/decryption roundtrip
|
|
16
|
+
*/
|
|
17
|
+
export async function testBasicEncryption(): Promise<boolean> {
|
|
18
|
+
try {
|
|
19
|
+
const ecies = new ECIESService();
|
|
20
|
+
const mnemonic = ecies.generateNewMnemonic();
|
|
21
|
+
const { privateKey, publicKey } = ecies.mnemonicToSimpleKeyPair(mnemonic);
|
|
22
|
+
|
|
23
|
+
const message = stringToUint8Array('Test message');
|
|
24
|
+
const encrypted = await ecies.encryptSimpleOrSingle(
|
|
25
|
+
false,
|
|
26
|
+
publicKey,
|
|
27
|
+
message,
|
|
28
|
+
);
|
|
29
|
+
const decrypted = await ecies.decryptSimpleOrSingleWithHeader(
|
|
30
|
+
false,
|
|
31
|
+
privateKey,
|
|
32
|
+
encrypted,
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
return uint8ArrayToString(message) === uint8ArrayToString(decrypted);
|
|
36
|
+
} catch (error) {
|
|
37
|
+
console.error('Basic encryption test failed:', error);
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Test simple mode encryption
|
|
44
|
+
*/
|
|
45
|
+
export async function testSimpleEncryption(): Promise<boolean> {
|
|
46
|
+
try {
|
|
47
|
+
const ecies = new ECIESService();
|
|
48
|
+
const mnemonic = ecies.generateNewMnemonic();
|
|
49
|
+
const { privateKey, publicKey } = ecies.mnemonicToSimpleKeyPair(mnemonic);
|
|
50
|
+
|
|
51
|
+
const message = stringToUint8Array('Simple test message');
|
|
52
|
+
const encrypted = await ecies.encryptSimpleOrSingle(
|
|
53
|
+
true,
|
|
54
|
+
publicKey,
|
|
55
|
+
message,
|
|
56
|
+
);
|
|
57
|
+
const decrypted = await ecies.decryptSimpleOrSingleWithHeader(
|
|
58
|
+
true,
|
|
59
|
+
privateKey,
|
|
60
|
+
encrypted,
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
return uint8ArrayToString(message) === uint8ArrayToString(decrypted);
|
|
64
|
+
} catch (error) {
|
|
65
|
+
console.error('Simple encryption test failed:', error);
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Test signature operations
|
|
72
|
+
*/
|
|
73
|
+
export async function testSignatures(): Promise<boolean> {
|
|
74
|
+
try {
|
|
75
|
+
const ecies = new ECIESService();
|
|
76
|
+
const mnemonic = ecies.generateNewMnemonic();
|
|
77
|
+
const { privateKey, publicKey } = ecies.mnemonicToSimpleKeyPair(mnemonic);
|
|
78
|
+
|
|
79
|
+
const message = stringToUint8Array('Message to sign');
|
|
80
|
+
const signature = ecies.signMessage(privateKey, message);
|
|
81
|
+
const isValid = ecies.verifyMessage(publicKey, message, signature);
|
|
82
|
+
|
|
83
|
+
// Test with wrong message
|
|
84
|
+
const wrongMessage = stringToUint8Array('Wrong message');
|
|
85
|
+
const isInvalid = ecies.verifyMessage(publicKey, wrongMessage, signature);
|
|
86
|
+
|
|
87
|
+
return isValid && !isInvalid;
|
|
88
|
+
} catch (error) {
|
|
89
|
+
console.error('Signature test failed:', error);
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Test mnemonic validation
|
|
96
|
+
*/
|
|
97
|
+
export async function testMnemonicValidation(): Promise<boolean> {
|
|
98
|
+
try {
|
|
99
|
+
const ecies = new ECIESService();
|
|
100
|
+
|
|
101
|
+
// Test valid mnemonic
|
|
102
|
+
const validMnemonic = new SecureString(
|
|
103
|
+
'abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about',
|
|
104
|
+
);
|
|
105
|
+
const { wallet: wallet1 } = ecies.walletAndSeedFromMnemonic(validMnemonic);
|
|
106
|
+
const { wallet: wallet2 } = ecies.walletAndSeedFromMnemonic(validMnemonic);
|
|
107
|
+
|
|
108
|
+
// Should produce same keys
|
|
109
|
+
const sameKeys =
|
|
110
|
+
uint8ArrayToHex(wallet1.getPrivateKey()) ===
|
|
111
|
+
uint8ArrayToHex(wallet2.getPrivateKey());
|
|
112
|
+
|
|
113
|
+
// Test invalid mnemonic
|
|
114
|
+
try {
|
|
115
|
+
ecies.walletAndSeedFromMnemonic(
|
|
116
|
+
new SecureString('invalid mnemonic phrase'),
|
|
117
|
+
);
|
|
118
|
+
return false; // Should have thrown
|
|
119
|
+
} catch {
|
|
120
|
+
return sameKeys; // Expected to throw
|
|
121
|
+
}
|
|
122
|
+
} catch (error) {
|
|
123
|
+
console.error('Mnemonic validation test failed:', error);
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Test cross-party encryption (Alice encrypts for Bob)
|
|
130
|
+
*/
|
|
131
|
+
export async function testCrossPartyEncryption(): Promise<boolean> {
|
|
132
|
+
try {
|
|
133
|
+
const ecies = new ECIESService();
|
|
134
|
+
|
|
135
|
+
// Alice generates her keys
|
|
136
|
+
const aliceMnemonic = ecies.generateNewMnemonic();
|
|
137
|
+
const aliceKeys = ecies.mnemonicToSimpleKeyPair(aliceMnemonic);
|
|
138
|
+
|
|
139
|
+
// Bob generates his keys
|
|
140
|
+
const bobMnemonic = ecies.generateNewMnemonic();
|
|
141
|
+
const bobKeys = ecies.mnemonicToSimpleKeyPair(bobMnemonic);
|
|
142
|
+
|
|
143
|
+
// Alice encrypts a message for Bob
|
|
144
|
+
const message = stringToUint8Array('Secret message from Alice to Bob');
|
|
145
|
+
const encrypted = await ecies.encryptSimpleOrSingle(
|
|
146
|
+
false,
|
|
147
|
+
bobKeys.publicKey,
|
|
148
|
+
message,
|
|
149
|
+
);
|
|
150
|
+
|
|
151
|
+
// Bob decrypts the message
|
|
152
|
+
const decrypted = await ecies.decryptSimpleOrSingleWithHeader(
|
|
153
|
+
false,
|
|
154
|
+
bobKeys.privateKey,
|
|
155
|
+
encrypted,
|
|
156
|
+
);
|
|
157
|
+
|
|
158
|
+
// Alice should not be able to decrypt (wrong private key)
|
|
159
|
+
try {
|
|
160
|
+
await ecies.decryptSimpleOrSingleWithHeader(
|
|
161
|
+
false,
|
|
162
|
+
aliceKeys.privateKey,
|
|
163
|
+
encrypted,
|
|
164
|
+
);
|
|
165
|
+
return false; // Should have failed
|
|
166
|
+
} catch {
|
|
167
|
+
// Expected to fail
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
return uint8ArrayToString(message) === uint8ArrayToString(decrypted);
|
|
171
|
+
} catch (error) {
|
|
172
|
+
console.error('Cross-party encryption test failed:', error);
|
|
173
|
+
return false;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Run all tests
|
|
179
|
+
*/
|
|
180
|
+
export async function runAllTests(): Promise<void> {
|
|
181
|
+
console.log('Running browser ECIES service tests...\n');
|
|
182
|
+
|
|
183
|
+
const tests = [
|
|
184
|
+
{ name: 'Basic Encryption', test: testBasicEncryption },
|
|
185
|
+
{ name: 'Simple Encryption', test: testSimpleEncryption },
|
|
186
|
+
{ name: 'Digital Signatures', test: testSignatures },
|
|
187
|
+
{ name: 'Mnemonic Validation', test: testMnemonicValidation },
|
|
188
|
+
{ name: 'Cross-Party Encryption', test: testCrossPartyEncryption },
|
|
189
|
+
];
|
|
190
|
+
|
|
191
|
+
let passed = 0;
|
|
192
|
+
let failed = 0;
|
|
193
|
+
|
|
194
|
+
for (const { name, test } of tests) {
|
|
195
|
+
try {
|
|
196
|
+
const result = await test();
|
|
197
|
+
if (result) {
|
|
198
|
+
console.log(`✅ ${name}: PASSED`);
|
|
199
|
+
passed++;
|
|
200
|
+
} else {
|
|
201
|
+
console.log(`❌ ${name}: FAILED`);
|
|
202
|
+
failed++;
|
|
203
|
+
}
|
|
204
|
+
} catch (error) {
|
|
205
|
+
console.log(`❌ ${name}: ERROR - ${error}`);
|
|
206
|
+
failed++;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
console.log(`\nTest Results: ${passed} passed, ${failed} failed`);
|
|
211
|
+
|
|
212
|
+
if (failed === 0) {
|
|
213
|
+
console.log(
|
|
214
|
+
'🎉 All tests passed! The browser ECIES service is working correctly.',
|
|
215
|
+
);
|
|
216
|
+
} else {
|
|
217
|
+
console.log('⚠️ Some tests failed. Please check the implementation.');
|
|
218
|
+
}
|
|
219
|
+
}
|