@digitaldefiance/ecies-lib 3.0.7 → 3.7.2
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 +4 -3
- package/src/builders/ecies-builder.js +5 -9
- package/src/builders/ecies-builder.js.map +1 -1
- package/src/builders/index.js +2 -5
- package/src/builders/index.js.map +1 -1
- package/src/builders/member-builder.js +12 -16
- package/src/builders/member-builder.js.map +1 -1
- package/src/constants.d.ts +14 -0
- package/src/constants.d.ts.map +1 -1
- package/src/constants.js +150 -74
- package/src/constants.js.map +1 -1
- package/src/core/errors/crypto-error.js +10 -14
- package/src/core/errors/crypto-error.js.map +1 -1
- package/src/core/index.js +2 -5
- package/src/core/index.js.map +1 -1
- package/src/core/types/result.js +1 -5
- package/src/core/types/result.js.map +1 -1
- package/src/email-string.js +8 -13
- package/src/email-string.js.map +1 -1
- package/src/enumerations/disposed-error-type.d.ts +12 -0
- package/src/enumerations/disposed-error-type.d.ts.map +1 -0
- package/src/enumerations/disposed-error-type.js +13 -0
- package/src/enumerations/disposed-error-type.js.map +1 -0
- package/src/enumerations/ecies-encryption-type.js +20 -27
- package/src/enumerations/ecies-encryption-type.js.map +1 -1
- package/src/enumerations/ecies-error-type.js +2 -5
- package/src/enumerations/ecies-error-type.js.map +1 -1
- package/src/enumerations/ecies-string-key.d.ts +19 -1
- package/src/enumerations/ecies-string-key.d.ts.map +1 -1
- package/src/enumerations/ecies-string-key.js +21 -5
- package/src/enumerations/ecies-string-key.js.map +1 -1
- 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 +28 -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 +8 -0
- package/src/enumerations/guid-error-type.js.map +1 -0
- package/src/enumerations/id-provider-error-type.d.ts +43 -0
- package/src/enumerations/id-provider-error-type.d.ts.map +1 -0
- package/src/enumerations/id-provider-error-type.js +44 -0
- package/src/enumerations/id-provider-error-type.js.map +1 -0
- package/src/enumerations/index.d.ts +3 -0
- package/src/enumerations/index.d.ts.map +1 -1
- package/src/enumerations/index.js +15 -15
- package/src/enumerations/index.js.map +1 -1
- package/src/enumerations/invalid-email-type.js +2 -5
- package/src/enumerations/invalid-email-type.js.map +1 -1
- package/src/enumerations/length-encoding-type.js +2 -5
- package/src/enumerations/length-encoding-type.js.map +1 -1
- package/src/enumerations/length-error-type.js +2 -5
- package/src/enumerations/length-error-type.js.map +1 -1
- package/src/enumerations/member-error-type.js +3 -6
- package/src/enumerations/member-error-type.js.map +1 -1
- package/src/enumerations/member-type.js +3 -6
- package/src/enumerations/member-type.js.map +1 -1
- package/src/enumerations/password-login-error-type.js +2 -5
- package/src/enumerations/password-login-error-type.js.map +1 -1
- package/src/enumerations/pbkdf2-error-type.js +2 -5
- package/src/enumerations/pbkdf2-error-type.js.map +1 -1
- package/src/enumerations/pbkdf2-profile.js +2 -5
- package/src/enumerations/pbkdf2-profile.js.map +1 -1
- package/src/enumerations/secure-storage-error-type.js +2 -5
- package/src/enumerations/secure-storage-error-type.js.map +1 -1
- package/src/errors/disposed.d.ts +20 -2
- package/src/errors/disposed.d.ts.map +1 -1
- package/src/errors/disposed.js +24 -17
- package/src/errors/disposed.js.map +1 -1
- package/src/errors/ecies.d.ts +46 -1
- package/src/errors/ecies.d.ts.map +1 -1
- package/src/errors/ecies.js +65 -10
- package/src/errors/ecies.js.map +1 -1
- package/src/errors/guid.d.ts +44 -0
- package/src/errors/guid.d.ts.map +1 -0
- package/src/errors/guid.js +81 -0
- package/src/errors/guid.js.map +1 -0
- package/src/errors/id-provider.d.ts +23 -0
- package/src/errors/id-provider.d.ts.map +1 -0
- package/src/errors/id-provider.js +29 -0
- package/src/errors/id-provider.js.map +1 -0
- package/src/errors/index.d.ts +3 -0
- package/src/errors/index.d.ts.map +1 -1
- package/src/errors/index.js +9 -10
- package/src/errors/index.js.map +1 -1
- package/src/errors/invalid-email.js +5 -9
- package/src/errors/invalid-email.js.map +1 -1
- package/src/errors/length.js +5 -9
- package/src/errors/length.js.map +1 -1
- package/src/errors/member.js +5 -9
- package/src/errors/member.js.map +1 -1
- package/src/errors/pbkdf2.js +5 -9
- package/src/errors/pbkdf2.js.map +1 -1
- package/src/errors/secure-storage.js +6 -10
- package/src/errors/secure-storage.js.map +1 -1
- package/src/errors/simple-ecies.js +6 -10
- package/src/errors/simple-ecies.js.map +1 -1
- package/src/errors/simple-test-error.js +1 -5
- package/src/errors/simple-test-error.js.map +1 -1
- package/src/i18n-setup.js +29 -37
- package/src/i18n-setup.js.map +1 -1
- package/src/index.d.ts +10 -0
- package/src/index.d.ts.map +1 -1
- package/src/index.js +44 -57
- package/src/index.js.map +1 -1
- package/src/interfaces/checksum-config.js +1 -2
- package/src/interfaces/checksum-consts.js +1 -2
- package/src/interfaces/configuration-provenance.d.ts +51 -0
- package/src/interfaces/configuration-provenance.d.ts.map +1 -0
- package/src/interfaces/configuration-provenance.js +23 -0
- package/src/interfaces/configuration-provenance.js.map +1 -0
- package/src/interfaces/constants.d.ts +27 -1
- package/src/interfaces/constants.d.ts.map +1 -1
- package/src/interfaces/constants.js +1 -2
- package/src/interfaces/ecies-config.js +1 -2
- package/src/interfaces/ecies-consts.js +1 -2
- package/src/interfaces/ecies-file-service.js +1 -2
- package/src/interfaces/encrypted-chunk.js +1 -4
- package/src/interfaces/encrypted-chunk.js.map +1 -1
- package/src/interfaces/encryption-state.js +1 -4
- package/src/interfaces/encryption-state.js.map +1 -1
- package/src/interfaces/frontend-member-operational.js +1 -2
- package/src/interfaces/guid.d.ts +78 -0
- package/src/interfaces/guid.d.ts.map +1 -0
- package/src/interfaces/guid.js +2 -0
- package/src/interfaces/guid.js.map +1 -0
- package/src/interfaces/id-provider.d.ts +83 -0
- package/src/interfaces/id-provider.d.ts.map +1 -0
- package/src/interfaces/id-provider.js +35 -0
- package/src/interfaces/id-provider.js.map +1 -0
- package/src/interfaces/index.d.ts +1 -0
- package/src/interfaces/index.d.ts.map +1 -1
- package/src/interfaces/index.js +13 -15
- package/src/interfaces/index.js.map +1 -1
- package/src/interfaces/invariant.d.ts +46 -0
- package/src/interfaces/invariant.d.ts.map +1 -0
- package/src/interfaces/invariant.js +18 -0
- package/src/interfaces/invariant.js.map +1 -0
- package/src/interfaces/library-error.js +1 -2
- package/src/interfaces/member-storage.js +1 -2
- package/src/interfaces/member-with-mnemonic.js +1 -2
- package/src/interfaces/multi-recipient-chunk.d.ts +36 -12
- package/src/interfaces/multi-recipient-chunk.d.ts.map +1 -1
- package/src/interfaces/multi-recipient-chunk.js +36 -14
- package/src/interfaces/multi-recipient-chunk.js.map +1 -1
- package/src/interfaces/pbkdf2-config.js +1 -2
- package/src/interfaces/pbkdf2-consts.js +1 -2
- package/src/interfaces/pbkdf2-result.js +1 -2
- package/src/interfaces/stream-config.js +1 -4
- package/src/interfaces/stream-config.js.map +1 -1
- package/src/interfaces/stream-header.js +1 -4
- package/src/interfaces/stream-header.js.map +1 -1
- package/src/interfaces/stream-progress.js +1 -2
- package/src/lib/crypto-container.js +9 -13
- package/src/lib/crypto-container.js.map +1 -1
- package/src/lib/guid.d.ts +344 -0
- package/src/lib/guid.d.ts.map +1 -0
- package/src/lib/guid.js +914 -0
- package/src/lib/guid.js.map +1 -0
- package/src/lib/id-providers/custom-provider.d.ts +69 -0
- package/src/lib/id-providers/custom-provider.d.ts.map +1 -0
- package/src/lib/id-providers/custom-provider.js +128 -0
- package/src/lib/id-providers/custom-provider.js.map +1 -0
- package/src/lib/id-providers/guidv4-provider.d.ts +46 -0
- package/src/lib/id-providers/guidv4-provider.d.ts.map +1 -0
- package/src/lib/id-providers/guidv4-provider.js +105 -0
- package/src/lib/id-providers/guidv4-provider.js.map +1 -0
- package/src/lib/id-providers/index.d.ts +30 -0
- package/src/lib/id-providers/index.d.ts.map +1 -0
- package/src/lib/id-providers/index.js +29 -0
- package/src/lib/id-providers/index.js.map +1 -0
- package/src/lib/id-providers/objectid-provider.d.ts +33 -0
- package/src/lib/id-providers/objectid-provider.d.ts.map +1 -0
- package/src/lib/id-providers/objectid-provider.js +79 -0
- package/src/lib/id-providers/objectid-provider.js.map +1 -0
- package/src/lib/id-providers/uuid-provider.d.ts +42 -0
- package/src/lib/id-providers/uuid-provider.d.ts.map +1 -0
- package/src/lib/id-providers/uuid-provider.js +96 -0
- package/src/lib/id-providers/uuid-provider.js.map +1 -0
- package/src/lib/index.d.ts +1 -0
- package/src/lib/index.d.ts.map +1 -1
- package/src/lib/index.js +2 -4
- package/src/lib/index.js.map +1 -1
- package/src/lib/invariant-validator.d.ts +59 -0
- package/src/lib/invariant-validator.d.ts.map +1 -0
- package/src/lib/invariant-validator.js +97 -0
- package/src/lib/invariant-validator.js.map +1 -0
- package/src/lib/invariants/encryption-algorithm-consistency.d.ts +17 -0
- package/src/lib/invariants/encryption-algorithm-consistency.d.ts.map +1 -0
- package/src/lib/invariants/encryption-algorithm-consistency.js +49 -0
- package/src/lib/invariants/encryption-algorithm-consistency.js.map +1 -0
- package/src/lib/invariants/index.d.ts +4 -0
- package/src/lib/invariants/index.d.ts.map +1 -0
- package/src/lib/invariants/index.js +4 -0
- package/src/lib/invariants/index.js.map +1 -0
- package/src/lib/invariants/pbkdf2-profiles-validity.d.ts +16 -0
- package/src/lib/invariants/pbkdf2-profiles-validity.d.ts.map +1 -0
- package/src/lib/invariants/pbkdf2-profiles-validity.js +58 -0
- package/src/lib/invariants/pbkdf2-profiles-validity.js.map +1 -0
- package/src/lib/invariants/recipient-id-consistency.d.ts +18 -0
- package/src/lib/invariants/recipient-id-consistency.d.ts.map +1 -0
- package/src/lib/invariants/recipient-id-consistency.js +31 -0
- package/src/lib/invariants/recipient-id-consistency.js.map +1 -0
- package/src/member.js +43 -48
- package/src/member.js.map +1 -1
- package/src/pbkdf2-profiles.js +1 -2
- package/src/phone-number.js +7 -11
- package/src/phone-number.js.map +1 -1
- package/src/regexes.js +3 -6
- package/src/regexes.js.map +1 -1
- package/src/secure-buffer.d.ts +17 -1
- package/src/secure-buffer.d.ts.map +1 -1
- package/src/secure-buffer.js +40 -22
- package/src/secure-buffer.js.map +1 -1
- package/src/secure-string.js +20 -24
- package/src/secure-string.js.map +1 -1
- package/src/services/aes-gcm.js +21 -25
- package/src/services/aes-gcm.js.map +1 -1
- package/src/services/chunk-processor.js +32 -36
- package/src/services/chunk-processor.js.map +1 -1
- package/src/services/ecies/crypto-core.js +33 -37
- package/src/services/ecies/crypto-core.js.map +1 -1
- package/src/services/ecies/example.js +37 -44
- package/src/services/ecies/example.js.map +1 -1
- package/src/services/ecies/file.js +1 -5
- package/src/services/ecies/file.js.map +1 -1
- package/src/services/ecies/index.js +10 -15
- package/src/services/ecies/index.js.map +1 -1
- package/src/services/ecies/integration.js +23 -28
- package/src/services/ecies/integration.js.map +1 -1
- package/src/services/ecies/interfaces.js +1 -2
- package/src/services/ecies/interfaces.js.map +1 -1
- package/src/services/ecies/manual-test.js +26 -34
- package/src/services/ecies/manual-test.js.map +1 -1
- package/src/services/ecies/multi-recipient.js +47 -51
- package/src/services/ecies/multi-recipient.js.map +1 -1
- package/src/services/ecies/service.js +27 -31
- package/src/services/ecies/service.js.map +1 -1
- package/src/services/ecies/signature.js +9 -13
- package/src/services/ecies/signature.js.map +1 -1
- package/src/services/ecies/single-recipient.js +42 -46
- package/src/services/ecies/single-recipient.js.map +1 -1
- package/src/services/encryption-stream.d.ts +3 -1
- package/src/services/encryption-stream.d.ts.map +1 -1
- package/src/services/encryption-stream.js +46 -48
- package/src/services/encryption-stream.js.map +1 -1
- package/src/services/index.js +5 -8
- package/src/services/index.js.map +1 -1
- package/src/services/multi-recipient-processor.d.ts +12 -2
- package/src/services/multi-recipient-processor.d.ts.map +1 -1
- package/src/services/multi-recipient-processor.js +65 -56
- package/src/services/multi-recipient-processor.js.map +1 -1
- package/src/services/password-login.js +33 -37
- package/src/services/password-login.js.map +1 -1
- package/src/services/pbkdf2.js +8 -12
- package/src/services/pbkdf2.js.map +1 -1
- package/src/services/progress-tracker.js +5 -9
- package/src/services/progress-tracker.js.map +1 -1
- package/src/services/resumable-encryption.js +24 -28
- package/src/services/resumable-encryption.js.map +1 -1
- package/src/services/xor.js +1 -5
- package/src/services/xor.js.map +1 -1
- package/src/test-mocks/index.js +1 -4
- package/src/test-mocks/index.js.map +1 -1
- package/src/test-mocks/mock-frontend-member.js +20 -24
- package/src/test-mocks/mock-frontend-member.js.map +1 -1
- package/src/testing.js +1 -4
- package/src/testing.js.map +1 -1
- package/src/translations/de.d.ts +2 -1
- package/src/translations/de.d.ts.map +1 -1
- package/src/translations/de.js +190 -170
- package/src/translations/de.js.map +1 -1
- package/src/translations/en-US.d.ts +2 -1
- package/src/translations/en-US.d.ts.map +1 -1
- package/src/translations/en-US.js +190 -170
- package/src/translations/en-US.js.map +1 -1
- package/src/translations/es.d.ts +2 -1
- package/src/translations/es.d.ts.map +1 -1
- package/src/translations/es.js +190 -170
- package/src/translations/es.js.map +1 -1
- package/src/translations/fr.d.ts +2 -1
- package/src/translations/fr.d.ts.map +1 -1
- package/src/translations/fr.js +190 -170
- package/src/translations/fr.js.map +1 -1
- package/src/translations/ja.d.ts +2 -1
- package/src/translations/ja.d.ts.map +1 -1
- package/src/translations/ja.js +189 -170
- package/src/translations/ja.js.map +1 -1
- package/src/translations/uk.d.ts +2 -1
- package/src/translations/uk.d.ts.map +1 -1
- package/src/translations/uk.js +192 -170
- package/src/translations/uk.js.map +1 -1
- package/src/translations/zh-cn.d.ts +2 -1
- package/src/translations/zh-cn.d.ts.map +1 -1
- package/src/translations/zh-cn.js +189 -170
- package/src/translations/zh-cn.js.map +1 -1
- package/src/types/deep-partial.js +1 -2
- package/src/types.d.ts +31 -0
- package/src/types.d.ts.map +1 -1
- package/src/types.js +1 -2
- package/src/utils.js +59 -77
- package/src/utils.js.map +1 -1
package/src/secure-string.js
CHANGED
|
@@ -1,17 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const i18n_setup_1 = require("./i18n-setup");
|
|
9
|
-
const xor_1 = require("./services/xor");
|
|
10
|
-
const utils_1 = require("./utils");
|
|
1
|
+
import { SecureStorageErrorType } from './enumerations/secure-storage-error-type';
|
|
2
|
+
import { DisposedError } from './errors/disposed';
|
|
3
|
+
import { SecureStorageError } from './errors/secure-storage';
|
|
4
|
+
import { ObjectId } from 'bson';
|
|
5
|
+
import { getEciesI18nEngine } from './i18n-setup';
|
|
6
|
+
import { XorService } from './services/xor';
|
|
7
|
+
import { uint8ArrayToHex } from './utils';
|
|
11
8
|
/**
|
|
12
9
|
* A secure string buffer is a buffer whose intent is to prevent the raw password from being stored in memory.
|
|
13
10
|
*/
|
|
14
|
-
class SecureString {
|
|
11
|
+
export class SecureString {
|
|
15
12
|
_disposed = false;
|
|
16
13
|
_isNull;
|
|
17
14
|
_id;
|
|
@@ -21,7 +18,7 @@ class SecureString {
|
|
|
21
18
|
_obfuscatedChecksum;
|
|
22
19
|
_disposedAt;
|
|
23
20
|
constructor(data) {
|
|
24
|
-
this._id = new
|
|
21
|
+
this._id = new ObjectId();
|
|
25
22
|
// only treat null/undefined as null, empty strings/arrays are valid empty data
|
|
26
23
|
if (data === null || data === undefined) {
|
|
27
24
|
this._isNull = true;
|
|
@@ -44,7 +41,7 @@ class SecureString {
|
|
|
44
41
|
}
|
|
45
42
|
assertNotDisposed() {
|
|
46
43
|
if (this._disposed) {
|
|
47
|
-
const e = new
|
|
44
|
+
const e = new DisposedError();
|
|
48
45
|
try {
|
|
49
46
|
e.disposedAt = this._disposedAt;
|
|
50
47
|
}
|
|
@@ -55,7 +52,7 @@ class SecureString {
|
|
|
55
52
|
}
|
|
56
53
|
}
|
|
57
54
|
dispose() {
|
|
58
|
-
const err = new
|
|
55
|
+
const err = new DisposedError();
|
|
59
56
|
if (typeof Error.captureStackTrace === 'function') {
|
|
60
57
|
Error.captureStackTrace(err, this.dispose);
|
|
61
58
|
}
|
|
@@ -88,7 +85,7 @@ class SecureString {
|
|
|
88
85
|
try {
|
|
89
86
|
const deobfuscatedResult = this.deobfuscateData(this._obfuscatedValue);
|
|
90
87
|
if (deobfuscatedResult.length !== this._length) {
|
|
91
|
-
throw new
|
|
88
|
+
throw new SecureStorageError(SecureStorageErrorType.DecryptedValueLengthMismatch, getEciesI18nEngine());
|
|
92
89
|
}
|
|
93
90
|
// Validate checksum
|
|
94
91
|
const expectedChecksum = this.createSimpleChecksum(deobfuscatedResult);
|
|
@@ -96,17 +93,17 @@ class SecureString {
|
|
|
96
93
|
const expectedBytes = new TextEncoder().encode(expectedChecksum);
|
|
97
94
|
const storedBytes = new TextEncoder().encode(storedChecksum);
|
|
98
95
|
if (!this.timingSafeEqual(expectedBytes, storedBytes)) {
|
|
99
|
-
throw new
|
|
96
|
+
throw new SecureStorageError(SecureStorageErrorType.DecryptedValueChecksumMismatch, getEciesI18nEngine());
|
|
100
97
|
}
|
|
101
98
|
return deobfuscatedResult;
|
|
102
99
|
}
|
|
103
100
|
catch (error) {
|
|
104
101
|
// If it's already a SecureStorageError, re-throw it
|
|
105
|
-
if (error instanceof
|
|
102
|
+
if (error instanceof SecureStorageError) {
|
|
106
103
|
throw error;
|
|
107
104
|
}
|
|
108
105
|
// Convert any other error to SecureStorageError
|
|
109
|
-
throw new
|
|
106
|
+
throw new SecureStorageError(SecureStorageErrorType.DecryptedValueChecksumMismatch, getEciesI18nEngine());
|
|
110
107
|
}
|
|
111
108
|
}
|
|
112
109
|
get value() {
|
|
@@ -119,13 +116,13 @@ class SecureString {
|
|
|
119
116
|
get notNullValue() {
|
|
120
117
|
this.assertNotDisposed();
|
|
121
118
|
if (this._isNull) {
|
|
122
|
-
throw new
|
|
119
|
+
throw new SecureStorageError(SecureStorageErrorType.ValueIsNull, getEciesI18nEngine());
|
|
123
120
|
}
|
|
124
121
|
return new TextDecoder().decode(this.valueAsUint8Array);
|
|
125
122
|
}
|
|
126
123
|
get valueAsHexString() {
|
|
127
124
|
this.assertNotDisposed();
|
|
128
|
-
return
|
|
125
|
+
return uint8ArrayToHex(this.valueAsUint8Array);
|
|
129
126
|
}
|
|
130
127
|
get valueAsBase64String() {
|
|
131
128
|
this.assertNotDisposed();
|
|
@@ -147,7 +144,7 @@ class SecureString {
|
|
|
147
144
|
async generateChecksum(data) {
|
|
148
145
|
const dataBytes = typeof data === 'string' ? new TextEncoder().encode(data) : data;
|
|
149
146
|
const hashArray = await crypto.subtle.digest('SHA-256', new Uint8Array(dataBytes));
|
|
150
|
-
return
|
|
147
|
+
return uint8ArrayToHex(new Uint8Array(hashArray));
|
|
151
148
|
}
|
|
152
149
|
createSimpleChecksum(data) {
|
|
153
150
|
let hash = 0;
|
|
@@ -185,11 +182,10 @@ class SecureString {
|
|
|
185
182
|
return this.validateChecksum(data, deobfuscatedChecksum);
|
|
186
183
|
}
|
|
187
184
|
obfuscateData(data) {
|
|
188
|
-
return
|
|
185
|
+
return XorService.xor(data, this._key);
|
|
189
186
|
}
|
|
190
187
|
deobfuscateData(data) {
|
|
191
|
-
return
|
|
188
|
+
return XorService.xor(data, this._key);
|
|
192
189
|
}
|
|
193
190
|
}
|
|
194
|
-
exports.SecureString = SecureString;
|
|
195
191
|
//# sourceMappingURL=secure-string.js.map
|
package/src/secure-string.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secure-string.js","sourceRoot":"","sources":["../../../../packages/digitaldefiance-ecies-lib/src/secure-string.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"secure-string.js","sourceRoot":"","sources":["../../../../packages/digitaldefiance-ecies-lib/src/secure-string.ts"],"names":[],"mappings":"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"}
|
package/src/services/aes-gcm.js
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const i18n_setup_1 = require("../i18n-setup");
|
|
6
|
-
const enumerations_1 = require("../enumerations");
|
|
7
|
-
class AESGCMService {
|
|
1
|
+
import { Constants } from '../constants';
|
|
2
|
+
import { EciesComponentId, getEciesI18nEngine } from '../i18n-setup';
|
|
3
|
+
import { EciesStringKey } from '../enumerations';
|
|
4
|
+
export class AESGCMService {
|
|
8
5
|
static ALGORITHM_NAME = 'AES-GCM';
|
|
9
6
|
/**
|
|
10
7
|
* Encrypt data using AES-GCM
|
|
@@ -12,20 +9,20 @@ class AESGCMService {
|
|
|
12
9
|
* @param key Key to use for encryption (must be 16, 24 or 32 bytes for AES)
|
|
13
10
|
* @returns Encrypted data
|
|
14
11
|
*/
|
|
15
|
-
static async encrypt(data, key, authTag = false, eciesParams =
|
|
12
|
+
static async encrypt(data, key, authTag = false, eciesParams = Constants.ECIES) {
|
|
16
13
|
// Validate key length (AES supports 16, 24, or 32 bytes)
|
|
17
14
|
if (!key || (key.length !== 16 && key.length !== 24 && key.length !== 32)) {
|
|
18
|
-
const engine =
|
|
19
|
-
throw new Error(engine.translate(
|
|
15
|
+
const engine = getEciesI18nEngine();
|
|
16
|
+
throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_ECIESError_InvalidAESKeyLength));
|
|
20
17
|
}
|
|
21
18
|
// Validate data exists (empty data is allowed for AES-GCM)
|
|
22
19
|
if (!data) {
|
|
23
|
-
const engine =
|
|
24
|
-
throw new Error(engine.translate(
|
|
20
|
+
const engine = getEciesI18nEngine();
|
|
21
|
+
throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_ECIESError_CannotEncryptEmptyData));
|
|
25
22
|
}
|
|
26
23
|
if (data.length > eciesParams.MAX_RAW_DATA_SIZE) {
|
|
27
|
-
const engine =
|
|
28
|
-
throw new Error(engine.translate(
|
|
24
|
+
const engine = getEciesI18nEngine();
|
|
25
|
+
throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_ECIESError_MessageLengthExceedsMaximumAllowedSizeTemplate, { messageLength: data.length }));
|
|
29
26
|
}
|
|
30
27
|
const cryptoKey = await crypto.subtle.importKey('raw', new Uint8Array(key), { name: AESGCMService.ALGORITHM_NAME }, false, ['encrypt']);
|
|
31
28
|
const eciesConsts = eciesParams;
|
|
@@ -85,13 +82,13 @@ class AESGCMService {
|
|
|
85
82
|
* @param hasAuthTag Whether the combined data includes an authentication tag
|
|
86
83
|
* @returns Object containing the split components
|
|
87
84
|
*/
|
|
88
|
-
static splitEncryptedData(combinedData, hasAuthTag = true, eciesParams =
|
|
85
|
+
static splitEncryptedData(combinedData, hasAuthTag = true, eciesParams = Constants.ECIES) {
|
|
89
86
|
const eciesConsts = eciesParams;
|
|
90
87
|
const ivLength = eciesConsts.IV_SIZE;
|
|
91
88
|
const tagLength = hasAuthTag ? eciesConsts.AUTH_TAG_SIZE : 0;
|
|
92
89
|
if (combinedData.length < ivLength + tagLength) {
|
|
93
|
-
const engine =
|
|
94
|
-
throw new Error(engine.translate(
|
|
90
|
+
const engine = getEciesI18nEngine();
|
|
91
|
+
throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_ECIESError_CombinedDataTooShortForComponents));
|
|
95
92
|
}
|
|
96
93
|
const iv = combinedData.slice(0, ivLength);
|
|
97
94
|
const encryptedDataWithTag = combinedData.slice(ivLength);
|
|
@@ -105,22 +102,22 @@ class AESGCMService {
|
|
|
105
102
|
* @param authTag Whether the encrypted data includes an authentication tag
|
|
106
103
|
* @returns Decrypted data
|
|
107
104
|
*/
|
|
108
|
-
static async decrypt(iv, encryptedData, key, authTag = false, eciesParams =
|
|
105
|
+
static async decrypt(iv, encryptedData, key, authTag = false, eciesParams = Constants.ECIES) {
|
|
109
106
|
const eciesConsts = eciesParams;
|
|
110
107
|
// Validate key length
|
|
111
108
|
if (!key || (key.length !== 16 && key.length !== 24 && key.length !== 32)) {
|
|
112
|
-
const engine =
|
|
113
|
-
throw new Error(engine.translate(
|
|
109
|
+
const engine = getEciesI18nEngine();
|
|
110
|
+
throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_ECIESError_InvalidAESKeyLength));
|
|
114
111
|
}
|
|
115
112
|
// Validate IV
|
|
116
113
|
if (!iv || iv.length !== eciesConsts.IV_SIZE) {
|
|
117
|
-
const engine =
|
|
118
|
-
throw new Error(engine.translate(
|
|
114
|
+
const engine = getEciesI18nEngine();
|
|
115
|
+
throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_ECIESError_InvalidIV));
|
|
119
116
|
}
|
|
120
117
|
// Validate encrypted data exists (empty encrypted data is allowed)
|
|
121
118
|
if (!encryptedData) {
|
|
122
|
-
const engine =
|
|
123
|
-
throw new Error(engine.translate(
|
|
119
|
+
const engine = getEciesI18nEngine();
|
|
120
|
+
throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_ECIESError_CannotDecryptEmptyData));
|
|
124
121
|
}
|
|
125
122
|
const cryptoKey = await crypto.subtle.importKey('raw', new Uint8Array(key), { name: AESGCMService.ALGORITHM_NAME }, false, ['decrypt']);
|
|
126
123
|
if (!authTag) {
|
|
@@ -136,5 +133,4 @@ class AESGCMService {
|
|
|
136
133
|
return new Uint8Array(decryptedResult);
|
|
137
134
|
}
|
|
138
135
|
}
|
|
139
|
-
exports.AESGCMService = AESGCMService;
|
|
140
136
|
//# sourceMappingURL=aes-gcm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aes-gcm.js","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-ecies-lib/src/services/aes-gcm.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"aes-gcm.js","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-ecies-lib/src/services/aes-gcm.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const encrypted_chunk_1 = require("../interfaces/encrypted-chunk");
|
|
7
|
-
const i18n_setup_1 = require("../i18n-setup");
|
|
8
|
-
const ecies_string_key_1 = require("../enumerations/ecies-string-key");
|
|
1
|
+
import { sha256 } from '@noble/hashes/sha2.js';
|
|
2
|
+
import { Constants } from '../constants';
|
|
3
|
+
import { CHUNK_CONSTANTS, } from '../interfaces/encrypted-chunk';
|
|
4
|
+
import { getEciesI18nEngine, EciesComponentId } from '../i18n-setup';
|
|
5
|
+
import { EciesStringKey } from '../enumerations/ecies-string-key';
|
|
9
6
|
/**
|
|
10
7
|
* Processes chunks for streaming encryption/decryption
|
|
11
8
|
*/
|
|
12
|
-
class ChunkProcessor {
|
|
9
|
+
export class ChunkProcessor {
|
|
13
10
|
ecies;
|
|
14
11
|
eciesConsts;
|
|
15
|
-
constructor(ecies, eciesConsts =
|
|
12
|
+
constructor(ecies, eciesConsts = Constants.ECIES) {
|
|
16
13
|
this.ecies = ecies;
|
|
17
14
|
this.eciesConsts = eciesConsts;
|
|
18
15
|
}
|
|
@@ -20,7 +17,7 @@ class ChunkProcessor {
|
|
|
20
17
|
* Build chunk header
|
|
21
18
|
*/
|
|
22
19
|
buildChunkHeader(header) {
|
|
23
|
-
const buffer = new Uint8Array(
|
|
20
|
+
const buffer = new Uint8Array(CHUNK_CONSTANTS.HEADER_SIZE);
|
|
24
21
|
const view = new DataView(buffer.buffer);
|
|
25
22
|
view.setUint32(0, header.magic, false);
|
|
26
23
|
view.setUint16(4, header.version, false);
|
|
@@ -35,18 +32,18 @@ class ChunkProcessor {
|
|
|
35
32
|
* Parse chunk header
|
|
36
33
|
*/
|
|
37
34
|
parseChunkHeader(data) {
|
|
38
|
-
const engine =
|
|
39
|
-
if (data.length <
|
|
40
|
-
throw new Error(engine.translate(
|
|
35
|
+
const engine = getEciesI18nEngine();
|
|
36
|
+
if (data.length < CHUNK_CONSTANTS.HEADER_SIZE) {
|
|
37
|
+
throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_Chunk_DataTooShortForHeader));
|
|
41
38
|
}
|
|
42
39
|
const view = new DataView(data.buffer, data.byteOffset);
|
|
43
40
|
const magic = view.getUint32(0, false);
|
|
44
|
-
if (magic !==
|
|
45
|
-
throw new Error(engine.translate(
|
|
41
|
+
if (magic !== CHUNK_CONSTANTS.MAGIC) {
|
|
42
|
+
throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_Chunk_InvalidMagicBytes));
|
|
46
43
|
}
|
|
47
44
|
const version = view.getUint16(4, false);
|
|
48
|
-
if (version !==
|
|
49
|
-
throw new Error(engine.translate(
|
|
45
|
+
if (version !== CHUNK_CONSTANTS.VERSION) {
|
|
46
|
+
throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_Chunk_UnsupportedVersion));
|
|
50
47
|
}
|
|
51
48
|
return {
|
|
52
49
|
magic,
|
|
@@ -64,16 +61,16 @@ class ChunkProcessor {
|
|
|
64
61
|
// Encrypt data
|
|
65
62
|
const encrypted = await this.ecies.encryptSimpleOrSingle(false, publicKey, data);
|
|
66
63
|
// Calculate checksum if requested
|
|
67
|
-
const checksum = includeChecksum ?
|
|
64
|
+
const checksum = includeChecksum ? sha256(data) : undefined;
|
|
68
65
|
// Build header
|
|
69
66
|
let flags = 0;
|
|
70
67
|
if (isLast)
|
|
71
|
-
flags |=
|
|
68
|
+
flags |= CHUNK_CONSTANTS.FLAG_IS_LAST;
|
|
72
69
|
if (includeChecksum)
|
|
73
|
-
flags |=
|
|
70
|
+
flags |= CHUNK_CONSTANTS.FLAG_HAS_CHECKSUM;
|
|
74
71
|
const header = this.buildChunkHeader({
|
|
75
|
-
magic:
|
|
76
|
-
version:
|
|
72
|
+
magic: CHUNK_CONSTANTS.MAGIC,
|
|
73
|
+
version: CHUNK_CONSTANTS.VERSION,
|
|
77
74
|
index,
|
|
78
75
|
originalSize: data.length,
|
|
79
76
|
encryptedSize: encrypted.length,
|
|
@@ -110,40 +107,39 @@ class ChunkProcessor {
|
|
|
110
107
|
// Parse header
|
|
111
108
|
const header = this.parseChunkHeader(chunkData);
|
|
112
109
|
// Extract encrypted data
|
|
113
|
-
const hasChecksum = (header.flags &
|
|
114
|
-
const encryptedStart =
|
|
110
|
+
const hasChecksum = (header.flags & CHUNK_CONSTANTS.FLAG_HAS_CHECKSUM) !== 0;
|
|
111
|
+
const encryptedStart = CHUNK_CONSTANTS.HEADER_SIZE;
|
|
115
112
|
const encryptedEnd = hasChecksum
|
|
116
|
-
? chunkData.length -
|
|
113
|
+
? chunkData.length - CHUNK_CONSTANTS.CHECKSUM_SIZE
|
|
117
114
|
: chunkData.length;
|
|
118
115
|
const encrypted = chunkData.slice(encryptedStart, encryptedEnd);
|
|
119
116
|
// Validate encrypted size matches header
|
|
120
117
|
if (encrypted.length !== header.encryptedSize) {
|
|
121
|
-
const engine =
|
|
122
|
-
throw new Error(engine.translate(
|
|
118
|
+
const engine = getEciesI18nEngine();
|
|
119
|
+
throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_Chunk_EncryptedSizeMismatchTemplate, { expectedSize: header.encryptedSize, actualSize: encrypted.length }));
|
|
123
120
|
}
|
|
124
121
|
// Decrypt
|
|
125
122
|
const decrypted = await this.ecies.decryptSimpleOrSingleWithHeader(false, privateKey, encrypted);
|
|
126
123
|
// Verify checksum if present
|
|
127
124
|
if (hasChecksum) {
|
|
128
|
-
const storedChecksum = chunkData.slice(-
|
|
129
|
-
const computedChecksum =
|
|
125
|
+
const storedChecksum = chunkData.slice(-CHUNK_CONSTANTS.CHECKSUM_SIZE);
|
|
126
|
+
const computedChecksum = sha256(decrypted);
|
|
130
127
|
// Constant-time comparison to prevent timing attacks
|
|
131
128
|
let diff = 0;
|
|
132
|
-
for (let i = 0; i <
|
|
129
|
+
for (let i = 0; i < CHUNK_CONSTANTS.CHECKSUM_SIZE; i++) {
|
|
133
130
|
diff |= storedChecksum[i] ^ computedChecksum[i];
|
|
134
131
|
}
|
|
135
132
|
if (diff !== 0) {
|
|
136
|
-
const engine =
|
|
137
|
-
throw new Error(engine.translate(
|
|
133
|
+
const engine = getEciesI18nEngine();
|
|
134
|
+
throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_Chunk_ChecksumMismatch));
|
|
138
135
|
}
|
|
139
136
|
}
|
|
140
137
|
// Verify size
|
|
141
138
|
if (decrypted.length !== header.originalSize) {
|
|
142
|
-
const engine =
|
|
143
|
-
throw new Error(engine.translate(
|
|
139
|
+
const engine = getEciesI18nEngine();
|
|
140
|
+
throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_Chunk_DecryptedSizeMismatch));
|
|
144
141
|
}
|
|
145
142
|
return { data: decrypted, header };
|
|
146
143
|
}
|
|
147
144
|
}
|
|
148
|
-
exports.ChunkProcessor = ChunkProcessor;
|
|
149
145
|
//# sourceMappingURL=chunk-processor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk-processor.js","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-ecies-lib/src/services/chunk-processor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"chunk-processor.js","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-ecies-lib/src/services/chunk-processor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,23 +1,20 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const secp256k1_js_1 = require("@noble/curves/secp256k1.js");
|
|
11
|
-
const i18n_setup_1 = require("../../i18n-setup");
|
|
12
|
-
const enumerations_1 = require("../../enumerations");
|
|
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 { Constants } from '../../constants';
|
|
6
|
+
import { SecureString } from '../../secure-string';
|
|
7
|
+
import { secp256k1 } from '@noble/curves/secp256k1.js';
|
|
8
|
+
import { EciesComponentId, getEciesI18nEngine } from '../../i18n-setup';
|
|
9
|
+
import { EciesStringKey } from '../../enumerations';
|
|
13
10
|
/**
|
|
14
11
|
* Browser-compatible crypto core for ECIES operations
|
|
15
12
|
* Uses @scure libraries for browser compatibility
|
|
16
13
|
*/
|
|
17
|
-
class EciesCryptoCore {
|
|
14
|
+
export class EciesCryptoCore {
|
|
18
15
|
_config;
|
|
19
16
|
_eciesConsts;
|
|
20
|
-
constructor(config, eciesParams =
|
|
17
|
+
constructor(config, eciesParams = Constants.ECIES) {
|
|
21
18
|
this._config = config;
|
|
22
19
|
this._eciesConsts = eciesParams;
|
|
23
20
|
}
|
|
@@ -29,8 +26,8 @@ class EciesCryptoCore {
|
|
|
29
26
|
*/
|
|
30
27
|
normalizePublicKey(publicKey) {
|
|
31
28
|
if (!publicKey) {
|
|
32
|
-
const engine =
|
|
33
|
-
throw new Error(engine.translate(
|
|
29
|
+
const engine = getEciesI18nEngine();
|
|
30
|
+
throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_ECIESError_ReceivedNullOrUndefinedPublicKey));
|
|
34
31
|
}
|
|
35
32
|
const keyLength = publicKey.length;
|
|
36
33
|
let normalizedKey;
|
|
@@ -46,8 +43,8 @@ class EciesCryptoCore {
|
|
|
46
43
|
normalizedKey.set(publicKey, 1);
|
|
47
44
|
}
|
|
48
45
|
else {
|
|
49
|
-
const engine =
|
|
50
|
-
throw new Error(engine.translate(
|
|
46
|
+
const engine = getEciesI18nEngine();
|
|
47
|
+
throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_ECIESError_InvalidPublicKeyFormatOrLengthTemplate, { keyLength }));
|
|
51
48
|
}
|
|
52
49
|
// Basic validation: check it's not all zeros
|
|
53
50
|
let allZeros = true;
|
|
@@ -58,8 +55,8 @@ class EciesCryptoCore {
|
|
|
58
55
|
}
|
|
59
56
|
}
|
|
60
57
|
if (allZeros) {
|
|
61
|
-
const engine =
|
|
62
|
-
throw new Error(engine.translate(
|
|
58
|
+
const engine = getEciesI18nEngine();
|
|
59
|
+
throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_ECIESError_InvalidPublicKeyNotOnCurve));
|
|
63
60
|
}
|
|
64
61
|
return normalizedKey;
|
|
65
62
|
}
|
|
@@ -67,25 +64,25 @@ class EciesCryptoCore {
|
|
|
67
64
|
* Generate a new mnemonic
|
|
68
65
|
*/
|
|
69
66
|
generateNewMnemonic() {
|
|
70
|
-
return new
|
|
67
|
+
return new SecureString(generateMnemonic(wordlist, this._config.mnemonicStrength));
|
|
71
68
|
}
|
|
72
69
|
/**
|
|
73
70
|
* Generate wallet and seed from mnemonic
|
|
74
71
|
*/
|
|
75
72
|
walletAndSeedFromMnemonic(mnemonic) {
|
|
76
|
-
if (!mnemonic || !
|
|
77
|
-
const engine =
|
|
78
|
-
throw new Error(engine.translate(
|
|
73
|
+
if (!mnemonic || !validateMnemonic(mnemonic.value ?? '', wordlist)) {
|
|
74
|
+
const engine = getEciesI18nEngine();
|
|
75
|
+
throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_ECIESError_InvalidMnemonic));
|
|
79
76
|
}
|
|
80
|
-
const seed =
|
|
81
|
-
const hdKey =
|
|
77
|
+
const seed = mnemonicToSeedSync(mnemonic.value ?? '');
|
|
78
|
+
const hdKey = HDKey.fromMasterSeed(seed);
|
|
82
79
|
const derivedKey = hdKey.derive(this._config.primaryKeyDerivationPath);
|
|
83
80
|
if (!derivedKey.privateKey) {
|
|
84
|
-
const engine =
|
|
85
|
-
throw new Error(engine.translate(
|
|
81
|
+
const engine = getEciesI18nEngine();
|
|
82
|
+
throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_ECIESError_FailedToDervivePrivateKey));
|
|
86
83
|
}
|
|
87
84
|
const privateKey = derivedKey.privateKey;
|
|
88
|
-
const wallet = new
|
|
85
|
+
const wallet = new Wallet(privateKey);
|
|
89
86
|
return {
|
|
90
87
|
wallet,
|
|
91
88
|
seed,
|
|
@@ -95,14 +92,14 @@ class EciesCryptoCore {
|
|
|
95
92
|
* Create a simple key pair from a seed
|
|
96
93
|
*/
|
|
97
94
|
seedToSimpleKeyPair(seed) {
|
|
98
|
-
const hdKey =
|
|
95
|
+
const hdKey = HDKey.fromMasterSeed(seed);
|
|
99
96
|
const derivedKey = hdKey.derive(this._config.primaryKeyDerivationPath);
|
|
100
97
|
if (!derivedKey.privateKey) {
|
|
101
|
-
const engine =
|
|
102
|
-
throw new Error(engine.translate(
|
|
98
|
+
const engine = getEciesI18nEngine();
|
|
99
|
+
throw new Error(engine.translate(EciesComponentId, EciesStringKey.Error_ECIESError_FailedToDervivePrivateKey));
|
|
103
100
|
}
|
|
104
101
|
const privateKey = derivedKey.privateKey;
|
|
105
|
-
const publicKey =
|
|
102
|
+
const publicKey = secp256k1.getPublicKey(privateKey, false); // uncompressed with 0x04 prefix
|
|
106
103
|
return {
|
|
107
104
|
privateKey,
|
|
108
105
|
publicKey,
|
|
@@ -119,13 +116,13 @@ class EciesCryptoCore {
|
|
|
119
116
|
* Generate a random private key
|
|
120
117
|
*/
|
|
121
118
|
generatePrivateKey() {
|
|
122
|
-
return
|
|
119
|
+
return secp256k1.utils.randomSecretKey();
|
|
123
120
|
}
|
|
124
121
|
/**
|
|
125
122
|
* Get public key from private key
|
|
126
123
|
*/
|
|
127
124
|
getPublicKey(privateKey) {
|
|
128
|
-
const publicKeyPoint =
|
|
125
|
+
const publicKeyPoint = secp256k1.getPublicKey(privateKey, false); // uncompressed
|
|
129
126
|
// publicKeyPoint already includes the 0x04 prefix, so return as-is
|
|
130
127
|
return publicKeyPoint;
|
|
131
128
|
}
|
|
@@ -145,10 +142,9 @@ class EciesCryptoCore {
|
|
|
145
142
|
const normalizedPublicKey = this.normalizePublicKey(publicKey);
|
|
146
143
|
// Use uncompressed shared secret to match Node.js ECDH behavior
|
|
147
144
|
// Node.js ECDH.computeSecret() returns the x-coordinate of the shared point
|
|
148
|
-
const sharedSecret =
|
|
145
|
+
const sharedSecret = secp256k1.getSharedSecret(privateKey, normalizedPublicKey, false);
|
|
149
146
|
// Return only the x-coordinate (first 32 bytes after the 0x04 prefix)
|
|
150
147
|
return sharedSecret.slice(1, 33);
|
|
151
148
|
}
|
|
152
149
|
}
|
|
153
|
-
exports.EciesCryptoCore = EciesCryptoCore;
|
|
154
150
|
//# sourceMappingURL=crypto-core.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crypto-core.js","sourceRoot":"","sources":["../../../../../../packages/digitaldefiance-ecies-lib/src/services/ecies/crypto-core.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"crypto-core.js","sourceRoot":"","sources":["../../../../../../packages/digitaldefiance-ecies-lib/src/services/ecies/crypto-core.ts"],"names":[],"mappings":"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"}
|