@metamask-previews/seedless-onboarding-controller 2.5.0-preview-3f5f144a → 2.5.0-preview-848c8e7d

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