diff options
Diffstat (limited to 'mod/openid_server/Crypt/RSA/Key.php')
| -rw-r--r-- | mod/openid_server/Crypt/RSA/Key.php | 314 | 
1 files changed, 314 insertions, 0 deletions
diff --git a/mod/openid_server/Crypt/RSA/Key.php b/mod/openid_server/Crypt/RSA/Key.php new file mode 100644 index 000000000..72a71e2d0 --- /dev/null +++ b/mod/openid_server/Crypt/RSA/Key.php @@ -0,0 +1,314 @@ +<?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__)); +    } +} + +?>  | 
