diff --git a/src/app/services/cipherService.js b/src/app/services/cipherService.js index dd8e6dcd52..ebc7a34a65 100644 --- a/src/app/services/cipherService.js +++ b/src/app/services/cipherService.js @@ -77,7 +77,6 @@ angular return { id: encryptedFolder.Id, - 'type': 0, name: cryptoService.decrypt(encryptedFolder.Name) }; }; @@ -179,7 +178,6 @@ angular return { id: unencryptedFolder.id, - 'type': 0, name: cryptoService.encrypt(unencryptedFolder.name, key) }; }; diff --git a/src/app/services/cryptoService.js b/src/app/services/cryptoService.js index 97639f43d4..199b23af52 100644 --- a/src/app/services/cryptoService.js +++ b/src/app/services/cryptoService.js @@ -116,14 +116,26 @@ angular return buffer.getBytes(16); }; - _service.getPrivateKey = function () { + _service.getPrivateKey = function (outputEncoding) { + outputEncoding = outputEncoding || 'native'; + if (_privateKey) { + if (outputEncoding === 'raw') { + var privateKeyAsn1 = forge.pki.privateKeyToAsn1(_privateKey); + var privateKeyPkcs8 = forge.pki.wrapRsaPrivateKey(privateKeyAsn1); + return forge.asn1.toDer(privateKeyPkcs8).getBytes(); + } + return _privateKey; } if ($sessionStorage.privateKey) { var privateKeyBytes = forge.util.decode64($sessionStorage.privateKey); _privateKey = forge.pki.privateKeyFromAsn1(forge.asn1.fromDer(privateKeyBytes)); + + if (outputEncoding === 'raw') { + return privateKeyBytes; + } } return _privateKey; diff --git a/src/app/settings/settingsChangeEmailController.js b/src/app/settings/settingsChangeEmailController.js index 405214e60b..b6023b0a0a 100644 --- a/src/app/settings/settingsChangeEmailController.js +++ b/src/app/settings/settingsChangeEmailController.js @@ -39,13 +39,23 @@ reencryptedFolders = cipherService.encryptFolders(unencryptedFolders, _newKey); }).$promise; + var privateKey = cryptoService.getPrivateKey('raw'), + reencryptedPrivateKey = null; + if (privateKey) { + reencryptedPrivateKey = cryptoService.encrypt(privateKey, _newKey, 'raw'); + } + $q.all([loginsPromise, foldersPromise]).then(function () { var request = { token: model.token, newEmail: model.newEmail.toLowerCase(), masterPasswordHash: _masterPasswordHash, newMasterPasswordHash: _newMasterPasswordHash, - ciphers: reencryptedLogins.concat(reencryptedFolders) + data: { + ciphers: reencryptedLogins, + folders: reencryptedFolders, + privateKey: reencryptedPrivateKey + } }; $scope.confirmPromise = apiService.accounts.email(request, function () { diff --git a/src/app/settings/settingsChangePasswordController.js b/src/app/settings/settingsChangePasswordController.js index a660b308e8..a451729794 100644 --- a/src/app/settings/settingsChangePasswordController.js +++ b/src/app/settings/settingsChangePasswordController.js @@ -39,11 +39,21 @@ reencryptedFolders = cipherService.encryptFolders(unencryptedFolders, newKey); }).$promise; + var privateKey = cryptoService.getPrivateKey('raw'), + reencryptedPrivateKey = null; + if (privateKey) { + reencryptedPrivateKey = cryptoService.encrypt(privateKey, newKey, 'raw'); + } + $q.all([loginsPromise, foldersPromise]).then(function () { var request = { masterPasswordHash: cryptoService.hashPassword(model.masterPassword), newMasterPasswordHash: cryptoService.hashPassword(model.newMasterPassword, newKey), - ciphers: reencryptedLogins.concat(reencryptedFolders) + data: { + ciphers: reencryptedLogins, + folders: reencryptedFolders, + privateKey: reencryptedPrivateKey + } }; $scope.savePromise = apiService.accounts.putPassword(request, function () {