internxt-crypto 0.0.8-alpha → 0.0.10-alpha

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 (100) hide show
  1. package/README.md +0 -2
  2. package/dist/asymmetric-crypto.d.mts +41 -0
  3. package/dist/asymmetric-crypto.d.ts +41 -0
  4. package/dist/asymmetric-crypto.js +92 -0
  5. package/dist/asymmetric-crypto.js.map +1 -0
  6. package/dist/asymmetric-crypto.mjs +85 -0
  7. package/dist/asymmetric-crypto.mjs.map +1 -0
  8. package/dist/constants.d.mts +39 -0
  9. package/dist/constants.d.ts +39 -0
  10. package/dist/constants.js +80 -0
  11. package/dist/constants.js.map +1 -0
  12. package/dist/constants.mjs +42 -0
  13. package/dist/constants.mjs.map +1 -0
  14. package/dist/derive-key.d.mts +91 -0
  15. package/dist/derive-key.d.ts +91 -0
  16. package/dist/derive-key.js +795 -0
  17. package/dist/derive-key.js.map +1 -0
  18. package/dist/derive-key.mjs +784 -0
  19. package/dist/derive-key.mjs.map +1 -0
  20. package/dist/email-crypto.d.mts +106 -0
  21. package/dist/email-crypto.d.ts +106 -0
  22. package/dist/email-crypto.js +1409 -0
  23. package/dist/email-crypto.js.map +1 -0
  24. package/dist/email-crypto.mjs +1381 -0
  25. package/dist/email-crypto.mjs.map +1 -0
  26. package/dist/email-search.d.mts +228 -0
  27. package/dist/email-search.d.ts +228 -0
  28. package/dist/email-search.js +605 -0
  29. package/dist/email-search.js.map +1 -0
  30. package/dist/email-search.mjs +580 -0
  31. package/dist/email-search.mjs.map +1 -0
  32. package/dist/email-service.d.mts +38 -0
  33. package/dist/email-service.d.ts +38 -0
  34. package/dist/email-service.js +154 -0
  35. package/dist/email-service.js.map +1 -0
  36. package/dist/email-service.mjs +147 -0
  37. package/dist/email-service.mjs.map +1 -0
  38. package/dist/hash.d.mts +59 -0
  39. package/dist/hash.d.ts +59 -0
  40. package/dist/hash.js +95 -0
  41. package/dist/hash.js.map +1 -0
  42. package/dist/hash.mjs +85 -0
  43. package/dist/hash.mjs.map +1 -0
  44. package/dist/index.d.mts +35 -0
  45. package/dist/index.d.ts +35 -0
  46. package/dist/index.js +2697 -2054
  47. package/dist/index.js.map +1 -1
  48. package/dist/index.mjs +2138 -8187
  49. package/dist/index.mjs.map +1 -1
  50. package/dist/keystore-crypto.d.mts +66 -0
  51. package/dist/keystore-crypto.d.ts +66 -0
  52. package/dist/keystore-crypto.js +530 -0
  53. package/dist/keystore-crypto.js.map +1 -0
  54. package/dist/keystore-crypto.mjs +501 -0
  55. package/dist/keystore-crypto.mjs.map +1 -0
  56. package/dist/keystore-service.d.mts +82 -0
  57. package/dist/keystore-service.d.ts +82 -0
  58. package/dist/keystore-service.js +349 -0
  59. package/dist/keystore-service.js.map +1 -0
  60. package/dist/keystore-service.mjs +342 -0
  61. package/dist/keystore-service.mjs.map +1 -0
  62. package/dist/kyber768-B87rMQ7u.d.mts +30 -0
  63. package/dist/kyber768-B87rMQ7u.d.ts +30 -0
  64. package/dist/post-quantum-crypto.d.mts +72 -0
  65. package/dist/post-quantum-crypto.d.ts +72 -0
  66. package/dist/post-quantum-crypto.js +96 -0
  67. package/dist/post-quantum-crypto.js.map +1 -0
  68. package/dist/post-quantum-crypto.mjs +90 -0
  69. package/dist/post-quantum-crypto.mjs.map +1 -0
  70. package/dist/storage-service.d.mts +53 -0
  71. package/dist/storage-service.d.ts +53 -0
  72. package/dist/storage-service.js +70 -0
  73. package/dist/storage-service.js.map +1 -0
  74. package/dist/storage-service.mjs +67 -0
  75. package/dist/storage-service.mjs.map +1 -0
  76. package/dist/symmetric-crypto.d.mts +56 -0
  77. package/dist/symmetric-crypto.d.ts +56 -0
  78. package/dist/symmetric-crypto.js +142 -0
  79. package/dist/symmetric-crypto.js.map +1 -0
  80. package/dist/symmetric-crypto.mjs +134 -0
  81. package/dist/symmetric-crypto.mjs.map +1 -0
  82. package/dist/types.d.mts +102 -0
  83. package/dist/types.d.ts +102 -0
  84. package/dist/types.js +14 -0
  85. package/dist/types.js.map +1 -0
  86. package/dist/types.mjs +12 -0
  87. package/dist/types.mjs.map +1 -0
  88. package/dist/utils-BDaK_d6T.d.ts +114 -0
  89. package/dist/utils-v34IRTIx.d.mts +114 -0
  90. package/dist/utils.d.mts +140 -0
  91. package/dist/utils.d.ts +140 -0
  92. package/dist/utils.js +313 -0
  93. package/dist/utils.js.map +1 -0
  94. package/dist/utils.mjs +273 -0
  95. package/dist/utils.mjs.map +1 -0
  96. package/package.json +83 -7
  97. package/dist/__vite-browser-external-Dyvby5gX.js +0 -2
  98. package/dist/__vite-browser-external-Dyvby5gX.js.map +0 -1
  99. package/dist/__vite-browser-external-l0sNRNKZ.mjs +0 -2
  100. package/dist/__vite-browser-external-l0sNRNKZ.mjs.map +0 -1
@@ -0,0 +1,142 @@
1
+ 'use strict';
2
+
3
+ var blake3_js = require('@noble/hashes/blake3.js');
4
+ var utils_js = require('@noble/hashes/utils.js');
5
+ var utils_js$1 = require('@noble/post-quantum/utils.js');
6
+
7
+ // src/constants.ts
8
+ var AES_ALGORITHM = "AES-GCM";
9
+ var AES_KEY_BIT_LENGTH = 256;
10
+ var AUX_LEN = 128;
11
+ var IV_LEN_BYTES = 16;
12
+ var KEY_FORMAT = "raw";
13
+ function getBytesFromString(bytes, value) {
14
+ return blake3_js.blake3(utils_js.utf8ToBytes(value), { dkLen: bytes });
15
+ }
16
+
17
+ // src/symmetric-crypto/keys.ts
18
+ async function importSymmetricCryptoKey(keyData) {
19
+ return crypto.subtle.importKey(
20
+ KEY_FORMAT,
21
+ new Uint8Array(keyData),
22
+ {
23
+ name: AES_ALGORITHM,
24
+ length: AES_KEY_BIT_LENGTH
25
+ },
26
+ true,
27
+ ["encrypt", "decrypt"]
28
+ );
29
+ }
30
+ async function exportSymmetricCryptoKey(key) {
31
+ try {
32
+ const rawKey = await crypto.subtle.exportKey(KEY_FORMAT, key);
33
+ return new Uint8Array(rawKey);
34
+ } catch (error) {
35
+ throw new Error("Failed to export symmetric CryptoKey", { cause: error });
36
+ }
37
+ }
38
+ async function genSymmetricCryptoKey() {
39
+ return crypto.subtle.generateKey(
40
+ {
41
+ name: AES_ALGORITHM,
42
+ length: AES_KEY_BIT_LENGTH
43
+ },
44
+ true,
45
+ ["encrypt", "decrypt"]
46
+ );
47
+ }
48
+ function genSymmetricKey() {
49
+ try {
50
+ const key = new Uint8Array(AES_KEY_BIT_LENGTH / 8);
51
+ crypto.getRandomValues(key);
52
+ return key;
53
+ } catch (error) {
54
+ throw new Error("Failed to generate symmetric key", { cause: error });
55
+ }
56
+ }
57
+ async function deriveSymmetricCryptoKey(keyMaterial) {
58
+ try {
59
+ const hashBuffer = await getBytesFromString(AES_KEY_BIT_LENGTH / 8, keyMaterial);
60
+ return importSymmetricCryptoKey(hashBuffer);
61
+ } catch (error) {
62
+ throw new Error("Failed to derive CryptoKey from the given key material", { cause: error });
63
+ }
64
+ }
65
+ async function createNISTbasedIV(freeField) {
66
+ try {
67
+ if (!freeField) {
68
+ return utils_js$1.randomBytes(IV_LEN_BYTES);
69
+ }
70
+ const iv = new Uint8Array(16);
71
+ const randFiled = utils_js$1.randomBytes(12);
72
+ iv.set(randFiled, 0);
73
+ const freeFiledFixedLength = await getBytesFromString(4, freeField);
74
+ iv.set(freeFiledFixedLength, 12);
75
+ return iv;
76
+ } catch (error) {
77
+ throw new Error("Failed to create IV", { cause: error });
78
+ }
79
+ }
80
+ async function makeAuxFixedLength(aux) {
81
+ return getBytesFromString(AUX_LEN / 8, aux);
82
+ }
83
+ async function encryptMessage(message, encryptionKey, iv, additionalData) {
84
+ try {
85
+ const encrypted = await crypto.subtle.encrypt(
86
+ { name: AES_ALGORITHM, iv, additionalData },
87
+ encryptionKey,
88
+ message
89
+ );
90
+ return new Uint8Array(encrypted);
91
+ } catch (error) {
92
+ throw new Error("Failed to encrypt symmetrically", { cause: error });
93
+ }
94
+ }
95
+ async function decryptMessage(ciphertext, iv, encryptionKey, additionalData) {
96
+ try {
97
+ const decrypted = await crypto.subtle.decrypt(
98
+ { name: AES_ALGORITHM, iv, additionalData },
99
+ encryptionKey,
100
+ ciphertext
101
+ );
102
+ return new Uint8Array(decrypted);
103
+ } catch (error) {
104
+ throw new Error("Failed to decrypt symmetrically", { cause: error });
105
+ }
106
+ }
107
+
108
+ // src/symmetric-crypto/aes.ts
109
+ async function encryptSymmetrically(encryptionKey, message, aux, freeField) {
110
+ try {
111
+ const iv = await createNISTbasedIV(freeField);
112
+ const additionalData = await makeAuxFixedLength(aux);
113
+ const ciphertext = await encryptMessage(message, encryptionKey, iv, additionalData);
114
+ return { ciphertext, iv };
115
+ } catch (error) {
116
+ throw new Error("Failed to encrypt symmetrically", { cause: error });
117
+ }
118
+ }
119
+ async function decryptSymmetrically(encryptionKey, encryptedMessage, aux) {
120
+ try {
121
+ const additionalData = await makeAuxFixedLength(aux);
122
+ const result = await decryptMessage(
123
+ encryptedMessage.ciphertext,
124
+ encryptedMessage.iv,
125
+ encryptionKey,
126
+ additionalData
127
+ );
128
+ return result;
129
+ } catch (error) {
130
+ throw new Error("Failed to decrypt symmetrically", { cause: error });
131
+ }
132
+ }
133
+
134
+ exports.decryptSymmetrically = decryptSymmetrically;
135
+ exports.deriveSymmetricCryptoKey = deriveSymmetricCryptoKey;
136
+ exports.encryptSymmetrically = encryptSymmetrically;
137
+ exports.exportSymmetricCryptoKey = exportSymmetricCryptoKey;
138
+ exports.genSymmetricCryptoKey = genSymmetricCryptoKey;
139
+ exports.genSymmetricKey = genSymmetricKey;
140
+ exports.importSymmetricCryptoKey = importSymmetricCryptoKey;
141
+ //# sourceMappingURL=symmetric-crypto.js.map
142
+ //# sourceMappingURL=symmetric-crypto.js.map
@@ -0,0 +1 @@
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"]}
@@ -0,0 +1,134 @@
1
+ import { blake3 } from '@noble/hashes/blake3.js';
2
+ import { utf8ToBytes } from '@noble/hashes/utils.js';
3
+ import { randomBytes } from '@noble/post-quantum/utils.js';
4
+
5
+ // src/constants.ts
6
+ var AES_ALGORITHM = "AES-GCM";
7
+ var AES_KEY_BIT_LENGTH = 256;
8
+ var AUX_LEN = 128;
9
+ var IV_LEN_BYTES = 16;
10
+ var KEY_FORMAT = "raw";
11
+ function getBytesFromString(bytes, value) {
12
+ return blake3(utf8ToBytes(value), { dkLen: bytes });
13
+ }
14
+
15
+ // src/symmetric-crypto/keys.ts
16
+ async function importSymmetricCryptoKey(keyData) {
17
+ return crypto.subtle.importKey(
18
+ KEY_FORMAT,
19
+ new Uint8Array(keyData),
20
+ {
21
+ name: AES_ALGORITHM,
22
+ length: AES_KEY_BIT_LENGTH
23
+ },
24
+ true,
25
+ ["encrypt", "decrypt"]
26
+ );
27
+ }
28
+ async function exportSymmetricCryptoKey(key) {
29
+ try {
30
+ const rawKey = await crypto.subtle.exportKey(KEY_FORMAT, key);
31
+ return new Uint8Array(rawKey);
32
+ } catch (error) {
33
+ throw new Error("Failed to export symmetric CryptoKey", { cause: error });
34
+ }
35
+ }
36
+ async function genSymmetricCryptoKey() {
37
+ return crypto.subtle.generateKey(
38
+ {
39
+ name: AES_ALGORITHM,
40
+ length: AES_KEY_BIT_LENGTH
41
+ },
42
+ true,
43
+ ["encrypt", "decrypt"]
44
+ );
45
+ }
46
+ function genSymmetricKey() {
47
+ try {
48
+ const key = new Uint8Array(AES_KEY_BIT_LENGTH / 8);
49
+ crypto.getRandomValues(key);
50
+ return key;
51
+ } catch (error) {
52
+ throw new Error("Failed to generate symmetric key", { cause: error });
53
+ }
54
+ }
55
+ async function deriveSymmetricCryptoKey(keyMaterial) {
56
+ try {
57
+ const hashBuffer = await getBytesFromString(AES_KEY_BIT_LENGTH / 8, keyMaterial);
58
+ return importSymmetricCryptoKey(hashBuffer);
59
+ } catch (error) {
60
+ throw new Error("Failed to derive CryptoKey from the given key material", { cause: error });
61
+ }
62
+ }
63
+ async function createNISTbasedIV(freeField) {
64
+ try {
65
+ if (!freeField) {
66
+ return randomBytes(IV_LEN_BYTES);
67
+ }
68
+ const iv = new Uint8Array(16);
69
+ const randFiled = randomBytes(12);
70
+ iv.set(randFiled, 0);
71
+ const freeFiledFixedLength = await getBytesFromString(4, freeField);
72
+ iv.set(freeFiledFixedLength, 12);
73
+ return iv;
74
+ } catch (error) {
75
+ throw new Error("Failed to create IV", { cause: error });
76
+ }
77
+ }
78
+ async function makeAuxFixedLength(aux) {
79
+ return getBytesFromString(AUX_LEN / 8, aux);
80
+ }
81
+ async function encryptMessage(message, encryptionKey, iv, additionalData) {
82
+ try {
83
+ const encrypted = await crypto.subtle.encrypt(
84
+ { name: AES_ALGORITHM, iv, additionalData },
85
+ encryptionKey,
86
+ message
87
+ );
88
+ return new Uint8Array(encrypted);
89
+ } catch (error) {
90
+ throw new Error("Failed to encrypt symmetrically", { cause: error });
91
+ }
92
+ }
93
+ async function decryptMessage(ciphertext, iv, encryptionKey, additionalData) {
94
+ try {
95
+ const decrypted = await crypto.subtle.decrypt(
96
+ { name: AES_ALGORITHM, iv, additionalData },
97
+ encryptionKey,
98
+ ciphertext
99
+ );
100
+ return new Uint8Array(decrypted);
101
+ } catch (error) {
102
+ throw new Error("Failed to decrypt symmetrically", { cause: error });
103
+ }
104
+ }
105
+
106
+ // src/symmetric-crypto/aes.ts
107
+ async function encryptSymmetrically(encryptionKey, message, aux, freeField) {
108
+ try {
109
+ const iv = await createNISTbasedIV(freeField);
110
+ const additionalData = await makeAuxFixedLength(aux);
111
+ const ciphertext = await encryptMessage(message, encryptionKey, iv, additionalData);
112
+ return { ciphertext, iv };
113
+ } catch (error) {
114
+ throw new Error("Failed to encrypt symmetrically", { cause: error });
115
+ }
116
+ }
117
+ async function decryptSymmetrically(encryptionKey, encryptedMessage, aux) {
118
+ try {
119
+ const additionalData = await makeAuxFixedLength(aux);
120
+ const result = await decryptMessage(
121
+ encryptedMessage.ciphertext,
122
+ encryptedMessage.iv,
123
+ encryptionKey,
124
+ additionalData
125
+ );
126
+ return result;
127
+ } catch (error) {
128
+ throw new Error("Failed to decrypt symmetrically", { cause: error });
129
+ }
130
+ }
131
+
132
+ export { decryptSymmetrically, deriveSymmetricCryptoKey, encryptSymmetrically, exportSymmetricCryptoKey, genSymmetricCryptoKey, genSymmetricKey, importSymmetricCryptoKey };
133
+ //# sourceMappingURL=symmetric-crypto.mjs.map
134
+ //# sourceMappingURL=symmetric-crypto.mjs.map
@@ -0,0 +1 @@
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"]}
@@ -0,0 +1,102 @@
1
+ declare enum KeystoreType {
2
+ IDENTITY = "identity",
3
+ ENCRYPTION = "encryption",
4
+ RECOVERY = "recovery",
5
+ INDEX = "index"
6
+ }
7
+ type EncryptedKeystore = {
8
+ userID: string;
9
+ type: KeystoreType;
10
+ encryptedKeys: SymmetricCiphertext;
11
+ };
12
+ type User = {
13
+ email: string;
14
+ name: string;
15
+ };
16
+ type UserWithPublicKeys = User & {
17
+ publicKeys: PublicKeys;
18
+ };
19
+ type PublicKeys = {
20
+ eccPublicKey: CryptoKey;
21
+ kyberPublicKey: Uint8Array;
22
+ };
23
+ type MediaKeys = {
24
+ olmKey: Uint8Array;
25
+ pqKey: Uint8Array;
26
+ index: number;
27
+ userID: string;
28
+ };
29
+ type PrivateKeys = {
30
+ eccPrivateKey: CryptoKey;
31
+ kyberPrivateKey: Uint8Array;
32
+ };
33
+ type IdentityKeys = {
34
+ userPublicKey: CryptoKey;
35
+ userPrivateKey: CryptoKey;
36
+ };
37
+ type EncryptionKeys = {
38
+ userPublicKey: CryptoKey;
39
+ userPrivateKey: CryptoKey;
40
+ userPublicKyberKey: Uint8Array;
41
+ userPrivateKyberKey: Uint8Array;
42
+ };
43
+ type HybridEncryptedEmail = {
44
+ encryptedKey: HybridEncKey;
45
+ enc: SymmetricCiphertext;
46
+ recipientEmail: string;
47
+ params: EmailPublicParameters;
48
+ id: string;
49
+ };
50
+ type PwdProtectedEmail = {
51
+ encryptedKey: PwdProtectedKey;
52
+ enc: SymmetricCiphertext;
53
+ params: EmailPublicParameters;
54
+ id: string;
55
+ };
56
+ type SymmetricCiphertext = {
57
+ ciphertext: Uint8Array;
58
+ iv: Uint8Array;
59
+ };
60
+ type StoredEmail = {
61
+ params: EmailPublicParameters;
62
+ content: SymmetricCiphertext;
63
+ id: string;
64
+ };
65
+ type HybridEncKey = {
66
+ kyberCiphertext: Uint8Array;
67
+ encryptedKey: Uint8Array;
68
+ };
69
+ type PwdProtectedKey = {
70
+ encryptedKey: Uint8Array;
71
+ salt: Uint8Array;
72
+ };
73
+ type EmailBody = {
74
+ text: string;
75
+ attachments?: string[];
76
+ };
77
+ type EmailPublicParameters = {
78
+ subject: string;
79
+ createdAt: string;
80
+ sender: User;
81
+ recipient: User;
82
+ recipients?: User[];
83
+ replyToEmailID?: number;
84
+ labels?: string[];
85
+ };
86
+ type Email = {
87
+ id: string;
88
+ body: EmailBody;
89
+ params: EmailPublicParameters;
90
+ };
91
+ interface MailCache<Email> {
92
+ esCache: Map<string, Email>;
93
+ cacheSize: number;
94
+ isCacheLimited: boolean;
95
+ isCacheReady: boolean;
96
+ }
97
+ interface EmailSearchResult {
98
+ email: Email;
99
+ score?: number;
100
+ }
101
+
102
+ export { type Email, type EmailBody, type EmailPublicParameters, type EmailSearchResult, type EncryptedKeystore, type EncryptionKeys, type HybridEncKey, type HybridEncryptedEmail, type IdentityKeys, KeystoreType, type MailCache, type MediaKeys, type PrivateKeys, type PublicKeys, type PwdProtectedEmail, type PwdProtectedKey, type StoredEmail, type SymmetricCiphertext, type User, type UserWithPublicKeys };
@@ -0,0 +1,102 @@
1
+ declare enum KeystoreType {
2
+ IDENTITY = "identity",
3
+ ENCRYPTION = "encryption",
4
+ RECOVERY = "recovery",
5
+ INDEX = "index"
6
+ }
7
+ type EncryptedKeystore = {
8
+ userID: string;
9
+ type: KeystoreType;
10
+ encryptedKeys: SymmetricCiphertext;
11
+ };
12
+ type User = {
13
+ email: string;
14
+ name: string;
15
+ };
16
+ type UserWithPublicKeys = User & {
17
+ publicKeys: PublicKeys;
18
+ };
19
+ type PublicKeys = {
20
+ eccPublicKey: CryptoKey;
21
+ kyberPublicKey: Uint8Array;
22
+ };
23
+ type MediaKeys = {
24
+ olmKey: Uint8Array;
25
+ pqKey: Uint8Array;
26
+ index: number;
27
+ userID: string;
28
+ };
29
+ type PrivateKeys = {
30
+ eccPrivateKey: CryptoKey;
31
+ kyberPrivateKey: Uint8Array;
32
+ };
33
+ type IdentityKeys = {
34
+ userPublicKey: CryptoKey;
35
+ userPrivateKey: CryptoKey;
36
+ };
37
+ type EncryptionKeys = {
38
+ userPublicKey: CryptoKey;
39
+ userPrivateKey: CryptoKey;
40
+ userPublicKyberKey: Uint8Array;
41
+ userPrivateKyberKey: Uint8Array;
42
+ };
43
+ type HybridEncryptedEmail = {
44
+ encryptedKey: HybridEncKey;
45
+ enc: SymmetricCiphertext;
46
+ recipientEmail: string;
47
+ params: EmailPublicParameters;
48
+ id: string;
49
+ };
50
+ type PwdProtectedEmail = {
51
+ encryptedKey: PwdProtectedKey;
52
+ enc: SymmetricCiphertext;
53
+ params: EmailPublicParameters;
54
+ id: string;
55
+ };
56
+ type SymmetricCiphertext = {
57
+ ciphertext: Uint8Array;
58
+ iv: Uint8Array;
59
+ };
60
+ type StoredEmail = {
61
+ params: EmailPublicParameters;
62
+ content: SymmetricCiphertext;
63
+ id: string;
64
+ };
65
+ type HybridEncKey = {
66
+ kyberCiphertext: Uint8Array;
67
+ encryptedKey: Uint8Array;
68
+ };
69
+ type PwdProtectedKey = {
70
+ encryptedKey: Uint8Array;
71
+ salt: Uint8Array;
72
+ };
73
+ type EmailBody = {
74
+ text: string;
75
+ attachments?: string[];
76
+ };
77
+ type EmailPublicParameters = {
78
+ subject: string;
79
+ createdAt: string;
80
+ sender: User;
81
+ recipient: User;
82
+ recipients?: User[];
83
+ replyToEmailID?: number;
84
+ labels?: string[];
85
+ };
86
+ type Email = {
87
+ id: string;
88
+ body: EmailBody;
89
+ params: EmailPublicParameters;
90
+ };
91
+ interface MailCache<Email> {
92
+ esCache: Map<string, Email>;
93
+ cacheSize: number;
94
+ isCacheLimited: boolean;
95
+ isCacheReady: boolean;
96
+ }
97
+ interface EmailSearchResult {
98
+ email: Email;
99
+ score?: number;
100
+ }
101
+
102
+ export { type Email, type EmailBody, type EmailPublicParameters, type EmailSearchResult, type EncryptedKeystore, type EncryptionKeys, type HybridEncKey, type HybridEncryptedEmail, type IdentityKeys, KeystoreType, type MailCache, type MediaKeys, type PrivateKeys, type PublicKeys, type PwdProtectedEmail, type PwdProtectedKey, type StoredEmail, type SymmetricCiphertext, type User, type UserWithPublicKeys };
package/dist/types.js ADDED
@@ -0,0 +1,14 @@
1
+ 'use strict';
2
+
3
+ // src/types.ts
4
+ var KeystoreType = /* @__PURE__ */ ((KeystoreType2) => {
5
+ KeystoreType2["IDENTITY"] = "identity";
6
+ KeystoreType2["ENCRYPTION"] = "encryption";
7
+ KeystoreType2["RECOVERY"] = "recovery";
8
+ KeystoreType2["INDEX"] = "index";
9
+ return KeystoreType2;
10
+ })(KeystoreType || {});
11
+
12
+ exports.KeystoreType = KeystoreType;
13
+ //# sourceMappingURL=types.js.map
14
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types.ts"],"names":["KeystoreType"],"mappings":";;;AAAO,IAAK,YAAA,qBAAAA,aAAAA,KAAL;AACL,EAAAA,cAAA,UAAA,CAAA,GAAW,UAAA;AACX,EAAAA,cAAA,YAAA,CAAA,GAAa,YAAA;AACb,EAAAA,cAAA,UAAA,CAAA,GAAW,UAAA;AACX,EAAAA,cAAA,OAAA,CAAA,GAAQ,OAAA;AAJE,EAAA,OAAAA,aAAAA;AAAA,CAAA,EAAA,YAAA,IAAA,EAAA","file":"types.js","sourcesContent":["export enum KeystoreType {\n IDENTITY = 'identity',\n ENCRYPTION = 'encryption',\n RECOVERY = 'recovery',\n INDEX = 'index',\n}\n\nexport type EncryptedKeystore = {\n userID: string;\n type: KeystoreType;\n encryptedKeys: SymmetricCiphertext;\n};\n\nexport type User = {\n email: string;\n name: string;\n};\n\nexport type UserWithPublicKeys = User & {\n publicKeys: PublicKeys;\n};\n\nexport type PublicKeys = {\n eccPublicKey: CryptoKey;\n kyberPublicKey: Uint8Array;\n};\n\nexport type MediaKeys = {\n olmKey: Uint8Array;\n pqKey: Uint8Array;\n index: number;\n userID: string;\n};\n\nexport type PrivateKeys = {\n eccPrivateKey: CryptoKey;\n kyberPrivateKey: Uint8Array;\n};\n\nexport type IdentityKeys = {\n userPublicKey: CryptoKey;\n userPrivateKey: CryptoKey;\n};\n\nexport type EncryptionKeys = {\n userPublicKey: CryptoKey;\n userPrivateKey: CryptoKey;\n userPublicKyberKey: Uint8Array;\n userPrivateKyberKey: Uint8Array;\n};\n\nexport type HybridEncryptedEmail = {\n encryptedKey: HybridEncKey;\n enc: SymmetricCiphertext;\n recipientEmail: string;\n params: EmailPublicParameters;\n id: string;\n};\n\nexport type PwdProtectedEmail = {\n encryptedKey: PwdProtectedKey;\n enc: SymmetricCiphertext;\n params: EmailPublicParameters;\n id: string;\n};\n\nexport type SymmetricCiphertext = {\n ciphertext: Uint8Array;\n iv: Uint8Array;\n};\n\nexport type StoredEmail = {\n params: EmailPublicParameters;\n content: SymmetricCiphertext;\n id: string;\n};\n\nexport type HybridEncKey = {\n kyberCiphertext: Uint8Array;\n encryptedKey: Uint8Array;\n};\n\nexport type PwdProtectedKey = {\n encryptedKey: Uint8Array;\n salt: Uint8Array;\n};\n\nexport type EmailBody = {\n text: string;\n attachments?: string[];\n};\n\nexport type EmailPublicParameters = {\n subject: string;\n createdAt: string;\n sender: User;\n recipient: User;\n recipients?: User[];\n replyToEmailID?: number;\n labels?: string[];\n};\n\nexport type Email = {\n id: string;\n body: EmailBody;\n params: EmailPublicParameters;\n};\n\nexport interface MailCache<Email> {\n esCache: Map<string, Email>;\n cacheSize: number;\n isCacheLimited: boolean;\n isCacheReady: boolean;\n}\nexport interface EmailSearchResult {\n email: Email;\n score?: number;\n}\n"]}
package/dist/types.mjs ADDED
@@ -0,0 +1,12 @@
1
+ // src/types.ts
2
+ var KeystoreType = /* @__PURE__ */ ((KeystoreType2) => {
3
+ KeystoreType2["IDENTITY"] = "identity";
4
+ KeystoreType2["ENCRYPTION"] = "encryption";
5
+ KeystoreType2["RECOVERY"] = "recovery";
6
+ KeystoreType2["INDEX"] = "index";
7
+ return KeystoreType2;
8
+ })(KeystoreType || {});
9
+
10
+ export { KeystoreType };
11
+ //# sourceMappingURL=types.mjs.map
12
+ //# sourceMappingURL=types.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types.ts"],"names":["KeystoreType"],"mappings":";AAAO,IAAK,YAAA,qBAAAA,aAAAA,KAAL;AACL,EAAAA,cAAA,UAAA,CAAA,GAAW,UAAA;AACX,EAAAA,cAAA,YAAA,CAAA,GAAa,YAAA;AACb,EAAAA,cAAA,UAAA,CAAA,GAAW,UAAA;AACX,EAAAA,cAAA,OAAA,CAAA,GAAQ,OAAA;AAJE,EAAA,OAAAA,aAAAA;AAAA,CAAA,EAAA,YAAA,IAAA,EAAA","file":"types.mjs","sourcesContent":["export enum KeystoreType {\n IDENTITY = 'identity',\n ENCRYPTION = 'encryption',\n RECOVERY = 'recovery',\n INDEX = 'index',\n}\n\nexport type EncryptedKeystore = {\n userID: string;\n type: KeystoreType;\n encryptedKeys: SymmetricCiphertext;\n};\n\nexport type User = {\n email: string;\n name: string;\n};\n\nexport type UserWithPublicKeys = User & {\n publicKeys: PublicKeys;\n};\n\nexport type PublicKeys = {\n eccPublicKey: CryptoKey;\n kyberPublicKey: Uint8Array;\n};\n\nexport type MediaKeys = {\n olmKey: Uint8Array;\n pqKey: Uint8Array;\n index: number;\n userID: string;\n};\n\nexport type PrivateKeys = {\n eccPrivateKey: CryptoKey;\n kyberPrivateKey: Uint8Array;\n};\n\nexport type IdentityKeys = {\n userPublicKey: CryptoKey;\n userPrivateKey: CryptoKey;\n};\n\nexport type EncryptionKeys = {\n userPublicKey: CryptoKey;\n userPrivateKey: CryptoKey;\n userPublicKyberKey: Uint8Array;\n userPrivateKyberKey: Uint8Array;\n};\n\nexport type HybridEncryptedEmail = {\n encryptedKey: HybridEncKey;\n enc: SymmetricCiphertext;\n recipientEmail: string;\n params: EmailPublicParameters;\n id: string;\n};\n\nexport type PwdProtectedEmail = {\n encryptedKey: PwdProtectedKey;\n enc: SymmetricCiphertext;\n params: EmailPublicParameters;\n id: string;\n};\n\nexport type SymmetricCiphertext = {\n ciphertext: Uint8Array;\n iv: Uint8Array;\n};\n\nexport type StoredEmail = {\n params: EmailPublicParameters;\n content: SymmetricCiphertext;\n id: string;\n};\n\nexport type HybridEncKey = {\n kyberCiphertext: Uint8Array;\n encryptedKey: Uint8Array;\n};\n\nexport type PwdProtectedKey = {\n encryptedKey: Uint8Array;\n salt: Uint8Array;\n};\n\nexport type EmailBody = {\n text: string;\n attachments?: string[];\n};\n\nexport type EmailPublicParameters = {\n subject: string;\n createdAt: string;\n sender: User;\n recipient: User;\n recipients?: User[];\n replyToEmailID?: number;\n labels?: string[];\n};\n\nexport type Email = {\n id: string;\n body: EmailBody;\n params: EmailPublicParameters;\n};\n\nexport interface MailCache<Email> {\n esCache: Map<string, Email>;\n cacheSize: number;\n isCacheLimited: boolean;\n isCacheReady: boolean;\n}\nexport interface EmailSearchResult {\n email: Email;\n score?: number;\n}\n"]}