@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,188 @@
|
|
|
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 { XorService } from './services/xor';
|
|
6
|
+
import { uint8ArrayToHex } from './utils';
|
|
7
|
+
/**
|
|
8
|
+
* A secure string buffer is a buffer whose intent is to prevent the raw password from being stored in memory.
|
|
9
|
+
*/
|
|
10
|
+
export class SecureString {
|
|
11
|
+
_disposed = false;
|
|
12
|
+
_isNull;
|
|
13
|
+
_id;
|
|
14
|
+
_length;
|
|
15
|
+
_obfuscatedValue;
|
|
16
|
+
_key;
|
|
17
|
+
_obfuscatedChecksum;
|
|
18
|
+
_disposedAt;
|
|
19
|
+
constructor(data) {
|
|
20
|
+
this._id = GuidV4.new();
|
|
21
|
+
// only treat null/undefined as null, empty strings/arrays are valid empty data
|
|
22
|
+
if (data === null || data === undefined) {
|
|
23
|
+
this._isNull = true;
|
|
24
|
+
this._length = 0;
|
|
25
|
+
this._obfuscatedValue = new Uint8Array(0);
|
|
26
|
+
this._key = new Uint8Array(0);
|
|
27
|
+
this._obfuscatedChecksum = new Uint8Array(0);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
this._isNull = false;
|
|
31
|
+
this._key = this.idUint8Array;
|
|
32
|
+
const dataAsUint8Array = typeof data === 'string'
|
|
33
|
+
? new TextEncoder().encode(data)
|
|
34
|
+
: data;
|
|
35
|
+
// Store the byte length, not the character length
|
|
36
|
+
this._length = dataAsUint8Array.length;
|
|
37
|
+
this._obfuscatedValue = this.obfuscateData(dataAsUint8Array);
|
|
38
|
+
this._obfuscatedChecksum =
|
|
39
|
+
this.createSimpleObfuscatedChecksum(dataAsUint8Array);
|
|
40
|
+
}
|
|
41
|
+
assertNotDisposed() {
|
|
42
|
+
if (!this._disposed)
|
|
43
|
+
return;
|
|
44
|
+
const e = new DisposedError();
|
|
45
|
+
try {
|
|
46
|
+
e.disposedAt = this._disposedAt;
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
// ignore if Error object is sealed/frozen
|
|
50
|
+
}
|
|
51
|
+
throw e;
|
|
52
|
+
}
|
|
53
|
+
dispose() {
|
|
54
|
+
const err = new DisposedError();
|
|
55
|
+
if (typeof Error.captureStackTrace === 'function') {
|
|
56
|
+
Error.captureStackTrace(err, this.dispose);
|
|
57
|
+
}
|
|
58
|
+
this._disposedAt = err.stack ?? 'stack unavailable';
|
|
59
|
+
this._obfuscatedValue.fill(0);
|
|
60
|
+
this._key.fill(0);
|
|
61
|
+
this._obfuscatedChecksum.fill(0);
|
|
62
|
+
this._disposed = true;
|
|
63
|
+
}
|
|
64
|
+
get disposedAtStack() {
|
|
65
|
+
return this._disposedAt;
|
|
66
|
+
}
|
|
67
|
+
get id() {
|
|
68
|
+
this.assertNotDisposed();
|
|
69
|
+
return this._id.asFullHexGuid;
|
|
70
|
+
}
|
|
71
|
+
get idUint8Array() {
|
|
72
|
+
this.assertNotDisposed();
|
|
73
|
+
return this._id.asRawGuidUint8Array;
|
|
74
|
+
}
|
|
75
|
+
get originalLength() {
|
|
76
|
+
this.assertNotDisposed();
|
|
77
|
+
return this._length;
|
|
78
|
+
}
|
|
79
|
+
get valueAsUint8Array() {
|
|
80
|
+
this.assertNotDisposed();
|
|
81
|
+
if (this._isNull) {
|
|
82
|
+
return new Uint8Array(0);
|
|
83
|
+
}
|
|
84
|
+
try {
|
|
85
|
+
const deobfuscatedResult = this.deobfuscateData(this._obfuscatedValue);
|
|
86
|
+
if (deobfuscatedResult.length !== this._length) {
|
|
87
|
+
throw new SecureStorageError(SecureStorageErrorType.DecryptedValueLengthMismatch);
|
|
88
|
+
}
|
|
89
|
+
// Validate checksum
|
|
90
|
+
const expectedChecksum = this.createSimpleChecksum(deobfuscatedResult);
|
|
91
|
+
const storedChecksum = new TextDecoder().decode(this.deobfuscateData(this._obfuscatedChecksum));
|
|
92
|
+
if (expectedChecksum !== storedChecksum) {
|
|
93
|
+
throw new SecureStorageError(SecureStorageErrorType.DecryptedValueChecksumMismatch);
|
|
94
|
+
}
|
|
95
|
+
return deobfuscatedResult;
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
// If it's already a SecureStorageError, re-throw it
|
|
99
|
+
if (error instanceof SecureStorageError) {
|
|
100
|
+
throw error;
|
|
101
|
+
}
|
|
102
|
+
// Convert any other error to SecureStorageError
|
|
103
|
+
throw new SecureStorageError(SecureStorageErrorType.DecryptedValueChecksumMismatch);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
get value() {
|
|
107
|
+
this.assertNotDisposed();
|
|
108
|
+
if (this._isNull) {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
return new TextDecoder().decode(this.valueAsUint8Array);
|
|
112
|
+
}
|
|
113
|
+
get notNullValue() {
|
|
114
|
+
this.assertNotDisposed();
|
|
115
|
+
if (this._isNull) {
|
|
116
|
+
throw new SecureStorageError(SecureStorageErrorType.ValueIsNull);
|
|
117
|
+
}
|
|
118
|
+
return new TextDecoder().decode(this.valueAsUint8Array);
|
|
119
|
+
}
|
|
120
|
+
get valueAsHexString() {
|
|
121
|
+
this.assertNotDisposed();
|
|
122
|
+
return uint8ArrayToHex(this.valueAsUint8Array);
|
|
123
|
+
}
|
|
124
|
+
get valueAsBase64String() {
|
|
125
|
+
this.assertNotDisposed();
|
|
126
|
+
return btoa(String.fromCharCode(...this.valueAsUint8Array));
|
|
127
|
+
}
|
|
128
|
+
get hasValue() {
|
|
129
|
+
this.assertNotDisposed();
|
|
130
|
+
return !this._isNull && this._length > 0;
|
|
131
|
+
}
|
|
132
|
+
get checksum() {
|
|
133
|
+
this.assertNotDisposed();
|
|
134
|
+
const deobfuscatedChecksum = new TextDecoder().decode(this.deobfuscateData(this._obfuscatedChecksum));
|
|
135
|
+
return deobfuscatedChecksum;
|
|
136
|
+
}
|
|
137
|
+
get length() {
|
|
138
|
+
this.assertNotDisposed();
|
|
139
|
+
return this._length;
|
|
140
|
+
}
|
|
141
|
+
async generateChecksum(data) {
|
|
142
|
+
const dataBytes = typeof data === 'string' ? new TextEncoder().encode(data) : data;
|
|
143
|
+
const hashArray = await crypto.subtle.digest('SHA-256', new Uint8Array(dataBytes));
|
|
144
|
+
return uint8ArrayToHex(new Uint8Array(hashArray));
|
|
145
|
+
}
|
|
146
|
+
createSimpleChecksum(data) {
|
|
147
|
+
let hash = 0;
|
|
148
|
+
for (let i = 0; i < data.length; i++) {
|
|
149
|
+
hash = ((hash << 5) - hash + data[i]) & 0xffffffff;
|
|
150
|
+
}
|
|
151
|
+
return hash.toString(16);
|
|
152
|
+
}
|
|
153
|
+
createSimpleObfuscatedChecksum(data) {
|
|
154
|
+
const dataBytes = typeof data === 'string' ? new TextEncoder().encode(data) : data;
|
|
155
|
+
const checksum = this.createSimpleChecksum(dataBytes);
|
|
156
|
+
return this.obfuscateData(new TextEncoder().encode(checksum));
|
|
157
|
+
}
|
|
158
|
+
async createObfuscatedChecksum(data) {
|
|
159
|
+
const checksum = await this.generateChecksum(data);
|
|
160
|
+
const result = this.obfuscateData(new TextEncoder().encode(checksum));
|
|
161
|
+
return result;
|
|
162
|
+
}
|
|
163
|
+
async validateChecksum(data, checksum) {
|
|
164
|
+
const generatedChecksum = await this.generateChecksum(data);
|
|
165
|
+
return generatedChecksum === checksum;
|
|
166
|
+
}
|
|
167
|
+
timingSafeEqual(a, b) {
|
|
168
|
+
if (a.length !== b.length) {
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
let result = 0;
|
|
172
|
+
for (let i = 0; i < a.length; i++) {
|
|
173
|
+
result |= a[i] ^ b[i];
|
|
174
|
+
}
|
|
175
|
+
return result === 0;
|
|
176
|
+
}
|
|
177
|
+
async validateObfuscatedChecksum(data) {
|
|
178
|
+
const deobfuscatedChecksum = new TextDecoder().decode(this.deobfuscateData(this._obfuscatedChecksum));
|
|
179
|
+
return this.validateChecksum(data, deobfuscatedChecksum);
|
|
180
|
+
}
|
|
181
|
+
obfuscateData(data) {
|
|
182
|
+
return XorService.xor(data, this._key);
|
|
183
|
+
}
|
|
184
|
+
deobfuscateData(data) {
|
|
185
|
+
return XorService.xor(data, this._key);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=secure-string.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secure-string.js","sourceRoot":"","sources":["../src/secure-string.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export declare abstract class AESGCMService {
|
|
2
|
+
static readonly ALGORITHM_NAME = "AES-GCM";
|
|
3
|
+
/**
|
|
4
|
+
* Encrypt data using AES-GCM
|
|
5
|
+
* @param data Data to encrypt
|
|
6
|
+
* @param key Key to use for encryption (must be 16, 24 or 32 bytes for AES)
|
|
7
|
+
* @returns Encrypted data
|
|
8
|
+
*/
|
|
9
|
+
static encrypt(data: Uint8Array, key: Uint8Array, authTag?: boolean): Promise<{
|
|
10
|
+
encrypted: Uint8Array;
|
|
11
|
+
iv: Uint8Array;
|
|
12
|
+
tag?: Uint8Array;
|
|
13
|
+
}>;
|
|
14
|
+
/**
|
|
15
|
+
* Combine encrypted data and auth tag into a single Uint8Array
|
|
16
|
+
* @param encryptedData The encrypted data
|
|
17
|
+
* @param authTag The authentication tag
|
|
18
|
+
* @returns The combined Uint8Array
|
|
19
|
+
*/
|
|
20
|
+
static combineEncryptedDataAndTag(encryptedData: Uint8Array, authTag: Uint8Array): Uint8Array;
|
|
21
|
+
/**
|
|
22
|
+
* Combine IV and encrypted data (with optional auth tag) into a single Uint8Array
|
|
23
|
+
* @param iv The initialization vector
|
|
24
|
+
* @param encryptedDataWithTag The encrypted data with auth tag already appended (if applicable)
|
|
25
|
+
* @returns The combined Uint8Array
|
|
26
|
+
*/
|
|
27
|
+
static combineIvAndEncryptedData(iv: Uint8Array, encryptedDataWithTag: Uint8Array): Uint8Array;
|
|
28
|
+
/**
|
|
29
|
+
* Combine IV, encrypted data and auth tag into a single Uint8Array
|
|
30
|
+
* @param iv The initialization vector
|
|
31
|
+
* @param encryptedData The encrypted data
|
|
32
|
+
* @param authTag The authentication tag
|
|
33
|
+
* @returns The combined Uint8Array
|
|
34
|
+
*/
|
|
35
|
+
static combineIvTagAndEncryptedData(iv: Uint8Array, encryptedData: Uint8Array, authTag: Uint8Array): Uint8Array;
|
|
36
|
+
/**
|
|
37
|
+
* Split combined encrypted data back into its components
|
|
38
|
+
* @param combinedData The combined data containing IV, encrypted data, and optionally auth tag
|
|
39
|
+
* @param hasAuthTag Whether the combined data includes an authentication tag
|
|
40
|
+
* @returns Object containing the split components
|
|
41
|
+
*/
|
|
42
|
+
static splitEncryptedData(combinedData: Uint8Array, hasAuthTag?: boolean): {
|
|
43
|
+
iv: Uint8Array;
|
|
44
|
+
encryptedDataWithTag: Uint8Array;
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Decrypt data using AES-GCM
|
|
48
|
+
* @param iv The initialization vector
|
|
49
|
+
* @param encryptedData Data to decrypt (with auth tag appended if authTag is true)
|
|
50
|
+
* @param key Key to use for decryption (must be 16, 24 or 32 bytes for AES)
|
|
51
|
+
* @param authTag Whether the encrypted data includes an authentication tag
|
|
52
|
+
* @returns Decrypted data
|
|
53
|
+
*/
|
|
54
|
+
static decrypt(iv: Uint8Array, encryptedData: Uint8Array, key: Uint8Array, authTag?: boolean): Promise<Uint8Array>;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=aes-gcm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aes-gcm.d.ts","sourceRoot":"","sources":["../../src/services/aes-gcm.ts"],"names":[],"mappings":"AAEA,8BAAsB,aAAa;IACjC,gBAAuB,cAAc,aAAa;IAClD;;;;;OAKG;WACiB,OAAO,CACzB,IAAI,EAAE,UAAU,EAChB,GAAG,EAAE,UAAU,EACf,OAAO,GAAE,OAAe,GACvB,OAAO,CAAC;QAAE,SAAS,EAAE,UAAU,CAAC;QAAC,EAAE,EAAE,UAAU,CAAC;QAAC,GAAG,CAAC,EAAE,UAAU,CAAA;KAAE,CAAC;IA+BvE;;;;;OAKG;WACW,0BAA0B,CACtC,aAAa,EAAE,UAAU,EACzB,OAAO,EAAE,UAAU,GAClB,UAAU;IAOb;;;;;OAKG;WACW,yBAAyB,CACrC,EAAE,EAAE,UAAU,EACd,oBAAoB,EAAE,UAAU,GAC/B,UAAU;IAOb;;;;;;OAMG;WACW,4BAA4B,CACxC,EAAE,EAAE,UAAU,EACd,aAAa,EAAE,UAAU,EACzB,OAAO,EAAE,UAAU,GAClB,UAAU;IAQb;;;;;OAKG;WACW,kBAAkB,CAC9B,YAAY,EAAE,UAAU,EACxB,UAAU,GAAE,OAAc,GACzB;QAAE,EAAE,EAAE,UAAU,CAAC;QAAC,oBAAoB,EAAE,UAAU,CAAA;KAAE;IAgBvD;;;;;;;OAOG;WACiB,OAAO,CACzB,EAAE,EAAE,UAAU,EACd,aAAa,EAAE,UAAU,EACzB,GAAG,EAAE,UAAU,EACf,OAAO,GAAE,OAAe,GACvB,OAAO,CAAC,UAAU,CAAC;CAgCvB"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { ECIES } from '../constants';
|
|
2
|
+
export class AESGCMService {
|
|
3
|
+
static ALGORITHM_NAME = 'AES-GCM';
|
|
4
|
+
/**
|
|
5
|
+
* Encrypt data using AES-GCM
|
|
6
|
+
* @param data Data to encrypt
|
|
7
|
+
* @param key Key to use for encryption (must be 16, 24 or 32 bytes for AES)
|
|
8
|
+
* @returns Encrypted data
|
|
9
|
+
*/
|
|
10
|
+
static async encrypt(data, key, authTag = false) {
|
|
11
|
+
const cryptoKey = await crypto.subtle.importKey('raw', new Uint8Array(key), { name: AESGCMService.ALGORITHM_NAME }, false, ['encrypt']);
|
|
12
|
+
const iv = crypto.getRandomValues(new Uint8Array(ECIES.IV_SIZE));
|
|
13
|
+
const encryptedResult = await crypto.subtle.encrypt({
|
|
14
|
+
name: AESGCMService.ALGORITHM_NAME,
|
|
15
|
+
iv,
|
|
16
|
+
...(authTag && { tagLength: ECIES.AUTH_TAG_SIZE * 8 }),
|
|
17
|
+
}, cryptoKey, new Uint8Array(data));
|
|
18
|
+
const encryptedArray = new Uint8Array(encryptedResult);
|
|
19
|
+
if (!authTag) {
|
|
20
|
+
return { encrypted: encryptedArray, iv };
|
|
21
|
+
}
|
|
22
|
+
const authTagLengthBytes = ECIES.AUTH_TAG_SIZE;
|
|
23
|
+
const encryptedBytes = encryptedArray.slice(0, -authTagLengthBytes); // Remove auth tag
|
|
24
|
+
const authTagBytes = encryptedArray.slice(-authTagLengthBytes); // Last 16 bytes are auth tag
|
|
25
|
+
return { encrypted: encryptedBytes, iv, tag: authTagBytes };
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Combine encrypted data and auth tag into a single Uint8Array
|
|
29
|
+
* @param encryptedData The encrypted data
|
|
30
|
+
* @param authTag The authentication tag
|
|
31
|
+
* @returns The combined Uint8Array
|
|
32
|
+
*/
|
|
33
|
+
static combineEncryptedDataAndTag(encryptedData, authTag) {
|
|
34
|
+
const combined = new Uint8Array(encryptedData.length + authTag.length);
|
|
35
|
+
combined.set(encryptedData);
|
|
36
|
+
combined.set(authTag, encryptedData.length);
|
|
37
|
+
return combined;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Combine IV and encrypted data (with optional auth tag) into a single Uint8Array
|
|
41
|
+
* @param iv The initialization vector
|
|
42
|
+
* @param encryptedDataWithTag The encrypted data with auth tag already appended (if applicable)
|
|
43
|
+
* @returns The combined Uint8Array
|
|
44
|
+
*/
|
|
45
|
+
static combineIvAndEncryptedData(iv, encryptedDataWithTag) {
|
|
46
|
+
const combined = new Uint8Array(iv.length + encryptedDataWithTag.length);
|
|
47
|
+
combined.set(iv);
|
|
48
|
+
combined.set(encryptedDataWithTag, iv.length);
|
|
49
|
+
return combined;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Combine IV, encrypted data and auth tag into a single Uint8Array
|
|
53
|
+
* @param iv The initialization vector
|
|
54
|
+
* @param encryptedData The encrypted data
|
|
55
|
+
* @param authTag The authentication tag
|
|
56
|
+
* @returns The combined Uint8Array
|
|
57
|
+
*/
|
|
58
|
+
static combineIvTagAndEncryptedData(iv, encryptedData, authTag) {
|
|
59
|
+
const encryptedWithTag = AESGCMService.combineEncryptedDataAndTag(encryptedData, authTag);
|
|
60
|
+
return AESGCMService.combineIvAndEncryptedData(iv, encryptedWithTag);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Split combined encrypted data back into its components
|
|
64
|
+
* @param combinedData The combined data containing IV, encrypted data, and optionally auth tag
|
|
65
|
+
* @param hasAuthTag Whether the combined data includes an authentication tag
|
|
66
|
+
* @returns Object containing the split components
|
|
67
|
+
*/
|
|
68
|
+
static splitEncryptedData(combinedData, hasAuthTag = true) {
|
|
69
|
+
const ivLength = ECIES.IV_SIZE;
|
|
70
|
+
const tagLength = hasAuthTag ? ECIES.AUTH_TAG_SIZE : 0;
|
|
71
|
+
if (combinedData.length < ivLength + tagLength) {
|
|
72
|
+
throw new Error('Combined data is too short to contain required components');
|
|
73
|
+
}
|
|
74
|
+
const iv = combinedData.slice(0, ivLength);
|
|
75
|
+
const encryptedDataWithTag = combinedData.slice(ivLength);
|
|
76
|
+
return { iv, encryptedDataWithTag };
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Decrypt data using AES-GCM
|
|
80
|
+
* @param iv The initialization vector
|
|
81
|
+
* @param encryptedData Data to decrypt (with auth tag appended if authTag is true)
|
|
82
|
+
* @param key Key to use for decryption (must be 16, 24 or 32 bytes for AES)
|
|
83
|
+
* @param authTag Whether the encrypted data includes an authentication tag
|
|
84
|
+
* @returns Decrypted data
|
|
85
|
+
*/
|
|
86
|
+
static async decrypt(iv, encryptedData, key, authTag = false) {
|
|
87
|
+
const cryptoKey = await crypto.subtle.importKey('raw', new Uint8Array(key), { name: AESGCMService.ALGORITHM_NAME }, false, ['decrypt']);
|
|
88
|
+
if (!authTag) {
|
|
89
|
+
const decrypted = await crypto.subtle.decrypt({ name: AESGCMService.ALGORITHM_NAME, iv: new Uint8Array(iv) }, cryptoKey, new Uint8Array(encryptedData));
|
|
90
|
+
return new Uint8Array(decrypted);
|
|
91
|
+
}
|
|
92
|
+
// Decrypt with auth tag (already appended to encryptedData)
|
|
93
|
+
const decryptedResult = await crypto.subtle.decrypt({
|
|
94
|
+
name: AESGCMService.ALGORITHM_NAME,
|
|
95
|
+
iv: new Uint8Array(iv),
|
|
96
|
+
tagLength: ECIES.AUTH_TAG_SIZE * 8,
|
|
97
|
+
}, cryptoKey, new Uint8Array(encryptedData));
|
|
98
|
+
return new Uint8Array(decryptedResult);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=aes-gcm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aes-gcm.js","sourceRoot":"","sources":["../../src/services/aes-gcm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { IECIESConfig } from '../../interfaces/ecies-config';
|
|
2
|
+
import { SecureString } from '../../secure-string';
|
|
3
|
+
import { ISimpleKeyPair, IWalletSeed } from './interfaces';
|
|
4
|
+
/**
|
|
5
|
+
* Browser-compatible crypto core for ECIES operations
|
|
6
|
+
* Uses @scure libraries for browser compatibility
|
|
7
|
+
*/
|
|
8
|
+
export declare class EciesCryptoCore {
|
|
9
|
+
private readonly _config;
|
|
10
|
+
constructor(config: IECIESConfig);
|
|
11
|
+
/**
|
|
12
|
+
* Get secp256k1 instance, using dynamic import as fallback if needed
|
|
13
|
+
*/
|
|
14
|
+
private getSecp256k1Async;
|
|
15
|
+
get config(): IECIESConfig;
|
|
16
|
+
/**
|
|
17
|
+
* Validates and normalizes a public key for ECIES operations
|
|
18
|
+
*/
|
|
19
|
+
normalizePublicKey(publicKey: Uint8Array): Uint8Array;
|
|
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 a simple key pair from a seed
|
|
30
|
+
*/
|
|
31
|
+
seedToSimpleKeyPair(seed: Uint8Array): ISimpleKeyPair;
|
|
32
|
+
/**
|
|
33
|
+
* Create a simple key pair from a mnemonic
|
|
34
|
+
*/
|
|
35
|
+
mnemonicToSimpleKeyPair(mnemonic: SecureString): ISimpleKeyPair;
|
|
36
|
+
/**
|
|
37
|
+
* Generate a random private key
|
|
38
|
+
*/
|
|
39
|
+
generatePrivateKey(): Uint8Array;
|
|
40
|
+
/**
|
|
41
|
+
* Get public key from private key
|
|
42
|
+
*/
|
|
43
|
+
getPublicKey(privateKey: Uint8Array): Uint8Array;
|
|
44
|
+
/**
|
|
45
|
+
* Generate ephemeral key pair for ECIES
|
|
46
|
+
*/
|
|
47
|
+
generateEphemeralKeyPair(): Promise<ISimpleKeyPair>;
|
|
48
|
+
/**
|
|
49
|
+
* Compute ECDH shared secret
|
|
50
|
+
*/
|
|
51
|
+
computeSharedSecret(privateKey: Uint8Array, publicKey: Uint8Array): Uint8Array;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=crypto-core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto-core.d.ts","sourceRoot":"","sources":["../../../src/services/ecies/crypto-core.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAiB3D;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;gBAE3B,MAAM,EAAE,YAAY;IAIhC;;OAEG;YACW,iBAAiB;IAU/B,IAAW,MAAM,IAAI,YAAY,CAEhC;IAED;;OAEG;IACI,kBAAkB,CAAC,SAAS,EAAE,UAAU,GAAG,UAAU;IA0B5D;;OAEG;IACI,mBAAmB,IAAI,YAAY;IAM1C;;OAEG;IACI,yBAAyB,CAAC,QAAQ,EAAE,YAAY,GAAG,WAAW;IAuBrE;;OAEG;IACI,mBAAmB,CAAC,IAAI,EAAE,UAAU,GAAG,cAAc;IAuB5D;;OAEG;IACI,uBAAuB,CAAC,QAAQ,EAAE,YAAY,GAAG,cAAc;IAKtE;;OAEG;IACI,kBAAkB,IAAI,UAAU;IASvC;;OAEG;IACI,YAAY,CAAC,UAAU,EAAE,UAAU,GAAG,UAAU;IAWvD;;OAEG;IACU,wBAAwB,IAAI,OAAO,CAAC,cAAc,CAAC;IAMhE;;OAEG;IACI,mBAAmB,CACxB,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,UAAU,GACpB,UAAU;CAcd"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { Wallet } from '@ethereumjs/wallet';
|
|
2
|
+
import { HDKey } from '@scure/bip32';
|
|
3
|
+
import { generateMnemonic, mnemonicToSeedSync, validateMnemonic, } from '@scure/bip39';
|
|
4
|
+
import { wordlist } from '@scure/bip39/wordlists/english';
|
|
5
|
+
import { ECIES } from '../../constants';
|
|
6
|
+
import { SecureString } from '../../secure-string';
|
|
7
|
+
// Use a synchronous approach to import secp256k1
|
|
8
|
+
let secp256k1;
|
|
9
|
+
try {
|
|
10
|
+
secp256k1 = require('@noble/curves/secp256k1.js').secp256k1;
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
// Fallback for test environment or different module resolution
|
|
14
|
+
try {
|
|
15
|
+
secp256k1 = require('@noble/curves/secp256k1').secp256k1;
|
|
16
|
+
}
|
|
17
|
+
catch (fallbackError) {
|
|
18
|
+
console.warn('Failed to import secp256k1, will use dynamic import fallback');
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Browser-compatible crypto core for ECIES operations
|
|
23
|
+
* Uses @scure libraries for browser compatibility
|
|
24
|
+
*/
|
|
25
|
+
export class EciesCryptoCore {
|
|
26
|
+
_config;
|
|
27
|
+
constructor(config) {
|
|
28
|
+
this._config = config;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Get secp256k1 instance, using dynamic import as fallback if needed
|
|
32
|
+
*/
|
|
33
|
+
async getSecp256k1Async() {
|
|
34
|
+
if (secp256k1) {
|
|
35
|
+
return secp256k1;
|
|
36
|
+
}
|
|
37
|
+
const { secp256k1: dynamicSecp256k1 } = await import('@noble/curves/secp256k1.js');
|
|
38
|
+
return dynamicSecp256k1;
|
|
39
|
+
}
|
|
40
|
+
get config() {
|
|
41
|
+
return this._config;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Validates and normalizes a public key for ECIES operations
|
|
45
|
+
*/
|
|
46
|
+
normalizePublicKey(publicKey) {
|
|
47
|
+
if (!publicKey) {
|
|
48
|
+
throw new Error('Received null or undefined public key');
|
|
49
|
+
}
|
|
50
|
+
const keyLength = publicKey.length;
|
|
51
|
+
// Already in correct format (65 bytes with 0x04 prefix)
|
|
52
|
+
if (keyLength === ECIES.PUBLIC_KEY_LENGTH &&
|
|
53
|
+
publicKey[0] === ECIES.PUBLIC_KEY_MAGIC) {
|
|
54
|
+
return publicKey;
|
|
55
|
+
}
|
|
56
|
+
// Raw key without prefix (64 bytes) - add the 0x04 prefix
|
|
57
|
+
if (keyLength === ECIES.RAW_PUBLIC_KEY_LENGTH) {
|
|
58
|
+
const result = new Uint8Array(ECIES.PUBLIC_KEY_LENGTH);
|
|
59
|
+
result[0] = ECIES.PUBLIC_KEY_MAGIC;
|
|
60
|
+
result.set(publicKey, 1);
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
throw new Error(`Invalid public key format or length: ${keyLength}`);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Generate a new mnemonic
|
|
67
|
+
*/
|
|
68
|
+
generateNewMnemonic() {
|
|
69
|
+
return new SecureString(generateMnemonic(wordlist, this._config.mnemonicStrength));
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Generate wallet and seed from mnemonic
|
|
73
|
+
*/
|
|
74
|
+
walletAndSeedFromMnemonic(mnemonic) {
|
|
75
|
+
if (!mnemonic || !validateMnemonic(mnemonic.value ?? '', wordlist)) {
|
|
76
|
+
throw new Error('Invalid mnemonic');
|
|
77
|
+
}
|
|
78
|
+
const seed = mnemonicToSeedSync(mnemonic.value ?? '');
|
|
79
|
+
const hdKey = HDKey.fromMasterSeed(seed);
|
|
80
|
+
const derivedKey = hdKey.derive(this._config.primaryKeyDerivationPath);
|
|
81
|
+
if (!derivedKey.privateKey) {
|
|
82
|
+
throw new Error('Failed to derive private key');
|
|
83
|
+
}
|
|
84
|
+
const privateKey = derivedKey.privateKey;
|
|
85
|
+
const wallet = new Wallet(privateKey);
|
|
86
|
+
return {
|
|
87
|
+
wallet,
|
|
88
|
+
seed,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Create a simple key pair from a seed
|
|
93
|
+
*/
|
|
94
|
+
seedToSimpleKeyPair(seed) {
|
|
95
|
+
if (!secp256k1) {
|
|
96
|
+
throw new Error('secp256k1 not available - this method requires synchronous access');
|
|
97
|
+
}
|
|
98
|
+
const hdKey = HDKey.fromMasterSeed(seed);
|
|
99
|
+
const derivedKey = hdKey.derive(this._config.primaryKeyDerivationPath);
|
|
100
|
+
if (!derivedKey.privateKey) {
|
|
101
|
+
throw new Error('Failed to derive private key');
|
|
102
|
+
}
|
|
103
|
+
const privateKey = derivedKey.privateKey;
|
|
104
|
+
const publicKey = secp256k1.getPublicKey(privateKey, false); // uncompressed with 0x04 prefix
|
|
105
|
+
return {
|
|
106
|
+
privateKey,
|
|
107
|
+
publicKey,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Create a simple key pair from a mnemonic
|
|
112
|
+
*/
|
|
113
|
+
mnemonicToSimpleKeyPair(mnemonic) {
|
|
114
|
+
const { seed } = this.walletAndSeedFromMnemonic(mnemonic);
|
|
115
|
+
return this.seedToSimpleKeyPair(seed);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Generate a random private key
|
|
119
|
+
*/
|
|
120
|
+
generatePrivateKey() {
|
|
121
|
+
if (!secp256k1) {
|
|
122
|
+
throw new Error('secp256k1 not available - this method requires synchronous access');
|
|
123
|
+
}
|
|
124
|
+
return secp256k1.utils.randomSecretKey();
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Get public key from private key
|
|
128
|
+
*/
|
|
129
|
+
getPublicKey(privateKey) {
|
|
130
|
+
if (!secp256k1) {
|
|
131
|
+
throw new Error('secp256k1 not available - this method requires synchronous access');
|
|
132
|
+
}
|
|
133
|
+
const publicKeyPoint = secp256k1.getPublicKey(privateKey, false); // uncompressed
|
|
134
|
+
// publicKeyPoint already includes the 0x04 prefix, so return as-is
|
|
135
|
+
return publicKeyPoint;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Generate ephemeral key pair for ECIES
|
|
139
|
+
*/
|
|
140
|
+
async generateEphemeralKeyPair() {
|
|
141
|
+
const privateKey = this.generatePrivateKey();
|
|
142
|
+
const publicKey = this.getPublicKey(privateKey);
|
|
143
|
+
return { privateKey, publicKey };
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Compute ECDH shared secret
|
|
147
|
+
*/
|
|
148
|
+
computeSharedSecret(privateKey, publicKey) {
|
|
149
|
+
// Normalize the public key to ensure it has the correct format
|
|
150
|
+
const normalizedPublicKey = this.normalizePublicKey(publicKey);
|
|
151
|
+
// Use uncompressed shared secret to match Node.js ECDH behavior
|
|
152
|
+
// Node.js ECDH.computeSecret() returns the x-coordinate of the shared point
|
|
153
|
+
const sharedSecret = secp256k1.getSharedSecret(privateKey, normalizedPublicKey, false);
|
|
154
|
+
// Return only the x-coordinate (first 32 bytes after the 0x04 prefix)
|
|
155
|
+
return sharedSecret.slice(1, 33);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=crypto-core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto-core.js","sourceRoot":"","sources":["../../../src/services/ecies/crypto-core.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Example usage of the browser-compatible ECIES service
|
|
3
|
+
* This file demonstrates how to use the web-based ECIES implementation
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Example: Basic encryption and decryption
|
|
7
|
+
*/
|
|
8
|
+
export declare function basicEncryptionExample(): Promise<void>;
|
|
9
|
+
/**
|
|
10
|
+
* Example: Simple mode encryption (without CRC)
|
|
11
|
+
*/
|
|
12
|
+
export declare function simpleEncryptionExample(): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* Example: Digital signature
|
|
15
|
+
*/
|
|
16
|
+
export declare function signatureExample(): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Example: Wallet derivation from mnemonic
|
|
19
|
+
*/
|
|
20
|
+
export declare function walletDerivationExample(): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Run all examples
|
|
23
|
+
*/
|
|
24
|
+
export declare function runAllExamples(): Promise<void>;
|
|
25
|
+
//# sourceMappingURL=example.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"example.d.ts","sourceRoot":"","sources":["../../../src/services/ecies/example.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH;;GAEG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC,CAsC5D;AAED;;GAEG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC,CAsC7D;AAED;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CA+BtD;AAED;;GAEG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC,CA6B7D;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAUpD"}
|