@metamask-previews/seedless-onboarding-controller 2.5.0-preview-848c8e7d → 2.5.0-preview-0910ff0

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.
@@ -10,7 +10,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
10
10
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
11
11
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
12
  };
13
- var _SeedlessOnboardingController_instances, _SeedlessOnboardingController_vaultEncryptor, _SeedlessOnboardingController_controllerOperationMutex, _SeedlessOnboardingController_vaultOperationMutex, _SeedlessOnboardingController_refreshJWTToken, _SeedlessOnboardingController_revokeRefreshToken, _SeedlessOnboardingController_isUnlocked, _SeedlessOnboardingController_passwordOutdatedCacheTTL, _SeedlessOnboardingController_submitGlobalPassword, _SeedlessOnboardingController_getAccessToken, _SeedlessOnboardingController_setUnlocked, _SeedlessOnboardingController_persistOprfKey, _SeedlessOnboardingController_persistAuthPubKey, _SeedlessOnboardingController_storeKeyringEncryptionKey, _SeedlessOnboardingController_loadKeyringEncryptionKey, _SeedlessOnboardingController_loadSeedlessEncryptionKey, _SeedlessOnboardingController_recoverAuthPubKey, _SeedlessOnboardingController_recoverEncKey, _SeedlessOnboardingController_fetchAllSecretDataFromMetadataStore, _SeedlessOnboardingController_changeEncryptionKey, _SeedlessOnboardingController_encryptAndStoreSecretData, _SeedlessOnboardingController_unlockVaultAndGetVaultData, _SeedlessOnboardingController_withPersistedSecretMetadataBackupsState, _SeedlessOnboardingController_filterDupesAndUpdateSocialBackupsMetadata, _SeedlessOnboardingController_updateVault, _SeedlessOnboardingController_withControllerLock, _SeedlessOnboardingController_withVaultLock, _SeedlessOnboardingController_parseVaultData, _SeedlessOnboardingController_assertIsUnlocked, _SeedlessOnboardingController_assertIsAuthenticatedUser, _SeedlessOnboardingController_assertIsSRPBackedUpUser, _SeedlessOnboardingController_assertPasswordInSync, _SeedlessOnboardingController_resetPasswordOutdatedCache, _SeedlessOnboardingController_isTokenExpiredError, _SeedlessOnboardingController_isMaxKeyChainLengthError, _SeedlessOnboardingController_executeWithTokenRefresh;
13
+ var _SeedlessOnboardingController_instances, _SeedlessOnboardingController_vaultEncryptor, _SeedlessOnboardingController_controllerOperationMutex, _SeedlessOnboardingController_vaultOperationMutex, _SeedlessOnboardingController_refreshJWTToken, _SeedlessOnboardingController_revokeRefreshToken, _SeedlessOnboardingController_isUnlocked, _SeedlessOnboardingController_passwordOutdatedCacheTTL, _SeedlessOnboardingController_submitGlobalPassword, _SeedlessOnboardingController_getAccessToken, _SeedlessOnboardingController_setUnlocked, _SeedlessOnboardingController_persistOprfKey, _SeedlessOnboardingController_persistAuthPubKey, _SeedlessOnboardingController_storeKeyringEncryptionKey, _SeedlessOnboardingController_loadKeyringEncryptionKey, _SeedlessOnboardingController_loadSeedlessEncryptionKey, _SeedlessOnboardingController_recoverAuthPubKey, _SeedlessOnboardingController_recoverEncKey, _SeedlessOnboardingController_fetchAllSecretDataFromMetadataStore, _SeedlessOnboardingController_changeEncryptionKey, _SeedlessOnboardingController_encryptAndStoreSecretData, _SeedlessOnboardingController_unlockVaultAndGetVaultData, _SeedlessOnboardingController_withPersistedSecretMetadataBackupsState, _SeedlessOnboardingController_filterDupesAndUpdateSocialBackupsMetadata, _SeedlessOnboardingController_createNewVaultWithAuthData, _SeedlessOnboardingController_updateVault, _SeedlessOnboardingController_withControllerLock, _SeedlessOnboardingController_withVaultLock, _SeedlessOnboardingController_serializeKeyData, _SeedlessOnboardingController_parseVaultData, _SeedlessOnboardingController_assertIsUnlocked, _SeedlessOnboardingController_assertIsAuthenticatedUser, _SeedlessOnboardingController_assertIsSRPBackedUpUser, _SeedlessOnboardingController_assertPasswordInSync, _SeedlessOnboardingController_resetPasswordOutdatedCache, _SeedlessOnboardingController_isTokenExpiredError, _SeedlessOnboardingController_isMaxKeyChainLengthError, _SeedlessOnboardingController_executeWithTokenRefresh;
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.SeedlessOnboardingController = exports.getDefaultSeedlessOnboardingControllerState = void 0;
16
16
  const auth_network_utils_1 = require("@metamask/auth-network-utils");
@@ -84,6 +84,10 @@ const seedlessOnboardingMetadata = {
84
84
  persist: false,
85
85
  anonymous: true,
86
86
  },
87
+ vaultEncryptionSalt: {
88
+ persist: false,
89
+ anonymous: true,
90
+ },
87
91
  authPubKey: {
88
92
  persist: true,
89
93
  anonymous: true,
@@ -119,18 +123,6 @@ const seedlessOnboardingMetadata = {
119
123
  persist: true,
120
124
  anonymous: true,
121
125
  },
122
- toprfEncryptionKey: {
123
- persist: false,
124
- anonymous: true,
125
- },
126
- toprfPwEncryptionKey: {
127
- persist: false,
128
- anonymous: true,
129
- },
130
- toprfAuthKeyPair: {
131
- persist: false,
132
- anonymous: true,
133
- },
134
126
  };
135
127
  class SeedlessOnboardingController extends base_controller_1.BaseController {
136
128
  /**
@@ -304,7 +296,7 @@ class SeedlessOnboardingController extends base_controller_1.BaseController {
304
296
  // to have an account but with no associated data.
305
297
  await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_persistOprfKey).call(this, oprfKey, authKeyPair.pk);
306
298
  // create a new vault with the resulting authentication data
307
- await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_updateVault).call(this, {
299
+ await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_createNewVaultWithAuthData).call(this, {
308
300
  password,
309
301
  rawToprfEncryptionKey: encKey,
310
302
  rawToprfPwEncryptionKey: pwEncKey,
@@ -325,22 +317,20 @@ class SeedlessOnboardingController extends base_controller_1.BaseController {
325
317
  */
326
318
  async addNewSecretData(data, type, options) {
327
319
  return await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_withControllerLock).call(this, async () => {
328
- // assert that the controller is unlocked before adding new secret data
329
- __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_assertIsUnlocked).call(this, this.state);
330
- // get the TOPRF encryption key and authentication key pair from the state
331
- const { toprfEncryptionKey, toprfAuthKeyPair } = this.state;
332
- // assert that the password is in sync with the encryption key
320
+ __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_assertIsUnlocked).call(this);
333
321
  await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_assertPasswordInSync).call(this, {
334
322
  skipCache: true,
335
323
  skipLock: true, // skip lock since we already have the lock
336
324
  });
337
325
  const performBackup = async () => {
326
+ // verify the password and unlock the vault
327
+ const { toprfEncryptionKey, toprfAuthKeyPair } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetVaultData).call(this);
338
328
  // encrypt and store the secret data
339
329
  await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_encryptAndStoreSecretData).call(this, {
340
330
  data,
341
331
  type,
342
- encKey: (0, utils_1.base64ToBytes)(toprfEncryptionKey),
343
- authKeyPair: (0, utils_3.deserializAuthKeyPair)(toprfAuthKeyPair),
332
+ encKey: toprfEncryptionKey,
333
+ authKeyPair: toprfAuthKeyPair,
344
334
  options,
345
335
  });
346
336
  };
@@ -369,17 +359,18 @@ class SeedlessOnboardingController extends base_controller_1.BaseController {
369
359
  authKeyPair = recoverEncKeyResult.authKeyPair;
370
360
  }
371
361
  else {
372
- __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_assertIsUnlocked).call(this, this.state);
373
- const { toprfEncryptionKey, toprfPwEncryptionKey, toprfAuthKeyPair } = this.state;
374
- encKey = (0, utils_1.base64ToBytes)(toprfEncryptionKey);
375
- pwEncKey = (0, utils_1.base64ToBytes)(toprfPwEncryptionKey);
376
- authKeyPair = (0, utils_3.deserializAuthKeyPair)(toprfAuthKeyPair);
362
+ __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_assertIsUnlocked).call(this);
363
+ // verify the password and unlock the vault
364
+ const keysFromVault = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetVaultData).call(this);
365
+ encKey = keysFromVault.toprfEncryptionKey;
366
+ pwEncKey = keysFromVault.toprfPwEncryptionKey;
367
+ authKeyPair = keysFromVault.toprfAuthKeyPair;
377
368
  }
378
369
  const performFetch = async () => {
379
370
  const secrets = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_fetchAllSecretDataFromMetadataStore).call(this, encKey, authKeyPair);
380
371
  if (password) {
381
372
  // if password is provided, we need to create a new vault with the auth data. (supposedly the user is trying to rehydrate the wallet)
382
- await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_updateVault).call(this, {
373
+ await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_createNewVaultWithAuthData).call(this, {
383
374
  password,
384
375
  rawToprfEncryptionKey: encKey,
385
376
  rawToprfPwEncryptionKey: pwEncKey,
@@ -402,8 +393,7 @@ class SeedlessOnboardingController extends base_controller_1.BaseController {
402
393
  */
403
394
  async changePassword(newPassword, oldPassword) {
404
395
  return await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_withControllerLock).call(this, async () => {
405
- // assert that the controller is unlocked before changing the password
406
- __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_assertIsUnlocked).call(this, this.state);
396
+ __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_assertIsUnlocked).call(this);
407
397
  // verify the old password of the encrypted vault
408
398
  await this.verifyVaultPassword(oldPassword, {
409
399
  skipLock: true, // skip lock since we already have the lock
@@ -425,7 +415,7 @@ class SeedlessOnboardingController extends base_controller_1.BaseController {
425
415
  latestKeyIndex,
426
416
  });
427
417
  // update and encrypt the vault with new password
428
- await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_updateVault).call(this, {
418
+ await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_createNewVaultWithAuthData).call(this, {
429
419
  password: newPassword,
430
420
  rawToprfEncryptionKey: newEncKey,
431
421
  rawToprfPwEncryptionKey: newPwEncKey,
@@ -454,7 +444,7 @@ class SeedlessOnboardingController extends base_controller_1.BaseController {
454
444
  * @param secretData.data - The secret data to update the backup metadata state.
455
445
  */
456
446
  updateBackupMetadataState(secretData) {
457
- __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_assertIsUnlocked).call(this, this.state);
447
+ __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_assertIsUnlocked).call(this);
458
448
  __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_filterDupesAndUpdateSocialBackupsMetadata).call(this, secretData);
459
449
  }
460
450
  /**
@@ -503,7 +493,7 @@ class SeedlessOnboardingController extends base_controller_1.BaseController {
503
493
  */
504
494
  async submitPassword(password) {
505
495
  return await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_withControllerLock).call(this, async () => {
506
- await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetVaultData).call(this, { password });
496
+ await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetVaultData).call(this, password);
507
497
  __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_setUnlocked).call(this);
508
498
  });
509
499
  }
@@ -515,9 +505,7 @@ class SeedlessOnboardingController extends base_controller_1.BaseController {
515
505
  setLocked() {
516
506
  this.update((state) => {
517
507
  delete state.vaultEncryptionKey;
518
- delete state.toprfEncryptionKey;
519
- delete state.toprfPwEncryptionKey;
520
- delete state.toprfAuthKeyPair;
508
+ delete state.vaultEncryptionSalt;
521
509
  delete state.revokeToken;
522
510
  delete state.accessToken;
523
511
  });
@@ -534,12 +522,12 @@ class SeedlessOnboardingController extends base_controller_1.BaseController {
534
522
  */
535
523
  async syncLatestGlobalPassword({ globalPassword, }) {
536
524
  return await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_withControllerLock).call(this, async () => {
537
- __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_assertIsUnlocked).call(this, this.state);
525
+ __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_assertIsUnlocked).call(this);
538
526
  const doSyncPassword = async () => {
539
527
  // update vault with latest globalPassword
540
528
  const { encKey, pwEncKey, authKeyPair } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_recoverEncKey).call(this, globalPassword);
541
529
  // update and encrypt the vault with new password
542
- await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_updateVault).call(this, {
530
+ await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_createNewVaultWithAuthData).call(this, {
543
531
  password: globalPassword,
544
532
  rawToprfEncryptionKey: encKey,
545
533
  rawToprfPwEncryptionKey: pwEncKey,
@@ -640,9 +628,7 @@ class SeedlessOnboardingController extends base_controller_1.BaseController {
640
628
  * @param keyringEncryptionKey - The keyring encryption key.
641
629
  */
642
630
  async storeKeyringEncryptionKey(keyringEncryptionKey) {
643
- __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_assertIsUnlocked).call(this, this.state);
644
- const { toprfPwEncryptionKey } = this.state;
645
- const encKey = (0, utils_1.base64ToBytes)(toprfPwEncryptionKey);
631
+ const { toprfPwEncryptionKey: encKey } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetVaultData).call(this);
646
632
  await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_storeKeyringEncryptionKey).call(this, encKey, keyringEncryptionKey);
647
633
  }
648
634
  /**
@@ -652,9 +638,7 @@ class SeedlessOnboardingController extends base_controller_1.BaseController {
652
638
  * @returns The keyring encryption key.
653
639
  */
654
640
  async loadKeyringEncryptionKey() {
655
- __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_assertIsUnlocked).call(this, this.state);
656
- const { toprfPwEncryptionKey } = this.state;
657
- const encKey = (0, utils_1.base64ToBytes)(toprfPwEncryptionKey);
641
+ const { toprfPwEncryptionKey: encKey } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetVaultData).call(this);
658
642
  return await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_loadKeyringEncryptionKey).call(this, encKey);
659
643
  }
660
644
  /**
@@ -703,10 +687,7 @@ class SeedlessOnboardingController extends base_controller_1.BaseController {
703
687
  return await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_withControllerLock).call(this, async () => {
704
688
  __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_assertIsAuthenticatedUser).call(this, this.state);
705
689
  const { vaultEncryptionKey } = this.state;
706
- const { toprfEncryptionKey: rawToprfEncryptionKey, toprfPwEncryptionKey: rawToprfPwEncryptionKey, toprfAuthKeyPair: rawToprfAuthKeyPair, revokeToken, } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetVaultData).call(this, {
707
- password,
708
- encryptionKey: vaultEncryptionKey,
709
- });
690
+ const { toprfEncryptionKey: rawToprfEncryptionKey, toprfPwEncryptionKey: rawToprfPwEncryptionKey, toprfAuthKeyPair: rawToprfAuthKeyPair, revokeToken, } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetVaultData).call(this, password, vaultEncryptionKey);
710
691
  if (!revokeToken) {
711
692
  throw new Error(constants_1.SeedlessOnboardingControllerErrorMessage.InvalidRevokeToken);
712
693
  }
@@ -720,7 +701,7 @@ class SeedlessOnboardingController extends base_controller_1.BaseController {
720
701
  // set new refresh token to persist in state
721
702
  state.refreshToken = newRefreshToken;
722
703
  });
723
- await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_updateVault).call(this, {
704
+ await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_createNewVaultWithAuthData).call(this, {
724
705
  password,
725
706
  rawToprfEncryptionKey,
726
707
  rawToprfPwEncryptionKey,
@@ -808,9 +789,7 @@ async function _SeedlessOnboardingController_submitGlobalPassword({ targetAuthPu
808
789
  const { pwEncKey } = res;
809
790
  const vaultKey = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_loadSeedlessEncryptionKey).call(this, pwEncKey);
810
791
  // Unlock the controller
811
- await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetVaultData).call(this, {
812
- encryptionKey: vaultKey,
813
- });
792
+ await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetVaultData).call(this, undefined, vaultKey);
814
793
  __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_setUnlocked).call(this);
815
794
  }
816
795
  catch (error) {
@@ -842,10 +821,7 @@ async function _SeedlessOnboardingController_getAccessToken(password) {
842
821
  if (!vault) {
843
822
  throw new Error(constants_1.SeedlessOnboardingControllerErrorMessage.InvalidAccessToken);
844
823
  }
845
- const { accessToken: accessTokenFromVault } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetVaultData).call(this, {
846
- password,
847
- skipVaultMutexLock: true,
848
- });
824
+ const { accessToken: accessTokenFromVault } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetVaultData).call(this, password);
849
825
  return accessTokenFromVault;
850
826
  }, _SeedlessOnboardingController_setUnlocked = function _SeedlessOnboardingController_setUnlocked() {
851
827
  __classPrivateFieldSet(this, _SeedlessOnboardingController_isUnlocked, true, "f");
@@ -964,6 +940,7 @@ async function _SeedlessOnboardingController_recoverEncKey(password) {
964
940
  });
965
941
  }
966
942
  catch (error) {
943
+ log('Error fetching secret data', error);
967
944
  if (__classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_isTokenExpiredError).call(this, error)) {
968
945
  throw error;
969
946
  }
@@ -1006,12 +983,11 @@ async function _SeedlessOnboardingController_changeEncryptionKey({ oldPassword,
1006
983
  } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_recoverEncKey).call(this, oldPassword));
1007
984
  }
1008
985
  else {
1009
- // get the TOPRF encryption key and authentication key pair from the state
1010
- __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_assertIsUnlocked).call(this, this.state);
1011
- const { toprfEncryptionKey, toprfPwEncryptionKey, toprfAuthKeyPair } = this.state;
1012
- encKey = (0, utils_1.base64ToBytes)(toprfEncryptionKey);
1013
- pwEncKey = (0, utils_1.base64ToBytes)(toprfPwEncryptionKey);
1014
- authKeyPair = (0, utils_3.deserializAuthKeyPair)(toprfAuthKeyPair);
986
+ ({
987
+ toprfEncryptionKey: encKey,
988
+ toprfPwEncryptionKey: pwEncKey,
989
+ toprfAuthKeyPair: authKeyPair,
990
+ } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetVaultData).call(this, oldPassword));
1015
991
  }
1016
992
  const result = await this.toprfClient.changeEncKey({
1017
993
  nodeAuthTokens: this.state.nodeAuthTokens,
@@ -1077,15 +1053,11 @@ async function _SeedlessOnboardingController_encryptAndStoreSecretData(params) {
1077
1053
  }
1078
1054
  }, _SeedlessOnboardingController_unlockVaultAndGetVaultData =
1079
1055
  /**
1080
- * Unlocks the encrypted vault using the provided password or encryption key and returns the decrypted vault data.
1056
+ * Unlocks the encrypted vault using the provided password and returns the decrypted vault data.
1081
1057
  * This method ensures thread-safety by using a mutex lock when accessing the vault.
1082
1058
  *
1083
- * Successfully unlocking the vault will update the controller state with the decrypted vault data.
1084
- *
1085
- * @param params - The parameters for unlocking the vault.
1086
- * @param params.password - The optional password to unlock the vault.
1087
- * @param params.encryptionKey - The optional encryption key to unlock the vault.
1088
- * @param params.skipVaultMutexLock - Whether to skip the vault mutex lock.
1059
+ * @param password - The optional password to unlock the vault.
1060
+ * @param encryptionKey - The optional encryption key to unlock the vault.
1089
1061
  * @returns A promise that resolves to an object containing:
1090
1062
  * - toprfEncryptionKey: The decrypted TOPRF encryption key
1091
1063
  * - toprfAuthKeyPair: The decrypted TOPRF authentication key pair
@@ -1097,40 +1069,44 @@ async function _SeedlessOnboardingController_encryptAndStoreSecretData(params) {
1097
1069
  * - The password is incorrect (from encryptor.decrypt)
1098
1070
  * - The decrypted vault data is malformed
1099
1071
  */
1100
- async function _SeedlessOnboardingController_unlockVaultAndGetVaultData(params) {
1101
- const doUnlockVaultAndGetVaultData = async () => {
1072
+ async function _SeedlessOnboardingController_unlockVaultAndGetVaultData(password, encryptionKey) {
1073
+ return __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_withVaultLock).call(this, async () => {
1102
1074
  let { vaultEncryptionKey } = this.state;
1103
- const { vault: encryptedVault } = this.state;
1075
+ const { vault: encryptedVault, vaultEncryptionSalt } = this.state;
1104
1076
  if (!encryptedVault) {
1105
1077
  throw new Error(constants_1.SeedlessOnboardingControllerErrorMessage.VaultError);
1106
1078
  }
1107
- if (params?.encryptionKey) {
1108
- vaultEncryptionKey = params.encryptionKey;
1079
+ if (encryptionKey) {
1080
+ vaultEncryptionKey = encryptionKey;
1109
1081
  }
1110
1082
  let decryptedVaultData;
1111
1083
  const updatedState = {};
1112
- if (params?.password) {
1113
- assertIsValidPassword(params.password);
1084
+ if (password) {
1085
+ assertIsValidPassword(password);
1114
1086
  // Note that vault decryption using the password is a very costly operation as it involves deriving the encryption key
1115
1087
  // from the password using an intentionally slow key derivation function.
1116
1088
  // We should make sure that we only call it very intentionally.
1117
- const result = await __classPrivateFieldGet(this, _SeedlessOnboardingController_vaultEncryptor, "f").decryptWithDetail(params.password, encryptedVault);
1089
+ const result = await __classPrivateFieldGet(this, _SeedlessOnboardingController_vaultEncryptor, "f").decryptWithDetail(password, encryptedVault);
1118
1090
  decryptedVaultData = result.vault;
1119
1091
  updatedState.vaultEncryptionKey = result.exportedKeyString;
1092
+ updatedState.vaultEncryptionSalt = result.salt;
1120
1093
  }
1121
1094
  else {
1122
1095
  assertIsVaultEncryptionKeyDefined(vaultEncryptionKey);
1123
1096
  const parsedEncryptedVault = JSON.parse(encryptedVault);
1097
+ if (vaultEncryptionSalt &&
1098
+ vaultEncryptionSalt !== parsedEncryptedVault.salt) {
1099
+ throw new Error(constants_1.SeedlessOnboardingControllerErrorMessage.ExpiredCredentials);
1100
+ }
1124
1101
  const key = await __classPrivateFieldGet(this, _SeedlessOnboardingController_vaultEncryptor, "f").importKey(vaultEncryptionKey);
1125
1102
  decryptedVaultData = await __classPrivateFieldGet(this, _SeedlessOnboardingController_vaultEncryptor, "f").decryptWithKey(key, parsedEncryptedVault);
1126
1103
  updatedState.vaultEncryptionKey = vaultEncryptionKey;
1104
+ updatedState.vaultEncryptionSalt = vaultEncryptionSalt;
1127
1105
  }
1128
1106
  const { toprfEncryptionKey, toprfPwEncryptionKey, toprfAuthKeyPair, revokeToken, accessToken, } = __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_parseVaultData).call(this, decryptedVaultData);
1129
1107
  this.update((state) => {
1130
1108
  state.vaultEncryptionKey = updatedState.vaultEncryptionKey;
1131
- state.toprfEncryptionKey = (0, utils_1.bytesToBase64)(toprfEncryptionKey);
1132
- state.toprfPwEncryptionKey = (0, utils_1.bytesToBase64)(toprfPwEncryptionKey);
1133
- state.toprfAuthKeyPair = (0, utils_3.serializeAuthKeyPair)(toprfAuthKeyPair);
1109
+ state.vaultEncryptionSalt = updatedState.vaultEncryptionSalt;
1134
1110
  state.revokeToken = revokeToken;
1135
1111
  state.accessToken = accessToken;
1136
1112
  });
@@ -1141,10 +1117,7 @@ async function _SeedlessOnboardingController_unlockVaultAndGetVaultData(params)
1141
1117
  revokeToken,
1142
1118
  accessToken,
1143
1119
  };
1144
- };
1145
- return params?.skipVaultMutexLock
1146
- ? doUnlockVaultAndGetVaultData()
1147
- : __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_withVaultLock).call(this, doUnlockVaultAndGetVaultData);
1120
+ });
1148
1121
  }, _SeedlessOnboardingController_withPersistedSecretMetadataBackupsState =
1149
1122
  /**
1150
1123
  * Executes a callback function that creates or restores secret data and persists their hashes in the controller state.
@@ -1201,54 +1174,65 @@ async function _SeedlessOnboardingController_withPersistedSecretMetadataBackupsS
1201
1174
  ];
1202
1175
  });
1203
1176
  }
1177
+ }, _SeedlessOnboardingController_createNewVaultWithAuthData =
1178
+ /**
1179
+ * Create a new vault with the given authentication data.
1180
+ *
1181
+ * Serialize the authentication and key data which will be stored in the vault.
1182
+ *
1183
+ * @param params - The parameters for creating a new vault.
1184
+ * @param params.password - The password to encrypt the vault.
1185
+ * @param params.rawToprfEncryptionKey - The encryption key to encrypt the vault.
1186
+ * @param params.rawToprfPwEncryptionKey - The encryption key to encrypt the password.
1187
+ * @param params.rawToprfAuthKeyPair - The authentication key pair to encrypt the vault.
1188
+ */
1189
+ async function _SeedlessOnboardingController_createNewVaultWithAuthData({ password, rawToprfEncryptionKey, rawToprfPwEncryptionKey, rawToprfAuthKeyPair, }) {
1190
+ __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_assertIsAuthenticatedUser).call(this, this.state);
1191
+ const accessToken = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_getAccessToken).call(this, password);
1192
+ __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_setUnlocked).call(this);
1193
+ const { toprfEncryptionKey, toprfPwEncryptionKey, toprfAuthKeyPair } = __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_serializeKeyData).call(this, rawToprfEncryptionKey, rawToprfPwEncryptionKey, rawToprfAuthKeyPair);
1194
+ const serializedVaultData = JSON.stringify({
1195
+ toprfEncryptionKey,
1196
+ toprfPwEncryptionKey,
1197
+ toprfAuthKeyPair,
1198
+ revokeToken: this.state.revokeToken,
1199
+ accessToken,
1200
+ });
1201
+ await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_updateVault).call(this, {
1202
+ password,
1203
+ serializedVaultData,
1204
+ pwEncKey: rawToprfPwEncryptionKey,
1205
+ });
1206
+ // update the authPubKey in the state
1207
+ __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_persistAuthPubKey).call(this, {
1208
+ authPubKey: rawToprfAuthKeyPair.pk,
1209
+ });
1204
1210
  }, _SeedlessOnboardingController_updateVault =
1205
1211
  /**
1206
1212
  * Encrypt and update the vault with the given authentication data.
1207
1213
  *
1208
1214
  * @param params - The parameters for updating the vault.
1209
1215
  * @param params.password - The password to encrypt the vault.
1210
- * @param params.rawToprfEncryptionKey - The TOPRF encryption key.
1211
- * @param params.rawToprfPwEncryptionKey - The TOPRF password encryption key.
1212
- * @param params.rawToprfAuthKeyPair - The TOPRF authentication key pair.
1216
+ * @param params.serializedVaultData - The serialized authentication data to update the vault with.
1217
+ * @param params.pwEncKey - The global password encryption key.
1213
1218
  * @returns A promise that resolves to the updated vault.
1214
1219
  */
1215
- async function _SeedlessOnboardingController_updateVault({ password, rawToprfEncryptionKey, rawToprfPwEncryptionKey, rawToprfAuthKeyPair, }) {
1220
+ async function _SeedlessOnboardingController_updateVault({ password, serializedVaultData, pwEncKey, }) {
1216
1221
  await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_withVaultLock).call(this, async () => {
1217
- __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_assertIsAuthenticatedUser).call(this, this.state);
1218
1222
  assertIsValidPassword(password);
1219
- const accessToken = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_getAccessToken).call(this, password);
1220
- const toprfEncryptionKey = (0, utils_1.bytesToBase64)(rawToprfEncryptionKey);
1221
- const toprfPwEncryptionKey = (0, utils_1.bytesToBase64)(rawToprfPwEncryptionKey);
1222
- const toprfAuthKeyPair = (0, utils_3.serializeAuthKeyPair)(rawToprfAuthKeyPair);
1223
- const serializedVaultData = JSON.stringify({
1224
- toprfEncryptionKey,
1225
- toprfPwEncryptionKey,
1226
- toprfAuthKeyPair,
1227
- revokeToken: this.state.revokeToken,
1228
- accessToken,
1229
- });
1230
1223
  // Note that vault encryption using the password is a very costly operation as it involves deriving the encryption key
1231
1224
  // from the password using an intentionally slow key derivation function.
1232
1225
  // We should make sure that we only call it very intentionally.
1233
1226
  const { vault, exportedKeyString } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_vaultEncryptor, "f").encryptWithDetail(password, serializedVaultData);
1234
1227
  // Encrypt vault key.
1235
- const aes = (0, webcrypto_1.managedNonce)(aes_1.gcm)(rawToprfPwEncryptionKey);
1228
+ const aes = (0, webcrypto_1.managedNonce)(aes_1.gcm)(pwEncKey);
1236
1229
  const encryptedKey = aes.encrypt((0, utils_2.utf8ToBytes)(exportedKeyString));
1237
- // update the controller state after updating the vault
1238
1230
  this.update((state) => {
1239
1231
  state.vault = vault;
1240
1232
  state.vaultEncryptionKey = exportedKeyString;
1233
+ state.vaultEncryptionSalt = JSON.parse(vault).salt;
1241
1234
  state.encryptedSeedlessEncryptionKey = (0, utils_1.bytesToBase64)(encryptedKey);
1242
- state.toprfEncryptionKey = toprfEncryptionKey;
1243
- state.toprfPwEncryptionKey = toprfPwEncryptionKey;
1244
- state.toprfAuthKeyPair = toprfAuthKeyPair;
1245
- });
1246
- // update the authPubKey in the state
1247
- __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_persistAuthPubKey).call(this, {
1248
- authPubKey: rawToprfAuthKeyPair.pk,
1249
1235
  });
1250
- // unlock the controller
1251
- __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_setUnlocked).call(this);
1252
1236
  });
1253
1237
  }, _SeedlessOnboardingController_withControllerLock =
1254
1238
  /**
@@ -1279,6 +1263,18 @@ async function _SeedlessOnboardingController_withControllerLock(callback) {
1279
1263
  */
1280
1264
  async function _SeedlessOnboardingController_withVaultLock(callback) {
1281
1265
  return await withLock(__classPrivateFieldGet(this, _SeedlessOnboardingController_vaultOperationMutex, "f"), callback);
1266
+ }, _SeedlessOnboardingController_serializeKeyData = function _SeedlessOnboardingController_serializeKeyData(encKey, pwEncKey, authKeyPair) {
1267
+ const b64EncodedEncKey = (0, utils_1.bytesToBase64)(encKey);
1268
+ const b64EncodedPwEncKey = (0, utils_1.bytesToBase64)(pwEncKey);
1269
+ const b64EncodedAuthKeyPair = JSON.stringify({
1270
+ sk: (0, utils_1.bigIntToHex)(authKeyPair.sk),
1271
+ pk: (0, utils_1.bytesToBase64)(authKeyPair.pk),
1272
+ });
1273
+ return {
1274
+ toprfEncryptionKey: b64EncodedEncKey,
1275
+ toprfPwEncryptionKey: b64EncodedPwEncKey,
1276
+ toprfAuthKeyPair: b64EncodedAuthKeyPair,
1277
+ };
1282
1278
  }, _SeedlessOnboardingController_parseVaultData = function _SeedlessOnboardingController_parseVaultData(data) {
1283
1279
  if (typeof data !== 'string') {
1284
1280
  throw new Error(constants_1.SeedlessOnboardingControllerErrorMessage.InvalidVaultData);
@@ -1293,7 +1289,11 @@ async function _SeedlessOnboardingController_withVaultLock(callback) {
1293
1289
  (0, assertions_1.assertIsValidVaultData)(parsedVaultData);
1294
1290
  const rawToprfEncryptionKey = (0, utils_1.base64ToBytes)(parsedVaultData.toprfEncryptionKey);
1295
1291
  const rawToprfPwEncryptionKey = (0, utils_1.base64ToBytes)(parsedVaultData.toprfPwEncryptionKey);
1296
- const rawToprfAuthKeyPair = (0, utils_3.deserializAuthKeyPair)(parsedVaultData.toprfAuthKeyPair);
1292
+ const parsedToprfAuthKeyPair = JSON.parse(parsedVaultData.toprfAuthKeyPair);
1293
+ const rawToprfAuthKeyPair = {
1294
+ sk: BigInt(parsedToprfAuthKeyPair.sk),
1295
+ pk: (0, utils_1.base64ToBytes)(parsedToprfAuthKeyPair.pk),
1296
+ };
1297
1297
  return {
1298
1298
  toprfEncryptionKey: rawToprfEncryptionKey,
1299
1299
  toprfPwEncryptionKey: rawToprfPwEncryptionKey,
@@ -1301,17 +1301,10 @@ async function _SeedlessOnboardingController_withVaultLock(callback) {
1301
1301
  revokeToken: parsedVaultData.revokeToken,
1302
1302
  accessToken: parsedVaultData.accessToken,
1303
1303
  };
1304
- }, _SeedlessOnboardingController_assertIsUnlocked = function _SeedlessOnboardingController_assertIsUnlocked(value) {
1304
+ }, _SeedlessOnboardingController_assertIsUnlocked = function _SeedlessOnboardingController_assertIsUnlocked() {
1305
1305
  if (!__classPrivateFieldGet(this, _SeedlessOnboardingController_isUnlocked, "f")) {
1306
1306
  throw new Error(constants_1.SeedlessOnboardingControllerErrorMessage.ControllerLocked);
1307
1307
  }
1308
- if (!value ||
1309
- typeof value !== 'object' ||
1310
- !('toprfEncryptionKey' in value) ||
1311
- !('toprfPwEncryptionKey' in value) ||
1312
- !('toprfAuthKeyPair' in value)) {
1313
- throw new Error(constants_1.SeedlessOnboardingControllerErrorMessage.VaultLocked);
1314
- }
1315
1308
  }, _SeedlessOnboardingController_assertIsAuthenticatedUser = function _SeedlessOnboardingController_assertIsAuthenticatedUser(value) {
1316
1309
  if (!value ||
1317
1310
  typeof value !== 'object' ||