summaryrefslogtreecommitdiffstats
path: root/apps/files_encryption
diff options
context:
space:
mode:
authorRobin Appelman <icewind@owncloud.com>2012-06-15 23:48:39 +0200
committerRobin Appelman <icewind@owncloud.com>2012-06-16 01:31:03 +0200
commit195c37f88a803055c92fd38f33a4eb7a1440e5ab (patch)
tree5080604305c9aa7cb5a395c9dd1c2c0d49d41e1b /apps/files_encryption
parent8484e165167050ad19b8f2f083c04ff0d4a60755 (diff)
downloadnextcloud-server-195c37f88a803055c92fd38f33a4eb7a1440e5ab.tar.gz
nextcloud-server-195c37f88a803055c92fd38f33a4eb7a1440e5ab.zip
fix for encryption binary files
Diffstat (limited to 'apps/files_encryption')
-rw-r--r--apps/files_encryption/lib/crypt.php39
-rw-r--r--apps/files_encryption/lib/cryptstream.php4
-rw-r--r--apps/files_encryption/tests/encryption.php19
-rw-r--r--apps/files_encryption/tests/stream.php17
4 files changed, 59 insertions, 20 deletions
diff --git a/apps/files_encryption/lib/crypt.php b/apps/files_encryption/lib/crypt.php
index d2b8ad145ae..4c0ffa978ed 100644
--- a/apps/files_encryption/lib/crypt.php
+++ b/apps/files_encryption/lib/crypt.php
@@ -43,22 +43,22 @@ class OC_Crypt {
self::init($params['uid'],$params['password']);
}
- public static function init($login,$password) {
- $view1=new OC_FilesystemView('/');
- if(!$view1->file_exists('/'.$login)){
- $view1->mkdir('/'.$login);
- }
-
- $view=new OC_FilesystemView('/'.$login);
-
- OC_FileProxy::$enabled=false;
- if(!$view->file_exists('/encryption.key')){// does key exist?
- OC_Crypt::createkey($login,$password);
- }
- $key=$view->file_get_contents('/encryption.key');
- OC_FileProxy::$enabled=true;
- $_SESSION['enckey']=OC_Crypt::decrypt($key, $password);
- }
+ public static function init($login,$password) {
+ $view1=new OC_FilesystemView('/');
+ if(!$view1->file_exists('/'.$login)){
+ $view1->mkdir('/'.$login);
+ }
+
+ $view=new OC_FilesystemView('/'.$login);
+
+ OC_FileProxy::$enabled=false;
+ if(!$view->file_exists('/encryption.key')){// does key exist?
+ OC_Crypt::createkey($login,$password);
+ }
+ $key=$view->file_get_contents('/encryption.key');
+ OC_FileProxy::$enabled=true;
+ $_SESSION['enckey']=OC_Crypt::decrypt($key, $password);
+ }
/**
@@ -140,7 +140,7 @@ class OC_Crypt {
public static function decrypt( $content, $key='') {
$bf = self::getBlowfish($key);
$data=$bf->decrypt($content);
- return rtrim($data, "\0");
+ return $data;
}
/**
@@ -181,6 +181,9 @@ class OC_Crypt {
while (!feof($handleread)) {
$content = fread($handleread, 8192);
$enccontent=OC_CRYPT::decrypt( $content, $key);
+ if(feof($handleread)){
+ $enccontent=rtrim($enccontent, "\0");
+ }
fwrite($handlewrite, $enccontent);
}
fclose($handlewrite);
@@ -209,6 +212,6 @@ class OC_Crypt {
$result.=self::decrypt(substr($data,0,8192),$key);
$data=substr($data,8192);
}
- return $result;
+ return rtrim($result, "\0");
}
}
diff --git a/apps/files_encryption/lib/cryptstream.php b/apps/files_encryption/lib/cryptstream.php
index a698ee00335..56331cbf601 100644
--- a/apps/files_encryption/lib/cryptstream.php
+++ b/apps/files_encryption/lib/cryptstream.php
@@ -47,7 +47,6 @@ class OC_CryptStream{
$this->path=self::$sourceStreams[basename($path)]['path'];
}else{
$this->path=$path;
- OCP\Util::writeLog('files_encryption','open encrypted '.$path. ' in '.$mode,OCP\Util::DEBUG);
OC_FileProxy::$enabled=false;//disable fileproxies so we can open the source file
$this->source=self::$rootView->fopen($path,$mode);
OC_FileProxy::$enabled=true;
@@ -84,6 +83,9 @@ class OC_CryptStream{
}else{
$result='';
}
+ if($this->stream_eof()){
+ $result=rtrim($result, "\0");
+ }
return $result;
}
diff --git a/apps/files_encryption/tests/encryption.php b/apps/files_encryption/tests/encryption.php
index cf24a225d28..70aa1daf4c3 100644
--- a/apps/files_encryption/tests/encryption.php
+++ b/apps/files_encryption/tests/encryption.php
@@ -13,6 +13,7 @@ class Test_Encryption extends UnitTestCase {
$source=file_get_contents($file); //nice large text file
$encrypted=OC_Crypt::encrypt($source,$key);
$decrypted=OC_Crypt::decrypt($encrypted,$key);
+ $decrypted=rtrim($decrypted, "\0");
$this->assertNotEqual($encrypted,$source);
$this->assertEqual($decrypted,$source);
@@ -20,6 +21,7 @@ class Test_Encryption extends UnitTestCase {
$encrypted=OC_Crypt::encrypt($chunk,$key);
$this->assertEqual(strlen($chunk),strlen($encrypted));
$decrypted=OC_Crypt::decrypt($encrypted,$key);
+ $decrypted=rtrim($decrypted, "\0");
$this->assertEqual($decrypted,$chunk);
$encrypted=OC_Crypt::blockEncrypt($source,$key);
@@ -43,6 +45,7 @@ class Test_Encryption extends UnitTestCase {
$source=file_get_contents($file); //binary file
$encrypted=OC_Crypt::encrypt($source,$key);
$decrypted=OC_Crypt::decrypt($encrypted,$key);
+ $decrypted=rtrim($decrypted, "\0");
$this->assertEqual($decrypted,$source);
$encrypted=OC_Crypt::blockEncrypt($source,$key);
@@ -50,4 +53,20 @@ class Test_Encryption extends UnitTestCase {
$this->assertEqual($decrypted,$source);
}
+
+ function testBinary(){
+ $key=uniqid();
+
+ $file=__DIR__.'/binary';
+ $source=file_get_contents($file); //binary file
+ $encrypted=OC_Crypt::encrypt($source,$key);
+ $decrypted=OC_Crypt::decrypt($encrypted,$key);
+
+ $decrypted=rtrim($decrypted, "\0");
+ $this->assertEqual($decrypted,$source);
+
+ $encrypted=OC_Crypt::blockEncrypt($source,$key);
+ $decrypted=OC_Crypt::blockDecrypt($encrypted,$key);
+ $this->assertEqual($decrypted,$source);
+ }
}
diff --git a/apps/files_encryption/tests/stream.php b/apps/files_encryption/tests/stream.php
index b23805d60b0..4ffeb6210a9 100644
--- a/apps/files_encryption/tests/stream.php
+++ b/apps/files_encryption/tests/stream.php
@@ -50,7 +50,22 @@ class Test_CryptStream extends UnitTestCase {
$file=$this->tmpFiles[$id];
}
$stream=fopen($file,$mode);
- OC_CryptStream::$sourceStreams[$id]=array('path'=>'dummy','stream'=>$stream);
+ OC_CryptStream::$sourceStreams[$id]=array('path'=>'dummy'.$id,'stream'=>$stream);
return fopen('crypt://streams/'.$id,$mode);
}
+
+ function testBinary(){
+ $file=__DIR__.'/binary';
+ $source=file_get_contents($file);
+
+ $stream=$this->getStream('test','w');
+ fwrite($stream,$source);
+ fclose($stream);
+
+ $stream=$this->getStream('test','r');
+ $data=stream_get_contents($stream);
+ fclose($stream);
+ $this->assertEqual(strlen($data),strlen($source));
+ $this->assertEqual($source,$data);
+ }
}