aboutsummaryrefslogtreecommitdiff
path: root/Crypt/RSA/MathLoader.php
diff options
context:
space:
mode:
Diffstat (limited to 'Crypt/RSA/MathLoader.php')
-rw-r--r--Crypt/RSA/MathLoader.php135
1 files changed, 135 insertions, 0 deletions
diff --git a/Crypt/RSA/MathLoader.php b/Crypt/RSA/MathLoader.php
new file mode 100644
index 000000000..de6c94642
--- /dev/null
+++ b/Crypt/RSA/MathLoader.php
@@ -0,0 +1,135 @@
+<?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 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 <valyala@gmail.com>
+ * @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;
+ }
+}
+
+?>