internxt-crypto 0.0.10-alpha → 0.0.11
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 +3 -4
- package/dist/asymmetric-crypto-BORmLhnx.js +143 -0
- package/dist/asymmetric-crypto-BORmLhnx.js.map +1 -0
- package/dist/asymmetric-crypto-CyXsV4XT.mjs +102 -0
- package/dist/asymmetric-crypto-CyXsV4XT.mjs.map +1 -0
- package/dist/asymmetric-crypto.d.mts +9 -3
- package/dist/asymmetric-crypto.d.ts +9 -3
- package/dist/asymmetric-crypto.js +8 -92
- package/dist/asymmetric-crypto.mjs +2 -84
- package/dist/chunk-DWirmd9C.mjs +18 -0
- package/dist/chunk-Dt-PWiN7.js +60 -0
- package/dist/constants-Ccp21E03.js +208 -0
- package/dist/constants-Ccp21E03.js.map +1 -0
- package/dist/constants-kTeX-2T0.mjs +34 -0
- package/dist/constants-kTeX-2T0.mjs.map +1 -0
- package/dist/constants.d.mts +5 -11
- package/dist/constants.d.ts +5 -11
- package/dist/constants.js +30 -79
- package/dist/constants.mjs +2 -41
- package/dist/derive-key-Be7hS-cN.mjs +751 -0
- package/dist/derive-key-Be7hS-cN.mjs.map +1 -0
- package/dist/derive-key-CBf2WxJd.js +2513 -0
- package/dist/derive-key-CBf2WxJd.js.map +1 -0
- package/dist/derive-key.d.mts +14 -8
- package/dist/derive-key.d.ts +14 -8
- package/dist/derive-key.js +15 -795
- package/dist/derive-key.mjs +5 -783
- package/dist/email-crypto-BrT98taw.js +617 -0
- package/dist/email-crypto-BrT98taw.js.map +1 -0
- package/dist/email-crypto-DJUEjTxA.mjs +534 -0
- package/dist/email-crypto-DJUEjTxA.mjs.map +1 -0
- package/dist/email-crypto.d.mts +58 -78
- package/dist/email-crypto.d.ts +58 -78
- package/dist/email-crypto.js +17 -1409
- package/dist/email-crypto.mjs +8 -1381
- package/dist/email-search.d.mts +39 -32
- package/dist/email-search.d.ts +39 -32
- package/dist/email-search.js +572 -540
- package/dist/email-search.js.map +1 -1
- package/dist/email-search.mjs +567 -539
- package/dist/email-search.mjs.map +1 -1
- package/dist/hash-BoqwNkcd.js +190 -0
- package/dist/hash-BoqwNkcd.js.map +1 -0
- package/dist/hash-CXeGAwai.mjs +131 -0
- package/dist/hash-CXeGAwai.mjs.map +1 -0
- package/dist/hash.d.mts +21 -15
- package/dist/hash.d.ts +21 -15
- package/dist/hash.js +11 -95
- package/dist/hash.mjs +2 -84
- package/dist/index-CQqgKsbX.d.ts +50 -0
- package/dist/index-CintVUbp.d.ts +97 -0
- package/dist/index-D5pBU_A5.d.mts +50 -0
- package/dist/index-MaOov-ag.d.mts +97 -0
- package/dist/index.d.mts +35 -18
- package/dist/index.d.ts +35 -18
- package/dist/index.js +103 -2685
- package/dist/index.mjs +15 -2538
- package/dist/keystore-crypto-B4yCVo9l.js +182 -0
- package/dist/keystore-crypto-B4yCVo9l.js.map +1 -0
- package/dist/keystore-crypto-Bjgriq9h.mjs +159 -0
- package/dist/keystore-crypto-Bjgriq9h.mjs.map +1 -0
- package/dist/keystore-crypto.d.mts +20 -46
- package/dist/keystore-crypto.d.ts +20 -46
- package/dist/keystore-crypto.js +11 -530
- package/dist/keystore-crypto.mjs +9 -501
- package/dist/keystore-service.d.mts +44 -78
- package/dist/keystore-service.d.ts +44 -78
- package/dist/keystore-service.js +113 -340
- package/dist/keystore-service.js.map +1 -1
- package/dist/keystore-service.mjs +107 -335
- package/dist/keystore-service.mjs.map +1 -1
- package/dist/post-quantum-crypto-CAi-cEkV.js +189 -0
- package/dist/post-quantum-crypto-CAi-cEkV.js.map +1 -0
- package/dist/post-quantum-crypto-Vv34t6gX.mjs +154 -0
- package/dist/post-quantum-crypto-Vv34t6gX.mjs.map +1 -0
- package/dist/post-quantum-crypto.d.mts +2 -72
- package/dist/post-quantum-crypto.d.ts +2 -72
- package/dist/post-quantum-crypto.js +13 -92
- package/dist/post-quantum-crypto.mjs +2 -89
- package/dist/storage-service-BgIK2aYZ.js +82 -0
- package/dist/storage-service-BgIK2aYZ.js.map +1 -0
- package/dist/storage-service-CubCbhY2.mjs +65 -0
- package/dist/storage-service-CubCbhY2.mjs.map +1 -0
- package/dist/storage-service.d.mts +2 -53
- package/dist/storage-service.d.ts +2 -53
- package/dist/storage-service.js +12 -68
- package/dist/storage-service.mjs +2 -66
- package/dist/symmetric-crypto-CrdS1Che.mjs +197 -0
- package/dist/symmetric-crypto-CrdS1Che.mjs.map +1 -0
- package/dist/symmetric-crypto-D65zB396.js +244 -0
- package/dist/symmetric-crypto-D65zB396.js.map +1 -0
- package/dist/symmetric-crypto.d.mts +12 -8
- package/dist/symmetric-crypto.d.ts +12 -8
- package/dist/symmetric-crypto.js +10 -142
- package/dist/symmetric-crypto.mjs +3 -133
- package/dist/types-52g887Zi.js +16 -0
- package/dist/types-52g887Zi.js.map +1 -0
- package/dist/types-BiEoleqw.mjs +10 -0
- package/dist/types-BiEoleqw.mjs.map +1 -0
- package/dist/types-Ds3ivE9W.d.ts +104 -0
- package/dist/types-DwQJtrTx.d.mts +104 -0
- package/dist/types.d.mts +2 -102
- package/dist/types.d.ts +2 -102
- package/dist/types.js +2 -13
- package/dist/types.mjs +2 -11
- package/dist/utils-CNs3cyDj.js +263 -0
- package/dist/utils-CNs3cyDj.js.map +1 -0
- package/dist/utils-DS04iUcX.mjs +173 -0
- package/dist/utils-DS04iUcX.mjs.map +1 -0
- package/dist/utils.d.mts +37 -78
- package/dist/utils.d.ts +37 -78
- package/dist/utils.js +16 -313
- package/dist/utils.mjs +2 -272
- package/package.json +15 -90
- package/dist/asymmetric-crypto.js.map +0 -1
- package/dist/asymmetric-crypto.mjs.map +0 -1
- package/dist/constants.js.map +0 -1
- package/dist/constants.mjs.map +0 -1
- package/dist/derive-key.js.map +0 -1
- package/dist/derive-key.mjs.map +0 -1
- package/dist/email-crypto.js.map +0 -1
- package/dist/email-crypto.mjs.map +0 -1
- package/dist/email-service.d.mts +0 -38
- package/dist/email-service.d.ts +0 -38
- package/dist/email-service.js +0 -154
- package/dist/email-service.js.map +0 -1
- package/dist/email-service.mjs +0 -147
- package/dist/email-service.mjs.map +0 -1
- package/dist/hash.js.map +0 -1
- package/dist/hash.mjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/index.mjs.map +0 -1
- package/dist/keystore-crypto.js.map +0 -1
- package/dist/keystore-crypto.mjs.map +0 -1
- package/dist/kyber768-B87rMQ7u.d.mts +0 -30
- package/dist/kyber768-B87rMQ7u.d.ts +0 -30
- package/dist/post-quantum-crypto.js.map +0 -1
- package/dist/post-quantum-crypto.mjs.map +0 -1
- package/dist/storage-service.js.map +0 -1
- package/dist/storage-service.mjs.map +0 -1
- package/dist/symmetric-crypto.js.map +0 -1
- package/dist/symmetric-crypto.mjs.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/types.mjs.map +0 -1
- package/dist/utils-BDaK_d6T.d.ts +0 -114
- package/dist/utils-v34IRTIx.d.mts +0 -114
- package/dist/utils.js.map +0 -1
- package/dist/utils.mjs.map +0 -1
package/dist/email-crypto.mjs
CHANGED
|
@@ -1,1381 +1,8 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
var AES_KEY_BIT_LENGTH = 256;
|
|
10
|
-
var AUX_LEN = 128;
|
|
11
|
-
var IV_LEN_BYTES = 16;
|
|
12
|
-
var KEY_WRAPPING_ALGORITHM = "AES-KW";
|
|
13
|
-
var KEY_FORMAT = "raw";
|
|
14
|
-
var CONTEXT_WRAPPING = "CRYPTO library 2025-08-22 18:10:00 key derived from ecc and kyber secrets";
|
|
15
|
-
var ECC_ALGORITHM = "X25519";
|
|
16
|
-
var ARGON2ID_PARALLELISM = 3;
|
|
17
|
-
var ARGON2ID_ITERATIONS = 4;
|
|
18
|
-
var ARGON2ID_MEMORY_SIZE = 65536;
|
|
19
|
-
var ARGON2ID_SALT_BYTE_LENGTH = 16;
|
|
20
|
-
var ARGON2ID_OUTPUT_BYTE_LENGTH = 32;
|
|
21
|
-
function getBytesFromString(bytes, value) {
|
|
22
|
-
return blake3(utf8ToBytes(value), { dkLen: bytes });
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
// src/symmetric-crypto/keys.ts
|
|
26
|
-
async function genSymmetricCryptoKey() {
|
|
27
|
-
return crypto.subtle.generateKey(
|
|
28
|
-
{
|
|
29
|
-
name: AES_ALGORITHM,
|
|
30
|
-
length: AES_KEY_BIT_LENGTH
|
|
31
|
-
},
|
|
32
|
-
true,
|
|
33
|
-
["encrypt", "decrypt"]
|
|
34
|
-
);
|
|
35
|
-
}
|
|
36
|
-
async function createNISTbasedIV(freeField) {
|
|
37
|
-
try {
|
|
38
|
-
if (!freeField) {
|
|
39
|
-
return randomBytes(IV_LEN_BYTES);
|
|
40
|
-
}
|
|
41
|
-
const iv = new Uint8Array(16);
|
|
42
|
-
const randFiled = randomBytes(12);
|
|
43
|
-
iv.set(randFiled, 0);
|
|
44
|
-
const freeFiledFixedLength = await getBytesFromString(4, freeField);
|
|
45
|
-
iv.set(freeFiledFixedLength, 12);
|
|
46
|
-
return iv;
|
|
47
|
-
} catch (error) {
|
|
48
|
-
throw new Error("Failed to create IV", { cause: error });
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
async function makeAuxFixedLength(aux) {
|
|
52
|
-
return getBytesFromString(AUX_LEN / 8, aux);
|
|
53
|
-
}
|
|
54
|
-
async function encryptMessage(message, encryptionKey, iv, additionalData) {
|
|
55
|
-
try {
|
|
56
|
-
const encrypted = await crypto.subtle.encrypt(
|
|
57
|
-
{ name: AES_ALGORITHM, iv, additionalData },
|
|
58
|
-
encryptionKey,
|
|
59
|
-
message
|
|
60
|
-
);
|
|
61
|
-
return new Uint8Array(encrypted);
|
|
62
|
-
} catch (error) {
|
|
63
|
-
throw new Error("Failed to encrypt symmetrically", { cause: error });
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
async function decryptMessage(ciphertext, iv, encryptionKey, additionalData) {
|
|
67
|
-
try {
|
|
68
|
-
const decrypted = await crypto.subtle.decrypt(
|
|
69
|
-
{ name: AES_ALGORITHM, iv, additionalData },
|
|
70
|
-
encryptionKey,
|
|
71
|
-
ciphertext
|
|
72
|
-
);
|
|
73
|
-
return new Uint8Array(decrypted);
|
|
74
|
-
} catch (error) {
|
|
75
|
-
throw new Error("Failed to decrypt symmetrically", { cause: error });
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
// src/symmetric-crypto/aes.ts
|
|
80
|
-
async function encryptSymmetrically(encryptionKey, message, aux, freeField) {
|
|
81
|
-
try {
|
|
82
|
-
const iv = await createNISTbasedIV(freeField);
|
|
83
|
-
const additionalData = await makeAuxFixedLength(aux);
|
|
84
|
-
const ciphertext = await encryptMessage(message, encryptionKey, iv, additionalData);
|
|
85
|
-
return { ciphertext, iv };
|
|
86
|
-
} catch (error) {
|
|
87
|
-
throw new Error("Failed to encrypt symmetrically", { cause: error });
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
async function decryptSymmetrically(encryptionKey, encryptedMessage, aux) {
|
|
91
|
-
try {
|
|
92
|
-
const additionalData = await makeAuxFixedLength(aux);
|
|
93
|
-
const result = await decryptMessage(
|
|
94
|
-
encryptedMessage.ciphertext,
|
|
95
|
-
encryptedMessage.iv,
|
|
96
|
-
encryptionKey,
|
|
97
|
-
additionalData
|
|
98
|
-
);
|
|
99
|
-
return result;
|
|
100
|
-
} catch (error) {
|
|
101
|
-
throw new Error("Failed to decrypt symmetrically", { cause: error });
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
function UTF8ToUint8(str) {
|
|
105
|
-
return new TextEncoder().encode(str);
|
|
106
|
-
}
|
|
107
|
-
function uint8ToUTF8(array) {
|
|
108
|
-
return new TextDecoder().decode(array);
|
|
109
|
-
}
|
|
110
|
-
function uint8ArrayToBase64(buffer) {
|
|
111
|
-
const array = Uint16Array.from(buffer);
|
|
112
|
-
const binaryString = new TextDecoder("UTF-16").decode(array);
|
|
113
|
-
return btoa(binaryString);
|
|
114
|
-
}
|
|
115
|
-
function base64ToUint8Array(str) {
|
|
116
|
-
const binaryString = atob(str);
|
|
117
|
-
const len = binaryString.length;
|
|
118
|
-
const array = new Uint8Array(len);
|
|
119
|
-
for (let i = 0; i < len; i++) {
|
|
120
|
-
array[i] = binaryString.charCodeAt(i);
|
|
121
|
-
}
|
|
122
|
-
return new Uint8Array(array.buffer);
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
// src/asymmetric-crypto/ellipticCurve.ts
|
|
126
|
-
async function deriveSecretKey(otherUserPublicKey, ownPrivateKey) {
|
|
127
|
-
try {
|
|
128
|
-
const result = await crypto.subtle.deriveBits(
|
|
129
|
-
{
|
|
130
|
-
name: ECC_ALGORITHM,
|
|
131
|
-
public: otherUserPublicKey
|
|
132
|
-
},
|
|
133
|
-
ownPrivateKey,
|
|
134
|
-
AES_KEY_BIT_LENGTH
|
|
135
|
-
);
|
|
136
|
-
return new Uint8Array(result);
|
|
137
|
-
} catch (error) {
|
|
138
|
-
throw new Error("Failed to derive elliptic curve secret key", { cause: error });
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
// src/asymmetric-crypto/keys.ts
|
|
143
|
-
async function generateEccKeys() {
|
|
144
|
-
try {
|
|
145
|
-
return await crypto.subtle.generateKey(
|
|
146
|
-
{
|
|
147
|
-
name: ECC_ALGORITHM
|
|
148
|
-
},
|
|
149
|
-
true,
|
|
150
|
-
["deriveBits"]
|
|
151
|
-
);
|
|
152
|
-
} catch (error) {
|
|
153
|
-
throw new Error("Failed to generate elliptic curve key pair", { cause: error });
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
// src/utils/aesConverters.ts
|
|
158
|
-
function ciphertextToBase64(encryptedMessage) {
|
|
159
|
-
try {
|
|
160
|
-
const ivBase64 = uint8ArrayToBase64(encryptedMessage.iv);
|
|
161
|
-
const ciphertextBase64 = uint8ArrayToBase64(encryptedMessage.ciphertext);
|
|
162
|
-
const json = JSON.stringify({ ciphertext: ciphertextBase64, iv: ivBase64 });
|
|
163
|
-
const base64 = btoa(json);
|
|
164
|
-
return base64;
|
|
165
|
-
} catch (error) {
|
|
166
|
-
throw new Error("Failed to convert ciphertext to base64", { cause: error });
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
function base64ToCiphertext(base64) {
|
|
170
|
-
try {
|
|
171
|
-
const json = atob(base64);
|
|
172
|
-
const obj = JSON.parse(json);
|
|
173
|
-
const iv = base64ToUint8Array(obj.iv);
|
|
174
|
-
const ciphertext = base64ToUint8Array(obj.ciphertext);
|
|
175
|
-
const result = {
|
|
176
|
-
ciphertext,
|
|
177
|
-
iv
|
|
178
|
-
};
|
|
179
|
-
return result;
|
|
180
|
-
} catch (error) {
|
|
181
|
-
throw new Error("Failed to convert base64 to ciphertext", { cause: error });
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
// src/email-crypto/converters.ts
|
|
186
|
-
function userToBase64(user) {
|
|
187
|
-
try {
|
|
188
|
-
const json = JSON.stringify(user);
|
|
189
|
-
return btoa(json);
|
|
190
|
-
} catch (error) {
|
|
191
|
-
throw new Error("Failed to convert User to base64", { cause: error });
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
function base64ToUser(base64) {
|
|
195
|
-
try {
|
|
196
|
-
const json = atob(base64);
|
|
197
|
-
const user = JSON.parse(json);
|
|
198
|
-
return user;
|
|
199
|
-
} catch (error) {
|
|
200
|
-
throw new Error("Failed to convert base64 to User", { cause: error });
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
function emailBodyToBinary(body) {
|
|
204
|
-
try {
|
|
205
|
-
const json = JSON.stringify(body);
|
|
206
|
-
return UTF8ToUint8(json);
|
|
207
|
-
} catch (error) {
|
|
208
|
-
throw new Error("Failed to convert EmailBody to Uint8Array", { cause: error });
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
function binaryToEmailBody(array) {
|
|
212
|
-
try {
|
|
213
|
-
const json = uint8ToUTF8(array);
|
|
214
|
-
const email = JSON.parse(json);
|
|
215
|
-
return email;
|
|
216
|
-
} catch (error) {
|
|
217
|
-
throw new Error("Failed to convert Uint8Array to EmailBody", { cause: error });
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
function encHybridKeyToBase64(encHybridKey) {
|
|
221
|
-
try {
|
|
222
|
-
const json = JSON.stringify({
|
|
223
|
-
kyberCiphertext: uint8ArrayToBase64(encHybridKey.kyberCiphertext),
|
|
224
|
-
encryptedKey: uint8ArrayToBase64(encHybridKey.encryptedKey)
|
|
225
|
-
});
|
|
226
|
-
const base64 = btoa(json);
|
|
227
|
-
return base64;
|
|
228
|
-
} catch (error) {
|
|
229
|
-
throw new Error("Failed to convert hybrid key to base64", { cause: error });
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
function base64ToEncHybridKey(base64) {
|
|
233
|
-
try {
|
|
234
|
-
const json = atob(base64);
|
|
235
|
-
const obj = JSON.parse(json);
|
|
236
|
-
return {
|
|
237
|
-
encryptedKey: base64ToUint8Array(obj.encryptedKey),
|
|
238
|
-
kyberCiphertext: base64ToUint8Array(obj.kyberCiphertext)
|
|
239
|
-
};
|
|
240
|
-
} catch (error) {
|
|
241
|
-
throw new Error("Failed to convert base64 to hybrid key", { cause: error });
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
function pwdProtectedKeyToBase64(pwdProtectedKey) {
|
|
245
|
-
try {
|
|
246
|
-
const json = JSON.stringify({
|
|
247
|
-
encryptedKey: uint8ArrayToBase64(pwdProtectedKey.encryptedKey),
|
|
248
|
-
salt: uint8ArrayToBase64(pwdProtectedKey.salt)
|
|
249
|
-
});
|
|
250
|
-
const base64 = btoa(json);
|
|
251
|
-
return base64;
|
|
252
|
-
} catch (error) {
|
|
253
|
-
throw new Error("Failed to convert password-protected key to base64", { cause: error });
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
function base64ToPwdProtectedKey(base64) {
|
|
257
|
-
try {
|
|
258
|
-
const json = atob(base64);
|
|
259
|
-
const obj = JSON.parse(json);
|
|
260
|
-
return {
|
|
261
|
-
encryptedKey: base64ToUint8Array(obj.encryptedKey),
|
|
262
|
-
salt: base64ToUint8Array(obj.salt)
|
|
263
|
-
};
|
|
264
|
-
} catch (error) {
|
|
265
|
-
throw new Error("Failed to convert base64 to password-protected key", { cause: error });
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
function paramsToBase64(params) {
|
|
269
|
-
try {
|
|
270
|
-
const json = JSON.stringify({
|
|
271
|
-
...params,
|
|
272
|
-
sender: userToBase64(params.sender),
|
|
273
|
-
recipient: userToBase64(params.recipient),
|
|
274
|
-
recipients: params.recipients?.map(userToBase64)
|
|
275
|
-
});
|
|
276
|
-
const base64 = btoa(json);
|
|
277
|
-
return base64;
|
|
278
|
-
} catch (error) {
|
|
279
|
-
throw new Error("Failed to convert email public parameters to base64", { cause: error });
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
function base64ToParams(base64) {
|
|
283
|
-
try {
|
|
284
|
-
const json = atob(base64);
|
|
285
|
-
const obj = JSON.parse(json);
|
|
286
|
-
return {
|
|
287
|
-
...obj,
|
|
288
|
-
sender: base64ToUser(obj.sender),
|
|
289
|
-
recipient: base64ToUser(obj.recipient),
|
|
290
|
-
recipients: obj.recipients?.map(base64ToUser)
|
|
291
|
-
};
|
|
292
|
-
} catch (error) {
|
|
293
|
-
throw new Error("Failed to convert base64 to email params", { cause: error });
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
function hybridEncyptedEmailToBase64(email) {
|
|
297
|
-
try {
|
|
298
|
-
const json = JSON.stringify({
|
|
299
|
-
encryptedKey: encHybridKeyToBase64(email.encryptedKey),
|
|
300
|
-
enc: ciphertextToBase64(email.enc),
|
|
301
|
-
recipientEmail: email.recipientEmail
|
|
302
|
-
});
|
|
303
|
-
const base64 = btoa(json);
|
|
304
|
-
return base64;
|
|
305
|
-
} catch (error) {
|
|
306
|
-
throw new Error("Failed to convert hybrid email to base64", { cause: error });
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
function pwdProtectedEmailToBase64(email) {
|
|
310
|
-
try {
|
|
311
|
-
const json = JSON.stringify({
|
|
312
|
-
encryptedKey: pwdProtectedKeyToBase64(email.encryptedKey),
|
|
313
|
-
enc: ciphertextToBase64(email.enc)
|
|
314
|
-
});
|
|
315
|
-
const base64 = btoa(json);
|
|
316
|
-
return base64;
|
|
317
|
-
} catch (error) {
|
|
318
|
-
throw new Error("Failed to convert pwd protected email to base64", { cause: error });
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
function emailToBinary(email) {
|
|
322
|
-
try {
|
|
323
|
-
const json = JSON.stringify(email);
|
|
324
|
-
return UTF8ToUint8(json);
|
|
325
|
-
} catch (error) {
|
|
326
|
-
throw new Error("Failed to convert EmailBody to Uint8Array", { cause: error });
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
function generateKyberKeys(seed) {
|
|
330
|
-
try {
|
|
331
|
-
return ml_kem768.keygen(seed);
|
|
332
|
-
} catch (error) {
|
|
333
|
-
throw new Error("Failed to generate Kyber keys", { cause: error });
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
function encapsulateKyber(publicKey) {
|
|
337
|
-
try {
|
|
338
|
-
return ml_kem768.encapsulate(publicKey);
|
|
339
|
-
} catch (error) {
|
|
340
|
-
throw new Error("Failed to encapsulate", { cause: error });
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
function decapsulateKyber(cipherText, secretKey) {
|
|
344
|
-
try {
|
|
345
|
-
return ml_kem768.decapsulate(cipherText, secretKey);
|
|
346
|
-
} catch (error) {
|
|
347
|
-
throw new Error("Failed to decapsulate", { cause: error });
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
function deriveKeyFromTwoKeysAndContext(key1, key2, context) {
|
|
351
|
-
try {
|
|
352
|
-
if (key2.length != AES_KEY_BIT_LENGTH / 8 || key1.length != AES_KEY_BIT_LENGTH / 8) {
|
|
353
|
-
throw new Error(`Input key length must be exactly ${AES_KEY_BIT_LENGTH / 8} bytes`);
|
|
354
|
-
}
|
|
355
|
-
const key = blake3(key1, { key: key2 });
|
|
356
|
-
return blake3(key, { context: UTF8ToUint8(context) });
|
|
357
|
-
} catch (error) {
|
|
358
|
-
throw new Error("Failed to derive symmetric key from two keys and context", { cause: error });
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
// node_modules/hash-wasm/dist/index.esm.js
|
|
363
|
-
function __awaiter(thisArg, _arguments, P, generator) {
|
|
364
|
-
function adopt(value) {
|
|
365
|
-
return value instanceof P ? value : new P(function(resolve) {
|
|
366
|
-
resolve(value);
|
|
367
|
-
});
|
|
368
|
-
}
|
|
369
|
-
return new (P || (P = Promise))(function(resolve, reject) {
|
|
370
|
-
function fulfilled(value) {
|
|
371
|
-
try {
|
|
372
|
-
step(generator.next(value));
|
|
373
|
-
} catch (e) {
|
|
374
|
-
reject(e);
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
function rejected(value) {
|
|
378
|
-
try {
|
|
379
|
-
step(generator["throw"](value));
|
|
380
|
-
} catch (e) {
|
|
381
|
-
reject(e);
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
function step(result) {
|
|
385
|
-
result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
|
|
386
|
-
}
|
|
387
|
-
step((generator = generator.apply(thisArg, [])).next());
|
|
388
|
-
});
|
|
389
|
-
}
|
|
390
|
-
var Mutex = class {
|
|
391
|
-
constructor() {
|
|
392
|
-
this.mutex = Promise.resolve();
|
|
393
|
-
}
|
|
394
|
-
lock() {
|
|
395
|
-
let begin = () => {
|
|
396
|
-
};
|
|
397
|
-
this.mutex = this.mutex.then(() => new Promise(begin));
|
|
398
|
-
return new Promise((res) => {
|
|
399
|
-
begin = res;
|
|
400
|
-
});
|
|
401
|
-
}
|
|
402
|
-
dispatch(fn) {
|
|
403
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
404
|
-
const unlock = yield this.lock();
|
|
405
|
-
try {
|
|
406
|
-
return yield Promise.resolve(fn());
|
|
407
|
-
} finally {
|
|
408
|
-
unlock();
|
|
409
|
-
}
|
|
410
|
-
});
|
|
411
|
-
}
|
|
412
|
-
};
|
|
413
|
-
var _a;
|
|
414
|
-
function getGlobal() {
|
|
415
|
-
if (typeof globalThis !== "undefined")
|
|
416
|
-
return globalThis;
|
|
417
|
-
if (typeof self !== "undefined")
|
|
418
|
-
return self;
|
|
419
|
-
if (typeof window !== "undefined")
|
|
420
|
-
return window;
|
|
421
|
-
return global;
|
|
422
|
-
}
|
|
423
|
-
var globalObject = getGlobal();
|
|
424
|
-
var nodeBuffer = (_a = globalObject.Buffer) !== null && _a !== void 0 ? _a : null;
|
|
425
|
-
var textEncoder = globalObject.TextEncoder ? new globalObject.TextEncoder() : null;
|
|
426
|
-
function hexCharCodesToInt(a, b) {
|
|
427
|
-
return (a & 15) + (a >> 6 | a >> 3 & 8) << 4 | (b & 15) + (b >> 6 | b >> 3 & 8);
|
|
428
|
-
}
|
|
429
|
-
function writeHexToUInt8(buf, str) {
|
|
430
|
-
const size = str.length >> 1;
|
|
431
|
-
for (let i = 0; i < size; i++) {
|
|
432
|
-
const index = i << 1;
|
|
433
|
-
buf[i] = hexCharCodesToInt(str.charCodeAt(index), str.charCodeAt(index + 1));
|
|
434
|
-
}
|
|
435
|
-
}
|
|
436
|
-
function hexStringEqualsUInt8(str, buf) {
|
|
437
|
-
if (str.length !== buf.length * 2) {
|
|
438
|
-
return false;
|
|
439
|
-
}
|
|
440
|
-
for (let i = 0; i < buf.length; i++) {
|
|
441
|
-
const strIndex = i << 1;
|
|
442
|
-
if (buf[i] !== hexCharCodesToInt(str.charCodeAt(strIndex), str.charCodeAt(strIndex + 1))) {
|
|
443
|
-
return false;
|
|
444
|
-
}
|
|
445
|
-
}
|
|
446
|
-
return true;
|
|
447
|
-
}
|
|
448
|
-
var alpha = "a".charCodeAt(0) - 10;
|
|
449
|
-
var digit = "0".charCodeAt(0);
|
|
450
|
-
function getDigestHex(tmpBuffer, input, hashLength) {
|
|
451
|
-
let p = 0;
|
|
452
|
-
for (let i = 0; i < hashLength; i++) {
|
|
453
|
-
let nibble = input[i] >>> 4;
|
|
454
|
-
tmpBuffer[p++] = nibble > 9 ? nibble + alpha : nibble + digit;
|
|
455
|
-
nibble = input[i] & 15;
|
|
456
|
-
tmpBuffer[p++] = nibble > 9 ? nibble + alpha : nibble + digit;
|
|
457
|
-
}
|
|
458
|
-
return String.fromCharCode.apply(null, tmpBuffer);
|
|
459
|
-
}
|
|
460
|
-
var getUInt8Buffer = nodeBuffer !== null ? (data) => {
|
|
461
|
-
if (typeof data === "string") {
|
|
462
|
-
const buf = nodeBuffer.from(data, "utf8");
|
|
463
|
-
return new Uint8Array(buf.buffer, buf.byteOffset, buf.length);
|
|
464
|
-
}
|
|
465
|
-
if (nodeBuffer.isBuffer(data)) {
|
|
466
|
-
return new Uint8Array(data.buffer, data.byteOffset, data.length);
|
|
467
|
-
}
|
|
468
|
-
if (ArrayBuffer.isView(data)) {
|
|
469
|
-
return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
|
|
470
|
-
}
|
|
471
|
-
throw new Error("Invalid data type!");
|
|
472
|
-
} : (data) => {
|
|
473
|
-
if (typeof data === "string") {
|
|
474
|
-
return textEncoder.encode(data);
|
|
475
|
-
}
|
|
476
|
-
if (ArrayBuffer.isView(data)) {
|
|
477
|
-
return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
|
|
478
|
-
}
|
|
479
|
-
throw new Error("Invalid data type!");
|
|
480
|
-
};
|
|
481
|
-
var base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
482
|
-
var base64Lookup = new Uint8Array(256);
|
|
483
|
-
for (let i = 0; i < base64Chars.length; i++) {
|
|
484
|
-
base64Lookup[base64Chars.charCodeAt(i)] = i;
|
|
485
|
-
}
|
|
486
|
-
function encodeBase64(data, pad = true) {
|
|
487
|
-
const len = data.length;
|
|
488
|
-
const extraBytes = len % 3;
|
|
489
|
-
const parts = [];
|
|
490
|
-
const len2 = len - extraBytes;
|
|
491
|
-
for (let i = 0; i < len2; i += 3) {
|
|
492
|
-
const tmp = (data[i] << 16 & 16711680) + (data[i + 1] << 8 & 65280) + (data[i + 2] & 255);
|
|
493
|
-
const triplet = base64Chars.charAt(tmp >> 18 & 63) + base64Chars.charAt(tmp >> 12 & 63) + base64Chars.charAt(tmp >> 6 & 63) + base64Chars.charAt(tmp & 63);
|
|
494
|
-
parts.push(triplet);
|
|
495
|
-
}
|
|
496
|
-
if (extraBytes === 1) {
|
|
497
|
-
const tmp = data[len - 1];
|
|
498
|
-
const a = base64Chars.charAt(tmp >> 2);
|
|
499
|
-
const b = base64Chars.charAt(tmp << 4 & 63);
|
|
500
|
-
parts.push(`${a}${b}`);
|
|
501
|
-
if (pad) {
|
|
502
|
-
parts.push("==");
|
|
503
|
-
}
|
|
504
|
-
} else if (extraBytes === 2) {
|
|
505
|
-
const tmp = (data[len - 2] << 8) + data[len - 1];
|
|
506
|
-
const a = base64Chars.charAt(tmp >> 10);
|
|
507
|
-
const b = base64Chars.charAt(tmp >> 4 & 63);
|
|
508
|
-
const c = base64Chars.charAt(tmp << 2 & 63);
|
|
509
|
-
parts.push(`${a}${b}${c}`);
|
|
510
|
-
if (pad) {
|
|
511
|
-
parts.push("=");
|
|
512
|
-
}
|
|
513
|
-
}
|
|
514
|
-
return parts.join("");
|
|
515
|
-
}
|
|
516
|
-
function getDecodeBase64Length(data) {
|
|
517
|
-
let bufferLength = Math.floor(data.length * 0.75);
|
|
518
|
-
const len = data.length;
|
|
519
|
-
if (data[len - 1] === "=") {
|
|
520
|
-
bufferLength -= 1;
|
|
521
|
-
if (data[len - 2] === "=") {
|
|
522
|
-
bufferLength -= 1;
|
|
523
|
-
}
|
|
524
|
-
}
|
|
525
|
-
return bufferLength;
|
|
526
|
-
}
|
|
527
|
-
function decodeBase64(data) {
|
|
528
|
-
const bufferLength = getDecodeBase64Length(data);
|
|
529
|
-
const len = data.length;
|
|
530
|
-
const bytes = new Uint8Array(bufferLength);
|
|
531
|
-
let p = 0;
|
|
532
|
-
for (let i = 0; i < len; i += 4) {
|
|
533
|
-
const encoded1 = base64Lookup[data.charCodeAt(i)];
|
|
534
|
-
const encoded2 = base64Lookup[data.charCodeAt(i + 1)];
|
|
535
|
-
const encoded3 = base64Lookup[data.charCodeAt(i + 2)];
|
|
536
|
-
const encoded4 = base64Lookup[data.charCodeAt(i + 3)];
|
|
537
|
-
bytes[p] = encoded1 << 2 | encoded2 >> 4;
|
|
538
|
-
p += 1;
|
|
539
|
-
bytes[p] = (encoded2 & 15) << 4 | encoded3 >> 2;
|
|
540
|
-
p += 1;
|
|
541
|
-
bytes[p] = (encoded3 & 3) << 6 | encoded4 & 63;
|
|
542
|
-
p += 1;
|
|
543
|
-
}
|
|
544
|
-
return bytes;
|
|
545
|
-
}
|
|
546
|
-
var MAX_HEAP = 16 * 1024;
|
|
547
|
-
var WASM_FUNC_HASH_LENGTH = 4;
|
|
548
|
-
var wasmMutex = new Mutex();
|
|
549
|
-
var wasmModuleCache = /* @__PURE__ */ new Map();
|
|
550
|
-
function WASMInterface(binary, hashLength) {
|
|
551
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
552
|
-
let wasmInstance = null;
|
|
553
|
-
let memoryView = null;
|
|
554
|
-
let initialized = false;
|
|
555
|
-
if (typeof WebAssembly === "undefined") {
|
|
556
|
-
throw new Error("WebAssembly is not supported in this environment!");
|
|
557
|
-
}
|
|
558
|
-
const writeMemory = (data, offset = 0) => {
|
|
559
|
-
memoryView.set(data, offset);
|
|
560
|
-
};
|
|
561
|
-
const getMemory = () => memoryView;
|
|
562
|
-
const getExports = () => wasmInstance.exports;
|
|
563
|
-
const setMemorySize = (totalSize) => {
|
|
564
|
-
wasmInstance.exports.Hash_SetMemorySize(totalSize);
|
|
565
|
-
const arrayOffset = wasmInstance.exports.Hash_GetBuffer();
|
|
566
|
-
const memoryBuffer = wasmInstance.exports.memory.buffer;
|
|
567
|
-
memoryView = new Uint8Array(memoryBuffer, arrayOffset, totalSize);
|
|
568
|
-
};
|
|
569
|
-
const getStateSize = () => {
|
|
570
|
-
const view = new DataView(wasmInstance.exports.memory.buffer);
|
|
571
|
-
const stateSize = view.getUint32(wasmInstance.exports.STATE_SIZE, true);
|
|
572
|
-
return stateSize;
|
|
573
|
-
};
|
|
574
|
-
const loadWASMPromise = wasmMutex.dispatch(() => __awaiter(this, void 0, void 0, function* () {
|
|
575
|
-
if (!wasmModuleCache.has(binary.name)) {
|
|
576
|
-
const asm = decodeBase64(binary.data);
|
|
577
|
-
const promise = WebAssembly.compile(asm);
|
|
578
|
-
wasmModuleCache.set(binary.name, promise);
|
|
579
|
-
}
|
|
580
|
-
const module = yield wasmModuleCache.get(binary.name);
|
|
581
|
-
wasmInstance = yield WebAssembly.instantiate(module, {
|
|
582
|
-
// env: {
|
|
583
|
-
// emscripten_memcpy_big: (dest, src, num) => {
|
|
584
|
-
// const memoryBuffer = wasmInstance.exports.memory.buffer;
|
|
585
|
-
// const memView = new Uint8Array(memoryBuffer, 0);
|
|
586
|
-
// memView.set(memView.subarray(src, src + num), dest);
|
|
587
|
-
// },
|
|
588
|
-
// print_memory: (offset, len) => {
|
|
589
|
-
// const memoryBuffer = wasmInstance.exports.memory.buffer;
|
|
590
|
-
// const memView = new Uint8Array(memoryBuffer, 0);
|
|
591
|
-
// console.log('print_int32', memView.subarray(offset, offset + len));
|
|
592
|
-
// },
|
|
593
|
-
// },
|
|
594
|
-
});
|
|
595
|
-
}));
|
|
596
|
-
const setupInterface = () => __awaiter(this, void 0, void 0, function* () {
|
|
597
|
-
if (!wasmInstance) {
|
|
598
|
-
yield loadWASMPromise;
|
|
599
|
-
}
|
|
600
|
-
const arrayOffset = wasmInstance.exports.Hash_GetBuffer();
|
|
601
|
-
const memoryBuffer = wasmInstance.exports.memory.buffer;
|
|
602
|
-
memoryView = new Uint8Array(memoryBuffer, arrayOffset, MAX_HEAP);
|
|
603
|
-
});
|
|
604
|
-
const init = (bits = null) => {
|
|
605
|
-
initialized = true;
|
|
606
|
-
wasmInstance.exports.Hash_Init(bits);
|
|
607
|
-
};
|
|
608
|
-
const updateUInt8Array = (data) => {
|
|
609
|
-
let read = 0;
|
|
610
|
-
while (read < data.length) {
|
|
611
|
-
const chunk = data.subarray(read, read + MAX_HEAP);
|
|
612
|
-
read += chunk.length;
|
|
613
|
-
memoryView.set(chunk);
|
|
614
|
-
wasmInstance.exports.Hash_Update(chunk.length);
|
|
615
|
-
}
|
|
616
|
-
};
|
|
617
|
-
const update = (data) => {
|
|
618
|
-
if (!initialized) {
|
|
619
|
-
throw new Error("update() called before init()");
|
|
620
|
-
}
|
|
621
|
-
const Uint8Buffer = getUInt8Buffer(data);
|
|
622
|
-
updateUInt8Array(Uint8Buffer);
|
|
623
|
-
};
|
|
624
|
-
const digestChars = new Uint8Array(hashLength * 2);
|
|
625
|
-
const digest = (outputType, padding = null) => {
|
|
626
|
-
if (!initialized) {
|
|
627
|
-
throw new Error("digest() called before init()");
|
|
628
|
-
}
|
|
629
|
-
initialized = false;
|
|
630
|
-
wasmInstance.exports.Hash_Final(padding);
|
|
631
|
-
if (outputType === "binary") {
|
|
632
|
-
return memoryView.slice(0, hashLength);
|
|
633
|
-
}
|
|
634
|
-
return getDigestHex(digestChars, memoryView, hashLength);
|
|
635
|
-
};
|
|
636
|
-
const save = () => {
|
|
637
|
-
if (!initialized) {
|
|
638
|
-
throw new Error("save() can only be called after init() and before digest()");
|
|
639
|
-
}
|
|
640
|
-
const stateOffset = wasmInstance.exports.Hash_GetState();
|
|
641
|
-
const stateLength = getStateSize();
|
|
642
|
-
const memoryBuffer = wasmInstance.exports.memory.buffer;
|
|
643
|
-
const internalState = new Uint8Array(memoryBuffer, stateOffset, stateLength);
|
|
644
|
-
const prefixedState = new Uint8Array(WASM_FUNC_HASH_LENGTH + stateLength);
|
|
645
|
-
writeHexToUInt8(prefixedState, binary.hash);
|
|
646
|
-
prefixedState.set(internalState, WASM_FUNC_HASH_LENGTH);
|
|
647
|
-
return prefixedState;
|
|
648
|
-
};
|
|
649
|
-
const load = (state) => {
|
|
650
|
-
if (!(state instanceof Uint8Array)) {
|
|
651
|
-
throw new Error("load() expects an Uint8Array generated by save()");
|
|
652
|
-
}
|
|
653
|
-
const stateOffset = wasmInstance.exports.Hash_GetState();
|
|
654
|
-
const stateLength = getStateSize();
|
|
655
|
-
const overallLength = WASM_FUNC_HASH_LENGTH + stateLength;
|
|
656
|
-
const memoryBuffer = wasmInstance.exports.memory.buffer;
|
|
657
|
-
if (state.length !== overallLength) {
|
|
658
|
-
throw new Error(`Bad state length (expected ${overallLength} bytes, got ${state.length})`);
|
|
659
|
-
}
|
|
660
|
-
if (!hexStringEqualsUInt8(binary.hash, state.subarray(0, WASM_FUNC_HASH_LENGTH))) {
|
|
661
|
-
throw new Error("This state was written by an incompatible hash implementation");
|
|
662
|
-
}
|
|
663
|
-
const internalState = state.subarray(WASM_FUNC_HASH_LENGTH);
|
|
664
|
-
new Uint8Array(memoryBuffer, stateOffset, stateLength).set(internalState);
|
|
665
|
-
initialized = true;
|
|
666
|
-
};
|
|
667
|
-
const isDataShort = (data) => {
|
|
668
|
-
if (typeof data === "string") {
|
|
669
|
-
return data.length < MAX_HEAP / 4;
|
|
670
|
-
}
|
|
671
|
-
return data.byteLength < MAX_HEAP;
|
|
672
|
-
};
|
|
673
|
-
let canSimplify = isDataShort;
|
|
674
|
-
switch (binary.name) {
|
|
675
|
-
case "argon2":
|
|
676
|
-
case "scrypt":
|
|
677
|
-
canSimplify = () => true;
|
|
678
|
-
break;
|
|
679
|
-
case "blake2b":
|
|
680
|
-
case "blake2s":
|
|
681
|
-
canSimplify = (data, initParam) => initParam <= 512 && isDataShort(data);
|
|
682
|
-
break;
|
|
683
|
-
case "blake3":
|
|
684
|
-
canSimplify = (data, initParam) => initParam === 0 && isDataShort(data);
|
|
685
|
-
break;
|
|
686
|
-
case "xxhash64":
|
|
687
|
-
// cannot simplify
|
|
688
|
-
case "xxhash3":
|
|
689
|
-
case "xxhash128":
|
|
690
|
-
case "crc64":
|
|
691
|
-
canSimplify = () => false;
|
|
692
|
-
break;
|
|
693
|
-
}
|
|
694
|
-
const calculate = (data, initParam = null, digestParam = null) => {
|
|
695
|
-
if (!canSimplify(data, initParam)) {
|
|
696
|
-
init(initParam);
|
|
697
|
-
update(data);
|
|
698
|
-
return digest("hex", digestParam);
|
|
699
|
-
}
|
|
700
|
-
const buffer = getUInt8Buffer(data);
|
|
701
|
-
memoryView.set(buffer);
|
|
702
|
-
wasmInstance.exports.Hash_Calculate(buffer.length, initParam, digestParam);
|
|
703
|
-
return getDigestHex(digestChars, memoryView, hashLength);
|
|
704
|
-
};
|
|
705
|
-
yield setupInterface();
|
|
706
|
-
return {
|
|
707
|
-
getMemory,
|
|
708
|
-
writeMemory,
|
|
709
|
-
getExports,
|
|
710
|
-
setMemorySize,
|
|
711
|
-
init,
|
|
712
|
-
update,
|
|
713
|
-
digest,
|
|
714
|
-
save,
|
|
715
|
-
load,
|
|
716
|
-
calculate,
|
|
717
|
-
hashLength
|
|
718
|
-
};
|
|
719
|
-
});
|
|
720
|
-
}
|
|
721
|
-
new Mutex();
|
|
722
|
-
var name$k = "argon2";
|
|
723
|
-
var data$k = "AGFzbQEAAAABKQVgAX8Bf2AAAX9gEH9/f39/f39/f39/f39/f38AYAR/f39/AGACf38AAwYFAAECAwQFBgEBAoCAAgYIAX8BQZCoBAsHQQQGbWVtb3J5AgASSGFzaF9TZXRNZW1vcnlTaXplAAAOSGFzaF9HZXRCdWZmZXIAAQ5IYXNoX0NhbGN1bGF0ZQAECvEyBVgBAn9BACEBAkAgAEEAKAKICCICRg0AAkAgACACayIAQRB2IABBgIB8cSAASWoiAEAAQX9HDQBB/wHADwtBACEBQQBBACkDiAggAEEQdK18NwOICAsgAcALcAECfwJAQQAoAoAIIgANAEEAPwBBEHQiADYCgAhBACgCiAgiAUGAgCBGDQACQEGAgCAgAWsiAEEQdiAAQYCAfHEgAElqIgBAAEF/Rw0AQQAPC0EAQQApA4gIIABBEHStfDcDiAhBACgCgAghAAsgAAvcDgECfiAAIAQpAwAiECAAKQMAIhF8IBFCAYZC/v///x+DIBBC/////w+DfnwiEDcDACAMIBAgDCkDAIVCIIkiEDcDACAIIBAgCCkDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgBCAQIAQpAwCFQiiJIhA3AwAgACAQIAApAwAiEXwgEEL/////D4MgEUIBhkL+////H4N+fCIQNwMAIAwgECAMKQMAhUIwiSIQNwMAIAggECAIKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACAEIBAgBCkDAIVCAYk3AwAgASAFKQMAIhAgASkDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgDSAQIA0pAwCFQiCJIhA3AwAgCSAQIAkpAwAiEXwgEUIBhkL+////H4MgEEL/////D4N+fCIQNwMAIAUgECAFKQMAhUIoiSIQNwMAIAEgECABKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACANIBAgDSkDAIVCMIkiEDcDACAJIBAgCSkDACIRfCAQQv////8PgyARQgGGQv7///8fg358IhA3AwAgBSAQIAUpAwCFQgGJNwMAIAIgBikDACIQIAIpAwAiEXwgEUIBhkL+////H4MgEEL/////D4N+fCIQNwMAIA4gECAOKQMAhUIgiSIQNwMAIAogECAKKQMAIhF8IBFCAYZC/v///x+DIBBC/////w+DfnwiEDcDACAGIBAgBikDAIVCKIkiEDcDACACIBAgAikDACIRfCAQQv////8PgyARQgGGQv7///8fg358IhA3AwAgDiAQIA4pAwCFQjCJIhA3AwAgCiAQIAopAwAiEXwgEEL/////D4MgEUIBhkL+////H4N+fCIQNwMAIAYgECAGKQMAhUIBiTcDACADIAcpAwAiECADKQMAIhF8IBFCAYZC/v///x+DIBBC/////w+DfnwiEDcDACAPIBAgDykDAIVCIIkiEDcDACALIBAgCykDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgByAQIAcpAwCFQiiJIhA3AwAgAyAQIAMpAwAiEXwgEEL/////D4MgEUIBhkL+////H4N+fCIQNwMAIA8gECAPKQMAhUIwiSIQNwMAIAsgECALKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACAHIBAgBykDAIVCAYk3AwAgACAFKQMAIhAgACkDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgDyAQIA8pAwCFQiCJIhA3AwAgCiAQIAopAwAiEXwgEUIBhkL+////H4MgEEL/////D4N+fCIQNwMAIAUgECAFKQMAhUIoiSIQNwMAIAAgECAAKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACAPIBAgDykDAIVCMIkiEDcDACAKIBAgCikDACIRfCAQQv////8PgyARQgGGQv7///8fg358IhA3AwAgBSAQIAUpAwCFQgGJNwMAIAEgBikDACIQIAEpAwAiEXwgEUIBhkL+////H4MgEEL/////D4N+fCIQNwMAIAwgECAMKQMAhUIgiSIQNwMAIAsgECALKQMAIhF8IBFCAYZC/v///x+DIBBC/////w+DfnwiEDcDACAGIBAgBikDAIVCKIkiEDcDACABIBAgASkDACIRfCAQQv////8PgyARQgGGQv7///8fg358IhA3AwAgDCAQIAwpAwCFQjCJIhA3AwAgCyAQIAspAwAiEXwgEEL/////D4MgEUIBhkL+////H4N+fCIQNwMAIAYgECAGKQMAhUIBiTcDACACIAcpAwAiECACKQMAIhF8IBFCAYZC/v///x+DIBBC/////w+DfnwiEDcDACANIBAgDSkDAIVCIIkiEDcDACAIIBAgCCkDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgByAQIAcpAwCFQiiJIhA3AwAgAiAQIAIpAwAiEXwgEEL/////D4MgEUIBhkL+////H4N+fCIQNwMAIA0gECANKQMAhUIwiSIQNwMAIAggECAIKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACAHIBAgBykDAIVCAYk3AwAgAyAEKQMAIhAgAykDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgDiAQIA4pAwCFQiCJIhA3AwAgCSAQIAkpAwAiEXwgEUIBhkL+////H4MgEEL/////D4N+fCIQNwMAIAQgECAEKQMAhUIoiSIQNwMAIAMgECADKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACAOIBAgDikDAIVCMIkiEDcDACAJIBAgCSkDACIRfCAQQv////8PgyARQgGGQv7///8fg358IhA3AwAgBCAQIAQpAwCFQgGJNwMAC98aAQN/QQAhBEEAIAIpAwAgASkDAIU3A5AIQQAgAikDCCABKQMIhTcDmAhBACACKQMQIAEpAxCFNwOgCEEAIAIpAxggASkDGIU3A6gIQQAgAikDICABKQMghTcDsAhBACACKQMoIAEpAyiFNwO4CEEAIAIpAzAgASkDMIU3A8AIQQAgAikDOCABKQM4hTcDyAhBACACKQNAIAEpA0CFNwPQCEEAIAIpA0ggASkDSIU3A9gIQQAgAikDUCABKQNQhTcD4AhBACACKQNYIAEpA1iFNwPoCEEAIAIpA2AgASkDYIU3A/AIQQAgAikDaCABKQNohTcD+AhBACACKQNwIAEpA3CFNwOACUEAIAIpA3ggASkDeIU3A4gJQQAgAikDgAEgASkDgAGFNwOQCUEAIAIpA4gBIAEpA4gBhTcDmAlBACACKQOQASABKQOQAYU3A6AJQQAgAikDmAEgASkDmAGFNwOoCUEAIAIpA6ABIAEpA6ABhTcDsAlBACACKQOoASABKQOoAYU3A7gJQQAgAikDsAEgASkDsAGFNwPACUEAIAIpA7gBIAEpA7gBhTcDyAlBACACKQPAASABKQPAAYU3A9AJQQAgAikDyAEgASkD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";
|
|
724
|
-
var hash$k = "e4cdc523";
|
|
725
|
-
var wasmJson$k = {
|
|
726
|
-
name: name$k,
|
|
727
|
-
data: data$k,
|
|
728
|
-
hash: hash$k
|
|
729
|
-
};
|
|
730
|
-
var name$j = "blake2b";
|
|
731
|
-
var data$j = "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";
|
|
732
|
-
var hash$j = "c6f286e6";
|
|
733
|
-
var wasmJson$j = {
|
|
734
|
-
name: name$j,
|
|
735
|
-
data: data$j,
|
|
736
|
-
hash: hash$j
|
|
737
|
-
};
|
|
738
|
-
new Mutex();
|
|
739
|
-
function validateBits$4(bits) {
|
|
740
|
-
if (!Number.isInteger(bits) || bits < 8 || bits > 512 || bits % 8 !== 0) {
|
|
741
|
-
return new Error("Invalid variant! Valid values: 8, 16, ..., 512");
|
|
742
|
-
}
|
|
743
|
-
return null;
|
|
744
|
-
}
|
|
745
|
-
function getInitParam$1(outputBits, keyBits) {
|
|
746
|
-
return outputBits | keyBits << 16;
|
|
747
|
-
}
|
|
748
|
-
function createBLAKE2b(bits = 512, key = null) {
|
|
749
|
-
if (validateBits$4(bits)) {
|
|
750
|
-
return Promise.reject(validateBits$4(bits));
|
|
751
|
-
}
|
|
752
|
-
let keyBuffer = null;
|
|
753
|
-
let initParam = bits;
|
|
754
|
-
if (key !== null) {
|
|
755
|
-
keyBuffer = getUInt8Buffer(key);
|
|
756
|
-
if (keyBuffer.length > 64) {
|
|
757
|
-
return Promise.reject(new Error("Max key length is 64 bytes"));
|
|
758
|
-
}
|
|
759
|
-
initParam = getInitParam$1(bits, keyBuffer.length);
|
|
760
|
-
}
|
|
761
|
-
const outputSize = bits / 8;
|
|
762
|
-
return WASMInterface(wasmJson$j, outputSize).then((wasm) => {
|
|
763
|
-
if (initParam > 512) {
|
|
764
|
-
wasm.writeMemory(keyBuffer);
|
|
765
|
-
}
|
|
766
|
-
wasm.init(initParam);
|
|
767
|
-
const obj = {
|
|
768
|
-
init: initParam > 512 ? () => {
|
|
769
|
-
wasm.writeMemory(keyBuffer);
|
|
770
|
-
wasm.init(initParam);
|
|
771
|
-
return obj;
|
|
772
|
-
} : () => {
|
|
773
|
-
wasm.init(initParam);
|
|
774
|
-
return obj;
|
|
775
|
-
},
|
|
776
|
-
update: (data) => {
|
|
777
|
-
wasm.update(data);
|
|
778
|
-
return obj;
|
|
779
|
-
},
|
|
780
|
-
// biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
|
|
781
|
-
digest: (outputType) => wasm.digest(outputType),
|
|
782
|
-
save: () => wasm.save(),
|
|
783
|
-
load: (data) => {
|
|
784
|
-
wasm.load(data);
|
|
785
|
-
return obj;
|
|
786
|
-
},
|
|
787
|
-
blockSize: 128,
|
|
788
|
-
digestSize: outputSize
|
|
789
|
-
};
|
|
790
|
-
return obj;
|
|
791
|
-
});
|
|
792
|
-
}
|
|
793
|
-
function encodeResult(salt, options, res) {
|
|
794
|
-
const parameters = [
|
|
795
|
-
`m=${options.memorySize}`,
|
|
796
|
-
`t=${options.iterations}`,
|
|
797
|
-
`p=${options.parallelism}`
|
|
798
|
-
].join(",");
|
|
799
|
-
return `$argon2${options.hashType}$v=19$${parameters}$${encodeBase64(salt, false)}$${encodeBase64(res, false)}`;
|
|
800
|
-
}
|
|
801
|
-
var uint32View = new DataView(new ArrayBuffer(4));
|
|
802
|
-
function int32LE(x) {
|
|
803
|
-
uint32View.setInt32(0, x, true);
|
|
804
|
-
return new Uint8Array(uint32View.buffer);
|
|
805
|
-
}
|
|
806
|
-
function hashFunc(blake512, buf, len) {
|
|
807
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
808
|
-
if (len <= 64) {
|
|
809
|
-
const blake = yield createBLAKE2b(len * 8);
|
|
810
|
-
blake.update(int32LE(len));
|
|
811
|
-
blake.update(buf);
|
|
812
|
-
return blake.digest("binary");
|
|
813
|
-
}
|
|
814
|
-
const r = Math.ceil(len / 32) - 2;
|
|
815
|
-
const ret = new Uint8Array(len);
|
|
816
|
-
blake512.init();
|
|
817
|
-
blake512.update(int32LE(len));
|
|
818
|
-
blake512.update(buf);
|
|
819
|
-
let vp = blake512.digest("binary");
|
|
820
|
-
ret.set(vp.subarray(0, 32), 0);
|
|
821
|
-
for (let i = 1; i < r; i++) {
|
|
822
|
-
blake512.init();
|
|
823
|
-
blake512.update(vp);
|
|
824
|
-
vp = blake512.digest("binary");
|
|
825
|
-
ret.set(vp.subarray(0, 32), i * 32);
|
|
826
|
-
}
|
|
827
|
-
const partialBytesNeeded = len - 32 * r;
|
|
828
|
-
let blakeSmall;
|
|
829
|
-
if (partialBytesNeeded === 64) {
|
|
830
|
-
blakeSmall = blake512;
|
|
831
|
-
blakeSmall.init();
|
|
832
|
-
} else {
|
|
833
|
-
blakeSmall = yield createBLAKE2b(partialBytesNeeded * 8);
|
|
834
|
-
}
|
|
835
|
-
blakeSmall.update(vp);
|
|
836
|
-
vp = blakeSmall.digest("binary");
|
|
837
|
-
ret.set(vp.subarray(0, partialBytesNeeded), r * 32);
|
|
838
|
-
return ret;
|
|
839
|
-
});
|
|
840
|
-
}
|
|
841
|
-
function getHashType(type) {
|
|
842
|
-
switch (type) {
|
|
843
|
-
case "d":
|
|
844
|
-
return 0;
|
|
845
|
-
case "i":
|
|
846
|
-
return 1;
|
|
847
|
-
default:
|
|
848
|
-
return 2;
|
|
849
|
-
}
|
|
850
|
-
}
|
|
851
|
-
function argon2Internal(options) {
|
|
852
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
853
|
-
var _a2;
|
|
854
|
-
const { parallelism, iterations, hashLength } = options;
|
|
855
|
-
const password = getUInt8Buffer(options.password);
|
|
856
|
-
const salt = getUInt8Buffer(options.salt);
|
|
857
|
-
const version = 19;
|
|
858
|
-
const hashType = getHashType(options.hashType);
|
|
859
|
-
const { memorySize } = options;
|
|
860
|
-
const secret = getUInt8Buffer((_a2 = options.secret) !== null && _a2 !== void 0 ? _a2 : "");
|
|
861
|
-
const [argon2Interface, blake512] = yield Promise.all([
|
|
862
|
-
WASMInterface(wasmJson$k, 1024),
|
|
863
|
-
createBLAKE2b(512)
|
|
864
|
-
]);
|
|
865
|
-
argon2Interface.setMemorySize(memorySize * 1024 + 1024);
|
|
866
|
-
const initVector = new Uint8Array(24);
|
|
867
|
-
const initVectorView = new DataView(initVector.buffer);
|
|
868
|
-
initVectorView.setInt32(0, parallelism, true);
|
|
869
|
-
initVectorView.setInt32(4, hashLength, true);
|
|
870
|
-
initVectorView.setInt32(8, memorySize, true);
|
|
871
|
-
initVectorView.setInt32(12, iterations, true);
|
|
872
|
-
initVectorView.setInt32(16, version, true);
|
|
873
|
-
initVectorView.setInt32(20, hashType, true);
|
|
874
|
-
argon2Interface.writeMemory(initVector, memorySize * 1024);
|
|
875
|
-
blake512.init();
|
|
876
|
-
blake512.update(initVector);
|
|
877
|
-
blake512.update(int32LE(password.length));
|
|
878
|
-
blake512.update(password);
|
|
879
|
-
blake512.update(int32LE(salt.length));
|
|
880
|
-
blake512.update(salt);
|
|
881
|
-
blake512.update(int32LE(secret.length));
|
|
882
|
-
blake512.update(secret);
|
|
883
|
-
blake512.update(int32LE(0));
|
|
884
|
-
const segments = Math.floor(memorySize / (parallelism * 4));
|
|
885
|
-
const lanes = segments * 4;
|
|
886
|
-
const param = new Uint8Array(72);
|
|
887
|
-
const H0 = blake512.digest("binary");
|
|
888
|
-
param.set(H0);
|
|
889
|
-
for (let lane = 0; lane < parallelism; lane++) {
|
|
890
|
-
param.set(int32LE(0), 64);
|
|
891
|
-
param.set(int32LE(lane), 68);
|
|
892
|
-
let position = lane * lanes;
|
|
893
|
-
let chunk = yield hashFunc(blake512, param, 1024);
|
|
894
|
-
argon2Interface.writeMemory(chunk, position * 1024);
|
|
895
|
-
position += 1;
|
|
896
|
-
param.set(int32LE(1), 64);
|
|
897
|
-
chunk = yield hashFunc(blake512, param, 1024);
|
|
898
|
-
argon2Interface.writeMemory(chunk, position * 1024);
|
|
899
|
-
}
|
|
900
|
-
const C = new Uint8Array(1024);
|
|
901
|
-
writeHexToUInt8(C, argon2Interface.calculate(new Uint8Array([]), memorySize));
|
|
902
|
-
const res = yield hashFunc(blake512, C, hashLength);
|
|
903
|
-
if (options.outputType === "hex") {
|
|
904
|
-
const digestChars = new Uint8Array(hashLength * 2);
|
|
905
|
-
return getDigestHex(digestChars, res, hashLength);
|
|
906
|
-
}
|
|
907
|
-
if (options.outputType === "encoded") {
|
|
908
|
-
return encodeResult(salt, options, res);
|
|
909
|
-
}
|
|
910
|
-
return res;
|
|
911
|
-
});
|
|
912
|
-
}
|
|
913
|
-
var validateOptions$3 = (options) => {
|
|
914
|
-
var _a2;
|
|
915
|
-
if (!options || typeof options !== "object") {
|
|
916
|
-
throw new Error("Invalid options parameter. It requires an object.");
|
|
917
|
-
}
|
|
918
|
-
if (!options.password) {
|
|
919
|
-
throw new Error("Password must be specified");
|
|
920
|
-
}
|
|
921
|
-
options.password = getUInt8Buffer(options.password);
|
|
922
|
-
if (options.password.length < 1) {
|
|
923
|
-
throw new Error("Password must be specified");
|
|
924
|
-
}
|
|
925
|
-
if (!options.salt) {
|
|
926
|
-
throw new Error("Salt must be specified");
|
|
927
|
-
}
|
|
928
|
-
options.salt = getUInt8Buffer(options.salt);
|
|
929
|
-
if (options.salt.length < 8) {
|
|
930
|
-
throw new Error("Salt should be at least 8 bytes long");
|
|
931
|
-
}
|
|
932
|
-
options.secret = getUInt8Buffer((_a2 = options.secret) !== null && _a2 !== void 0 ? _a2 : "");
|
|
933
|
-
if (!Number.isInteger(options.iterations) || options.iterations < 1) {
|
|
934
|
-
throw new Error("Iterations should be a positive number");
|
|
935
|
-
}
|
|
936
|
-
if (!Number.isInteger(options.parallelism) || options.parallelism < 1) {
|
|
937
|
-
throw new Error("Parallelism should be a positive number");
|
|
938
|
-
}
|
|
939
|
-
if (!Number.isInteger(options.hashLength) || options.hashLength < 4) {
|
|
940
|
-
throw new Error("Hash length should be at least 4 bytes.");
|
|
941
|
-
}
|
|
942
|
-
if (!Number.isInteger(options.memorySize)) {
|
|
943
|
-
throw new Error("Memory size should be specified.");
|
|
944
|
-
}
|
|
945
|
-
if (options.memorySize < 8 * options.parallelism) {
|
|
946
|
-
throw new Error("Memory size should be at least 8 * parallelism.");
|
|
947
|
-
}
|
|
948
|
-
if (options.outputType === void 0) {
|
|
949
|
-
options.outputType = "hex";
|
|
950
|
-
}
|
|
951
|
-
if (!["hex", "binary", "encoded"].includes(options.outputType)) {
|
|
952
|
-
throw new Error(`Insupported output type ${options.outputType}. Valid values: ['hex', 'binary', 'encoded']`);
|
|
953
|
-
}
|
|
954
|
-
};
|
|
955
|
-
function argon2id(options) {
|
|
956
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
957
|
-
validateOptions$3(options);
|
|
958
|
-
return argon2Internal(Object.assign(Object.assign({}, options), { hashType: "id" }));
|
|
959
|
-
});
|
|
960
|
-
}
|
|
961
|
-
new Mutex();
|
|
962
|
-
new Mutex();
|
|
963
|
-
new Mutex();
|
|
964
|
-
new Mutex();
|
|
965
|
-
new Mutex();
|
|
966
|
-
new Mutex();
|
|
967
|
-
new Mutex();
|
|
968
|
-
new Mutex();
|
|
969
|
-
new Mutex();
|
|
970
|
-
new Mutex();
|
|
971
|
-
new Mutex();
|
|
972
|
-
new Mutex();
|
|
973
|
-
new Mutex();
|
|
974
|
-
new Mutex();
|
|
975
|
-
new Mutex();
|
|
976
|
-
new Mutex();
|
|
977
|
-
new Mutex();
|
|
978
|
-
new Mutex();
|
|
979
|
-
new Mutex();
|
|
980
|
-
new Mutex();
|
|
981
|
-
|
|
982
|
-
// src/derive-key/core.ts
|
|
983
|
-
async function argon2(password, salt, parallelism = ARGON2ID_PARALLELISM, iterations = ARGON2ID_ITERATIONS, memorySize = ARGON2ID_MEMORY_SIZE, hashLength = ARGON2ID_OUTPUT_BYTE_LENGTH) {
|
|
984
|
-
return argon2id({
|
|
985
|
-
password,
|
|
986
|
-
salt,
|
|
987
|
-
parallelism,
|
|
988
|
-
iterations,
|
|
989
|
-
memorySize,
|
|
990
|
-
hashLength,
|
|
991
|
-
outputType: "binary"
|
|
992
|
-
});
|
|
993
|
-
}
|
|
994
|
-
function sampleSalt() {
|
|
995
|
-
try {
|
|
996
|
-
const salt = new Uint8Array(ARGON2ID_SALT_BYTE_LENGTH);
|
|
997
|
-
crypto.getRandomValues(salt);
|
|
998
|
-
return salt;
|
|
999
|
-
} catch (error) {
|
|
1000
|
-
throw new Error("Failed to sample salt", { cause: error });
|
|
1001
|
-
}
|
|
1002
|
-
}
|
|
1003
|
-
|
|
1004
|
-
// src/derive-key/deriveKeysFromPassword.ts
|
|
1005
|
-
async function getKeyFromPassword(password) {
|
|
1006
|
-
try {
|
|
1007
|
-
if (!password) {
|
|
1008
|
-
throw new Error("No password given");
|
|
1009
|
-
}
|
|
1010
|
-
const salt = sampleSalt();
|
|
1011
|
-
const key = await argon2(password, salt);
|
|
1012
|
-
return { key, salt };
|
|
1013
|
-
} catch (error) {
|
|
1014
|
-
throw new Error("Failed to derive key from password", { cause: error });
|
|
1015
|
-
}
|
|
1016
|
-
}
|
|
1017
|
-
async function getKeyFromPasswordAndSalt(password, salt) {
|
|
1018
|
-
try {
|
|
1019
|
-
if (!salt.length) {
|
|
1020
|
-
throw new Error("No salt given");
|
|
1021
|
-
}
|
|
1022
|
-
if (!password) {
|
|
1023
|
-
throw new Error("No password given");
|
|
1024
|
-
}
|
|
1025
|
-
return await argon2(password, salt);
|
|
1026
|
-
} catch (error) {
|
|
1027
|
-
throw new Error("Failed to derive key from password and salt", { cause: error });
|
|
1028
|
-
}
|
|
1029
|
-
}
|
|
1030
|
-
|
|
1031
|
-
// src/key-wrapper/aesWrapper.ts
|
|
1032
|
-
async function importWrappingKey(key) {
|
|
1033
|
-
try {
|
|
1034
|
-
return await crypto.subtle.importKey(KEY_FORMAT, key, KEY_WRAPPING_ALGORITHM, false, [
|
|
1035
|
-
"wrapKey",
|
|
1036
|
-
"unwrapKey"
|
|
1037
|
-
]);
|
|
1038
|
-
} catch (error) {
|
|
1039
|
-
throw new Error("Failed to import wrapping key", { cause: error });
|
|
1040
|
-
}
|
|
1041
|
-
}
|
|
1042
|
-
async function deriveWrappingKey(eccSecret, kyberSecret) {
|
|
1043
|
-
try {
|
|
1044
|
-
if (eccSecret.length !== kyberSecret.length) {
|
|
1045
|
-
throw new Error("secrets must have equal length");
|
|
1046
|
-
}
|
|
1047
|
-
const key = await deriveKeyFromTwoKeysAndContext(eccSecret, kyberSecret, CONTEXT_WRAPPING);
|
|
1048
|
-
return await importWrappingKey(key);
|
|
1049
|
-
} catch (error) {
|
|
1050
|
-
throw new Error("Failed to derive wrapping key", { cause: error });
|
|
1051
|
-
}
|
|
1052
|
-
}
|
|
1053
|
-
async function unwrapKey(encryptedKey, wrappingKey) {
|
|
1054
|
-
try {
|
|
1055
|
-
return await crypto.subtle.unwrapKey(
|
|
1056
|
-
KEY_FORMAT,
|
|
1057
|
-
encryptedKey,
|
|
1058
|
-
wrappingKey,
|
|
1059
|
-
KEY_WRAPPING_ALGORITHM,
|
|
1060
|
-
AES_ALGORITHM,
|
|
1061
|
-
false,
|
|
1062
|
-
["encrypt", "decrypt"]
|
|
1063
|
-
);
|
|
1064
|
-
} catch (error) {
|
|
1065
|
-
throw new Error("Failed to unwrap key", { cause: error });
|
|
1066
|
-
}
|
|
1067
|
-
}
|
|
1068
|
-
async function wrapKey(encryptionKey, wrappingKey) {
|
|
1069
|
-
try {
|
|
1070
|
-
const result = await crypto.subtle.wrapKey(KEY_FORMAT, encryptionKey, wrappingKey, KEY_WRAPPING_ALGORITHM);
|
|
1071
|
-
return new Uint8Array(result);
|
|
1072
|
-
} catch (error) {
|
|
1073
|
-
throw new Error("Failed to wrap key", { cause: error });
|
|
1074
|
-
}
|
|
1075
|
-
}
|
|
1076
|
-
|
|
1077
|
-
// src/email-crypto/core.ts
|
|
1078
|
-
async function encryptEmailContentSymmetrically(email, aux, emailID) {
|
|
1079
|
-
try {
|
|
1080
|
-
const encryptionKey = await genSymmetricCryptoKey();
|
|
1081
|
-
const enc = await encryptEmailContentSymmetricallyWithKey(email, encryptionKey, aux, emailID);
|
|
1082
|
-
return { enc, encryptionKey };
|
|
1083
|
-
} catch (error) {
|
|
1084
|
-
throw new Error("Failed to symmetrically encrypt email", { cause: error });
|
|
1085
|
-
}
|
|
1086
|
-
}
|
|
1087
|
-
async function encryptEmailContentAndSubjectSymmetrically(email, subject, aux, emailID) {
|
|
1088
|
-
try {
|
|
1089
|
-
const encryptionKey = await genSymmetricCryptoKey();
|
|
1090
|
-
const enc = await encryptEmailContentSymmetricallyWithKey(email, encryptionKey, aux, emailID);
|
|
1091
|
-
const subjectBuff = UTF8ToUint8(subject);
|
|
1092
|
-
const subjectEnc = await encryptSymmetrically(encryptionKey, subjectBuff, aux);
|
|
1093
|
-
return { enc, encryptionKey, subjectEnc };
|
|
1094
|
-
} catch (error) {
|
|
1095
|
-
throw new Error("Failed to symmetrically encrypt email and subject", { cause: error });
|
|
1096
|
-
}
|
|
1097
|
-
}
|
|
1098
|
-
async function decryptEmailAndSubjectSymmetrically(emailCiphertext, encSubject, encryptionKey, aux) {
|
|
1099
|
-
try {
|
|
1100
|
-
const binaryEmail = await decryptSymmetrically(encryptionKey, emailCiphertext, aux);
|
|
1101
|
-
const subject = await decryptSymmetrically(encryptionKey, encSubject, aux);
|
|
1102
|
-
const body = binaryToEmailBody(binaryEmail);
|
|
1103
|
-
return { body, subject: uint8ToUTF8(subject) };
|
|
1104
|
-
} catch (error) {
|
|
1105
|
-
throw new Error("Failed to symmetrically decrypt email and subject", { cause: error });
|
|
1106
|
-
}
|
|
1107
|
-
}
|
|
1108
|
-
async function encryptEmailContentSymmetricallyWithKey(emailBody, encryptionKey, aux, emailID) {
|
|
1109
|
-
try {
|
|
1110
|
-
const binaryEmail = emailBodyToBinary(emailBody);
|
|
1111
|
-
const ciphertext = await encryptSymmetrically(encryptionKey, binaryEmail, aux, emailID);
|
|
1112
|
-
return ciphertext;
|
|
1113
|
-
} catch (error) {
|
|
1114
|
-
throw new Error("Failed to symmetrically encrypt email with the given key", { cause: error });
|
|
1115
|
-
}
|
|
1116
|
-
}
|
|
1117
|
-
async function decryptEmailSymmetrically(emailCiphertext, encryptionKey, aux) {
|
|
1118
|
-
try {
|
|
1119
|
-
const binaryEmail = await decryptSymmetrically(encryptionKey, emailCiphertext, aux);
|
|
1120
|
-
const body = binaryToEmailBody(binaryEmail);
|
|
1121
|
-
return body;
|
|
1122
|
-
} catch (error) {
|
|
1123
|
-
throw new Error("Failed to symmetrically decrypt email", { cause: error });
|
|
1124
|
-
}
|
|
1125
|
-
}
|
|
1126
|
-
async function encryptKeysHybrid(emailEncryptionKey, recipientPublicKey, senderPrivateKey) {
|
|
1127
|
-
try {
|
|
1128
|
-
const eccSecret = await deriveSecretKey(recipientPublicKey.eccPublicKey, senderPrivateKey.eccPrivateKey);
|
|
1129
|
-
const { cipherText: kyberCiphertext, sharedSecret: kyberSecret } = encapsulateKyber(
|
|
1130
|
-
recipientPublicKey.kyberPublicKey
|
|
1131
|
-
);
|
|
1132
|
-
const wrappingKey = await deriveWrappingKey(eccSecret, kyberSecret);
|
|
1133
|
-
const encryptedKey = await wrapKey(emailEncryptionKey, wrappingKey);
|
|
1134
|
-
return { encryptedKey, kyberCiphertext };
|
|
1135
|
-
} catch (error) {
|
|
1136
|
-
throw new Error("Failed to encrypt email key using hybrid encryption", { cause: error });
|
|
1137
|
-
}
|
|
1138
|
-
}
|
|
1139
|
-
async function decryptKeysHybrid(encryptedKey, senderPublicKey, recipientPrivateKey) {
|
|
1140
|
-
try {
|
|
1141
|
-
const eccSecret = await deriveSecretKey(senderPublicKey.eccPublicKey, recipientPrivateKey.eccPrivateKey);
|
|
1142
|
-
const kyberSecret = decapsulateKyber(encryptedKey.kyberCiphertext, recipientPrivateKey.kyberPrivateKey);
|
|
1143
|
-
const wrappingKey = await deriveWrappingKey(eccSecret, kyberSecret);
|
|
1144
|
-
const encryptionKey = await unwrapKey(encryptedKey.encryptedKey, wrappingKey);
|
|
1145
|
-
return encryptionKey;
|
|
1146
|
-
} catch (error) {
|
|
1147
|
-
throw new Error("Failed to decrypt email key encrypted via hybrid encryption", { cause: error });
|
|
1148
|
-
}
|
|
1149
|
-
}
|
|
1150
|
-
async function passwordProtectKey(emailEncryptionKey, password) {
|
|
1151
|
-
try {
|
|
1152
|
-
const { key, salt } = await getKeyFromPassword(password);
|
|
1153
|
-
const wrappingKey = await importWrappingKey(key);
|
|
1154
|
-
const encryptedKey = await wrapKey(emailEncryptionKey, wrappingKey);
|
|
1155
|
-
return { encryptedKey, salt };
|
|
1156
|
-
} catch (error) {
|
|
1157
|
-
throw new Error("Failed to password-protect email key", { cause: error });
|
|
1158
|
-
}
|
|
1159
|
-
}
|
|
1160
|
-
async function removePasswordProtection(emailEncryptionKey, password) {
|
|
1161
|
-
try {
|
|
1162
|
-
const key = await getKeyFromPasswordAndSalt(password, emailEncryptionKey.salt);
|
|
1163
|
-
const wrappingKey = await importWrappingKey(key);
|
|
1164
|
-
const encryptionKey = await unwrapKey(emailEncryptionKey.encryptedKey, wrappingKey);
|
|
1165
|
-
return encryptionKey;
|
|
1166
|
-
} catch (error) {
|
|
1167
|
-
throw new Error("Failed to remove password-protection from email key", { cause: error });
|
|
1168
|
-
}
|
|
1169
|
-
}
|
|
1170
|
-
function getAux(params) {
|
|
1171
|
-
try {
|
|
1172
|
-
const { subject, replyToEmailID, sender, recipients } = params;
|
|
1173
|
-
const aux = JSON.stringify({ subject, replyToEmailID, sender, recipients });
|
|
1174
|
-
return aux;
|
|
1175
|
-
} catch (error) {
|
|
1176
|
-
throw new Error("Failed to create aux", { cause: error });
|
|
1177
|
-
}
|
|
1178
|
-
}
|
|
1179
|
-
function getAuxWithoutSubject(params) {
|
|
1180
|
-
try {
|
|
1181
|
-
const { replyToEmailID, sender, recipients } = params;
|
|
1182
|
-
const aux = JSON.stringify({ replyToEmailID, sender, recipients });
|
|
1183
|
-
return aux;
|
|
1184
|
-
} catch (error) {
|
|
1185
|
-
throw new Error("Failed to create aux without subject", { cause: error });
|
|
1186
|
-
}
|
|
1187
|
-
}
|
|
1188
|
-
function generateEmailID() {
|
|
1189
|
-
return v4();
|
|
1190
|
-
}
|
|
1191
|
-
|
|
1192
|
-
// src/email-crypto/hybridEncyptedEmail.ts
|
|
1193
|
-
async function encryptEmailHybrid(email, recipient, senderPrivateKey) {
|
|
1194
|
-
try {
|
|
1195
|
-
const aux = getAux(email.params);
|
|
1196
|
-
const { enc, encryptionKey } = await encryptEmailContentSymmetrically(email.body, aux, email.id);
|
|
1197
|
-
const encryptedKey = await encryptKeysHybrid(encryptionKey, recipient.publicKeys, senderPrivateKey);
|
|
1198
|
-
return { enc, encryptedKey, recipientEmail: recipient.email, params: email.params, id: email.id };
|
|
1199
|
-
} catch (error) {
|
|
1200
|
-
throw new Error("Failed to encrypt email with hybrid encryption", { cause: error });
|
|
1201
|
-
}
|
|
1202
|
-
}
|
|
1203
|
-
async function encryptEmailHybridForMultipleRecipients(email, recipients, senderPrivateKey) {
|
|
1204
|
-
try {
|
|
1205
|
-
const aux = getAux(email.params);
|
|
1206
|
-
const { enc, encryptionKey } = await encryptEmailContentSymmetrically(email.body, aux, email.id);
|
|
1207
|
-
const encryptedEmails = [];
|
|
1208
|
-
for (const recipient of recipients) {
|
|
1209
|
-
const encryptedKey = await encryptKeysHybrid(encryptionKey, recipient.publicKeys, senderPrivateKey);
|
|
1210
|
-
encryptedEmails.push({ enc, encryptedKey, recipientEmail: recipient.email, params: email.params, id: email.id });
|
|
1211
|
-
}
|
|
1212
|
-
return encryptedEmails;
|
|
1213
|
-
} catch (error) {
|
|
1214
|
-
throw new Error("Failed to encrypt email to multiple recipients with hybrid encryption", { cause: error });
|
|
1215
|
-
}
|
|
1216
|
-
}
|
|
1217
|
-
async function decryptEmailHybrid(encryptedEmail, senderPublicKeys, recipientPrivateKeys) {
|
|
1218
|
-
try {
|
|
1219
|
-
const aux = getAux(encryptedEmail.params);
|
|
1220
|
-
const encryptionKey = await decryptKeysHybrid(encryptedEmail.encryptedKey, senderPublicKeys, recipientPrivateKeys);
|
|
1221
|
-
const body = await decryptEmailSymmetrically(encryptedEmail.enc, encryptionKey, aux);
|
|
1222
|
-
return { body, params: encryptedEmail.params, id: encryptedEmail.id };
|
|
1223
|
-
} catch (error) {
|
|
1224
|
-
throw new Error("Failed to decrypt email with hybrid encryption", { cause: error });
|
|
1225
|
-
}
|
|
1226
|
-
}
|
|
1227
|
-
|
|
1228
|
-
// src/email-crypto/hybridEncyptedEmailAndSubject.ts
|
|
1229
|
-
async function encryptEmailAndSubjectHybrid(email, recipient, senderPrivateKey) {
|
|
1230
|
-
try {
|
|
1231
|
-
const aux = getAuxWithoutSubject(email.params);
|
|
1232
|
-
const { enc, encryptionKey, subjectEnc } = await encryptEmailContentAndSubjectSymmetrically(
|
|
1233
|
-
email.body,
|
|
1234
|
-
email.params.subject,
|
|
1235
|
-
aux,
|
|
1236
|
-
email.id
|
|
1237
|
-
);
|
|
1238
|
-
const encSubjectStr = ciphertextToBase64(subjectEnc);
|
|
1239
|
-
const encryptedKey = await encryptKeysHybrid(encryptionKey, recipient.publicKeys, senderPrivateKey);
|
|
1240
|
-
const params = { ...email.params, subject: encSubjectStr };
|
|
1241
|
-
return { enc, encryptedKey, recipientEmail: recipient.email, params, id: email.id };
|
|
1242
|
-
} catch (error) {
|
|
1243
|
-
throw new Error("Failed to encrypt the email and its subject with hybrid encryption", { cause: error });
|
|
1244
|
-
}
|
|
1245
|
-
}
|
|
1246
|
-
async function encryptEmailAndSubjectHybridForMultipleRecipients(email, recipients, senderPrivateKey) {
|
|
1247
|
-
try {
|
|
1248
|
-
const aux = getAuxWithoutSubject(email.params);
|
|
1249
|
-
const { enc, encryptionKey, subjectEnc } = await encryptEmailContentAndSubjectSymmetrically(
|
|
1250
|
-
email.body,
|
|
1251
|
-
email.params.subject,
|
|
1252
|
-
aux,
|
|
1253
|
-
email.id
|
|
1254
|
-
);
|
|
1255
|
-
const encSubjectStr = ciphertextToBase64(subjectEnc);
|
|
1256
|
-
const encryptedEmails = [];
|
|
1257
|
-
for (const recipient of recipients) {
|
|
1258
|
-
const encryptedKey = await encryptKeysHybrid(encryptionKey, recipient.publicKeys, senderPrivateKey);
|
|
1259
|
-
const params = { ...email.params, subject: encSubjectStr };
|
|
1260
|
-
encryptedEmails.push({ enc, encryptedKey, recipientEmail: recipient.email, params, id: email.id });
|
|
1261
|
-
}
|
|
1262
|
-
return encryptedEmails;
|
|
1263
|
-
} catch (error) {
|
|
1264
|
-
throw new Error("Failed to encrypt the email and its subject to multiple recipients with hybrid encryption", {
|
|
1265
|
-
cause: error
|
|
1266
|
-
});
|
|
1267
|
-
}
|
|
1268
|
-
}
|
|
1269
|
-
async function decryptEmailAndSubjectHybrid(encryptedEmail, senderPublicKeys, recipientPrivateKeys) {
|
|
1270
|
-
try {
|
|
1271
|
-
const aux = getAuxWithoutSubject(encryptedEmail.params);
|
|
1272
|
-
const encryptionKey = await decryptKeysHybrid(encryptedEmail.encryptedKey, senderPublicKeys, recipientPrivateKeys);
|
|
1273
|
-
const encSubject = base64ToCiphertext(encryptedEmail.params.subject);
|
|
1274
|
-
const { body, subject } = await decryptEmailAndSubjectSymmetrically(
|
|
1275
|
-
encryptedEmail.enc,
|
|
1276
|
-
encSubject,
|
|
1277
|
-
encryptionKey,
|
|
1278
|
-
aux
|
|
1279
|
-
);
|
|
1280
|
-
const params = { ...encryptedEmail.params, subject };
|
|
1281
|
-
return { body, params, id: encryptedEmail.id };
|
|
1282
|
-
} catch (error) {
|
|
1283
|
-
throw new Error("Failed to decrypt the email and its subject with hybrid encryption", { cause: error });
|
|
1284
|
-
}
|
|
1285
|
-
}
|
|
1286
|
-
|
|
1287
|
-
// src/email-crypto/pwdProtectedEmail.ts
|
|
1288
|
-
async function createPwdProtectedEmail(email, password) {
|
|
1289
|
-
try {
|
|
1290
|
-
if (!email?.body || !email.params) {
|
|
1291
|
-
throw new Error("Failed to password-protect email: Invalid email structure");
|
|
1292
|
-
}
|
|
1293
|
-
const aux = getAux(email.params);
|
|
1294
|
-
const { enc, encryptionKey } = await encryptEmailContentSymmetrically(email.body, aux, email.id);
|
|
1295
|
-
const encryptedKey = await passwordProtectKey(encryptionKey, password);
|
|
1296
|
-
return { enc, encryptedKey, params: email.params, id: email.id };
|
|
1297
|
-
} catch (error) {
|
|
1298
|
-
throw new Error("Failed to password-protect email", { cause: error });
|
|
1299
|
-
}
|
|
1300
|
-
}
|
|
1301
|
-
async function decryptPwdProtectedEmail(encryptedEmail, password) {
|
|
1302
|
-
try {
|
|
1303
|
-
const aux = getAux(encryptedEmail.params);
|
|
1304
|
-
const encryptionKey = await removePasswordProtection(encryptedEmail.encryptedKey, password);
|
|
1305
|
-
const body = await decryptEmailSymmetrically(encryptedEmail.enc, encryptionKey, aux);
|
|
1306
|
-
return { body, params: encryptedEmail.params, id: encryptedEmail.id };
|
|
1307
|
-
} catch (error) {
|
|
1308
|
-
throw new Error("Failed to decrypt password-protect email", { cause: error });
|
|
1309
|
-
}
|
|
1310
|
-
}
|
|
1311
|
-
|
|
1312
|
-
// src/email-crypto/pwdProtectedEmailAndSubject.ts
|
|
1313
|
-
async function createPwdProtectedEmailAndSubject(email, password) {
|
|
1314
|
-
try {
|
|
1315
|
-
if (!email?.body || !email.params) {
|
|
1316
|
-
throw new Error("Failed to password-protect email and subject: Invalid email structure");
|
|
1317
|
-
}
|
|
1318
|
-
const aux = getAuxWithoutSubject(email.params);
|
|
1319
|
-
const { enc, encryptionKey, subjectEnc } = await encryptEmailContentAndSubjectSymmetrically(
|
|
1320
|
-
email.body,
|
|
1321
|
-
email.params.subject,
|
|
1322
|
-
aux,
|
|
1323
|
-
email.id
|
|
1324
|
-
);
|
|
1325
|
-
const encryptedKey = await passwordProtectKey(encryptionKey, password);
|
|
1326
|
-
const encSubjectStr = ciphertextToBase64(subjectEnc);
|
|
1327
|
-
const params = { ...email.params, subject: encSubjectStr };
|
|
1328
|
-
return { enc, encryptedKey, params, id: email.id };
|
|
1329
|
-
} catch (error) {
|
|
1330
|
-
throw new Error("Failed to password-protect email and subject", { cause: error });
|
|
1331
|
-
}
|
|
1332
|
-
}
|
|
1333
|
-
async function decryptPwdProtectedEmailAndSubject(encryptedEmail, password) {
|
|
1334
|
-
try {
|
|
1335
|
-
const aux = getAuxWithoutSubject(encryptedEmail.params);
|
|
1336
|
-
const encryptionKey = await removePasswordProtection(encryptedEmail.encryptedKey, password);
|
|
1337
|
-
const encSubject = base64ToCiphertext(encryptedEmail.params.subject);
|
|
1338
|
-
const { body, subject } = await decryptEmailAndSubjectSymmetrically(
|
|
1339
|
-
encryptedEmail.enc,
|
|
1340
|
-
encSubject,
|
|
1341
|
-
encryptionKey,
|
|
1342
|
-
aux
|
|
1343
|
-
);
|
|
1344
|
-
const params = { ...encryptedEmail.params, subject };
|
|
1345
|
-
return { body, params, id: encryptedEmail.id };
|
|
1346
|
-
} catch (error) {
|
|
1347
|
-
throw new Error("Failed to decrypt password-protect email", { cause: error });
|
|
1348
|
-
}
|
|
1349
|
-
}
|
|
1350
|
-
|
|
1351
|
-
// src/email-crypto/emailKeys.ts
|
|
1352
|
-
async function generateEmailKeys() {
|
|
1353
|
-
try {
|
|
1354
|
-
const kyberKeys = generateKyberKeys();
|
|
1355
|
-
const keys = await generateEccKeys();
|
|
1356
|
-
const privateKeys = {
|
|
1357
|
-
eccPrivateKey: keys.privateKey,
|
|
1358
|
-
kyberPrivateKey: kyberKeys.secretKey
|
|
1359
|
-
};
|
|
1360
|
-
const publicKeys = {
|
|
1361
|
-
eccPublicKey: keys.publicKey,
|
|
1362
|
-
kyberPublicKey: kyberKeys.publicKey
|
|
1363
|
-
};
|
|
1364
|
-
return { publicKeys, privateKeys };
|
|
1365
|
-
} catch (error) {
|
|
1366
|
-
throw new Error("Failed to generate keys for email service", { cause: error });
|
|
1367
|
-
}
|
|
1368
|
-
}
|
|
1369
|
-
/*! Bundled license information:
|
|
1370
|
-
|
|
1371
|
-
hash-wasm/dist/index.esm.js:
|
|
1372
|
-
(*!
|
|
1373
|
-
* hash-wasm (https://www.npmjs.com/package/hash-wasm)
|
|
1374
|
-
* (c) Dani Biro
|
|
1375
|
-
* @license MIT
|
|
1376
|
-
*)
|
|
1377
|
-
*/
|
|
1378
|
-
|
|
1379
|
-
export { base64ToEncHybridKey, base64ToParams, base64ToPwdProtectedKey, base64ToUser, binaryToEmailBody, createPwdProtectedEmail, createPwdProtectedEmailAndSubject, decryptEmailAndSubjectHybrid, decryptEmailHybrid, decryptPwdProtectedEmail, decryptPwdProtectedEmailAndSubject, emailBodyToBinary, emailToBinary, encHybridKeyToBase64, encryptEmailAndSubjectHybrid, encryptEmailAndSubjectHybridForMultipleRecipients, encryptEmailHybrid, encryptEmailHybridForMultipleRecipients, generateEmailID, generateEmailKeys, getAux, getAuxWithoutSubject, hybridEncyptedEmailToBase64, paramsToBase64, pwdProtectedEmailToBase64, pwdProtectedKeyToBase64, userToBase64 };
|
|
1380
|
-
//# sourceMappingURL=email-crypto.mjs.map
|
|
1381
|
-
//# sourceMappingURL=email-crypto.mjs.map
|
|
1
|
+
import "./utils-DS04iUcX.mjs";
|
|
2
|
+
import "./hash-CXeGAwai.mjs";
|
|
3
|
+
import "./symmetric-crypto-CrdS1Che.mjs";
|
|
4
|
+
import "./derive-key-Be7hS-cN.mjs";
|
|
5
|
+
import "./post-quantum-crypto-Vv34t6gX.mjs";
|
|
6
|
+
import { a as decryptEmailHybrid, d as emailToBinary, f as recipientsToBytes, i as decryptPwdProtectedEmail, n as generateEmailKeys, o as encryptEmailHybrid, p as userToBytes, r as createPwdProtectedEmail, s as encryptEmailHybridForMultipleRecipients, u as getAux } from "./email-crypto-DJUEjTxA.mjs";
|
|
7
|
+
|
|
8
|
+
export { createPwdProtectedEmail, decryptEmailHybrid, decryptPwdProtectedEmail, emailToBinary, encryptEmailHybrid, encryptEmailHybridForMultipleRecipients, generateEmailKeys, getAux, recipientsToBytes, userToBytes };
|