@digitaldefiance/ecies-lib 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +237 -0
- package/dist/backup-code-string.d.ts +26 -0
- package/dist/backup-code-string.d.ts.map +1 -0
- package/dist/backup-code-string.js +69 -0
- package/dist/backup-code-string.js.map +1 -0
- package/dist/constants.d.ts +22 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +177 -0
- package/dist/constants.js.map +1 -0
- package/dist/email-string.d.ts +42 -0
- package/dist/email-string.d.ts.map +1 -0
- package/dist/email-string.js +67 -0
- package/dist/email-string.js.map +1 -0
- package/dist/enumerations/ecies-encryption-type.d.ts +15 -0
- package/dist/enumerations/ecies-encryption-type.d.ts.map +1 -0
- package/dist/enumerations/ecies-encryption-type.js +63 -0
- package/dist/enumerations/ecies-encryption-type.js.map +1 -0
- package/dist/enumerations/ecies-error-type.d.ts +32 -0
- package/dist/enumerations/ecies-error-type.d.ts.map +1 -0
- package/dist/enumerations/ecies-error-type.js +33 -0
- package/dist/enumerations/ecies-error-type.js.map +1 -0
- package/dist/enumerations/guid-brand-type.d.ts +27 -0
- package/dist/enumerations/guid-brand-type.d.ts.map +1 -0
- package/dist/enumerations/guid-brand-type.js +28 -0
- package/dist/enumerations/guid-brand-type.js.map +1 -0
- package/dist/enumerations/guid-error-type.d.ts +7 -0
- package/dist/enumerations/guid-error-type.d.ts.map +1 -0
- package/dist/enumerations/guid-error-type.js +8 -0
- package/dist/enumerations/guid-error-type.js.map +1 -0
- package/dist/enumerations/index.d.ts +13 -0
- package/dist/enumerations/index.d.ts.map +1 -0
- package/dist/enumerations/index.js +13 -0
- package/dist/enumerations/index.js.map +1 -0
- package/dist/enumerations/invalid-email-type.d.ts +6 -0
- package/dist/enumerations/invalid-email-type.d.ts.map +1 -0
- package/dist/enumerations/invalid-email-type.js +7 -0
- package/dist/enumerations/invalid-email-type.js.map +1 -0
- package/dist/enumerations/length-encoding-type.d.ts +7 -0
- package/dist/enumerations/length-encoding-type.d.ts.map +1 -0
- package/dist/enumerations/length-encoding-type.js +8 -0
- package/dist/enumerations/length-encoding-type.js.map +1 -0
- package/dist/enumerations/length-error-type.d.ts +6 -0
- package/dist/enumerations/length-error-type.d.ts.map +1 -0
- package/dist/enumerations/length-error-type.js +7 -0
- package/dist/enumerations/length-error-type.js.map +1 -0
- package/dist/enumerations/member-error-type.d.ts +87 -0
- package/dist/enumerations/member-error-type.d.ts.map +1 -0
- package/dist/enumerations/member-error-type.js +88 -0
- package/dist/enumerations/member-error-type.js.map +1 -0
- package/dist/enumerations/member-type.d.ts +16 -0
- package/dist/enumerations/member-type.d.ts.map +1 -0
- package/dist/enumerations/member-type.js +17 -0
- package/dist/enumerations/member-type.js.map +1 -0
- package/dist/enumerations/pbkdf2-error-type.d.ts +5 -0
- package/dist/enumerations/pbkdf2-error-type.d.ts.map +1 -0
- package/dist/enumerations/pbkdf2-error-type.js +6 -0
- package/dist/enumerations/pbkdf2-error-type.js.map +1 -0
- package/dist/enumerations/pbkdf2-profile.d.ts +5 -0
- package/dist/enumerations/pbkdf2-profile.d.ts.map +1 -0
- package/dist/enumerations/pbkdf2-profile.js +6 -0
- package/dist/enumerations/pbkdf2-profile.js.map +1 -0
- package/dist/enumerations/secure-storage-error-type.d.ts +6 -0
- package/dist/enumerations/secure-storage-error-type.d.ts.map +1 -0
- package/dist/enumerations/secure-storage-error-type.js +7 -0
- package/dist/enumerations/secure-storage-error-type.js.map +1 -0
- package/dist/errors/disposed.d.ts +4 -0
- package/dist/errors/disposed.d.ts.map +1 -0
- package/dist/errors/disposed.js +8 -0
- package/dist/errors/disposed.js.map +1 -0
- package/dist/errors/ecies.d.ts +6 -0
- package/dist/errors/ecies.d.ts.map +1 -0
- package/dist/errors/ecies.js +8 -0
- package/dist/errors/ecies.js.map +1 -0
- package/dist/errors/guid.d.ts +14 -0
- package/dist/errors/guid.d.ts.map +1 -0
- package/dist/errors/guid.js +19 -0
- package/dist/errors/guid.js.map +1 -0
- package/dist/errors/index.d.ts +9 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +9 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/invalid-backup-code.d.ts +4 -0
- package/dist/errors/invalid-backup-code.d.ts.map +1 -0
- package/dist/errors/invalid-backup-code.js +7 -0
- package/dist/errors/invalid-backup-code.js.map +1 -0
- package/dist/errors/invalid-email.d.ts +6 -0
- package/dist/errors/invalid-email.d.ts.map +1 -0
- package/dist/errors/invalid-email.js +9 -0
- package/dist/errors/invalid-email.js.map +1 -0
- package/dist/errors/length.d.ts +6 -0
- package/dist/errors/length.d.ts.map +1 -0
- package/dist/errors/length.js +9 -0
- package/dist/errors/length.js.map +1 -0
- package/dist/errors/member.d.ts +6 -0
- package/dist/errors/member.d.ts.map +1 -0
- package/dist/errors/member.js +8 -0
- package/dist/errors/member.js.map +1 -0
- package/dist/errors/pbkdf2.d.ts +6 -0
- package/dist/errors/pbkdf2.d.ts.map +1 -0
- package/dist/errors/pbkdf2.js +8 -0
- package/dist/errors/pbkdf2.js.map +1 -0
- package/dist/errors/secure-storage.d.ts +6 -0
- package/dist/errors/secure-storage.d.ts.map +1 -0
- package/dist/errors/secure-storage.js +8 -0
- package/dist/errors/secure-storage.js.map +1 -0
- package/dist/errors/typed.d.ts +5 -0
- package/dist/errors/typed.d.ts.map +1 -0
- package/dist/errors/typed.js +11 -0
- package/dist/errors/typed.js.map +1 -0
- package/dist/guid.d.ts +153 -0
- package/dist/guid.d.ts.map +1 -0
- package/dist/guid.js +604 -0
- package/dist/guid.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/backup-code-consts.d.ts +16 -0
- package/dist/interfaces/backup-code-consts.d.ts.map +1 -0
- package/dist/interfaces/backup-code-consts.js +2 -0
- package/dist/interfaces/backup-code-consts.js.map +1 -0
- package/dist/interfaces/backup-code.d.ts +7 -0
- package/dist/interfaces/backup-code.d.ts.map +1 -0
- package/dist/interfaces/backup-code.js +2 -0
- package/dist/interfaces/backup-code.js.map +1 -0
- package/dist/interfaces/constants.d.ts +45 -0
- package/dist/interfaces/constants.d.ts.map +1 -0
- package/dist/interfaces/constants.js +2 -0
- package/dist/interfaces/constants.js.map +1 -0
- package/dist/interfaces/ecies-config.d.ts +9 -0
- package/dist/interfaces/ecies-config.d.ts.map +1 -0
- package/dist/interfaces/ecies-config.js +2 -0
- package/dist/interfaces/ecies-config.js.map +1 -0
- package/dist/interfaces/ecies-consts.d.ts +58 -0
- package/dist/interfaces/ecies-consts.d.ts.map +1 -0
- package/dist/interfaces/ecies-consts.js +2 -0
- package/dist/interfaces/ecies-consts.js.map +1 -0
- package/dist/interfaces/ecies-file-service.d.ts +7 -0
- package/dist/interfaces/ecies-file-service.d.ts.map +1 -0
- package/dist/interfaces/ecies-file-service.js +2 -0
- package/dist/interfaces/ecies-file-service.js.map +1 -0
- package/dist/interfaces/guid.d.ts +45 -0
- package/dist/interfaces/guid.d.ts.map +1 -0
- package/dist/interfaces/guid.js +2 -0
- package/dist/interfaces/guid.js.map +1 -0
- package/dist/interfaces/index.d.ts +14 -0
- package/dist/interfaces/index.d.ts.map +1 -0
- package/dist/interfaces/index.js +14 -0
- package/dist/interfaces/index.js.map +1 -0
- package/dist/interfaces/member-operational.d.ts +39 -0
- package/dist/interfaces/member-operational.d.ts.map +1 -0
- package/dist/interfaces/member-operational.js +2 -0
- package/dist/interfaces/member-operational.js.map +1 -0
- package/dist/interfaces/member-storage.d.ts +21 -0
- package/dist/interfaces/member-storage.d.ts.map +1 -0
- package/dist/interfaces/member-storage.js +2 -0
- package/dist/interfaces/member-storage.js.map +1 -0
- package/dist/interfaces/member-with-mnemonic.d.ts +7 -0
- package/dist/interfaces/member-with-mnemonic.d.ts.map +1 -0
- package/dist/interfaces/member-with-mnemonic.js +2 -0
- package/dist/interfaces/member-with-mnemonic.js.map +1 -0
- package/dist/interfaces/pbkdf2-config.d.ts +7 -0
- package/dist/interfaces/pbkdf2-config.d.ts.map +1 -0
- package/dist/interfaces/pbkdf2-config.js +2 -0
- package/dist/interfaces/pbkdf2-config.js.map +1 -0
- package/dist/interfaces/pbkdf2-consts.d.ts +9 -0
- package/dist/interfaces/pbkdf2-consts.d.ts.map +1 -0
- package/dist/interfaces/pbkdf2-consts.js +2 -0
- package/dist/interfaces/pbkdf2-consts.js.map +1 -0
- package/dist/interfaces/pbkdf2-result.d.ts +6 -0
- package/dist/interfaces/pbkdf2-result.d.ts.map +1 -0
- package/dist/interfaces/pbkdf2-result.js +2 -0
- package/dist/interfaces/pbkdf2-result.js.map +1 -0
- package/dist/member.d.ts +68 -0
- package/dist/member.d.ts.map +1 -0
- package/dist/member.js +256 -0
- package/dist/member.js.map +1 -0
- package/dist/pbkdf2-profiles.d.ts +6 -0
- package/dist/pbkdf2-profiles.d.ts.map +1 -0
- package/dist/pbkdf2-profiles.js +2 -0
- package/dist/pbkdf2-profiles.js.map +1 -0
- package/dist/secure-buffer.d.ts +38 -0
- package/dist/secure-buffer.d.ts.map +1 -0
- package/dist/secure-buffer.js +161 -0
- package/dist/secure-buffer.js.map +1 -0
- package/dist/secure-string.d.ts +39 -0
- package/dist/secure-string.d.ts.map +1 -0
- package/dist/secure-string.js +188 -0
- package/dist/secure-string.js.map +1 -0
- package/dist/services/aes-gcm.d.ts +56 -0
- package/dist/services/aes-gcm.d.ts.map +1 -0
- package/dist/services/aes-gcm.js +101 -0
- package/dist/services/aes-gcm.js.map +1 -0
- package/dist/services/ecies/crypto-core.d.ts +53 -0
- package/dist/services/ecies/crypto-core.d.ts.map +1 -0
- package/dist/services/ecies/crypto-core.js +158 -0
- package/dist/services/ecies/crypto-core.js.map +1 -0
- package/dist/services/ecies/example.d.ts +25 -0
- package/dist/services/ecies/example.d.ts.map +1 -0
- package/dist/services/ecies/example.js +121 -0
- package/dist/services/ecies/example.js.map +1 -0
- package/dist/services/ecies/file.d.ts +18 -0
- package/dist/services/ecies/file.d.ts.map +1 -0
- package/dist/services/ecies/file.js +106 -0
- package/dist/services/ecies/file.js.map +1 -0
- package/dist/services/ecies/index.d.ts +38 -0
- package/dist/services/ecies/index.d.ts.map +1 -0
- package/dist/services/ecies/index.js +39 -0
- package/dist/services/ecies/index.js.map +1 -0
- package/dist/services/ecies/integration.d.ts +59 -0
- package/dist/services/ecies/integration.d.ts.map +1 -0
- package/dist/services/ecies/integration.js +163 -0
- package/dist/services/ecies/integration.js.map +1 -0
- package/dist/services/ecies/interfaces.d.ts +51 -0
- package/dist/services/ecies/interfaces.d.ts.map +1 -0
- package/dist/services/ecies/interfaces.js +5 -0
- package/dist/services/ecies/interfaces.js.map +1 -0
- package/dist/services/ecies/manual-test.d.ts +29 -0
- package/dist/services/ecies/manual-test.d.ts.map +1 -0
- package/dist/services/ecies/manual-test.js +163 -0
- package/dist/services/ecies/manual-test.js.map +1 -0
- package/dist/services/ecies/multi-recipient.d.ts +49 -0
- package/dist/services/ecies/multi-recipient.d.ts.map +1 -0
- package/dist/services/ecies/multi-recipient.js +222 -0
- package/dist/services/ecies/multi-recipient.js.map +1 -0
- package/dist/services/ecies/service.d.ts +100 -0
- package/dist/services/ecies/service.d.ts.map +1 -0
- package/dist/services/ecies/service.js +186 -0
- package/dist/services/ecies/service.js.map +1 -0
- package/dist/services/ecies/signature.d.ts +27 -0
- package/dist/services/ecies/signature.d.ts.map +1 -0
- package/dist/services/ecies/signature.js +72 -0
- package/dist/services/ecies/signature.js.map +1 -0
- package/dist/services/ecies/single-recipient.d.ts +43 -0
- package/dist/services/ecies/single-recipient.d.ts.map +1 -0
- package/dist/services/ecies/single-recipient.js +196 -0
- package/dist/services/ecies/single-recipient.js.map +1 -0
- package/dist/services/index.d.ts +5 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +5 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/password-login.d.ts +41 -0
- package/dist/services/password-login.d.ts.map +1 -0
- package/dist/services/password-login.js +96 -0
- package/dist/services/password-login.js.map +1 -0
- package/dist/services/pbkdf2.d.ts +49 -0
- package/dist/services/pbkdf2.d.ts.map +1 -0
- package/dist/services/pbkdf2.js +97 -0
- package/dist/services/pbkdf2.js.map +1 -0
- package/dist/services/xor.d.ts +37 -0
- package/dist/services/xor.d.ts.map +1 -0
- package/dist/services/xor.js +63 -0
- package/dist/services/xor.js.map +1 -0
- package/dist/types.d.ts +29 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +62 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +244 -0
- package/dist/utils.js.map +1 -0
- package/dist/xor.d.ts +37 -0
- package/dist/xor.d.ts.map +1 -0
- package/dist/xor.js +63 -0
- package/dist/xor.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../../src/services/ecies/interfaces.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,29 @@
|
|
|
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
|
+
* Test basic encryption/decryption roundtrip
|
|
7
|
+
*/
|
|
8
|
+
export declare function testBasicEncryption(): Promise<boolean>;
|
|
9
|
+
/**
|
|
10
|
+
* Test simple mode encryption
|
|
11
|
+
*/
|
|
12
|
+
export declare function testSimpleEncryption(): Promise<boolean>;
|
|
13
|
+
/**
|
|
14
|
+
* Test signature operations
|
|
15
|
+
*/
|
|
16
|
+
export declare function testSignatures(): Promise<boolean>;
|
|
17
|
+
/**
|
|
18
|
+
* Test mnemonic validation
|
|
19
|
+
*/
|
|
20
|
+
export declare function testMnemonicValidation(): Promise<boolean>;
|
|
21
|
+
/**
|
|
22
|
+
* Test cross-party encryption (Alice encrypts for Bob)
|
|
23
|
+
*/
|
|
24
|
+
export declare function testCrossPartyEncryption(): Promise<boolean>;
|
|
25
|
+
/**
|
|
26
|
+
* Run all tests
|
|
27
|
+
*/
|
|
28
|
+
export declare function runAllTests(): Promise<void>;
|
|
29
|
+
//# sourceMappingURL=manual-test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manual-test.d.ts","sourceRoot":"","sources":["../../../src/services/ecies/manual-test.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC,CAuB5D;AAED;;GAEG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC,CAuB7D;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAmBvD;AAED;;GAEG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,OAAO,CAAC,CA6B/D;AAED;;GAEG;AACH,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,OAAO,CAAC,CA4CjE;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAuCjD"}
|
|
@@ -0,0 +1,163 @@
|
|
|
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
|
+
import { SecureString } from '../../secure-string';
|
|
6
|
+
import { stringToUint8Array, uint8ArrayToHex, uint8ArrayToString, } from '../../utils';
|
|
7
|
+
import { ECIESService } from './service';
|
|
8
|
+
/**
|
|
9
|
+
* Test basic encryption/decryption roundtrip
|
|
10
|
+
*/
|
|
11
|
+
export async function testBasicEncryption() {
|
|
12
|
+
try {
|
|
13
|
+
const ecies = new ECIESService();
|
|
14
|
+
const mnemonic = ecies.generateNewMnemonic();
|
|
15
|
+
const { privateKey, publicKey } = ecies.mnemonicToSimpleKeyPair(mnemonic);
|
|
16
|
+
const message = stringToUint8Array('Test message');
|
|
17
|
+
const encrypted = await ecies.encryptSimpleOrSingle(false, publicKey, message);
|
|
18
|
+
const decrypted = await ecies.decryptSimpleOrSingleWithHeader(false, privateKey, encrypted);
|
|
19
|
+
return uint8ArrayToString(message) === uint8ArrayToString(decrypted);
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
console.error('Basic encryption test failed:', error);
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Test simple mode encryption
|
|
28
|
+
*/
|
|
29
|
+
export async function testSimpleEncryption() {
|
|
30
|
+
try {
|
|
31
|
+
const ecies = new ECIESService();
|
|
32
|
+
const mnemonic = ecies.generateNewMnemonic();
|
|
33
|
+
const { privateKey, publicKey } = ecies.mnemonicToSimpleKeyPair(mnemonic);
|
|
34
|
+
const message = stringToUint8Array('Simple test message');
|
|
35
|
+
const encrypted = await ecies.encryptSimpleOrSingle(true, publicKey, message);
|
|
36
|
+
const decrypted = await ecies.decryptSimpleOrSingleWithHeader(true, privateKey, encrypted);
|
|
37
|
+
return uint8ArrayToString(message) === uint8ArrayToString(decrypted);
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
console.error('Simple encryption test failed:', error);
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Test signature operations
|
|
46
|
+
*/
|
|
47
|
+
export async function testSignatures() {
|
|
48
|
+
try {
|
|
49
|
+
const ecies = new ECIESService();
|
|
50
|
+
const mnemonic = ecies.generateNewMnemonic();
|
|
51
|
+
const { privateKey, publicKey } = ecies.mnemonicToSimpleKeyPair(mnemonic);
|
|
52
|
+
const message = stringToUint8Array('Message to sign');
|
|
53
|
+
const signature = ecies.signMessage(privateKey, message);
|
|
54
|
+
const isValid = ecies.verifyMessage(publicKey, message, signature);
|
|
55
|
+
// Test with wrong message
|
|
56
|
+
const wrongMessage = stringToUint8Array('Wrong message');
|
|
57
|
+
const isInvalid = ecies.verifyMessage(publicKey, wrongMessage, signature);
|
|
58
|
+
return isValid && !isInvalid;
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
console.error('Signature test failed:', error);
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Test mnemonic validation
|
|
67
|
+
*/
|
|
68
|
+
export async function testMnemonicValidation() {
|
|
69
|
+
try {
|
|
70
|
+
const ecies = new ECIESService();
|
|
71
|
+
// Test valid mnemonic
|
|
72
|
+
const validMnemonic = new SecureString('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
|
|
73
|
+
const { wallet: wallet1 } = ecies.walletAndSeedFromMnemonic(validMnemonic);
|
|
74
|
+
const { wallet: wallet2 } = ecies.walletAndSeedFromMnemonic(validMnemonic);
|
|
75
|
+
// Should produce same keys
|
|
76
|
+
const sameKeys = uint8ArrayToHex(wallet1.getPrivateKey()) ===
|
|
77
|
+
uint8ArrayToHex(wallet2.getPrivateKey());
|
|
78
|
+
// Test invalid mnemonic
|
|
79
|
+
try {
|
|
80
|
+
ecies.walletAndSeedFromMnemonic(new SecureString('invalid mnemonic phrase'));
|
|
81
|
+
return false; // Should have thrown
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return sameKeys; // Expected to throw
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
console.error('Mnemonic validation test failed:', error);
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Test cross-party encryption (Alice encrypts for Bob)
|
|
94
|
+
*/
|
|
95
|
+
export async function testCrossPartyEncryption() {
|
|
96
|
+
try {
|
|
97
|
+
const ecies = new ECIESService();
|
|
98
|
+
// Alice generates her keys
|
|
99
|
+
const aliceMnemonic = ecies.generateNewMnemonic();
|
|
100
|
+
const aliceKeys = ecies.mnemonicToSimpleKeyPair(aliceMnemonic);
|
|
101
|
+
// Bob generates his keys
|
|
102
|
+
const bobMnemonic = ecies.generateNewMnemonic();
|
|
103
|
+
const bobKeys = ecies.mnemonicToSimpleKeyPair(bobMnemonic);
|
|
104
|
+
// Alice encrypts a message for Bob
|
|
105
|
+
const message = stringToUint8Array('Secret message from Alice to Bob');
|
|
106
|
+
const encrypted = await ecies.encryptSimpleOrSingle(false, bobKeys.publicKey, message);
|
|
107
|
+
// Bob decrypts the message
|
|
108
|
+
const decrypted = await ecies.decryptSimpleOrSingleWithHeader(false, bobKeys.privateKey, encrypted);
|
|
109
|
+
// Alice should not be able to decrypt (wrong private key)
|
|
110
|
+
try {
|
|
111
|
+
await ecies.decryptSimpleOrSingleWithHeader(false, aliceKeys.privateKey, encrypted);
|
|
112
|
+
return false; // Should have failed
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
// Expected to fail
|
|
116
|
+
}
|
|
117
|
+
return uint8ArrayToString(message) === uint8ArrayToString(decrypted);
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
console.error('Cross-party encryption test failed:', error);
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Run all tests
|
|
126
|
+
*/
|
|
127
|
+
export async function runAllTests() {
|
|
128
|
+
console.log('Running browser ECIES service tests...\n');
|
|
129
|
+
const tests = [
|
|
130
|
+
{ name: 'Basic Encryption', test: testBasicEncryption },
|
|
131
|
+
{ name: 'Simple Encryption', test: testSimpleEncryption },
|
|
132
|
+
{ name: 'Digital Signatures', test: testSignatures },
|
|
133
|
+
{ name: 'Mnemonic Validation', test: testMnemonicValidation },
|
|
134
|
+
{ name: 'Cross-Party Encryption', test: testCrossPartyEncryption },
|
|
135
|
+
];
|
|
136
|
+
let passed = 0;
|
|
137
|
+
let failed = 0;
|
|
138
|
+
for (const { name, test } of tests) {
|
|
139
|
+
try {
|
|
140
|
+
const result = await test();
|
|
141
|
+
if (result) {
|
|
142
|
+
console.log(`✅ ${name}: PASSED`);
|
|
143
|
+
passed++;
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
console.log(`❌ ${name}: FAILED`);
|
|
147
|
+
failed++;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
console.log(`❌ ${name}: ERROR - ${error}`);
|
|
152
|
+
failed++;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
console.log(`\nTest Results: ${passed} passed, ${failed} failed`);
|
|
156
|
+
if (failed === 0) {
|
|
157
|
+
console.log('🎉 All tests passed! The browser ECIES service is working correctly.');
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
console.log('⚠️ Some tests failed. Please check the implementation.');
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=manual-test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manual-test.js","sourceRoot":"","sources":["../../../src/services/ecies/manual-test.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,kBAAkB,GACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,YAAY,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,KAAK,CAAC,mBAAmB,EAAE,CAAC;QAC7C,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;QAE1E,MAAM,OAAO,GAAG,kBAAkB,CAAC,cAAc,CAAC,CAAC;QACnD,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,qBAAqB,CACjD,KAAK,EACL,SAAS,EACT,OAAO,CACR,CAAC;QACF,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,+BAA+B,CAC3D,KAAK,EACL,UAAU,EACV,SAAS,CACV,CAAC;QAEF,OAAO,kBAAkB,CAAC,OAAO,CAAC,KAAK,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACvE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;QACtD,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,YAAY,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,KAAK,CAAC,mBAAmB,EAAE,CAAC;QAC7C,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;QAE1E,MAAM,OAAO,GAAG,kBAAkB,CAAC,qBAAqB,CAAC,CAAC;QAC1D,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,qBAAqB,CACjD,IAAI,EACJ,SAAS,EACT,OAAO,CACR,CAAC;QACF,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,+BAA+B,CAC3D,IAAI,EACJ,UAAU,EACV,SAAS,CACV,CAAC;QAEF,OAAO,kBAAkB,CAAC,OAAO,CAAC,KAAK,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACvE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;QACvD,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,YAAY,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,KAAK,CAAC,mBAAmB,EAAE,CAAC;QAC7C,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;QAE1E,MAAM,OAAO,GAAG,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;QACtD,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACzD,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QAEnE,0BAA0B;QAC1B,MAAM,YAAY,GAAG,kBAAkB,CAAC,eAAe,CAAC,CAAC;QACzD,MAAM,SAAS,GAAG,KAAK,CAAC,aAAa,CAAC,SAAS,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;QAE1E,OAAO,OAAO,IAAI,CAAC,SAAS,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;QAC/C,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB;IAC1C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,YAAY,EAAE,CAAC;QAEjC,sBAAsB;QACtB,MAAM,aAAa,GAAG,IAAI,YAAY,CACpC,+FAA+F,CAChG,CAAC;QACF,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,yBAAyB,CAAC,aAAa,CAAC,CAAC;QAC3E,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,yBAAyB,CAAC,aAAa,CAAC,CAAC;QAE3E,2BAA2B;QAC3B,MAAM,QAAQ,GACZ,eAAe,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;YACxC,eAAe,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;QAE3C,wBAAwB;QACxB,IAAI,CAAC;YACH,KAAK,CAAC,yBAAyB,CAC7B,IAAI,YAAY,CAAC,yBAAyB,CAAC,CAC5C,CAAC;YACF,OAAO,KAAK,CAAC,CAAC,qBAAqB;QACrC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,QAAQ,CAAC,CAAC,oBAAoB;QACvC,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC;QACzD,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB;IAC5C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,YAAY,EAAE,CAAC;QAEjC,2BAA2B;QAC3B,MAAM,aAAa,GAAG,KAAK,CAAC,mBAAmB,EAAE,CAAC;QAClD,MAAM,SAAS,GAAG,KAAK,CAAC,uBAAuB,CAAC,aAAa,CAAC,CAAC;QAE/D,yBAAyB;QACzB,MAAM,WAAW,GAAG,KAAK,CAAC,mBAAmB,EAAE,CAAC;QAChD,MAAM,OAAO,GAAG,KAAK,CAAC,uBAAuB,CAAC,WAAW,CAAC,CAAC;QAE3D,mCAAmC;QACnC,MAAM,OAAO,GAAG,kBAAkB,CAAC,kCAAkC,CAAC,CAAC;QACvE,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,qBAAqB,CACjD,KAAK,EACL,OAAO,CAAC,SAAS,EACjB,OAAO,CACR,CAAC;QAEF,2BAA2B;QAC3B,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,+BAA+B,CAC3D,KAAK,EACL,OAAO,CAAC,UAAU,EAClB,SAAS,CACV,CAAC;QAEF,0DAA0D;QAC1D,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,+BAA+B,CACzC,KAAK,EACL,SAAS,CAAC,UAAU,EACpB,SAAS,CACV,CAAC;YACF,OAAO,KAAK,CAAC,CAAC,qBAAqB;QACrC,CAAC;QAAC,MAAM,CAAC;YACP,mBAAmB;QACrB,CAAC;QAED,OAAO,kBAAkB,CAAC,OAAO,CAAC,KAAK,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACvE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,KAAK,CAAC,CAAC;QAC5D,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;IAExD,MAAM,KAAK,GAAG;QACZ,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,mBAAmB,EAAE;QACvD,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,oBAAoB,EAAE;QACzD,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,cAAc,EAAE;QACpD,EAAE,IAAI,EAAE,qBAAqB,EAAE,IAAI,EAAE,sBAAsB,EAAE;QAC7D,EAAE,IAAI,EAAE,wBAAwB,EAAE,IAAI,EAAE,wBAAwB,EAAE;KACnE,CAAC;IAEF,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,KAAK,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;YAC5B,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,UAAU,CAAC,CAAC;gBACjC,MAAM,EAAE,CAAC;YACX,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,UAAU,CAAC,CAAC;gBACjC,MAAM,EAAE,CAAC;YACX,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,aAAa,KAAK,EAAE,CAAC,CAAC;YAC3C,MAAM,EAAE,CAAC;QACX,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,mBAAmB,MAAM,YAAY,MAAM,SAAS,CAAC,CAAC;IAElE,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CACT,sEAAsE,CACvE,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;IACzE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { IECIESConfig } from '../../interfaces/ecies-config';
|
|
2
|
+
import { IMultiEncryptedMessage, IMultiEncryptedParsedHeader, IMultiRecipient } from './interfaces';
|
|
3
|
+
/**
|
|
4
|
+
* Browser-compatible multi-recipient ECIES encryption/decryption
|
|
5
|
+
*/
|
|
6
|
+
export declare class EciesMultiRecipient {
|
|
7
|
+
private readonly cryptoCore;
|
|
8
|
+
constructor(config: IECIESConfig);
|
|
9
|
+
/**
|
|
10
|
+
* Get the header size for multi-recipient encryption
|
|
11
|
+
*/
|
|
12
|
+
getHeaderSize(recipientCount: number): number;
|
|
13
|
+
/**
|
|
14
|
+
* Encrypt a message symmetric key with a public key
|
|
15
|
+
* @param receiverPublicKey The public key of the receiver
|
|
16
|
+
* @param messageSymmetricKey The message to encrypt
|
|
17
|
+
* @returns The encrypted message
|
|
18
|
+
*/
|
|
19
|
+
encryptKey(receiverPublicKey: Uint8Array, messageSymmetricKey: Uint8Array): Promise<Uint8Array>;
|
|
20
|
+
/**
|
|
21
|
+
* Decrypts symmetric key encrypted with ECIES
|
|
22
|
+
* @param privateKey The private key to decrypt the data
|
|
23
|
+
* @param encryptedKey The data to decrypt
|
|
24
|
+
* @returns The decrypted data buffer
|
|
25
|
+
*/
|
|
26
|
+
decryptKey(privateKey: Uint8Array, encryptedKey: Uint8Array): Promise<Uint8Array>;
|
|
27
|
+
/**
|
|
28
|
+
* Encrypt a message for multiple recipients
|
|
29
|
+
*/
|
|
30
|
+
encryptMultiple(recipients: IMultiRecipient[], message: Uint8Array, preamble?: Uint8Array): Promise<IMultiEncryptedMessage>;
|
|
31
|
+
/**
|
|
32
|
+
* Decrypt a multi-recipient message for a specific recipient
|
|
33
|
+
*/
|
|
34
|
+
decryptMultipleForRecipient(encryptedData: IMultiEncryptedMessage, recipientId: Uint8Array, privateKey: Uint8Array): Promise<Uint8Array>;
|
|
35
|
+
/**
|
|
36
|
+
* Build header for multi-recipient message
|
|
37
|
+
*/
|
|
38
|
+
buildHeader(data: IMultiEncryptedMessage): Uint8Array;
|
|
39
|
+
/**
|
|
40
|
+
* Parse multi-recipient header
|
|
41
|
+
*/
|
|
42
|
+
parseHeader(data: Uint8Array): IMultiEncryptedParsedHeader;
|
|
43
|
+
/**
|
|
44
|
+
* Parse complete multi-recipient message
|
|
45
|
+
*/
|
|
46
|
+
parseMessage(data: Uint8Array): IMultiEncryptedMessage;
|
|
47
|
+
private arraysEqual;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=multi-recipient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-recipient.d.ts","sourceRoot":"","sources":["../../../src/services/ecies/multi-recipient.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAI7D,OAAO,EACL,sBAAsB,EACtB,2BAA2B,EAC3B,eAAe,EAChB,MAAM,cAAc,CAAC;AAEtB;;GAEG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;gBAEjC,MAAM,EAAE,YAAY;IAIhC;;OAEG;IACI,aAAa,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM;IASpD;;;;;OAKG;IACU,UAAU,CACrB,iBAAiB,EAAE,UAAU,EAC7B,mBAAmB,EAAE,UAAU,GAC9B,OAAO,CAAC,UAAU,CAAC;IA6BtB;;;;;OAKG;IACU,UAAU,CACrB,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,UAAU,GACvB,OAAO,CAAC,UAAU,CAAC;IAgDtB;;OAEG;IACU,eAAe,CAC1B,UAAU,EAAE,eAAe,EAAE,EAC7B,OAAO,EAAE,UAAU,EACnB,QAAQ,GAAE,UAA8B,GACvC,OAAO,CAAC,sBAAsB,CAAC;IA0DlC;;OAEG;IACU,2BAA2B,CACtC,aAAa,EAAE,sBAAsB,EACrC,WAAW,EAAE,UAAU,EACvB,UAAU,EAAE,UAAU,GACrB,OAAO,CAAC,UAAU,CAAC;IAsDtB;;OAEG;IACI,WAAW,CAAC,IAAI,EAAE,sBAAsB,GAAG,UAAU;IAuC5D;;OAEG;IACI,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,2BAA2B;IAoDjE;;OAEG;IACI,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,sBAAsB;IAU7D,OAAO,CAAC,WAAW;CAOpB"}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import { ECIES } from '../../constants';
|
|
2
|
+
import { concatUint8Arrays } from '../../utils';
|
|
3
|
+
import { AESGCMService } from '../aes-gcm';
|
|
4
|
+
import { EciesCryptoCore } from './crypto-core';
|
|
5
|
+
/**
|
|
6
|
+
* Browser-compatible multi-recipient ECIES encryption/decryption
|
|
7
|
+
*/
|
|
8
|
+
export class EciesMultiRecipient {
|
|
9
|
+
cryptoCore;
|
|
10
|
+
constructor(config) {
|
|
11
|
+
this.cryptoCore = new EciesCryptoCore(config);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Get the header size for multi-recipient encryption
|
|
15
|
+
*/
|
|
16
|
+
getHeaderSize(recipientCount) {
|
|
17
|
+
return (ECIES.MULTIPLE.DATA_LENGTH_SIZE +
|
|
18
|
+
ECIES.MULTIPLE.RECIPIENT_COUNT_SIZE +
|
|
19
|
+
recipientCount * ECIES.MULTIPLE.RECIPIENT_ID_SIZE +
|
|
20
|
+
recipientCount * ECIES.MULTIPLE.ENCRYPTED_KEY_SIZE);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Encrypt a message symmetric key with a public key
|
|
24
|
+
* @param receiverPublicKey The public key of the receiver
|
|
25
|
+
* @param messageSymmetricKey The message to encrypt
|
|
26
|
+
* @returns The encrypted message
|
|
27
|
+
*/
|
|
28
|
+
async encryptKey(receiverPublicKey, messageSymmetricKey) {
|
|
29
|
+
const ephemeralKeyPair = await this.cryptoCore.generateEphemeralKeyPair();
|
|
30
|
+
const sharedSecret = await this.cryptoCore.computeSharedSecret(ephemeralKeyPair.privateKey, receiverPublicKey);
|
|
31
|
+
const symKey = sharedSecret.slice(0, ECIES.SYMMETRIC.KEY_SIZE);
|
|
32
|
+
const encryptResult = await AESGCMService.encrypt(messageSymmetricKey, symKey, true);
|
|
33
|
+
const { encrypted, iv } = encryptResult;
|
|
34
|
+
const authTag = encryptResult.tag;
|
|
35
|
+
if (!authTag) {
|
|
36
|
+
throw new Error('Authentication tag is required for key encryption');
|
|
37
|
+
}
|
|
38
|
+
return concatUint8Arrays(new Uint8Array(ephemeralKeyPair.publicKey), iv, authTag, encrypted);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Decrypts symmetric key encrypted with ECIES
|
|
42
|
+
* @param privateKey The private key to decrypt the data
|
|
43
|
+
* @param encryptedKey The data to decrypt
|
|
44
|
+
* @returns The decrypted data buffer
|
|
45
|
+
*/
|
|
46
|
+
async decryptKey(privateKey, encryptedKey) {
|
|
47
|
+
if (encryptedKey.length !== ECIES.MULTIPLE.ENCRYPTED_KEY_SIZE) {
|
|
48
|
+
throw new Error(`Invalid encrypted key length: expected ${ECIES.MULTIPLE.ENCRYPTED_KEY_SIZE}, got ${encryptedKey.length}`);
|
|
49
|
+
}
|
|
50
|
+
const ephemeralPublicKey = encryptedKey.slice(0, ECIES.PUBLIC_KEY_LENGTH);
|
|
51
|
+
const iv = encryptedKey.slice(ECIES.PUBLIC_KEY_LENGTH, ECIES.PUBLIC_KEY_LENGTH + ECIES.IV_SIZE);
|
|
52
|
+
const authTag = encryptedKey.slice(ECIES.PUBLIC_KEY_LENGTH + ECIES.IV_SIZE, ECIES.PUBLIC_KEY_LENGTH + ECIES.IV_SIZE + ECIES.AUTH_TAG_SIZE);
|
|
53
|
+
const encrypted = encryptedKey.slice(ECIES.PUBLIC_KEY_LENGTH + ECIES.IV_SIZE + ECIES.AUTH_TAG_SIZE);
|
|
54
|
+
const sharedSecret = await this.cryptoCore.computeSharedSecret(privateKey, ephemeralPublicKey);
|
|
55
|
+
const symKey = sharedSecret.slice(0, ECIES.SYMMETRIC.KEY_SIZE);
|
|
56
|
+
const encryptedWithTag = AESGCMService.combineEncryptedDataAndTag(encrypted, authTag);
|
|
57
|
+
try {
|
|
58
|
+
const decrypted = await AESGCMService.decrypt(iv, encryptedWithTag, symKey, true);
|
|
59
|
+
if (decrypted.length !== ECIES.SYMMETRIC.KEY_SIZE) {
|
|
60
|
+
throw new Error('Invalid data length');
|
|
61
|
+
}
|
|
62
|
+
return decrypted;
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
console.error('Failed to decrypt key:', error);
|
|
66
|
+
throw new Error('Failed to decrypt key');
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Encrypt a message for multiple recipients
|
|
71
|
+
*/
|
|
72
|
+
async encryptMultiple(recipients, message, preamble = new Uint8Array(0)) {
|
|
73
|
+
if (recipients.length > ECIES.MULTIPLE.MAX_RECIPIENTS) {
|
|
74
|
+
throw new Error(`Too many recipients: ${recipients.length}`);
|
|
75
|
+
}
|
|
76
|
+
if (message.length > ECIES.MAX_RAW_DATA_SIZE) {
|
|
77
|
+
throw new Error(`Message too large: ${message.length}`);
|
|
78
|
+
}
|
|
79
|
+
// Generate symmetric key
|
|
80
|
+
const symmetricKey = crypto.getRandomValues(new Uint8Array(ECIES.SYMMETRIC.KEY_SIZE));
|
|
81
|
+
// Encrypt message with symmetric key
|
|
82
|
+
const encryptResult = await AESGCMService.encrypt(message, symmetricKey, true);
|
|
83
|
+
const { encrypted, iv } = encryptResult;
|
|
84
|
+
const authTag = encryptResult.tag;
|
|
85
|
+
if (!authTag) {
|
|
86
|
+
throw new Error('Authentication tag is required for multi-recipient ECIES encryption');
|
|
87
|
+
}
|
|
88
|
+
// Create stored message: preamble + iv + authTag + encrypted
|
|
89
|
+
const storedMessage = concatUint8Arrays(preamble, iv, authTag, encrypted);
|
|
90
|
+
// Encrypt symmetric key for each recipient
|
|
91
|
+
const recipientIds = [];
|
|
92
|
+
const recipientKeys = [];
|
|
93
|
+
for (const recipient of recipients) {
|
|
94
|
+
const encryptedKey = await this.encryptKey(recipient.publicKey, symmetricKey);
|
|
95
|
+
recipientIds.push(recipient.id);
|
|
96
|
+
recipientKeys.push(encryptedKey);
|
|
97
|
+
}
|
|
98
|
+
const headerSize = this.getHeaderSize(recipients.length);
|
|
99
|
+
return {
|
|
100
|
+
dataLength: message.length,
|
|
101
|
+
recipientCount: recipients.length,
|
|
102
|
+
recipientIds,
|
|
103
|
+
recipientKeys,
|
|
104
|
+
encryptedMessage: storedMessage,
|
|
105
|
+
headerSize,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Decrypt a multi-recipient message for a specific recipient
|
|
110
|
+
*/
|
|
111
|
+
async decryptMultipleForRecipient(encryptedData, recipientId, privateKey) {
|
|
112
|
+
// Find recipient's encrypted key
|
|
113
|
+
const recipientIndex = encryptedData.recipientIds.findIndex((id) => this.arraysEqual(id, recipientId));
|
|
114
|
+
if (recipientIndex === -1) {
|
|
115
|
+
throw new Error('Recipient not found');
|
|
116
|
+
}
|
|
117
|
+
const encryptedKey = encryptedData.recipientKeys[recipientIndex];
|
|
118
|
+
// Decrypt the symmetric key
|
|
119
|
+
const symmetricKey = await this.decryptKey(privateKey, encryptedKey);
|
|
120
|
+
// Extract components from encrypted message
|
|
121
|
+
let offset = 0;
|
|
122
|
+
const iv = encryptedData.encryptedMessage.slice(offset, offset + ECIES.IV_SIZE);
|
|
123
|
+
offset += ECIES.IV_SIZE;
|
|
124
|
+
const authTag = encryptedData.encryptedMessage.slice(offset, offset + ECIES.AUTH_TAG_SIZE);
|
|
125
|
+
offset += ECIES.AUTH_TAG_SIZE;
|
|
126
|
+
const encrypted = encryptedData.encryptedMessage.slice(offset);
|
|
127
|
+
// AES-GCM provides authentication via auth tag (no separate CRC needed)
|
|
128
|
+
// Decrypt with symmetric key
|
|
129
|
+
const encryptedWithTag = AESGCMService.combineEncryptedDataAndTag(encrypted, authTag);
|
|
130
|
+
const decrypted = await AESGCMService.decrypt(iv, encryptedWithTag, symmetricKey, true);
|
|
131
|
+
// Verify length
|
|
132
|
+
if (decrypted.length !== encryptedData.dataLength) {
|
|
133
|
+
throw new Error('Decrypted data length mismatch');
|
|
134
|
+
}
|
|
135
|
+
return decrypted;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Build header for multi-recipient message
|
|
139
|
+
*/
|
|
140
|
+
buildHeader(data) {
|
|
141
|
+
if (data.recipientIds.length !== data.recipientKeys.length) {
|
|
142
|
+
throw new Error('Recipient count mismatch');
|
|
143
|
+
}
|
|
144
|
+
if (data.dataLength < 0 || data.dataLength > ECIES.MAX_RAW_DATA_SIZE) {
|
|
145
|
+
throw new Error('Invalid data length');
|
|
146
|
+
}
|
|
147
|
+
// Data length (8 bytes)
|
|
148
|
+
const dataLengthUint8Array = new Uint8Array(8);
|
|
149
|
+
new DataView(dataLengthUint8Array.buffer).setBigUint64(0, BigInt(data.dataLength), false);
|
|
150
|
+
// Recipient count (2 bytes)
|
|
151
|
+
const recipientCountUint8Array = new Uint8Array(2);
|
|
152
|
+
new DataView(recipientCountUint8Array.buffer).setUint16(0, data.recipientIds.length, false);
|
|
153
|
+
// Recipient IDs
|
|
154
|
+
const recipientIdsUint8Array = concatUint8Arrays(...data.recipientIds);
|
|
155
|
+
// Encrypted keys
|
|
156
|
+
const encryptedKeysUint8Array = concatUint8Arrays(...data.recipientKeys);
|
|
157
|
+
return concatUint8Arrays(dataLengthUint8Array, recipientCountUint8Array, recipientIdsUint8Array, encryptedKeysUint8Array);
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Parse multi-recipient header
|
|
161
|
+
*/
|
|
162
|
+
parseHeader(data) {
|
|
163
|
+
if (data.length < 10) {
|
|
164
|
+
// minimum: 8 + 2
|
|
165
|
+
throw new Error('Data too short for multi-recipient header');
|
|
166
|
+
}
|
|
167
|
+
let offset = 0;
|
|
168
|
+
const view = new DataView(data.buffer, data.byteOffset);
|
|
169
|
+
// Read data length
|
|
170
|
+
const dataLength = Number(view.getBigUint64(offset, false));
|
|
171
|
+
offset += 8;
|
|
172
|
+
if (dataLength <= 0 || dataLength > ECIES.MAX_RAW_DATA_SIZE) {
|
|
173
|
+
throw new Error('Invalid data length');
|
|
174
|
+
}
|
|
175
|
+
// Read recipient count
|
|
176
|
+
const recipientCount = view.getUint16(offset, false);
|
|
177
|
+
offset += 2;
|
|
178
|
+
if (recipientCount <= 0 || recipientCount > ECIES.MULTIPLE.MAX_RECIPIENTS) {
|
|
179
|
+
throw new Error('Invalid recipient count');
|
|
180
|
+
}
|
|
181
|
+
// Read recipient IDs
|
|
182
|
+
const recipientIds = [];
|
|
183
|
+
for (let i = 0; i < recipientCount; i++) {
|
|
184
|
+
recipientIds.push(data.slice(offset, offset + ECIES.MULTIPLE.RECIPIENT_ID_SIZE));
|
|
185
|
+
offset += ECIES.MULTIPLE.RECIPIENT_ID_SIZE;
|
|
186
|
+
}
|
|
187
|
+
// Read encrypted keys
|
|
188
|
+
const recipientKeys = [];
|
|
189
|
+
for (let i = 0; i < recipientCount; i++) {
|
|
190
|
+
recipientKeys.push(data.slice(offset, offset + ECIES.MULTIPLE.ENCRYPTED_KEY_SIZE));
|
|
191
|
+
offset += ECIES.MULTIPLE.ENCRYPTED_KEY_SIZE;
|
|
192
|
+
}
|
|
193
|
+
return {
|
|
194
|
+
dataLength,
|
|
195
|
+
recipientCount,
|
|
196
|
+
recipientIds,
|
|
197
|
+
recipientKeys,
|
|
198
|
+
headerSize: offset,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Parse complete multi-recipient message
|
|
203
|
+
*/
|
|
204
|
+
parseMessage(data) {
|
|
205
|
+
const header = this.parseHeader(data);
|
|
206
|
+
const encryptedMessage = data.slice(header.headerSize);
|
|
207
|
+
return {
|
|
208
|
+
...header,
|
|
209
|
+
encryptedMessage,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
arraysEqual(a, b) {
|
|
213
|
+
if (a.length !== b.length)
|
|
214
|
+
return false;
|
|
215
|
+
for (let i = 0; i < a.length; i++) {
|
|
216
|
+
if (a[i] !== b[i])
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
219
|
+
return true;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=multi-recipient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-recipient.js","sourceRoot":"","sources":["../../../src/services/ecies/multi-recipient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { EciesEncryptionType, EciesEncryptionTypeEnum } from '../../enumerations/ecies-encryption-type';
|
|
2
|
+
import { IECIESConfig } from '../../interfaces/ecies-config';
|
|
3
|
+
import { SecureString } from '../../secure-string';
|
|
4
|
+
import { SignatureString, SignatureUint8Array } from '../../types';
|
|
5
|
+
import { EciesCryptoCore } from './crypto-core';
|
|
6
|
+
import { ISimpleKeyPair, IWalletSeed } from './interfaces';
|
|
7
|
+
/**
|
|
8
|
+
* Browser-compatible ECIES service that mirrors the server-side functionality
|
|
9
|
+
* Uses Web Crypto API and @scure/@noble libraries for browser compatibility
|
|
10
|
+
*/
|
|
11
|
+
export declare class ECIESService {
|
|
12
|
+
private readonly _config;
|
|
13
|
+
private readonly cryptoCore;
|
|
14
|
+
private readonly signature;
|
|
15
|
+
private readonly singleRecipient;
|
|
16
|
+
constructor(config?: Partial<IECIESConfig>);
|
|
17
|
+
get core(): EciesCryptoCore;
|
|
18
|
+
get config(): IECIESConfig;
|
|
19
|
+
get curveName(): string;
|
|
20
|
+
/**
|
|
21
|
+
* Generate a new mnemonic
|
|
22
|
+
*/
|
|
23
|
+
generateNewMnemonic(): SecureString;
|
|
24
|
+
/**
|
|
25
|
+
* Generate wallet and seed from mnemonic
|
|
26
|
+
*/
|
|
27
|
+
walletAndSeedFromMnemonic(mnemonic: SecureString): IWalletSeed;
|
|
28
|
+
/**
|
|
29
|
+
* Create simple key pair from seed
|
|
30
|
+
*/
|
|
31
|
+
seedToSimpleKeyPair(seed: Uint8Array): ISimpleKeyPair;
|
|
32
|
+
/**
|
|
33
|
+
* Create simple key pair from mnemonic
|
|
34
|
+
*/
|
|
35
|
+
mnemonicToSimpleKeyPair(mnemonic: SecureString): ISimpleKeyPair;
|
|
36
|
+
/**
|
|
37
|
+
* Get public key from private key
|
|
38
|
+
*/
|
|
39
|
+
getPublicKey(privateKey: Uint8Array): Uint8Array;
|
|
40
|
+
/**
|
|
41
|
+
* Encrypt for single recipient (simple or single mode)
|
|
42
|
+
*/
|
|
43
|
+
encryptSimpleOrSingle(encryptSimple: boolean, receiverPublicKey: Uint8Array, message: Uint8Array, preamble?: Uint8Array): Promise<Uint8Array>;
|
|
44
|
+
/**
|
|
45
|
+
* Parse single encrypted header
|
|
46
|
+
*/
|
|
47
|
+
parseSingleEncryptedHeader(encryptionType: EciesEncryptionTypeEnum, data: Uint8Array, preambleSize?: number, options?: {
|
|
48
|
+
dataLength?: number;
|
|
49
|
+
}): import("./interfaces").ISingleEncryptedParsedHeader;
|
|
50
|
+
/**
|
|
51
|
+
* Decrypt with header
|
|
52
|
+
*/
|
|
53
|
+
decryptSimpleOrSingleWithHeader(decryptSimple: boolean, privateKey: Uint8Array, encryptedData: Uint8Array, preambleSize?: number, options?: {
|
|
54
|
+
dataLength?: number;
|
|
55
|
+
}): Promise<Uint8Array>;
|
|
56
|
+
/**
|
|
57
|
+
* Extended decrypt with header
|
|
58
|
+
*/
|
|
59
|
+
decryptSimpleOrSingleWithHeaderEx(encryptionType: EciesEncryptionTypeEnum, privateKey: Uint8Array, encryptedData: Uint8Array, preambleSize?: number, options?: {
|
|
60
|
+
dataLength?: number;
|
|
61
|
+
}): Promise<import("./interfaces").IDecryptionResult>;
|
|
62
|
+
/**
|
|
63
|
+
* Decrypt with individual components
|
|
64
|
+
*/
|
|
65
|
+
decryptSingleWithComponents(privateKey: Uint8Array, ephemeralPublicKey: Uint8Array, iv: Uint8Array, authTag: Uint8Array, encrypted: Uint8Array): Promise<{
|
|
66
|
+
decrypted: Uint8Array;
|
|
67
|
+
ciphertextLength?: number;
|
|
68
|
+
}>;
|
|
69
|
+
/**
|
|
70
|
+
* Sign a message
|
|
71
|
+
*/
|
|
72
|
+
signMessage(privateKey: Uint8Array, data: Uint8Array): SignatureUint8Array;
|
|
73
|
+
/**
|
|
74
|
+
* Verify a message signature
|
|
75
|
+
*/
|
|
76
|
+
verifyMessage(publicKey: Uint8Array, data: Uint8Array, signature: SignatureUint8Array): boolean;
|
|
77
|
+
/**
|
|
78
|
+
* Convert signature string to buffer
|
|
79
|
+
*/
|
|
80
|
+
signatureStringToSignatureUint8Array(signatureString: SignatureString): SignatureUint8Array;
|
|
81
|
+
/**
|
|
82
|
+
* Convert signature buffer to string
|
|
83
|
+
*/
|
|
84
|
+
signatureUint8ArrayToSignatureString(signatureArray: SignatureUint8Array): string;
|
|
85
|
+
/**
|
|
86
|
+
* Compute encrypted length from data length
|
|
87
|
+
*/
|
|
88
|
+
computeEncryptedLengthFromDataLength(dataLength: number, encryptionMode: EciesEncryptionType, recipientCount?: number): number;
|
|
89
|
+
/**
|
|
90
|
+
* Compute decrypted length from encrypted data length
|
|
91
|
+
*/
|
|
92
|
+
computeDecryptedLengthFromEncryptedDataLength(encryptedDataLength: number, padding?: number): number;
|
|
93
|
+
/**
|
|
94
|
+
* Generic encrypt method
|
|
95
|
+
*/
|
|
96
|
+
encrypt(encryptionType: EciesEncryptionTypeEnum, recipients: Array<{
|
|
97
|
+
publicKey: Uint8Array;
|
|
98
|
+
}>, message: Uint8Array, preamble?: Uint8Array): Promise<Uint8Array>;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/services/ecies/service.ts"],"names":[],"mappings":"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"}
|