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 CHANGED
@@ -131,12 +131,12 @@ expect(decryptedEmail).toStrictEqual(email);
131
131
 
132
132
  // keystore
133
133
  const userEmail = 'user email';
134
- const password = 'user password';
135
- const { encryptionKeystore, recoveryKeystore, recoveryCodes, salt } = await createEncryptionAndRecoveryKeystores(
134
+ const mnemonic = 'user mnemonic';
135
+ const { encryptionKeystore, recoveryKeystore, recoveryCodes } = await createEncryptionAndRecoveryKeystores(
136
136
  userEmail,
137
- password
137
+ mnemonic
138
138
  );
139
- const resultEnc = await openEncryptionKeystore(encryptionKeystore, password, salt);
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 aux = require_genID.UTF8ToUint8(userEmail + type);
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: require_genID.uint8ArrayToBase64(keys.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 password - The user's password
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 deriveEncryptionKeystoreKey(password, salt) {
67
- return require_deriveKeysFromMnemonic.deriveSymmetricKeyFromContext(require_constants.CONTEXT_ENC_KEYSTORE, await require_deriveKeysFromPassword.getKeyFromPasswordAndSalt(password, salt));
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 FailedToChangePasswordForKeyStore = class FailedToChangePasswordForKeyStore extends Error {
95
+ var FailedToChangeMnemonicForKeyStore = class FailedToChangeMnemonicForKeyStore extends Error {
105
96
  constructor(errorMsg) {
106
97
  super("Error while fetching message: " + errorMsg);
107
- Object.setPrototypeOf(this, FailedToChangePasswordForKeyStore.prototype);
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 password
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 password - The user's password
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, password) {
115
+ async function createEncryptionAndRecoveryKeystores(userEmail, mnemonic) {
125
116
  try {
126
117
  const keys = require_xwing.genHybridKeys();
127
- const { secretKey, salt } = await deriveNewEncryptionKeystoreKey(password);
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 password
132
+ * The decryption key is derived from the user mnemonic
144
133
  *
145
134
  * @param encryptedKeystore - The encrypted keystore containing encryption keys
146
- * @param password - The user's password
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, password, salt) {
138
+ async function openEncryptionKeystore(encryptedKeystore, mnemonic) {
151
139
  try {
152
- if (encryptedKeystore.type !== require_types.KeystoreType.ENCRYPTION) throw new Error("Input is invalid");
153
- return await decryptKeystoreContent(await deriveEncryptionKeystoreKey(password, salt), encryptedKeystore);
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 Error("Input is invalid");
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 password
176
- * The decryption key is derived from the user password
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 oldPassword - The user's old password
180
- * @param newPassword - The user's new password
181
- * @param oldSalt - The keystore's old salt
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 changePasswordForEncryptionKeystore(encryptedKeystore, oldPassword, newPassword, oldSalt) {
173
+ async function changeMnemonicForEncryptionKeystore(encryptedKeystore, oldMnemonic, newMnemonic) {
185
174
  try {
186
- if (encryptedKeystore.type !== require_types.KeystoreType.ENCRYPTION) throw new Error("Input is invalid");
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(secretKey, keys, encryptedKeystore.userEmail, require_types.KeystoreType.ENCRYPTION),
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
- throw new FailedToChangePasswordForKeyStore(error instanceof Error ? error.message : String(error));
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, 'FailedToChangePasswordForKeyStore', {
187
+ Object.defineProperty(exports, 'FailedToChangeMnemonicForKeyStore', {
201
188
  enumerable: true,
202
189
  get: function () {
203
- return FailedToChangePasswordForKeyStore;
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, 'changePasswordForEncryptionKeystore', {
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 changePasswordForEncryptionKeystore;
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-Cw-vW_Oq.js.map
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":";;;;;;;;;;;;;;;;;AAeA,eAAsB,uBACpB,WACA,MACA,WACA,MAC4B;AAC5B,KAAI;EACF,MAAM,YAAYA,iCAAmB,KAAK,UAAU;EAEpD,MAAM,MAAMC,0BAAY,YAAY,OAAO,UAAU;AASrD,SANoC;GAClC;GACA;GACA;GACA,qBAAqBD,iCANI,MAAME,iCAAqB,WAAW,KAAK,WAAW,IAAI,CAMxB;GAC5D;UAEM,OAAO;AACd,QAAM,IAAI,MAAM,sCAAsC,EAAE,OAAO,OAAO,CAAC;;;;;;;;;;AAW3E,eAAsB,uBACpB,oBACA,mBACwB;AACxB,KAAI;EACF,MAAM,MAAMD,0BAAY,kBAAkB,YAAY,kBAAkB,OAAO,kBAAkB,UAAU;AAI3G,SAAO;GACL,WAJgBE,iCAAmB,kBAAkB,UAAU;GAK/D,WAHgB,MAAMC,iCAAqB,oBAD1BD,iCAAmB,kBAAkB,oBAAoB,EACC,IAAI;GAIhF;UACM,OAAO;AACd,QAAM,IAAI,MAAM,sCAAsC,EAAE,OAAO,OAAO,CAAC;;;;;;;;;AAU3E,eAAsB,kBAAkB,eAA4C;AAClF,QAAOE,qDAAsB,eAAeC,mCAAiB;;;;;;;;AAS/D,eAAsB,wCAAwC,UAAuC;AACnG,QAAOD,qDAAsB,UAAUE,uCAAqB;;;;;ACjF9D,IAAa,0BAAb,MAAa,gCAAgC,MAAM;CACjD,YAAY,UAAmB;AAC7B,QAAM,yDAAyD,SAAS;AAExE,SAAO,eAAe,MAAM,wBAAwB,UAAU;;;AAIlE,IAAa,uBAAb,MAAa,6BAA6B,MAAM;CAC9C,cAAc;AACZ,QAAM,gBAAgB;AAEtB,SAAO,eAAe,MAAM,qBAAqB,UAAU;;;AAI/D,IAAa,iCAAb,MAAa,uCAAuC,MAAM;CACxD,YAAY,UAAmB;AAC7B,QAAM,yCAAyC,SAAS;AAExD,SAAO,eAAe,MAAM,+BAA+B,UAAU;;;AAIzE,IAAa,+BAAb,MAAa,qCAAqC,MAAM;CACtD,YAAY,UAAmB;AAC7B,QAAM,uCAAuC,SAAS;AAEtD,SAAO,eAAe,MAAM,6BAA6B,UAAU;;;AAIvE,IAAa,oCAAb,MAAa,0CAA0C,MAAM;CAC3D,YAAY,UAAmB;AAC7B,QAAM,mCAAmC,SAAS;AAElD,SAAO,eAAe,MAAM,kCAAkC,UAAU;;;;;;;;;;;;;;;;;ACR5E,eAAsB,qCACpB,WACA,UAMC;AACD,KAAI;EACF,MAAM,OAAOC,6BAAe;EAG5B,MAAM,qBAAqB,MAAM,uBADf,MAAM,wCAAwC,SAAS,EACN,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,wBAAwB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,CAAC;;;;;;;;;;;AAY7F,eAAsB,uBACpB,mBACA,UACwB;AACxB,KAAI;AACF,MAAI,kBAAkB,SAASA,2BAAa,WAC1C,OAAM,IAAI,sBAAsB;AAIlC,SADa,MAAM,uBADD,MAAM,wCAAwC,SAAS,EACpB,kBAAkB;UAEhE,OAAO;AACd,MAAI,iBAAiB,qBAAsB,OAAM;AACjD,QAAM,IAAI,+BAA+B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,CAAC;;;;;;;;;;;AAYpG,eAAsB,qBACpB,eACA,mBACwB;AACxB,KAAI;AACF,MAAI,kBAAkB,SAASA,2BAAa,SAC1C,OAAM,IAAI,sBAAsB;AAIlC,SADa,MAAM,uBADC,MAAM,kBAAkB,cAAc,EACH,kBAAkB;UAElE,OAAO;AACd,MAAI,iBAAiB,qBAAsB,OAAM;AACjD,QAAM,IAAI,6BAA6B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,CAAC;;;;;;;;;;;;AAalG,eAAsB,oCACpB,mBACA,aACA,aACkE;AAClE,KAAI;EACF,MAAM,OAAO,MAAM,uBAAuB,mBAAmB,YAAY;AAUzE,SAAO;GAAE,aAPW,MAAM,uBADR,MAAM,wCAAwC,YAAY,EAG1E,MACA,kBAAkB,WAClBA,2BAAa,WACd;GAEqB;GAAM;UACrB,OAAO;AACd,MAAI,iBAAiB,qBAAsB,OAAM;AACjD,QAAM,IAAI,kCAAkC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,CAAC"}
@@ -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 { n as deriveSymmetricKeyFromContext, t as deriveKeyFromMnemonic } from "./deriveKeysFromMnemonic-DB0UHE-y.mjs";
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 aux = UTF8ToUint8(userEmail + type);
20
+ const publicKey = uint8ArrayToBase64(keys.publicKey);
21
+ const aux = UTF8ToUint8(userEmail + type + publicKey);
22
22
  return {
23
23
  userEmail,
24
24
  type,
25
- publicKey: uint8ArrayToBase64(keys.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 password - The user's password
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 deriveEncryptionKeystoreKey(password, salt) {
67
- return deriveSymmetricKeyFromContext(CONTEXT_ENC_KEYSTORE, await getKeyFromPasswordAndSalt(password, salt));
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 FailedToChangePasswordForKeyStore = class FailedToChangePasswordForKeyStore extends Error {
95
+ var FailedToChangeMnemonicForKeyStore = class FailedToChangeMnemonicForKeyStore extends Error {
105
96
  constructor(errorMsg) {
106
97
  super("Error while fetching message: " + errorMsg);
107
- Object.setPrototypeOf(this, FailedToChangePasswordForKeyStore.prototype);
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 password
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 password - The user's password
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, password) {
115
+ async function createEncryptionAndRecoveryKeystores(userEmail, mnemonic) {
125
116
  try {
126
117
  const keys = genHybridKeys();
127
- const { secretKey, salt } = await deriveNewEncryptionKeystoreKey(password);
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 password
132
+ * The decryption key is derived from the user mnemonic
144
133
  *
145
134
  * @param encryptedKeystore - The encrypted keystore containing encryption keys
146
- * @param password - The user's password
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, password, salt) {
138
+ async function openEncryptionKeystore(encryptedKeystore, mnemonic) {
151
139
  try {
152
- if (encryptedKeystore.type !== KeystoreType.ENCRYPTION) throw new Error("Input is invalid");
153
- return await decryptKeystoreContent(await deriveEncryptionKeystoreKey(password, salt), encryptedKeystore);
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 Error("Input is invalid");
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 password
176
- * The decryption key is derived from the user password
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 oldPassword - The user's old password
180
- * @param newPassword - The user's new password
181
- * @param oldSalt - The keystore's old salt
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 changePasswordForEncryptionKeystore(encryptedKeystore, oldPassword, newPassword, oldSalt) {
173
+ async function changeMnemonicForEncryptionKeystore(encryptedKeystore, oldMnemonic, newMnemonic) {
185
174
  try {
186
- if (encryptedKeystore.type !== KeystoreType.ENCRYPTION) throw new Error("Input is invalid");
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(secretKey, keys, encryptedKeystore.userEmail, KeystoreType.ENCRYPTION),
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
- throw new FailedToChangePasswordForKeyStore(error instanceof Error ? error.message : String(error));
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 { FailedToChangePasswordForKeyStore as a, FailedToOpenRecoveryKeyStore as c, openRecoveryKeystore as i, createEncryptionAndRecoveryKeystores as n, FailedToCreateKeyStores as o, openEncryptionKeystore as r, FailedToOpenEncryptionKeyStore as s, changePasswordForEncryptionKeystore as t };
201
- //# sourceMappingURL=emailEncryptionKey-D9sk_WKj.mjs.map
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 { FailedToChangePasswordForKeyStore, FailedToCreateKeyStores, FailedToOpenEncryptionKeyStore, FailedToOpenRecoveryKeyStore, changePasswordForEncryptionKeystore, createEncryptionAndRecoveryKeystores, openEncryptionKeystore, openRecoveryKeystore } from "./keystore-crypto.mjs";
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, FailedToChangePasswordForKeyStore, FailedToCreateKeyStores, FailedToOpenEncryptionKeyStore, FailedToOpenRecoveryKeyStore, HybridEncKey, HybridEncryptedEmail, HybridKeyPair, IV_LEN_BYTES, 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, changePasswordForEncryptionKeystore, 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 };
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 { FailedToChangePasswordForKeyStore, FailedToCreateKeyStores, FailedToOpenEncryptionKeyStore, FailedToOpenRecoveryKeyStore, changePasswordForEncryptionKeystore, createEncryptionAndRecoveryKeystores, openEncryptionKeystore, openRecoveryKeystore } from "./keystore-crypto.js";
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, FailedToChangePasswordForKeyStore, FailedToCreateKeyStores, FailedToOpenEncryptionKeyStore, FailedToOpenRecoveryKeyStore, HybridEncKey, HybridEncryptedEmail, HybridKeyPair, IV_LEN_BYTES, 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, changePasswordForEncryptionKeystore, 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 };
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-Cw-vW_Oq.js');
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.FailedToChangePasswordForKeyStore = require_emailEncryptionKey.FailedToChangePasswordForKeyStore;
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.changePasswordForEncryptionKeystore = require_emailEncryptionKey.changePasswordForEncryptionKeystore;
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 FailedToChangePasswordForKeyStore, c as FailedToOpenRecoveryKeyStore, i as openRecoveryKeystore, n as createEncryptionAndRecoveryKeystores, o as FailedToCreateKeyStores, r as openEncryptionKeystore, s as FailedToOpenEncryptionKeyStore, t as changePasswordForEncryptionKeystore } from "./emailEncryptionKey-D9sk_WKj.mjs";
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, FailedToChangePasswordForKeyStore, FailedToCreateKeyStores, FailedToOpenEncryptionKeyStore, FailedToOpenRecoveryKeyStore, IV_LEN_BYTES, 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, changePasswordForEncryptionKeystore, 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 };
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 password
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 password - The user's password
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, password: string): Promise<{
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 password
23
+ * The decryption key is derived from the user mnemonic
25
24
  *
26
25
  * @param encryptedKeystore - The encrypted keystore containing encryption keys
27
- * @param password - The user's password
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, password: string, salt: Uint8Array): Promise<HybridKeyPair>;
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 password
43
- * The decryption key is derived from the user password
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 oldPassword - The user's old password
47
- * @param newPassword - The user's new password
48
- * @param oldSalt - The keystore's old salt
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 changePasswordForEncryptionKeystore(encryptedKeystore: EncryptedKeystore, oldPassword: string, newPassword: string, oldSalt: Uint8Array): Promise<{
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 FailedToChangePasswordForKeyStore extends Error {
66
+ declare class FailedToChangeMnemonicForKeyStore extends Error {
68
67
  constructor(errorMsg?: string);
69
68
  }
70
69
  //#endregion
71
- export { FailedToChangePasswordForKeyStore, FailedToCreateKeyStores, FailedToOpenEncryptionKeyStore, FailedToOpenRecoveryKeyStore, changePasswordForEncryptionKeystore, createEncryptionAndRecoveryKeystores, openEncryptionKeystore, openRecoveryKeystore };
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;EACN,IAAA,EAAM,UAAA;AAAA;;;;;;;;;AA2BR;iBAAsB,sBAAA,CACpB,iBAAA,EAAmB,iBAAA,EACnB,QAAA,UACA,IAAA,EAAM,UAAA,GACL,OAAA,CAAQ,aAAA;;;;;;;;;iBAqBW,oBAAA,CACpB,aAAA,UACA,iBAAA,EAAmB,iBAAA,GAClB,OAAA,CAAQ,aAAA;;;;;;;;AAHX;;;iBA0BsB,mCAAA,CACpB,iBAAA,EAAmB,iBAAA,EACnB,WAAA,UACA,WAAA,UACA,OAAA,EAAS,UAAA,GACR,OAAA;EAAU,IAAA,EAAM,aAAA;EAAe,OAAA,EAAS,UAAA;EAAY,WAAA,EAAa,iBAAA;AAAA;;;cCvHvD,uBAAA,SAAgC,KAAA;cAC/B,QAAA;AAAA;AAAA,cAOD,8BAAA,SAAuC,KAAA;cACtC,QAAA;AAAA;AAAA,cAOD,4BAAA,SAAqC,KAAA;cACpC,QAAA;AAAA;AAAA,cAOD,iCAAA,SAA0C,KAAA;cACzC,QAAA;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 password
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 password - The user's password
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, password: string): Promise<{
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 password
23
+ * The decryption key is derived from the user mnemonic
25
24
  *
26
25
  * @param encryptedKeystore - The encrypted keystore containing encryption keys
27
- * @param password - The user's password
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, password: string, salt: Uint8Array): Promise<HybridKeyPair>;
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 password
43
- * The decryption key is derived from the user password
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 oldPassword - The user's old password
47
- * @param newPassword - The user's new password
48
- * @param oldSalt - The keystore's old salt
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 changePasswordForEncryptionKeystore(encryptedKeystore: EncryptedKeystore, oldPassword: string, newPassword: string, oldSalt: Uint8Array): Promise<{
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 FailedToChangePasswordForKeyStore extends Error {
66
+ declare class FailedToChangeMnemonicForKeyStore extends Error {
68
67
  constructor(errorMsg?: string);
69
68
  }
70
69
  //#endregion
71
- export { FailedToChangePasswordForKeyStore, FailedToCreateKeyStores, FailedToOpenEncryptionKeyStore, FailedToOpenRecoveryKeyStore, changePasswordForEncryptionKeystore, createEncryptionAndRecoveryKeystores, openEncryptionKeystore, openRecoveryKeystore };
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;EACN,IAAA,EAAM,UAAA;AAAA;;;;;;;;;AA2BR;iBAAsB,sBAAA,CACpB,iBAAA,EAAmB,iBAAA,EACnB,QAAA,UACA,IAAA,EAAM,UAAA,GACL,OAAA,CAAQ,aAAA;;;;;;;;;iBAqBW,oBAAA,CACpB,aAAA,UACA,iBAAA,EAAmB,iBAAA,GAClB,OAAA,CAAQ,aAAA;;;;;;;;AAHX;;;iBA0BsB,mCAAA,CACpB,iBAAA,EAAmB,iBAAA,EACnB,WAAA,UACA,WAAA,UACA,OAAA,EAAS,UAAA,GACR,OAAA;EAAU,IAAA,EAAM,aAAA;EAAe,OAAA,EAAS,UAAA;EAAY,WAAA,EAAa,iBAAA;AAAA;;;cCvHvD,uBAAA,SAAgC,KAAA;cAC/B,QAAA;AAAA;AAAA,cAOD,8BAAA,SAAuC,KAAA;cACtC,QAAA;AAAA;AAAA,cAOD,4BAAA,SAAqC,KAAA;cACpC,QAAA;AAAA;AAAA,cAOD,iCAAA,SAA0C,KAAA;cACzC,QAAA;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"}
@@ -1,11 +1,12 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_emailEncryptionKey = require('./emailEncryptionKey-Cw-vW_Oq.js');
2
+ const require_emailEncryptionKey = require('./emailEncryptionKey-Ba95VuFO.js');
3
3
 
4
- exports.FailedToChangePasswordForKeyStore = require_emailEncryptionKey.FailedToChangePasswordForKeyStore;
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.changePasswordForEncryptionKeystore = require_emailEncryptionKey.changePasswordForEncryptionKeystore;
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;
@@ -1,3 +1,3 @@
1
- import { a as FailedToChangePasswordForKeyStore, c as FailedToOpenRecoveryKeyStore, i as openRecoveryKeystore, n as createEncryptionAndRecoveryKeystores, o as FailedToCreateKeyStores, r as openEncryptionKeystore, s as FailedToOpenEncryptionKeyStore, t as changePasswordForEncryptionKeystore } from "./emailEncryptionKey-D9sk_WKj.mjs";
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 { FailedToChangePasswordForKeyStore, FailedToCreateKeyStores, FailedToOpenEncryptionKeyStore, FailedToOpenRecoveryKeyStore, changePasswordForEncryptionKeystore, createEncryptionAndRecoveryKeystores, openEncryptionKeystore, openRecoveryKeystore };
3
+ export { FailedToChangeMnemonicForKeyStore, FailedToCreateKeyStores, FailedToOpenEncryptionKeyStore, FailedToOpenRecoveryKeyStore, InvalidInputKeyStore, changeMnemonicForEncryptionKeystore, createEncryptionAndRecoveryKeystores, openEncryptionKeystore, openRecoveryKeystore };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "internxt-crypto",
3
- "version": "1.2.0",
3
+ "version": "1.3.0",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "module": "dist/index.js",
@@ -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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"}