@digitaldefiance/ecies-lib 1.1.24 → 1.1.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -0
- package/package.json +5 -4
- package/src/constants.d.ts +46 -0
- package/src/constants.d.ts.map +1 -0
- package/src/constants.js +358 -0
- package/src/constants.js.map +1 -0
- package/src/email-string.d.ts +42 -0
- package/src/email-string.d.ts.map +1 -0
- package/src/email-string.js +73 -0
- package/src/email-string.js.map +1 -0
- package/src/enumerations/ecies-encryption-type.d.ts +15 -0
- package/src/enumerations/ecies-encryption-type.d.ts.map +1 -0
- package/src/enumerations/ecies-encryption-type.js +71 -0
- package/src/enumerations/ecies-encryption-type.js.map +1 -0
- package/src/enumerations/ecies-error-type.d.ts +32 -0
- package/src/enumerations/ecies-error-type.d.ts.map +1 -0
- package/src/enumerations/ecies-error-type.js +36 -0
- package/src/enumerations/ecies-error-type.js.map +1 -0
- package/src/enumerations/ecies-string-key.d.ts +96 -0
- package/src/enumerations/ecies-string-key.d.ts.map +1 -0
- package/src/enumerations/ecies-string-key.js +105 -0
- package/src/enumerations/ecies-string-key.js.map +1 -0
- package/src/enumerations/guid-brand-type.d.ts +27 -0
- package/src/enumerations/guid-brand-type.d.ts.map +1 -0
- package/src/enumerations/guid-brand-type.js +31 -0
- package/src/enumerations/guid-brand-type.js.map +1 -0
- package/src/enumerations/guid-error-type.d.ts +7 -0
- package/src/enumerations/guid-error-type.d.ts.map +1 -0
- package/src/enumerations/guid-error-type.js +11 -0
- package/src/enumerations/guid-error-type.js.map +1 -0
- package/src/enumerations/{index.ts → index.d.ts} +1 -0
- package/src/enumerations/index.d.ts.map +1 -0
- package/src/enumerations/index.js +18 -0
- package/src/enumerations/index.js.map +1 -0
- package/src/enumerations/invalid-email-type.d.ts +6 -0
- package/src/enumerations/invalid-email-type.d.ts.map +1 -0
- package/src/enumerations/invalid-email-type.js +10 -0
- package/src/enumerations/invalid-email-type.js.map +1 -0
- package/src/enumerations/length-encoding-type.d.ts +7 -0
- package/src/enumerations/length-encoding-type.d.ts.map +1 -0
- package/src/enumerations/length-encoding-type.js +11 -0
- package/src/enumerations/length-encoding-type.js.map +1 -0
- package/src/enumerations/length-error-type.d.ts +6 -0
- package/src/enumerations/length-error-type.d.ts.map +1 -0
- package/src/enumerations/length-error-type.js +10 -0
- package/src/enumerations/length-error-type.js.map +1 -0
- package/src/enumerations/member-error-type.d.ts +87 -0
- package/src/enumerations/member-error-type.d.ts.map +1 -0
- package/src/enumerations/member-error-type.js +91 -0
- package/src/enumerations/member-error-type.js.map +1 -0
- package/src/enumerations/{member-type.ts → member-type.d.ts} +6 -7
- package/src/enumerations/member-type.d.ts.map +1 -0
- package/src/enumerations/member-type.js +19 -0
- package/src/enumerations/member-type.js.map +1 -0
- package/src/enumerations/password-login-error-type.d.ts +5 -0
- package/src/enumerations/password-login-error-type.d.ts.map +1 -0
- package/src/enumerations/password-login-error-type.js +9 -0
- package/src/enumerations/password-login-error-type.js.map +1 -0
- package/src/enumerations/pbkdf2-error-type.d.ts +6 -0
- package/src/enumerations/pbkdf2-error-type.d.ts.map +1 -0
- package/src/enumerations/pbkdf2-error-type.js +10 -0
- package/src/enumerations/pbkdf2-error-type.js.map +1 -0
- package/src/enumerations/pbkdf2-profile.d.ts +6 -0
- package/src/enumerations/pbkdf2-profile.d.ts.map +1 -0
- package/src/enumerations/pbkdf2-profile.js +10 -0
- package/src/enumerations/pbkdf2-profile.js.map +1 -0
- package/src/enumerations/secure-storage-error-type.d.ts +6 -0
- package/src/enumerations/secure-storage-error-type.d.ts.map +1 -0
- package/src/enumerations/secure-storage-error-type.js +10 -0
- package/src/enumerations/secure-storage-error-type.js.map +1 -0
- package/src/errors/disposed.d.ts +4 -0
- package/src/errors/disposed.d.ts.map +1 -0
- package/src/errors/disposed.js +20 -0
- package/src/errors/disposed.js.map +1 -0
- package/src/errors/ecies.d.ts +7 -0
- package/src/errors/ecies.d.ts.map +1 -0
- package/src/errors/ecies.js +15 -0
- package/src/errors/ecies.js.map +1 -0
- package/src/errors/guid.d.ts +15 -0
- package/src/errors/guid.d.ts.map +1 -0
- package/src/errors/guid.js +26 -0
- package/src/errors/guid.js.map +1 -0
- package/src/errors/{index.ts → index.d.ts} +1 -0
- package/src/errors/index.d.ts.map +1 -0
- package/src/errors/index.js +12 -0
- package/src/errors/index.js.map +1 -0
- package/src/errors/invalid-email.d.ts +7 -0
- package/src/errors/invalid-email.d.ts.map +1 -0
- package/src/errors/invalid-email.js +14 -0
- package/src/errors/invalid-email.js.map +1 -0
- package/src/errors/length.d.ts +7 -0
- package/src/errors/length.d.ts.map +1 -0
- package/src/errors/length.js +14 -0
- package/src/errors/length.js.map +1 -0
- package/src/errors/member.d.ts +7 -0
- package/src/errors/member.d.ts.map +1 -0
- package/src/errors/member.js +14 -0
- package/src/errors/member.js.map +1 -0
- package/src/errors/pbkdf2.d.ts +7 -0
- package/src/errors/pbkdf2.d.ts.map +1 -0
- package/src/errors/pbkdf2.js +14 -0
- package/src/errors/pbkdf2.js.map +1 -0
- package/src/errors/secure-storage.d.ts +7 -0
- package/src/errors/secure-storage.d.ts.map +1 -0
- package/src/errors/secure-storage.js +15 -0
- package/src/errors/secure-storage.js.map +1 -0
- package/src/errors/simple-ecies.d.ts +6 -0
- package/src/errors/simple-ecies.d.ts.map +1 -0
- package/src/errors/simple-ecies.js +15 -0
- package/src/errors/simple-ecies.js.map +1 -0
- package/src/errors/simple-test-error.d.ts +4 -0
- package/src/errors/simple-test-error.d.ts.map +1 -0
- package/src/errors/simple-test-error.js +11 -0
- package/src/errors/simple-test-error.js.map +1 -0
- package/src/guid.d.ts +153 -0
- package/src/guid.d.ts.map +1 -0
- package/src/guid.js +615 -0
- package/src/guid.js.map +1 -0
- package/src/i18n-setup.d.ts +24 -0
- package/src/i18n-setup.d.ts.map +1 -0
- package/src/i18n-setup.js +837 -0
- package/src/i18n-setup.js.map +1 -0
- package/src/{index.ts → index.d.ts} +1 -0
- package/src/index.d.ts.map +1 -0
- package/src/index.js +19 -0
- package/src/index.js.map +1 -0
- package/src/interfaces/checksum-config.d.ts +5 -0
- package/src/interfaces/checksum-config.d.ts.map +1 -0
- package/src/interfaces/checksum-config.js +3 -0
- package/src/interfaces/checksum-config.js.map +1 -0
- package/src/interfaces/checksum-consts.d.ts +11 -0
- package/src/interfaces/checksum-consts.d.ts.map +1 -0
- package/src/interfaces/checksum-consts.js +3 -0
- package/src/interfaces/checksum-consts.js.map +1 -0
- package/src/interfaces/constants.d.ts +45 -0
- package/src/interfaces/constants.d.ts.map +1 -0
- package/src/interfaces/constants.js +3 -0
- package/src/interfaces/constants.js.map +1 -0
- package/src/interfaces/ecies-config.d.ts +9 -0
- package/src/interfaces/ecies-config.d.ts.map +1 -0
- package/src/interfaces/ecies-config.js +3 -0
- package/src/interfaces/ecies-config.js.map +1 -0
- package/src/interfaces/ecies-consts.d.ts +58 -0
- package/src/interfaces/ecies-consts.d.ts.map +1 -0
- package/src/interfaces/ecies-consts.js +3 -0
- package/src/interfaces/ecies-consts.js.map +1 -0
- package/src/interfaces/ecies-file-service.d.ts +7 -0
- package/src/interfaces/ecies-file-service.d.ts.map +1 -0
- package/src/interfaces/ecies-file-service.js +3 -0
- package/src/interfaces/ecies-file-service.js.map +1 -0
- package/src/interfaces/guid.d.ts +45 -0
- package/src/interfaces/guid.d.ts.map +1 -0
- package/src/interfaces/guid.js +3 -0
- package/src/interfaces/guid.js.map +1 -0
- package/src/interfaces/{index.ts → index.d.ts} +1 -0
- package/src/interfaces/index.d.ts.map +1 -0
- package/src/interfaces/index.js +17 -0
- package/src/interfaces/index.js.map +1 -0
- package/src/interfaces/library-error.d.ts +23 -0
- package/src/interfaces/library-error.d.ts.map +1 -0
- package/src/interfaces/library-error.js +3 -0
- package/src/interfaces/library-error.js.map +1 -0
- package/src/interfaces/member-operational.d.ts +40 -0
- package/src/interfaces/member-operational.d.ts.map +1 -0
- package/src/interfaces/member-operational.js +3 -0
- package/src/interfaces/member-operational.js.map +1 -0
- package/src/interfaces/{member-storage.ts → member-storage.d.ts} +10 -11
- package/src/interfaces/member-storage.d.ts.map +1 -0
- package/src/interfaces/member-storage.js +3 -0
- package/src/interfaces/member-storage.js.map +1 -0
- package/src/interfaces/{member-with-mnemonic.ts → member-with-mnemonic.d.ts} +3 -3
- package/src/interfaces/member-with-mnemonic.d.ts.map +1 -0
- package/src/interfaces/member-with-mnemonic.js +3 -0
- package/src/interfaces/member-with-mnemonic.js.map +1 -0
- package/src/interfaces/pbkdf2-config.d.ts +7 -0
- package/src/interfaces/pbkdf2-config.d.ts.map +1 -0
- package/src/interfaces/pbkdf2-config.js +3 -0
- package/src/interfaces/pbkdf2-config.js.map +1 -0
- package/src/interfaces/pbkdf2-consts.d.ts +9 -0
- package/src/interfaces/pbkdf2-consts.d.ts.map +1 -0
- package/src/interfaces/pbkdf2-consts.js +3 -0
- package/src/interfaces/pbkdf2-consts.js.map +1 -0
- package/src/interfaces/pbkdf2-result.d.ts +6 -0
- package/src/interfaces/pbkdf2-result.d.ts.map +1 -0
- package/src/interfaces/pbkdf2-result.js +3 -0
- package/src/interfaces/pbkdf2-result.js.map +1 -0
- package/src/member.d.ts +66 -0
- package/src/member.d.ts.map +1 -0
- package/src/member.js +269 -0
- package/src/member.js.map +1 -0
- package/src/{pbkdf2-profiles.ts → pbkdf2-profiles.d.ts} +2 -2
- package/src/pbkdf2-profiles.d.ts.map +1 -0
- package/src/pbkdf2-profiles.js +3 -0
- package/src/pbkdf2-profiles.js.map +1 -0
- package/src/phone-number.d.ts +6 -0
- package/src/phone-number.d.ts.map +1 -0
- package/src/phone-number.js +22 -0
- package/src/phone-number.js.map +1 -0
- package/src/regexes.d.ts +7 -0
- package/src/regexes.d.ts.map +1 -0
- package/src/regexes.js +10 -0
- package/src/regexes.js.map +1 -0
- package/src/secure-buffer.d.ts +38 -0
- package/src/secure-buffer.d.ts.map +1 -0
- package/src/secure-buffer.js +168 -0
- package/src/secure-buffer.js.map +1 -0
- package/src/secure-string.d.ts +39 -0
- package/src/secure-string.d.ts.map +1 -0
- package/src/secure-string.js +195 -0
- package/src/secure-string.js.map +1 -0
- package/src/services/aes-gcm.d.ts +57 -0
- package/src/services/aes-gcm.d.ts.map +1 -0
- package/src/services/aes-gcm.js +111 -0
- package/src/services/aes-gcm.js.map +1 -0
- package/src/services/ecies/crypto-core.d.ts +51 -0
- package/src/services/ecies/crypto-core.d.ts.map +1 -0
- package/src/services/ecies/crypto-core.js +139 -0
- package/src/services/ecies/crypto-core.js.map +1 -0
- package/src/services/ecies/example.d.ts +25 -0
- package/src/services/ecies/example.d.ts.map +1 -0
- package/src/services/ecies/example.js +128 -0
- package/src/services/ecies/example.js.map +1 -0
- package/src/services/ecies/file.d.ts +18 -0
- package/src/services/ecies/file.d.ts.map +1 -0
- package/src/services/ecies/file.js +110 -0
- package/src/services/ecies/file.js.map +1 -0
- package/src/services/ecies/{index.ts → index.d.ts} +1 -3
- package/src/services/ecies/index.d.ts.map +1 -0
- package/src/services/ecies/index.js +44 -0
- package/src/services/ecies/index.js.map +1 -0
- package/src/services/ecies/integration.d.ts +59 -0
- package/src/services/ecies/integration.d.ts.map +1 -0
- package/src/services/ecies/integration.js +172 -0
- package/src/services/ecies/integration.js.map +1 -0
- package/src/services/ecies/interfaces.d.ts +51 -0
- package/src/services/ecies/interfaces.d.ts.map +1 -0
- package/src/services/ecies/interfaces.js +6 -0
- package/src/services/ecies/interfaces.js.map +1 -0
- package/src/services/ecies/manual-test.d.ts +29 -0
- package/src/services/ecies/manual-test.d.ts.map +1 -0
- package/src/services/ecies/manual-test.js +171 -0
- package/src/services/ecies/manual-test.js.map +1 -0
- package/src/services/ecies/multi-recipient.d.ts +52 -0
- package/src/services/ecies/multi-recipient.d.ts.map +1 -0
- package/src/services/ecies/multi-recipient.js +243 -0
- package/src/services/ecies/multi-recipient.js.map +1 -0
- package/src/services/ecies/service.d.ts +104 -0
- package/src/services/ecies/service.d.ts.map +1 -0
- package/src/services/ecies/service.js +192 -0
- package/src/services/ecies/service.js.map +1 -0
- package/src/services/ecies/signature.d.ts +27 -0
- package/src/services/ecies/signature.d.ts.map +1 -0
- package/src/services/ecies/signature.js +76 -0
- package/src/services/ecies/signature.js.map +1 -0
- package/src/services/ecies/single-recipient.d.ts +46 -0
- package/src/services/ecies/single-recipient.d.ts.map +1 -0
- package/src/services/ecies/single-recipient.js +212 -0
- package/src/services/ecies/single-recipient.js.map +1 -0
- package/src/services/{index.ts → index.d.ts} +1 -0
- package/src/services/index.d.ts.map +1 -0
- package/src/services/index.js +9 -0
- package/src/services/index.js.map +1 -0
- package/src/services/password-login.d.ts +49 -0
- package/src/services/password-login.d.ts.map +1 -0
- package/src/services/password-login.js +121 -0
- package/src/services/password-login.js.map +1 -0
- package/src/services/pbkdf2.d.ts +56 -0
- package/src/services/pbkdf2.d.ts.map +1 -0
- package/src/services/pbkdf2.js +114 -0
- package/src/services/pbkdf2.js.map +1 -0
- package/src/services/xor.d.ts +37 -0
- package/src/services/xor.d.ts.map +1 -0
- package/src/services/xor.js +67 -0
- package/src/services/xor.js.map +1 -0
- package/src/types/deep-partial.d.ts +4 -0
- package/src/types/deep-partial.d.ts.map +1 -0
- package/src/types/deep-partial.js +3 -0
- package/src/types/deep-partial.js.map +1 -0
- package/src/{types.ts → types.d.ts} +4 -10
- package/src/types.d.ts.map +1 -0
- package/src/types.js +3 -0
- package/src/types.js.map +1 -0
- package/src/utils.d.ts +68 -0
- package/src/utils.d.ts.map +1 -0
- package/src/utils.js +288 -0
- package/src/utils.js.map +1 -0
- package/LICENSE +0 -21
- package/src/constants.ts +0 -474
- package/src/email-string.ts +0 -83
- package/src/enumerations/ecies-encryption-type.ts +0 -102
- package/src/enumerations/ecies-error-type.ts +0 -31
- package/src/enumerations/ecies-string-key.ts +0 -108
- package/src/enumerations/guid-brand-type.ts +0 -26
- package/src/enumerations/guid-error-type.ts +0 -6
- package/src/enumerations/invalid-email-type.ts +0 -5
- package/src/enumerations/length-encoding-type.ts +0 -6
- package/src/enumerations/length-error-type.ts +0 -5
- package/src/enumerations/member-error-type.ts +0 -106
- package/src/enumerations/password-login-error-type.ts +0 -4
- package/src/enumerations/pbkdf2-error-type.ts +0 -5
- package/src/enumerations/pbkdf2-profile.ts +0 -5
- package/src/enumerations/secure-storage-error-type.ts +0 -5
- package/src/errors/disposed.ts +0 -15
- package/src/errors/ecies.ts +0 -34
- package/src/errors/guid.ts +0 -34
- package/src/errors/invalid-email.ts +0 -11
- package/src/errors/length.ts +0 -11
- package/src/errors/member.ts +0 -12
- package/src/errors/pbkdf2.ts +0 -12
- package/src/errors/secure-storage.ts +0 -13
- package/src/errors/simple-ecies.ts +0 -18
- package/src/errors/simple-test-error.ts +0 -6
- package/src/guid.ts +0 -800
- package/src/i18n-setup.ts +0 -1312
- package/src/interfaces/checksum-config.ts +0 -4
- package/src/interfaces/checksum-consts.ts +0 -13
- package/src/interfaces/constants.ts +0 -48
- package/src/interfaces/ecies-config.ts +0 -8
- package/src/interfaces/ecies-consts.ts +0 -70
- package/src/interfaces/ecies-file-service.ts +0 -6
- package/src/interfaces/guid.ts +0 -53
- package/src/interfaces/library-error.ts +0 -23
- package/src/interfaces/member-operational.ts +0 -54
- package/src/interfaces/pbkdf2-config.ts +0 -6
- package/src/interfaces/pbkdf2-consts.ts +0 -10
- package/src/interfaces/pbkdf2-result.ts +0 -5
- package/src/member.ts +0 -429
- package/src/phone-number.ts +0 -18
- package/src/regexes.ts +0 -10
- package/src/secure-buffer.ts +0 -183
- package/src/secure-string.ts +0 -229
- package/src/services/aes-gcm.ts +0 -177
- package/src/services/ecies/README.md +0 -147
- package/src/services/ecies/crypto-core.ts +0 -180
- package/src/services/ecies/example.ts +0 -185
- package/src/services/ecies/file.ts +0 -167
- package/src/services/ecies/integration.ts +0 -241
- package/src/services/ecies/interfaces.ts +0 -59
- package/src/services/ecies/manual-test.ts +0 -219
- package/src/services/ecies/multi-recipient.ts +0 -394
- package/src/services/ecies/service.ts +0 -317
- package/src/services/ecies/signature.ts +0 -93
- package/src/services/ecies/single-recipient.ts +0 -340
- package/src/services/password-login.ts +0 -228
- package/src/services/pbkdf2.ts +0 -172
- package/src/services/xor.ts +0 -65
- package/src/types/deep-partial.ts +0 -11
- package/src/utils.ts +0 -331
package/src/secure-string.ts
DELETED
|
@@ -1,229 +0,0 @@
|
|
|
1
|
-
import { SecureStorageErrorType } from './enumerations/secure-storage-error-type';
|
|
2
|
-
import { DisposedError } from './errors/disposed';
|
|
3
|
-
import { SecureStorageError } from './errors/secure-storage';
|
|
4
|
-
import { GuidV4 } from './guid';
|
|
5
|
-
import { getEciesI18nEngine } from './i18n-setup';
|
|
6
|
-
import { XorService } from './services/xor';
|
|
7
|
-
import { FullHexGuid, RawGuidUint8Array } from './types';
|
|
8
|
-
import { uint8ArrayToHex } from './utils';
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* A secure string buffer is a buffer whose intent is to prevent the raw password from being stored in memory.
|
|
12
|
-
*/
|
|
13
|
-
export class SecureString {
|
|
14
|
-
private _disposed: boolean = false;
|
|
15
|
-
private readonly _isNull: boolean;
|
|
16
|
-
private readonly _id: GuidV4;
|
|
17
|
-
private readonly _length: number;
|
|
18
|
-
private readonly _obfuscatedValue: Uint8Array;
|
|
19
|
-
private readonly _key: Uint8Array;
|
|
20
|
-
private readonly _obfuscatedChecksum: Uint8Array;
|
|
21
|
-
private _disposedAt?: string;
|
|
22
|
-
constructor(data?: string | Uint8Array | null) {
|
|
23
|
-
this._id = GuidV4.new();
|
|
24
|
-
// only treat null/undefined as null, empty strings/arrays are valid empty data
|
|
25
|
-
if (data === null || data === undefined) {
|
|
26
|
-
this._isNull = true;
|
|
27
|
-
this._length = 0;
|
|
28
|
-
this._obfuscatedValue = new Uint8Array(0);
|
|
29
|
-
this._key = new Uint8Array(0);
|
|
30
|
-
this._obfuscatedChecksum = new Uint8Array(0);
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
this._isNull = false;
|
|
34
|
-
this._key = this.idUint8Array;
|
|
35
|
-
const dataAsUint8Array =
|
|
36
|
-
typeof data === 'string'
|
|
37
|
-
? new TextEncoder().encode(data)
|
|
38
|
-
: (data as Uint8Array);
|
|
39
|
-
// Store the byte length, not the character length
|
|
40
|
-
this._length = dataAsUint8Array.length;
|
|
41
|
-
this._obfuscatedValue = this.obfuscateData(dataAsUint8Array);
|
|
42
|
-
this._obfuscatedChecksum =
|
|
43
|
-
this.createSimpleObfuscatedChecksum(dataAsUint8Array);
|
|
44
|
-
}
|
|
45
|
-
private assertNotDisposed(): void {
|
|
46
|
-
if (this._disposed) {
|
|
47
|
-
const e = new DisposedError();
|
|
48
|
-
try {
|
|
49
|
-
(e as any).disposedAt = this._disposedAt;
|
|
50
|
-
} catch {
|
|
51
|
-
// ignore if Error object is sealed/frozen
|
|
52
|
-
}
|
|
53
|
-
throw e;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
public dispose(): void {
|
|
57
|
-
const err = new DisposedError();
|
|
58
|
-
if (typeof (Error as any).captureStackTrace === 'function') {
|
|
59
|
-
(Error as any).captureStackTrace(err, this.dispose);
|
|
60
|
-
}
|
|
61
|
-
this._disposedAt = err.stack ?? 'stack unavailable';
|
|
62
|
-
this._obfuscatedValue.fill(0);
|
|
63
|
-
this._key.fill(0);
|
|
64
|
-
this._obfuscatedChecksum.fill(0);
|
|
65
|
-
this._disposed = true;
|
|
66
|
-
}
|
|
67
|
-
public get disposedAtStack(): string | undefined {
|
|
68
|
-
return this._disposedAt;
|
|
69
|
-
}
|
|
70
|
-
public get id(): FullHexGuid {
|
|
71
|
-
this.assertNotDisposed();
|
|
72
|
-
return this._id.asFullHexGuid;
|
|
73
|
-
}
|
|
74
|
-
public get idUint8Array(): RawGuidUint8Array {
|
|
75
|
-
this.assertNotDisposed();
|
|
76
|
-
return this._id.asRawGuidUint8Array;
|
|
77
|
-
}
|
|
78
|
-
public get originalLength(): number {
|
|
79
|
-
this.assertNotDisposed();
|
|
80
|
-
return this._length;
|
|
81
|
-
}
|
|
82
|
-
public get valueAsUint8Array(): Uint8Array {
|
|
83
|
-
this.assertNotDisposed();
|
|
84
|
-
if (this._isNull) {
|
|
85
|
-
return new Uint8Array(0);
|
|
86
|
-
}
|
|
87
|
-
try {
|
|
88
|
-
const deobfuscatedResult = this.deobfuscateData(this._obfuscatedValue);
|
|
89
|
-
if (deobfuscatedResult.length !== this._length) {
|
|
90
|
-
throw new SecureStorageError(
|
|
91
|
-
SecureStorageErrorType.DecryptedValueLengthMismatch,
|
|
92
|
-
getEciesI18nEngine() as any,
|
|
93
|
-
);
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
// Validate checksum
|
|
97
|
-
const expectedChecksum = this.createSimpleChecksum(deobfuscatedResult);
|
|
98
|
-
const storedChecksum = new TextDecoder().decode(
|
|
99
|
-
this.deobfuscateData(this._obfuscatedChecksum),
|
|
100
|
-
);
|
|
101
|
-
|
|
102
|
-
const expectedBytes = new TextEncoder().encode(expectedChecksum);
|
|
103
|
-
const storedBytes = new TextEncoder().encode(storedChecksum);
|
|
104
|
-
if (!this.timingSafeEqual(expectedBytes, storedBytes)) {
|
|
105
|
-
throw new SecureStorageError(
|
|
106
|
-
SecureStorageErrorType.DecryptedValueChecksumMismatch,
|
|
107
|
-
getEciesI18nEngine() as any,
|
|
108
|
-
);
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
return deobfuscatedResult;
|
|
112
|
-
} catch (error) {
|
|
113
|
-
// If it's already a SecureStorageError, re-throw it
|
|
114
|
-
if (error instanceof SecureStorageError) {
|
|
115
|
-
throw error;
|
|
116
|
-
}
|
|
117
|
-
// Convert any other error to SecureStorageError
|
|
118
|
-
throw new SecureStorageError(
|
|
119
|
-
SecureStorageErrorType.DecryptedValueChecksumMismatch,
|
|
120
|
-
getEciesI18nEngine() as any,
|
|
121
|
-
);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
public get value(): string | null {
|
|
125
|
-
this.assertNotDisposed();
|
|
126
|
-
if (this._isNull) {
|
|
127
|
-
return null;
|
|
128
|
-
}
|
|
129
|
-
return new TextDecoder().decode(this.valueAsUint8Array);
|
|
130
|
-
}
|
|
131
|
-
public get notNullValue(): string {
|
|
132
|
-
this.assertNotDisposed();
|
|
133
|
-
if (this._isNull) {
|
|
134
|
-
throw new SecureStorageError(
|
|
135
|
-
SecureStorageErrorType.ValueIsNull,
|
|
136
|
-
getEciesI18nEngine() as any,
|
|
137
|
-
);
|
|
138
|
-
}
|
|
139
|
-
return new TextDecoder().decode(this.valueAsUint8Array);
|
|
140
|
-
}
|
|
141
|
-
public get valueAsHexString(): string {
|
|
142
|
-
this.assertNotDisposed();
|
|
143
|
-
return uint8ArrayToHex(this.valueAsUint8Array);
|
|
144
|
-
}
|
|
145
|
-
public get valueAsBase64String(): string {
|
|
146
|
-
this.assertNotDisposed();
|
|
147
|
-
return btoa(String.fromCharCode(...this.valueAsUint8Array));
|
|
148
|
-
}
|
|
149
|
-
public get hasValue(): boolean {
|
|
150
|
-
this.assertNotDisposed();
|
|
151
|
-
return !this._isNull && this._length > 0;
|
|
152
|
-
}
|
|
153
|
-
public get checksum(): string {
|
|
154
|
-
this.assertNotDisposed();
|
|
155
|
-
const deobfuscatedChecksum = new TextDecoder().decode(
|
|
156
|
-
this.deobfuscateData(this._obfuscatedChecksum),
|
|
157
|
-
);
|
|
158
|
-
return deobfuscatedChecksum;
|
|
159
|
-
}
|
|
160
|
-
public get length(): number {
|
|
161
|
-
this.assertNotDisposed();
|
|
162
|
-
return this._length;
|
|
163
|
-
}
|
|
164
|
-
private async generateChecksum(data: string | Uint8Array): Promise<string> {
|
|
165
|
-
const dataBytes =
|
|
166
|
-
typeof data === 'string' ? new TextEncoder().encode(data) : data;
|
|
167
|
-
const hashArray = await crypto.subtle.digest(
|
|
168
|
-
'SHA-256',
|
|
169
|
-
new Uint8Array(dataBytes),
|
|
170
|
-
);
|
|
171
|
-
return uint8ArrayToHex(new Uint8Array(hashArray));
|
|
172
|
-
}
|
|
173
|
-
private createSimpleChecksum(data: Uint8Array): string {
|
|
174
|
-
let hash = 0;
|
|
175
|
-
for (let i = 0; i < data.length; i++) {
|
|
176
|
-
hash = ((hash << 5) - hash + data[i]) & 0xffffffff;
|
|
177
|
-
}
|
|
178
|
-
return hash.toString(16);
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
private createSimpleObfuscatedChecksum(
|
|
182
|
-
data: string | Uint8Array,
|
|
183
|
-
): Uint8Array {
|
|
184
|
-
const dataBytes =
|
|
185
|
-
typeof data === 'string' ? new TextEncoder().encode(data) : data;
|
|
186
|
-
const checksum = this.createSimpleChecksum(dataBytes);
|
|
187
|
-
return this.obfuscateData(new TextEncoder().encode(checksum));
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
private async createObfuscatedChecksum(
|
|
191
|
-
data: string | Uint8Array,
|
|
192
|
-
): Promise<Uint8Array> {
|
|
193
|
-
const checksum = await this.generateChecksum(data);
|
|
194
|
-
const result = this.obfuscateData(new TextEncoder().encode(checksum));
|
|
195
|
-
return result;
|
|
196
|
-
}
|
|
197
|
-
private async validateChecksum(
|
|
198
|
-
data: string | Uint8Array,
|
|
199
|
-
checksum: string,
|
|
200
|
-
): Promise<boolean> {
|
|
201
|
-
const generatedChecksum = await this.generateChecksum(data);
|
|
202
|
-
return generatedChecksum === checksum;
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
private timingSafeEqual(a: Uint8Array, b: Uint8Array): boolean {
|
|
206
|
-
if (a.length !== b.length) {
|
|
207
|
-
return false;
|
|
208
|
-
}
|
|
209
|
-
let result = 0;
|
|
210
|
-
for (let i = 0; i < a.length; i++) {
|
|
211
|
-
result |= a[i] ^ b[i];
|
|
212
|
-
}
|
|
213
|
-
return result === 0;
|
|
214
|
-
}
|
|
215
|
-
private async validateObfuscatedChecksum(
|
|
216
|
-
data: string | Uint8Array,
|
|
217
|
-
): Promise<boolean> {
|
|
218
|
-
const deobfuscatedChecksum = new TextDecoder().decode(
|
|
219
|
-
this.deobfuscateData(this._obfuscatedChecksum),
|
|
220
|
-
);
|
|
221
|
-
return this.validateChecksum(data, deobfuscatedChecksum);
|
|
222
|
-
}
|
|
223
|
-
private obfuscateData(data: Uint8Array): Uint8Array {
|
|
224
|
-
return XorService.xor(data, this._key);
|
|
225
|
-
}
|
|
226
|
-
private deobfuscateData(data: Uint8Array): Uint8Array {
|
|
227
|
-
return XorService.xor(data, this._key);
|
|
228
|
-
}
|
|
229
|
-
}
|
package/src/services/aes-gcm.ts
DELETED
|
@@ -1,177 +0,0 @@
|
|
|
1
|
-
import { IECIESConstants } from '../interfaces/ecies-consts';
|
|
2
|
-
import { Constants } from '../constants';
|
|
3
|
-
import { EciesComponentId, getEciesI18nEngine } from '../i18n-setup';
|
|
4
|
-
import { EciesStringKey } from '../enumerations';
|
|
5
|
-
|
|
6
|
-
export abstract class AESGCMService {
|
|
7
|
-
public static readonly ALGORITHM_NAME = 'AES-GCM';
|
|
8
|
-
/**
|
|
9
|
-
* Encrypt data using AES-GCM
|
|
10
|
-
* @param data Data to encrypt
|
|
11
|
-
* @param key Key to use for encryption (must be 16, 24 or 32 bytes for AES)
|
|
12
|
-
* @returns Encrypted data
|
|
13
|
-
*/
|
|
14
|
-
public static async encrypt(
|
|
15
|
-
data: Uint8Array,
|
|
16
|
-
key: Uint8Array,
|
|
17
|
-
authTag: boolean = false,
|
|
18
|
-
eciesParams: IECIESConstants = Constants.ECIES,
|
|
19
|
-
): Promise<{ encrypted: Uint8Array; iv: Uint8Array; tag?: Uint8Array }> {
|
|
20
|
-
const cryptoKey = await crypto.subtle.importKey(
|
|
21
|
-
'raw',
|
|
22
|
-
new Uint8Array(key),
|
|
23
|
-
{ name: AESGCMService.ALGORITHM_NAME },
|
|
24
|
-
false,
|
|
25
|
-
['encrypt'],
|
|
26
|
-
);
|
|
27
|
-
|
|
28
|
-
const eciesConsts = eciesParams;
|
|
29
|
-
const iv = crypto.getRandomValues(new Uint8Array(eciesConsts.IV_SIZE));
|
|
30
|
-
const encryptedResult = await crypto.subtle.encrypt(
|
|
31
|
-
{
|
|
32
|
-
name: AESGCMService.ALGORITHM_NAME,
|
|
33
|
-
iv,
|
|
34
|
-
...(authTag && { tagLength: eciesConsts.AUTH_TAG_SIZE * 8 }),
|
|
35
|
-
},
|
|
36
|
-
cryptoKey,
|
|
37
|
-
new Uint8Array(data),
|
|
38
|
-
);
|
|
39
|
-
|
|
40
|
-
const encryptedArray = new Uint8Array(encryptedResult);
|
|
41
|
-
if (!authTag) {
|
|
42
|
-
return { encrypted: encryptedArray, iv };
|
|
43
|
-
}
|
|
44
|
-
const authTagLengthBytes = eciesConsts.AUTH_TAG_SIZE;
|
|
45
|
-
const encryptedBytes = encryptedArray.slice(0, -authTagLengthBytes); // Remove auth tag
|
|
46
|
-
const authTagBytes = encryptedArray.slice(-authTagLengthBytes); // Last 16 bytes are auth tag
|
|
47
|
-
|
|
48
|
-
return { encrypted: encryptedBytes, iv, tag: authTagBytes };
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* Combine encrypted data and auth tag into a single Uint8Array
|
|
53
|
-
* @param encryptedData The encrypted data
|
|
54
|
-
* @param authTag The authentication tag
|
|
55
|
-
* @returns The combined Uint8Array
|
|
56
|
-
*/
|
|
57
|
-
public static combineEncryptedDataAndTag(
|
|
58
|
-
encryptedData: Uint8Array,
|
|
59
|
-
authTag: Uint8Array,
|
|
60
|
-
): Uint8Array {
|
|
61
|
-
const combined = new Uint8Array(encryptedData.length + authTag.length);
|
|
62
|
-
combined.set(encryptedData);
|
|
63
|
-
combined.set(authTag, encryptedData.length);
|
|
64
|
-
return combined;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Combine IV and encrypted data (with optional auth tag) into a single Uint8Array
|
|
69
|
-
* @param iv The initialization vector
|
|
70
|
-
* @param encryptedDataWithTag The encrypted data with auth tag already appended (if applicable)
|
|
71
|
-
* @returns The combined Uint8Array
|
|
72
|
-
*/
|
|
73
|
-
public static combineIvAndEncryptedData(
|
|
74
|
-
iv: Uint8Array,
|
|
75
|
-
encryptedDataWithTag: Uint8Array,
|
|
76
|
-
): Uint8Array {
|
|
77
|
-
const combined = new Uint8Array(iv.length + encryptedDataWithTag.length);
|
|
78
|
-
combined.set(iv);
|
|
79
|
-
combined.set(encryptedDataWithTag, iv.length);
|
|
80
|
-
return combined;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* Combine IV, encrypted data and auth tag into a single Uint8Array
|
|
85
|
-
* @param iv The initialization vector
|
|
86
|
-
* @param encryptedData The encrypted data
|
|
87
|
-
* @param authTag The authentication tag
|
|
88
|
-
* @returns The combined Uint8Array
|
|
89
|
-
*/
|
|
90
|
-
public static combineIvTagAndEncryptedData(
|
|
91
|
-
iv: Uint8Array,
|
|
92
|
-
encryptedData: Uint8Array,
|
|
93
|
-
authTag: Uint8Array,
|
|
94
|
-
): Uint8Array {
|
|
95
|
-
const encryptedWithTag = AESGCMService.combineEncryptedDataAndTag(
|
|
96
|
-
encryptedData,
|
|
97
|
-
authTag,
|
|
98
|
-
);
|
|
99
|
-
return AESGCMService.combineIvAndEncryptedData(iv, encryptedWithTag);
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
/**
|
|
103
|
-
* Split combined encrypted data back into its components
|
|
104
|
-
* @param combinedData The combined data containing IV, encrypted data, and optionally auth tag
|
|
105
|
-
* @param hasAuthTag Whether the combined data includes an authentication tag
|
|
106
|
-
* @returns Object containing the split components
|
|
107
|
-
*/
|
|
108
|
-
public static splitEncryptedData(
|
|
109
|
-
combinedData: Uint8Array,
|
|
110
|
-
hasAuthTag: boolean = true,
|
|
111
|
-
eciesParams: IECIESConstants = Constants.ECIES,
|
|
112
|
-
): { iv: Uint8Array; encryptedDataWithTag: Uint8Array } {
|
|
113
|
-
const eciesConsts = eciesParams;
|
|
114
|
-
const ivLength = eciesConsts.IV_SIZE;
|
|
115
|
-
const tagLength = hasAuthTag ? eciesConsts.AUTH_TAG_SIZE : 0;
|
|
116
|
-
|
|
117
|
-
if (combinedData.length < ivLength + tagLength) {
|
|
118
|
-
const engine = getEciesI18nEngine();
|
|
119
|
-
throw new Error(
|
|
120
|
-
engine.translate(EciesComponentId, EciesStringKey.Error_ECIESError_CombinedDataTooShortForComponents),
|
|
121
|
-
);
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
const iv = combinedData.slice(0, ivLength);
|
|
125
|
-
const encryptedDataWithTag = combinedData.slice(ivLength);
|
|
126
|
-
|
|
127
|
-
return { iv, encryptedDataWithTag };
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
/**
|
|
131
|
-
* Decrypt data using AES-GCM
|
|
132
|
-
* @param iv The initialization vector
|
|
133
|
-
* @param encryptedData Data to decrypt (with auth tag appended if authTag is true)
|
|
134
|
-
* @param key Key to use for decryption (must be 16, 24 or 32 bytes for AES)
|
|
135
|
-
* @param authTag Whether the encrypted data includes an authentication tag
|
|
136
|
-
* @returns Decrypted data
|
|
137
|
-
*/
|
|
138
|
-
public static async decrypt(
|
|
139
|
-
iv: Uint8Array,
|
|
140
|
-
encryptedData: Uint8Array,
|
|
141
|
-
key: Uint8Array,
|
|
142
|
-
authTag: boolean = false,
|
|
143
|
-
eciesParams: IECIESConstants = Constants.ECIES,
|
|
144
|
-
): Promise<Uint8Array> {
|
|
145
|
-
const eciesConsts = eciesParams;
|
|
146
|
-
const cryptoKey = await crypto.subtle.importKey(
|
|
147
|
-
'raw',
|
|
148
|
-
new Uint8Array(key),
|
|
149
|
-
{ name: AESGCMService.ALGORITHM_NAME },
|
|
150
|
-
false,
|
|
151
|
-
['decrypt'],
|
|
152
|
-
);
|
|
153
|
-
|
|
154
|
-
if (!authTag) {
|
|
155
|
-
const decrypted = await crypto.subtle.decrypt(
|
|
156
|
-
{ name: AESGCMService.ALGORITHM_NAME, iv: new Uint8Array(iv) },
|
|
157
|
-
cryptoKey,
|
|
158
|
-
new Uint8Array(encryptedData),
|
|
159
|
-
);
|
|
160
|
-
|
|
161
|
-
return new Uint8Array(decrypted);
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
// Decrypt with auth tag (already appended to encryptedData)
|
|
165
|
-
const decryptedResult = await crypto.subtle.decrypt(
|
|
166
|
-
{
|
|
167
|
-
name: AESGCMService.ALGORITHM_NAME,
|
|
168
|
-
iv: new Uint8Array(iv),
|
|
169
|
-
tagLength: eciesConsts.AUTH_TAG_SIZE * 8,
|
|
170
|
-
},
|
|
171
|
-
cryptoKey,
|
|
172
|
-
new Uint8Array(encryptedData),
|
|
173
|
-
);
|
|
174
|
-
|
|
175
|
-
return new Uint8Array(decryptedResult);
|
|
176
|
-
}
|
|
177
|
-
}
|
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
# Browser-Compatible ECIES Service
|
|
2
|
-
|
|
3
|
-
This directory contains a web-based implementation of the ECIES (Elliptic Curve Integrated Encryption Scheme) service that mirrors the functionality of the server-side implementation but uses browser-compatible libraries.
|
|
4
|
-
|
|
5
|
-
## Overview
|
|
6
|
-
|
|
7
|
-
The browser ECIES service provides the same cryptographic functionality as the server-side version, including:
|
|
8
|
-
|
|
9
|
-
- **Mnemonic generation and wallet derivation** using BIP39/BIP32
|
|
10
|
-
- **ECDH key exchange** using secp256k1 curve
|
|
11
|
-
- **AES-GCM encryption** using Web Crypto API
|
|
12
|
-
- **ECDSA signatures** using secp256k1
|
|
13
|
-
- **Single and simple recipient encryption modes**
|
|
14
|
-
- **CRC16 validation** for data integrity
|
|
15
|
-
|
|
16
|
-
## Dependencies
|
|
17
|
-
|
|
18
|
-
The service uses the following browser-compatible libraries:
|
|
19
|
-
|
|
20
|
-
- `@scure/bip39` - BIP39 mnemonic generation and validation
|
|
21
|
-
- `@scure/bip32` - BIP32 hierarchical deterministic key derivation
|
|
22
|
-
- `@noble/curves` - Elliptic curve cryptography (secp256k1)
|
|
23
|
-
- `@noble/hashes` - Cryptographic hash functions
|
|
24
|
-
- Web Crypto API - Native browser AES-GCM encryption
|
|
25
|
-
|
|
26
|
-
## Architecture
|
|
27
|
-
|
|
28
|
-
### Core Components
|
|
29
|
-
|
|
30
|
-
1. **`crypto-core.ts`** - Core cryptographic operations (key generation, ECDH)
|
|
31
|
-
2. **`single-recipient.ts`** - Single recipient encryption/decryption
|
|
32
|
-
3. **`signature.ts`** - ECDSA signature operations
|
|
33
|
-
4. **`service.ts`** - Main service that integrates all components
|
|
34
|
-
5. **`utils.ts`** - Utility functions (CRC16, hex conversion, etc.)
|
|
35
|
-
6. **`constants.ts`** - Cryptographic constants matching server-side
|
|
36
|
-
7. **`interfaces.ts`** - TypeScript interfaces
|
|
37
|
-
|
|
38
|
-
### Encryption Modes
|
|
39
|
-
|
|
40
|
-
- **Simple Mode**: Basic encryption without CRC or length prefix
|
|
41
|
-
- **Single Mode**: Encryption with data length and CRC16 validation
|
|
42
|
-
- **Multiple Mode**: Multi-recipient encryption (planned for future implementation)
|
|
43
|
-
|
|
44
|
-
## Usage
|
|
45
|
-
|
|
46
|
-
### Basic Example
|
|
47
|
-
|
|
48
|
-
```typescript
|
|
49
|
-
import { ECIESService } from './services/ecies';
|
|
50
|
-
|
|
51
|
-
// Create service instance
|
|
52
|
-
const ecies = new ECIESService();
|
|
53
|
-
|
|
54
|
-
// Generate mnemonic and derive keys
|
|
55
|
-
const mnemonic = ecies.generateNewMnemonic();
|
|
56
|
-
const { privateKey, publicKey } = ecies.mnemonicToSimpleKeyPair(mnemonic);
|
|
57
|
-
|
|
58
|
-
// Encrypt a message
|
|
59
|
-
const message = new TextEncoder().encode('Hello, World!');
|
|
60
|
-
const encrypted = await ecies.encryptSimpleOrSingle(false, publicKey, message);
|
|
61
|
-
|
|
62
|
-
// Decrypt the message
|
|
63
|
-
const decrypted = await ecies.decryptSimpleOrSingleWithHeader(false, privateKey, encrypted);
|
|
64
|
-
const result = new TextDecoder().decode(decrypted);
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
### Wallet Derivation
|
|
68
|
-
|
|
69
|
-
```typescript
|
|
70
|
-
// Generate new mnemonic
|
|
71
|
-
const mnemonic = ecies.generateNewMnemonic();
|
|
72
|
-
|
|
73
|
-
// Derive wallet from mnemonic
|
|
74
|
-
const wallet = ecies.walletAndSeedFromMnemonic(mnemonic);
|
|
75
|
-
console.log('Seed:', wallet.seed);
|
|
76
|
-
console.log('Private Key:', wallet.privateKey);
|
|
77
|
-
console.log('Public Key:', wallet.publicKey);
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
### Digital Signatures
|
|
81
|
-
|
|
82
|
-
```typescript
|
|
83
|
-
// Sign a message
|
|
84
|
-
const message = new TextEncoder().encode('Message to sign');
|
|
85
|
-
const signature = ecies.signMessage(privateKey, message);
|
|
86
|
-
|
|
87
|
-
// Verify signature
|
|
88
|
-
const isValid = ecies.verifyMessage(publicKey, message, signature);
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
### Simple vs Single Mode
|
|
92
|
-
|
|
93
|
-
```typescript
|
|
94
|
-
// Simple mode (no CRC, smaller overhead)
|
|
95
|
-
const simpleEncrypted = await ecies.encryptSimpleOrSingle(true, publicKey, message);
|
|
96
|
-
const simpleDecrypted = await ecies.decryptSimpleOrSingleWithHeader(true, privateKey, simpleEncrypted);
|
|
97
|
-
|
|
98
|
-
// Single mode (with CRC and length validation)
|
|
99
|
-
const singleEncrypted = await ecies.encryptSimpleOrSingle(false, publicKey, message);
|
|
100
|
-
const singleDecrypted = await ecies.decryptSimpleOrSingleWithHeader(false, privateKey, singleEncrypted);
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
## Compatibility
|
|
104
|
-
|
|
105
|
-
This implementation is designed to be fully compatible with the server-side ECIES service:
|
|
106
|
-
|
|
107
|
-
- Uses the same cryptographic constants and algorithms
|
|
108
|
-
- Produces identical encrypted output format
|
|
109
|
-
- Supports the same key derivation paths
|
|
110
|
-
- Implements the same CRC16 algorithm for data integrity
|
|
111
|
-
|
|
112
|
-
## Security Considerations
|
|
113
|
-
|
|
114
|
-
- All cryptographic operations use well-established, audited libraries
|
|
115
|
-
- Private keys are handled as Uint8Array and should be properly secured
|
|
116
|
-
- The Web Crypto API provides secure random number generation
|
|
117
|
-
- ECDH shared secrets are properly derived using secp256k1
|
|
118
|
-
|
|
119
|
-
## Testing
|
|
120
|
-
|
|
121
|
-
Run the examples to test the functionality:
|
|
122
|
-
|
|
123
|
-
```typescript
|
|
124
|
-
import { runAllExamples } from './services/ecies/example';
|
|
125
|
-
|
|
126
|
-
// Run all examples in browser console
|
|
127
|
-
runAllExamples();
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
## Future Enhancements
|
|
131
|
-
|
|
132
|
-
- Multi-recipient encryption support
|
|
133
|
-
- Key caching and management
|
|
134
|
-
- Integration with browser storage APIs
|
|
135
|
-
- Performance optimizations for large messages
|
|
136
|
-
|
|
137
|
-
## Error Handling
|
|
138
|
-
|
|
139
|
-
The service throws descriptive errors for:
|
|
140
|
-
|
|
141
|
-
- Invalid mnemonics
|
|
142
|
-
- Malformed public/private keys
|
|
143
|
-
- Encryption/decryption failures
|
|
144
|
-
- CRC validation errors
|
|
145
|
-
- Invalid encryption types
|
|
146
|
-
|
|
147
|
-
Always wrap cryptographic operations in try-catch blocks for proper error handling.
|