@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,186 @@
|
|
|
1
|
+
import { ECIES } from '../../constants';
|
|
2
|
+
import { EciesEncryptionTypeEnum, } from '../../enumerations/ecies-encryption-type';
|
|
3
|
+
import { EciesCryptoCore } from './crypto-core';
|
|
4
|
+
import { EciesSignature } from './signature';
|
|
5
|
+
import { EciesSingleRecipient } from './single-recipient';
|
|
6
|
+
/**
|
|
7
|
+
* Browser-compatible ECIES service that mirrors the server-side functionality
|
|
8
|
+
* Uses Web Crypto API and @scure/@noble libraries for browser compatibility
|
|
9
|
+
*/
|
|
10
|
+
export class ECIESService {
|
|
11
|
+
_config;
|
|
12
|
+
cryptoCore;
|
|
13
|
+
signature;
|
|
14
|
+
singleRecipient;
|
|
15
|
+
constructor(config) {
|
|
16
|
+
this._config = {
|
|
17
|
+
curveName: ECIES.CURVE_NAME,
|
|
18
|
+
primaryKeyDerivationPath: ECIES.PRIMARY_KEY_DERIVATION_PATH,
|
|
19
|
+
mnemonicStrength: ECIES.MNEMONIC_STRENGTH,
|
|
20
|
+
symmetricAlgorithm: ECIES.SYMMETRIC.ALGORITHM,
|
|
21
|
+
symmetricKeyBits: ECIES.SYMMETRIC.KEY_BITS,
|
|
22
|
+
symmetricKeyMode: ECIES.SYMMETRIC.MODE,
|
|
23
|
+
...config,
|
|
24
|
+
};
|
|
25
|
+
// Initialize components
|
|
26
|
+
this.cryptoCore = new EciesCryptoCore(this._config);
|
|
27
|
+
this.signature = new EciesSignature(this.cryptoCore);
|
|
28
|
+
this.singleRecipient = new EciesSingleRecipient(this._config);
|
|
29
|
+
}
|
|
30
|
+
get core() {
|
|
31
|
+
return this.cryptoCore;
|
|
32
|
+
}
|
|
33
|
+
get config() {
|
|
34
|
+
return this._config;
|
|
35
|
+
}
|
|
36
|
+
get curveName() {
|
|
37
|
+
return this._config.curveName;
|
|
38
|
+
}
|
|
39
|
+
// === Key Management Methods ===
|
|
40
|
+
/**
|
|
41
|
+
* Generate a new mnemonic
|
|
42
|
+
*/
|
|
43
|
+
generateNewMnemonic() {
|
|
44
|
+
return this.cryptoCore.generateNewMnemonic();
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Generate wallet and seed from mnemonic
|
|
48
|
+
*/
|
|
49
|
+
walletAndSeedFromMnemonic(mnemonic) {
|
|
50
|
+
return this.cryptoCore.walletAndSeedFromMnemonic(mnemonic);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Create simple key pair from seed
|
|
54
|
+
*/
|
|
55
|
+
seedToSimpleKeyPair(seed) {
|
|
56
|
+
return this.cryptoCore.seedToSimpleKeyPair(seed);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Create simple key pair from mnemonic
|
|
60
|
+
*/
|
|
61
|
+
mnemonicToSimpleKeyPair(mnemonic) {
|
|
62
|
+
return this.cryptoCore.mnemonicToSimpleKeyPair(mnemonic);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get public key from private key
|
|
66
|
+
*/
|
|
67
|
+
getPublicKey(privateKey) {
|
|
68
|
+
return this.cryptoCore.getPublicKey(privateKey);
|
|
69
|
+
}
|
|
70
|
+
// === Core Encryption/Decryption Methods ===
|
|
71
|
+
/**
|
|
72
|
+
* Encrypt for single recipient (simple or single mode)
|
|
73
|
+
*/
|
|
74
|
+
async encryptSimpleOrSingle(encryptSimple, receiverPublicKey, message, preamble = new Uint8Array(0)) {
|
|
75
|
+
return this.singleRecipient.encrypt(encryptSimple, receiverPublicKey, message, preamble);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Parse single encrypted header
|
|
79
|
+
*/
|
|
80
|
+
parseSingleEncryptedHeader(encryptionType, data, preambleSize = 0, options) {
|
|
81
|
+
const { header } = this.singleRecipient.parseEncryptedMessage(encryptionType, data, preambleSize, options);
|
|
82
|
+
return header;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Decrypt with header
|
|
86
|
+
*/
|
|
87
|
+
async decryptSimpleOrSingleWithHeader(decryptSimple, privateKey, encryptedData, preambleSize = 0, options) {
|
|
88
|
+
return await this.singleRecipient.decryptWithHeader(decryptSimple
|
|
89
|
+
? EciesEncryptionTypeEnum.Simple
|
|
90
|
+
: EciesEncryptionTypeEnum.Single, privateKey, encryptedData, preambleSize, options);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Extended decrypt with header
|
|
94
|
+
*/
|
|
95
|
+
async decryptSimpleOrSingleWithHeaderEx(encryptionType, privateKey, encryptedData, preambleSize = 0, options) {
|
|
96
|
+
return this.singleRecipient.decryptWithHeaderEx(encryptionType, privateKey, encryptedData, preambleSize, options);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Decrypt with individual components
|
|
100
|
+
*/
|
|
101
|
+
async decryptSingleWithComponents(privateKey, ephemeralPublicKey, iv, authTag, encrypted) {
|
|
102
|
+
const decrypted = await this.singleRecipient.decryptWithComponents(privateKey, ephemeralPublicKey, iv, authTag, encrypted);
|
|
103
|
+
return { decrypted, ciphertextLength: encrypted.length };
|
|
104
|
+
}
|
|
105
|
+
// === Signature Methods ===
|
|
106
|
+
/**
|
|
107
|
+
* Sign a message
|
|
108
|
+
*/
|
|
109
|
+
signMessage(privateKey, data) {
|
|
110
|
+
return this.signature.signMessage(privateKey, data);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Verify a message signature
|
|
114
|
+
*/
|
|
115
|
+
verifyMessage(publicKey, data, signature) {
|
|
116
|
+
return this.signature.verifyMessage(publicKey, data, signature);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Convert signature string to buffer
|
|
120
|
+
*/
|
|
121
|
+
signatureStringToSignatureUint8Array(signatureString) {
|
|
122
|
+
return this.signature.signatureStringToSignatureUint8Array(signatureString);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Convert signature buffer to string
|
|
126
|
+
*/
|
|
127
|
+
signatureUint8ArrayToSignatureString(signatureArray) {
|
|
128
|
+
return this.signature.signatureUint8ArrayToSignatureString(signatureArray);
|
|
129
|
+
}
|
|
130
|
+
// === Utility Methods ===
|
|
131
|
+
/**
|
|
132
|
+
* Compute encrypted length from data length
|
|
133
|
+
*/
|
|
134
|
+
computeEncryptedLengthFromDataLength(dataLength, encryptionMode, recipientCount) {
|
|
135
|
+
if (dataLength < 0) {
|
|
136
|
+
throw new Error('Invalid data length');
|
|
137
|
+
}
|
|
138
|
+
switch (encryptionMode) {
|
|
139
|
+
case 'simple':
|
|
140
|
+
return dataLength + ECIES.SIMPLE.FIXED_OVERHEAD_SIZE;
|
|
141
|
+
case 'single':
|
|
142
|
+
return dataLength + ECIES.SINGLE.FIXED_OVERHEAD_SIZE;
|
|
143
|
+
case 'multiple':
|
|
144
|
+
// Basic calculation for multiple recipients
|
|
145
|
+
return (dataLength +
|
|
146
|
+
ECIES.MULTIPLE.FIXED_OVERHEAD_SIZE +
|
|
147
|
+
(recipientCount ?? 1) * ECIES.MULTIPLE.ENCRYPTED_KEY_SIZE);
|
|
148
|
+
default:
|
|
149
|
+
throw new Error('Invalid encryption type');
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Compute decrypted length from encrypted data length
|
|
154
|
+
*/
|
|
155
|
+
computeDecryptedLengthFromEncryptedDataLength(encryptedDataLength, padding) {
|
|
156
|
+
if (encryptedDataLength < 0) {
|
|
157
|
+
throw new Error('Invalid encrypted data length');
|
|
158
|
+
}
|
|
159
|
+
const overhead = ECIES.SINGLE.FIXED_OVERHEAD_SIZE;
|
|
160
|
+
const actualPadding = padding !== undefined ? padding : 0;
|
|
161
|
+
const decryptedLength = encryptedDataLength - overhead - actualPadding;
|
|
162
|
+
if (decryptedLength < 0) {
|
|
163
|
+
throw new Error('Computed decrypted length is negative');
|
|
164
|
+
}
|
|
165
|
+
return decryptedLength;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Generic encrypt method
|
|
169
|
+
*/
|
|
170
|
+
async encrypt(encryptionType, recipients, message, preamble) {
|
|
171
|
+
if ((encryptionType === EciesEncryptionTypeEnum.Simple ||
|
|
172
|
+
EciesEncryptionTypeEnum.Single) &&
|
|
173
|
+
recipients.length === 1) {
|
|
174
|
+
return this.singleRecipient.encrypt(encryptionType === EciesEncryptionTypeEnum.Simple, recipients[0].publicKey, message, preamble);
|
|
175
|
+
}
|
|
176
|
+
else if (encryptionType === EciesEncryptionTypeEnum.Multiple &&
|
|
177
|
+
recipients.length > 1) {
|
|
178
|
+
// TODO: Implement multi-recipient encryption
|
|
179
|
+
throw new Error('Multi-recipient encryption not yet implemented');
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
throw new Error(`Invalid encryption type or number of recipients: ${encryptionType}, ${recipients.length}`);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/services/ecies/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { SignatureString, SignatureUint8Array } from '../../types';
|
|
2
|
+
import { EciesCryptoCore } from './crypto-core';
|
|
3
|
+
/**
|
|
4
|
+
* Browser-compatible ECDSA signature operations
|
|
5
|
+
*/
|
|
6
|
+
export declare class EciesSignature {
|
|
7
|
+
private readonly cryptoCore;
|
|
8
|
+
constructor(cryptoCore: EciesCryptoCore);
|
|
9
|
+
/**
|
|
10
|
+
* Sign arbitrary binary data with a secp256k1 private key.
|
|
11
|
+
* Returns 64 bytes: [r(32) | s(32)]
|
|
12
|
+
*/
|
|
13
|
+
signMessage(privateKey: Uint8Array, data: Uint8Array): SignatureUint8Array;
|
|
14
|
+
/**
|
|
15
|
+
* Verify signature (64 bytes: [r|s]) over arbitrary binary data against a public key.
|
|
16
|
+
*/
|
|
17
|
+
verifyMessage(publicKey: Uint8Array, data: Uint8Array, signature: SignatureUint8Array): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Convert signature string to signature Uint8Array
|
|
20
|
+
*/
|
|
21
|
+
signatureStringToSignatureUint8Array(signatureString: SignatureString): SignatureUint8Array;
|
|
22
|
+
/**
|
|
23
|
+
* Convert signature buffer to signature string
|
|
24
|
+
*/
|
|
25
|
+
signatureUint8ArrayToSignatureString(signatureArray: SignatureUint8Array): SignatureString;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=signature.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signature.d.ts","sourceRoot":"","sources":["../../../src/services/ecies/signature.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEnE,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;gBAEjC,UAAU,EAAE,eAAe;IAIvC;;;OAGG;IACI,WAAW,CAChB,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,UAAU,GACf,mBAAmB;IAUtB;;OAEG;IACI,aAAa,CAClB,SAAS,EAAE,UAAU,EACrB,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE,mBAAmB,GAC7B,OAAO;IA8BV;;OAEG;IACI,oCAAoC,CACzC,eAAe,EAAE,eAAe,GAC/B,mBAAmB;IAStB;;OAEG;IACI,oCAAoC,CACzC,cAAc,EAAE,mBAAmB,GAClC,eAAe;CAGnB"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { secp256k1 } from '@noble/curves/secp256k1.js';
|
|
2
|
+
import { sha256 } from '@noble/hashes/sha2.js';
|
|
3
|
+
import { uint8ArrayToHex } from '../../utils';
|
|
4
|
+
/**
|
|
5
|
+
* Browser-compatible ECDSA signature operations
|
|
6
|
+
*/
|
|
7
|
+
export class EciesSignature {
|
|
8
|
+
cryptoCore;
|
|
9
|
+
constructor(cryptoCore) {
|
|
10
|
+
this.cryptoCore = cryptoCore;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Sign arbitrary binary data with a secp256k1 private key.
|
|
14
|
+
* Returns 64 bytes: [r(32) | s(32)]
|
|
15
|
+
*/
|
|
16
|
+
signMessage(privateKey, data) {
|
|
17
|
+
const hash = sha256(data);
|
|
18
|
+
// Use deterministic signatures (RFC 6979) for consistency
|
|
19
|
+
const signature = secp256k1.sign(hash, privateKey, {
|
|
20
|
+
format: 'compact',
|
|
21
|
+
extraEntropy: false,
|
|
22
|
+
});
|
|
23
|
+
return signature;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Verify signature (64 bytes: [r|s]) over arbitrary binary data against a public key.
|
|
27
|
+
*/
|
|
28
|
+
verifyMessage(publicKey, data, signature) {
|
|
29
|
+
try {
|
|
30
|
+
if (!signature || signature.length !== 64)
|
|
31
|
+
return false;
|
|
32
|
+
const hash = sha256(data);
|
|
33
|
+
const normalizedPublicKey = this.cryptoCore.normalizePublicKey(publicKey);
|
|
34
|
+
// Try direct verification first
|
|
35
|
+
try {
|
|
36
|
+
const directResult = secp256k1.verify(signature, hash, normalizedPublicKey);
|
|
37
|
+
if (directResult)
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// Continue to alternative verification methods
|
|
42
|
+
}
|
|
43
|
+
// If direct verification fails, the signature might be from a different library
|
|
44
|
+
// that uses different nonce generation. Since we can't make @noble/curves
|
|
45
|
+
// verify signatures from ethereumjs-util directly, we'll return false here.
|
|
46
|
+
// The calling code should handle cross-platform verification at a higher level.
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
console.error('Signature verification failed:', err);
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Convert signature string to signature Uint8Array
|
|
56
|
+
*/
|
|
57
|
+
signatureStringToSignatureUint8Array(signatureString) {
|
|
58
|
+
const cleanHex = signatureString.replace(/^0x/, '');
|
|
59
|
+
const result = new Uint8Array(cleanHex.length / 2);
|
|
60
|
+
for (let i = 0; i < cleanHex.length; i += 2) {
|
|
61
|
+
result[i / 2] = parseInt(cleanHex.substring(i, i + 2), 16);
|
|
62
|
+
}
|
|
63
|
+
return result;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Convert signature buffer to signature string
|
|
67
|
+
*/
|
|
68
|
+
signatureUint8ArrayToSignatureString(signatureArray) {
|
|
69
|
+
return uint8ArrayToHex(signatureArray);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=signature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signature.js","sourceRoot":"","sources":["../../../src/services/ecies/signature.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG9C;;GAEG;AACH,MAAM,OAAO,cAAc;IACR,UAAU,CAAkB;IAE7C,YAAY,UAA2B;QACrC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACI,WAAW,CAChB,UAAsB,EACtB,IAAgB;QAEhB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1B,0DAA0D;QAC1D,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE;YACjD,MAAM,EAAE,SAAS;YACjB,YAAY,EAAE,KAAK;SACpB,CAAC,CAAC;QACH,OAAO,SAAgC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACI,aAAa,CAClB,SAAqB,EACrB,IAAgB,EAChB,SAA8B;QAE9B,IAAI,CAAC;YACH,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,EAAE;gBAAE,OAAO,KAAK,CAAC;YACxD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;YAC1B,MAAM,mBAAmB,GAAG,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;YAE1E,gCAAgC;YAChC,IAAI,CAAC;gBACH,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,CACnC,SAAS,EACT,IAAI,EACJ,mBAAmB,CACpB,CAAC;gBACF,IAAI,YAAY;oBAAE,OAAO,IAAI,CAAC;YAChC,CAAC;YAAC,MAAM,CAAC;gBACP,+CAA+C;YACjD,CAAC;YAED,gFAAgF;YAChF,0EAA0E;YAC1E,4EAA4E;YAC5E,gFAAgF;YAEhF,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAC;YACrD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACI,oCAAoC,CACzC,eAAgC;QAEhC,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5C,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,MAA6B,CAAC;IACvC,CAAC;IAED;;OAEG;IACI,oCAAoC,CACzC,cAAmC;QAEnC,OAAO,eAAe,CAAC,cAAc,CAAoB,CAAC;IAC5D,CAAC;CACF"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { EciesEncryptionTypeEnum } from '../../enumerations/ecies-encryption-type';
|
|
2
|
+
import { IECIESConfig } from '../../interfaces/ecies-config';
|
|
3
|
+
import { IDecryptionResult, ISingleEncryptedParsedHeader } from './interfaces';
|
|
4
|
+
/**
|
|
5
|
+
* Browser-compatible single recipient ECIES encryption/decryption
|
|
6
|
+
*/
|
|
7
|
+
export declare class EciesSingleRecipient {
|
|
8
|
+
private readonly cryptoCore;
|
|
9
|
+
private readonly config;
|
|
10
|
+
constructor(config: IECIESConfig);
|
|
11
|
+
/**
|
|
12
|
+
* Encrypt a message for a single recipient
|
|
13
|
+
*/
|
|
14
|
+
encrypt(encryptSimple: boolean, receiverPublicKey: Uint8Array, message: Uint8Array, preamble?: Uint8Array): Promise<Uint8Array>;
|
|
15
|
+
/**
|
|
16
|
+
* Parse encrypted message header
|
|
17
|
+
*/
|
|
18
|
+
parseEncryptedMessage(encryptionType: EciesEncryptionTypeEnum | undefined, data: Uint8Array, preambleSize?: number, options?: {
|
|
19
|
+
dataLength?: number;
|
|
20
|
+
}): {
|
|
21
|
+
header: ISingleEncryptedParsedHeader;
|
|
22
|
+
data: Uint8Array;
|
|
23
|
+
remainder: Uint8Array;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Decrypt with header
|
|
27
|
+
*/
|
|
28
|
+
decryptWithHeader(encryptionType: EciesEncryptionTypeEnum | undefined, privateKey: Uint8Array, encryptedData: Uint8Array, preambleSize?: number, options?: {
|
|
29
|
+
dataLength?: number;
|
|
30
|
+
}): Promise<Uint8Array>;
|
|
31
|
+
/**
|
|
32
|
+
* Extended decrypt with header that returns additional info
|
|
33
|
+
*/
|
|
34
|
+
decryptWithHeaderEx(encryptionType: EciesEncryptionTypeEnum | undefined, privateKey: Uint8Array, encryptedData: Uint8Array, preambleSize?: number, options?: {
|
|
35
|
+
dataLength?: number;
|
|
36
|
+
}): Promise<IDecryptionResult>;
|
|
37
|
+
/**
|
|
38
|
+
* Decrypt with individual components
|
|
39
|
+
*/
|
|
40
|
+
decryptWithComponents(privateKey: Uint8Array, ephemeralPublicKey: Uint8Array, iv: Uint8Array, authTag: Uint8Array, encrypted: Uint8Array): Promise<Uint8Array>;
|
|
41
|
+
private arraysEqual;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=single-recipient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"single-recipient.d.ts","sourceRoot":"","sources":["../../../src/services/ecies/single-recipient.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,uBAAuB,EACxB,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAI7D,OAAO,EAAE,iBAAiB,EAAE,4BAA4B,EAAE,MAAM,cAAc,CAAC;AAE/E;;GAEG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;gBAE1B,MAAM,EAAE,YAAY;IAKhC;;OAEG;IACU,OAAO,CAClB,aAAa,EAAE,OAAO,EACtB,iBAAiB,EAAE,UAAU,EAC7B,OAAO,EAAE,UAAU,EACnB,QAAQ,GAAE,UAA8B,GACvC,OAAO,CAAC,UAAU,CAAC;IA+EtB;;OAEG;IACI,qBAAqB,CAC1B,cAAc,EAAE,uBAAuB,GAAG,SAAS,EACnD,IAAI,EAAE,UAAU,EAChB,YAAY,GAAE,MAAU,EACxB,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAChC;QACD,MAAM,EAAE,4BAA4B,CAAC;QACrC,IAAI,EAAE,UAAU,CAAC;QACjB,SAAS,EAAE,UAAU,CAAC;KACvB;IAsHD;;OAEG;IACU,iBAAiB,CAC5B,cAAc,EAAE,uBAAuB,GAAG,SAAS,EACnD,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,UAAU,EACzB,YAAY,GAAE,MAAU,EACxB,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAChC,OAAO,CAAC,UAAU,CAAC;IAWtB;;OAEG;IACU,mBAAmB,CAC9B,cAAc,EAAE,uBAAuB,GAAG,SAAS,EACnD,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,UAAU,EACzB,YAAY,GAAE,MAAU,EACxB,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAChC,OAAO,CAAC,iBAAiB,CAAC;IAsB7B;;OAEG;IACU,qBAAqB,CAChC,UAAU,EAAE,UAAU,EACtB,kBAAkB,EAAE,UAAU,EAC9B,EAAE,EAAE,UAAU,EACd,OAAO,EAAE,UAAU,EACnB,SAAS,EAAE,UAAU,GACpB,OAAO,CAAC,UAAU,CAAC;IAwBtB,OAAO,CAAC,WAAW;CAOpB"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { ECIES } from '../../constants';
|
|
2
|
+
import { EciesEncryptionTypeEnum, } from '../../enumerations/ecies-encryption-type';
|
|
3
|
+
import { AESGCMService } from '../aes-gcm';
|
|
4
|
+
import { EciesCryptoCore } from './crypto-core';
|
|
5
|
+
/**
|
|
6
|
+
* Browser-compatible single recipient ECIES encryption/decryption
|
|
7
|
+
*/
|
|
8
|
+
export class EciesSingleRecipient {
|
|
9
|
+
cryptoCore;
|
|
10
|
+
config;
|
|
11
|
+
constructor(config) {
|
|
12
|
+
this.config = config;
|
|
13
|
+
this.cryptoCore = new EciesCryptoCore(config);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Encrypt a message for a single recipient
|
|
17
|
+
*/
|
|
18
|
+
async encrypt(encryptSimple, receiverPublicKey, message, preamble = new Uint8Array(0)) {
|
|
19
|
+
const encryptionType = encryptSimple
|
|
20
|
+
? 'simple'
|
|
21
|
+
: 'single';
|
|
22
|
+
const encryptionTypeArray = new Uint8Array([
|
|
23
|
+
encryptionType === 'simple'
|
|
24
|
+
? ECIES.ENCRYPTION_TYPE.SIMPLE
|
|
25
|
+
: ECIES.ENCRYPTION_TYPE.SINGLE,
|
|
26
|
+
]);
|
|
27
|
+
if (message.length > ECIES.MAX_RAW_DATA_SIZE) {
|
|
28
|
+
throw new Error(`Message length exceeds maximum allowed size: ${message.length}`);
|
|
29
|
+
}
|
|
30
|
+
// Generate ephemeral key pair
|
|
31
|
+
const ephemeralPrivateKey = this.cryptoCore.generatePrivateKey();
|
|
32
|
+
const ephemeralPublicKey = this.cryptoCore.getPublicKey(ephemeralPrivateKey);
|
|
33
|
+
// Compute shared secret
|
|
34
|
+
const normalizedReceiverPublicKey = this.cryptoCore.normalizePublicKey(receiverPublicKey);
|
|
35
|
+
const sharedSecret = this.cryptoCore.computeSharedSecret(ephemeralPrivateKey, normalizedReceiverPublicKey);
|
|
36
|
+
// Use first 32 bytes as symmetric key
|
|
37
|
+
const symKey = sharedSecret.slice(0, ECIES.SYMMETRIC.KEY_SIZE);
|
|
38
|
+
// Encrypt using AES-GCM
|
|
39
|
+
const encryptResult = await AESGCMService.encrypt(message, symKey, true);
|
|
40
|
+
const { encrypted, iv } = encryptResult;
|
|
41
|
+
const authTag = encryptResult.tag;
|
|
42
|
+
if (!authTag) {
|
|
43
|
+
throw new Error('Authentication tag is required for ECIES encryption');
|
|
44
|
+
}
|
|
45
|
+
// Add length prefix for single mode
|
|
46
|
+
const lengthArray = encryptionType === 'simple' ? new Uint8Array(0) : new Uint8Array(8);
|
|
47
|
+
if (encryptionType === 'single') {
|
|
48
|
+
const view = new DataView(lengthArray.buffer);
|
|
49
|
+
view.setBigUint64(0, BigInt(message.length), false); // big-endian
|
|
50
|
+
}
|
|
51
|
+
// Format: [preamble] | type (1) | ephemeralPublicKey (65) | iv (16) | authTag (16) | length (8) | encryptedData
|
|
52
|
+
const result = new Uint8Array(preamble.length +
|
|
53
|
+
encryptionTypeArray.length +
|
|
54
|
+
ephemeralPublicKey.length +
|
|
55
|
+
iv.length +
|
|
56
|
+
authTag.length +
|
|
57
|
+
lengthArray.length +
|
|
58
|
+
encrypted.length);
|
|
59
|
+
let offset = 0;
|
|
60
|
+
result.set(preamble, offset);
|
|
61
|
+
offset += preamble.length;
|
|
62
|
+
result.set(encryptionTypeArray, offset);
|
|
63
|
+
offset += encryptionTypeArray.length;
|
|
64
|
+
result.set(ephemeralPublicKey, offset);
|
|
65
|
+
offset += ephemeralPublicKey.length;
|
|
66
|
+
result.set(iv, offset);
|
|
67
|
+
offset += iv.length;
|
|
68
|
+
result.set(authTag, offset);
|
|
69
|
+
offset += authTag.length;
|
|
70
|
+
result.set(lengthArray, offset);
|
|
71
|
+
offset += lengthArray.length;
|
|
72
|
+
result.set(encrypted, offset);
|
|
73
|
+
return result;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Parse encrypted message header
|
|
77
|
+
*/
|
|
78
|
+
parseEncryptedMessage(encryptionType, data, preambleSize = 0, options) {
|
|
79
|
+
// Read encryption type from first byte after preamble
|
|
80
|
+
const actualEncryptionTypeByte = data[preambleSize];
|
|
81
|
+
let actualEncryptionType;
|
|
82
|
+
switch (actualEncryptionTypeByte) {
|
|
83
|
+
case ECIES.ENCRYPTION_TYPE.SIMPLE:
|
|
84
|
+
actualEncryptionType = EciesEncryptionTypeEnum.Simple;
|
|
85
|
+
break;
|
|
86
|
+
case ECIES.ENCRYPTION_TYPE.SINGLE:
|
|
87
|
+
actualEncryptionType = EciesEncryptionTypeEnum.Single;
|
|
88
|
+
break;
|
|
89
|
+
case ECIES.ENCRYPTION_TYPE.MULTIPLE:
|
|
90
|
+
throw new Error('Multiple encryption type not supported in single recipient mode');
|
|
91
|
+
default:
|
|
92
|
+
throw new Error(`Invalid encryption type: ${actualEncryptionTypeByte}`);
|
|
93
|
+
}
|
|
94
|
+
if (encryptionType !== undefined &&
|
|
95
|
+
actualEncryptionType !== encryptionType) {
|
|
96
|
+
throw new Error(`Encryption type mismatch: expected ${encryptionType}, got ${actualEncryptionType}`);
|
|
97
|
+
}
|
|
98
|
+
const includeLengthAndCrc = actualEncryptionType === EciesEncryptionTypeEnum.Single;
|
|
99
|
+
const requiredSize = includeLengthAndCrc
|
|
100
|
+
? ECIES.SINGLE.FIXED_OVERHEAD_SIZE
|
|
101
|
+
: ECIES.SIMPLE.FIXED_OVERHEAD_SIZE;
|
|
102
|
+
if (data.length < requiredSize) {
|
|
103
|
+
throw new Error(`Data too short: required ${requiredSize}, got ${data.length}`);
|
|
104
|
+
}
|
|
105
|
+
let offset = preambleSize;
|
|
106
|
+
const preamble = data.slice(0, preambleSize);
|
|
107
|
+
// Skip encryption type byte
|
|
108
|
+
offset += 1;
|
|
109
|
+
// Extract header components
|
|
110
|
+
const ephemeralPublicKey = data.slice(offset, offset + ECIES.PUBLIC_KEY_LENGTH);
|
|
111
|
+
offset += ECIES.PUBLIC_KEY_LENGTH;
|
|
112
|
+
const normalizedKey = this.cryptoCore.normalizePublicKey(ephemeralPublicKey);
|
|
113
|
+
const iv = data.slice(offset, offset + ECIES.IV_SIZE);
|
|
114
|
+
offset += ECIES.IV_SIZE;
|
|
115
|
+
const authTag = data.slice(offset, offset + ECIES.AUTH_TAG_SIZE);
|
|
116
|
+
offset += ECIES.AUTH_TAG_SIZE;
|
|
117
|
+
// Extract length for single mode
|
|
118
|
+
const dataLengthArray = includeLengthAndCrc
|
|
119
|
+
? data.slice(offset, offset + ECIES.SINGLE.DATA_LENGTH_SIZE)
|
|
120
|
+
: new Uint8Array(0);
|
|
121
|
+
if (includeLengthAndCrc) {
|
|
122
|
+
offset += ECIES.SINGLE.DATA_LENGTH_SIZE;
|
|
123
|
+
}
|
|
124
|
+
const dataLength = includeLengthAndCrc
|
|
125
|
+
? Number(new DataView(dataLengthArray.buffer, dataLengthArray.byteOffset, dataLengthArray.byteLength).getBigUint64(0, false))
|
|
126
|
+
: options?.dataLength ?? -1;
|
|
127
|
+
if (includeLengthAndCrc &&
|
|
128
|
+
options?.dataLength !== undefined &&
|
|
129
|
+
dataLength !== options.dataLength) {
|
|
130
|
+
throw new Error(`Data length mismatch: expected ${dataLength}, got ${options.dataLength}`);
|
|
131
|
+
}
|
|
132
|
+
// No CRC in Single encryption (AES-GCM provides authentication)
|
|
133
|
+
// For single mode, read all remaining data as encrypted data
|
|
134
|
+
// The dataLength represents the original message length, not encrypted length
|
|
135
|
+
const encryptedData = data.slice(offset);
|
|
136
|
+
const remainder = new Uint8Array(0);
|
|
137
|
+
// No CRC validation needed (AES-GCM provides authentication)
|
|
138
|
+
return {
|
|
139
|
+
header: {
|
|
140
|
+
encryptionType: actualEncryptionType,
|
|
141
|
+
ephemeralPublicKey: normalizedKey,
|
|
142
|
+
iv,
|
|
143
|
+
authTag,
|
|
144
|
+
dataLength,
|
|
145
|
+
headerSize: includeLengthAndCrc
|
|
146
|
+
? ECIES.SINGLE.FIXED_OVERHEAD_SIZE
|
|
147
|
+
: ECIES.SIMPLE.FIXED_OVERHEAD_SIZE,
|
|
148
|
+
},
|
|
149
|
+
data: encryptedData,
|
|
150
|
+
remainder,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Decrypt with header
|
|
155
|
+
*/
|
|
156
|
+
async decryptWithHeader(encryptionType, privateKey, encryptedData, preambleSize = 0, options) {
|
|
157
|
+
const result = await this.decryptWithHeaderEx(encryptionType, privateKey, encryptedData, preambleSize, options);
|
|
158
|
+
return result.decrypted;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Extended decrypt with header that returns additional info
|
|
162
|
+
*/
|
|
163
|
+
async decryptWithHeaderEx(encryptionType, privateKey, encryptedData, preambleSize = 0, options) {
|
|
164
|
+
const { data, header } = this.parseEncryptedMessage(encryptionType, encryptedData, preambleSize, options);
|
|
165
|
+
const decrypted = await this.decryptWithComponents(privateKey, header.ephemeralPublicKey, header.iv, header.authTag, data);
|
|
166
|
+
return {
|
|
167
|
+
decrypted,
|
|
168
|
+
consumedBytes: preambleSize + header.headerSize + data.length,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Decrypt with individual components
|
|
173
|
+
*/
|
|
174
|
+
async decryptWithComponents(privateKey, ephemeralPublicKey, iv, authTag, encrypted) {
|
|
175
|
+
// Normalize ephemeral public key
|
|
176
|
+
const normalizedEphemeralKey = this.cryptoCore.normalizePublicKey(ephemeralPublicKey);
|
|
177
|
+
// Compute shared secret
|
|
178
|
+
const sharedSecret = this.cryptoCore.computeSharedSecret(privateKey, normalizedEphemeralKey);
|
|
179
|
+
// Use first 32 bytes as symmetric key
|
|
180
|
+
const symKey = sharedSecret.slice(0, ECIES.SYMMETRIC.KEY_SIZE);
|
|
181
|
+
// Combine encrypted data with auth tag for AES-GCM
|
|
182
|
+
const encryptedWithTag = AESGCMService.combineEncryptedDataAndTag(encrypted, authTag);
|
|
183
|
+
// Decrypt
|
|
184
|
+
return await AESGCMService.decrypt(iv, encryptedWithTag, symKey, true);
|
|
185
|
+
}
|
|
186
|
+
arraysEqual(a, b) {
|
|
187
|
+
if (a.length !== b.length)
|
|
188
|
+
return false;
|
|
189
|
+
for (let i = 0; i < a.length; i++) {
|
|
190
|
+
if (a[i] !== b[i])
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
return true;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=single-recipient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"single-recipient.js","sourceRoot":"","sources":["../../../src/services/ecies/single-recipient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAEL,uBAAuB,GACxB,MAAM,0CAA0C,CAAC;AAElD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGhD;;GAEG;AACH,MAAM,OAAO,oBAAoB;IACd,UAAU,CAAkB;IAC5B,MAAM,CAAe;IAEtC,YAAY,MAAoB;QAC9B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,OAAO,CAClB,aAAsB,EACtB,iBAA6B,EAC7B,OAAmB,EACnB,WAAuB,IAAI,UAAU,CAAC,CAAC,CAAC;QAExC,MAAM,cAAc,GAAwB,aAAa;YACvD,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,QAAQ,CAAC;QACb,MAAM,mBAAmB,GAAG,IAAI,UAAU,CAAC;YACzC,cAAc,KAAK,QAAQ;gBACzB,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM;gBAC9B,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM;SACjC,CAAC,CAAC;QAEH,IAAI,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,iBAAiB,EAAE,CAAC;YAC7C,MAAM,IAAI,KAAK,CACb,gDAAgD,OAAO,CAAC,MAAM,EAAE,CACjE,CAAC;QACJ,CAAC;QAED,8BAA8B;QAC9B,MAAM,mBAAmB,GAAG,IAAI,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC;QACjE,MAAM,kBAAkB,GACtB,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC;QAEpD,wBAAwB;QACxB,MAAM,2BAA2B,GAC/B,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;QACxD,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,mBAAmB,CACtD,mBAAmB,EACnB,2BAA2B,CAC5B,CAAC;QAEF,sCAAsC;QACtC,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAE/D,wBAAwB;QACxB,MAAM,aAAa,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACzE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,GAAG,aAAa,CAAC;QACxC,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC;QAElC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACzE,CAAC;QAED,oCAAoC;QACpC,MAAM,WAAW,GACf,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;QAEtE,IAAI,cAAc,KAAK,QAAQ,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAC9C,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,aAAa;QACpE,CAAC;QAED,gHAAgH;QAChH,MAAM,MAAM,GAAG,IAAI,UAAU,CAC3B,QAAQ,CAAC,MAAM;YACb,mBAAmB,CAAC,MAAM;YAC1B,kBAAkB,CAAC,MAAM;YACzB,EAAE,CAAC,MAAM;YACT,OAAO,CAAC,MAAM;YACd,WAAW,CAAC,MAAM;YAClB,SAAS,CAAC,MAAM,CACnB,CAAC;QAEF,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC7B,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC;QAC1B,MAAM,CAAC,GAAG,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;QACxC,MAAM,IAAI,mBAAmB,CAAC,MAAM,CAAC;QACrC,MAAM,CAAC,GAAG,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;QACvC,MAAM,IAAI,kBAAkB,CAAC,MAAM,CAAC;QACpC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACvB,MAAM,IAAI,EAAE,CAAC,MAAM,CAAC;QACpB,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC5B,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;QACzB,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAChC,MAAM,IAAI,WAAW,CAAC,MAAM,CAAC;QAC7B,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAE9B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACI,qBAAqB,CAC1B,cAAmD,EACnD,IAAgB,EAChB,eAAuB,CAAC,EACxB,OAAiC;QAMjC,sDAAsD;QACtD,MAAM,wBAAwB,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;QACpD,IAAI,oBAA6C,CAAC;QAElD,QAAQ,wBAAwB,EAAE,CAAC;YACjC,KAAK,KAAK,CAAC,eAAe,CAAC,MAAM;gBAC/B,oBAAoB,GAAG,uBAAuB,CAAC,MAAM,CAAC;gBACtD,MAAM;YACR,KAAK,KAAK,CAAC,eAAe,CAAC,MAAM;gBAC/B,oBAAoB,GAAG,uBAAuB,CAAC,MAAM,CAAC;gBACtD,MAAM;YACR,KAAK,KAAK,CAAC,eAAe,CAAC,QAAQ;gBACjC,MAAM,IAAI,KAAK,CACb,iEAAiE,CAClE,CAAC;YACJ;gBACE,MAAM,IAAI,KAAK,CAAC,4BAA4B,wBAAwB,EAAE,CAAC,CAAC;QAC5E,CAAC;QAED,IACE,cAAc,KAAK,SAAS;YAC5B,oBAAoB,KAAK,cAAc,EACvC,CAAC;YACD,MAAM,IAAI,KAAK,CACb,sCAAsC,cAAc,SAAS,oBAAoB,EAAE,CACpF,CAAC;QACJ,CAAC;QAED,MAAM,mBAAmB,GACvB,oBAAoB,KAAK,uBAAuB,CAAC,MAAM,CAAC;QAC1D,MAAM,YAAY,GAAG,mBAAmB;YACtC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,mBAAmB;YAClC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC;QAErC,IAAI,IAAI,CAAC,MAAM,GAAG,YAAY,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CACb,4BAA4B,YAAY,SAAS,IAAI,CAAC,MAAM,EAAE,CAC/D,CAAC;QACJ,CAAC;QAED,IAAI,MAAM,GAAG,YAAY,CAAC;QAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;QAE7C,4BAA4B;QAC5B,MAAM,IAAI,CAAC,CAAC;QAEZ,4BAA4B;QAC5B,MAAM,kBAAkB,GAAG,IAAI,CAAC,KAAK,CACnC,MAAM,EACN,MAAM,GAAG,KAAK,CAAC,iBAAiB,CACjC,CAAC;QACF,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC;QAElC,MAAM,aAAa,GACjB,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,CAAC;QAEzD,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;QACtD,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC;QAExB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC;QACjE,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC;QAE9B,iCAAiC;QACjC,MAAM,eAAe,GAAG,mBAAmB;YACzC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC;YAC5D,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;QAEtB,IAAI,mBAAmB,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC;QAC1C,CAAC;QAED,MAAM,UAAU,GAAG,mBAAmB;YACpC,CAAC,CAAC,MAAM,CACJ,IAAI,QAAQ,CACV,eAAe,CAAC,MAAM,EACtB,eAAe,CAAC,UAAU,EAC1B,eAAe,CAAC,UAAU,CAC3B,CAAC,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC,CACzB;YACH,CAAC,CAAC,OAAO,EAAE,UAAU,IAAI,CAAC,CAAC,CAAC;QAE9B,IACE,mBAAmB;YACnB,OAAO,EAAE,UAAU,KAAK,SAAS;YACjC,UAAU,KAAK,OAAO,CAAC,UAAU,EACjC,CAAC;YACD,MAAM,IAAI,KAAK,CACb,kCAAkC,UAAU,SAAS,OAAO,CAAC,UAAU,EAAE,CAC1E,CAAC;QACJ,CAAC;QAED,gEAAgE;QAEhE,6DAA6D;QAC7D,8EAA8E;QAC9E,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAEzC,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;QAEpC,6DAA6D;QAE7D,OAAO;YACL,MAAM,EAAE;gBACN,cAAc,EAAE,oBAAoB;gBACpC,kBAAkB,EAAE,aAAa;gBACjC,EAAE;gBACF,OAAO;gBACP,UAAU;gBACV,UAAU,EAAE,mBAAmB;oBAC7B,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,mBAAmB;oBAClC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,mBAAmB;aACrC;YACD,IAAI,EAAE,aAAa;YACnB,SAAS;SACV,CAAC;IACJ,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,iBAAiB,CAC5B,cAAmD,EACnD,UAAsB,EACtB,aAAyB,EACzB,eAAuB,CAAC,EACxB,OAAiC;QAEjC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAC3C,cAAc,EACd,UAAU,EACV,aAAa,EACb,YAAY,EACZ,OAAO,CACR,CAAC;QACF,OAAO,MAAM,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,mBAAmB,CAC9B,cAAmD,EACnD,UAAsB,EACtB,aAAyB,EACzB,eAAuB,CAAC,EACxB,OAAiC;QAEjC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,qBAAqB,CACjD,cAAc,EACd,aAAa,EACb,YAAY,EACZ,OAAO,CACR,CAAC;QAEF,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAChD,UAAU,EACV,MAAM,CAAC,kBAAkB,EACzB,MAAM,CAAC,EAAE,EACT,MAAM,CAAC,OAAO,EACd,IAAI,CACL,CAAC;QAEF,OAAO;YACL,SAAS;YACT,aAAa,EAAE,YAAY,GAAG,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,MAAM;SAC9D,CAAC;IACJ,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,qBAAqB,CAChC,UAAsB,EACtB,kBAA8B,EAC9B,EAAc,EACd,OAAmB,EACnB,SAAqB;QAErB,iCAAiC;QACjC,MAAM,sBAAsB,GAC1B,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,CAAC;QAEzD,wBAAwB;QACxB,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,mBAAmB,CACtD,UAAU,EACV,sBAAsB,CACvB,CAAC;QAEF,sCAAsC;QACtC,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAE/D,mDAAmD;QACnD,MAAM,gBAAgB,GAAG,aAAa,CAAC,0BAA0B,CAC/D,SAAS,EACT,OAAO,CACR,CAAC;QAEF,UAAU;QACV,OAAO,MAAM,aAAa,CAAC,OAAO,CAAC,EAAE,EAAE,gBAAgB,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IACzE,CAAC;IAEO,WAAW,CAAC,CAAa,EAAE,CAAa;QAC9C,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAClC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAAE,OAAO,KAAK,CAAC;QAClC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Wallet } from '@ethereumjs/wallet';
|
|
2
|
+
import { SecureString } from '../secure-string';
|
|
3
|
+
import { ECIESService } from './ecies/service';
|
|
4
|
+
export declare class PasswordLoginService {
|
|
5
|
+
private readonly eciesService;
|
|
6
|
+
static readonly privateKeyStorageKey = "encryptedPrivateKey";
|
|
7
|
+
static readonly saltStorageKey = "passwordLoginSalt";
|
|
8
|
+
static readonly encryptedMnemonicStorageKey = "encryptedMnemonic";
|
|
9
|
+
constructor(eciesService: ECIESService);
|
|
10
|
+
createPasswordLoginBundle(mnemonic: SecureString, password: SecureString): Promise<{
|
|
11
|
+
salt: Uint8Array;
|
|
12
|
+
encryptedPrivateKey: Uint8Array;
|
|
13
|
+
encryptedMnemonic: Uint8Array;
|
|
14
|
+
wallet: Wallet;
|
|
15
|
+
}>;
|
|
16
|
+
/**
|
|
17
|
+
* Set up password login by deriving a key from the password and using it to encrypt
|
|
18
|
+
* @param mnemonic The user's mnemonic
|
|
19
|
+
* @param password The user's password
|
|
20
|
+
*/
|
|
21
|
+
setupPasswordLoginLocalStorageBundle(mnemonic: SecureString, password: SecureString): Promise<Wallet>;
|
|
22
|
+
getWalletAndMnemonicFromEncryptedPasswordBundle(salt: Uint8Array, encryptedPrivateKey: Uint8Array, encryptedMnemonic: Uint8Array, password: SecureString): Promise<{
|
|
23
|
+
wallet: Wallet;
|
|
24
|
+
mnemonic: SecureString;
|
|
25
|
+
}>;
|
|
26
|
+
/**
|
|
27
|
+
* Recover wallet and mnemonic from password
|
|
28
|
+
* @param password The user's password
|
|
29
|
+
* @returns The user's wallet and mnemonic
|
|
30
|
+
*/
|
|
31
|
+
getWalletAndMnemonicFromLocalStorageBundle(password: SecureString): Promise<{
|
|
32
|
+
wallet: Wallet;
|
|
33
|
+
mnemonic: SecureString;
|
|
34
|
+
}>;
|
|
35
|
+
/**
|
|
36
|
+
*
|
|
37
|
+
* @returns True if password login is set up (i.e. salt and encrypted private key are in local storage)
|
|
38
|
+
*/
|
|
39
|
+
static isPasswordLoginSetup(): boolean;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=password-login.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"password-login.d.ts","sourceRoot":"","sources":["../../src/services/password-login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG5C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGhD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAG/C,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,gBAAuB,oBAAoB,yBAAyB;IACpE,gBAAuB,cAAc,uBAAuB;IAC5D,gBAAuB,2BAA2B,uBAAuB;gBAE7D,YAAY,EAAE,YAAY;IAIzB,yBAAyB,CACpC,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,YAAY,GACrB,OAAO,CAAC;QACT,IAAI,EAAE,UAAU,CAAC;QACjB,mBAAmB,EAAE,UAAU,CAAC;QAChC,iBAAiB,EAAE,UAAU,CAAC;QAC9B,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IAqCF;;;;OAIG;IACU,oCAAoC,CAC/C,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,YAAY,GACrB,OAAO,CAAC,MAAM,CAAC;IAoBL,+CAA+C,CAC1D,IAAI,EAAE,UAAU,EAChB,mBAAmB,EAAE,UAAU,EAC/B,iBAAiB,EAAE,UAAU,EAC7B,QAAQ,EAAE,YAAY,GACrB,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,YAAY,CAAA;KAAE,CAAC;IAqCtD;;;;OAIG;IACU,0CAA0C,CACrD,QAAQ,EAAE,YAAY,GACrB,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,YAAY,CAAA;KAAE,CAAC;IAgCtD;;;OAGG;WACW,oBAAoB,IAAI,OAAO;CAkB9C"}
|