fix encryption for binary files

This commit is contained in:
Robin Appelman 2012-06-15 23:48:39 +02:00
parent 0f2600e9ea
commit 9ba467d629
5 changed files with 51 additions and 6 deletions

View File

@ -44,7 +44,13 @@ class OC_Crypt {
}
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);
@ -133,7 +139,7 @@ class OC_Crypt {
public static function decrypt( $content, $key='') {
$bf = self::getBlowfish($key);
$data=$bf->decrypt($content);
return rtrim($data, "\0");
return $data;
}
/**
@ -174,6 +180,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);
@ -202,6 +211,6 @@ class OC_Crypt {
$result.=self::decrypt(substr($data,0,8192),$key);
$data=substr($data,8192);
}
return $result;
return rtrim($result, "\0");
}
}

View File

@ -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;
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -402,9 +402,9 @@ class OC_FilesystemView {
}
if($run and $storage=$this->getStorage($path)){
if(!is_null($extraParam)){
$result=$storage->$operation($interalPath,$extraParam);
$result=$storage->$operation($internalPath,$extraParam);
}else{
$result=$storage->$operation($interalPath);
$result=$storage->$operation($internalPath);
}
$result=OC_FileProxy::runPostProxies($operation,$this->getAbsolutePath($path),$result);
if(OC_Filesystem::$loaded and $this->fakeRoot==OC_Filesystem::getRoot()){