internxt-crypto 0.0.10-alpha → 0.0.13

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.
Files changed (158) hide show
  1. package/README.md +3 -4
  2. package/dist/aes-DSDxP8uF.mjs +184 -0
  3. package/dist/aes-DSDxP8uF.mjs.map +1 -0
  4. package/dist/aes-bOrKZuUC.js +226 -0
  5. package/dist/aes-bOrKZuUC.js.map +1 -0
  6. package/dist/asymmetric-crypto.d.mts +5 -2
  7. package/dist/asymmetric-crypto.d.mts.map +1 -0
  8. package/dist/asymmetric-crypto.d.ts +5 -2
  9. package/dist/asymmetric-crypto.d.ts.map +1 -0
  10. package/dist/asymmetric-crypto.js +9 -92
  11. package/dist/asymmetric-crypto.mjs +2 -84
  12. package/dist/chunk-DQk6qfdC.mjs +18 -0
  13. package/dist/chunk-EbLFQX5m.js +60 -0
  14. package/dist/constants.d.mts +5 -11
  15. package/dist/constants.d.mts.map +1 -0
  16. package/dist/constants.d.ts +5 -11
  17. package/dist/constants.d.ts.map +1 -0
  18. package/dist/constants.js +33 -49
  19. package/dist/constants.js.map +1 -1
  20. package/dist/constants.mjs +32 -40
  21. package/dist/constants.mjs.map +1 -1
  22. package/dist/derive-key.d.mts +11 -8
  23. package/dist/derive-key.d.mts.map +1 -0
  24. package/dist/derive-key.d.ts +11 -8
  25. package/dist/derive-key.d.ts.map +1 -0
  26. package/dist/derive-key.js +13 -795
  27. package/dist/derive-key.mjs +2 -783
  28. package/dist/deriveKeysFromPassword-DJRWZ8Rw.mjs +735 -0
  29. package/dist/deriveKeysFromPassword-DJRWZ8Rw.mjs.map +1 -0
  30. package/dist/deriveKeysFromPassword-Ko7NxkHM.js +2492 -0
  31. package/dist/deriveKeysFromPassword-Ko7NxkHM.js.map +1 -0
  32. package/dist/email-crypto.d.mts +55 -78
  33. package/dist/email-crypto.d.mts.map +1 -0
  34. package/dist/email-crypto.d.ts +55 -78
  35. package/dist/email-crypto.d.ts.map +1 -0
  36. package/dist/email-crypto.js +13 -1409
  37. package/dist/email-crypto.mjs +2 -1380
  38. package/dist/email-search.d.mts +36 -32
  39. package/dist/email-search.d.mts.map +1 -0
  40. package/dist/email-search.d.ts +36 -32
  41. package/dist/email-search.d.ts.map +1 -0
  42. package/dist/email-search.js +534 -540
  43. package/dist/email-search.js.map +1 -1
  44. package/dist/email-search.mjs +532 -538
  45. package/dist/email-search.mjs.map +1 -1
  46. package/dist/emailEncryptionKey-27mIHh18.mjs +150 -0
  47. package/dist/emailEncryptionKey-27mIHh18.mjs.map +1 -0
  48. package/dist/emailEncryptionKey-DbaDAdoW.js +167 -0
  49. package/dist/emailEncryptionKey-DbaDAdoW.js.map +1 -0
  50. package/dist/emailKeys-BJGdkLrg.js +593 -0
  51. package/dist/emailKeys-BJGdkLrg.js.map +1 -0
  52. package/dist/emailKeys-Fp9WR3wl.mjs +509 -0
  53. package/dist/emailKeys-Fp9WR3wl.mjs.map +1 -0
  54. package/dist/genID-3Er5IowC.mjs +153 -0
  55. package/dist/genID-3Er5IowC.mjs.map +1 -0
  56. package/dist/genID-YJSl3YhL.js +238 -0
  57. package/dist/genID-YJSl3YhL.js.map +1 -0
  58. package/dist/hash.d.mts +18 -15
  59. package/dist/hash.d.mts.map +1 -0
  60. package/dist/hash.d.ts +18 -15
  61. package/dist/hash.d.ts.map +1 -0
  62. package/dist/hash.js +12 -95
  63. package/dist/hash.mjs +2 -84
  64. package/dist/index.d.mts +15 -18
  65. package/dist/index.d.mts.map +1 -0
  66. package/dist/index.d.ts +15 -18
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +125 -2698
  69. package/dist/index.mjs +13 -2538
  70. package/dist/keys-BfcaiAOv.mjs +90 -0
  71. package/dist/keys-BfcaiAOv.mjs.map +1 -0
  72. package/dist/keys-CinT7kEY.js +125 -0
  73. package/dist/keys-CinT7kEY.js.map +1 -0
  74. package/dist/keystore-crypto.d.mts +17 -46
  75. package/dist/keystore-crypto.d.mts.map +1 -0
  76. package/dist/keystore-crypto.d.ts +17 -46
  77. package/dist/keystore-crypto.d.ts.map +1 -0
  78. package/dist/keystore-crypto.js +5 -529
  79. package/dist/keystore-crypto.mjs +2 -500
  80. package/dist/kyber1024-PpwE1rki.mjs +144 -0
  81. package/dist/kyber1024-PpwE1rki.mjs.map +1 -0
  82. package/dist/kyber1024-jeKS8CXf.js +173 -0
  83. package/dist/kyber1024-jeKS8CXf.js.map +1 -0
  84. package/dist/{kyber768-B87rMQ7u.d.mts → kyber768-DGBB_RS7.d.ts} +8 -6
  85. package/dist/kyber768-DGBB_RS7.d.ts.map +1 -0
  86. package/dist/{kyber768-B87rMQ7u.d.ts → kyber768-DzIcGg1i.d.mts} +8 -6
  87. package/dist/kyber768-DzIcGg1i.d.mts.map +1 -0
  88. package/dist/mac-BMb1F0dN.js +170 -0
  89. package/dist/mac-BMb1F0dN.js.map +1 -0
  90. package/dist/mac-ZpRlx8Fs.mjs +116 -0
  91. package/dist/mac-ZpRlx8Fs.mjs.map +1 -0
  92. package/dist/post-quantum-crypto.d.mts +23 -27
  93. package/dist/post-quantum-crypto.d.mts.map +1 -0
  94. package/dist/post-quantum-crypto.d.ts +23 -27
  95. package/dist/post-quantum-crypto.d.ts.map +1 -0
  96. package/dist/post-quantum-crypto.js +14 -92
  97. package/dist/post-quantum-crypto.mjs +2 -89
  98. package/dist/storage-service.d.mts +28 -34
  99. package/dist/storage-service.d.mts.map +1 -0
  100. package/dist/storage-service.d.ts +28 -34
  101. package/dist/storage-service.d.ts.map +1 -0
  102. package/dist/storage-service.js +51 -53
  103. package/dist/storage-service.js.map +1 -1
  104. package/dist/storage-service.mjs +40 -51
  105. package/dist/storage-service.mjs.map +1 -1
  106. package/dist/symmetric-crypto.d.mts +8 -7
  107. package/dist/symmetric-crypto.d.mts.map +1 -0
  108. package/dist/symmetric-crypto.d.ts +8 -7
  109. package/dist/symmetric-crypto.d.ts.map +1 -0
  110. package/dist/symmetric-crypto.js +10 -142
  111. package/dist/symmetric-crypto.mjs +2 -133
  112. package/dist/types.d.mts +71 -69
  113. package/dist/types.d.mts.map +1 -0
  114. package/dist/types.d.ts +71 -69
  115. package/dist/types.d.ts.map +1 -0
  116. package/dist/types.js +8 -10
  117. package/dist/types.js.map +1 -1
  118. package/dist/types.mjs +7 -9
  119. package/dist/types.mjs.map +1 -1
  120. package/dist/utils.d.mts +34 -78
  121. package/dist/utils.d.mts.map +1 -0
  122. package/dist/utils.d.ts +34 -78
  123. package/dist/utils.d.ts.map +1 -0
  124. package/dist/utils.js +17 -313
  125. package/dist/utils.mjs +2 -272
  126. package/package.json +21 -87
  127. package/dist/asymmetric-crypto.js.map +0 -1
  128. package/dist/asymmetric-crypto.mjs.map +0 -1
  129. package/dist/derive-key.js.map +0 -1
  130. package/dist/derive-key.mjs.map +0 -1
  131. package/dist/email-crypto.js.map +0 -1
  132. package/dist/email-crypto.mjs.map +0 -1
  133. package/dist/email-service.d.mts +0 -38
  134. package/dist/email-service.d.ts +0 -38
  135. package/dist/email-service.js +0 -154
  136. package/dist/email-service.js.map +0 -1
  137. package/dist/email-service.mjs +0 -147
  138. package/dist/email-service.mjs.map +0 -1
  139. package/dist/hash.js.map +0 -1
  140. package/dist/hash.mjs.map +0 -1
  141. package/dist/index.js.map +0 -1
  142. package/dist/index.mjs.map +0 -1
  143. package/dist/keystore-crypto.js.map +0 -1
  144. package/dist/keystore-crypto.mjs.map +0 -1
  145. package/dist/keystore-service.d.mts +0 -82
  146. package/dist/keystore-service.d.ts +0 -82
  147. package/dist/keystore-service.js +0 -349
  148. package/dist/keystore-service.js.map +0 -1
  149. package/dist/keystore-service.mjs +0 -342
  150. package/dist/keystore-service.mjs.map +0 -1
  151. package/dist/post-quantum-crypto.js.map +0 -1
  152. package/dist/post-quantum-crypto.mjs.map +0 -1
  153. package/dist/symmetric-crypto.js.map +0 -1
  154. package/dist/symmetric-crypto.mjs.map +0 -1
  155. package/dist/utils-BDaK_d6T.d.ts +0 -114
  156. package/dist/utils-v34IRTIx.d.mts +0 -114
  157. package/dist/utils.js.map +0 -1
  158. package/dist/utils.mjs.map +0 -1
@@ -1,342 +0,0 @@
1
- import axios from 'axios';
2
- import '@noble/hashes/utils.js';
3
-
4
- // src/keystore-service/api.ts
5
-
6
- // src/constants.ts
7
- var ECC_ALGORITHM = "X25519";
8
- function uint8ArrayToBase64(buffer) {
9
- const array = Uint16Array.from(buffer);
10
- const binaryString = new TextDecoder("UTF-16").decode(array);
11
- return btoa(binaryString);
12
- }
13
- function base64ToUint8Array(str) {
14
- const binaryString = atob(str);
15
- const len = binaryString.length;
16
- const array = new Uint8Array(len);
17
- for (let i = 0; i < len; i++) {
18
- array[i] = binaryString.charCodeAt(i);
19
- }
20
- return new Uint8Array(array.buffer);
21
- }
22
-
23
- // src/asymmetric-crypto/keys.ts
24
- async function importPublicKey(spkiKeyData) {
25
- try {
26
- return await crypto.subtle.importKey(
27
- "spki",
28
- spkiKeyData,
29
- {
30
- name: ECC_ALGORITHM
31
- },
32
- true,
33
- []
34
- );
35
- } catch (error) {
36
- throw new Error("Failed to import public key", { cause: error });
37
- }
38
- }
39
-
40
- // src/utils/aesConverters.ts
41
- function ciphertextToBase64(encryptedMessage) {
42
- try {
43
- const ivBase64 = uint8ArrayToBase64(encryptedMessage.iv);
44
- const ciphertextBase64 = uint8ArrayToBase64(encryptedMessage.ciphertext);
45
- const json = JSON.stringify({ ciphertext: ciphertextBase64, iv: ivBase64 });
46
- const base64 = btoa(json);
47
- return base64;
48
- } catch (error) {
49
- throw new Error("Failed to convert ciphertext to base64", { cause: error });
50
- }
51
- }
52
- function base64ToCiphertext(base64) {
53
- try {
54
- const json = atob(base64);
55
- const obj = JSON.parse(json);
56
- const iv = base64ToUint8Array(obj.iv);
57
- const ciphertext = base64ToUint8Array(obj.ciphertext);
58
- const result = {
59
- ciphertext,
60
- iv
61
- };
62
- return result;
63
- } catch (error) {
64
- throw new Error("Failed to convert base64 to ciphertext", { cause: error });
65
- }
66
- }
67
-
68
- // src/utils/keyConverters.ts
69
- function encryptedKeystoreToBase64(keystore) {
70
- try {
71
- const ciphertext = ciphertextToBase64(keystore.encryptedKeys);
72
- const json = JSON.stringify({
73
- userID: keystore.userID,
74
- type: keystore.type.toString(),
75
- encryptedKeys: ciphertext
76
- });
77
- const base64 = btoa(json);
78
- return base64;
79
- } catch (error) {
80
- throw new Error("Failed to convert encrypted keystore to base64", { cause: error });
81
- }
82
- }
83
- function base64ToEncryptedKeystore(base64) {
84
- try {
85
- const json = atob(base64);
86
- const obj = JSON.parse(json);
87
- const ciphertext = base64ToCiphertext(obj.encryptedKeys);
88
- const result = {
89
- userID: obj.userID,
90
- type: obj.type,
91
- encryptedKeys: ciphertext
92
- };
93
- return result;
94
- } catch (error) {
95
- throw new Error("Failed to convert base64 to encrypted keystore", { cause: error });
96
- }
97
- }
98
- async function base64ToPublicKey(base64) {
99
- try {
100
- const json = atob(base64);
101
- const obj = JSON.parse(json);
102
- const eccPublicKeyBytes = base64ToUint8Array(obj.eccPublicKey);
103
- const eccPublicKey = await importPublicKey(eccPublicKeyBytes);
104
- const kyberPublicKey = base64ToUint8Array(obj.kyberPublicKey);
105
- return {
106
- eccPublicKey,
107
- kyberPublicKey
108
- };
109
- } catch (error) {
110
- throw new Error("Failed to convert base64 to PublicKeys", { cause: error });
111
- }
112
- }
113
-
114
- // src/storage-service/sessionStorageService.ts
115
- function get(key) {
116
- return sessionStorage.getItem(key);
117
- }
118
- function set(key, value) {
119
- return sessionStorage.setItem(key, value);
120
- }
121
- function removeItem(key) {
122
- sessionStorage.removeItem(key);
123
- }
124
- function exists(key) {
125
- return !!sessionStorage.getItem(key);
126
- }
127
- function clear() {
128
- sessionStorage.clear();
129
- }
130
- var sessionStorageService = {
131
- set,
132
- get,
133
- removeItem,
134
- exists,
135
- clear
136
- };
137
- var sessionStorageService_default = sessionStorageService;
138
-
139
- // src/keystore-crypto/core.ts
140
- function getUserID() {
141
- try {
142
- const userID = sessionStorageService_default.get("userID");
143
- if (!userID) {
144
- throw new Error("No UserID");
145
- }
146
- return userID;
147
- } catch (error) {
148
- throw new Error("Failed to get UserID from session storage", { cause: error });
149
- }
150
- }
151
-
152
- // src/keystore-service/api.ts
153
- var KeyServiceAPI = class {
154
- baseUrl;
155
- constructor(baseUrl) {
156
- this.baseUrl = baseUrl;
157
- }
158
- /**
159
- * Converts the specific client error into a proprietary error for our apps
160
- * @param error
161
- * @private
162
- */
163
- normalizeError(error) {
164
- let errorMessage;
165
- if (error.response?.status === 401) {
166
- errorMessage = "Unauthorized: Invalid or expired token";
167
- } else if (error.response?.status === 403) {
168
- errorMessage = "Forbidden: Insufficient permissions";
169
- } else if (error.response?.status === 404) {
170
- errorMessage = "Keystore not found for the specified user";
171
- } else {
172
- errorMessage = "AxiosError:" + (error.message ?? "Unknown error");
173
- }
174
- throw new Error(errorMessage);
175
- }
176
- /**
177
- * Sends a user's encrypted keystore to the server
178
- * @param keystore - The encrypted keystore
179
- * @param url - The user specific part of the url
180
- * @returns Server response
181
- */
182
- async sendEncryptedKeystoreToServer(encryptedKeystore, url) {
183
- try {
184
- const response = await axios.post(
185
- this.baseUrl + `${url}`,
186
- { encryptedKeystore },
187
- {
188
- withCredentials: true,
189
- headers: {
190
- "Content-Type": "application/json"
191
- }
192
- }
193
- );
194
- return response;
195
- } catch (error) {
196
- if (axios.isAxiosError(error)) {
197
- this.normalizeError(error);
198
- }
199
- throw new Error("Failed to send keystore", { cause: error });
200
- }
201
- }
202
- /**
203
- * Requests a user's encrypted keystore from the server
204
- * @param url - The user-specific part of the url
205
- * @returns The user's encrypted keystore as base64 string
206
- */
207
- async requestEncryptedKeystore(userID, keystoreType) {
208
- try {
209
- const url = `/downloadKeystore/${userID}/${keystoreType.toString()}`;
210
- const response = await axios.get(this.baseUrl + `${url}`, {
211
- withCredentials: true,
212
- headers: {
213
- "Content-Type": "application/json"
214
- }
215
- });
216
- return response.data;
217
- } catch (error) {
218
- if (axios.isAxiosError(error)) {
219
- this.normalizeError(error);
220
- }
221
- throw new Error("Failed to retrive keystore", { cause: error });
222
- }
223
- }
224
- /**
225
- * Uploads encrypted keystore to the server
226
- *
227
- * @param encryptedKeystore - The encrypted keystore
228
- * @param type - The keystore's type
229
- * @returns Server response
230
- */
231
- async uploadKeystoreToServer(encryptedKeystore) {
232
- try {
233
- const userID = getUserID();
234
- const keystoreType = encryptedKeystore.type;
235
- const url = `/uploadKeystore/${userID}/${keystoreType}`;
236
- const ciphertextBase64 = encryptedKeystoreToBase64(encryptedKeystore);
237
- const result = await this.sendEncryptedKeystoreToServer(ciphertextBase64, url);
238
- return result;
239
- } catch (error) {
240
- throw new Error("Failed to upload keystore to the server", { cause: error });
241
- }
242
- }
243
- /**
244
- * Gets a user's encrypted keystore containing encryption keys from the server
245
- *
246
- * @returns Encrypted keystore containing encryption keys
247
- */
248
- async getEncryptionKeystoreFromServer() {
249
- return this.getKeystoreFromServer("encryption" /* ENCRYPTION */);
250
- }
251
- /**
252
- * Gets a user's encrypted Identity Keystore from the server
253
- *
254
- * @returns Encrypted Identity Keystore
255
- */
256
- async getIdentityKeystoreFromServer() {
257
- return this.getKeystoreFromServer("identity" /* IDENTITY */);
258
- }
259
- /**
260
- * Gets a user's encrypted Recovery Keystore from the server
261
- *
262
- * @returns Encrypted Recovery Keystore
263
- */
264
- async getRecoveryKeystoreFromServer() {
265
- return this.getKeystoreFromServer("recovery" /* RECOVERY */);
266
- }
267
- /**
268
- * Gets a user's encrypted Index Keystore from the server
269
- *
270
- * @returns Encrypted Index Keytore
271
- */
272
- async getIndexKeystoreFromServer() {
273
- return this.getKeystoreFromServer("index" /* INDEX */);
274
- }
275
- /**
276
- * Gets a user's encrypted keystore from the server
277
- *
278
- * @param type - The requested keystore's type
279
- * @returns Encrypted Keytore
280
- */
281
- async getKeystoreFromServer(type) {
282
- try {
283
- const userID = getUserID();
284
- const response = await this.requestEncryptedKeystore(userID, type);
285
- const result = base64ToEncryptedKeystore(response);
286
- return result;
287
- } catch (error) {
288
- throw new Error("Failed to retrieve keystore from the server", { cause: error });
289
- }
290
- }
291
- /**
292
- * Obtains recipients public keys from the server
293
- *
294
- * @param emails - The recipients' emails
295
- * @returns The list of recipients' public keys
296
- */
297
- async getRecipientsPublicKeysFromServer(emails) {
298
- try {
299
- const response = await axios.get("/api/getPublicKeys", {
300
- params: {
301
- emails
302
- },
303
- withCredentials: true,
304
- headers: {
305
- "Content-Type": "application/json"
306
- }
307
- });
308
- return response.data;
309
- } catch (error) {
310
- if (axios.isAxiosError(error)) {
311
- this.normalizeError(error);
312
- }
313
- throw new Error("Failed to retrieve public keys", { cause: error });
314
- }
315
- }
316
- /**
317
- * Obtains the recipient public keys from the server
318
- *
319
- * @param email - The recipients' emails
320
- * @returns The list of recipients' public keys
321
- */
322
- async getRecipientsPublicKeys(emails) {
323
- try {
324
- const publicKeysBase64 = await this.getRecipientsPublicKeysFromServer(emails);
325
- const result = [];
326
- for (const keyBase64 of publicKeysBase64) {
327
- const publicKeys = await base64ToPublicKey(keyBase64);
328
- result.push(publicKeys);
329
- }
330
- return result;
331
- } catch (error) {
332
- throw new Error("Failed to get recipients public keys", { cause: error });
333
- }
334
- }
335
- };
336
- function getKeyServiceAPI(baseUrl) {
337
- return new KeyServiceAPI(baseUrl);
338
- }
339
-
340
- export { KeyServiceAPI, getKeyServiceAPI };
341
- //# sourceMappingURL=keystore-service.mjs.map
342
- //# sourceMappingURL=keystore-service.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/constants.ts","../src/utils/converters.ts","../src/asymmetric-crypto/keys.ts","../src/utils/aesConverters.ts","../src/utils/keyConverters.ts","../src/storage-service/sessionStorageService.ts","../src/keystore-crypto/core.ts","../src/keystore-service/api.ts"],"names":[],"mappings":"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","file":"keystore-service.mjs","sourcesContent":["export const AES_ALGORITHM = 'AES-GCM';\nexport const AES_KEY_BIT_LENGTH = 256;\nexport const AUX_LEN = 128;\nexport const IV_LEN_BYTES = 16;\n\nexport const KEY_WRAPPING_ALGORITHM = 'AES-KW';\nexport const KEY_FORMAT = 'raw';\nexport const CONTEXT_WRAPPING = 'CRYPTO library 2025-08-22 18:10:00 key derived from ecc and kyber secrets';\n\nexport const ECC_ALGORITHM = 'X25519';\n\nexport const CONTEXT_LOGIN = 'CRYPTO library 2025-07-26 16:18:03 key for opening identity keystore';\nexport const CONTEXT_ENC_KEYSTORE = 'CRYPTO library 2025-07-30 16:18:03 key for opening encryption keys keystore';\nexport const CONTEXT_RECOVERY = 'CRYPTO library 2025-07-30 16:20:00 key for account recovery';\nexport const CONTEXT_INDEX = 'CRYPTO library 2025-07-30 17:20:00 key for protecting current search indices';\nexport const CONTEXT_DERIVE = 'CRYPTO library 2025-08-27 17:08:00 derive one key from two keys';\n\nexport const PREFIX_MEDIA_KEY_COMMITMENT = 'CRYPTO library 2025-08-26 18:29:00 prefix for commitment to media keys';\nexport const PREFIX_PUBLIC_KEY_COMMITMENT = 'CRYPTO library 2025-08-26 18:30:00 prefix for commitment to public keys';\nexport const PREFIX_IDENTITY_KEY_COMMITMENT =\n 'CRYPTO library 2025-08-26 18:45:00 prefix for commitment to identity keys';\n\n// Second recommended parameter set from RFC 9106\nexport const ARGON2ID_PARALLELISM = 3;\nexport const ARGON2ID_ITERATIONS = 4;\nexport const ARGON2ID_MEMORY_SIZE = 65536;\nexport const ARGON2ID_SALT_BYTE_LENGTH = 16;\nexport const ARGON2ID_OUTPUT_BYTE_LENGTH = 32;\n\nexport const IDENTITY_KEYSTORE_TAG = 'Identity keystore';\nexport const ENCRYPTION_KEYSTORE_TAG = 'Encryption keystore';\nexport const RECOVERY_KEYSTORE_TAG = 'Key recovery keystroe';\nexport const INDEX_KEYSTORE_TAG = 'Current encrypted indices';\n\nexport const KYBER512_PUBLIC_KEY_LENGTH = 800;\nexport const KYBER512_SECRET_KEY_LENGTH = 1632;\n\nexport const KYBER768_PUBLIC_KEY_LENGTH = 1184;\nexport const KYBER768_SECRET_KEY_LENGTH = 2400;\n\nexport const KYBER1024_PUBLIC_KEY_LENGTH = 1568;\nexport const KYBER1024_SECRET_KEY_LENGTH = 3168;\n\nexport const KYBER_SEED_LENGTH = 64;\n\nexport const HASH_BIT_LEN = 256;\n\nexport const MAX_CACHE_SIZE = 600000000; // 600 MB\nexport const MAX_EMAIL_PER_BATCH = 100;\nexport const DB_LABEL = 'email';\nexport const DB_VERSION = 1;\n","import { bytesToHex, hexToBytes } from '@noble/hashes/utils.js';\n\n/**\n * Converts a Uint8Array into a hexadecimal string.\n *\n * @param array - The Uint8Array to convert.\n * @returns The hexadecimal string representation of the array.\n */\nexport function uint8ArrayToHex(array: Uint8Array): string {\n return bytesToHex(array);\n}\n\n/**\n * Converts a UTF-8 string into a Uint8Array.\n *\n * @param str - The UTF-8 string to convert.\n * @returns A Uint8Array created from the UTF-8 string.\n */\nexport function UTF8ToUint8(str: string): Uint8Array {\n return new TextEncoder().encode(str);\n}\n\n/**\n * Converts an Uint8Array into a UTF-8 string.\n *\n * @param array - The Uint8Array to convert.\n * @returns The UTF-8 string representation of the array.\n */\nexport function uint8ToUTF8(array: Uint8Array): string {\n return new TextDecoder().decode(array);\n}\n\n/**\n * Converts a hexadecimal string into a Uint8Array.\n *\n * @param hex - The hexadecimal string to convert.\n * @returns A Uint8Array created from the hex string.\n */\nexport function hexToUint8Array(hex: string): Uint8Array {\n return hexToBytes(hex);\n}\n\n/**\n * Converts a Uint8Array into a base64 string.\n *\n * @param array - The Uint8Array to convert.\n * @returns The base64 string representation of the array.\n */\nexport function uint8ArrayToBase64(buffer: Uint8Array): string {\n const array = Uint16Array.from(buffer);\n const binaryString = new TextDecoder('UTF-16').decode(array);\n return btoa(binaryString);\n}\n\n/**\n * Converts a base64 string into a Uint8Array.\n *\n * @param str - The base64 string to convert.\n * @returns A Uint8Array created from the base64 string.\n */\nexport function base64ToUint8Array(str: string): Uint8Array {\n const binaryString = atob(str);\n const len = binaryString.length;\n const array = new Uint8Array(len);\n for (let i = 0; i < len; i++) {\n array[i] = binaryString.charCodeAt(i);\n }\n return new Uint8Array(array.buffer);\n}\n","import { ECC_ALGORITHM } from '../constants';\n\n/**\n * Generates elliptic curve key pair\n *\n * @returns The generated key pair\n */\nexport async function generateEccKeys(): Promise<CryptoKeyPair> {\n try {\n return (await crypto.subtle.generateKey(\n {\n name: ECC_ALGORITHM,\n },\n true,\n ['deriveBits'],\n )) as CryptoKeyPair;\n } catch (error) {\n throw new Error('Failed to generate elliptic curve key pair', { cause: error });\n }\n}\n\n/**\n * Converts public CryptoKey into Uint8Array using SubjectPublicKeyInfo format (RFC 5280)\n *\n * @returns The Uint8Array representation of the public key\n */\nexport async function exportPublicKey(key: CryptoKey): Promise<Uint8Array> {\n try {\n const result = await crypto.subtle.exportKey('spki', key);\n return new Uint8Array(result);\n } catch (error) {\n throw new Error('Failed to export public key', { cause: error });\n }\n}\n\n/**\n * Converts public key in SubjectPublicKeyInfo format (RFC 5280) to CryptoKey\n *\n * @returns The CryptoKey representation of the public key\n */\nexport async function importPublicKey(spkiKeyData: Uint8Array): Promise<CryptoKey> {\n try {\n return await crypto.subtle.importKey(\n 'spki',\n spkiKeyData as BufferSource,\n {\n name: ECC_ALGORITHM,\n },\n true,\n [],\n );\n } catch (error) {\n throw new Error('Failed to import public key', { cause: error });\n }\n}\n\n/**\n * Converts private key in CryptoKey to PKCS #8 format (RFC 5208)\n *\n * @returns The Uint8Array representation of the private key\n */\nexport async function exportPrivateKey(key: CryptoKey): Promise<Uint8Array> {\n try {\n const result = await crypto.subtle.exportKey('pkcs8', key);\n return new Uint8Array(result);\n } catch (error) {\n throw new Error('Failed to export private key', { cause: error });\n }\n}\n\n/**\n * Converts private key in PKCS #8 format (RFC 5208) to CryptoKey\n *\n * @returns The CryptoKey representation of the private key\n */\nexport async function importPrivateKey(pkcs8KeyData: Uint8Array): Promise<CryptoKey> {\n try {\n return await crypto.subtle.importKey(\n 'pkcs8',\n pkcs8KeyData as BufferSource,\n {\n name: ECC_ALGORITHM,\n },\n true,\n ['deriveBits'],\n );\n } catch (error) {\n throw new Error('Failed to import private key', { cause: error });\n }\n}\n","import { uint8ArrayToBase64, base64ToUint8Array } from './converters';\nimport { SymmetricCiphertext } from '../types';\n\n/**\n * Converts encrypted message to base64 string\n *\n * @param encryptedMessage - The encrypted message\n * @returns The resulting base64 string.\n */\nexport function ciphertextToBase64(encryptedMessage: SymmetricCiphertext): string {\n try {\n const ivBase64 = uint8ArrayToBase64(encryptedMessage.iv);\n const ciphertextBase64 = uint8ArrayToBase64(encryptedMessage.ciphertext);\n const json = JSON.stringify({ ciphertext: ciphertextBase64, iv: ivBase64 });\n const base64 = btoa(json);\n return base64;\n } catch (error) {\n throw new Error('Failed to convert ciphertext to base64', { cause: error });\n }\n}\n\n/**\n * Converts base64 string to encrypted message\n *\n * @param base64 - The base64 representation of the encrypted message\n * @returns The resulting encrypted message.\n */\nexport function base64ToCiphertext(base64: string): SymmetricCiphertext {\n try {\n const json = atob(base64);\n const obj = JSON.parse(json);\n const iv = base64ToUint8Array(obj.iv);\n const ciphertext = base64ToUint8Array(obj.ciphertext);\n const result: SymmetricCiphertext = {\n ciphertext,\n iv,\n };\n return result;\n } catch (error) {\n throw new Error('Failed to convert base64 to ciphertext', { cause: error });\n }\n}\n","import { uint8ArrayToBase64, base64ToUint8Array } from '.';\nimport { IdentityKeys, EncryptionKeys, EncryptedKeystore, MediaKeys, PublicKeys } from '../types';\nimport { exportPublicKey, exportPrivateKey, importPublicKey, importPrivateKey } from '../asymmetric-crypto';\nimport { base64ToCiphertext, ciphertextToBase64 } from './aesConverters';\n\n/**\n * Converts identity keys to base64\n *\n * @param keys - The identity keys\n * @returns The resulting base64 string\n */\nexport async function identityKeysToBase64(keys: IdentityKeys): Promise<string> {\n try {\n const pkArray = await exportPublicKey(keys.userPublicKey);\n const skArray = await exportPrivateKey(keys.userPrivateKey);\n const json = JSON.stringify({\n userPublicKey: uint8ArrayToBase64(pkArray),\n userPrivateKey: uint8ArrayToBase64(skArray),\n });\n const base64 = btoa(json);\n return base64;\n } catch (error) {\n throw new Error('Failed to convert identity keys to base64', { cause: error });\n }\n}\n\n/**\n * Converts encryption keys to base64\n *\n * @param keys - The encryption keys\n * @returns The resulting base64 string\n */\nexport async function encryptionKeysToBase64(keys: EncryptionKeys): Promise<string> {\n try {\n const pkArray = await exportPublicKey(keys.userPublicKey);\n const skArray = await exportPrivateKey(keys.userPrivateKey);\n const json = JSON.stringify({\n userPublicKey: uint8ArrayToBase64(pkArray),\n userPrivateKey: uint8ArrayToBase64(skArray),\n userPublicKyberKey: uint8ArrayToBase64(keys.userPublicKyberKey),\n userPrivateKyberKey: uint8ArrayToBase64(keys.userPrivateKyberKey),\n });\n const base64 = btoa(json);\n return base64;\n } catch (error) {\n throw new Error('Failed to convert identity keys to base64', { cause: error });\n }\n}\n\n/**\n * Converts encrypted keystore to base64\n *\n * @param keystore - The encrypted keystore\n * @returns The resulting base64 string\n */\nexport function encryptedKeystoreToBase64(keystore: EncryptedKeystore): string {\n try {\n const ciphertext = ciphertextToBase64(keystore.encryptedKeys);\n const json = JSON.stringify({\n userID: keystore.userID,\n type: keystore.type.toString(),\n encryptedKeys: ciphertext,\n });\n const base64 = btoa(json);\n return base64;\n } catch (error) {\n throw new Error('Failed to convert encrypted keystore to base64', { cause: error });\n }\n}\n\n/**\n * Converts base64 to identity keys\n *\n * @param base64 - The base64 input\n * @returns The resulting idenity keys\n */\nexport async function base64ToIdentityKeys(base64: string): Promise<IdentityKeys> {\n try {\n const json = atob(base64);\n const obj = JSON.parse(json);\n const pkArray = base64ToUint8Array(obj.userPublicKey);\n const skArray = base64ToUint8Array(obj.userPrivateKey);\n const pkCryptoKey = await importPublicKey(pkArray);\n const skCryptoKey = await importPrivateKey(skArray);\n const result: IdentityKeys = {\n userPublicKey: pkCryptoKey,\n userPrivateKey: skCryptoKey,\n };\n return result;\n } catch (error) {\n throw new Error('Failed convert base64 to idenity key', { cause: error });\n }\n}\n\n/**\n * Converts base64 to encryption keys\n *\n * @param base64 - The base64 input\n * @returns The resulting encryption keys\n */\nexport async function base64ToEncryptionKeys(base64: string): Promise<EncryptionKeys> {\n try {\n const json = atob(base64);\n const obj = JSON.parse(json);\n const pkArray = base64ToUint8Array(obj.userPublicKey);\n const skArray = base64ToUint8Array(obj.userPrivateKey);\n const pkCryptoKey = await importPublicKey(pkArray);\n const skCryptoKey = await importPrivateKey(skArray);\n const pkKyber = base64ToUint8Array(obj.userPublicKyberKey);\n const skKyber = base64ToUint8Array(obj.userPrivateKyberKey);\n const result: EncryptionKeys = {\n userPublicKey: pkCryptoKey,\n userPrivateKey: skCryptoKey,\n userPublicKyberKey: pkKyber,\n userPrivateKyberKey: skKyber,\n };\n return result;\n } catch (error) {\n throw new Error('Failed to convert base64 to encryption key', { cause: error });\n }\n}\n\n/**\n * Converts base64 to encrypted keystore\n *\n * @param base64 - The base64 input\n * @returns The resulting encrypted keystore\n */\nexport function base64ToEncryptedKeystore(base64: string): EncryptedKeystore {\n try {\n const json = atob(base64);\n const obj = JSON.parse(json);\n const ciphertext = base64ToCiphertext(obj.encryptedKeys);\n const result: EncryptedKeystore = {\n userID: obj.userID,\n type: obj.type,\n encryptedKeys: ciphertext,\n };\n return result;\n } catch (error) {\n throw new Error('Failed to convert base64 to encrypted keystore', { cause: error });\n }\n}\n\n/**\n * Converts media keys to base64\n *\n * @param keys - The media keys\n * @returns The resulting base64 string\n */\nexport function mediaKeysToBase64(keys: MediaKeys): string {\n try {\n const json = JSON.stringify({\n olmKey: uint8ArrayToBase64(keys.olmKey),\n pqKey: uint8ArrayToBase64(keys.pqKey),\n index: keys.index.toString(),\n userID: keys.userID,\n });\n const base64 = btoa(json);\n return base64;\n } catch (error) {\n throw new Error('Failed to convert media keys to base64', { cause: error });\n }\n}\n\n/**\n * Converts base64 to media keys\n *\n * @param base64 - The base64 input\n * @returns The resulting media keys\n */\nexport async function base64ToMediaKeys(base64: string): Promise<MediaKeys> {\n try {\n const json = atob(base64);\n const obj = JSON.parse(json);\n\n const result: MediaKeys = {\n olmKey: base64ToUint8Array(obj.olmKey),\n pqKey: base64ToUint8Array(obj.pqKey),\n index: Number(obj.index),\n userID: obj.userID,\n };\n return result;\n } catch (error) {\n throw new Error('Failed convert base64 to media keys', { cause: error });\n }\n}\n\n/**\n * Converts a base64 string into PublicKeys type.\n *\n * @param base64 - The base64 representation of the public key.\n * @returns The resulting PublicKeys.\n */\nexport async function base64ToPublicKey(base64: string): Promise<PublicKeys> {\n try {\n const json = atob(base64);\n const obj = JSON.parse(json);\n const eccPublicKeyBytes = base64ToUint8Array(obj.eccPublicKey);\n const eccPublicKey = await importPublicKey(eccPublicKeyBytes);\n const kyberPublicKey = base64ToUint8Array(obj.kyberPublicKey);\n return {\n eccPublicKey: eccPublicKey,\n kyberPublicKey: kyberPublicKey,\n };\n } catch (error) {\n throw new Error('Failed to convert base64 to PublicKeys', { cause: error });\n }\n}\n\n/**\n * Converts a PublicKeys type into base64 string.\n *\n * @param key - The PublicKeys key.\n * @returns The resulting base64 string.\n */\nexport async function publicKeyToBase64(key: PublicKeys): Promise<string> {\n try {\n const eccPublicKeyArray = await exportPublicKey(key.eccPublicKey);\n const json = JSON.stringify({\n eccPublicKey: uint8ArrayToBase64(eccPublicKeyArray),\n kyberPublicKey: uint8ArrayToBase64(key.kyberPublicKey),\n });\n const base64 = btoa(json);\n return base64;\n } catch (error) {\n throw new Error('Failed to convert key of the type PublicKeys to base64', { cause: error });\n }\n}\n","function get(key: string): string | null {\n return sessionStorage.getItem(key);\n}\n\nfunction set(key: string, value: string): void {\n return sessionStorage.setItem(key, value);\n}\n\nfunction removeItem(key: string): void {\n sessionStorage.removeItem(key);\n}\n\nfunction exists(key: string): boolean {\n return !!sessionStorage.getItem(key);\n}\n\nfunction clear(): void {\n sessionStorage.clear();\n}\n\nconst sessionStorageService = {\n set,\n get,\n removeItem,\n exists,\n clear,\n};\n\nexport default sessionStorageService;\n\nexport interface SessionStorageService {\n set: (key: string, value: string) => void;\n get: (key: string) => string | null;\n removeItem: (key: string) => void;\n exists: (key: string) => boolean;\n clear: () => void;\n}\n","import { encryptSymmetrically, decryptSymmetrically } from '../symmetric-crypto';\nimport { base64ToUint8Array, uint8ArrayToBase64 } from '../utils';\nimport { SymmetricCiphertext } from '../types';\nimport sessionStorageService from '../storage-service/sessionStorageService';\nimport { deriveSymmetricCryptoKeyFromContext } from '../derive-key';\nimport { CONTEXT_LOGIN, CONTEXT_ENC_KEYSTORE, AES_KEY_BIT_LENGTH, CONTEXT_RECOVERY } from '../constants';\nimport { getBytesFromString } from '../hash';\n\n/**\n * Encrypts the keystore content using symmetric encryption\n *\n * @param secretKey - The symmetric key to encrypt the keystore content\n * @param content - The content of the keystore\n * @param userID - The ID of the user\n * @param tag - The keystore type-specific tag string\n * @returns The encrypted keystore content\n */\nexport async function encryptKeystoreContent(\n secretKey: CryptoKey,\n content: string,\n userID: string,\n tag: string,\n): Promise<SymmetricCiphertext> {\n try {\n const aux = userID + tag;\n const message = base64ToUint8Array(content);\n const result = await encryptSymmetrically(secretKey, message, aux);\n return result;\n } catch (error) {\n throw new Error('Failed to encrypt keystore content', { cause: error });\n }\n}\n\n/**\n * Decrypts the keystore content using symmetric encryption\n *\n * @param secretKey - The symmetric key to decrypt the keystore content\n * @param encryptedKeys - The encrypted keystore content\n * @param userID - The ID of the user\n * @param tag - The keystore type-specific tag string\n * @returns The decrypted keystore content\n */\nexport async function decryptKeystoreContent(\n secretKey: CryptoKey,\n encryptedKeys: SymmetricCiphertext,\n userID: string,\n tag: string,\n): Promise<string> {\n try {\n const aux = userID + tag;\n const content = await decryptSymmetrically(secretKey, encryptedKeys, aux);\n const result = uint8ArrayToBase64(content);\n return result;\n } catch (error) {\n throw new Error('Failed to decrypt keystore content', { cause: error });\n }\n}\n\n/**\n * Gets User ID from the session storage\n *\n * @returns The ID of the user\n */\nexport function getUserID(): string {\n try {\n const userID = sessionStorageService.get('userID');\n if (!userID) {\n throw new Error('No UserID');\n }\n return userID;\n } catch (error) {\n throw new Error('Failed to get UserID from session storage', { cause: error });\n }\n}\n\n/**\n * Gets user's base key from the session storage\n *\n * @returns The user's base key\n */\nexport function getBaseKey(): Uint8Array {\n try {\n const baseKeyBase64 = sessionStorageService.get('baseKey');\n if (!baseKeyBase64) {\n throw new Error('No base key');\n }\n return base64ToUint8Array(baseKeyBase64);\n } catch (error) {\n throw new Error('Failed to get base key from session storage', { cause: error });\n }\n}\n\n/**\n * Derives a secret key for protecting the idenity keystore\n *\n * @param baseKey - The base secret key from which a new key secret will be derived\n * @returns The derived secret key for protecting the idenity keystore\n */\nexport async function deriveIdentityKeystoreKey(baseKey: Uint8Array): Promise<CryptoKey> {\n return deriveSymmetricCryptoKeyFromContext(CONTEXT_LOGIN, baseKey);\n}\n\n/**\n * Derives a secret key for protecting the recovery keystore\n *\n * @param recoveryCodes - The recovery codes\n * @returns The derived secret key for protecting the recovery keystore\n */\nexport async function deriveRecoveryKey(recoveryCodes: string): Promise<CryptoKey> {\n const recoveryCodesBuffer = await getBytesFromString(AES_KEY_BIT_LENGTH / 8, recoveryCodes);\n return deriveSymmetricCryptoKeyFromContext(CONTEXT_RECOVERY, recoveryCodesBuffer);\n}\n\n/**\n * Derives a secret key for protecting the encryption keystore\n * \n * @param baseKey - The base secret key from which a new key secret will be derived\n * @returns The derived secret key for protecting the encryption keystore\n\n*/\nexport async function deriveEncryptionKeystoreKey(baseKey: Uint8Array): Promise<CryptoKey> {\n return deriveSymmetricCryptoKeyFromContext(CONTEXT_ENC_KEYSTORE, baseKey);\n}\n","import axios, { AxiosResponse, AxiosError } from 'axios';\nimport { KeystoreType, EncryptedKeystore, PublicKeys } from '../types';\nimport { getUserID } from '../keystore-crypto/core';\nimport { base64ToEncryptedKeystore, encryptedKeystoreToBase64, base64ToPublicKey } from '../utils';\n\nexport class KeyServiceAPI {\n private readonly baseUrl: string;\n\n constructor(baseUrl: string) {\n this.baseUrl = baseUrl;\n }\n\n /**\n * Converts the specific client error into a proprietary error for our apps\n * @param error\n * @private\n */\n private normalizeError(error: AxiosError) {\n let errorMessage: string;\n if (error.response?.status === 401) {\n errorMessage = 'Unauthorized: Invalid or expired token';\n } else if (error.response?.status === 403) {\n errorMessage = 'Forbidden: Insufficient permissions';\n } else if (error.response?.status === 404) {\n errorMessage = 'Keystore not found for the specified user';\n } else {\n errorMessage = 'AxiosError:' + (error.message ?? 'Unknown error');\n }\n\n throw new Error(errorMessage);\n }\n\n /**\n * Sends a user's encrypted keystore to the server\n * @param keystore - The encrypted keystore\n * @param url - The user specific part of the url\n * @returns Server response\n */\n async sendEncryptedKeystoreToServer(encryptedKeystore: string, url: string): Promise<AxiosResponse> {\n try {\n const response = await axios.post(\n this.baseUrl + `${url}`,\n { encryptedKeystore },\n {\n withCredentials: true,\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n );\n return response;\n } catch (error) {\n if (axios.isAxiosError(error)) {\n this.normalizeError(error);\n }\n throw new Error('Failed to send keystore', { cause: error });\n }\n }\n\n /**\n * Requests a user's encrypted keystore from the server\n * @param url - The user-specific part of the url\n * @returns The user's encrypted keystore as base64 string\n */\n async requestEncryptedKeystore(userID: string, keystoreType: KeystoreType): Promise<string> {\n try {\n const url = `/downloadKeystore/${userID}/${keystoreType.toString()}`;\n const response = await axios.get<string>(this.baseUrl + `${url}`, {\n withCredentials: true,\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n return response.data;\n } catch (error) {\n if (axios.isAxiosError(error)) {\n this.normalizeError(error);\n }\n\n throw new Error('Failed to retrive keystore', { cause: error });\n }\n }\n\n /**\n * Uploads encrypted keystore to the server\n *\n * @param encryptedKeystore - The encrypted keystore\n * @param type - The keystore's type\n * @returns Server response\n */\n async uploadKeystoreToServer(encryptedKeystore: EncryptedKeystore): Promise<AxiosResponse> {\n try {\n const userID = getUserID();\n const keystoreType = encryptedKeystore.type;\n const url = `/uploadKeystore/${userID}/${keystoreType}`;\n const ciphertextBase64 = encryptedKeystoreToBase64(encryptedKeystore);\n const result = await this.sendEncryptedKeystoreToServer(ciphertextBase64, url);\n return result;\n } catch (error) {\n throw new Error('Failed to upload keystore to the server', { cause: error });\n }\n }\n\n /**\n * Gets a user's encrypted keystore containing encryption keys from the server\n *\n * @returns Encrypted keystore containing encryption keys\n */\n async getEncryptionKeystoreFromServer(): Promise<EncryptedKeystore> {\n return this.getKeystoreFromServer(KeystoreType.ENCRYPTION);\n }\n\n /**\n * Gets a user's encrypted Identity Keystore from the server\n *\n * @returns Encrypted Identity Keystore\n */\n async getIdentityKeystoreFromServer(): Promise<EncryptedKeystore> {\n return this.getKeystoreFromServer(KeystoreType.IDENTITY);\n }\n\n /**\n * Gets a user's encrypted Recovery Keystore from the server\n *\n * @returns Encrypted Recovery Keystore\n */\n async getRecoveryKeystoreFromServer(): Promise<EncryptedKeystore> {\n return this.getKeystoreFromServer(KeystoreType.RECOVERY);\n }\n\n /**\n * Gets a user's encrypted Index Keystore from the server\n *\n * @returns Encrypted Index Keytore\n */\n async getIndexKeystoreFromServer(): Promise<EncryptedKeystore> {\n return this.getKeystoreFromServer(KeystoreType.INDEX);\n }\n\n /**\n * Gets a user's encrypted keystore from the server\n *\n * @param type - The requested keystore's type\n * @returns Encrypted Keytore\n */\n async getKeystoreFromServer(type: KeystoreType): Promise<EncryptedKeystore> {\n try {\n const userID = getUserID();\n const response = await this.requestEncryptedKeystore(userID, type);\n const result = base64ToEncryptedKeystore(response);\n return result;\n } catch (error) {\n throw new Error('Failed to retrieve keystore from the server', { cause: error });\n }\n }\n /**\n * Obtains recipients public keys from the server\n *\n * @param emails - The recipients' emails\n * @returns The list of recipients' public keys\n */\n async getRecipientsPublicKeysFromServer(emails: string[]): Promise<string[]> {\n try {\n const response = await axios.get<string[]>('/api/getPublicKeys', {\n params: {\n emails: emails,\n },\n withCredentials: true,\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n return response.data;\n } catch (error) {\n if (axios.isAxiosError(error)) {\n this.normalizeError(error);\n }\n throw new Error('Failed to retrieve public keys', { cause: error });\n }\n }\n\n /**\n * Obtains the recipient public keys from the server\n *\n * @param email - The recipients' emails\n * @returns The list of recipients' public keys\n */\n async getRecipientsPublicKeys(emails: string[]): Promise<PublicKeys[]> {\n try {\n const publicKeysBase64: string[] = await this.getRecipientsPublicKeysFromServer(emails);\n const result: PublicKeys[] = [];\n for (const keyBase64 of publicKeysBase64) {\n const publicKeys = await base64ToPublicKey(keyBase64);\n result.push(publicKeys);\n }\n return result;\n } catch (error) {\n throw new Error('Failed to get recipients public keys', { cause: error });\n }\n }\n}\n\nexport function getKeyServiceAPI(baseUrl: string): KeyServiceAPI {\n return new KeyServiceAPI(baseUrl);\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/post-quantum-crypto/kyber768.ts","../src/post-quantum-crypto/kyber512.ts","../src/post-quantum-crypto/kyber1024.ts"],"names":["ml_kem768","decapsulateKyber","encapsulateKyber","generateKyberKeys","ml_kem512","ml_kem1024"],"mappings":"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","file":"post-quantum-crypto.js","sourcesContent":["import { ml_kem768 } from '@noble/post-quantum/ml-kem.js';\n\n/**\n * Generates public and secret Kyber keys\n *\n * @param seed - The optional seed\n * @returns The generated Kyber key pair.\n */\nexport function generateKyberKeys(seed?: Uint8Array): {\n publicKey: Uint8Array;\n secretKey: Uint8Array;\n} {\n try {\n return ml_kem768.keygen(seed);\n } catch (error) {\n throw new Error('Failed to generate Kyber keys', { cause: error });\n }\n}\n\n/**\n * Generates a shared secret of 256-bits and encapsulates it to the given public key using Kyber algorithms\n *\n * @param publicKey - The public Kyber key\n * @returns The resulting encapsulation and the generated shared secret.\n */\nexport function encapsulateKyber(publicKey: Uint8Array): {\n cipherText: Uint8Array;\n sharedSecret: Uint8Array;\n} {\n try {\n return ml_kem768.encapsulate(publicKey);\n } catch (error) {\n throw new Error('Failed to encapsulate', { cause: error });\n }\n}\n\n/**\n * Decapsulates the encapsulated shared secret using Kyber algorithms\n *\n * @param cipherText - The encapsulated key\n * @param secretKey - The private Kyber key\n * @returns The resulting decapsulated shared secret.\n */\nexport function decapsulateKyber(cipherText: Uint8Array, secretKey: Uint8Array): Uint8Array {\n try {\n return ml_kem768.decapsulate(cipherText, secretKey);\n } catch (error) {\n throw new Error('Failed to decapsulate', { cause: error });\n }\n}\n","import { ml_kem512 } from '@noble/post-quantum/ml-kem.js';\n\n/**\n * Generates public and secret Kyber keys\n *\n * @param seed - The optional seed\n * @returns The generated Kyber key pair.\n */\nexport function generateKyberKeys(seed?: Uint8Array): {\n publicKey: Uint8Array;\n secretKey: Uint8Array;\n} {\n try {\n return ml_kem512.keygen(seed);\n } catch (error) {\n throw new Error('Failed to generate Kyber keys', { cause: error });\n }\n}\n\n/**\n * Generates a shared secret of 256-bits and encapsulates it to the given public key using Kyber algorithms\n *\n * @param publicKey - The public Kyber key\n * @returns The resulting encapsulation and the generated shared secret.\n */\nexport function encapsulateKyber(publicKey: Uint8Array): {\n cipherText: Uint8Array;\n sharedSecret: Uint8Array;\n} {\n try {\n return ml_kem512.encapsulate(publicKey);\n } catch (error) {\n throw new Error('Failed to encapsulate', { cause: error });\n }\n}\n\n/**\n * Decapsulates the encapsulated shared secret using Kyber algorithms\n *\n * @param cipherText - The encapsulated key\n * @param secretKey - The private Kyber key\n * @returns The resulting decapsulated shared secret.\n */\nexport function decapsulateKyber(cipherText: Uint8Array, secretKey: Uint8Array): Uint8Array {\n try {\n return ml_kem512.decapsulate(cipherText, secretKey);\n } catch (error) {\n throw new Error('Failed to decapsulate', { cause: error });\n }\n}\n","import { ml_kem1024 } from '@noble/post-quantum/ml-kem.js';\n\n/**\n * Generates public and secret Kyber keys\n *\n * @param seed - The optional seed\n * @returns The generated Kyber key pair.\n */\nexport function generateKyberKeys(seed?: Uint8Array): {\n publicKey: Uint8Array;\n secretKey: Uint8Array;\n} {\n try {\n return ml_kem1024.keygen(seed);\n } catch (error) {\n throw new Error('Failed to generate Kyber keys', { cause: error });\n }\n}\n\n/**\n * Generates a shared secret of 256-bits and encapsulates it to the given public key using Kyber algorithms\n *\n * @param publicKey - The public Kyber key\n * @returns The resulting encapsulation and the generated shared secret.\n */\nexport function encapsulateKyber(publicKey: Uint8Array): {\n cipherText: Uint8Array;\n sharedSecret: Uint8Array;\n} {\n try {\n return ml_kem1024.encapsulate(publicKey);\n } catch (error) {\n throw new Error('Failed to encapsulate', { cause: error });\n }\n}\n\n/**\n * Decapsulates the encapsulated shared secret using Kyber algorithms\n *\n * @param cipherText - The encapsulated key\n * @param secretKey - The private Kyber key\n * @returns The resulting decapsulated shared secret.\n */\nexport function decapsulateKyber(cipherText: Uint8Array, secretKey: Uint8Array): Uint8Array {\n try {\n return ml_kem1024.decapsulate(cipherText, secretKey);\n } catch (error) {\n throw new Error('Failed to decapsulate', { cause: error });\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/post-quantum-crypto/kyber768.ts","../src/post-quantum-crypto/kyber512.ts","../src/post-quantum-crypto/kyber1024.ts"],"names":["decapsulateKyber","encapsulateKyber","generateKyberKeys"],"mappings":"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","file":"post-quantum-crypto.mjs","sourcesContent":["import { ml_kem768 } from '@noble/post-quantum/ml-kem.js';\n\n/**\n * Generates public and secret Kyber keys\n *\n * @param seed - The optional seed\n * @returns The generated Kyber key pair.\n */\nexport function generateKyberKeys(seed?: Uint8Array): {\n publicKey: Uint8Array;\n secretKey: Uint8Array;\n} {\n try {\n return ml_kem768.keygen(seed);\n } catch (error) {\n throw new Error('Failed to generate Kyber keys', { cause: error });\n }\n}\n\n/**\n * Generates a shared secret of 256-bits and encapsulates it to the given public key using Kyber algorithms\n *\n * @param publicKey - The public Kyber key\n * @returns The resulting encapsulation and the generated shared secret.\n */\nexport function encapsulateKyber(publicKey: Uint8Array): {\n cipherText: Uint8Array;\n sharedSecret: Uint8Array;\n} {\n try {\n return ml_kem768.encapsulate(publicKey);\n } catch (error) {\n throw new Error('Failed to encapsulate', { cause: error });\n }\n}\n\n/**\n * Decapsulates the encapsulated shared secret using Kyber algorithms\n *\n * @param cipherText - The encapsulated key\n * @param secretKey - The private Kyber key\n * @returns The resulting decapsulated shared secret.\n */\nexport function decapsulateKyber(cipherText: Uint8Array, secretKey: Uint8Array): Uint8Array {\n try {\n return ml_kem768.decapsulate(cipherText, secretKey);\n } catch (error) {\n throw new Error('Failed to decapsulate', { cause: error });\n }\n}\n","import { ml_kem512 } from '@noble/post-quantum/ml-kem.js';\n\n/**\n * Generates public and secret Kyber keys\n *\n * @param seed - The optional seed\n * @returns The generated Kyber key pair.\n */\nexport function generateKyberKeys(seed?: Uint8Array): {\n publicKey: Uint8Array;\n secretKey: Uint8Array;\n} {\n try {\n return ml_kem512.keygen(seed);\n } catch (error) {\n throw new Error('Failed to generate Kyber keys', { cause: error });\n }\n}\n\n/**\n * Generates a shared secret of 256-bits and encapsulates it to the given public key using Kyber algorithms\n *\n * @param publicKey - The public Kyber key\n * @returns The resulting encapsulation and the generated shared secret.\n */\nexport function encapsulateKyber(publicKey: Uint8Array): {\n cipherText: Uint8Array;\n sharedSecret: Uint8Array;\n} {\n try {\n return ml_kem512.encapsulate(publicKey);\n } catch (error) {\n throw new Error('Failed to encapsulate', { cause: error });\n }\n}\n\n/**\n * Decapsulates the encapsulated shared secret using Kyber algorithms\n *\n * @param cipherText - The encapsulated key\n * @param secretKey - The private Kyber key\n * @returns The resulting decapsulated shared secret.\n */\nexport function decapsulateKyber(cipherText: Uint8Array, secretKey: Uint8Array): Uint8Array {\n try {\n return ml_kem512.decapsulate(cipherText, secretKey);\n } catch (error) {\n throw new Error('Failed to decapsulate', { cause: error });\n }\n}\n","import { ml_kem1024 } from '@noble/post-quantum/ml-kem.js';\n\n/**\n * Generates public and secret Kyber keys\n *\n * @param seed - The optional seed\n * @returns The generated Kyber key pair.\n */\nexport function generateKyberKeys(seed?: Uint8Array): {\n publicKey: Uint8Array;\n secretKey: Uint8Array;\n} {\n try {\n return ml_kem1024.keygen(seed);\n } catch (error) {\n throw new Error('Failed to generate Kyber keys', { cause: error });\n }\n}\n\n/**\n * Generates a shared secret of 256-bits and encapsulates it to the given public key using Kyber algorithms\n *\n * @param publicKey - The public Kyber key\n * @returns The resulting encapsulation and the generated shared secret.\n */\nexport function encapsulateKyber(publicKey: Uint8Array): {\n cipherText: Uint8Array;\n sharedSecret: Uint8Array;\n} {\n try {\n return ml_kem1024.encapsulate(publicKey);\n } catch (error) {\n throw new Error('Failed to encapsulate', { cause: error });\n }\n}\n\n/**\n * Decapsulates the encapsulated shared secret using Kyber algorithms\n *\n * @param cipherText - The encapsulated key\n * @param secretKey - The private Kyber key\n * @returns The resulting decapsulated shared secret.\n */\nexport function decapsulateKyber(cipherText: Uint8Array, secretKey: Uint8Array): Uint8Array {\n try {\n return ml_kem1024.decapsulate(cipherText, secretKey);\n } catch (error) {\n throw new Error('Failed to decapsulate', { cause: error });\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/constants.ts","../src/hash/blake3.ts","../src/symmetric-crypto/keys.ts","../src/symmetric-crypto/core.ts","../src/symmetric-crypto/aes.ts"],"names":["blake3","utf8ToBytes","randomBytes"],"mappings":"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","file":"symmetric-crypto.js","sourcesContent":["export const AES_ALGORITHM = 'AES-GCM';\nexport const AES_KEY_BIT_LENGTH = 256;\nexport const AUX_LEN = 128;\nexport const IV_LEN_BYTES = 16;\n\nexport const KEY_WRAPPING_ALGORITHM = 'AES-KW';\nexport const KEY_FORMAT = 'raw';\nexport const CONTEXT_WRAPPING = 'CRYPTO library 2025-08-22 18:10:00 key derived from ecc and kyber secrets';\n\nexport const ECC_ALGORITHM = 'X25519';\n\nexport const CONTEXT_LOGIN = 'CRYPTO library 2025-07-26 16:18:03 key for opening identity keystore';\nexport const CONTEXT_ENC_KEYSTORE = 'CRYPTO library 2025-07-30 16:18:03 key for opening encryption keys keystore';\nexport const CONTEXT_RECOVERY = 'CRYPTO library 2025-07-30 16:20:00 key for account recovery';\nexport const CONTEXT_INDEX = 'CRYPTO library 2025-07-30 17:20:00 key for protecting current search indices';\nexport const CONTEXT_DERIVE = 'CRYPTO library 2025-08-27 17:08:00 derive one key from two keys';\n\nexport const PREFIX_MEDIA_KEY_COMMITMENT = 'CRYPTO library 2025-08-26 18:29:00 prefix for commitment to media keys';\nexport const PREFIX_PUBLIC_KEY_COMMITMENT = 'CRYPTO library 2025-08-26 18:30:00 prefix for commitment to public keys';\nexport const PREFIX_IDENTITY_KEY_COMMITMENT =\n 'CRYPTO library 2025-08-26 18:45:00 prefix for commitment to identity keys';\n\n// Second recommended parameter set from RFC 9106\nexport const ARGON2ID_PARALLELISM = 3;\nexport const ARGON2ID_ITERATIONS = 4;\nexport const ARGON2ID_MEMORY_SIZE = 65536;\nexport const ARGON2ID_SALT_BYTE_LENGTH = 16;\nexport const ARGON2ID_OUTPUT_BYTE_LENGTH = 32;\n\nexport const IDENTITY_KEYSTORE_TAG = 'Identity keystore';\nexport const ENCRYPTION_KEYSTORE_TAG = 'Encryption keystore';\nexport const RECOVERY_KEYSTORE_TAG = 'Key recovery keystroe';\nexport const INDEX_KEYSTORE_TAG = 'Current encrypted indices';\n\nexport const KYBER512_PUBLIC_KEY_LENGTH = 800;\nexport const KYBER512_SECRET_KEY_LENGTH = 1632;\n\nexport const KYBER768_PUBLIC_KEY_LENGTH = 1184;\nexport const KYBER768_SECRET_KEY_LENGTH = 2400;\n\nexport const KYBER1024_PUBLIC_KEY_LENGTH = 1568;\nexport const KYBER1024_SECRET_KEY_LENGTH = 3168;\n\nexport const KYBER_SEED_LENGTH = 64;\n\nexport const HASH_BIT_LEN = 256;\n\nexport const MAX_CACHE_SIZE = 600000000; // 600 MB\nexport const MAX_EMAIL_PER_BATCH = 100;\nexport const DB_LABEL = 'email';\nexport const DB_VERSION = 1;\n","import { blake3 } from '@noble/hashes/blake3.js';\nimport { utf8ToBytes, bytesToHex } from '@noble/hashes/utils.js';\n\n/**\n * Hashes the given array of data\n *\n * @param data - The data to hash\n * @returns The resulting hash array\n */\nexport function hashData(data: Uint8Array[]): Uint8Array {\n try {\n const hasher = blake3.create();\n for (const d of data) {\n hasher.update(d);\n }\n return hasher.digest();\n } catch (error) {\n throw new Error('Failed to compute hash', { cause: error });\n }\n}\n\nexport function keyedHashHex(hashKey: Uint8Array, data: Uint8Array[]): string {\n try {\n const hash = keyedHash(hashKey, data);\n return bytesToHex(hash);\n } catch (error) {\n throw new Error('Failed to compute hash hex', { cause: error });\n }\n}\n\nexport function keyedHash(hashKey: Uint8Array, data: Uint8Array[]): Uint8Array {\n try {\n const hasher = blake3.create({ key: hashKey });\n for (const d of data) {\n hasher.update(d);\n }\n return hasher.digest();\n } catch (error) {\n throw new Error('Failed to compute hash', { cause: error });\n }\n}\n\n/**\n * Hashes the given array of data\n *\n * @param data - The data to hash\n * @returns The resulting hash hex string\n */\nexport function hashDataHex(data: Uint8Array[]): string {\n try {\n const hash = hashData(data);\n return bytesToHex(hash);\n } catch (error) {\n throw new Error('Failed to compute hash', { cause: error });\n }\n}\n\n/**\n * Hashes the given array of data using blake3 algorithm\n *\n * @param bytes - The desired output byte-length\n * @param data - The data to hash\n * @returns The resulting hash value\n */\nexport function getBytesFromData(bytes: number, data: Uint8Array[]): Uint8Array {\n try {\n const hasher = blake3.create({ dkLen: bytes });\n for (const chunk of data) {\n hasher.update(chunk);\n }\n return hasher.digest();\n } catch (error) {\n throw new Error('Failed to get bytes from data', { cause: error });\n }\n}\n\n/**\n * Hashes the given array of data using blake3 algorithm\n *\n * @param bytes - The desired output byte-length\n * @param data - The data to hash\n * @returns The resulting hash value\n */\nexport function getBytesFromDataHex(bytes: number, data: Uint8Array[]): string {\n try {\n const hash = getBytesFromData(bytes, data);\n return bytesToHex(hash);\n } catch (error) {\n throw new Error('Failed to get bytes from data', { cause: error });\n }\n}\n\n/**\n * Hashes the given string using blake3 algorithm\n *\n * @param bytes - The desired output byte-length\n * @param value - The string to hash\n * @returns The resulting hash value\n */\nexport function getBytesFromString(bytes: number, value: string): Uint8Array {\n return blake3(utf8ToBytes(value), { dkLen: bytes });\n}\n\n/**\n * Hashes the given string using blake3 algorithm\n *\n * @param bytes - The desired output byte-length\n * @param value - The string to hash\n * @returns The resulting hash value\n */\nexport function getBytesFromStrinHex(bytes: number, value: string): string {\n return bytesToHex(getBytesFromString(bytes, value));\n}\n","import { AES_ALGORITHM, AES_KEY_BIT_LENGTH, KEY_FORMAT } from '../constants';\nimport { getBytesFromString } from '../hash';\n\n/**\n * Converts Uint8Array into CryptoKey\n *\n * @param keyData - The Uint8Array representation of the symmetric key\n * @returns The resulting symmetric CryptoKey.\n */\nexport async function importSymmetricCryptoKey(keyData: Uint8Array | ArrayBuffer): Promise<CryptoKey> {\n return crypto.subtle.importKey(\n KEY_FORMAT,\n new Uint8Array(keyData),\n {\n name: AES_ALGORITHM,\n length: AES_KEY_BIT_LENGTH,\n },\n true,\n ['encrypt', 'decrypt'],\n );\n}\n\n/**\n * Converts CryptoKey into Uint8Array\n *\n * @param key - The symmetric CryptoKey\n * @returns The resulting Uint8Array.\n */\nexport async function exportSymmetricCryptoKey(key: CryptoKey): Promise<Uint8Array> {\n try {\n const rawKey = await crypto.subtle.exportKey(KEY_FORMAT, key);\n return new Uint8Array(rawKey);\n } catch (error) {\n throw new Error('Failed to export symmetric CryptoKey', { cause: error });\n }\n}\n\n/**\n * Generates symmetric CryptoKey\n *\n * @returns The generated CryptoKey.\n */\nexport async function genSymmetricCryptoKey(): Promise<CryptoKey> {\n return crypto.subtle.generateKey(\n {\n name: AES_ALGORITHM,\n length: AES_KEY_BIT_LENGTH,\n },\n true,\n ['encrypt', 'decrypt'],\n );\n}\n\n/**\n * Generates symmetric key as Uint8Array\n *\n * @returns The generated Uint8Array.\n */\nexport function genSymmetricKey(): Uint8Array {\n try {\n const key = new Uint8Array(AES_KEY_BIT_LENGTH / 8);\n crypto.getRandomValues(key);\n return key;\n } catch (error) {\n throw new Error('Failed to generate symmetric key', { cause: error });\n }\n}\n\n/**\n * Derives CryptoKey from the given key material\n *\n * @returns The derived CryptoKey.\n */\nexport async function deriveSymmetricCryptoKey(keyMaterial: string): Promise<CryptoKey> {\n try {\n const hashBuffer = await getBytesFromString(AES_KEY_BIT_LENGTH / 8, keyMaterial);\n return importSymmetricCryptoKey(hashBuffer);\n } catch (error) {\n throw new Error('Failed to derive CryptoKey from the given key material', { cause: error });\n }\n}\n","import { randomBytes } from '@noble/post-quantum/utils.js';\nimport { getBytesFromString } from '../hash';\nimport { AUX_LEN, AES_ALGORITHM, IV_LEN_BYTES } from '../constants';\n\n/**\n * Creates an initialization vector (IV) using RGB-based construction (8.2.2 NIST Special Publication 800-38D)\n * Constructs a 128-bits IV from 2 fileds: the random field (at least 96 bits) and the free field (32 bits).\n * If free filed is empty, then the entier 128-bit IV is sampled randomly.\n *\n * @param freeFiled - The string with an unrestricted content. Can be a device identifier, etc.\n * @returns The resulting 128-bits initialization vector.\n */\nexport async function createNISTbasedIV(freeField?: string): Promise<Uint8Array> {\n try {\n if (!freeField) {\n return randomBytes(IV_LEN_BYTES);\n }\n\n const iv = new Uint8Array(16);\n\n const randFiled = randomBytes(12);\n iv.set(randFiled, 0);\n\n const freeFiledFixedLength = await getBytesFromString(4, freeField);\n iv.set(freeFiledFixedLength, 12);\n\n return iv;\n } catch (error) {\n throw new Error('Failed to create IV', { cause: error });\n }\n}\n\n/**\n * Hashes aux string to make it fixed-length\n *\n * @param aux - The auxilay string of arbitrary length\n * @returns The resulting fixed-length auxilary string.\n */\nexport async function makeAuxFixedLength(aux: string): Promise<Uint8Array> {\n return getBytesFromString(AUX_LEN / 8, aux);\n}\n\n/**\n * Symmetrically encrypts message\n *\n * @param message - The message to encrypt\n * @param encryptionKey - The encryption key\n * @param iv - The initialization vector\n * @param additionalData - The auxilary data\n * @returns The resulting ciphertext\n */\nexport async function encryptMessage(\n message: Uint8Array,\n encryptionKey: CryptoKey,\n iv: Uint8Array,\n additionalData: Uint8Array,\n): Promise<Uint8Array> {\n try {\n const encrypted = await crypto.subtle.encrypt(\n { name: AES_ALGORITHM, iv: iv as BufferSource, additionalData: additionalData as BufferSource },\n encryptionKey,\n message as BufferSource,\n );\n return new Uint8Array(encrypted);\n } catch (error) {\n throw new Error('Failed to encrypt symmetrically', { cause: error });\n }\n}\n\n/**\n * Symmetrically decrypts message\n *\n * @param ciphertext - The encrypted message\n * @param ciphertext - The initialization vector\n * @param encryptionKey - The encryption key\n * @param additionalData - The auxilary data\n * @returns The resulting decrypted message\n */\nexport async function decryptMessage(\n ciphertext: Uint8Array,\n iv: Uint8Array,\n encryptionKey: CryptoKey,\n additionalData: Uint8Array,\n): Promise<Uint8Array> {\n try {\n const decrypted = await crypto.subtle.decrypt(\n { name: AES_ALGORITHM, iv: iv as BufferSource, additionalData: additionalData as BufferSource },\n encryptionKey,\n ciphertext as BufferSource,\n );\n return new Uint8Array(decrypted);\n } catch (error) {\n throw new Error('Failed to decrypt symmetrically', { cause: error });\n }\n}\n","import { SymmetricCiphertext } from '../types';\nimport { createNISTbasedIV, makeAuxFixedLength, encryptMessage, decryptMessage } from './core';\n\n/**\n * Symmetrically encrypts the message\n *\n * @param encryptionKey - The symmetric CryptoKey used for message encryption\n * @param message - The message to encrypt\n * @param freeField - The context of the message (required for IV generation)\n * @param aux - The auxilary string\n * @returns The resulting ciphertext.\n */\nexport async function encryptSymmetrically(\n encryptionKey: CryptoKey,\n message: Uint8Array,\n aux: string,\n freeField?: string,\n): Promise<SymmetricCiphertext> {\n try {\n const iv = await createNISTbasedIV(freeField);\n const additionalData = await makeAuxFixedLength(aux);\n const ciphertext = await encryptMessage(message, encryptionKey, iv, additionalData);\n return { ciphertext, iv };\n } catch (error) {\n throw new Error('Failed to encrypt symmetrically', { cause: error });\n }\n}\n\n/**\n * Decryps symmetrically encrypted message\n *\n * @param encryptionKey - The symmetric CryptoKey used for message encryption\n * @param encryptedMessage - The ciphertext\n * @param aux - The auxilary string\n * @returns The resulting ciphertext.\n */\nexport async function decryptSymmetrically(\n encryptionKey: CryptoKey,\n encryptedMessage: SymmetricCiphertext,\n aux: string,\n): Promise<Uint8Array> {\n try {\n const additionalData = await makeAuxFixedLength(aux);\n const result = await decryptMessage(\n encryptedMessage.ciphertext,\n encryptedMessage.iv,\n encryptionKey,\n additionalData,\n );\n return result;\n } catch (error) {\n throw new Error('Failed to decrypt symmetrically', { cause: error });\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/constants.ts","../src/hash/blake3.ts","../src/symmetric-crypto/keys.ts","../src/symmetric-crypto/core.ts","../src/symmetric-crypto/aes.ts"],"names":[],"mappings":"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","file":"symmetric-crypto.mjs","sourcesContent":["export const AES_ALGORITHM = 'AES-GCM';\nexport const AES_KEY_BIT_LENGTH = 256;\nexport const AUX_LEN = 128;\nexport const IV_LEN_BYTES = 16;\n\nexport const KEY_WRAPPING_ALGORITHM = 'AES-KW';\nexport const KEY_FORMAT = 'raw';\nexport const CONTEXT_WRAPPING = 'CRYPTO library 2025-08-22 18:10:00 key derived from ecc and kyber secrets';\n\nexport const ECC_ALGORITHM = 'X25519';\n\nexport const CONTEXT_LOGIN = 'CRYPTO library 2025-07-26 16:18:03 key for opening identity keystore';\nexport const CONTEXT_ENC_KEYSTORE = 'CRYPTO library 2025-07-30 16:18:03 key for opening encryption keys keystore';\nexport const CONTEXT_RECOVERY = 'CRYPTO library 2025-07-30 16:20:00 key for account recovery';\nexport const CONTEXT_INDEX = 'CRYPTO library 2025-07-30 17:20:00 key for protecting current search indices';\nexport const CONTEXT_DERIVE = 'CRYPTO library 2025-08-27 17:08:00 derive one key from two keys';\n\nexport const PREFIX_MEDIA_KEY_COMMITMENT = 'CRYPTO library 2025-08-26 18:29:00 prefix for commitment to media keys';\nexport const PREFIX_PUBLIC_KEY_COMMITMENT = 'CRYPTO library 2025-08-26 18:30:00 prefix for commitment to public keys';\nexport const PREFIX_IDENTITY_KEY_COMMITMENT =\n 'CRYPTO library 2025-08-26 18:45:00 prefix for commitment to identity keys';\n\n// Second recommended parameter set from RFC 9106\nexport const ARGON2ID_PARALLELISM = 3;\nexport const ARGON2ID_ITERATIONS = 4;\nexport const ARGON2ID_MEMORY_SIZE = 65536;\nexport const ARGON2ID_SALT_BYTE_LENGTH = 16;\nexport const ARGON2ID_OUTPUT_BYTE_LENGTH = 32;\n\nexport const IDENTITY_KEYSTORE_TAG = 'Identity keystore';\nexport const ENCRYPTION_KEYSTORE_TAG = 'Encryption keystore';\nexport const RECOVERY_KEYSTORE_TAG = 'Key recovery keystroe';\nexport const INDEX_KEYSTORE_TAG = 'Current encrypted indices';\n\nexport const KYBER512_PUBLIC_KEY_LENGTH = 800;\nexport const KYBER512_SECRET_KEY_LENGTH = 1632;\n\nexport const KYBER768_PUBLIC_KEY_LENGTH = 1184;\nexport const KYBER768_SECRET_KEY_LENGTH = 2400;\n\nexport const KYBER1024_PUBLIC_KEY_LENGTH = 1568;\nexport const KYBER1024_SECRET_KEY_LENGTH = 3168;\n\nexport const KYBER_SEED_LENGTH = 64;\n\nexport const HASH_BIT_LEN = 256;\n\nexport const MAX_CACHE_SIZE = 600000000; // 600 MB\nexport const MAX_EMAIL_PER_BATCH = 100;\nexport const DB_LABEL = 'email';\nexport const DB_VERSION = 1;\n","import { blake3 } from '@noble/hashes/blake3.js';\nimport { utf8ToBytes, bytesToHex } from '@noble/hashes/utils.js';\n\n/**\n * Hashes the given array of data\n *\n * @param data - The data to hash\n * @returns The resulting hash array\n */\nexport function hashData(data: Uint8Array[]): Uint8Array {\n try {\n const hasher = blake3.create();\n for (const d of data) {\n hasher.update(d);\n }\n return hasher.digest();\n } catch (error) {\n throw new Error('Failed to compute hash', { cause: error });\n }\n}\n\nexport function keyedHashHex(hashKey: Uint8Array, data: Uint8Array[]): string {\n try {\n const hash = keyedHash(hashKey, data);\n return bytesToHex(hash);\n } catch (error) {\n throw new Error('Failed to compute hash hex', { cause: error });\n }\n}\n\nexport function keyedHash(hashKey: Uint8Array, data: Uint8Array[]): Uint8Array {\n try {\n const hasher = blake3.create({ key: hashKey });\n for (const d of data) {\n hasher.update(d);\n }\n return hasher.digest();\n } catch (error) {\n throw new Error('Failed to compute hash', { cause: error });\n }\n}\n\n/**\n * Hashes the given array of data\n *\n * @param data - The data to hash\n * @returns The resulting hash hex string\n */\nexport function hashDataHex(data: Uint8Array[]): string {\n try {\n const hash = hashData(data);\n return bytesToHex(hash);\n } catch (error) {\n throw new Error('Failed to compute hash', { cause: error });\n }\n}\n\n/**\n * Hashes the given array of data using blake3 algorithm\n *\n * @param bytes - The desired output byte-length\n * @param data - The data to hash\n * @returns The resulting hash value\n */\nexport function getBytesFromData(bytes: number, data: Uint8Array[]): Uint8Array {\n try {\n const hasher = blake3.create({ dkLen: bytes });\n for (const chunk of data) {\n hasher.update(chunk);\n }\n return hasher.digest();\n } catch (error) {\n throw new Error('Failed to get bytes from data', { cause: error });\n }\n}\n\n/**\n * Hashes the given array of data using blake3 algorithm\n *\n * @param bytes - The desired output byte-length\n * @param data - The data to hash\n * @returns The resulting hash value\n */\nexport function getBytesFromDataHex(bytes: number, data: Uint8Array[]): string {\n try {\n const hash = getBytesFromData(bytes, data);\n return bytesToHex(hash);\n } catch (error) {\n throw new Error('Failed to get bytes from data', { cause: error });\n }\n}\n\n/**\n * Hashes the given string using blake3 algorithm\n *\n * @param bytes - The desired output byte-length\n * @param value - The string to hash\n * @returns The resulting hash value\n */\nexport function getBytesFromString(bytes: number, value: string): Uint8Array {\n return blake3(utf8ToBytes(value), { dkLen: bytes });\n}\n\n/**\n * Hashes the given string using blake3 algorithm\n *\n * @param bytes - The desired output byte-length\n * @param value - The string to hash\n * @returns The resulting hash value\n */\nexport function getBytesFromStrinHex(bytes: number, value: string): string {\n return bytesToHex(getBytesFromString(bytes, value));\n}\n","import { AES_ALGORITHM, AES_KEY_BIT_LENGTH, KEY_FORMAT } from '../constants';\nimport { getBytesFromString } from '../hash';\n\n/**\n * Converts Uint8Array into CryptoKey\n *\n * @param keyData - The Uint8Array representation of the symmetric key\n * @returns The resulting symmetric CryptoKey.\n */\nexport async function importSymmetricCryptoKey(keyData: Uint8Array | ArrayBuffer): Promise<CryptoKey> {\n return crypto.subtle.importKey(\n KEY_FORMAT,\n new Uint8Array(keyData),\n {\n name: AES_ALGORITHM,\n length: AES_KEY_BIT_LENGTH,\n },\n true,\n ['encrypt', 'decrypt'],\n );\n}\n\n/**\n * Converts CryptoKey into Uint8Array\n *\n * @param key - The symmetric CryptoKey\n * @returns The resulting Uint8Array.\n */\nexport async function exportSymmetricCryptoKey(key: CryptoKey): Promise<Uint8Array> {\n try {\n const rawKey = await crypto.subtle.exportKey(KEY_FORMAT, key);\n return new Uint8Array(rawKey);\n } catch (error) {\n throw new Error('Failed to export symmetric CryptoKey', { cause: error });\n }\n}\n\n/**\n * Generates symmetric CryptoKey\n *\n * @returns The generated CryptoKey.\n */\nexport async function genSymmetricCryptoKey(): Promise<CryptoKey> {\n return crypto.subtle.generateKey(\n {\n name: AES_ALGORITHM,\n length: AES_KEY_BIT_LENGTH,\n },\n true,\n ['encrypt', 'decrypt'],\n );\n}\n\n/**\n * Generates symmetric key as Uint8Array\n *\n * @returns The generated Uint8Array.\n */\nexport function genSymmetricKey(): Uint8Array {\n try {\n const key = new Uint8Array(AES_KEY_BIT_LENGTH / 8);\n crypto.getRandomValues(key);\n return key;\n } catch (error) {\n throw new Error('Failed to generate symmetric key', { cause: error });\n }\n}\n\n/**\n * Derives CryptoKey from the given key material\n *\n * @returns The derived CryptoKey.\n */\nexport async function deriveSymmetricCryptoKey(keyMaterial: string): Promise<CryptoKey> {\n try {\n const hashBuffer = await getBytesFromString(AES_KEY_BIT_LENGTH / 8, keyMaterial);\n return importSymmetricCryptoKey(hashBuffer);\n } catch (error) {\n throw new Error('Failed to derive CryptoKey from the given key material', { cause: error });\n }\n}\n","import { randomBytes } from '@noble/post-quantum/utils.js';\nimport { getBytesFromString } from '../hash';\nimport { AUX_LEN, AES_ALGORITHM, IV_LEN_BYTES } from '../constants';\n\n/**\n * Creates an initialization vector (IV) using RGB-based construction (8.2.2 NIST Special Publication 800-38D)\n * Constructs a 128-bits IV from 2 fileds: the random field (at least 96 bits) and the free field (32 bits).\n * If free filed is empty, then the entier 128-bit IV is sampled randomly.\n *\n * @param freeFiled - The string with an unrestricted content. Can be a device identifier, etc.\n * @returns The resulting 128-bits initialization vector.\n */\nexport async function createNISTbasedIV(freeField?: string): Promise<Uint8Array> {\n try {\n if (!freeField) {\n return randomBytes(IV_LEN_BYTES);\n }\n\n const iv = new Uint8Array(16);\n\n const randFiled = randomBytes(12);\n iv.set(randFiled, 0);\n\n const freeFiledFixedLength = await getBytesFromString(4, freeField);\n iv.set(freeFiledFixedLength, 12);\n\n return iv;\n } catch (error) {\n throw new Error('Failed to create IV', { cause: error });\n }\n}\n\n/**\n * Hashes aux string to make it fixed-length\n *\n * @param aux - The auxilay string of arbitrary length\n * @returns The resulting fixed-length auxilary string.\n */\nexport async function makeAuxFixedLength(aux: string): Promise<Uint8Array> {\n return getBytesFromString(AUX_LEN / 8, aux);\n}\n\n/**\n * Symmetrically encrypts message\n *\n * @param message - The message to encrypt\n * @param encryptionKey - The encryption key\n * @param iv - The initialization vector\n * @param additionalData - The auxilary data\n * @returns The resulting ciphertext\n */\nexport async function encryptMessage(\n message: Uint8Array,\n encryptionKey: CryptoKey,\n iv: Uint8Array,\n additionalData: Uint8Array,\n): Promise<Uint8Array> {\n try {\n const encrypted = await crypto.subtle.encrypt(\n { name: AES_ALGORITHM, iv: iv as BufferSource, additionalData: additionalData as BufferSource },\n encryptionKey,\n message as BufferSource,\n );\n return new Uint8Array(encrypted);\n } catch (error) {\n throw new Error('Failed to encrypt symmetrically', { cause: error });\n }\n}\n\n/**\n * Symmetrically decrypts message\n *\n * @param ciphertext - The encrypted message\n * @param ciphertext - The initialization vector\n * @param encryptionKey - The encryption key\n * @param additionalData - The auxilary data\n * @returns The resulting decrypted message\n */\nexport async function decryptMessage(\n ciphertext: Uint8Array,\n iv: Uint8Array,\n encryptionKey: CryptoKey,\n additionalData: Uint8Array,\n): Promise<Uint8Array> {\n try {\n const decrypted = await crypto.subtle.decrypt(\n { name: AES_ALGORITHM, iv: iv as BufferSource, additionalData: additionalData as BufferSource },\n encryptionKey,\n ciphertext as BufferSource,\n );\n return new Uint8Array(decrypted);\n } catch (error) {\n throw new Error('Failed to decrypt symmetrically', { cause: error });\n }\n}\n","import { SymmetricCiphertext } from '../types';\nimport { createNISTbasedIV, makeAuxFixedLength, encryptMessage, decryptMessage } from './core';\n\n/**\n * Symmetrically encrypts the message\n *\n * @param encryptionKey - The symmetric CryptoKey used for message encryption\n * @param message - The message to encrypt\n * @param freeField - The context of the message (required for IV generation)\n * @param aux - The auxilary string\n * @returns The resulting ciphertext.\n */\nexport async function encryptSymmetrically(\n encryptionKey: CryptoKey,\n message: Uint8Array,\n aux: string,\n freeField?: string,\n): Promise<SymmetricCiphertext> {\n try {\n const iv = await createNISTbasedIV(freeField);\n const additionalData = await makeAuxFixedLength(aux);\n const ciphertext = await encryptMessage(message, encryptionKey, iv, additionalData);\n return { ciphertext, iv };\n } catch (error) {\n throw new Error('Failed to encrypt symmetrically', { cause: error });\n }\n}\n\n/**\n * Decryps symmetrically encrypted message\n *\n * @param encryptionKey - The symmetric CryptoKey used for message encryption\n * @param encryptedMessage - The ciphertext\n * @param aux - The auxilary string\n * @returns The resulting ciphertext.\n */\nexport async function decryptSymmetrically(\n encryptionKey: CryptoKey,\n encryptedMessage: SymmetricCiphertext,\n aux: string,\n): Promise<Uint8Array> {\n try {\n const additionalData = await makeAuxFixedLength(aux);\n const result = await decryptMessage(\n encryptedMessage.ciphertext,\n encryptedMessage.iv,\n encryptionKey,\n additionalData,\n );\n return result;\n } catch (error) {\n throw new Error('Failed to decrypt symmetrically', { cause: error });\n }\n}\n"]}
@@ -1,114 +0,0 @@
1
- import { Email, UserWithPublicKeys, PrivateKeys, HybridEncryptedEmail, PublicKeys, PwdProtectedEmail, EmailPublicParameters } from './types.js';
2
-
3
- /**
4
- * Encrypts the email using hybrid encryption.
5
- *
6
- * @param email - The email to encrypt.
7
- * @param recipientPublicKeys - The public keys of the recipient.
8
- * @param senderPrivateKey - The private key of the sender.
9
- * @returns The encrypted email
10
- */
11
- declare function encryptEmailHybrid(email: Email, recipient: UserWithPublicKeys, senderPrivateKey: PrivateKeys): Promise<HybridEncryptedEmail>;
12
- /**
13
- * Encrypts the email using hybrid encryption for multiple recipients.
14
- *
15
- * @param email - The email to encrypt.
16
- * @param recipients - The recipients with corresponding public keys.
17
- * @param senderPrivateKey - The private key of the sender.
18
- * @returns The set of encrypted email
19
- */
20
- declare function encryptEmailHybridForMultipleRecipients(email: Email, recipients: UserWithPublicKeys[], senderPrivateKey: PrivateKeys): Promise<HybridEncryptedEmail[]>;
21
- /**
22
- * Decrypts the email using hybrid encryption.
23
- *
24
- * @param encryptedEmail - The encrypted email.
25
- * @param senderPublicKeys - The public key of the sender.
26
- * @param recipientPrivateKeys - The private key of the recipient.
27
- * @returns The decrypted email
28
- */
29
- declare function decryptEmailHybrid(encryptedEmail: HybridEncryptedEmail, senderPublicKeys: PublicKeys, recipientPrivateKeys: PrivateKeys): Promise<Email>;
30
-
31
- /**
32
- * Encrypts the email and its subject using hybrid encryption.
33
- *
34
- * @param email - The email to encrypt.
35
- * @param recipientPublicKeys - The public keys of the recipient.
36
- * @param senderPrivateKey - The private key of the sender.
37
- * @returns The encrypted email
38
- */
39
- declare function encryptEmailAndSubjectHybrid(email: Email, recipient: UserWithPublicKeys, senderPrivateKey: PrivateKeys): Promise<HybridEncryptedEmail>;
40
- /**
41
- * Encrypts the email using hybrid encryption for multiple recipients.
42
- *
43
- * @param email - The email to encrypt.
44
- * @param recipients - The recipients with corresponding public keys.
45
- * @param senderPrivateKey - The private key of the sender.
46
- * @returns The set of encrypted email
47
- */
48
- declare function encryptEmailAndSubjectHybridForMultipleRecipients(email: Email, recipients: UserWithPublicKeys[], senderPrivateKey: PrivateKeys): Promise<HybridEncryptedEmail[]>;
49
- /**
50
- * Decrypts the email using hybrid encryption.
51
- *
52
- * @param encryptedEmail - The encrypted email.
53
- * @param senderPublicKeys - The public key of the sender.
54
- * @param recipientPrivateKeys - The private key of the recipient.
55
- * @returns The decrypted email
56
- */
57
- declare function decryptEmailAndSubjectHybrid(encryptedEmail: HybridEncryptedEmail, senderPublicKeys: PublicKeys, recipientPrivateKeys: PrivateKeys): Promise<Email>;
58
-
59
- /**
60
- * Creates a password-protected email.
61
- *
62
- * @param email - The email to password-protect
63
- * @param password - The secret password shared among recipients.
64
- * @returns The password-protected email
65
- */
66
- declare function createPwdProtectedEmail(email: Email, password: string): Promise<PwdProtectedEmail>;
67
- /**
68
- * Opens a password-protected email.
69
- *
70
- * @param encryptedEmail - The encrypted email
71
- * @param password - The secret password shared among recipients.
72
- * @returns The decrypted email
73
- */
74
- declare function decryptPwdProtectedEmail(encryptedEmail: PwdProtectedEmail, password: string): Promise<Email>;
75
-
76
- /**
77
- * Creates a password-protected email and its subject.
78
- *
79
- * @param email - The email to password-protect
80
- * @param password - The secret password shared among recipients.
81
- * @returns The password-protected email with encrypted email subject
82
- */
83
- declare function createPwdProtectedEmailAndSubject(email: Email, password: string): Promise<PwdProtectedEmail>;
84
- /**
85
- * Opens a password-protected email.
86
- *
87
- * @param encryptedEmail - The encrypted email with encrypted email subject.
88
- * @param password - The secret password shared among recipients.
89
- * @returns The decrypted email and email subject
90
- */
91
- declare function decryptPwdProtectedEmailAndSubject(encryptedEmail: PwdProtectedEmail, password: string): Promise<Email>;
92
-
93
- /**
94
- * Creates an auxilary string from public fields of the email.
95
- *
96
- * @param params - The email public parameters.
97
- * @returns The resulting auxilary string
98
- */
99
- declare function getAux(params: EmailPublicParameters): string;
100
- /**
101
- * Creates an auxilary string from public fields of the email (except for subject field).
102
- *
103
- * @param params - The email public parameters.
104
- * @returns The resulting auxilary string
105
- */
106
- declare function getAuxWithoutSubject(params: EmailPublicParameters): string;
107
- /**
108
- * Creates a random email ID.
109
- *
110
- * @returns The resulting auxilary string
111
- */
112
- declare function generateEmailID(): string;
113
-
114
- export { encryptEmailHybridForMultipleRecipients as a, encryptEmailAndSubjectHybrid as b, encryptEmailAndSubjectHybridForMultipleRecipients as c, decryptEmailHybrid as d, encryptEmailHybrid as e, decryptEmailAndSubjectHybrid as f, createPwdProtectedEmail as g, decryptPwdProtectedEmail as h, createPwdProtectedEmailAndSubject as i, decryptPwdProtectedEmailAndSubject as j, getAux as k, getAuxWithoutSubject as l, generateEmailID as m };