internxt-crypto 1.2.0 → 1.3.0
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 +4 -4
- package/dist/{emailEncryptionKey-Cw-vW_Oq.js → emailEncryptionKey-Ba95VuFO.js} +50 -57
- package/dist/emailEncryptionKey-Ba95VuFO.js.map +1 -0
- package/dist/{emailEncryptionKey-D9sk_WKj.mjs → emailEncryptionKey-CYvr26FG.mjs} +42 -55
- package/dist/emailEncryptionKey-CYvr26FG.mjs.map +1 -0
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +4 -3
- package/dist/index.mjs +2 -2
- package/dist/keystore-crypto.d.mts +17 -18
- package/dist/keystore-crypto.d.mts.map +1 -1
- package/dist/keystore-crypto.d.ts +17 -18
- package/dist/keystore-crypto.d.ts.map +1 -1
- package/dist/keystore-crypto.js +4 -3
- package/dist/keystore-crypto.mjs +2 -2
- package/package.json +1 -1
- package/dist/emailEncryptionKey-Cw-vW_Oq.js.map +0 -1
- package/dist/emailEncryptionKey-D9sk_WKj.mjs.map +0 -1
package/README.md
CHANGED
|
@@ -131,12 +131,12 @@ expect(decryptedEmail).toStrictEqual(email);
|
|
|
131
131
|
|
|
132
132
|
// keystore
|
|
133
133
|
const userEmail = 'user email';
|
|
134
|
-
const
|
|
135
|
-
const { encryptionKeystore, recoveryKeystore, recoveryCodes
|
|
134
|
+
const mnemonic = 'user mnemonic';
|
|
135
|
+
const { encryptionKeystore, recoveryKeystore, recoveryCodes } = await createEncryptionAndRecoveryKeystores(
|
|
136
136
|
userEmail,
|
|
137
|
-
|
|
137
|
+
mnemonic
|
|
138
138
|
);
|
|
139
|
-
const resultEnc = await openEncryptionKeystore(encryptionKeystore,
|
|
139
|
+
const resultEnc = await openEncryptionKeystore(encryptionKeystore, mnemonic);
|
|
140
140
|
const resultRec = await openRecoveryKeystore(recoveryCodes, recoveryKeystore);
|
|
141
141
|
|
|
142
142
|
expect(resultEnc).toStrictEqual(resultRec);
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
const require_constants = require('./constants.js');
|
|
2
2
|
const require_genID = require('./genID-cWOPmspk.js');
|
|
3
3
|
const require_deriveKeysFromMnemonic = require('./deriveKeysFromMnemonic-Dbx7VSBQ.js');
|
|
4
|
-
const require_deriveKeysFromPassword = require('./deriveKeysFromPassword-iMHv-tIA.js');
|
|
5
4
|
const require_aes = require('./aes-CuW_SPl-.js');
|
|
6
5
|
const require_xwing = require('./xwing-iRWVRtNE.js');
|
|
7
6
|
const require_types = require('./types.js');
|
|
@@ -18,11 +17,12 @@ const require_types = require('./types.js');
|
|
|
18
17
|
*/
|
|
19
18
|
async function encryptKeystoreContent(secretKey, keys, userEmail, type) {
|
|
20
19
|
try {
|
|
21
|
-
const
|
|
20
|
+
const publicKey = require_genID.uint8ArrayToBase64(keys.publicKey);
|
|
21
|
+
const aux = require_genID.UTF8ToUint8(userEmail + type + publicKey);
|
|
22
22
|
return {
|
|
23
23
|
userEmail,
|
|
24
24
|
type,
|
|
25
|
-
publicKey
|
|
25
|
+
publicKey,
|
|
26
26
|
privateKeyEncrypted: require_genID.uint8ArrayToBase64(await require_aes.encryptSymmetrically(secretKey, keys.secretKey, aux))
|
|
27
27
|
};
|
|
28
28
|
} catch (error) {
|
|
@@ -38,7 +38,7 @@ async function encryptKeystoreContent(secretKey, keys, userEmail, type) {
|
|
|
38
38
|
*/
|
|
39
39
|
async function decryptKeystoreContent(kesytoreOpeningKey, encryptedKeystore) {
|
|
40
40
|
try {
|
|
41
|
-
const aux = require_genID.UTF8ToUint8(encryptedKeystore.userEmail + encryptedKeystore.type);
|
|
41
|
+
const aux = require_genID.UTF8ToUint8(encryptedKeystore.userEmail + encryptedKeystore.type + encryptedKeystore.publicKey);
|
|
42
42
|
return {
|
|
43
43
|
publicKey: require_genID.base64ToUint8Array(encryptedKeystore.publicKey),
|
|
44
44
|
secretKey: await require_aes.decryptSymmetrically(kesytoreOpeningKey, require_genID.base64ToUint8Array(encryptedKeystore.privateKeyEncrypted), aux)
|
|
@@ -57,28 +57,13 @@ async function deriveRecoveryKey(recoveryCodes) {
|
|
|
57
57
|
return require_deriveKeysFromMnemonic.deriveKeyFromMnemonic(recoveryCodes, require_constants.CONTEXT_RECOVERY);
|
|
58
58
|
}
|
|
59
59
|
/**
|
|
60
|
-
* Derives a secret key for protecting the encryption keystore
|
|
60
|
+
* Derives a secret key for protecting the encryption keystore from user's mnemonic
|
|
61
61
|
*
|
|
62
|
-
* @param
|
|
63
|
-
* @param salt - The keystore salt
|
|
62
|
+
* @param mnemonic - The user's mnemonic (machine-generated with secure PRNG)
|
|
64
63
|
* @returns The derived secret key for protecting the encryption keystore
|
|
65
64
|
*/
|
|
66
|
-
async function
|
|
67
|
-
return require_deriveKeysFromMnemonic.
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Derives a secret key for protecting the encryption keystore
|
|
71
|
-
*
|
|
72
|
-
* @param password - The user's password
|
|
73
|
-
* @param salt - The keystore salt
|
|
74
|
-
* @returns The derived secret key for protecting the encryption keystore
|
|
75
|
-
*/
|
|
76
|
-
async function deriveNewEncryptionKeystoreKey(password) {
|
|
77
|
-
const { key, salt } = await require_deriveKeysFromPassword.getKeyFromPassword(password);
|
|
78
|
-
return {
|
|
79
|
-
secretKey: require_deriveKeysFromMnemonic.deriveSymmetricKeyFromContext(require_constants.CONTEXT_ENC_KEYSTORE, key),
|
|
80
|
-
salt
|
|
81
|
-
};
|
|
65
|
+
async function deriveEncryptionKeystoreKeyFromMnemonic(mnemonic) {
|
|
66
|
+
return require_deriveKeysFromMnemonic.deriveKeyFromMnemonic(mnemonic, require_constants.CONTEXT_ENC_KEYSTORE);
|
|
82
67
|
}
|
|
83
68
|
|
|
84
69
|
//#endregion
|
|
@@ -89,6 +74,12 @@ var FailedToCreateKeyStores = class FailedToCreateKeyStores extends Error {
|
|
|
89
74
|
Object.setPrototypeOf(this, FailedToCreateKeyStores.prototype);
|
|
90
75
|
}
|
|
91
76
|
};
|
|
77
|
+
var InvalidInputKeyStore = class InvalidInputKeyStore extends Error {
|
|
78
|
+
constructor() {
|
|
79
|
+
super("Invalid input");
|
|
80
|
+
Object.setPrototypeOf(this, InvalidInputKeyStore.prototype);
|
|
81
|
+
}
|
|
82
|
+
};
|
|
92
83
|
var FailedToOpenEncryptionKeyStore = class FailedToOpenEncryptionKeyStore extends Error {
|
|
93
84
|
constructor(errorMsg) {
|
|
94
85
|
super("Failed to open encryption keystore: " + errorMsg);
|
|
@@ -101,10 +92,10 @@ var FailedToOpenRecoveryKeyStore = class FailedToOpenRecoveryKeyStore extends Er
|
|
|
101
92
|
Object.setPrototypeOf(this, FailedToOpenRecoveryKeyStore.prototype);
|
|
102
93
|
}
|
|
103
94
|
};
|
|
104
|
-
var
|
|
95
|
+
var FailedToChangeMnemonicForKeyStore = class FailedToChangeMnemonicForKeyStore extends Error {
|
|
105
96
|
constructor(errorMsg) {
|
|
106
97
|
super("Error while fetching message: " + errorMsg);
|
|
107
|
-
Object.setPrototypeOf(this,
|
|
98
|
+
Object.setPrototypeOf(this, FailedToChangeMnemonicForKeyStore.prototype);
|
|
108
99
|
}
|
|
109
100
|
};
|
|
110
101
|
|
|
@@ -112,27 +103,25 @@ var FailedToChangePasswordForKeyStore = class FailedToChangePasswordForKeyStore
|
|
|
112
103
|
//#region src/keystore-crypto/emailEncryptionKey.ts
|
|
113
104
|
/**
|
|
114
105
|
* Generates hybrid keys and creates encrypted main and recovery keystores
|
|
115
|
-
* The main keystore encryption key is derived from the user's
|
|
106
|
+
* The main keystore encryption key is derived from the user's mnemonic
|
|
116
107
|
* The recovery keystore encryption key is derived from the recovery codes
|
|
117
108
|
*
|
|
118
109
|
* @param userEmail - The user's email
|
|
119
|
-
* @param
|
|
110
|
+
* @param mnemonic - The user's mnemonic
|
|
120
111
|
* @returns The encryption keys
|
|
121
112
|
*
|
|
122
113
|
* @returns The encryption and recovery keystores, recovery codes and hybrid keys
|
|
123
114
|
*/
|
|
124
|
-
async function createEncryptionAndRecoveryKeystores(userEmail,
|
|
115
|
+
async function createEncryptionAndRecoveryKeystores(userEmail, mnemonic) {
|
|
125
116
|
try {
|
|
126
117
|
const keys = require_xwing.genHybridKeys();
|
|
127
|
-
const
|
|
128
|
-
const encryptionKeystore = await encryptKeystoreContent(secretKey, keys, userEmail, require_types.KeystoreType.ENCRYPTION);
|
|
118
|
+
const encryptionKeystore = await encryptKeystoreContent(await deriveEncryptionKeystoreKeyFromMnemonic(mnemonic), keys, userEmail, require_types.KeystoreType.ENCRYPTION);
|
|
129
119
|
const recoveryCodes = require_genID.genMnemonic();
|
|
130
120
|
return {
|
|
131
121
|
encryptionKeystore,
|
|
132
122
|
recoveryKeystore: await encryptKeystoreContent(await deriveRecoveryKey(recoveryCodes), keys, userEmail, require_types.KeystoreType.RECOVERY),
|
|
133
123
|
recoveryCodes,
|
|
134
|
-
keys
|
|
135
|
-
salt
|
|
124
|
+
keys
|
|
136
125
|
};
|
|
137
126
|
} catch (error) {
|
|
138
127
|
throw new FailedToCreateKeyStores(error instanceof Error ? error.message : String(error));
|
|
@@ -140,18 +129,18 @@ async function createEncryptionAndRecoveryKeystores(userEmail, password) {
|
|
|
140
129
|
}
|
|
141
130
|
/**
|
|
142
131
|
* Opens the encryption keystore and returns the email encryption keys
|
|
143
|
-
* The decryption key is derived from the user
|
|
132
|
+
* The decryption key is derived from the user mnemonic
|
|
144
133
|
*
|
|
145
134
|
* @param encryptedKeystore - The encrypted keystore containing encryption keys
|
|
146
|
-
* @param
|
|
147
|
-
* @param salt - The keystore's salt
|
|
135
|
+
* @param mnemonic - The user's mnemonic
|
|
148
136
|
* @returns The encryption keys
|
|
149
137
|
*/
|
|
150
|
-
async function openEncryptionKeystore(encryptedKeystore,
|
|
138
|
+
async function openEncryptionKeystore(encryptedKeystore, mnemonic) {
|
|
151
139
|
try {
|
|
152
|
-
if (encryptedKeystore.type !== require_types.KeystoreType.ENCRYPTION) throw new
|
|
153
|
-
return await decryptKeystoreContent(await
|
|
140
|
+
if (encryptedKeystore.type !== require_types.KeystoreType.ENCRYPTION) throw new InvalidInputKeyStore();
|
|
141
|
+
return await decryptKeystoreContent(await deriveEncryptionKeystoreKeyFromMnemonic(mnemonic), encryptedKeystore);
|
|
154
142
|
} catch (error) {
|
|
143
|
+
if (error instanceof InvalidInputKeyStore) throw error;
|
|
155
144
|
throw new FailedToOpenEncryptionKeyStore(error instanceof Error ? error.message : String(error));
|
|
156
145
|
}
|
|
157
146
|
}
|
|
@@ -165,42 +154,40 @@ async function openEncryptionKeystore(encryptedKeystore, password, salt) {
|
|
|
165
154
|
*/
|
|
166
155
|
async function openRecoveryKeystore(recoveryCodes, encryptedKeystore) {
|
|
167
156
|
try {
|
|
168
|
-
if (encryptedKeystore.type !== require_types.KeystoreType.RECOVERY) throw new
|
|
157
|
+
if (encryptedKeystore.type !== require_types.KeystoreType.RECOVERY) throw new InvalidInputKeyStore();
|
|
169
158
|
return await decryptKeystoreContent(await deriveRecoveryKey(recoveryCodes), encryptedKeystore);
|
|
170
159
|
} catch (error) {
|
|
160
|
+
if (error instanceof InvalidInputKeyStore) throw error;
|
|
171
161
|
throw new FailedToOpenRecoveryKeyStore(error instanceof Error ? error.message : String(error));
|
|
172
162
|
}
|
|
173
163
|
}
|
|
174
164
|
/**
|
|
175
|
-
* Re-encrypts the encryption keystore with a new
|
|
176
|
-
* The decryption key is derived from the user
|
|
165
|
+
* Re-encrypts the encryption keystore with a new mnemonic
|
|
166
|
+
* The decryption key is derived from the user mnemonic
|
|
177
167
|
*
|
|
178
168
|
* @param encryptedKeystore - The encrypted keystore containing encryption keys
|
|
179
|
-
* @param
|
|
180
|
-
* @param
|
|
181
|
-
* @
|
|
182
|
-
* @returns The keys, re-encrypted keystore, and new salt
|
|
169
|
+
* @param oldMnemonic - The user's old mnemonic
|
|
170
|
+
* @param newMnemonic - The user's new mnemonic
|
|
171
|
+
* @returns The keys and new re-encrypted keystore
|
|
183
172
|
*/
|
|
184
|
-
async function
|
|
173
|
+
async function changeMnemonicForEncryptionKeystore(encryptedKeystore, oldMnemonic, newMnemonic) {
|
|
185
174
|
try {
|
|
186
|
-
|
|
187
|
-
const keys = await openEncryptionKeystore(encryptedKeystore, oldPassword, oldSalt);
|
|
188
|
-
const { secretKey, salt } = await deriveNewEncryptionKeystoreKey(newPassword);
|
|
175
|
+
const keys = await openEncryptionKeystore(encryptedKeystore, oldMnemonic);
|
|
189
176
|
return {
|
|
190
|
-
newKeystore: await encryptKeystoreContent(
|
|
191
|
-
newSalt: salt,
|
|
177
|
+
newKeystore: await encryptKeystoreContent(await deriveEncryptionKeystoreKeyFromMnemonic(newMnemonic), keys, encryptedKeystore.userEmail, require_types.KeystoreType.ENCRYPTION),
|
|
192
178
|
keys
|
|
193
179
|
};
|
|
194
180
|
} catch (error) {
|
|
195
|
-
|
|
181
|
+
if (error instanceof InvalidInputKeyStore) throw error;
|
|
182
|
+
throw new FailedToChangeMnemonicForKeyStore(error instanceof Error ? error.message : String(error));
|
|
196
183
|
}
|
|
197
184
|
}
|
|
198
185
|
|
|
199
186
|
//#endregion
|
|
200
|
-
Object.defineProperty(exports, '
|
|
187
|
+
Object.defineProperty(exports, 'FailedToChangeMnemonicForKeyStore', {
|
|
201
188
|
enumerable: true,
|
|
202
189
|
get: function () {
|
|
203
|
-
return
|
|
190
|
+
return FailedToChangeMnemonicForKeyStore;
|
|
204
191
|
}
|
|
205
192
|
});
|
|
206
193
|
Object.defineProperty(exports, 'FailedToCreateKeyStores', {
|
|
@@ -221,10 +208,16 @@ Object.defineProperty(exports, 'FailedToOpenRecoveryKeyStore', {
|
|
|
221
208
|
return FailedToOpenRecoveryKeyStore;
|
|
222
209
|
}
|
|
223
210
|
});
|
|
224
|
-
Object.defineProperty(exports, '
|
|
211
|
+
Object.defineProperty(exports, 'InvalidInputKeyStore', {
|
|
212
|
+
enumerable: true,
|
|
213
|
+
get: function () {
|
|
214
|
+
return InvalidInputKeyStore;
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
Object.defineProperty(exports, 'changeMnemonicForEncryptionKeystore', {
|
|
225
218
|
enumerable: true,
|
|
226
219
|
get: function () {
|
|
227
|
-
return
|
|
220
|
+
return changeMnemonicForEncryptionKeystore;
|
|
228
221
|
}
|
|
229
222
|
});
|
|
230
223
|
Object.defineProperty(exports, 'createEncryptionAndRecoveryKeystores', {
|
|
@@ -245,4 +238,4 @@ Object.defineProperty(exports, 'openRecoveryKeystore', {
|
|
|
245
238
|
return openRecoveryKeystore;
|
|
246
239
|
}
|
|
247
240
|
});
|
|
248
|
-
//# sourceMappingURL=emailEncryptionKey-
|
|
241
|
+
//# sourceMappingURL=emailEncryptionKey-Ba95VuFO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emailEncryptionKey-Ba95VuFO.js","names":["uint8ArrayToBase64","UTF8ToUint8","encryptSymmetrically","base64ToUint8Array","decryptSymmetrically","deriveKeyFromMnemonic","CONTEXT_RECOVERY","CONTEXT_ENC_KEYSTORE","genHybridKeys","KeystoreType","genMnemonic"],"sources":["../src/keystore-crypto/core.ts","../src/keystore-crypto/errors.ts","../src/keystore-crypto/emailEncryptionKey.ts"],"sourcesContent":["import { encryptSymmetrically, decryptSymmetrically } from '../symmetric-crypto';\nimport { base64ToUint8Array, uint8ArrayToBase64, UTF8ToUint8 } from '../utils';\nimport { deriveKeyFromMnemonic } from '../derive-key';\nimport { CONTEXT_ENC_KEYSTORE, CONTEXT_RECOVERY } from '../constants';\nimport { EncryptedKeystore, HybridKeyPair, KeystoreType } from '../types';\n\n/**\n * Encrypts the user's hybrid key using symmetric encryption to get a keystore\n *\n * @param secretKey - The symmetric key to encrypt the keystore content\n * @param key - The hybrid key pair\n * @param userEmail - The email of the user\n * @param type - The keystore type\n * @returns The encrypted keystore\n */\nexport async function encryptKeystoreContent(\n secretKey: Uint8Array,\n keys: HybridKeyPair,\n userEmail: string,\n type: KeystoreType,\n): Promise<EncryptedKeystore> {\n try {\n const publicKey = uint8ArrayToBase64(keys.publicKey);\n\n const aux = UTF8ToUint8(userEmail + type + publicKey);\n const secretKeyEncrypted = await encryptSymmetrically(secretKey, keys.secretKey, aux);\n\n const keystore: EncryptedKeystore = {\n userEmail,\n type,\n publicKey,\n privateKeyEncrypted: uint8ArrayToBase64(secretKeyEncrypted),\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 kesytoreOpeningKey - The symmetric key to decrypt the keystore content\n * @param encryptedKeys - The encrypted keystore content\n * @returns The decrypted hybrid key pair contained in the keystore\n */\nexport async function decryptKeystoreContent(\n kesytoreOpeningKey: Uint8Array,\n encryptedKeystore: EncryptedKeystore,\n): Promise<HybridKeyPair> {\n try {\n const aux = UTF8ToUint8(encryptedKeystore.userEmail + encryptedKeystore.type + encryptedKeystore.publicKey);\n const publicKey = base64ToUint8Array(encryptedKeystore.publicKey);\n const ciphertext = base64ToUint8Array(encryptedKeystore.privateKeyEncrypted);\n const secretKey = await decryptSymmetrically(kesytoreOpeningKey, ciphertext, aux);\n return {\n publicKey,\n secretKey,\n };\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 (machine-generated with secure PRNG)\n * @returns The derived secret key for protecting the recovery keystore\n */\nexport async function deriveRecoveryKey(recoveryCodes: string): Promise<Uint8Array> {\n return deriveKeyFromMnemonic(recoveryCodes, CONTEXT_RECOVERY);\n}\n\n/**\n * Derives a secret key for protecting the encryption keystore from user's mnemonic\n *\n * @param mnemonic - The user's mnemonic (machine-generated with secure PRNG)\n * @returns The derived secret key for protecting the encryption keystore\n */\nexport async function deriveEncryptionKeystoreKeyFromMnemonic(mnemonic: string): Promise<Uint8Array> {\n return deriveKeyFromMnemonic(mnemonic, CONTEXT_ENC_KEYSTORE);\n}\n","export class FailedToCreateKeyStores extends Error {\n constructor(errorMsg?: string) {\n super('Failed to create encryption and recovery keystores: ' + errorMsg);\n\n Object.setPrototypeOf(this, FailedToCreateKeyStores.prototype);\n }\n}\n\nexport class InvalidInputKeyStore extends Error {\n constructor() {\n super('Invalid input');\n\n Object.setPrototypeOf(this, InvalidInputKeyStore.prototype);\n }\n}\n\nexport class FailedToOpenEncryptionKeyStore extends Error {\n constructor(errorMsg?: string) {\n super('Failed to open encryption keystore: ' + errorMsg);\n\n Object.setPrototypeOf(this, FailedToOpenEncryptionKeyStore.prototype);\n }\n}\n\nexport class FailedToOpenRecoveryKeyStore extends Error {\n constructor(errorMsg?: string) {\n super('Failed to open recovery keystore: ' + errorMsg);\n\n Object.setPrototypeOf(this, FailedToOpenRecoveryKeyStore.prototype);\n }\n}\n\nexport class FailedToChangeMnemonicForKeyStore extends Error {\n constructor(errorMsg?: string) {\n super('Error while fetching message: ' + errorMsg);\n\n Object.setPrototypeOf(this, FailedToChangeMnemonicForKeyStore.prototype);\n }\n}\n","import { EncryptedKeystore, KeystoreType, HybridKeyPair } from '../types';\nimport { genMnemonic } from '../utils';\nimport {\n encryptKeystoreContent,\n decryptKeystoreContent,\n deriveEncryptionKeystoreKeyFromMnemonic,\n deriveRecoveryKey,\n} from './core';\nimport { genHybridKeys } from '../hybrid-crypto';\nimport {\n FailedToOpenEncryptionKeyStore,\n FailedToCreateKeyStores,\n FailedToOpenRecoveryKeyStore,\n FailedToChangeMnemonicForKeyStore,\n InvalidInputKeyStore,\n} from './errors';\n\n/**\n * Generates hybrid keys and creates encrypted main and recovery keystores\n * The main keystore encryption key is derived from the user's mnemonic\n * The recovery keystore encryption key is derived from the recovery codes\n *\n * @param userEmail - The user's email\n * @param mnemonic - The user's mnemonic\n * @returns The encryption keys\n *\n * @returns The encryption and recovery keystores, recovery codes and hybrid keys\n */\nexport async function createEncryptionAndRecoveryKeystores(\n userEmail: string,\n mnemonic: string,\n): Promise<{\n encryptionKeystore: EncryptedKeystore;\n recoveryKeystore: EncryptedKeystore;\n recoveryCodes: string;\n keys: HybridKeyPair;\n}> {\n try {\n const keys = genHybridKeys();\n\n const secretKey = await deriveEncryptionKeystoreKeyFromMnemonic(mnemonic);\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 FailedToCreateKeyStores(error instanceof Error ? error.message : String(error));\n }\n}\n\n/**\n * Opens the encryption keystore and returns the email encryption keys\n * The decryption key is derived from the user mnemonic\n *\n * @param encryptedKeystore - The encrypted keystore containing encryption keys\n * @param mnemonic - The user's mnemonic\n * @returns The encryption keys\n */\nexport async function openEncryptionKeystore(\n encryptedKeystore: EncryptedKeystore,\n mnemonic: string,\n): Promise<HybridKeyPair> {\n try {\n if (encryptedKeystore.type !== KeystoreType.ENCRYPTION) {\n throw new InvalidInputKeyStore();\n }\n const secretKey = await deriveEncryptionKeystoreKeyFromMnemonic(mnemonic);\n const keys = await decryptKeystoreContent(secretKey, encryptedKeystore);\n return keys;\n } catch (error) {\n if (error instanceof InvalidInputKeyStore) throw error;\n throw new FailedToOpenEncryptionKeyStore(error instanceof Error ? error.message : String(error));\n }\n}\n\n/**\n * Opens the recovery keystore and returns the email encryption keys\n * The decryption key is derived from the recovery codes (machine-generated mnemonic)\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<HybridKeyPair> {\n try {\n if (encryptedKeystore.type !== KeystoreType.RECOVERY) {\n throw new InvalidInputKeyStore();\n }\n const recoveryKey = await deriveRecoveryKey(recoveryCodes);\n const keys = await decryptKeystoreContent(recoveryKey, encryptedKeystore);\n return keys;\n } catch (error) {\n if (error instanceof InvalidInputKeyStore) throw error;\n throw new FailedToOpenRecoveryKeyStore(error instanceof Error ? error.message : String(error));\n }\n}\n\n/**\n * Re-encrypts the encryption keystore with a new mnemonic\n * The decryption key is derived from the user mnemonic\n *\n * @param encryptedKeystore - The encrypted keystore containing encryption keys\n * @param oldMnemonic - The user's old mnemonic\n * @param newMnemonic - The user's new mnemonic\n * @returns The keys and new re-encrypted keystore\n */\nexport async function changeMnemonicForEncryptionKeystore(\n encryptedKeystore: EncryptedKeystore,\n oldMnemonic: string,\n newMnemonic: string,\n): Promise<{ keys: HybridKeyPair; newKeystore: EncryptedKeystore }> {\n try {\n const keys = await openEncryptionKeystore(encryptedKeystore, oldMnemonic);\n\n const secretKey = await deriveEncryptionKeystoreKeyFromMnemonic(newMnemonic);\n const newKeystore = await encryptKeystoreContent(\n secretKey,\n keys,\n encryptedKeystore.userEmail,\n KeystoreType.ENCRYPTION,\n );\n\n return { newKeystore, keys };\n } catch (error) {\n if (error instanceof InvalidInputKeyStore) throw error;\n throw new FailedToChangeMnemonicForKeyStore(error instanceof Error ? error.message : String(error));\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { CONTEXT_ENC_KEYSTORE, CONTEXT_RECOVERY } from "./constants.mjs";
|
|
2
2
|
import { a as genMnemonic, c as base64ToUint8Array, s as UTF8ToUint8, u as uint8ArrayToBase64 } from "./genID-D08K7JPr.mjs";
|
|
3
|
-
import {
|
|
4
|
-
import { n as getKeyFromPassword, r as getKeyFromPasswordAndSalt } from "./deriveKeysFromPassword-DFzo2OII.mjs";
|
|
3
|
+
import { t as deriveKeyFromMnemonic } from "./deriveKeysFromMnemonic-DB0UHE-y.mjs";
|
|
5
4
|
import { n as encryptSymmetrically, t as decryptSymmetrically } from "./aes-B8TA-JKq.mjs";
|
|
6
5
|
import { r as genHybridKeys } from "./xwing-CQmQX6hn.mjs";
|
|
7
6
|
import { KeystoreType } from "./types.mjs";
|
|
@@ -18,11 +17,12 @@ import { KeystoreType } from "./types.mjs";
|
|
|
18
17
|
*/
|
|
19
18
|
async function encryptKeystoreContent(secretKey, keys, userEmail, type) {
|
|
20
19
|
try {
|
|
21
|
-
const
|
|
20
|
+
const publicKey = uint8ArrayToBase64(keys.publicKey);
|
|
21
|
+
const aux = UTF8ToUint8(userEmail + type + publicKey);
|
|
22
22
|
return {
|
|
23
23
|
userEmail,
|
|
24
24
|
type,
|
|
25
|
-
publicKey
|
|
25
|
+
publicKey,
|
|
26
26
|
privateKeyEncrypted: uint8ArrayToBase64(await encryptSymmetrically(secretKey, keys.secretKey, aux))
|
|
27
27
|
};
|
|
28
28
|
} catch (error) {
|
|
@@ -38,7 +38,7 @@ async function encryptKeystoreContent(secretKey, keys, userEmail, type) {
|
|
|
38
38
|
*/
|
|
39
39
|
async function decryptKeystoreContent(kesytoreOpeningKey, encryptedKeystore) {
|
|
40
40
|
try {
|
|
41
|
-
const aux = UTF8ToUint8(encryptedKeystore.userEmail + encryptedKeystore.type);
|
|
41
|
+
const aux = UTF8ToUint8(encryptedKeystore.userEmail + encryptedKeystore.type + encryptedKeystore.publicKey);
|
|
42
42
|
return {
|
|
43
43
|
publicKey: base64ToUint8Array(encryptedKeystore.publicKey),
|
|
44
44
|
secretKey: await decryptSymmetrically(kesytoreOpeningKey, base64ToUint8Array(encryptedKeystore.privateKeyEncrypted), aux)
|
|
@@ -57,28 +57,13 @@ async function deriveRecoveryKey(recoveryCodes) {
|
|
|
57
57
|
return deriveKeyFromMnemonic(recoveryCodes, CONTEXT_RECOVERY);
|
|
58
58
|
}
|
|
59
59
|
/**
|
|
60
|
-
* Derives a secret key for protecting the encryption keystore
|
|
60
|
+
* Derives a secret key for protecting the encryption keystore from user's mnemonic
|
|
61
61
|
*
|
|
62
|
-
* @param
|
|
63
|
-
* @param salt - The keystore salt
|
|
62
|
+
* @param mnemonic - The user's mnemonic (machine-generated with secure PRNG)
|
|
64
63
|
* @returns The derived secret key for protecting the encryption keystore
|
|
65
64
|
*/
|
|
66
|
-
async function
|
|
67
|
-
return
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Derives a secret key for protecting the encryption keystore
|
|
71
|
-
*
|
|
72
|
-
* @param password - The user's password
|
|
73
|
-
* @param salt - The keystore salt
|
|
74
|
-
* @returns The derived secret key for protecting the encryption keystore
|
|
75
|
-
*/
|
|
76
|
-
async function deriveNewEncryptionKeystoreKey(password) {
|
|
77
|
-
const { key, salt } = await getKeyFromPassword(password);
|
|
78
|
-
return {
|
|
79
|
-
secretKey: deriveSymmetricKeyFromContext(CONTEXT_ENC_KEYSTORE, key),
|
|
80
|
-
salt
|
|
81
|
-
};
|
|
65
|
+
async function deriveEncryptionKeystoreKeyFromMnemonic(mnemonic) {
|
|
66
|
+
return deriveKeyFromMnemonic(mnemonic, CONTEXT_ENC_KEYSTORE);
|
|
82
67
|
}
|
|
83
68
|
|
|
84
69
|
//#endregion
|
|
@@ -89,6 +74,12 @@ var FailedToCreateKeyStores = class FailedToCreateKeyStores extends Error {
|
|
|
89
74
|
Object.setPrototypeOf(this, FailedToCreateKeyStores.prototype);
|
|
90
75
|
}
|
|
91
76
|
};
|
|
77
|
+
var InvalidInputKeyStore = class InvalidInputKeyStore extends Error {
|
|
78
|
+
constructor() {
|
|
79
|
+
super("Invalid input");
|
|
80
|
+
Object.setPrototypeOf(this, InvalidInputKeyStore.prototype);
|
|
81
|
+
}
|
|
82
|
+
};
|
|
92
83
|
var FailedToOpenEncryptionKeyStore = class FailedToOpenEncryptionKeyStore extends Error {
|
|
93
84
|
constructor(errorMsg) {
|
|
94
85
|
super("Failed to open encryption keystore: " + errorMsg);
|
|
@@ -101,10 +92,10 @@ var FailedToOpenRecoveryKeyStore = class FailedToOpenRecoveryKeyStore extends Er
|
|
|
101
92
|
Object.setPrototypeOf(this, FailedToOpenRecoveryKeyStore.prototype);
|
|
102
93
|
}
|
|
103
94
|
};
|
|
104
|
-
var
|
|
95
|
+
var FailedToChangeMnemonicForKeyStore = class FailedToChangeMnemonicForKeyStore extends Error {
|
|
105
96
|
constructor(errorMsg) {
|
|
106
97
|
super("Error while fetching message: " + errorMsg);
|
|
107
|
-
Object.setPrototypeOf(this,
|
|
98
|
+
Object.setPrototypeOf(this, FailedToChangeMnemonicForKeyStore.prototype);
|
|
108
99
|
}
|
|
109
100
|
};
|
|
110
101
|
|
|
@@ -112,27 +103,25 @@ var FailedToChangePasswordForKeyStore = class FailedToChangePasswordForKeyStore
|
|
|
112
103
|
//#region src/keystore-crypto/emailEncryptionKey.ts
|
|
113
104
|
/**
|
|
114
105
|
* Generates hybrid keys and creates encrypted main and recovery keystores
|
|
115
|
-
* The main keystore encryption key is derived from the user's
|
|
106
|
+
* The main keystore encryption key is derived from the user's mnemonic
|
|
116
107
|
* The recovery keystore encryption key is derived from the recovery codes
|
|
117
108
|
*
|
|
118
109
|
* @param userEmail - The user's email
|
|
119
|
-
* @param
|
|
110
|
+
* @param mnemonic - The user's mnemonic
|
|
120
111
|
* @returns The encryption keys
|
|
121
112
|
*
|
|
122
113
|
* @returns The encryption and recovery keystores, recovery codes and hybrid keys
|
|
123
114
|
*/
|
|
124
|
-
async function createEncryptionAndRecoveryKeystores(userEmail,
|
|
115
|
+
async function createEncryptionAndRecoveryKeystores(userEmail, mnemonic) {
|
|
125
116
|
try {
|
|
126
117
|
const keys = genHybridKeys();
|
|
127
|
-
const
|
|
128
|
-
const encryptionKeystore = await encryptKeystoreContent(secretKey, keys, userEmail, KeystoreType.ENCRYPTION);
|
|
118
|
+
const encryptionKeystore = await encryptKeystoreContent(await deriveEncryptionKeystoreKeyFromMnemonic(mnemonic), keys, userEmail, KeystoreType.ENCRYPTION);
|
|
129
119
|
const recoveryCodes = genMnemonic();
|
|
130
120
|
return {
|
|
131
121
|
encryptionKeystore,
|
|
132
122
|
recoveryKeystore: await encryptKeystoreContent(await deriveRecoveryKey(recoveryCodes), keys, userEmail, KeystoreType.RECOVERY),
|
|
133
123
|
recoveryCodes,
|
|
134
|
-
keys
|
|
135
|
-
salt
|
|
124
|
+
keys
|
|
136
125
|
};
|
|
137
126
|
} catch (error) {
|
|
138
127
|
throw new FailedToCreateKeyStores(error instanceof Error ? error.message : String(error));
|
|
@@ -140,18 +129,18 @@ async function createEncryptionAndRecoveryKeystores(userEmail, password) {
|
|
|
140
129
|
}
|
|
141
130
|
/**
|
|
142
131
|
* Opens the encryption keystore and returns the email encryption keys
|
|
143
|
-
* The decryption key is derived from the user
|
|
132
|
+
* The decryption key is derived from the user mnemonic
|
|
144
133
|
*
|
|
145
134
|
* @param encryptedKeystore - The encrypted keystore containing encryption keys
|
|
146
|
-
* @param
|
|
147
|
-
* @param salt - The keystore's salt
|
|
135
|
+
* @param mnemonic - The user's mnemonic
|
|
148
136
|
* @returns The encryption keys
|
|
149
137
|
*/
|
|
150
|
-
async function openEncryptionKeystore(encryptedKeystore,
|
|
138
|
+
async function openEncryptionKeystore(encryptedKeystore, mnemonic) {
|
|
151
139
|
try {
|
|
152
|
-
if (encryptedKeystore.type !== KeystoreType.ENCRYPTION) throw new
|
|
153
|
-
return await decryptKeystoreContent(await
|
|
140
|
+
if (encryptedKeystore.type !== KeystoreType.ENCRYPTION) throw new InvalidInputKeyStore();
|
|
141
|
+
return await decryptKeystoreContent(await deriveEncryptionKeystoreKeyFromMnemonic(mnemonic), encryptedKeystore);
|
|
154
142
|
} catch (error) {
|
|
143
|
+
if (error instanceof InvalidInputKeyStore) throw error;
|
|
155
144
|
throw new FailedToOpenEncryptionKeyStore(error instanceof Error ? error.message : String(error));
|
|
156
145
|
}
|
|
157
146
|
}
|
|
@@ -165,37 +154,35 @@ async function openEncryptionKeystore(encryptedKeystore, password, salt) {
|
|
|
165
154
|
*/
|
|
166
155
|
async function openRecoveryKeystore(recoveryCodes, encryptedKeystore) {
|
|
167
156
|
try {
|
|
168
|
-
if (encryptedKeystore.type !== KeystoreType.RECOVERY) throw new
|
|
157
|
+
if (encryptedKeystore.type !== KeystoreType.RECOVERY) throw new InvalidInputKeyStore();
|
|
169
158
|
return await decryptKeystoreContent(await deriveRecoveryKey(recoveryCodes), encryptedKeystore);
|
|
170
159
|
} catch (error) {
|
|
160
|
+
if (error instanceof InvalidInputKeyStore) throw error;
|
|
171
161
|
throw new FailedToOpenRecoveryKeyStore(error instanceof Error ? error.message : String(error));
|
|
172
162
|
}
|
|
173
163
|
}
|
|
174
164
|
/**
|
|
175
|
-
* Re-encrypts the encryption keystore with a new
|
|
176
|
-
* The decryption key is derived from the user
|
|
165
|
+
* Re-encrypts the encryption keystore with a new mnemonic
|
|
166
|
+
* The decryption key is derived from the user mnemonic
|
|
177
167
|
*
|
|
178
168
|
* @param encryptedKeystore - The encrypted keystore containing encryption keys
|
|
179
|
-
* @param
|
|
180
|
-
* @param
|
|
181
|
-
* @
|
|
182
|
-
* @returns The keys, re-encrypted keystore, and new salt
|
|
169
|
+
* @param oldMnemonic - The user's old mnemonic
|
|
170
|
+
* @param newMnemonic - The user's new mnemonic
|
|
171
|
+
* @returns The keys and new re-encrypted keystore
|
|
183
172
|
*/
|
|
184
|
-
async function
|
|
173
|
+
async function changeMnemonicForEncryptionKeystore(encryptedKeystore, oldMnemonic, newMnemonic) {
|
|
185
174
|
try {
|
|
186
|
-
|
|
187
|
-
const keys = await openEncryptionKeystore(encryptedKeystore, oldPassword, oldSalt);
|
|
188
|
-
const { secretKey, salt } = await deriveNewEncryptionKeystoreKey(newPassword);
|
|
175
|
+
const keys = await openEncryptionKeystore(encryptedKeystore, oldMnemonic);
|
|
189
176
|
return {
|
|
190
|
-
newKeystore: await encryptKeystoreContent(
|
|
191
|
-
newSalt: salt,
|
|
177
|
+
newKeystore: await encryptKeystoreContent(await deriveEncryptionKeystoreKeyFromMnemonic(newMnemonic), keys, encryptedKeystore.userEmail, KeystoreType.ENCRYPTION),
|
|
192
178
|
keys
|
|
193
179
|
};
|
|
194
180
|
} catch (error) {
|
|
195
|
-
|
|
181
|
+
if (error instanceof InvalidInputKeyStore) throw error;
|
|
182
|
+
throw new FailedToChangeMnemonicForKeyStore(error instanceof Error ? error.message : String(error));
|
|
196
183
|
}
|
|
197
184
|
}
|
|
198
185
|
|
|
199
186
|
//#endregion
|
|
200
|
-
export {
|
|
201
|
-
//# sourceMappingURL=emailEncryptionKey-
|
|
187
|
+
export { FailedToChangeMnemonicForKeyStore as a, FailedToOpenRecoveryKeyStore as c, openRecoveryKeystore as i, InvalidInputKeyStore as l, createEncryptionAndRecoveryKeystores as n, FailedToCreateKeyStores as o, openEncryptionKeystore as r, FailedToOpenEncryptionKeyStore as s, changeMnemonicForEncryptionKeystore as t };
|
|
188
|
+
//# sourceMappingURL=emailEncryptionKey-CYvr26FG.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emailEncryptionKey-CYvr26FG.mjs","names":[],"sources":["../src/keystore-crypto/core.ts","../src/keystore-crypto/errors.ts","../src/keystore-crypto/emailEncryptionKey.ts"],"sourcesContent":["import { encryptSymmetrically, decryptSymmetrically } from '../symmetric-crypto';\nimport { base64ToUint8Array, uint8ArrayToBase64, UTF8ToUint8 } from '../utils';\nimport { deriveKeyFromMnemonic } from '../derive-key';\nimport { CONTEXT_ENC_KEYSTORE, CONTEXT_RECOVERY } from '../constants';\nimport { EncryptedKeystore, HybridKeyPair, KeystoreType } from '../types';\n\n/**\n * Encrypts the user's hybrid key using symmetric encryption to get a keystore\n *\n * @param secretKey - The symmetric key to encrypt the keystore content\n * @param key - The hybrid key pair\n * @param userEmail - The email of the user\n * @param type - The keystore type\n * @returns The encrypted keystore\n */\nexport async function encryptKeystoreContent(\n secretKey: Uint8Array,\n keys: HybridKeyPair,\n userEmail: string,\n type: KeystoreType,\n): Promise<EncryptedKeystore> {\n try {\n const publicKey = uint8ArrayToBase64(keys.publicKey);\n\n const aux = UTF8ToUint8(userEmail + type + publicKey);\n const secretKeyEncrypted = await encryptSymmetrically(secretKey, keys.secretKey, aux);\n\n const keystore: EncryptedKeystore = {\n userEmail,\n type,\n publicKey,\n privateKeyEncrypted: uint8ArrayToBase64(secretKeyEncrypted),\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 kesytoreOpeningKey - The symmetric key to decrypt the keystore content\n * @param encryptedKeys - The encrypted keystore content\n * @returns The decrypted hybrid key pair contained in the keystore\n */\nexport async function decryptKeystoreContent(\n kesytoreOpeningKey: Uint8Array,\n encryptedKeystore: EncryptedKeystore,\n): Promise<HybridKeyPair> {\n try {\n const aux = UTF8ToUint8(encryptedKeystore.userEmail + encryptedKeystore.type + encryptedKeystore.publicKey);\n const publicKey = base64ToUint8Array(encryptedKeystore.publicKey);\n const ciphertext = base64ToUint8Array(encryptedKeystore.privateKeyEncrypted);\n const secretKey = await decryptSymmetrically(kesytoreOpeningKey, ciphertext, aux);\n return {\n publicKey,\n secretKey,\n };\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 (machine-generated with secure PRNG)\n * @returns The derived secret key for protecting the recovery keystore\n */\nexport async function deriveRecoveryKey(recoveryCodes: string): Promise<Uint8Array> {\n return deriveKeyFromMnemonic(recoveryCodes, CONTEXT_RECOVERY);\n}\n\n/**\n * Derives a secret key for protecting the encryption keystore from user's mnemonic\n *\n * @param mnemonic - The user's mnemonic (machine-generated with secure PRNG)\n * @returns The derived secret key for protecting the encryption keystore\n */\nexport async function deriveEncryptionKeystoreKeyFromMnemonic(mnemonic: string): Promise<Uint8Array> {\n return deriveKeyFromMnemonic(mnemonic, CONTEXT_ENC_KEYSTORE);\n}\n","export class FailedToCreateKeyStores extends Error {\n constructor(errorMsg?: string) {\n super('Failed to create encryption and recovery keystores: ' + errorMsg);\n\n Object.setPrototypeOf(this, FailedToCreateKeyStores.prototype);\n }\n}\n\nexport class InvalidInputKeyStore extends Error {\n constructor() {\n super('Invalid input');\n\n Object.setPrototypeOf(this, InvalidInputKeyStore.prototype);\n }\n}\n\nexport class FailedToOpenEncryptionKeyStore extends Error {\n constructor(errorMsg?: string) {\n super('Failed to open encryption keystore: ' + errorMsg);\n\n Object.setPrototypeOf(this, FailedToOpenEncryptionKeyStore.prototype);\n }\n}\n\nexport class FailedToOpenRecoveryKeyStore extends Error {\n constructor(errorMsg?: string) {\n super('Failed to open recovery keystore: ' + errorMsg);\n\n Object.setPrototypeOf(this, FailedToOpenRecoveryKeyStore.prototype);\n }\n}\n\nexport class FailedToChangeMnemonicForKeyStore extends Error {\n constructor(errorMsg?: string) {\n super('Error while fetching message: ' + errorMsg);\n\n Object.setPrototypeOf(this, FailedToChangeMnemonicForKeyStore.prototype);\n }\n}\n","import { EncryptedKeystore, KeystoreType, HybridKeyPair } from '../types';\nimport { genMnemonic } from '../utils';\nimport {\n encryptKeystoreContent,\n decryptKeystoreContent,\n deriveEncryptionKeystoreKeyFromMnemonic,\n deriveRecoveryKey,\n} from './core';\nimport { genHybridKeys } from '../hybrid-crypto';\nimport {\n FailedToOpenEncryptionKeyStore,\n FailedToCreateKeyStores,\n FailedToOpenRecoveryKeyStore,\n FailedToChangeMnemonicForKeyStore,\n InvalidInputKeyStore,\n} from './errors';\n\n/**\n * Generates hybrid keys and creates encrypted main and recovery keystores\n * The main keystore encryption key is derived from the user's mnemonic\n * The recovery keystore encryption key is derived from the recovery codes\n *\n * @param userEmail - The user's email\n * @param mnemonic - The user's mnemonic\n * @returns The encryption keys\n *\n * @returns The encryption and recovery keystores, recovery codes and hybrid keys\n */\nexport async function createEncryptionAndRecoveryKeystores(\n userEmail: string,\n mnemonic: string,\n): Promise<{\n encryptionKeystore: EncryptedKeystore;\n recoveryKeystore: EncryptedKeystore;\n recoveryCodes: string;\n keys: HybridKeyPair;\n}> {\n try {\n const keys = genHybridKeys();\n\n const secretKey = await deriveEncryptionKeystoreKeyFromMnemonic(mnemonic);\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 FailedToCreateKeyStores(error instanceof Error ? error.message : String(error));\n }\n}\n\n/**\n * Opens the encryption keystore and returns the email encryption keys\n * The decryption key is derived from the user mnemonic\n *\n * @param encryptedKeystore - The encrypted keystore containing encryption keys\n * @param mnemonic - The user's mnemonic\n * @returns The encryption keys\n */\nexport async function openEncryptionKeystore(\n encryptedKeystore: EncryptedKeystore,\n mnemonic: string,\n): Promise<HybridKeyPair> {\n try {\n if (encryptedKeystore.type !== KeystoreType.ENCRYPTION) {\n throw new InvalidInputKeyStore();\n }\n const secretKey = await deriveEncryptionKeystoreKeyFromMnemonic(mnemonic);\n const keys = await decryptKeystoreContent(secretKey, encryptedKeystore);\n return keys;\n } catch (error) {\n if (error instanceof InvalidInputKeyStore) throw error;\n throw new FailedToOpenEncryptionKeyStore(error instanceof Error ? error.message : String(error));\n }\n}\n\n/**\n * Opens the recovery keystore and returns the email encryption keys\n * The decryption key is derived from the recovery codes (machine-generated mnemonic)\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<HybridKeyPair> {\n try {\n if (encryptedKeystore.type !== KeystoreType.RECOVERY) {\n throw new InvalidInputKeyStore();\n }\n const recoveryKey = await deriveRecoveryKey(recoveryCodes);\n const keys = await decryptKeystoreContent(recoveryKey, encryptedKeystore);\n return keys;\n } catch (error) {\n if (error instanceof InvalidInputKeyStore) throw error;\n throw new FailedToOpenRecoveryKeyStore(error instanceof Error ? error.message : String(error));\n }\n}\n\n/**\n * Re-encrypts the encryption keystore with a new mnemonic\n * The decryption key is derived from the user mnemonic\n *\n * @param encryptedKeystore - The encrypted keystore containing encryption keys\n * @param oldMnemonic - The user's old mnemonic\n * @param newMnemonic - The user's new mnemonic\n * @returns The keys and new re-encrypted keystore\n */\nexport async function changeMnemonicForEncryptionKeystore(\n encryptedKeystore: EncryptedKeystore,\n oldMnemonic: string,\n newMnemonic: string,\n): Promise<{ keys: HybridKeyPair; newKeystore: EncryptedKeystore }> {\n try {\n const keys = await openEncryptionKeystore(encryptedKeystore, oldMnemonic);\n\n const secretKey = await deriveEncryptionKeystoreKeyFromMnemonic(newMnemonic);\n const newKeystore = await encryptKeystoreContent(\n secretKey,\n keys,\n encryptedKeystore.userEmail,\n KeystoreType.ENCRYPTION,\n );\n\n return { newKeystore, keys };\n } catch (error) {\n if (error instanceof InvalidInputKeyStore) throw error;\n throw new FailedToChangeMnemonicForKeyStore(error instanceof Error ? error.message : String(error));\n }\n}\n"],"mappings":"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"}
|
package/dist/index.d.mts
CHANGED
|
@@ -5,7 +5,7 @@ import { generateSalt, getKeyFromPassword, getKeyFromPasswordAndSalt } from "./d
|
|
|
5
5
|
import { EmailBody, EmailBodyEncrypted, EncryptedKeystore, HybridEncKey, HybridEncryptedEmail, HybridKeyPair, KeystoreType, PwdProtectedEmail, PwdProtectedKey, RecipientWithPublicKey } from "./types.mjs";
|
|
6
6
|
import { createPwdProtectedEmail, decryptEmailBody, decryptEmailHybrid, decryptPwdProtectedEmail, deriveDatabaseKey, deriveEmailDraftKey, encryptEmailBody, encryptEmailBodyWithKey, encryptEmailHybrid, encryptEmailHybridForMultipleRecipients, generateEmailKeys } from "./email-crypto.mjs";
|
|
7
7
|
import { getBytesFromData, getBytesFromDataArray, hashData, hashDataArray, hashDataArrayWithKey, hashDataWithKey } from "./hash.mjs";
|
|
8
|
-
import {
|
|
8
|
+
import { FailedToChangeMnemonicForKeyStore, FailedToCreateKeyStores, FailedToOpenEncryptionKeyStore, FailedToOpenRecoveryKeyStore, InvalidInputKeyStore, changeMnemonicForEncryptionKeystore, createEncryptionAndRecoveryKeystores, openEncryptionKeystore, openRecoveryKeystore } from "./keystore-crypto.mjs";
|
|
9
9
|
import { decapsulateKyber, encapsulateKyber, generateKyberKeys } from "./post-quantum-crypto.mjs";
|
|
10
10
|
import { decryptSymmetrically, encryptSymmetrically, genSymmetricKey } from "./symmetric-crypto.mjs";
|
|
11
11
|
import { UTF8ToUint8, base64ToUint8Array, bytesToMnemonic, bytesToUuid, genMnemonic, generateUuid, hexToUint8Array, mnemonicToBytes, uint8ArrayToBase64, uint8ArrayToHex, uint8ToUTF8, uuidToBytes } from "./utils.mjs";
|
|
@@ -28,5 +28,5 @@ declare function unwrapKey(encryptedKey: Uint8Array, wrappingKey: Uint8Array): P
|
|
|
28
28
|
*/
|
|
29
29
|
declare function wrapKey(key: Uint8Array, wrappingKey: Uint8Array): Promise<Uint8Array>;
|
|
30
30
|
//#endregion
|
|
31
|
-
export { AES_KEY_BYTE_LENGTH, ARGON2ID_ITERATIONS, ARGON2ID_MEMORY_SIZE, ARGON2ID_OUTPUT_BYTE_LENGTH, ARGON2ID_PARALLELISM, ARGON2ID_SALT_BYTE_LENGTH, CONTEXT_DATABASE, CONTEXT_DRAFT, CONTEXT_ENC_KEYSTORE, CONTEXT_RECOVERY, CONTEXT_TWO_KEYS, DB_LABEL, DB_VERSION, EmailBody, EmailBodyEncrypted, EncryptedKeystore,
|
|
31
|
+
export { AES_KEY_BYTE_LENGTH, ARGON2ID_ITERATIONS, ARGON2ID_MEMORY_SIZE, ARGON2ID_OUTPUT_BYTE_LENGTH, ARGON2ID_PARALLELISM, ARGON2ID_SALT_BYTE_LENGTH, CONTEXT_DATABASE, CONTEXT_DRAFT, CONTEXT_ENC_KEYSTORE, CONTEXT_RECOVERY, CONTEXT_TWO_KEYS, DB_LABEL, DB_VERSION, EmailBody, EmailBodyEncrypted, EncryptedKeystore, FailedToChangeMnemonicForKeyStore, FailedToCreateKeyStores, FailedToOpenEncryptionKeyStore, FailedToOpenRecoveryKeyStore, HybridEncKey, HybridEncryptedEmail, HybridKeyPair, IV_LEN_BYTES, InvalidInputKeyStore, KYBER768_PUBLIC_KEY_LENGTH, KYBER768_SECRET_KEY_LENGTH, KYBER_SEED_LENGTH, KeystoreType, MAX_CACHE_SIZE, MAX_EMAIL_PER_BATCH, PwdProtectedEmail, PwdProtectedKey, RecipientWithPublicKey, UTF8ToUint8, XWING_CIPHERTEXT_BYTE_LENGTH, XWING_PUBLIC_KEY_LENGTH, XWING_SECRET_KEY_LENGTH, XWING_SEED_BYTE_LENGTH, base64ToUint8Array, bytesToMnemonic, bytesToUuid, changeMnemonicForEncryptionKeystore, createEncryptionAndRecoveryKeystores, createPwdProtectedEmail, decapsulateKyber, decryptEmailBody, decryptEmailHybrid, decryptPwdProtectedEmail, decryptSymmetrically, deriveDatabaseKey, deriveEmailDraftKey, deriveKeyFromMnemonic, deriveSecretKey, deriveSymmetricKeyFromContext, deriveSymmetricKeyFromTwoKeys, encapsulateKyber, encryptEmailBody, encryptEmailBodyWithKey, encryptEmailHybrid, encryptEmailHybridForMultipleRecipients, encryptSymmetrically, genMnemonic, genSymmetricKey, generateEccKeys, generateEmailKeys, generateKyberKeys, generateSalt, generateUuid, getBytesFromData, getBytesFromDataArray, getKeyFromPassword, getKeyFromPasswordAndSalt, hashData, hashDataArray, hashDataArrayWithKey, hashDataWithKey, hexToUint8Array, mnemonicToBytes, openEncryptionKeystore, openRecoveryKeystore, uint8ArrayToBase64, uint8ArrayToHex, uint8ToUTF8, unwrapKey, uuidToBytes, wrapKey };
|
|
32
32
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ import { generateSalt, getKeyFromPassword, getKeyFromPasswordAndSalt } from "./d
|
|
|
5
5
|
import { EmailBody, EmailBodyEncrypted, EncryptedKeystore, HybridEncKey, HybridEncryptedEmail, HybridKeyPair, KeystoreType, PwdProtectedEmail, PwdProtectedKey, RecipientWithPublicKey } from "./types.js";
|
|
6
6
|
import { createPwdProtectedEmail, decryptEmailBody, decryptEmailHybrid, decryptPwdProtectedEmail, deriveDatabaseKey, deriveEmailDraftKey, encryptEmailBody, encryptEmailBodyWithKey, encryptEmailHybrid, encryptEmailHybridForMultipleRecipients, generateEmailKeys } from "./email-crypto.js";
|
|
7
7
|
import { getBytesFromData, getBytesFromDataArray, hashData, hashDataArray, hashDataArrayWithKey, hashDataWithKey } from "./hash.js";
|
|
8
|
-
import {
|
|
8
|
+
import { FailedToChangeMnemonicForKeyStore, FailedToCreateKeyStores, FailedToOpenEncryptionKeyStore, FailedToOpenRecoveryKeyStore, InvalidInputKeyStore, changeMnemonicForEncryptionKeystore, createEncryptionAndRecoveryKeystores, openEncryptionKeystore, openRecoveryKeystore } from "./keystore-crypto.js";
|
|
9
9
|
import { decapsulateKyber, encapsulateKyber, generateKyberKeys } from "./post-quantum-crypto.js";
|
|
10
10
|
import { decryptSymmetrically, encryptSymmetrically, genSymmetricKey } from "./symmetric-crypto.js";
|
|
11
11
|
import { UTF8ToUint8, base64ToUint8Array, bytesToMnemonic, bytesToUuid, genMnemonic, generateUuid, hexToUint8Array, mnemonicToBytes, uint8ArrayToBase64, uint8ArrayToHex, uint8ToUTF8, uuidToBytes } from "./utils.js";
|
|
@@ -28,5 +28,5 @@ declare function unwrapKey(encryptedKey: Uint8Array, wrappingKey: Uint8Array): P
|
|
|
28
28
|
*/
|
|
29
29
|
declare function wrapKey(key: Uint8Array, wrappingKey: Uint8Array): Promise<Uint8Array>;
|
|
30
30
|
//#endregion
|
|
31
|
-
export { AES_KEY_BYTE_LENGTH, ARGON2ID_ITERATIONS, ARGON2ID_MEMORY_SIZE, ARGON2ID_OUTPUT_BYTE_LENGTH, ARGON2ID_PARALLELISM, ARGON2ID_SALT_BYTE_LENGTH, CONTEXT_DATABASE, CONTEXT_DRAFT, CONTEXT_ENC_KEYSTORE, CONTEXT_RECOVERY, CONTEXT_TWO_KEYS, DB_LABEL, DB_VERSION, EmailBody, EmailBodyEncrypted, EncryptedKeystore,
|
|
31
|
+
export { AES_KEY_BYTE_LENGTH, ARGON2ID_ITERATIONS, ARGON2ID_MEMORY_SIZE, ARGON2ID_OUTPUT_BYTE_LENGTH, ARGON2ID_PARALLELISM, ARGON2ID_SALT_BYTE_LENGTH, CONTEXT_DATABASE, CONTEXT_DRAFT, CONTEXT_ENC_KEYSTORE, CONTEXT_RECOVERY, CONTEXT_TWO_KEYS, DB_LABEL, DB_VERSION, EmailBody, EmailBodyEncrypted, EncryptedKeystore, FailedToChangeMnemonicForKeyStore, FailedToCreateKeyStores, FailedToOpenEncryptionKeyStore, FailedToOpenRecoveryKeyStore, HybridEncKey, HybridEncryptedEmail, HybridKeyPair, IV_LEN_BYTES, InvalidInputKeyStore, KYBER768_PUBLIC_KEY_LENGTH, KYBER768_SECRET_KEY_LENGTH, KYBER_SEED_LENGTH, KeystoreType, MAX_CACHE_SIZE, MAX_EMAIL_PER_BATCH, PwdProtectedEmail, PwdProtectedKey, RecipientWithPublicKey, UTF8ToUint8, XWING_CIPHERTEXT_BYTE_LENGTH, XWING_PUBLIC_KEY_LENGTH, XWING_SECRET_KEY_LENGTH, XWING_SEED_BYTE_LENGTH, base64ToUint8Array, bytesToMnemonic, bytesToUuid, changeMnemonicForEncryptionKeystore, createEncryptionAndRecoveryKeystores, createPwdProtectedEmail, decapsulateKyber, decryptEmailBody, decryptEmailHybrid, decryptPwdProtectedEmail, decryptSymmetrically, deriveDatabaseKey, deriveEmailDraftKey, deriveKeyFromMnemonic, deriveSecretKey, deriveSymmetricKeyFromContext, deriveSymmetricKeyFromTwoKeys, encapsulateKyber, encryptEmailBody, encryptEmailBodyWithKey, encryptEmailHybrid, encryptEmailHybridForMultipleRecipients, encryptSymmetrically, genMnemonic, genSymmetricKey, generateEccKeys, generateEmailKeys, generateKyberKeys, generateSalt, generateUuid, getBytesFromData, getBytesFromDataArray, getKeyFromPassword, getKeyFromPasswordAndSalt, hashData, hashDataArray, hashDataArrayWithKey, hashDataWithKey, hexToUint8Array, mnemonicToBytes, openEncryptionKeystore, openRecoveryKeystore, uint8ArrayToBase64, uint8ArrayToHex, uint8ToUTF8, unwrapKey, uuidToBytes, wrapKey };
|
|
32
32
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.js
CHANGED
|
@@ -8,7 +8,7 @@ const require_aes = require('./aes-CuW_SPl-.js');
|
|
|
8
8
|
const require_emailKeys = require('./emailKeys-BFI-paQq.js');
|
|
9
9
|
const require_hash = require('./hash.js');
|
|
10
10
|
const require_types = require('./types.js');
|
|
11
|
-
const require_emailEncryptionKey = require('./emailEncryptionKey-
|
|
11
|
+
const require_emailEncryptionKey = require('./emailEncryptionKey-Ba95VuFO.js');
|
|
12
12
|
const require_post_quantum_crypto = require('./post-quantum-crypto.js');
|
|
13
13
|
|
|
14
14
|
exports.AES_KEY_BYTE_LENGTH = require_constants.AES_KEY_BYTE_LENGTH;
|
|
@@ -24,11 +24,12 @@ exports.CONTEXT_RECOVERY = require_constants.CONTEXT_RECOVERY;
|
|
|
24
24
|
exports.CONTEXT_TWO_KEYS = require_constants.CONTEXT_TWO_KEYS;
|
|
25
25
|
exports.DB_LABEL = require_constants.DB_LABEL;
|
|
26
26
|
exports.DB_VERSION = require_constants.DB_VERSION;
|
|
27
|
-
exports.
|
|
27
|
+
exports.FailedToChangeMnemonicForKeyStore = require_emailEncryptionKey.FailedToChangeMnemonicForKeyStore;
|
|
28
28
|
exports.FailedToCreateKeyStores = require_emailEncryptionKey.FailedToCreateKeyStores;
|
|
29
29
|
exports.FailedToOpenEncryptionKeyStore = require_emailEncryptionKey.FailedToOpenEncryptionKeyStore;
|
|
30
30
|
exports.FailedToOpenRecoveryKeyStore = require_emailEncryptionKey.FailedToOpenRecoveryKeyStore;
|
|
31
31
|
exports.IV_LEN_BYTES = require_constants.IV_LEN_BYTES;
|
|
32
|
+
exports.InvalidInputKeyStore = require_emailEncryptionKey.InvalidInputKeyStore;
|
|
32
33
|
exports.KYBER768_PUBLIC_KEY_LENGTH = require_constants.KYBER768_PUBLIC_KEY_LENGTH;
|
|
33
34
|
exports.KYBER768_SECRET_KEY_LENGTH = require_constants.KYBER768_SECRET_KEY_LENGTH;
|
|
34
35
|
exports.KYBER_SEED_LENGTH = require_constants.KYBER_SEED_LENGTH;
|
|
@@ -43,7 +44,7 @@ exports.XWING_SEED_BYTE_LENGTH = require_constants.XWING_SEED_BYTE_LENGTH;
|
|
|
43
44
|
exports.base64ToUint8Array = require_genID.base64ToUint8Array;
|
|
44
45
|
exports.bytesToMnemonic = require_genID.bytesToMnemonic;
|
|
45
46
|
exports.bytesToUuid = require_genID.bytesToUuid;
|
|
46
|
-
exports.
|
|
47
|
+
exports.changeMnemonicForEncryptionKeystore = require_emailEncryptionKey.changeMnemonicForEncryptionKeystore;
|
|
47
48
|
exports.createEncryptionAndRecoveryKeystores = require_emailEncryptionKey.createEncryptionAndRecoveryKeystores;
|
|
48
49
|
exports.createPwdProtectedEmail = require_emailKeys.createPwdProtectedEmail;
|
|
49
50
|
exports.decapsulateKyber = require_post_quantum_crypto.decapsulateKyber;
|
package/dist/index.mjs
CHANGED
|
@@ -7,7 +7,7 @@ import { n as encryptSymmetrically, r as genSymmetricKey, t as decryptSymmetrica
|
|
|
7
7
|
import { _ as wrapKey, a as decryptPwdProtectedEmail, c as encryptEmailHybridForMultipleRecipients, d as encryptEmailBody, f as encryptEmailBodyWithKey, g as unwrapKey, i as createPwdProtectedEmail, l as decryptEmailBody, n as deriveEmailDraftKey, o as decryptEmailHybrid, r as generateEmailKeys, s as encryptEmailHybrid, t as deriveDatabaseKey } from "./emailKeys-BjIeINfC.mjs";
|
|
8
8
|
import { getBytesFromData, getBytesFromDataArray, hashData, hashDataArray, hashDataArrayWithKey, hashDataWithKey } from "./hash.mjs";
|
|
9
9
|
import { KeystoreType } from "./types.mjs";
|
|
10
|
-
import { a as
|
|
10
|
+
import { a as FailedToChangeMnemonicForKeyStore, c as FailedToOpenRecoveryKeyStore, i as openRecoveryKeystore, l as InvalidInputKeyStore, n as createEncryptionAndRecoveryKeystores, o as FailedToCreateKeyStores, r as openEncryptionKeystore, s as FailedToOpenEncryptionKeyStore, t as changeMnemonicForEncryptionKeystore } from "./emailEncryptionKey-CYvr26FG.mjs";
|
|
11
11
|
import { decapsulateKyber, encapsulateKyber, generateKyberKeys } from "./post-quantum-crypto.mjs";
|
|
12
12
|
|
|
13
|
-
export { AES_KEY_BYTE_LENGTH, ARGON2ID_ITERATIONS, ARGON2ID_MEMORY_SIZE, ARGON2ID_OUTPUT_BYTE_LENGTH, ARGON2ID_PARALLELISM, ARGON2ID_SALT_BYTE_LENGTH, CONTEXT_DATABASE, CONTEXT_DRAFT, CONTEXT_ENC_KEYSTORE, CONTEXT_RECOVERY, CONTEXT_TWO_KEYS, DB_LABEL, DB_VERSION,
|
|
13
|
+
export { AES_KEY_BYTE_LENGTH, ARGON2ID_ITERATIONS, ARGON2ID_MEMORY_SIZE, ARGON2ID_OUTPUT_BYTE_LENGTH, ARGON2ID_PARALLELISM, ARGON2ID_SALT_BYTE_LENGTH, CONTEXT_DATABASE, CONTEXT_DRAFT, CONTEXT_ENC_KEYSTORE, CONTEXT_RECOVERY, CONTEXT_TWO_KEYS, DB_LABEL, DB_VERSION, FailedToChangeMnemonicForKeyStore, FailedToCreateKeyStores, FailedToOpenEncryptionKeyStore, FailedToOpenRecoveryKeyStore, IV_LEN_BYTES, InvalidInputKeyStore, KYBER768_PUBLIC_KEY_LENGTH, KYBER768_SECRET_KEY_LENGTH, KYBER_SEED_LENGTH, KeystoreType, MAX_CACHE_SIZE, MAX_EMAIL_PER_BATCH, UTF8ToUint8, XWING_CIPHERTEXT_BYTE_LENGTH, XWING_PUBLIC_KEY_LENGTH, XWING_SECRET_KEY_LENGTH, XWING_SEED_BYTE_LENGTH, base64ToUint8Array, bytesToMnemonic, bytesToUuid, changeMnemonicForEncryptionKeystore, createEncryptionAndRecoveryKeystores, createPwdProtectedEmail, decapsulateKyber, decryptEmailBody, decryptEmailHybrid, decryptPwdProtectedEmail, decryptSymmetrically, deriveDatabaseKey, deriveEmailDraftKey, deriveKeyFromMnemonic, deriveSecretKey, deriveSymmetricKeyFromContext, deriveSymmetricKeyFromTwoKeys, encapsulateKyber, encryptEmailBody, encryptEmailBodyWithKey, encryptEmailHybrid, encryptEmailHybridForMultipleRecipients, encryptSymmetrically, genMnemonic, genSymmetricKey, generateEccKeys, generateEmailKeys, generateKyberKeys, generateSalt, generateUuid, getBytesFromData, getBytesFromDataArray, getKeyFromPassword, getKeyFromPasswordAndSalt, hashData, hashDataArray, hashDataArrayWithKey, hashDataWithKey, hexToUint8Array, mnemonicToBytes, openEncryptionKeystore, openRecoveryKeystore, uint8ArrayToBase64, uint8ArrayToHex, uint8ToUTF8, unwrapKey, uuidToBytes, wrapKey };
|
|
@@ -3,32 +3,30 @@ import { EncryptedKeystore, HybridKeyPair } from "./types.mjs";
|
|
|
3
3
|
//#region src/keystore-crypto/emailEncryptionKey.d.ts
|
|
4
4
|
/**
|
|
5
5
|
* Generates hybrid keys and creates encrypted main and recovery keystores
|
|
6
|
-
* The main keystore encryption key is derived from the user's
|
|
6
|
+
* The main keystore encryption key is derived from the user's mnemonic
|
|
7
7
|
* The recovery keystore encryption key is derived from the recovery codes
|
|
8
8
|
*
|
|
9
9
|
* @param userEmail - The user's email
|
|
10
|
-
* @param
|
|
10
|
+
* @param mnemonic - The user's mnemonic
|
|
11
11
|
* @returns The encryption keys
|
|
12
12
|
*
|
|
13
13
|
* @returns The encryption and recovery keystores, recovery codes and hybrid keys
|
|
14
14
|
*/
|
|
15
|
-
declare function createEncryptionAndRecoveryKeystores(userEmail: string,
|
|
15
|
+
declare function createEncryptionAndRecoveryKeystores(userEmail: string, mnemonic: string): Promise<{
|
|
16
16
|
encryptionKeystore: EncryptedKeystore;
|
|
17
17
|
recoveryKeystore: EncryptedKeystore;
|
|
18
18
|
recoveryCodes: string;
|
|
19
19
|
keys: HybridKeyPair;
|
|
20
|
-
salt: Uint8Array;
|
|
21
20
|
}>;
|
|
22
21
|
/**
|
|
23
22
|
* Opens the encryption keystore and returns the email encryption keys
|
|
24
|
-
* The decryption key is derived from the user
|
|
23
|
+
* The decryption key is derived from the user mnemonic
|
|
25
24
|
*
|
|
26
25
|
* @param encryptedKeystore - The encrypted keystore containing encryption keys
|
|
27
|
-
* @param
|
|
28
|
-
* @param salt - The keystore's salt
|
|
26
|
+
* @param mnemonic - The user's mnemonic
|
|
29
27
|
* @returns The encryption keys
|
|
30
28
|
*/
|
|
31
|
-
declare function openEncryptionKeystore(encryptedKeystore: EncryptedKeystore,
|
|
29
|
+
declare function openEncryptionKeystore(encryptedKeystore: EncryptedKeystore, mnemonic: string): Promise<HybridKeyPair>;
|
|
32
30
|
/**
|
|
33
31
|
* Opens the recovery keystore and returns the email encryption keys
|
|
34
32
|
* The decryption key is derived from the recovery codes (machine-generated mnemonic)
|
|
@@ -39,18 +37,16 @@ declare function openEncryptionKeystore(encryptedKeystore: EncryptedKeystore, pa
|
|
|
39
37
|
*/
|
|
40
38
|
declare function openRecoveryKeystore(recoveryCodes: string, encryptedKeystore: EncryptedKeystore): Promise<HybridKeyPair>;
|
|
41
39
|
/**
|
|
42
|
-
* Re-encrypts the encryption keystore with a new
|
|
43
|
-
* The decryption key is derived from the user
|
|
40
|
+
* Re-encrypts the encryption keystore with a new mnemonic
|
|
41
|
+
* The decryption key is derived from the user mnemonic
|
|
44
42
|
*
|
|
45
43
|
* @param encryptedKeystore - The encrypted keystore containing encryption keys
|
|
46
|
-
* @param
|
|
47
|
-
* @param
|
|
48
|
-
* @
|
|
49
|
-
* @returns The keys, re-encrypted keystore, and new salt
|
|
44
|
+
* @param oldMnemonic - The user's old mnemonic
|
|
45
|
+
* @param newMnemonic - The user's new mnemonic
|
|
46
|
+
* @returns The keys and new re-encrypted keystore
|
|
50
47
|
*/
|
|
51
|
-
declare function
|
|
48
|
+
declare function changeMnemonicForEncryptionKeystore(encryptedKeystore: EncryptedKeystore, oldMnemonic: string, newMnemonic: string): Promise<{
|
|
52
49
|
keys: HybridKeyPair;
|
|
53
|
-
newSalt: Uint8Array;
|
|
54
50
|
newKeystore: EncryptedKeystore;
|
|
55
51
|
}>;
|
|
56
52
|
//#endregion
|
|
@@ -58,15 +54,18 @@ declare function changePasswordForEncryptionKeystore(encryptedKeystore: Encrypte
|
|
|
58
54
|
declare class FailedToCreateKeyStores extends Error {
|
|
59
55
|
constructor(errorMsg?: string);
|
|
60
56
|
}
|
|
57
|
+
declare class InvalidInputKeyStore extends Error {
|
|
58
|
+
constructor();
|
|
59
|
+
}
|
|
61
60
|
declare class FailedToOpenEncryptionKeyStore extends Error {
|
|
62
61
|
constructor(errorMsg?: string);
|
|
63
62
|
}
|
|
64
63
|
declare class FailedToOpenRecoveryKeyStore extends Error {
|
|
65
64
|
constructor(errorMsg?: string);
|
|
66
65
|
}
|
|
67
|
-
declare class
|
|
66
|
+
declare class FailedToChangeMnemonicForKeyStore extends Error {
|
|
68
67
|
constructor(errorMsg?: string);
|
|
69
68
|
}
|
|
70
69
|
//#endregion
|
|
71
|
-
export {
|
|
70
|
+
export { FailedToChangeMnemonicForKeyStore, FailedToCreateKeyStores, FailedToOpenEncryptionKeyStore, FailedToOpenRecoveryKeyStore, InvalidInputKeyStore, changeMnemonicForEncryptionKeystore, createEncryptionAndRecoveryKeystores, openEncryptionKeystore, openRecoveryKeystore };
|
|
72
71
|
//# sourceMappingURL=keystore-crypto.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keystore-crypto.d.mts","names":[],"sources":["../src/keystore-crypto/emailEncryptionKey.ts","../src/keystore-crypto/errors.ts"],"mappings":";;;;;AA4BA;;;;;;;;;iBAAsB,oCAAA,CACpB,SAAA,UACA,QAAA,WACC,OAAA;EACD,kBAAA,EAAoB,iBAAA;EACpB,gBAAA,EAAkB,iBAAA;EAClB,aAAA;EACA,IAAA,EAAM,aAAA;
|
|
1
|
+
{"version":3,"file":"keystore-crypto.d.mts","names":[],"sources":["../src/keystore-crypto/emailEncryptionKey.ts","../src/keystore-crypto/errors.ts"],"mappings":";;;;;AA4BA;;;;;;;;;iBAAsB,oCAAA,CACpB,SAAA,UACA,QAAA,WACC,OAAA;EACD,kBAAA,EAAoB,iBAAA;EACpB,gBAAA,EAAkB,iBAAA;EAClB,aAAA;EACA,IAAA,EAAM,aAAA;AAAA;;;;;;;AA0BR;;iBAAsB,sBAAA,CACpB,iBAAA,EAAmB,iBAAA,EACnB,QAAA,WACC,OAAA,CAAQ,aAAA;;;;;;;;;iBAsBW,oBAAA,CACpB,aAAA,UACA,iBAAA,EAAmB,iBAAA,GAClB,OAAA,CAAQ,aAAA;;;;AAHX;;;;;;iBA0BsB,mCAAA,CACpB,iBAAA,EAAmB,iBAAA,EACnB,WAAA,UACA,WAAA,WACC,OAAA;EAAU,IAAA,EAAM,aAAA;EAAe,WAAA,EAAa,iBAAA;AAAA;;;cCpHlC,uBAAA,SAAgC,KAAA;cAC/B,QAAA;AAAA;AAAA,cAOD,oBAAA,SAA6B,KAAA;EAAA,WAAA,CAAA;AAAA;AAAA,cAQ7B,8BAAA,SAAuC,KAAA;cACtC,QAAA;AAAA;AAAA,cAOD,4BAAA,SAAqC,KAAA;cACpC,QAAA;AAAA;AAAA,cAOD,iCAAA,SAA0C,KAAA;cACzC,QAAA;AAAA"}
|
|
@@ -3,32 +3,30 @@ import { EncryptedKeystore, HybridKeyPair } from "./types.js";
|
|
|
3
3
|
//#region src/keystore-crypto/emailEncryptionKey.d.ts
|
|
4
4
|
/**
|
|
5
5
|
* Generates hybrid keys and creates encrypted main and recovery keystores
|
|
6
|
-
* The main keystore encryption key is derived from the user's
|
|
6
|
+
* The main keystore encryption key is derived from the user's mnemonic
|
|
7
7
|
* The recovery keystore encryption key is derived from the recovery codes
|
|
8
8
|
*
|
|
9
9
|
* @param userEmail - The user's email
|
|
10
|
-
* @param
|
|
10
|
+
* @param mnemonic - The user's mnemonic
|
|
11
11
|
* @returns The encryption keys
|
|
12
12
|
*
|
|
13
13
|
* @returns The encryption and recovery keystores, recovery codes and hybrid keys
|
|
14
14
|
*/
|
|
15
|
-
declare function createEncryptionAndRecoveryKeystores(userEmail: string,
|
|
15
|
+
declare function createEncryptionAndRecoveryKeystores(userEmail: string, mnemonic: string): Promise<{
|
|
16
16
|
encryptionKeystore: EncryptedKeystore;
|
|
17
17
|
recoveryKeystore: EncryptedKeystore;
|
|
18
18
|
recoveryCodes: string;
|
|
19
19
|
keys: HybridKeyPair;
|
|
20
|
-
salt: Uint8Array;
|
|
21
20
|
}>;
|
|
22
21
|
/**
|
|
23
22
|
* Opens the encryption keystore and returns the email encryption keys
|
|
24
|
-
* The decryption key is derived from the user
|
|
23
|
+
* The decryption key is derived from the user mnemonic
|
|
25
24
|
*
|
|
26
25
|
* @param encryptedKeystore - The encrypted keystore containing encryption keys
|
|
27
|
-
* @param
|
|
28
|
-
* @param salt - The keystore's salt
|
|
26
|
+
* @param mnemonic - The user's mnemonic
|
|
29
27
|
* @returns The encryption keys
|
|
30
28
|
*/
|
|
31
|
-
declare function openEncryptionKeystore(encryptedKeystore: EncryptedKeystore,
|
|
29
|
+
declare function openEncryptionKeystore(encryptedKeystore: EncryptedKeystore, mnemonic: string): Promise<HybridKeyPair>;
|
|
32
30
|
/**
|
|
33
31
|
* Opens the recovery keystore and returns the email encryption keys
|
|
34
32
|
* The decryption key is derived from the recovery codes (machine-generated mnemonic)
|
|
@@ -39,18 +37,16 @@ declare function openEncryptionKeystore(encryptedKeystore: EncryptedKeystore, pa
|
|
|
39
37
|
*/
|
|
40
38
|
declare function openRecoveryKeystore(recoveryCodes: string, encryptedKeystore: EncryptedKeystore): Promise<HybridKeyPair>;
|
|
41
39
|
/**
|
|
42
|
-
* Re-encrypts the encryption keystore with a new
|
|
43
|
-
* The decryption key is derived from the user
|
|
40
|
+
* Re-encrypts the encryption keystore with a new mnemonic
|
|
41
|
+
* The decryption key is derived from the user mnemonic
|
|
44
42
|
*
|
|
45
43
|
* @param encryptedKeystore - The encrypted keystore containing encryption keys
|
|
46
|
-
* @param
|
|
47
|
-
* @param
|
|
48
|
-
* @
|
|
49
|
-
* @returns The keys, re-encrypted keystore, and new salt
|
|
44
|
+
* @param oldMnemonic - The user's old mnemonic
|
|
45
|
+
* @param newMnemonic - The user's new mnemonic
|
|
46
|
+
* @returns The keys and new re-encrypted keystore
|
|
50
47
|
*/
|
|
51
|
-
declare function
|
|
48
|
+
declare function changeMnemonicForEncryptionKeystore(encryptedKeystore: EncryptedKeystore, oldMnemonic: string, newMnemonic: string): Promise<{
|
|
52
49
|
keys: HybridKeyPair;
|
|
53
|
-
newSalt: Uint8Array;
|
|
54
50
|
newKeystore: EncryptedKeystore;
|
|
55
51
|
}>;
|
|
56
52
|
//#endregion
|
|
@@ -58,15 +54,18 @@ declare function changePasswordForEncryptionKeystore(encryptedKeystore: Encrypte
|
|
|
58
54
|
declare class FailedToCreateKeyStores extends Error {
|
|
59
55
|
constructor(errorMsg?: string);
|
|
60
56
|
}
|
|
57
|
+
declare class InvalidInputKeyStore extends Error {
|
|
58
|
+
constructor();
|
|
59
|
+
}
|
|
61
60
|
declare class FailedToOpenEncryptionKeyStore extends Error {
|
|
62
61
|
constructor(errorMsg?: string);
|
|
63
62
|
}
|
|
64
63
|
declare class FailedToOpenRecoveryKeyStore extends Error {
|
|
65
64
|
constructor(errorMsg?: string);
|
|
66
65
|
}
|
|
67
|
-
declare class
|
|
66
|
+
declare class FailedToChangeMnemonicForKeyStore extends Error {
|
|
68
67
|
constructor(errorMsg?: string);
|
|
69
68
|
}
|
|
70
69
|
//#endregion
|
|
71
|
-
export {
|
|
70
|
+
export { FailedToChangeMnemonicForKeyStore, FailedToCreateKeyStores, FailedToOpenEncryptionKeyStore, FailedToOpenRecoveryKeyStore, InvalidInputKeyStore, changeMnemonicForEncryptionKeystore, createEncryptionAndRecoveryKeystores, openEncryptionKeystore, openRecoveryKeystore };
|
|
72
71
|
//# sourceMappingURL=keystore-crypto.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keystore-crypto.d.ts","names":[],"sources":["../src/keystore-crypto/emailEncryptionKey.ts","../src/keystore-crypto/errors.ts"],"mappings":";;;;;AA4BA;;;;;;;;;iBAAsB,oCAAA,CACpB,SAAA,UACA,QAAA,WACC,OAAA;EACD,kBAAA,EAAoB,iBAAA;EACpB,gBAAA,EAAkB,iBAAA;EAClB,aAAA;EACA,IAAA,EAAM,aAAA;
|
|
1
|
+
{"version":3,"file":"keystore-crypto.d.ts","names":[],"sources":["../src/keystore-crypto/emailEncryptionKey.ts","../src/keystore-crypto/errors.ts"],"mappings":";;;;;AA4BA;;;;;;;;;iBAAsB,oCAAA,CACpB,SAAA,UACA,QAAA,WACC,OAAA;EACD,kBAAA,EAAoB,iBAAA;EACpB,gBAAA,EAAkB,iBAAA;EAClB,aAAA;EACA,IAAA,EAAM,aAAA;AAAA;;;;;;;AA0BR;;iBAAsB,sBAAA,CACpB,iBAAA,EAAmB,iBAAA,EACnB,QAAA,WACC,OAAA,CAAQ,aAAA;;;;;;;;;iBAsBW,oBAAA,CACpB,aAAA,UACA,iBAAA,EAAmB,iBAAA,GAClB,OAAA,CAAQ,aAAA;;;;AAHX;;;;;;iBA0BsB,mCAAA,CACpB,iBAAA,EAAmB,iBAAA,EACnB,WAAA,UACA,WAAA,WACC,OAAA;EAAU,IAAA,EAAM,aAAA;EAAe,WAAA,EAAa,iBAAA;AAAA;;;cCpHlC,uBAAA,SAAgC,KAAA;cAC/B,QAAA;AAAA;AAAA,cAOD,oBAAA,SAA6B,KAAA;EAAA,WAAA,CAAA;AAAA;AAAA,cAQ7B,8BAAA,SAAuC,KAAA;cACtC,QAAA;AAAA;AAAA,cAOD,4BAAA,SAAqC,KAAA;cACpC,QAAA;AAAA;AAAA,cAOD,iCAAA,SAA0C,KAAA;cACzC,QAAA;AAAA"}
|
package/dist/keystore-crypto.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
-
const require_emailEncryptionKey = require('./emailEncryptionKey-
|
|
2
|
+
const require_emailEncryptionKey = require('./emailEncryptionKey-Ba95VuFO.js');
|
|
3
3
|
|
|
4
|
-
exports.
|
|
4
|
+
exports.FailedToChangeMnemonicForKeyStore = require_emailEncryptionKey.FailedToChangeMnemonicForKeyStore;
|
|
5
5
|
exports.FailedToCreateKeyStores = require_emailEncryptionKey.FailedToCreateKeyStores;
|
|
6
6
|
exports.FailedToOpenEncryptionKeyStore = require_emailEncryptionKey.FailedToOpenEncryptionKeyStore;
|
|
7
7
|
exports.FailedToOpenRecoveryKeyStore = require_emailEncryptionKey.FailedToOpenRecoveryKeyStore;
|
|
8
|
-
exports.
|
|
8
|
+
exports.InvalidInputKeyStore = require_emailEncryptionKey.InvalidInputKeyStore;
|
|
9
|
+
exports.changeMnemonicForEncryptionKeystore = require_emailEncryptionKey.changeMnemonicForEncryptionKeystore;
|
|
9
10
|
exports.createEncryptionAndRecoveryKeystores = require_emailEncryptionKey.createEncryptionAndRecoveryKeystores;
|
|
10
11
|
exports.openEncryptionKeystore = require_emailEncryptionKey.openEncryptionKeystore;
|
|
11
12
|
exports.openRecoveryKeystore = require_emailEncryptionKey.openRecoveryKeystore;
|
package/dist/keystore-crypto.mjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { a as
|
|
1
|
+
import { a as FailedToChangeMnemonicForKeyStore, c as FailedToOpenRecoveryKeyStore, i as openRecoveryKeystore, l as InvalidInputKeyStore, n as createEncryptionAndRecoveryKeystores, o as FailedToCreateKeyStores, r as openEncryptionKeystore, s as FailedToOpenEncryptionKeyStore, t as changeMnemonicForEncryptionKeystore } from "./emailEncryptionKey-CYvr26FG.mjs";
|
|
2
2
|
|
|
3
|
-
export {
|
|
3
|
+
export { FailedToChangeMnemonicForKeyStore, FailedToCreateKeyStores, FailedToOpenEncryptionKeyStore, FailedToOpenRecoveryKeyStore, InvalidInputKeyStore, changeMnemonicForEncryptionKeystore, createEncryptionAndRecoveryKeystores, openEncryptionKeystore, openRecoveryKeystore };
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"emailEncryptionKey-Cw-vW_Oq.js","names":["UTF8ToUint8","uint8ArrayToBase64","encryptSymmetrically","base64ToUint8Array","decryptSymmetrically","deriveKeyFromMnemonic","CONTEXT_RECOVERY","deriveSymmetricKeyFromContext","CONTEXT_ENC_KEYSTORE","getKeyFromPasswordAndSalt","getKeyFromPassword","genHybridKeys","KeystoreType","genMnemonic"],"sources":["../src/keystore-crypto/core.ts","../src/keystore-crypto/errors.ts","../src/keystore-crypto/emailEncryptionKey.ts"],"sourcesContent":["import { encryptSymmetrically, decryptSymmetrically } from '../symmetric-crypto';\nimport { base64ToUint8Array, uint8ArrayToBase64, UTF8ToUint8 } from '../utils';\nimport { deriveKeyFromMnemonic, deriveSymmetricKeyFromContext } from '../derive-key';\nimport { CONTEXT_ENC_KEYSTORE, CONTEXT_RECOVERY } from '../constants';\nimport { EncryptedKeystore, HybridKeyPair, KeystoreType } from '../types';\nimport { getKeyFromPasswordAndSalt, getKeyFromPassword } from '../derive-password';\n\n/**\n * Encrypts the user's hybrid key using symmetric encryption to get a keystore\n *\n * @param secretKey - The symmetric key to encrypt the keystore content\n * @param key - The hybrid key pair\n * @param userEmail - The email of the user\n * @param type - The keystore type\n * @returns The encrypted keystore\n */\nexport async function encryptKeystoreContent(\n secretKey: Uint8Array,\n keys: HybridKeyPair,\n userEmail: string,\n type: KeystoreType,\n): Promise<EncryptedKeystore> {\n try {\n const aux = UTF8ToUint8(userEmail + type);\n const publicKey = uint8ArrayToBase64(keys.publicKey);\n const secretKeyEncrypted = await encryptSymmetrically(secretKey, keys.secretKey, aux);\n\n const keystore: EncryptedKeystore = {\n userEmail,\n type,\n publicKey,\n privateKeyEncrypted: uint8ArrayToBase64(secretKeyEncrypted),\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 kesytoreOpeningKey - The symmetric key to decrypt the keystore content\n * @param encryptedKeys - The encrypted keystore content\n * @returns The decrypted hybrid key pair contained in the keystore\n */\nexport async function decryptKeystoreContent(\n kesytoreOpeningKey: Uint8Array,\n encryptedKeystore: EncryptedKeystore,\n): Promise<HybridKeyPair> {\n try {\n const aux = UTF8ToUint8(encryptedKeystore.userEmail + encryptedKeystore.type);\n const publicKey = base64ToUint8Array(encryptedKeystore.publicKey);\n const ciphertext = base64ToUint8Array(encryptedKeystore.privateKeyEncrypted);\n const secretKey = await decryptSymmetrically(kesytoreOpeningKey, ciphertext, aux);\n return {\n publicKey,\n secretKey,\n };\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 (machine-generated with secure PRNG)\n * @returns The derived secret key for protecting the recovery keystore\n */\nexport async function deriveRecoveryKey(recoveryCodes: string): Promise<Uint8Array> {\n return deriveKeyFromMnemonic(recoveryCodes, CONTEXT_RECOVERY);\n}\n\n/**\n * Derives a secret key for protecting the encryption keystore from user's mnemonic\n *\n * @param mnemonic - The user's mnemonic (machine-generated with secure PRNG)\n * @returns The derived secret key for protecting the encryption keystore\n */\nexport async function deriveEncryptionKeystoreKeyFromMnemonic(mnemonic: string): Promise<Uint8Array> {\n return deriveKeyFromMnemonic(mnemonic, CONTEXT_ENC_KEYSTORE);\n}\n\n/**\n * Derives a secret key for protecting the encryption keystore\n *\n * @param password - The user's password\n * @param salt - The keystore salt\n * @returns The derived secret key for protecting the encryption keystore\n */\nexport async function deriveEncryptionKeystoreKey(password: string, salt: Uint8Array): Promise<Uint8Array> {\n const baseKey = await getKeyFromPasswordAndSalt(password, salt);\n return deriveSymmetricKeyFromContext(CONTEXT_ENC_KEYSTORE, baseKey);\n}\n\n/**\n * Derives a secret key for protecting the encryption keystore\n *\n * @param password - The user's password\n * @param salt - The keystore salt\n * @returns The derived secret key for protecting the encryption keystore\n */\nexport async function deriveNewEncryptionKeystoreKey(\n password: string,\n): Promise<{ secretKey: Uint8Array; salt: Uint8Array }> {\n const { key, salt } = await getKeyFromPassword(password);\n const secretKey = deriveSymmetricKeyFromContext(CONTEXT_ENC_KEYSTORE, key);\n return { secretKey, salt };\n}\n","export class FailedToCreateKeyStores extends Error {\n constructor(errorMsg?: string) {\n super('Failed to create encryption and recovery keystores: ' + errorMsg);\n\n Object.setPrototypeOf(this, FailedToCreateKeyStores.prototype);\n }\n}\n\nexport class FailedToOpenEncryptionKeyStore extends Error {\n constructor(errorMsg?: string) {\n super('Failed to open encryption keystore: ' + errorMsg);\n\n Object.setPrototypeOf(this, FailedToOpenEncryptionKeyStore.prototype);\n }\n}\n\nexport class FailedToOpenRecoveryKeyStore extends Error {\n constructor(errorMsg?: string) {\n super('Failed to open recovery keystore: ' + errorMsg);\n\n Object.setPrototypeOf(this, FailedToOpenRecoveryKeyStore.prototype);\n }\n}\n\nexport class FailedToChangePasswordForKeyStore extends Error {\n constructor(errorMsg?: string) {\n super('Error while fetching message: ' + errorMsg);\n\n Object.setPrototypeOf(this, FailedToChangePasswordForKeyStore.prototype);\n }\n}\n","import { EncryptedKeystore, KeystoreType, HybridKeyPair } from '../types';\nimport { genMnemonic } from '../utils';\nimport {\n encryptKeystoreContent,\n decryptKeystoreContent,\n deriveEncryptionKeystoreKey,\n deriveNewEncryptionKeystoreKey,\n deriveRecoveryKey,\n} from './core';\nimport { genHybridKeys } from '../hybrid-crypto';\nimport {\n FailedToOpenEncryptionKeyStore,\n FailedToCreateKeyStores,\n FailedToOpenRecoveryKeyStore,\n FailedToChangePasswordForKeyStore,\n} from './errors';\n\n/**\n * Generates hybrid keys and creates encrypted main and recovery keystores\n * The main keystore encryption key is derived from the user's password\n * The recovery keystore encryption key is derived from the recovery codes\n *\n * @param userEmail - The user's email\n * @param password - The user's password\n * @returns The encryption keys\n *\n * @returns The encryption and recovery keystores, recovery codes and hybrid keys\n */\nexport async function createEncryptionAndRecoveryKeystores(\n userEmail: string,\n password: string,\n): Promise<{\n encryptionKeystore: EncryptedKeystore;\n recoveryKeystore: EncryptedKeystore;\n recoveryCodes: string;\n keys: HybridKeyPair;\n salt: Uint8Array;\n}> {\n try {\n const keys = genHybridKeys();\n\n const { secretKey, salt } = await deriveNewEncryptionKeystoreKey(password);\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, salt };\n } catch (error) {\n throw new FailedToCreateKeyStores(error instanceof Error ? error.message : String(error));\n }\n}\n\n/**\n * Opens the encryption keystore and returns the email encryption keys\n * The decryption key is derived from the user password\n *\n * @param encryptedKeystore - The encrypted keystore containing encryption keys\n * @param password - The user's password\n * @param salt - The keystore's salt\n * @returns The encryption keys\n */\nexport async function openEncryptionKeystore(\n encryptedKeystore: EncryptedKeystore,\n password: string,\n salt: Uint8Array,\n): Promise<HybridKeyPair> {\n try {\n if (encryptedKeystore.type !== KeystoreType.ENCRYPTION) {\n throw new Error('Input is invalid');\n }\n const secretKey = await deriveEncryptionKeystoreKey(password, salt);\n const keys = await decryptKeystoreContent(secretKey, encryptedKeystore);\n return keys;\n } catch (error) {\n throw new FailedToOpenEncryptionKeyStore(error instanceof Error ? error.message : String(error));\n }\n}\n\n/**\n * Opens the recovery keystore and returns the email encryption keys\n * The decryption key is derived from the recovery codes (machine-generated mnemonic)\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<HybridKeyPair> {\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 FailedToOpenRecoveryKeyStore(error instanceof Error ? error.message : String(error));\n }\n}\n\n/**\n * Re-encrypts the encryption keystore with a new password\n * The decryption key is derived from the user password\n *\n * @param encryptedKeystore - The encrypted keystore containing encryption keys\n * @param oldPassword - The user's old password\n * @param newPassword - The user's new password\n * @param oldSalt - The keystore's old salt\n * @returns The keys, re-encrypted keystore, and new salt\n */\nexport async function changePasswordForEncryptionKeystore(\n encryptedKeystore: EncryptedKeystore,\n oldPassword: string,\n newPassword: string,\n oldSalt: Uint8Array,\n): Promise<{ keys: HybridKeyPair; newSalt: Uint8Array; newKeystore: EncryptedKeystore }> {\n try {\n if (encryptedKeystore.type !== KeystoreType.ENCRYPTION) {\n throw new Error('Input is invalid');\n }\n const keys = await openEncryptionKeystore(encryptedKeystore, oldPassword, oldSalt);\n\n const { secretKey, salt } = await deriveNewEncryptionKeystoreKey(newPassword);\n const newKeystore = await encryptKeystoreContent(\n secretKey,\n keys,\n encryptedKeystore.userEmail,\n KeystoreType.ENCRYPTION,\n );\n\n return { newKeystore, newSalt: salt, keys };\n } catch (error) {\n throw new FailedToChangePasswordForKeyStore(error instanceof Error ? error.message : String(error));\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"emailEncryptionKey-D9sk_WKj.mjs","names":[],"sources":["../src/keystore-crypto/core.ts","../src/keystore-crypto/errors.ts","../src/keystore-crypto/emailEncryptionKey.ts"],"sourcesContent":["import { encryptSymmetrically, decryptSymmetrically } from '../symmetric-crypto';\nimport { base64ToUint8Array, uint8ArrayToBase64, UTF8ToUint8 } from '../utils';\nimport { deriveKeyFromMnemonic, deriveSymmetricKeyFromContext } from '../derive-key';\nimport { CONTEXT_ENC_KEYSTORE, CONTEXT_RECOVERY } from '../constants';\nimport { EncryptedKeystore, HybridKeyPair, KeystoreType } from '../types';\nimport { getKeyFromPasswordAndSalt, getKeyFromPassword } from '../derive-password';\n\n/**\n * Encrypts the user's hybrid key using symmetric encryption to get a keystore\n *\n * @param secretKey - The symmetric key to encrypt the keystore content\n * @param key - The hybrid key pair\n * @param userEmail - The email of the user\n * @param type - The keystore type\n * @returns The encrypted keystore\n */\nexport async function encryptKeystoreContent(\n secretKey: Uint8Array,\n keys: HybridKeyPair,\n userEmail: string,\n type: KeystoreType,\n): Promise<EncryptedKeystore> {\n try {\n const aux = UTF8ToUint8(userEmail + type);\n const publicKey = uint8ArrayToBase64(keys.publicKey);\n const secretKeyEncrypted = await encryptSymmetrically(secretKey, keys.secretKey, aux);\n\n const keystore: EncryptedKeystore = {\n userEmail,\n type,\n publicKey,\n privateKeyEncrypted: uint8ArrayToBase64(secretKeyEncrypted),\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 kesytoreOpeningKey - The symmetric key to decrypt the keystore content\n * @param encryptedKeys - The encrypted keystore content\n * @returns The decrypted hybrid key pair contained in the keystore\n */\nexport async function decryptKeystoreContent(\n kesytoreOpeningKey: Uint8Array,\n encryptedKeystore: EncryptedKeystore,\n): Promise<HybridKeyPair> {\n try {\n const aux = UTF8ToUint8(encryptedKeystore.userEmail + encryptedKeystore.type);\n const publicKey = base64ToUint8Array(encryptedKeystore.publicKey);\n const ciphertext = base64ToUint8Array(encryptedKeystore.privateKeyEncrypted);\n const secretKey = await decryptSymmetrically(kesytoreOpeningKey, ciphertext, aux);\n return {\n publicKey,\n secretKey,\n };\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 (machine-generated with secure PRNG)\n * @returns The derived secret key for protecting the recovery keystore\n */\nexport async function deriveRecoveryKey(recoveryCodes: string): Promise<Uint8Array> {\n return deriveKeyFromMnemonic(recoveryCodes, CONTEXT_RECOVERY);\n}\n\n/**\n * Derives a secret key for protecting the encryption keystore from user's mnemonic\n *\n * @param mnemonic - The user's mnemonic (machine-generated with secure PRNG)\n * @returns The derived secret key for protecting the encryption keystore\n */\nexport async function deriveEncryptionKeystoreKeyFromMnemonic(mnemonic: string): Promise<Uint8Array> {\n return deriveKeyFromMnemonic(mnemonic, CONTEXT_ENC_KEYSTORE);\n}\n\n/**\n * Derives a secret key for protecting the encryption keystore\n *\n * @param password - The user's password\n * @param salt - The keystore salt\n * @returns The derived secret key for protecting the encryption keystore\n */\nexport async function deriveEncryptionKeystoreKey(password: string, salt: Uint8Array): Promise<Uint8Array> {\n const baseKey = await getKeyFromPasswordAndSalt(password, salt);\n return deriveSymmetricKeyFromContext(CONTEXT_ENC_KEYSTORE, baseKey);\n}\n\n/**\n * Derives a secret key for protecting the encryption keystore\n *\n * @param password - The user's password\n * @param salt - The keystore salt\n * @returns The derived secret key for protecting the encryption keystore\n */\nexport async function deriveNewEncryptionKeystoreKey(\n password: string,\n): Promise<{ secretKey: Uint8Array; salt: Uint8Array }> {\n const { key, salt } = await getKeyFromPassword(password);\n const secretKey = deriveSymmetricKeyFromContext(CONTEXT_ENC_KEYSTORE, key);\n return { secretKey, salt };\n}\n","export class FailedToCreateKeyStores extends Error {\n constructor(errorMsg?: string) {\n super('Failed to create encryption and recovery keystores: ' + errorMsg);\n\n Object.setPrototypeOf(this, FailedToCreateKeyStores.prototype);\n }\n}\n\nexport class FailedToOpenEncryptionKeyStore extends Error {\n constructor(errorMsg?: string) {\n super('Failed to open encryption keystore: ' + errorMsg);\n\n Object.setPrototypeOf(this, FailedToOpenEncryptionKeyStore.prototype);\n }\n}\n\nexport class FailedToOpenRecoveryKeyStore extends Error {\n constructor(errorMsg?: string) {\n super('Failed to open recovery keystore: ' + errorMsg);\n\n Object.setPrototypeOf(this, FailedToOpenRecoveryKeyStore.prototype);\n }\n}\n\nexport class FailedToChangePasswordForKeyStore extends Error {\n constructor(errorMsg?: string) {\n super('Error while fetching message: ' + errorMsg);\n\n Object.setPrototypeOf(this, FailedToChangePasswordForKeyStore.prototype);\n }\n}\n","import { EncryptedKeystore, KeystoreType, HybridKeyPair } from '../types';\nimport { genMnemonic } from '../utils';\nimport {\n encryptKeystoreContent,\n decryptKeystoreContent,\n deriveEncryptionKeystoreKey,\n deriveNewEncryptionKeystoreKey,\n deriveRecoveryKey,\n} from './core';\nimport { genHybridKeys } from '../hybrid-crypto';\nimport {\n FailedToOpenEncryptionKeyStore,\n FailedToCreateKeyStores,\n FailedToOpenRecoveryKeyStore,\n FailedToChangePasswordForKeyStore,\n} from './errors';\n\n/**\n * Generates hybrid keys and creates encrypted main and recovery keystores\n * The main keystore encryption key is derived from the user's password\n * The recovery keystore encryption key is derived from the recovery codes\n *\n * @param userEmail - The user's email\n * @param password - The user's password\n * @returns The encryption keys\n *\n * @returns The encryption and recovery keystores, recovery codes and hybrid keys\n */\nexport async function createEncryptionAndRecoveryKeystores(\n userEmail: string,\n password: string,\n): Promise<{\n encryptionKeystore: EncryptedKeystore;\n recoveryKeystore: EncryptedKeystore;\n recoveryCodes: string;\n keys: HybridKeyPair;\n salt: Uint8Array;\n}> {\n try {\n const keys = genHybridKeys();\n\n const { secretKey, salt } = await deriveNewEncryptionKeystoreKey(password);\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, salt };\n } catch (error) {\n throw new FailedToCreateKeyStores(error instanceof Error ? error.message : String(error));\n }\n}\n\n/**\n * Opens the encryption keystore and returns the email encryption keys\n * The decryption key is derived from the user password\n *\n * @param encryptedKeystore - The encrypted keystore containing encryption keys\n * @param password - The user's password\n * @param salt - The keystore's salt\n * @returns The encryption keys\n */\nexport async function openEncryptionKeystore(\n encryptedKeystore: EncryptedKeystore,\n password: string,\n salt: Uint8Array,\n): Promise<HybridKeyPair> {\n try {\n if (encryptedKeystore.type !== KeystoreType.ENCRYPTION) {\n throw new Error('Input is invalid');\n }\n const secretKey = await deriveEncryptionKeystoreKey(password, salt);\n const keys = await decryptKeystoreContent(secretKey, encryptedKeystore);\n return keys;\n } catch (error) {\n throw new FailedToOpenEncryptionKeyStore(error instanceof Error ? error.message : String(error));\n }\n}\n\n/**\n * Opens the recovery keystore and returns the email encryption keys\n * The decryption key is derived from the recovery codes (machine-generated mnemonic)\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<HybridKeyPair> {\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 FailedToOpenRecoveryKeyStore(error instanceof Error ? error.message : String(error));\n }\n}\n\n/**\n * Re-encrypts the encryption keystore with a new password\n * The decryption key is derived from the user password\n *\n * @param encryptedKeystore - The encrypted keystore containing encryption keys\n * @param oldPassword - The user's old password\n * @param newPassword - The user's new password\n * @param oldSalt - The keystore's old salt\n * @returns The keys, re-encrypted keystore, and new salt\n */\nexport async function changePasswordForEncryptionKeystore(\n encryptedKeystore: EncryptedKeystore,\n oldPassword: string,\n newPassword: string,\n oldSalt: Uint8Array,\n): Promise<{ keys: HybridKeyPair; newSalt: Uint8Array; newKeystore: EncryptedKeystore }> {\n try {\n if (encryptedKeystore.type !== KeystoreType.ENCRYPTION) {\n throw new Error('Input is invalid');\n }\n const keys = await openEncryptionKeystore(encryptedKeystore, oldPassword, oldSalt);\n\n const { secretKey, salt } = await deriveNewEncryptionKeystoreKey(newPassword);\n const newKeystore = await encryptKeystoreContent(\n secretKey,\n keys,\n encryptedKeystore.userEmail,\n KeystoreType.ENCRYPTION,\n );\n\n return { newKeystore, newSalt: salt, keys };\n } catch (error) {\n throw new FailedToChangePasswordForKeyStore(error instanceof Error ? error.message : String(error));\n }\n}\n"],"mappings":"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"}
|