<?php
class gksEncrypt {
/**
* Public key used for encryption
*
* @var resource
*/
private $public_key;
/**
* Private key used for encryption
*
* @var resource
*/
private $private_key;
/**
* Check the server configuration
*
*/
function __construct($public_key=null){
if (!in_array('openssl',get_loaded_extensions())){
throw new gksEncryptException(560);
}
if ($public_key){
$this->setPublicKey($public_key);
}
}
/**
* Assign the public key to encrypt
*
* @param string $key
*/
function setPublicKey($key){
$this->public_key = trim($key);
}
/**
* Assign the private key to encrypt
*
* @param string $key
*/
function setPrivateKey($key){
$this->private_key = trim($key);
}
/**
* Assign the private key to encrypt
*
* @param string $filename
*/
function getPublicKeyFromFile($filename){
if (!is_file($filename) || !is_readable($filename)){
throw new gksEncryptException(220);
}
$this->setPublicKey(file_get_contents($filename));
}
/**
* Assign the private key to encrypt
*
* @param string $filename
*/
function getPrivateKeyFromFile($filename){
if (!is_file($filename) || !is_readable($filename)){
throw new gksEncryptException(220);
}
$this->setPrivateKey(file_get_contents($filename));
}
/**
* Encrypt the data
*
* @param string $data
* @param string $public_key=''
* @return string
*/
function encrypt($data,$public_key=''){
if (!$public_key){
$public_key = $this->public_key;
}
if (!$public_key){
throw new gksEncryptException(564);
}
$result = @openssl_public_encrypt($data,$crypted,$public_key);
if (!$result){
$err = error_get_last();
throw new gksEncryptException(562,$err['message']);
}
return $crypted;
}
function decrypt($data,$private_key=''){
if (!$private_key){
$private_key = $this->private_key;
}
if (!$private_key){
throw new gksEncryptException(564);
}
$result = @openssl_private_decrypt($data,$dec,$private_key);
if (!$result){
$err = error_get_last();
throw new gksEncryptException(563,$err['message']);
}
return $dec;
}
/**
* Generate new private/public key pair
* returns through the
*
* @param $bits_count int
* @return array ('private'=>private_key string,'public'=>public_key string)
*/
static function generateKeys($bits_count=1024){
if (!function_exists('openssl_pkey_get_details')){
throw new gksEncryptException(565);
}
//generate public key
$params = array('digest_alg' => 'sha1','private_key_type'=>OPENSSL_KEYTYPE_RSA,'encrypt_key'=>false);
$private_key = openssl_pkey_new($params);
openssl_pkey_export($private_key,$private_key_string);
//generate certificate (to get a public key from it)
$csr = openssl_csr_new(array(), $private_key);
$cert = openssl_csr_sign($csr, null, $private_key, 1);
openssl_x509_export($cert, $str_cert);
//get the public key from the certificate
$public_key = openssl_pkey_get_public($str_cert);
//get the PEM-encoded public key
$public_key_details = openssl_pkey_get_details($public_key);
$public_key_string = $public_key_details['key'];
return array('private'=>$private_key_string,'public'=>$public_key_string);
}
// class end
}
class gksEncryptException extends Exception implements gksException{
/**
* Default error messages for the database errors
*
* @var array
*/
static private $error_codes=array(
220=>'Error opening file for reading',
560=>'OpenSSL not installed',
561=>'Key invalid',
562=>'Encryption error',
563=>'Decryption error',
564=>'No key to use',
565=>'PHP 5.2 or later with OpenSSL support required to generate keys',
);
/**
* Open ssl reported error message
*
* @var string
*/
public $openssl_error_message='';
/**
* Exception constructor
*
* @param int $code - error code from $curl_exception_codes
*/
public function __construct($code,$ssl_error=''){
//allow the framework to redefine the error messages
if (class_exists('_Config',false) && isset(_Config::$errors_file) && file_exists(_Config::$errors_file)){
self::$error_codes = include(_Config::$errors_file);
}
$message=self::$error_codes[$code];
parent::__construct($message, $code);
//set the error string
if ($ssl_error){
$this->openssl_error_message= (preg_match('~^(\w*\(\)) \[<a.*</a>]: (.*)~',$ssl_error,$found))
? $found[1].': '.$found[2]
:$ssl_error;
}
}
/**
* Getter for a string prepared to write to the log
*
* @return string
*/
public function getLogMessage(){
$log_string= 'Exception: '.$this->getMessage().' ('.$this->getCode().')'."\n";
if ($this->openssl_error_message){
$log_string.='Error: '.$this->openssl_error_message."\n";
}
$log_string.= 'TRACE:'."\n".$this->getTraceAsString()."\n";
return $log_string;
}
/**
* returns the exception dump in the readable format
*
* @return string
*/
public function getHtmlMessage(){
$message = 'Exception: '. nl2br ($this->message);
$trace = 'TRACE: <br />'. nl2br ($this->getTraceAsString());
if ($this->openssl_error_message){
$message .= "<br />\r\nError message: ".nl2br($this->openssl_error_message);
}
return '<p style="font-weignt: bold; padding: 10px;">'.$message."<br />\r\n".$trace.'</p>';
}
//class end
}
|