@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.
- package/dist/SeedlessOnboardingController.cjs +112 -119
- package/dist/SeedlessOnboardingController.cjs.map +1 -1
- package/dist/SeedlessOnboardingController.d.cts.map +1 -1
- package/dist/SeedlessOnboardingController.d.mts.map +1 -1
- package/dist/SeedlessOnboardingController.mjs +114 -121
- package/dist/SeedlessOnboardingController.mjs.map +1 -1
- package/dist/constants.cjs +1 -1
- package/dist/constants.cjs.map +1 -1
- package/dist/constants.d.cts +1 -1
- package/dist/constants.d.cts.map +1 -1
- package/dist/constants.d.mts +1 -1
- package/dist/constants.d.mts.map +1 -1
- package/dist/constants.mjs +1 -1
- package/dist/constants.mjs.map +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +36 -30
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +36 -30
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/dist/utils.cjs +1 -28
- package/dist/utils.cjs.map +1 -1
- package/dist/utils.d.cts +0 -15
- package/dist/utils.d.cts.map +1 -1
- package/dist/utils.d.mts +0 -15
- package/dist/utils.d.mts.map +1 -1
- package/dist/utils.mjs +1 -26
- package/dist/utils.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -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",
|
|
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
|
-
|
|
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:
|
|
343
|
-
authKeyPair:
|
|
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
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
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",
|
|
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
|
-
|
|
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",
|
|
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
|
|
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,
|
|
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.
|
|
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
|
|
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",
|
|
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",
|
|
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",
|
|
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",
|
|
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
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
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
|
|
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
|
-
*
|
|
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(
|
|
1101
|
-
|
|
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 (
|
|
1108
|
-
vaultEncryptionKey =
|
|
1079
|
+
if (encryptionKey) {
|
|
1080
|
+
vaultEncryptionKey = encryptionKey;
|
|
1109
1081
|
}
|
|
1110
1082
|
let decryptedVaultData;
|
|
1111
1083
|
const updatedState = {};
|
|
1112
|
-
if (
|
|
1113
|
-
assertIsValidPassword(
|
|
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(
|
|
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.
|
|
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.
|
|
1211
|
-
* @param params.
|
|
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,
|
|
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)(
|
|
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
|
|
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(
|
|
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' ||
|