* @copyright Alexander Valyalkin 2005 * @license http://www.php.net/license/3_0.txt PHP License 3.0 * @version CVS: $Id: MathLoader.php,v 1.5 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'; /** * Crypt_RSA_MathLoader class. * * Provides static function: * - loadWrapper($wrapper_name) - loads RSA math wrapper with name $wrapper_name * or most suitable wrapper if $wrapper_name == 'default' * * Example usage: * // load BigInt wrapper * $big_int_wrapper = Crypt_RSA_MathLoader::loadWrapper('BigInt'); * * // load BCMath wrapper * $bcmath_wrapper = Crypt_RSA_MathLoader::loadWrapper('BCMath'); * * // load the most suitable wrapper * $bcmath_wrapper = Crypt_RSA_MathLoader::loadWrapper(); * * @category Encryption * @package Crypt_RSA * @author Alexander Valyalkin * @copyright Alexander Valyalkin 2005 * @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_MathLoader { /** * Loads RSA math wrapper with name $wrapper_name. * Implemented wrappers can be found at Crypt/RSA/Math folder. * Read docs/Crypt_RSA/docs/math_wrappers.txt for details * * This is a static function: * // load BigInt wrapper * $big_int_wrapper = &Crypt_RSA_MathLoader::loadWrapper('BigInt'); * * // load BCMath wrapper * $bcmath_wrapper = &Crypt_RSA_MathLoader::loadWrapper('BCMath'); * * @param string $wrapper_name Name of wrapper * * @return object * Reference to object of wrapper with name $wrapper_name on success * or PEAR_Error object on error * * @access public */ function loadWrapper($wrapper_name = 'default') { static $math_objects = array(); // ordered by performance. GMP is the fastest math library, BCMath - the slowest. static $math_wrappers = array('GMP', 'BigInt', 'BCMath',); if (isset($math_objects[$wrapper_name])) { /* wrapper with name $wrapper_name is already loaded and created. Return reference to existing copy of wrapper */ return $math_objects[$wrapper_name]; } $err_handler = new Crypt_RSA_ErrorHandler(); if ($wrapper_name === 'default') { // try to load the most suitable wrapper $n = sizeof($math_wrappers); for ($i = 0; $i < $n; $i++) { $obj = Crypt_RSA_MathLoader::loadWrapper($math_wrappers[$i]); if (!$err_handler->isError($obj)) { // wrapper for $math_wrappers[$i] successfully loaded // register it as default wrapper and return reference to it return $math_objects['default'] = $obj; } } // can't load any wrapper $err_handler->pushError("can't load any wrapper for existing math libraries", CRYPT_RSA_ERROR_NO_WRAPPERS); return $err_handler->getLastError(); } $class_name = 'Crypt_RSA_Math_' . $wrapper_name; $class_filename = dirname(__FILE__) . '/Math/' . $wrapper_name . '.php'; if (!is_file($class_filename)) { $err_handler->pushError("can't find file [{$class_filename}] for RSA math wrapper [{$wrapper_name}]", CRYPT_RSA_ERROR_NO_FILE); return $err_handler->getLastError(); } include_once $class_filename; if (!class_exists($class_name)) { $err_handler->pushError("can't find class [{$class_name}] in file [{$class_filename}]", CRYPT_RSA_ERROR_NO_CLASS); return $err_handler->getLastError(); } // create and return wrapper object on success or PEAR_Error object on error $obj = new $class_name; if ($obj->errstr) { // cannot load required extension for math wrapper $err_handler->pushError($obj->errstr, CRYPT_RSA_ERROR_NO_EXT); return $err_handler->getLastError(); } return $math_objects[$wrapper_name] = $obj; } } ?>