]> source.dussan.org Git - nextcloud-server.git/commitdiff
introduce decryptPrivateKey() method which also checks if the result is a valid priva...
authorBjörn Schießle <schiessle@owncloud.com>
Mon, 3 Jun 2013 12:19:31 +0000 (14:19 +0200)
committerBjörn Schießle <schiessle@owncloud.com>
Mon, 3 Jun 2013 12:19:31 +0000 (14:19 +0200)
apps/files_encryption/ajax/changeRecoveryPassword.php
apps/files_encryption/hooks/hooks.php
apps/files_encryption/lib/crypt.php
apps/files_encryption/lib/helper.php
apps/files_encryption/lib/session.php
apps/files_encryption/lib/util.php

index b0594f967ba30c88ff067ef122ba8f4b445eca50..366f634a51cc0504887abd1c599e320b404b4a5d 100644 (file)
@@ -22,28 +22,28 @@ $return = false;
 $oldPassword = $_POST['oldPassword'];
 $newPassword = $_POST['newPassword'];
 
+$view = new \OC\Files\View('/');
 $util = new \OCA\Encryption\Util(new \OC_FilesystemView('/'), \OCP\User::getUser());
 
-$result = $util->checkRecoveryPassword($oldPassword);
+$proxyStatus = \OC_FileProxy::$enabled;
+\OC_FileProxy::$enabled = false;
 
-if ($result) {
-       $keyId = $util->getRecoveryKeyId();
-       $keyPath = '/owncloud_private_key/' . $keyId . '.private.key';
-       $view = new \OC\Files\View('/');
+$keyId = $util->getRecoveryKeyId();
+$keyPath = '/owncloud_private_key/' . $keyId . '.private.key';
 
-       $proxyStatus = \OC_FileProxy::$enabled;
-       \OC_FileProxy::$enabled = false;
+$encryptedRecoveryKey = $view->file_get_contents($keyPath);
+$decryptedRecoveryKey = \OCA\Encryption\Crypt::decryptPrivateKey($encryptedRecoveryKey, $oldPassword);
+
+if ($decryptedRecoveryKey) {
 
-       $encryptedRecoveryKey = $view->file_get_contents($keyPath);
-       $decryptedRecoveryKey = \OCA\Encryption\Crypt::symmetricDecryptFileContent($encryptedRecoveryKey, $oldPassword);
        $encryptedRecoveryKey = \OCA\Encryption\Crypt::symmetricEncryptFileContent($decryptedRecoveryKey, $newPassword);
        $view->file_put_contents($keyPath, $encryptedRecoveryKey);
 
-       \OC_FileProxy::$enabled = $proxyStatus;
-
        $return = true;
 }
 
+\OC_FileProxy::$enabled = $proxyStatus;
+
 // success or failure
 if ($return) {
        \OCP\JSON::success(array('data' => array('message' => $l->t('Password successfully changed.'))));
index c52d739eaa89bb1078607cdcf7b72436938d34e6..47e240769bc3c328f412270e144473252891a03a 100644 (file)
@@ -55,18 +55,7 @@ class Hooks {
 \r
                $encryptedKey = Keymanager::getPrivateKey($view, $params['uid']);\r
 \r
-               $privateKey = Crypt::symmetricDecryptFileContent($encryptedKey, $params['password']);\r
-\r
-               // check if this a valid private key\r
-               $res = openssl_pkey_get_private($privateKey);\r
-               if(is_resource($res)) {\r
-                       $sslInfo = openssl_pkey_get_details($res);\r
-                       if(!isset($sslInfo['key'])) {\r
-                               $privateKey = false;\r
-                       }\r
-               } else {\r
-                       $privateKey = false;\r
-               }\r
+               $privateKey = Crypt::decryptPrivateKey($encryptedKey, $params['password']);\r
 \r
                if($privateKey === false) {\r
                        \OCP\Util::writeLog('Encryption library', 'Private key for user "' . $params['uid'] . '" is not valid! Maybe the user password was changed from outside if so please change it back to gain access', \OCP\Util::ERROR);\r
index ddeb3590f6032c1e5822f46291f8e5e8cc247171..8c96e536415273cf15e318921dd949e9df2bd188 100755 (executable)
@@ -351,6 +351,34 @@ class Crypt {
 \r
        }\r
 \r
+       /**\r
+        * @brief Decrypt private key and check if the result is a valid keyfile\r
+        * @param string $encryptedKey encrypted keyfile\r
+        * @param string $passphrase to decrypt keyfile\r
+        * @returns encrypted private key or false\r
+        *\r
+        * This function decrypts a file\r
+        */\r
+       public static function decryptPrivateKey($encryptedKey, $passphrase) {\r
+\r
+               $plainKey = self::symmetricDecryptFileContent($encryptedKey, $passphrase);\r
+\r
+               // check if this a valid private key\r
+               $res = openssl_pkey_get_private($plainKey);\r
+               if(is_resource($res)) {\r
+                       $sslInfo = openssl_pkey_get_details($res);\r
+                       if(!isset($sslInfo['key'])) {\r
+                               $plainKey = false;\r
+                       }\r
+               } else {\r
+                       $plainKey = false;\r
+               }\r
+\r
+               return $plainKey;\r
+\r
+       }\r
+\r
+\r
        /**\r
         * @brief Creates symmetric keyfile content using a generated key\r
         * @param string $plainContent content to be encrypted\r
index e078ab35541154fee450f6840dde17ba607e4e93..42871a4a955a0afc106ff5b818cabbd4ce9ce58e 100755 (executable)
@@ -93,6 +93,7 @@ class Helper {
         * @return bool
         */
        public static function adminEnableRecovery($recoveryKeyId, $recoveryPassword) {
+
                $view = new \OC\Files\View('/');
 
                if ($recoveryKeyId === null) {
@@ -127,13 +128,6 @@ class Helper {
                        // Save private key
                        $view->file_put_contents('/owncloud_private_key/' . $recoveryKeyId . '.private.key', $encryptedPrivateKey);
 
-                       // create control file which let us check later on if the entered password was correct.
-                       $encryptedControlData = \OCA\Encryption\Crypt::keyEncrypt("ownCloud", $keypair['publicKey']);
-                       if (!$view->is_dir('/control-file')) {
-                               $view->mkdir('/control-file');
-                       }
-                       $view->file_put_contents('/control-file/controlfile.enc', $encryptedControlData);
-
                        \OC_FileProxy::$enabled = true;
 
                        // Set recoveryAdmin as enabled
index bff1737554b4bea7a231135ec6affc4d341a7fef..9b0ca224c84e0645c93b33e4ea124e6b1351f51b 100644 (file)
@@ -89,7 +89,7 @@ class Session {
                        \OC_FileProxy::$enabled = false;
 
                        $encryptedKey = $this->view->file_get_contents( '/owncloud_private_key/' . $publicShareKeyId . '.private.key' );
-                       $privateKey = Crypt::symmetricDecryptFileContent( $encryptedKey, '' );
+                       $privateKey = Crypt::decryptPrivateKey($encryptedKey, '');
                        $this->setPublicSharePrivateKey( $privateKey );
 
                        \OC_FileProxy::$enabled = $proxyStatus;
index 04bd4dc8aca5711678bbbef1d0c7b22ff6885de2..6923b81b92627c463358b9a63d1cd8dc49684f4d 100644 (file)
@@ -1372,26 +1372,24 @@ class Util {
         */
        public function checkRecoveryPassword($password) {
 
+               $result = false;
                $pathKey = '/owncloud_private_key/' . $this->recoveryKeyId . ".private.key";
-               $pathControlData = '/control-file/controlfile.enc';
 
                $proxyStatus = \OC_FileProxy::$enabled;
                \OC_FileProxy::$enabled = false;
 
                $recoveryKey = $this->view->file_get_contents($pathKey);
 
-               $decryptedRecoveryKey = Crypt::symmetricDecryptFileContent($recoveryKey, $password);
+               $decryptedRecoveryKey = Crypt::decryptPrivateKey($recoveryKey, $password);
 
-               $controlData = $this->view->file_get_contents($pathControlData);
-               $decryptedControlData = Crypt::keyDecrypt($controlData, $decryptedRecoveryKey);
+               if ($decryptedRecoveryKey) {
+                       $result = true;
+               }
 
                \OC_FileProxy::$enabled = $proxyStatus;
 
-               if ($decryptedControlData === 'ownCloud') {
-                       return true;
-               }
 
-               return false;
+               return $result;
        }
 
        /**
@@ -1520,7 +1518,7 @@ class Util {
 
                $encryptedKey = $this->view->file_get_contents(
                        '/owncloud_private_key/' . $this->recoveryKeyId . '.private.key');
-               $privateKey = Crypt::symmetricDecryptFileContent($encryptedKey, $recoveryPassword);
+               $privateKey = Crypt::decryptPrivateKey($encryptedKey, $recoveryPassword);
 
                \OC_FileProxy::$enabled = $proxyStatus;