internxt-crypto 0.0.9-alpha → 0.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -4
- package/dist/asymmetric-crypto-BORmLhnx.js +143 -0
- package/dist/asymmetric-crypto-BORmLhnx.js.map +1 -0
- package/dist/asymmetric-crypto-CyXsV4XT.mjs +102 -0
- package/dist/asymmetric-crypto-CyXsV4XT.mjs.map +1 -0
- package/dist/asymmetric-crypto.d.mts +47 -0
- package/dist/asymmetric-crypto.d.ts +47 -0
- package/dist/asymmetric-crypto.js +8 -0
- package/dist/asymmetric-crypto.mjs +3 -0
- package/dist/chunk-DWirmd9C.mjs +18 -0
- package/dist/chunk-Dt-PWiN7.js +60 -0
- package/dist/constants-Ccp21E03.js +208 -0
- package/dist/constants-Ccp21E03.js.map +1 -0
- package/dist/constants-kTeX-2T0.mjs +34 -0
- package/dist/constants-kTeX-2T0.mjs.map +1 -0
- package/dist/constants.d.mts +33 -0
- package/dist/constants.d.ts +33 -0
- package/dist/constants.js +31 -0
- package/dist/constants.mjs +3 -0
- package/dist/derive-key-Be7hS-cN.mjs +751 -0
- package/dist/derive-key-Be7hS-cN.mjs.map +1 -0
- package/dist/derive-key-CBf2WxJd.js +2513 -0
- package/dist/derive-key-CBf2WxJd.js.map +1 -0
- package/dist/derive-key.d.mts +97 -0
- package/dist/derive-key.d.ts +97 -0
- package/dist/derive-key.js +15 -0
- package/dist/derive-key.mjs +6 -0
- package/dist/email-crypto-BrT98taw.js +617 -0
- package/dist/email-crypto-BrT98taw.js.map +1 -0
- package/dist/email-crypto-DJUEjTxA.mjs +534 -0
- package/dist/email-crypto-DJUEjTxA.mjs.map +1 -0
- package/dist/email-crypto.d.mts +86 -0
- package/dist/email-crypto.d.ts +86 -0
- package/dist/email-crypto.js +17 -0
- package/dist/email-crypto.mjs +8 -0
- package/dist/email-search.d.mts +235 -0
- package/dist/email-search.d.ts +235 -0
- package/dist/email-search.js +637 -0
- package/dist/email-search.js.map +1 -0
- package/dist/email-search.mjs +608 -0
- package/dist/email-search.mjs.map +1 -0
- package/dist/hash-BoqwNkcd.js +190 -0
- package/dist/hash-BoqwNkcd.js.map +1 -0
- package/dist/hash-CXeGAwai.mjs +131 -0
- package/dist/hash-CXeGAwai.mjs.map +1 -0
- package/dist/hash.d.mts +65 -0
- package/dist/hash.d.ts +65 -0
- package/dist/hash.js +11 -0
- package/dist/hash.mjs +3 -0
- package/dist/index-CQqgKsbX.d.ts +50 -0
- package/dist/index-CintVUbp.d.ts +97 -0
- package/dist/index-D5pBU_A5.d.mts +50 -0
- package/dist/index-MaOov-ag.d.mts +97 -0
- package/dist/index.d.mts +52 -0
- package/dist/index.d.ts +52 -0
- package/dist/index.js +116 -2055
- package/dist/index.mjs +15 -8712
- package/dist/keystore-crypto-B4yCVo9l.js +182 -0
- package/dist/keystore-crypto-B4yCVo9l.js.map +1 -0
- package/dist/keystore-crypto-Bjgriq9h.mjs +159 -0
- package/dist/keystore-crypto-Bjgriq9h.mjs.map +1 -0
- package/dist/keystore-crypto.d.mts +40 -0
- package/dist/keystore-crypto.d.ts +40 -0
- package/dist/keystore-crypto.js +11 -0
- package/dist/keystore-crypto.mjs +9 -0
- package/dist/keystore-service.d.mts +48 -0
- package/dist/keystore-service.d.ts +48 -0
- package/dist/keystore-service.js +122 -0
- package/dist/keystore-service.js.map +1 -0
- package/dist/keystore-service.mjs +114 -0
- package/dist/keystore-service.mjs.map +1 -0
- package/dist/post-quantum-crypto-CAi-cEkV.js +189 -0
- package/dist/post-quantum-crypto-CAi-cEkV.js.map +1 -0
- package/dist/post-quantum-crypto-Vv34t6gX.mjs +154 -0
- package/dist/post-quantum-crypto-Vv34t6gX.mjs.map +1 -0
- package/dist/post-quantum-crypto.d.mts +2 -0
- package/dist/post-quantum-crypto.d.ts +2 -0
- package/dist/post-quantum-crypto.js +17 -0
- package/dist/post-quantum-crypto.mjs +3 -0
- package/dist/storage-service-BgIK2aYZ.js +82 -0
- package/dist/storage-service-BgIK2aYZ.js.map +1 -0
- package/dist/storage-service-CubCbhY2.mjs +65 -0
- package/dist/storage-service-CubCbhY2.mjs.map +1 -0
- package/dist/storage-service.d.mts +2 -0
- package/dist/storage-service.d.ts +2 -0
- package/dist/storage-service.js +14 -0
- package/dist/storage-service.mjs +3 -0
- package/dist/symmetric-crypto-CrdS1Che.mjs +197 -0
- package/dist/symmetric-crypto-CrdS1Che.mjs.map +1 -0
- package/dist/symmetric-crypto-D65zB396.js +244 -0
- package/dist/symmetric-crypto-D65zB396.js.map +1 -0
- package/dist/symmetric-crypto.d.mts +60 -0
- package/dist/symmetric-crypto.d.ts +60 -0
- package/dist/symmetric-crypto.js +10 -0
- package/dist/symmetric-crypto.mjs +4 -0
- package/dist/types-52g887Zi.js +16 -0
- package/dist/types-52g887Zi.js.map +1 -0
- package/dist/types-BiEoleqw.mjs +10 -0
- package/dist/types-BiEoleqw.mjs.map +1 -0
- package/dist/types-Ds3ivE9W.d.ts +104 -0
- package/dist/types-DwQJtrTx.d.mts +104 -0
- package/dist/types.d.mts +2 -0
- package/dist/types.d.ts +2 -0
- package/dist/types.js +3 -0
- package/dist/types.mjs +3 -0
- package/dist/utils-CNs3cyDj.js +263 -0
- package/dist/utils-CNs3cyDj.js.map +1 -0
- package/dist/utils-DS04iUcX.mjs +173 -0
- package/dist/utils-DS04iUcX.mjs.map +1 -0
- package/dist/utils.d.mts +99 -0
- package/dist/utils.d.ts +99 -0
- package/dist/utils.js +16 -0
- package/dist/utils.mjs +3 -0
- package/package.json +12 -11
- package/dist/__vite-browser-external-Dyvby5gX.js +0 -2
- package/dist/__vite-browser-external-Dyvby5gX.js.map +0 -1
- package/dist/__vite-browser-external-l0sNRNKZ.mjs +0 -2
- package/dist/__vite-browser-external-l0sNRNKZ.mjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/index.mjs.map +0 -1
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
const require_chunk = require('./chunk-Dt-PWiN7.js');
|
|
2
|
+
const require_constants = require('./constants-Ccp21E03.js');
|
|
3
|
+
const require_asymmetric_crypto = require('./asymmetric-crypto-BORmLhnx.js');
|
|
4
|
+
const require_utils = require('./utils-CNs3cyDj.js');
|
|
5
|
+
const require_hash = require('./hash-BoqwNkcd.js');
|
|
6
|
+
const require_symmetric_crypto = require('./symmetric-crypto-D65zB396.js');
|
|
7
|
+
const require_derive_key = require('./derive-key-CBf2WxJd.js');
|
|
8
|
+
const require_email_crypto = require('./email-crypto-BrT98taw.js');
|
|
9
|
+
const require_types = require('./types-52g887Zi.js');
|
|
10
|
+
|
|
11
|
+
//#region src/keystore-crypto/core.ts
|
|
12
|
+
/**
|
|
13
|
+
* Encrypts the keystore content using symmetric encryption
|
|
14
|
+
*
|
|
15
|
+
* @param secretKey - The symmetric key to encrypt the keystore content
|
|
16
|
+
* @param content - The content of the keystore
|
|
17
|
+
* @param userID - The ID of the user
|
|
18
|
+
* @param tag - The keystore type-specific tag string
|
|
19
|
+
* @returns The encrypted keystore content
|
|
20
|
+
*/
|
|
21
|
+
async function encryptKeystoreContent(secretKey, keys, userEmail, type) {
|
|
22
|
+
try {
|
|
23
|
+
const aux = require_utils.UTF8ToUint8(userEmail + type);
|
|
24
|
+
const publicKeys = await require_utils.publicKeyToBase64(keys.publicKeys);
|
|
25
|
+
const kyberPrivateKeyEnc = await require_symmetric_crypto.encryptSymmetrically(secretKey, keys.privateKeys.kyberPrivateKey, aux);
|
|
26
|
+
const eccPrivateKeyEnc = await require_symmetric_crypto.encryptSymmetrically(secretKey, await require_asymmetric_crypto.exportPrivateKey(keys.privateKeys.eccPrivateKey), aux);
|
|
27
|
+
return {
|
|
28
|
+
userEmail,
|
|
29
|
+
type,
|
|
30
|
+
encryptedKeys: {
|
|
31
|
+
publicKeys,
|
|
32
|
+
privateKeys: {
|
|
33
|
+
kyberPrivateKeyBase64: require_utils.uint8ArrayToBase64(kyberPrivateKeyEnc),
|
|
34
|
+
eccPrivateKeyBase64: require_utils.uint8ArrayToBase64(eccPrivateKeyEnc)
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
} catch (error) {
|
|
39
|
+
throw new Error("Failed to encrypt keystore content", { cause: error });
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Decrypts the keystore content using symmetric encryption
|
|
44
|
+
*
|
|
45
|
+
* @param secretKey - The symmetric key to decrypt the keystore content
|
|
46
|
+
* @param encryptedKeys - The encrypted keystore content
|
|
47
|
+
* @param userEmail - The ID of the user
|
|
48
|
+
* @param tag - The keystore type-specific tag string
|
|
49
|
+
* @returns The decrypted keystore content
|
|
50
|
+
*/
|
|
51
|
+
async function decryptKeystoreContent(secretKey, encryptedKeystore) {
|
|
52
|
+
try {
|
|
53
|
+
const aux = require_utils.UTF8ToUint8(encryptedKeystore.userEmail + encryptedKeystore.type);
|
|
54
|
+
const kyberPublicKey = require_utils.base64ToUint8Array(encryptedKeystore.encryptedKeys.publicKeys.kyberPublicKeyBase64);
|
|
55
|
+
const eccPublicKey = await require_asymmetric_crypto.importPublicKey(require_utils.base64ToUint8Array(encryptedKeystore.encryptedKeys.publicKeys.eccPublicKeyBase64));
|
|
56
|
+
const kyberPrivateKey = await require_symmetric_crypto.decryptSymmetrically(secretKey, require_utils.base64ToUint8Array(encryptedKeystore.encryptedKeys.privateKeys.kyberPrivateKeyBase64), aux);
|
|
57
|
+
const eccPrivateKey = await require_asymmetric_crypto.importPrivateKey(await require_symmetric_crypto.decryptSymmetrically(secretKey, require_utils.base64ToUint8Array(encryptedKeystore.encryptedKeys.privateKeys.eccPrivateKeyBase64), aux));
|
|
58
|
+
return {
|
|
59
|
+
publicKeys: {
|
|
60
|
+
kyberPublicKey,
|
|
61
|
+
eccPublicKey
|
|
62
|
+
},
|
|
63
|
+
privateKeys: {
|
|
64
|
+
kyberPrivateKey,
|
|
65
|
+
eccPrivateKey
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
} catch (error) {
|
|
69
|
+
throw new Error("Failed to decrypt keystore content", { cause: error });
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Derives a secret key for protecting the recovery keystore
|
|
74
|
+
*
|
|
75
|
+
* @param recoveryCodes - The recovery codes
|
|
76
|
+
* @returns The derived secret key for protecting the recovery keystore
|
|
77
|
+
*/
|
|
78
|
+
async function deriveRecoveryKey(recoveryCodes) {
|
|
79
|
+
const recoverCodesArray = require_utils.mnemonicToBytes(recoveryCodes);
|
|
80
|
+
return require_derive_key.deriveSymmetricCryptoKeyFromContext(require_constants.CONTEXT_RECOVERY, require_hash.getBytesFromData(require_constants.AES_KEY_BIT_LENGTH / 8, recoverCodesArray));
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Derives a secret key for protecting the encryption keystore
|
|
84
|
+
*
|
|
85
|
+
* @param baseKey - The base secret key from which a new key secret will be derived
|
|
86
|
+
* @returns The derived secret key for protecting the encryption keystore
|
|
87
|
+
*/
|
|
88
|
+
async function deriveEncryptionKeystoreKey(baseKey) {
|
|
89
|
+
return require_derive_key.deriveSymmetricCryptoKeyFromContext(require_constants.CONTEXT_ENC_KEYSTORE, baseKey);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
//#endregion
|
|
93
|
+
//#region src/keystore-crypto/emailEncryptionKey.ts
|
|
94
|
+
/**
|
|
95
|
+
* Generates email keys and creates encrypted main and recovery keystores
|
|
96
|
+
* The main keystore encryption key is derived from the base key (stored in session storage)
|
|
97
|
+
* The recovery keystore encryption key is derived from the recovery codes
|
|
98
|
+
*
|
|
99
|
+
* @returns The encryption and recovery keystores, recovery codes and email keys
|
|
100
|
+
*/
|
|
101
|
+
async function createEncryptionAndRecoveryKeystores(userEmail, baseKey) {
|
|
102
|
+
try {
|
|
103
|
+
const keys = await require_email_crypto.generateEmailKeys();
|
|
104
|
+
const encryptionKeystore = await encryptKeystoreContent(await deriveEncryptionKeystoreKey(baseKey), keys, userEmail, require_types.KeystoreType.ENCRYPTION);
|
|
105
|
+
const recoveryCodes = require_utils.genMnemonic();
|
|
106
|
+
return {
|
|
107
|
+
encryptionKeystore,
|
|
108
|
+
recoveryKeystore: await encryptKeystoreContent(await deriveRecoveryKey(recoveryCodes), keys, userEmail, require_types.KeystoreType.RECOVERY),
|
|
109
|
+
recoveryCodes,
|
|
110
|
+
keys
|
|
111
|
+
};
|
|
112
|
+
} catch (error) {
|
|
113
|
+
throw new Error("Failed to create encryption and recovery keystores", { cause: error });
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Opens the encryption keystore and returns the email encryption keys
|
|
118
|
+
* The decryption key is derived from the base key (stored in session storage)
|
|
119
|
+
*
|
|
120
|
+
* @param encryptedKeystore - The encrypted keystore containing encryption keys
|
|
121
|
+
* @param baseKey - The base key from which the decryption key will be derived
|
|
122
|
+
* @returns The encryption keys
|
|
123
|
+
*/
|
|
124
|
+
async function openEncryptionKeystore(encryptedKeystore, baseKey) {
|
|
125
|
+
try {
|
|
126
|
+
if (encryptedKeystore.type != require_types.KeystoreType.ENCRYPTION) throw new Error("Input is invalid");
|
|
127
|
+
return await decryptKeystoreContent(await deriveEncryptionKeystoreKey(baseKey), encryptedKeystore);
|
|
128
|
+
} catch (error) {
|
|
129
|
+
throw new Error("Failed to open encryption keystore", { cause: error });
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Opens the recovery keystore and returns the email encryption keys
|
|
134
|
+
* The decryption key is derived from the base key (stored in session storage)
|
|
135
|
+
*
|
|
136
|
+
* @param recoveryCodes - The user's recovery codes
|
|
137
|
+
* @param encryptedKeystore - The encrypted keystore containing encryption keys
|
|
138
|
+
* @returns The encryption keys
|
|
139
|
+
*/
|
|
140
|
+
async function openRecoveryKeystore(recoveryCodes, encryptedKeystore) {
|
|
141
|
+
try {
|
|
142
|
+
if (encryptedKeystore.type != require_types.KeystoreType.RECOVERY) throw new Error("Input is invalid");
|
|
143
|
+
return await decryptKeystoreContent(await deriveRecoveryKey(recoveryCodes), encryptedKeystore);
|
|
144
|
+
} catch (error) {
|
|
145
|
+
throw new Error("Failed to open recovery keystore", { cause: error });
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
//#endregion
|
|
150
|
+
//#region src/keystore-crypto/index.ts
|
|
151
|
+
var keystore_crypto_exports = /* @__PURE__ */ require_chunk.__exportAll({
|
|
152
|
+
createEncryptionAndRecoveryKeystores: () => createEncryptionAndRecoveryKeystores,
|
|
153
|
+
openEncryptionKeystore: () => openEncryptionKeystore,
|
|
154
|
+
openRecoveryKeystore: () => openRecoveryKeystore
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
//#endregion
|
|
158
|
+
Object.defineProperty(exports, 'createEncryptionAndRecoveryKeystores', {
|
|
159
|
+
enumerable: true,
|
|
160
|
+
get: function () {
|
|
161
|
+
return createEncryptionAndRecoveryKeystores;
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
Object.defineProperty(exports, 'keystore_crypto_exports', {
|
|
165
|
+
enumerable: true,
|
|
166
|
+
get: function () {
|
|
167
|
+
return keystore_crypto_exports;
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
Object.defineProperty(exports, 'openEncryptionKeystore', {
|
|
171
|
+
enumerable: true,
|
|
172
|
+
get: function () {
|
|
173
|
+
return openEncryptionKeystore;
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
Object.defineProperty(exports, 'openRecoveryKeystore', {
|
|
177
|
+
enumerable: true,
|
|
178
|
+
get: function () {
|
|
179
|
+
return openRecoveryKeystore;
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
//# sourceMappingURL=keystore-crypto-B4yCVo9l.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keystore-crypto-B4yCVo9l.js","names":["UTF8ToUint8","publicKeyToBase64","encryptSymmetrically","exportPrivateKey","uint8ArrayToBase64","base64ToUint8Array","importPublicKey","decryptSymmetrically","importPrivateKey","mnemonicToBytes","deriveSymmetricCryptoKeyFromContext","CONTEXT_RECOVERY","getBytesFromData","AES_KEY_BIT_LENGTH","CONTEXT_ENC_KEYSTORE","generateEmailKeys","KeystoreType","genMnemonic"],"sources":["../src/keystore-crypto/core.ts","../src/keystore-crypto/emailEncryptionKey.ts","../src/keystore-crypto/index.ts"],"sourcesContent":["import { encryptSymmetrically, decryptSymmetrically } from '../symmetric-crypto';\nimport { base64ToUint8Array, uint8ArrayToBase64, UTF8ToUint8, mnemonicToBytes, publicKeyToBase64 } from '../utils';\nimport { deriveSymmetricCryptoKeyFromContext } from '../derive-key';\nimport { CONTEXT_ENC_KEYSTORE, AES_KEY_BIT_LENGTH, CONTEXT_RECOVERY } from '../constants';\nimport { getBytesFromData } from '../hash';\nimport { EmailKeys, EncryptedKeystore, KeystoreType } from 'types';\nimport { exportPrivateKey, importPrivateKey, importPublicKey } from '../asymmetric-crypto';\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 keys: EmailKeys,\n userEmail: string,\n type: KeystoreType,\n): Promise<EncryptedKeystore> {\n try {\n const aux = UTF8ToUint8(userEmail + type);\n const publicKeys = await publicKeyToBase64(keys.publicKeys);\n const kyberPrivateKeyEnc = await encryptSymmetrically(secretKey, keys.privateKeys.kyberPrivateKey, aux);\n const eccPrivateKey = await exportPrivateKey(keys.privateKeys.eccPrivateKey);\n const eccPrivateKeyEnc = await encryptSymmetrically(secretKey, eccPrivateKey, aux);\n const encryptedKeys = {\n publicKeys,\n privateKeys: {\n kyberPrivateKeyBase64: uint8ArrayToBase64(kyberPrivateKeyEnc),\n eccPrivateKeyBase64: uint8ArrayToBase64(eccPrivateKeyEnc),\n },\n };\n\n const keystore: EncryptedKeystore = {\n userEmail,\n type,\n encryptedKeys,\n };\n return keystore;\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 userEmail - 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 encryptedKeystore: EncryptedKeystore,\n): Promise<EmailKeys> {\n try {\n const aux = UTF8ToUint8(encryptedKeystore.userEmail + encryptedKeystore.type);\n const kyberPublicKey = base64ToUint8Array(encryptedKeystore.encryptedKeys.publicKeys.kyberPublicKeyBase64);\n const eccPublicArray = base64ToUint8Array(encryptedKeystore.encryptedKeys.publicKeys.eccPublicKeyBase64);\n const eccPublicKey = await importPublicKey(eccPublicArray);\n const encKyberPrivateKey = base64ToUint8Array(encryptedKeystore.encryptedKeys.privateKeys.kyberPrivateKeyBase64);\n const kyberPrivateKey = await decryptSymmetrically(secretKey, encKyberPrivateKey, aux);\n const eccEncArray = base64ToUint8Array(encryptedKeystore.encryptedKeys.privateKeys.eccPrivateKeyBase64);\n const eccKey = await decryptSymmetrically(secretKey, eccEncArray, aux);\n const eccPrivateKey = await importPrivateKey(eccKey);\n const keys = {\n publicKeys: {\n kyberPublicKey,\n eccPublicKey,\n },\n privateKeys: {\n kyberPrivateKey,\n eccPrivateKey,\n },\n };\n return keys;\n } catch (error) {\n throw new Error('Failed to decrypt keystore content', { cause: error });\n }\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 recoverCodesArray = mnemonicToBytes(recoveryCodes);\n const recoveryCodesBuffer = getBytesFromData(AES_KEY_BIT_LENGTH / 8, recoverCodesArray);\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 */\nexport async function deriveEncryptionKeystoreKey(baseKey: Uint8Array): Promise<CryptoKey> {\n return deriveSymmetricCryptoKeyFromContext(CONTEXT_ENC_KEYSTORE, baseKey);\n}\n","import { EmailKeys, EncryptedKeystore, KeystoreType } from '../types';\nimport { genMnemonic } from '../utils';\nimport { encryptKeystoreContent, decryptKeystoreContent, deriveEncryptionKeystoreKey, deriveRecoveryKey } from './core';\nimport { generateEmailKeys } from '../email-crypto';\n\n/**\n * Generates email keys and creates encrypted main and recovery keystores\n * The main keystore encryption key is derived from the base key (stored in session storage)\n * The recovery keystore encryption key is derived from the recovery codes\n *\n * @returns The encryption and recovery keystores, recovery codes and email keys\n */\nexport async function createEncryptionAndRecoveryKeystores(\n userEmail: string,\n baseKey: Uint8Array,\n): Promise<{\n encryptionKeystore: EncryptedKeystore;\n recoveryKeystore: EncryptedKeystore;\n recoveryCodes: string;\n keys: EmailKeys;\n}> {\n try {\n const keys = await generateEmailKeys();\n\n const secretKey = await deriveEncryptionKeystoreKey(baseKey);\n const encryptionKeystore = await encryptKeystoreContent(secretKey, keys, userEmail, KeystoreType.ENCRYPTION);\n\n const recoveryCodes = genMnemonic();\n const recoveryKey = await deriveRecoveryKey(recoveryCodes);\n const recoveryKeystore = await encryptKeystoreContent(recoveryKey, keys, userEmail, KeystoreType.RECOVERY);\n\n return { encryptionKeystore, recoveryKeystore, recoveryCodes, keys };\n } catch (error) {\n throw new Error('Failed to create encryption and recovery keystores', { cause: error });\n }\n}\n\n/**\n * Opens the encryption keystore and returns the email encryption keys\n * The decryption key is derived from the base key (stored in session storage)\n *\n * @param encryptedKeystore - The encrypted keystore containing encryption keys\n * @param baseKey - The base key from which the decryption key will be derived\n * @returns The encryption keys\n */\nexport async function openEncryptionKeystore(\n encryptedKeystore: EncryptedKeystore,\n baseKey: Uint8Array,\n): Promise<EmailKeys> {\n try {\n if (encryptedKeystore.type != KeystoreType.ENCRYPTION) {\n throw new Error('Input is invalid');\n }\n const secretKey = await deriveEncryptionKeystoreKey(baseKey);\n const keys = await decryptKeystoreContent(secretKey, encryptedKeystore);\n return keys;\n } catch (error) {\n throw new Error('Failed to open encryption keystore', { cause: error });\n }\n}\n\n/**\n * Opens the recovery keystore and returns the email encryption keys\n * The decryption key is derived from the base key (stored in session storage)\n *\n * @param recoveryCodes - The user's recovery codes\n * @param encryptedKeystore - The encrypted keystore containing encryption keys\n * @returns The encryption keys\n */\nexport async function openRecoveryKeystore(\n recoveryCodes: string,\n encryptedKeystore: EncryptedKeystore,\n): Promise<EmailKeys> {\n try {\n if (encryptedKeystore.type != KeystoreType.RECOVERY) {\n throw new Error('Input is invalid');\n }\n const recoveryKey = await deriveRecoveryKey(recoveryCodes);\n const keys = await decryptKeystoreContent(recoveryKey, encryptedKeystore);\n return keys;\n } catch (error) {\n throw new Error('Failed to open recovery keystore', { cause: error });\n }\n}\n","export * from './emailEncryptionKey';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAiBA,eAAsB,uBACpB,WACA,MACA,WACA,MAC4B;AAC5B,KAAI;EACF,MAAM,MAAMA,0BAAY,YAAY,KAAK;EACzC,MAAM,aAAa,MAAMC,gCAAkB,KAAK,WAAW;EAC3D,MAAM,qBAAqB,MAAMC,8CAAqB,WAAW,KAAK,YAAY,iBAAiB,IAAI;EAEvG,MAAM,mBAAmB,MAAMA,8CAAqB,WAD9B,MAAMC,2CAAiB,KAAK,YAAY,cAAc,EACE,IAAI;AAclF,SALoC;GAClC;GACA;GACA,eAXoB;IACpB;IACA,aAAa;KACX,uBAAuBC,iCAAmB,mBAAmB;KAC7D,qBAAqBA,iCAAmB,iBAAiB;KAC1D;IACF;GAMA;UAEM,OAAO;AACd,QAAM,IAAI,MAAM,sCAAsC,EAAE,OAAO,OAAO,CAAC;;;;;;;;;;;;AAa3E,eAAsB,uBACpB,WACA,mBACoB;AACpB,KAAI;EACF,MAAM,MAAMJ,0BAAY,kBAAkB,YAAY,kBAAkB,KAAK;EAC7E,MAAM,iBAAiBK,iCAAmB,kBAAkB,cAAc,WAAW,qBAAqB;EAE1G,MAAM,eAAe,MAAMC,0CADJD,iCAAmB,kBAAkB,cAAc,WAAW,mBAAmB,CAC9C;EAE1D,MAAM,kBAAkB,MAAME,8CAAqB,WADxBF,iCAAmB,kBAAkB,cAAc,YAAY,sBAAsB,EAC9B,IAAI;EAGtF,MAAM,gBAAgB,MAAMG,2CADb,MAAMD,8CAAqB,WADtBF,iCAAmB,kBAAkB,cAAc,YAAY,oBAAoB,EACrC,IAAI,CAClB;AAWpD,SAVa;GACX,YAAY;IACV;IACA;IACD;GACD,aAAa;IACX;IACA;IACD;GACF;UAEM,OAAO;AACd,QAAM,IAAI,MAAM,sCAAsC,EAAE,OAAO,OAAO,CAAC;;;;;;;;;AAU3E,eAAsB,kBAAkB,eAA2C;CACjF,MAAM,oBAAoBI,8BAAgB,cAAc;AAExD,QAAOC,uDAAoCC,oCADfC,8BAAiBC,uCAAqB,GAAG,kBAAkB,CACN;;;;;;;;AASnF,eAAsB,4BAA4B,SAAyC;AACzF,QAAOH,uDAAoCI,wCAAsB,QAAQ;;;;;;;;;;;;AC9F3E,eAAsB,qCACpB,WACA,SAMC;AACD,KAAI;EACF,MAAM,OAAO,MAAMC,wCAAmB;EAGtC,MAAM,qBAAqB,MAAM,uBADf,MAAM,4BAA4B,QAAQ,EACO,MAAM,WAAWC,2BAAa,WAAW;EAE5G,MAAM,gBAAgBC,2BAAa;AAInC,SAAO;GAAE;GAAoB,kBAFJ,MAAM,uBADX,MAAM,kBAAkB,cAAc,EACS,MAAM,WAAWD,2BAAa,SAAS;GAE3D;GAAe;GAAM;UAC7D,OAAO;AACd,QAAM,IAAI,MAAM,sDAAsD,EAAE,OAAO,OAAO,CAAC;;;;;;;;;;;AAY3F,eAAsB,uBACpB,mBACA,SACoB;AACpB,KAAI;AACF,MAAI,kBAAkB,QAAQA,2BAAa,WACzC,OAAM,IAAI,MAAM,mBAAmB;AAIrC,SADa,MAAM,uBADD,MAAM,4BAA4B,QAAQ,EACP,kBAAkB;UAEhE,OAAO;AACd,QAAM,IAAI,MAAM,sCAAsC,EAAE,OAAO,OAAO,CAAC;;;;;;;;;;;AAY3E,eAAsB,qBACpB,eACA,mBACoB;AACpB,KAAI;AACF,MAAI,kBAAkB,QAAQA,2BAAa,SACzC,OAAM,IAAI,MAAM,mBAAmB;AAIrC,SADa,MAAM,uBADC,MAAM,kBAAkB,cAAc,EACH,kBAAkB;UAElE,OAAO;AACd,QAAM,IAAI,MAAM,oCAAoC,EAAE,OAAO,OAAO,CAAC"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { t as __exportAll } from "./chunk-DWirmd9C.mjs";
|
|
2
|
+
import { f as CONTEXT_RECOVERY, n as AES_KEY_BIT_LENGTH, u as CONTEXT_ENC_KEYSTORE } from "./constants-kTeX-2T0.mjs";
|
|
3
|
+
import { a as importPrivateKey, n as exportPrivateKey, o as importPublicKey } from "./asymmetric-crypto-CyXsV4XT.mjs";
|
|
4
|
+
import { d as base64ToUint8Array, l as publicKeyToBase64, o as genMnemonic, p as uint8ArrayToBase64, s as mnemonicToBytes, u as UTF8ToUint8 } from "./utils-DS04iUcX.mjs";
|
|
5
|
+
import { r as getBytesFromData } from "./hash-CXeGAwai.mjs";
|
|
6
|
+
import { n as decryptSymmetrically, r as encryptSymmetrically } from "./symmetric-crypto-CrdS1Che.mjs";
|
|
7
|
+
import { s as deriveSymmetricCryptoKeyFromContext } from "./derive-key-Be7hS-cN.mjs";
|
|
8
|
+
import { n as generateEmailKeys } from "./email-crypto-DJUEjTxA.mjs";
|
|
9
|
+
import { t as KeystoreType } from "./types-BiEoleqw.mjs";
|
|
10
|
+
|
|
11
|
+
//#region src/keystore-crypto/core.ts
|
|
12
|
+
/**
|
|
13
|
+
* Encrypts the keystore content using symmetric encryption
|
|
14
|
+
*
|
|
15
|
+
* @param secretKey - The symmetric key to encrypt the keystore content
|
|
16
|
+
* @param content - The content of the keystore
|
|
17
|
+
* @param userID - The ID of the user
|
|
18
|
+
* @param tag - The keystore type-specific tag string
|
|
19
|
+
* @returns The encrypted keystore content
|
|
20
|
+
*/
|
|
21
|
+
async function encryptKeystoreContent(secretKey, keys, userEmail, type) {
|
|
22
|
+
try {
|
|
23
|
+
const aux = UTF8ToUint8(userEmail + type);
|
|
24
|
+
const publicKeys = await publicKeyToBase64(keys.publicKeys);
|
|
25
|
+
const kyberPrivateKeyEnc = await encryptSymmetrically(secretKey, keys.privateKeys.kyberPrivateKey, aux);
|
|
26
|
+
const eccPrivateKeyEnc = await encryptSymmetrically(secretKey, await exportPrivateKey(keys.privateKeys.eccPrivateKey), aux);
|
|
27
|
+
return {
|
|
28
|
+
userEmail,
|
|
29
|
+
type,
|
|
30
|
+
encryptedKeys: {
|
|
31
|
+
publicKeys,
|
|
32
|
+
privateKeys: {
|
|
33
|
+
kyberPrivateKeyBase64: uint8ArrayToBase64(kyberPrivateKeyEnc),
|
|
34
|
+
eccPrivateKeyBase64: uint8ArrayToBase64(eccPrivateKeyEnc)
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
} catch (error) {
|
|
39
|
+
throw new Error("Failed to encrypt keystore content", { cause: error });
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Decrypts the keystore content using symmetric encryption
|
|
44
|
+
*
|
|
45
|
+
* @param secretKey - The symmetric key to decrypt the keystore content
|
|
46
|
+
* @param encryptedKeys - The encrypted keystore content
|
|
47
|
+
* @param userEmail - The ID of the user
|
|
48
|
+
* @param tag - The keystore type-specific tag string
|
|
49
|
+
* @returns The decrypted keystore content
|
|
50
|
+
*/
|
|
51
|
+
async function decryptKeystoreContent(secretKey, encryptedKeystore) {
|
|
52
|
+
try {
|
|
53
|
+
const aux = UTF8ToUint8(encryptedKeystore.userEmail + encryptedKeystore.type);
|
|
54
|
+
const kyberPublicKey = base64ToUint8Array(encryptedKeystore.encryptedKeys.publicKeys.kyberPublicKeyBase64);
|
|
55
|
+
const eccPublicKey = await importPublicKey(base64ToUint8Array(encryptedKeystore.encryptedKeys.publicKeys.eccPublicKeyBase64));
|
|
56
|
+
const kyberPrivateKey = await decryptSymmetrically(secretKey, base64ToUint8Array(encryptedKeystore.encryptedKeys.privateKeys.kyberPrivateKeyBase64), aux);
|
|
57
|
+
const eccPrivateKey = await importPrivateKey(await decryptSymmetrically(secretKey, base64ToUint8Array(encryptedKeystore.encryptedKeys.privateKeys.eccPrivateKeyBase64), aux));
|
|
58
|
+
return {
|
|
59
|
+
publicKeys: {
|
|
60
|
+
kyberPublicKey,
|
|
61
|
+
eccPublicKey
|
|
62
|
+
},
|
|
63
|
+
privateKeys: {
|
|
64
|
+
kyberPrivateKey,
|
|
65
|
+
eccPrivateKey
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
} catch (error) {
|
|
69
|
+
throw new Error("Failed to decrypt keystore content", { cause: error });
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Derives a secret key for protecting the recovery keystore
|
|
74
|
+
*
|
|
75
|
+
* @param recoveryCodes - The recovery codes
|
|
76
|
+
* @returns The derived secret key for protecting the recovery keystore
|
|
77
|
+
*/
|
|
78
|
+
async function deriveRecoveryKey(recoveryCodes) {
|
|
79
|
+
const recoverCodesArray = mnemonicToBytes(recoveryCodes);
|
|
80
|
+
return deriveSymmetricCryptoKeyFromContext(CONTEXT_RECOVERY, getBytesFromData(AES_KEY_BIT_LENGTH / 8, recoverCodesArray));
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Derives a secret key for protecting the encryption keystore
|
|
84
|
+
*
|
|
85
|
+
* @param baseKey - The base secret key from which a new key secret will be derived
|
|
86
|
+
* @returns The derived secret key for protecting the encryption keystore
|
|
87
|
+
*/
|
|
88
|
+
async function deriveEncryptionKeystoreKey(baseKey) {
|
|
89
|
+
return deriveSymmetricCryptoKeyFromContext(CONTEXT_ENC_KEYSTORE, baseKey);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
//#endregion
|
|
93
|
+
//#region src/keystore-crypto/emailEncryptionKey.ts
|
|
94
|
+
/**
|
|
95
|
+
* Generates email keys and creates encrypted main and recovery keystores
|
|
96
|
+
* The main keystore encryption key is derived from the base key (stored in session storage)
|
|
97
|
+
* The recovery keystore encryption key is derived from the recovery codes
|
|
98
|
+
*
|
|
99
|
+
* @returns The encryption and recovery keystores, recovery codes and email keys
|
|
100
|
+
*/
|
|
101
|
+
async function createEncryptionAndRecoveryKeystores(userEmail, baseKey) {
|
|
102
|
+
try {
|
|
103
|
+
const keys = await generateEmailKeys();
|
|
104
|
+
const encryptionKeystore = await encryptKeystoreContent(await deriveEncryptionKeystoreKey(baseKey), keys, userEmail, KeystoreType.ENCRYPTION);
|
|
105
|
+
const recoveryCodes = genMnemonic();
|
|
106
|
+
return {
|
|
107
|
+
encryptionKeystore,
|
|
108
|
+
recoveryKeystore: await encryptKeystoreContent(await deriveRecoveryKey(recoveryCodes), keys, userEmail, KeystoreType.RECOVERY),
|
|
109
|
+
recoveryCodes,
|
|
110
|
+
keys
|
|
111
|
+
};
|
|
112
|
+
} catch (error) {
|
|
113
|
+
throw new Error("Failed to create encryption and recovery keystores", { cause: error });
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Opens the encryption keystore and returns the email encryption keys
|
|
118
|
+
* The decryption key is derived from the base key (stored in session storage)
|
|
119
|
+
*
|
|
120
|
+
* @param encryptedKeystore - The encrypted keystore containing encryption keys
|
|
121
|
+
* @param baseKey - The base key from which the decryption key will be derived
|
|
122
|
+
* @returns The encryption keys
|
|
123
|
+
*/
|
|
124
|
+
async function openEncryptionKeystore(encryptedKeystore, baseKey) {
|
|
125
|
+
try {
|
|
126
|
+
if (encryptedKeystore.type != KeystoreType.ENCRYPTION) throw new Error("Input is invalid");
|
|
127
|
+
return await decryptKeystoreContent(await deriveEncryptionKeystoreKey(baseKey), encryptedKeystore);
|
|
128
|
+
} catch (error) {
|
|
129
|
+
throw new Error("Failed to open encryption keystore", { cause: error });
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Opens the recovery keystore and returns the email encryption keys
|
|
134
|
+
* The decryption key is derived from the base key (stored in session storage)
|
|
135
|
+
*
|
|
136
|
+
* @param recoveryCodes - The user's recovery codes
|
|
137
|
+
* @param encryptedKeystore - The encrypted keystore containing encryption keys
|
|
138
|
+
* @returns The encryption keys
|
|
139
|
+
*/
|
|
140
|
+
async function openRecoveryKeystore(recoveryCodes, encryptedKeystore) {
|
|
141
|
+
try {
|
|
142
|
+
if (encryptedKeystore.type != KeystoreType.RECOVERY) throw new Error("Input is invalid");
|
|
143
|
+
return await decryptKeystoreContent(await deriveRecoveryKey(recoveryCodes), encryptedKeystore);
|
|
144
|
+
} catch (error) {
|
|
145
|
+
throw new Error("Failed to open recovery keystore", { cause: error });
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
//#endregion
|
|
150
|
+
//#region src/keystore-crypto/index.ts
|
|
151
|
+
var keystore_crypto_exports = /* @__PURE__ */ __exportAll({
|
|
152
|
+
createEncryptionAndRecoveryKeystores: () => createEncryptionAndRecoveryKeystores,
|
|
153
|
+
openEncryptionKeystore: () => openEncryptionKeystore,
|
|
154
|
+
openRecoveryKeystore: () => openRecoveryKeystore
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
//#endregion
|
|
158
|
+
export { openRecoveryKeystore as i, createEncryptionAndRecoveryKeystores as n, openEncryptionKeystore as r, keystore_crypto_exports as t };
|
|
159
|
+
//# sourceMappingURL=keystore-crypto-Bjgriq9h.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keystore-crypto-Bjgriq9h.mjs","names":[],"sources":["../src/keystore-crypto/core.ts","../src/keystore-crypto/emailEncryptionKey.ts","../src/keystore-crypto/index.ts"],"sourcesContent":["import { encryptSymmetrically, decryptSymmetrically } from '../symmetric-crypto';\nimport { base64ToUint8Array, uint8ArrayToBase64, UTF8ToUint8, mnemonicToBytes, publicKeyToBase64 } from '../utils';\nimport { deriveSymmetricCryptoKeyFromContext } from '../derive-key';\nimport { CONTEXT_ENC_KEYSTORE, AES_KEY_BIT_LENGTH, CONTEXT_RECOVERY } from '../constants';\nimport { getBytesFromData } from '../hash';\nimport { EmailKeys, EncryptedKeystore, KeystoreType } from 'types';\nimport { exportPrivateKey, importPrivateKey, importPublicKey } from '../asymmetric-crypto';\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 keys: EmailKeys,\n userEmail: string,\n type: KeystoreType,\n): Promise<EncryptedKeystore> {\n try {\n const aux = UTF8ToUint8(userEmail + type);\n const publicKeys = await publicKeyToBase64(keys.publicKeys);\n const kyberPrivateKeyEnc = await encryptSymmetrically(secretKey, keys.privateKeys.kyberPrivateKey, aux);\n const eccPrivateKey = await exportPrivateKey(keys.privateKeys.eccPrivateKey);\n const eccPrivateKeyEnc = await encryptSymmetrically(secretKey, eccPrivateKey, aux);\n const encryptedKeys = {\n publicKeys,\n privateKeys: {\n kyberPrivateKeyBase64: uint8ArrayToBase64(kyberPrivateKeyEnc),\n eccPrivateKeyBase64: uint8ArrayToBase64(eccPrivateKeyEnc),\n },\n };\n\n const keystore: EncryptedKeystore = {\n userEmail,\n type,\n encryptedKeys,\n };\n return keystore;\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 userEmail - 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 encryptedKeystore: EncryptedKeystore,\n): Promise<EmailKeys> {\n try {\n const aux = UTF8ToUint8(encryptedKeystore.userEmail + encryptedKeystore.type);\n const kyberPublicKey = base64ToUint8Array(encryptedKeystore.encryptedKeys.publicKeys.kyberPublicKeyBase64);\n const eccPublicArray = base64ToUint8Array(encryptedKeystore.encryptedKeys.publicKeys.eccPublicKeyBase64);\n const eccPublicKey = await importPublicKey(eccPublicArray);\n const encKyberPrivateKey = base64ToUint8Array(encryptedKeystore.encryptedKeys.privateKeys.kyberPrivateKeyBase64);\n const kyberPrivateKey = await decryptSymmetrically(secretKey, encKyberPrivateKey, aux);\n const eccEncArray = base64ToUint8Array(encryptedKeystore.encryptedKeys.privateKeys.eccPrivateKeyBase64);\n const eccKey = await decryptSymmetrically(secretKey, eccEncArray, aux);\n const eccPrivateKey = await importPrivateKey(eccKey);\n const keys = {\n publicKeys: {\n kyberPublicKey,\n eccPublicKey,\n },\n privateKeys: {\n kyberPrivateKey,\n eccPrivateKey,\n },\n };\n return keys;\n } catch (error) {\n throw new Error('Failed to decrypt keystore content', { cause: error });\n }\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 recoverCodesArray = mnemonicToBytes(recoveryCodes);\n const recoveryCodesBuffer = getBytesFromData(AES_KEY_BIT_LENGTH / 8, recoverCodesArray);\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 */\nexport async function deriveEncryptionKeystoreKey(baseKey: Uint8Array): Promise<CryptoKey> {\n return deriveSymmetricCryptoKeyFromContext(CONTEXT_ENC_KEYSTORE, baseKey);\n}\n","import { EmailKeys, EncryptedKeystore, KeystoreType } from '../types';\nimport { genMnemonic } from '../utils';\nimport { encryptKeystoreContent, decryptKeystoreContent, deriveEncryptionKeystoreKey, deriveRecoveryKey } from './core';\nimport { generateEmailKeys } from '../email-crypto';\n\n/**\n * Generates email keys and creates encrypted main and recovery keystores\n * The main keystore encryption key is derived from the base key (stored in session storage)\n * The recovery keystore encryption key is derived from the recovery codes\n *\n * @returns The encryption and recovery keystores, recovery codes and email keys\n */\nexport async function createEncryptionAndRecoveryKeystores(\n userEmail: string,\n baseKey: Uint8Array,\n): Promise<{\n encryptionKeystore: EncryptedKeystore;\n recoveryKeystore: EncryptedKeystore;\n recoveryCodes: string;\n keys: EmailKeys;\n}> {\n try {\n const keys = await generateEmailKeys();\n\n const secretKey = await deriveEncryptionKeystoreKey(baseKey);\n const encryptionKeystore = await encryptKeystoreContent(secretKey, keys, userEmail, KeystoreType.ENCRYPTION);\n\n const recoveryCodes = genMnemonic();\n const recoveryKey = await deriveRecoveryKey(recoveryCodes);\n const recoveryKeystore = await encryptKeystoreContent(recoveryKey, keys, userEmail, KeystoreType.RECOVERY);\n\n return { encryptionKeystore, recoveryKeystore, recoveryCodes, keys };\n } catch (error) {\n throw new Error('Failed to create encryption and recovery keystores', { cause: error });\n }\n}\n\n/**\n * Opens the encryption keystore and returns the email encryption keys\n * The decryption key is derived from the base key (stored in session storage)\n *\n * @param encryptedKeystore - The encrypted keystore containing encryption keys\n * @param baseKey - The base key from which the decryption key will be derived\n * @returns The encryption keys\n */\nexport async function openEncryptionKeystore(\n encryptedKeystore: EncryptedKeystore,\n baseKey: Uint8Array,\n): Promise<EmailKeys> {\n try {\n if (encryptedKeystore.type != KeystoreType.ENCRYPTION) {\n throw new Error('Input is invalid');\n }\n const secretKey = await deriveEncryptionKeystoreKey(baseKey);\n const keys = await decryptKeystoreContent(secretKey, encryptedKeystore);\n return keys;\n } catch (error) {\n throw new Error('Failed to open encryption keystore', { cause: error });\n }\n}\n\n/**\n * Opens the recovery keystore and returns the email encryption keys\n * The decryption key is derived from the base key (stored in session storage)\n *\n * @param recoveryCodes - The user's recovery codes\n * @param encryptedKeystore - The encrypted keystore containing encryption keys\n * @returns The encryption keys\n */\nexport async function openRecoveryKeystore(\n recoveryCodes: string,\n encryptedKeystore: EncryptedKeystore,\n): Promise<EmailKeys> {\n try {\n if (encryptedKeystore.type != KeystoreType.RECOVERY) {\n throw new Error('Input is invalid');\n }\n const recoveryKey = await deriveRecoveryKey(recoveryCodes);\n const keys = await decryptKeystoreContent(recoveryKey, encryptedKeystore);\n return keys;\n } catch (error) {\n throw new Error('Failed to open recovery keystore', { cause: error });\n }\n}\n","export * from './emailEncryptionKey';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAiBA,eAAsB,uBACpB,WACA,MACA,WACA,MAC4B;AAC5B,KAAI;EACF,MAAM,MAAM,YAAY,YAAY,KAAK;EACzC,MAAM,aAAa,MAAM,kBAAkB,KAAK,WAAW;EAC3D,MAAM,qBAAqB,MAAM,qBAAqB,WAAW,KAAK,YAAY,iBAAiB,IAAI;EAEvG,MAAM,mBAAmB,MAAM,qBAAqB,WAD9B,MAAM,iBAAiB,KAAK,YAAY,cAAc,EACE,IAAI;AAclF,SALoC;GAClC;GACA;GACA,eAXoB;IACpB;IACA,aAAa;KACX,uBAAuB,mBAAmB,mBAAmB;KAC7D,qBAAqB,mBAAmB,iBAAiB;KAC1D;IACF;GAMA;UAEM,OAAO;AACd,QAAM,IAAI,MAAM,sCAAsC,EAAE,OAAO,OAAO,CAAC;;;;;;;;;;;;AAa3E,eAAsB,uBACpB,WACA,mBACoB;AACpB,KAAI;EACF,MAAM,MAAM,YAAY,kBAAkB,YAAY,kBAAkB,KAAK;EAC7E,MAAM,iBAAiB,mBAAmB,kBAAkB,cAAc,WAAW,qBAAqB;EAE1G,MAAM,eAAe,MAAM,gBADJ,mBAAmB,kBAAkB,cAAc,WAAW,mBAAmB,CAC9C;EAE1D,MAAM,kBAAkB,MAAM,qBAAqB,WADxB,mBAAmB,kBAAkB,cAAc,YAAY,sBAAsB,EAC9B,IAAI;EAGtF,MAAM,gBAAgB,MAAM,iBADb,MAAM,qBAAqB,WADtB,mBAAmB,kBAAkB,cAAc,YAAY,oBAAoB,EACrC,IAAI,CAClB;AAWpD,SAVa;GACX,YAAY;IACV;IACA;IACD;GACD,aAAa;IACX;IACA;IACD;GACF;UAEM,OAAO;AACd,QAAM,IAAI,MAAM,sCAAsC,EAAE,OAAO,OAAO,CAAC;;;;;;;;;AAU3E,eAAsB,kBAAkB,eAA2C;CACjF,MAAM,oBAAoB,gBAAgB,cAAc;AAExD,QAAO,oCAAoC,kBADf,iBAAiB,qBAAqB,GAAG,kBAAkB,CACN;;;;;;;;AASnF,eAAsB,4BAA4B,SAAyC;AACzF,QAAO,oCAAoC,sBAAsB,QAAQ;;;;;;;;;;;;AC9F3E,eAAsB,qCACpB,WACA,SAMC;AACD,KAAI;EACF,MAAM,OAAO,MAAM,mBAAmB;EAGtC,MAAM,qBAAqB,MAAM,uBADf,MAAM,4BAA4B,QAAQ,EACO,MAAM,WAAW,aAAa,WAAW;EAE5G,MAAM,gBAAgB,aAAa;AAInC,SAAO;GAAE;GAAoB,kBAFJ,MAAM,uBADX,MAAM,kBAAkB,cAAc,EACS,MAAM,WAAW,aAAa,SAAS;GAE3D;GAAe;GAAM;UAC7D,OAAO;AACd,QAAM,IAAI,MAAM,sDAAsD,EAAE,OAAO,OAAO,CAAC;;;;;;;;;;;AAY3F,eAAsB,uBACpB,mBACA,SACoB;AACpB,KAAI;AACF,MAAI,kBAAkB,QAAQ,aAAa,WACzC,OAAM,IAAI,MAAM,mBAAmB;AAIrC,SADa,MAAM,uBADD,MAAM,4BAA4B,QAAQ,EACP,kBAAkB;UAEhE,OAAO;AACd,QAAM,IAAI,MAAM,sCAAsC,EAAE,OAAO,OAAO,CAAC;;;;;;;;;;;AAY3E,eAAsB,qBACpB,eACA,mBACoB;AACpB,KAAI;AACF,MAAI,kBAAkB,QAAQ,aAAa,SACzC,OAAM,IAAI,MAAM,mBAAmB;AAIrC,SADa,MAAM,uBADC,MAAM,kBAAkB,cAAc,EACH,kBAAkB;UAElE,OAAO;AACd,QAAM,IAAI,MAAM,oCAAoC,EAAE,OAAO,OAAO,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { c as EncryptedKeystore, i as EmailKeys } from "./types-DwQJtrTx.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/keystore-crypto/emailEncryptionKey.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Generates email keys and creates encrypted main and recovery keystores
|
|
6
|
+
* The main keystore encryption key is derived from the base key (stored in session storage)
|
|
7
|
+
* The recovery keystore encryption key is derived from the recovery codes
|
|
8
|
+
*
|
|
9
|
+
* @returns The encryption and recovery keystores, recovery codes and email keys
|
|
10
|
+
*/
|
|
11
|
+
declare function createEncryptionAndRecoveryKeystores(userEmail: string, baseKey: Uint8Array): Promise<{
|
|
12
|
+
encryptionKeystore: EncryptedKeystore;
|
|
13
|
+
recoveryKeystore: EncryptedKeystore;
|
|
14
|
+
recoveryCodes: string;
|
|
15
|
+
keys: EmailKeys;
|
|
16
|
+
}>;
|
|
17
|
+
/**
|
|
18
|
+
* Opens the encryption keystore and returns the email encryption keys
|
|
19
|
+
* The decryption key is derived from the base key (stored in session storage)
|
|
20
|
+
*
|
|
21
|
+
* @param encryptedKeystore - The encrypted keystore containing encryption keys
|
|
22
|
+
* @param baseKey - The base key from which the decryption key will be derived
|
|
23
|
+
* @returns The encryption keys
|
|
24
|
+
*/
|
|
25
|
+
declare function openEncryptionKeystore(encryptedKeystore: EncryptedKeystore, baseKey: Uint8Array): Promise<EmailKeys>;
|
|
26
|
+
/**
|
|
27
|
+
* Opens the recovery keystore and returns the email encryption keys
|
|
28
|
+
* The decryption key is derived from the base key (stored in session storage)
|
|
29
|
+
*
|
|
30
|
+
* @param recoveryCodes - The user's recovery codes
|
|
31
|
+
* @param encryptedKeystore - The encrypted keystore containing encryption keys
|
|
32
|
+
* @returns The encryption keys
|
|
33
|
+
*/
|
|
34
|
+
declare function openRecoveryKeystore(recoveryCodes: string, encryptedKeystore: EncryptedKeystore): Promise<EmailKeys>;
|
|
35
|
+
declare namespace index_d_exports {
|
|
36
|
+
export { createEncryptionAndRecoveryKeystores, openEncryptionKeystore, openRecoveryKeystore };
|
|
37
|
+
}
|
|
38
|
+
//#endregion
|
|
39
|
+
export { createEncryptionAndRecoveryKeystores, openEncryptionKeystore, openRecoveryKeystore, index_d_exports as t };
|
|
40
|
+
//# sourceMappingURL=keystore-crypto.d.mts.map
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { c as EncryptedKeystore, i as EmailKeys } from "./types-Ds3ivE9W.js";
|
|
2
|
+
|
|
3
|
+
//#region src/keystore-crypto/emailEncryptionKey.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Generates email keys and creates encrypted main and recovery keystores
|
|
6
|
+
* The main keystore encryption key is derived from the base key (stored in session storage)
|
|
7
|
+
* The recovery keystore encryption key is derived from the recovery codes
|
|
8
|
+
*
|
|
9
|
+
* @returns The encryption and recovery keystores, recovery codes and email keys
|
|
10
|
+
*/
|
|
11
|
+
declare function createEncryptionAndRecoveryKeystores(userEmail: string, baseKey: Uint8Array): Promise<{
|
|
12
|
+
encryptionKeystore: EncryptedKeystore;
|
|
13
|
+
recoveryKeystore: EncryptedKeystore;
|
|
14
|
+
recoveryCodes: string;
|
|
15
|
+
keys: EmailKeys;
|
|
16
|
+
}>;
|
|
17
|
+
/**
|
|
18
|
+
* Opens the encryption keystore and returns the email encryption keys
|
|
19
|
+
* The decryption key is derived from the base key (stored in session storage)
|
|
20
|
+
*
|
|
21
|
+
* @param encryptedKeystore - The encrypted keystore containing encryption keys
|
|
22
|
+
* @param baseKey - The base key from which the decryption key will be derived
|
|
23
|
+
* @returns The encryption keys
|
|
24
|
+
*/
|
|
25
|
+
declare function openEncryptionKeystore(encryptedKeystore: EncryptedKeystore, baseKey: Uint8Array): Promise<EmailKeys>;
|
|
26
|
+
/**
|
|
27
|
+
* Opens the recovery keystore and returns the email encryption keys
|
|
28
|
+
* The decryption key is derived from the base key (stored in session storage)
|
|
29
|
+
*
|
|
30
|
+
* @param recoveryCodes - The user's recovery codes
|
|
31
|
+
* @param encryptedKeystore - The encrypted keystore containing encryption keys
|
|
32
|
+
* @returns The encryption keys
|
|
33
|
+
*/
|
|
34
|
+
declare function openRecoveryKeystore(recoveryCodes: string, encryptedKeystore: EncryptedKeystore): Promise<EmailKeys>;
|
|
35
|
+
declare namespace index_d_exports {
|
|
36
|
+
export { createEncryptionAndRecoveryKeystores, openEncryptionKeystore, openRecoveryKeystore };
|
|
37
|
+
}
|
|
38
|
+
//#endregion
|
|
39
|
+
export { createEncryptionAndRecoveryKeystores, openEncryptionKeystore, openRecoveryKeystore, index_d_exports as t };
|
|
40
|
+
//# sourceMappingURL=keystore-crypto.d.ts.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
require('./utils-CNs3cyDj.js');
|
|
2
|
+
require('./hash-BoqwNkcd.js');
|
|
3
|
+
require('./symmetric-crypto-D65zB396.js');
|
|
4
|
+
require('./derive-key-CBf2WxJd.js');
|
|
5
|
+
require('./post-quantum-crypto-CAi-cEkV.js');
|
|
6
|
+
require('./email-crypto-BrT98taw.js');
|
|
7
|
+
const require_keystore_crypto = require('./keystore-crypto-B4yCVo9l.js');
|
|
8
|
+
|
|
9
|
+
exports.createEncryptionAndRecoveryKeystores = require_keystore_crypto.createEncryptionAndRecoveryKeystores;
|
|
10
|
+
exports.openEncryptionKeystore = require_keystore_crypto.openEncryptionKeystore;
|
|
11
|
+
exports.openRecoveryKeystore = require_keystore_crypto.openRecoveryKeystore;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import "./utils-DS04iUcX.mjs";
|
|
2
|
+
import "./hash-CXeGAwai.mjs";
|
|
3
|
+
import "./symmetric-crypto-CrdS1Che.mjs";
|
|
4
|
+
import "./derive-key-Be7hS-cN.mjs";
|
|
5
|
+
import "./post-quantum-crypto-Vv34t6gX.mjs";
|
|
6
|
+
import "./email-crypto-DJUEjTxA.mjs";
|
|
7
|
+
import { i as openRecoveryKeystore, n as createEncryptionAndRecoveryKeystores, r as openEncryptionKeystore } from "./keystore-crypto-Bjgriq9h.mjs";
|
|
8
|
+
|
|
9
|
+
export { createEncryptionAndRecoveryKeystores, openEncryptionKeystore, openRecoveryKeystore };
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { c as EncryptedKeystore, d as KeystoreType, g as PublicKeysBase64, h as PublicKeys } from "./types-DwQJtrTx.mjs";
|
|
2
|
+
import { AxiosResponse } from "axios";
|
|
3
|
+
|
|
4
|
+
//#region src/keystore-service/api.d.ts
|
|
5
|
+
declare class KeyServiceAPI {
|
|
6
|
+
private readonly baseUrl;
|
|
7
|
+
constructor(baseUrl: string);
|
|
8
|
+
/**
|
|
9
|
+
* Converts the specific client error into a proprietary error for our apps
|
|
10
|
+
* @param error
|
|
11
|
+
* @private
|
|
12
|
+
*/
|
|
13
|
+
private normalizeError;
|
|
14
|
+
/**
|
|
15
|
+
* Sends a user's encrypted keystore to the server
|
|
16
|
+
* @param keystore - The encrypted keystore
|
|
17
|
+
* @param url - The user specific part of the url
|
|
18
|
+
* @returns Server response
|
|
19
|
+
*/
|
|
20
|
+
uploadKeystoreToServer(encryptedKeystore: EncryptedKeystore): Promise<AxiosResponse>;
|
|
21
|
+
/**
|
|
22
|
+
* Requests a user's encrypted keystore from the server
|
|
23
|
+
* @param url - The user-specific part of the url
|
|
24
|
+
* @returns The user's encrypted keystore as base64 string
|
|
25
|
+
*/
|
|
26
|
+
getKeystoreFromServer(userID: string, keystoreType: KeystoreType): Promise<EncryptedKeystore>;
|
|
27
|
+
/**
|
|
28
|
+
* Obtains recipients public keys from the server
|
|
29
|
+
*
|
|
30
|
+
* @param emails - The recipients' emails
|
|
31
|
+
* @returns The list of recipients' public keys
|
|
32
|
+
*/
|
|
33
|
+
getRecipientsPublicKeysFromServer(emails: string[]): Promise<PublicKeysBase64[]>;
|
|
34
|
+
/**
|
|
35
|
+
* Obtains the recipient public keys from the server
|
|
36
|
+
*
|
|
37
|
+
* @param email - The recipients' emails
|
|
38
|
+
* @returns The list of recipients' public keys
|
|
39
|
+
*/
|
|
40
|
+
getRecipientsPublicKeys(emails: string[]): Promise<PublicKeys[]>;
|
|
41
|
+
}
|
|
42
|
+
declare function getKeyServiceAPI(baseUrl: string): KeyServiceAPI;
|
|
43
|
+
declare namespace index_d_exports {
|
|
44
|
+
export { KeyServiceAPI, getKeyServiceAPI };
|
|
45
|
+
}
|
|
46
|
+
//#endregion
|
|
47
|
+
export { KeyServiceAPI, getKeyServiceAPI, index_d_exports as t };
|
|
48
|
+
//# sourceMappingURL=keystore-service.d.mts.map
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { c as EncryptedKeystore, d as KeystoreType, g as PublicKeysBase64, h as PublicKeys } from "./types-Ds3ivE9W.js";
|
|
2
|
+
import { AxiosResponse } from "axios";
|
|
3
|
+
|
|
4
|
+
//#region src/keystore-service/api.d.ts
|
|
5
|
+
declare class KeyServiceAPI {
|
|
6
|
+
private readonly baseUrl;
|
|
7
|
+
constructor(baseUrl: string);
|
|
8
|
+
/**
|
|
9
|
+
* Converts the specific client error into a proprietary error for our apps
|
|
10
|
+
* @param error
|
|
11
|
+
* @private
|
|
12
|
+
*/
|
|
13
|
+
private normalizeError;
|
|
14
|
+
/**
|
|
15
|
+
* Sends a user's encrypted keystore to the server
|
|
16
|
+
* @param keystore - The encrypted keystore
|
|
17
|
+
* @param url - The user specific part of the url
|
|
18
|
+
* @returns Server response
|
|
19
|
+
*/
|
|
20
|
+
uploadKeystoreToServer(encryptedKeystore: EncryptedKeystore): Promise<AxiosResponse>;
|
|
21
|
+
/**
|
|
22
|
+
* Requests a user's encrypted keystore from the server
|
|
23
|
+
* @param url - The user-specific part of the url
|
|
24
|
+
* @returns The user's encrypted keystore as base64 string
|
|
25
|
+
*/
|
|
26
|
+
getKeystoreFromServer(userID: string, keystoreType: KeystoreType): Promise<EncryptedKeystore>;
|
|
27
|
+
/**
|
|
28
|
+
* Obtains recipients public keys from the server
|
|
29
|
+
*
|
|
30
|
+
* @param emails - The recipients' emails
|
|
31
|
+
* @returns The list of recipients' public keys
|
|
32
|
+
*/
|
|
33
|
+
getRecipientsPublicKeysFromServer(emails: string[]): Promise<PublicKeysBase64[]>;
|
|
34
|
+
/**
|
|
35
|
+
* Obtains the recipient public keys from the server
|
|
36
|
+
*
|
|
37
|
+
* @param email - The recipients' emails
|
|
38
|
+
* @returns The list of recipients' public keys
|
|
39
|
+
*/
|
|
40
|
+
getRecipientsPublicKeys(emails: string[]): Promise<PublicKeys[]>;
|
|
41
|
+
}
|
|
42
|
+
declare function getKeyServiceAPI(baseUrl: string): KeyServiceAPI;
|
|
43
|
+
declare namespace index_d_exports {
|
|
44
|
+
export { KeyServiceAPI, getKeyServiceAPI };
|
|
45
|
+
}
|
|
46
|
+
//#endregion
|
|
47
|
+
export { KeyServiceAPI, getKeyServiceAPI, index_d_exports as t };
|
|
48
|
+
//# sourceMappingURL=keystore-service.d.ts.map
|