forked from GNUsocial/gnu-social
316 lines
9.2 KiB
PHP
316 lines
9.2 KiB
PHP
<?php
|
|
/**
|
|
* Crypt_RSA allows to do following operations:
|
|
* - key pair generation
|
|
* - encryption and decryption
|
|
* - signing and sign validation
|
|
*
|
|
* PHP versions 4 and 5
|
|
*
|
|
* LICENSE: This source file is subject to version 3.0 of the PHP license
|
|
* that is available through the world-wide-web at the following URI:
|
|
* http://www.php.net/license/3_0.txt. If you did not receive a copy of
|
|
* the PHP License and are unable to obtain it through the web, please
|
|
* send a note to license@php.net so we can mail you a copy immediately.
|
|
*
|
|
* @category Encryption
|
|
* @package Crypt_RSA
|
|
* @author Alexander Valyalkin <valyala@gmail.com>
|
|
* @copyright 2005 Alexander Valyalkin
|
|
* @license http://www.php.net/license/3_0.txt PHP License 3.0
|
|
* @version CVS: $Id: Key.php,v 1.6 2009/01/05 08:30:29 clockwerx Exp $
|
|
* @link http://pear.php.net/package/Crypt_RSA
|
|
*/
|
|
|
|
/**
|
|
* RSA error handling facilities
|
|
*/
|
|
require_once 'Crypt/RSA/ErrorHandler.php';
|
|
|
|
/**
|
|
* loader for RSA math wrappers
|
|
*/
|
|
require_once 'Crypt/RSA/MathLoader.php';
|
|
|
|
/**
|
|
* Crypt_RSA_Key class, derived from Crypt_RSA_ErrorHandler
|
|
*
|
|
* Provides the following functions:
|
|
* - getKeyLength() - returns bit key length
|
|
* - getExponent() - returns key exponent as binary string
|
|
* - getModulus() - returns key modulus as binary string
|
|
* - getKeyType() - returns type of the key (public or private)
|
|
* - toString() - returns serialized key as string
|
|
* - fromString($key_str) - static function; returns key, unserialized from string
|
|
* - isValid($key) - static function for validating of $key
|
|
*
|
|
* Example usage:
|
|
* // create new 1024-bit key pair
|
|
* $key_pair = new Crypt_RSA_KeyPair(1024);
|
|
*
|
|
* // get public key (its class is Crypt_RSA_Key)
|
|
* $key = $key_pair->getPublicKey();
|
|
*
|
|
* // get key length
|
|
* $len = $key->getKeyLength();
|
|
*
|
|
* // get modulus as string
|
|
* $modulus = $key->getModulus();
|
|
*
|
|
* // get exponent as string
|
|
* $exponent = $key->getExponent();
|
|
*
|
|
* // get string represenation of key (use it instead of serialization of Crypt_RSA_Key object)
|
|
* $key_in_str = $key->toString();
|
|
*
|
|
* // restore key object from string using 'BigInt' math wrapper
|
|
* $key = Crypt_RSA_Key::fromString($key_in_str, 'BigInt');
|
|
*
|
|
* // error check
|
|
* if ($key->isError()) {
|
|
* echo "error while unserializing key object:\n";
|
|
* $erorr = $key->getLastError();
|
|
* echo $error->getMessage(), "\n";
|
|
* }
|
|
*
|
|
* // validate key
|
|
* if (Crypt_RSA_Key::isValid($key)) echo 'valid key';
|
|
* else echo 'invalid key';
|
|
*
|
|
* // using factory() method instead of constructor (it returns PEAR_Error object on failure)
|
|
* $rsa_obj = &Crypt_RSA_Key::factory($modulus, $exp, $key_type);
|
|
* if (PEAR::isError($rsa_obj)) {
|
|
* echo "error: ", $rsa_obj->getMessage(), "\n";
|
|
* }
|
|
*
|
|
* @category Encryption
|
|
* @package Crypt_RSA
|
|
* @author Alexander Valyalkin <valyala@gmail.com>
|
|
* @copyright 2005 Alexander Valyalkin
|
|
* @license http://www.php.net/license/3_0.txt PHP License 3.0
|
|
* @version Release: @package_version@
|
|
* @link http://pear.php.net/package/Crypt_RSA
|
|
* @access public
|
|
*/
|
|
class Crypt_RSA_Key extends Crypt_RSA_ErrorHandler
|
|
{
|
|
/**
|
|
* Reference to math wrapper object, which is used to
|
|
* manipulate large integers in RSA algorithm.
|
|
*
|
|
* @var object of Crypt_RSA_Math_* class
|
|
* @access private
|
|
*/
|
|
var $_math_obj;
|
|
|
|
/**
|
|
* shared modulus
|
|
*
|
|
* @var string
|
|
* @access private
|
|
*/
|
|
var $_modulus;
|
|
|
|
/**
|
|
* exponent
|
|
*
|
|
* @var string
|
|
* @access private
|
|
*/
|
|
var $_exp;
|
|
|
|
/**
|
|
* key type (private or public)
|
|
*
|
|
* @var string
|
|
* @access private
|
|
*/
|
|
var $_key_type;
|
|
|
|
/**
|
|
* key length in bits
|
|
*
|
|
* @var int
|
|
* @access private
|
|
*/
|
|
var $_key_len;
|
|
|
|
/**
|
|
* Crypt_RSA_Key constructor.
|
|
*
|
|
* You should pass in the name of math wrapper, which will be used to
|
|
* perform different operations with big integers.
|
|
* See contents of Crypt/RSA/Math folder for examples of wrappers.
|
|
* Read docs/Crypt_RSA/docs/math_wrappers.txt for details.
|
|
*
|
|
* @param string $modulus key modulus
|
|
* @param string $exp key exponent
|
|
* @param string $key_type type of the key (public or private)
|
|
* @param string $wrapper_name wrapper to use
|
|
* @param string $error_handler name of error handler function
|
|
*
|
|
* @access public
|
|
*/
|
|
function Crypt_RSA_Key($modulus, $exp, $key_type, $wrapper_name = 'default', $error_handler = '')
|
|
{
|
|
// set error handler
|
|
$this->setErrorHandler($error_handler);
|
|
// try to load math wrapper $wrapper_name
|
|
$obj = &Crypt_RSA_MathLoader::loadWrapper($wrapper_name);
|
|
if ($this->isError($obj)) {
|
|
// error during loading of math wrapper
|
|
$this->pushError($obj); // push error object into error list
|
|
return;
|
|
}
|
|
$this->_math_obj = &$obj;
|
|
|
|
$this->_modulus = $modulus;
|
|
$this->_exp = $exp;
|
|
|
|
if (!in_array($key_type, array('private', 'public'))) {
|
|
$this->pushError('invalid key type. It must be private or public', CRYPT_RSA_ERROR_WRONG_KEY_TYPE);
|
|
return;
|
|
}
|
|
$this->_key_type = $key_type;
|
|
|
|
/* check length of modulus & exponent ( abs(modulus) > abs(exp) ) */
|
|
$mod_num = $this->_math_obj->bin2int($this->_modulus);
|
|
$exp_num = $this->_math_obj->bin2int($this->_exp);
|
|
|
|
if ($this->_math_obj->cmpAbs($mod_num, $exp_num) <= 0) {
|
|
$this->pushError('modulus must be greater than exponent', CRYPT_RSA_ERROR_EXP_GE_MOD);
|
|
return;
|
|
}
|
|
|
|
// determine key length
|
|
$this->_key_len = $this->_math_obj->bitLen($mod_num);
|
|
}
|
|
|
|
/**
|
|
* Crypt_RSA_Key factory.
|
|
*
|
|
* @param string $modulus key modulus
|
|
* @param string $exp key exponent
|
|
* @param string $key_type type of the key (public or private)
|
|
* @param string $wrapper_name wrapper to use
|
|
* @param string $error_handler name of error handler function
|
|
*
|
|
* @return object new Crypt_RSA_Key object on success or PEAR_Error object on failure
|
|
* @access public
|
|
*/
|
|
function factory($modulus, $exp, $key_type, $wrapper_name = 'default', $error_handler = '')
|
|
{
|
|
$obj = new Crypt_RSA_Key($modulus, $exp, $key_type, $wrapper_name, $error_handler);
|
|
if ($obj->isError()) {
|
|
// error during creating a new object. Retrurn PEAR_Error object
|
|
return $obj->getLastError();
|
|
}
|
|
// object created successfully. Return it
|
|
return $obj;
|
|
}
|
|
|
|
/**
|
|
* Calculates bit length of the key
|
|
*
|
|
* @return int bit length of key
|
|
* @access public
|
|
*/
|
|
function getKeyLength()
|
|
{
|
|
return $this->_key_len;
|
|
}
|
|
|
|
/**
|
|
* Returns modulus part of the key as binary string,
|
|
* which can be used to construct new Crypt_RSA_Key object.
|
|
*
|
|
* @return string modulus as binary string
|
|
* @access public
|
|
*/
|
|
function getModulus()
|
|
{
|
|
return $this->_modulus;
|
|
}
|
|
|
|
/**
|
|
* Returns exponent part of the key as binary string,
|
|
* which can be used to construct new Crypt_RSA_Key object.
|
|
*
|
|
* @return string exponent as binary string
|
|
* @access public
|
|
*/
|
|
function getExponent()
|
|
{
|
|
return $this->_exp;
|
|
}
|
|
|
|
/**
|
|
* Returns key type (public, private)
|
|
*
|
|
* @return string key type (public, private)
|
|
* @access public
|
|
*/
|
|
function getKeyType()
|
|
{
|
|
return $this->_key_type;
|
|
}
|
|
|
|
/**
|
|
* Returns string representation of key
|
|
*
|
|
* @return string key, serialized to string
|
|
* @access public
|
|
*/
|
|
function toString()
|
|
{
|
|
return base64_encode(
|
|
serialize(
|
|
array($this->_modulus, $this->_exp, $this->_key_type)
|
|
)
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Returns Crypt_RSA_Key object, unserialized from
|
|
* string representation of key.
|
|
*
|
|
* optional parameter $wrapper_name - is the name of math wrapper,
|
|
* which will be used during unserialization of this object.
|
|
*
|
|
* This function can be called statically:
|
|
* $key = Crypt_RSA_Key::fromString($key_in_string, 'BigInt');
|
|
*
|
|
* @param string $key_str RSA key, serialized into string
|
|
* @param string $wrapper_name optional math wrapper name
|
|
*
|
|
* @return object key as Crypt_RSA_Key object
|
|
* @access public
|
|
* @static
|
|
*/
|
|
function fromString($key_str, $wrapper_name = 'default')
|
|
{
|
|
list($modulus, $exponent, $key_type) = unserialize(base64_decode($key_str));
|
|
$obj = new Crypt_RSA_Key($modulus, $exponent, $key_type, $wrapper_name);
|
|
return $obj;
|
|
}
|
|
|
|
/**
|
|
* Validates key
|
|
* This function can be called statically:
|
|
* $is_valid = Crypt_RSA_Key::isValid($key)
|
|
*
|
|
* Returns true, if $key is valid Crypt_RSA key, else returns false
|
|
*
|
|
* @param object $key Crypt_RSA_Key object for validating
|
|
*
|
|
* @return bool true if $key is valid, else false
|
|
* @access public
|
|
*/
|
|
function isValid($key)
|
|
{
|
|
return (is_object($key) && strtolower(get_class($key)) === strtolower(__CLASS__));
|
|
}
|
|
}
|
|
|
|
?>
|