nextcloud/apps/files_encryption/lib/crypt.php

208 lines
5.7 KiB
PHP
Raw Normal View History

2011-08-07 19:32:48 +04:00
<?php
/**
* ownCloud
*
* @author Frank Karlitschek
* @copyright 2010 Frank Karlitschek karlitschek@kde.org
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library 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 along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
2011-08-10 19:24:38 +04:00
// Todo:
2011-08-20 13:53:14 +04:00
// - Crypt/decrypt button in the userinterface
// - Setting if crypto should be on by default
// - Add a setting "Don´t encrypt files larger than xx because of performance reasons"
// - Transparent decrypt/encrpt in filesystem.php. Autodetect if a file is encrypted (.encrypted extensio)
// - Don't use a password directly as encryption key. but a key which is stored on the server and encrypted with the user password. -> password change faster
// - IMPORTANT! Check if the block lenght of the encrypted data stays the same
2011-08-10 19:24:38 +04:00
2011-08-07 19:32:48 +04:00
require_once('Crypt_Blowfish/Blowfish.php');
/**
* This class is for crypting and decrypting
*/
class OC_Crypt {
2011-11-24 04:44:54 +04:00
static private $bf = null;
2011-08-07 19:32:48 +04:00
2011-11-24 04:44:54 +04:00
public static function loginListener($params){
self::init($params['uid'],$params['password']);
}
2011-08-10 19:24:38 +04:00
2011-08-11 19:49:36 +04:00
public static function init($login,$password) {
if(OC_User::isLoggedIn()){
2011-11-24 04:44:54 +04:00
$view=new OC_FilesystemView('/'.$login);
if(!$view->file_exists('/encryption.key')){// does key exist?
OC_Crypt::createkey($password);
2011-08-11 19:49:36 +04:00
}
2011-11-24 04:44:54 +04:00
$key=$view->file_get_contents('/encryption.key');
$_SESSION['enckey']=OC_Crypt::decrypt($key, $password);
2011-08-11 19:49:36 +04:00
}
}
2011-11-24 04:44:54 +04:00
/**
* get the blowfish encryption handeler for a key
* @param string $key (optional)
*
* if the key is left out, the default handeler will be used
*/
public static function getBlowfish($key=''){
if($key){
return new Crypt_Blowfish($key);
}else{
if(!isset($_SESSION['enckey'])){
return false;
}
if(!self::$bf){
self::$bf=new Crypt_Blowfish($_SESSION['enckey']);
}
return self::$bf;
}
}
2011-08-10 19:24:38 +04:00
2011-08-11 19:49:36 +04:00
public static function createkey($passcode) {
if(OC_User::isLoggedIn()){
// generate a random key
$key=mt_rand(10000,99999).mt_rand(10000,99999).mt_rand(10000,99999).mt_rand(10000,99999);
2011-08-10 19:24:38 +04:00
2011-08-11 19:49:36 +04:00
// encrypt the key with the passcode of the user
$enckey=OC_Crypt::encrypt($key,$passcode);
// Write the file
2011-11-24 04:44:54 +04:00
$username=OC_USER::getUser();
OC_FileProxy::$enabled=false;
$view=new OC_FilesystemView('/'.$username);
$view->file_put_contents('/encryption.key',$enckey);
OC_FileProxy::$enabled=true;
2011-08-11 19:49:36 +04:00
}
}
2011-11-24 04:44:54 +04:00
public static function changekeypasscode($oldPassword, $newPassword) {
2011-08-11 19:49:36 +04:00
if(OC_User::isLoggedIn()){
2011-11-24 04:44:54 +04:00
$username=OC_USER::getUser();
$view=new OC_FilesystemView('/'.$username);
2011-08-11 19:49:36 +04:00
// read old key
2011-11-24 04:44:54 +04:00
$key=$view->file_get_contents('/encryption.key');
2011-08-11 19:49:36 +04:00
// decrypt key with old passcode
2011-11-24 04:44:54 +04:00
$key=OC_Crypt::decrypt($key, $oldPassword);
2011-08-11 19:49:36 +04:00
// encrypt again with new passcode
2011-11-24 04:44:54 +04:00
$key=OC_Crypt::encrypt($key, $newPassword);
2011-08-11 19:49:36 +04:00
// store the new key
2011-11-24 04:44:54 +04:00
$view->file_put_contents('/encryption.key', $key );
2011-08-11 19:49:36 +04:00
}
2011-08-10 19:24:38 +04:00
}
2011-08-07 19:32:48 +04:00
/**
* @brief encrypts an content
* @param $content the cleartext message you want to encrypt
2011-11-24 04:44:54 +04:00
* @param $key the encryption key (optional)
2011-08-07 19:32:48 +04:00
* @returns encrypted content
*
* This function encrypts an content
*/
2011-11-24 04:44:54 +04:00
public static function encrypt( $content, $key='') {
$bf = self::getBlowfish($key);
2011-08-11 19:49:36 +04:00
return($bf->encrypt($content));
2011-08-07 19:32:48 +04:00
}
2011-11-24 04:44:54 +04:00
/**
* @brief decryption of an content
* @param $content the cleartext message you want to decrypt
* @param $key the encryption key (optional)
* @returns cleartext content
*
* This function decrypts an content
*/
public static function decrypt( $content, $key='') {
$bf = self::getBlowfish($key);
2011-08-10 19:24:38 +04:00
return($bf->encrypt($contents));
2011-11-24 04:44:54 +04:00
}
2011-08-07 19:32:48 +04:00
2011-10-21 19:02:11 +04:00
/**
* @brief encryption of a file
* @param $filename
* @param $key the encryption key
*
* This function encrypts a file
*/
2011-08-10 19:24:38 +04:00
public static function encryptfile( $filename, $key) {
$handleread = fopen($filename, "rb");
if($handleread<>FALSE) {
$handlewrite = fopen($filename.OC_Crypt::$encription_extension, "wb");
while (!feof($handleread)) {
$content = fread($handleread, 8192);
$enccontent=OC_CRYPT::encrypt( $content, $key);
fwrite($handlewrite, $enccontent);
}
fclose($handlewrite);
unlink($filename);
}
fclose($handleread);
}
/**
* @brief decryption of a file
* @param $filename
* @param $key the decryption key
*
* This function decrypts a file
*/
public static function decryptfile( $filename, $key) {
$handleread = fopen($filename.OC_Crypt::$encription_extension, "rb");
if($handleread<>FALSE) {
$handlewrite = fopen($filename, "wb");
while (!feof($handleread)) {
$content = fread($handleread, 8192);
$enccontent=OC_CRYPT::decrypt( $content, $key);
fwrite($handlewrite, $enccontent);
}
fclose($handlewrite);
unlink($filename.OC_Crypt::$encription_extension);
}
fclose($handleread);
}
2011-10-21 19:02:11 +04:00
/**
* encrypt data in 8192b sized blocks
*/
public static function blockEncrypt($data){
$result='';
while(strlen($data)){
$result=self::encrypt(substr($data,0,8192));
$data=substr($data,8192);
}
return $result;
}
/**
* decrypt data in 8192b sized blocks
*/
public static function blockDecrypt($data){
$result='';
while(strlen($data)){
$result=self::decrypt(substr($data,0,8192));
$data=substr($data,8192);
}
return $result;
}
2011-08-07 19:32:48 +04:00
}