diff --git a/apps/encryption/lib/crypto/crypt.php b/apps/encryption/lib/crypto/crypt.php index 974e0038af..91f986611b 100644 --- a/apps/encryption/lib/crypto/crypt.php +++ b/apps/encryption/lib/crypto/crypt.php @@ -67,6 +67,8 @@ class Crypt { } /** + * create new private/public key-pair for user + * * @return array|bool */ public function createKeyPair() { @@ -105,6 +107,8 @@ class Crypt { } /** + * Generates a new private key + * * @return resource */ public function getOpenSSLPKey() { @@ -113,13 +117,16 @@ class Crypt { } /** + * get openSSL Config + * * @return array */ private function getOpenSSLConfig() { $config = ['private_key_bits' => 4096]; - $config = array_merge(\OC::$server->getConfig()->getSystemValue('openssl', - []), - $config); + $config = array_merge( + $config, + $this->config->getSystemValue('openssl', []) + ); return $config; } @@ -186,7 +193,10 @@ class Crypt { } /** - * @return mixed|string + * return Cipher either from config.php or the default cipher defined in + * this class + * + * @return string */ public function getCipher() { $cipher = $this->config->getSystemValue('cipher', self::DEFAULT_CIPHER); @@ -276,6 +286,8 @@ class Crypt { } /** + * remove padding + * * @param $padded * @return bool|string */ @@ -287,6 +299,8 @@ class Crypt { } /** + * split iv from encrypted content + * * @param $catFile * @return array */ @@ -356,6 +370,8 @@ class Crypt { } /** + * generate initialization vector + * * @return string * @throws GenericEncryptionException */ @@ -396,31 +412,6 @@ class Crypt { return $key; } - /** - * Check if a file's contents contains an IV and is symmetrically encrypted - * - * @param $content - * @return bool - */ - public function isCatFileContent($content) { - if (!$content) { - return false; - } - - $noPadding = $this->removePadding($content); - - // Fetch encryption metadata from end of file - $meta = substr($noPadding, -22); - - // Fetch identifier from start of metadata - $identifier = substr($meta, 0, 6); - - if ($identifier === '00iv00') { - return true; - } - return false; - } - /** * @param $encKeyFile * @param $shareKey diff --git a/apps/encryption/tests/lib/crypto/cryptTest.php b/apps/encryption/tests/lib/crypto/cryptTest.php new file mode 100644 index 0000000000..3ea5766834 --- /dev/null +++ b/apps/encryption/tests/lib/crypto/cryptTest.php @@ -0,0 +1,263 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see + * + */ + + +namespace OCA\Encryption\Tests\Crypt; + + +use OCA\Encryption\Crypto\Crypt; +use Test\TestCase; + +class cryptTest extends TestCase { + + + /** @var \PHPUnit_Framework_MockObject_MockObject */ + private $logger; + + /** @var \PHPUnit_Framework_MockObject_MockObject */ + private $userSession; + + /** @var \PHPUnit_Framework_MockObject_MockObject */ + private $config; + + /** @var Crypt */ + private $crypt; + + public function setUp() { + parent::setUp(); + + $this->logger = $this->getMockBuilder('OCP\ILogger') + ->disableOriginalConstructor() + ->getMock(); + $this->logger->expects($this->any()) + ->method('warning') + ->willReturn(true); + $this->userSession = $this->getMockBuilder('OCP\IUserSession') + ->disableOriginalConstructor() + ->getMock(); + $this->config = $this->getMockBuilder('OCP\IConfig') + ->disableOriginalConstructor() + ->getMock(); + + $this->crypt = new Crypt($this->logger, $this->userSession, $this->config); + } + + /** + * test getOpenSSLConfig without any additional parameters + */ + public function testGetOpenSSLConfigBasic() { + + $this->config->expects($this->once()) + ->method('getSystemValue') + ->with($this->equalTo('openssl'), $this->equalTo([])) + ->willReturn(array()); + + $result = \Test_Helper::invokePrivate($this->crypt, 'getOpenSSLConfig'); + $this->assertSame(1, count($result)); + $this->assertArrayHasKey('private_key_bits', $result); + $this->assertSame(4096, $result['private_key_bits']); + } + + /** + * test getOpenSSLConfig with additional parameters defined in config.php + */ + public function testGetOpenSSLConfig() { + + $this->config->expects($this->once()) + ->method('getSystemValue') + ->with($this->equalTo('openssl'), $this->equalTo([])) + ->willReturn(array('foo' => 'bar', 'private_key_bits' => 1028)); + + $result = \Test_Helper::invokePrivate($this->crypt, 'getOpenSSLConfig'); + $this->assertSame(2, count($result)); + $this->assertArrayHasKey('private_key_bits', $result); + $this->assertArrayHasKey('foo', $result); + $this->assertSame(1028, $result['private_key_bits']); + $this->assertSame('bar', $result['foo']); + } + + + /** + * test generateHeader + */ + public function testGenerateHeader() { + + $this->config->expects($this->once()) + ->method('getSystemValue') + ->with($this->equalTo('cipher'), $this->equalTo('AES-256-CFB')) + ->willReturn('AES-128-CFB'); + + $this->assertSame('HBEGIN:cipher:AES-128-CFB:HEND', + $this->crypt->generateHeader() + ); + } + + /** + * @dataProvider dataProviderGetCipher + * @param string $configValue + * @param string $expected + */ + public function testGetCipher($configValue, $expected) { + + $this->config->expects($this->once()) + ->method('getSystemValue') + ->with($this->equalTo('cipher'), $this->equalTo('AES-256-CFB')) + ->willReturn($configValue); + + $this->assertSame($expected, + $this->crypt->getCipher() + ); + + } + + /** + * data provider for testGetCipher + * + * @return array + */ + public function dataProviderGetCipher() { + return array( + array('AES-128-CFB', 'AES-128-CFB'), + array('AES-256-CFB', 'AES-256-CFB'), + array('unknown', 'AES-256-CFB') + ); + } + + /** + * test concatIV() + */ + public function testConcatIV() { + + $result = \Test_Helper::invokePrivate( + $this->crypt, + 'concatIV', + array('content', 'my_iv')); + + $this->assertSame('content00iv00my_iv', + $result + ); + } + + /** + * test splitIV() + */ + public function testSplitIV() { + $data = 'encryptedContent00iv001234567890123456'; + $result = \Test_Helper::invokePrivate($this->crypt, 'splitIV', array($data)); + $this->assertTrue(is_array($result)); + $this->assertSame(2, count($result)); + $this->assertArrayHasKey('encrypted', $result); + $this->assertArrayHasKey('iv', $result); + $this->assertSame('encryptedContent', $result['encrypted']); + $this->assertSame('1234567890123456', $result['iv']); + } + + /** + * test addPadding() + */ + public function testAddPadding() { + $result = \Test_Helper::invokePrivate($this->crypt, 'addPadding', array('data')); + $this->assertSame('dataxx', $result); + } + + /** + * test removePadding() + * + * @dataProvider dataProviderRemovePadding + * @param $data + * @param $expected + */ + public function testRemovePadding($data, $expected) { + $result = \Test_Helper::invokePrivate($this->crypt, 'removePadding', array($data)); + $this->assertSame($expected, $result); + } + + /** + * data provider for testRemovePadding + * + * @return array + */ + public function dataProviderRemovePadding() { + return array( + array('dataxx', 'data'), + array('data', false) + ); + } + + /** + * test parseHeader() + */ + public function testParseHeader() { + + $header= 'HBEGIN:foo:bar:cipher:AES-256-CFB:HEND'; + $result = \Test_Helper::invokePrivate($this->crypt, 'parseHeader', array($header)); + + $this->assertTrue(is_array($result)); + $this->assertSame(2, count($result)); + $this->assertArrayHasKey('foo', $result); + $this->assertArrayHasKey('cipher', $result); + $this->assertSame('bar', $result['foo']); + $this->assertSame('AES-256-CFB', $result['cipher']); + } + + /** + * test encrypt() + * + * @return string + */ + public function testEncrypt() { + + $decrypted = 'content'; + $password = 'password'; + $iv = \Test_Helper::invokePrivate($this->crypt, 'generateIv'); + + $this->assertTrue(is_string($iv)); + $this->assertSame(16, strlen($iv)); + + $result = \Test_Helper::invokePrivate($this->crypt, 'encrypt', array($decrypted, $iv, $password)); + + $this->assertTrue(is_string($result)); + + return array( + 'password' => $password, + 'iv' => $iv, + 'encrypted' => $result, + 'decrypted' => $decrypted); + + } + + /** + * test decrypt() + * + * @depends testEncrypt + */ + public function testDecrypt($data) { + + $result = \Test_Helper::invokePrivate( + $this->crypt, + 'decrypt', + array($data['encrypted'], $data['iv'], $data['password'])); + + $this->assertSame($data['decrypted'], $result); + + } + +}