Sophie

Sophie

distrib > Mandriva > 2010.0 > i586 > media > contrib-release > by-pkgid > 1264f65e12a1af0fcfcf5b8f1fc8980d > files > 8

php-pear-Crypt_RSA-1.0.0-10mdv2010.0.noarch.rpm

<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */

/**
 * Crypt_RSA allows to do following operations:
 *     - key pair generation
 *     - encryption and decryption
 *     - signing and sign validation
 *
 * This module requires the PHP BCMath extension.
 * See http://us2.php.net/manual/en/ref.bc.php for details.
 *
 * 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    1.0.0
 * @link       http://pear.php.net/package/Crypt_RSA
 */

/**
 * this is a test script, which checks functionality of
 * Crypt_RSA package with different math wrappers. It
 * checks such things as:
 *  - key generation,
 *  - encryption / decryption
 *  - signing / sign validation
 */

require_once 'Crypt/RSA.php';

/*
    uncomment one of the following lines to define math library,
    which will be used by Crypt_RSA.
    BCMath and BigInt are implemented now.
    It is easy to implement support of other math libraries.
    See contents of /RSA/MathClasses folder for examples.
    BigInt is much faster than BCMath.
*/
//define('MATH_LIBRARY', 'BigInt');
//define('MATH_LIBRARY', 'GMP');
define('MATH_LIBRARY', 'BCMath');

$errors = array();

echo "Start of testing Crypt_RSA package with [", MATH_LIBRARY, "] math library...\n";

///////////////////////////////////////////////
// test all functionality of Crypt_RSA_KeyPair class
///////////////////////////////////////////////
$key_pair = new Crypt_RSA_KeyPair(128, MATH_LIBRARY, 'check_error');

$public_key = $key_pair->getPublicKey();
$private_key = $key_pair->getPrivateKey();
$key_length = $key_pair->getKeyLength();

if ($key_length != 128) {
    $errors[] = "wrong result returned from Crypt_RSA_KeyPair::getKeyLength() function";
}

// try to generate 256-bit key pair
$key_pair->generate(256);

///////////////////////////////////////////////
// test all functionality of Crypt_RSA_Key class
///////////////////////////////////////////////
$rsa_obj = new Crypt_RSA(array(), MATH_LIBRARY, 'check_error');
$key_pair = new Crypt_RSA_KeyPair(8, MATH_LIBRARY, 'check_error'); // extra small key pair (8-bit ;) )

$public_key = $key_pair->getPublicKey();
$private_key = $key_pair->getPrivateKey();

// check the length of public key
if ($public_key->getKeyLength() != 8) {
    $errors[] = "wrong result returned from Crypt_RSA_Key::getKeyLength() function";
}

// construct copy of $public_key
$public_key1 = new Crypt_RSA_Key($public_key->getModulus(), $public_key->getExponent(), $public_key->getKeyType(), MATH_LIBRARY, 'check_error');

// serialize $private_key
$private_key_str = $private_key->toString();

// try to use $public_key1 for encryption and unserialized form
// $private_key_str key for decryption

$text = '1234567890';
$enc_text = $rsa_obj->encrypt($text, $public_key1);

$private_key = Crypt_RSA_Key::fromString($private_key_str, MATH_LIBRARY, 'check_error');
$text1 = $rsa_obj->decrypt($enc_text, $private_key);

if ($text != $text1) {
    $errors[] = "error in Crypt_RSA_Key class methods";
}

///////////////////////////////////////////////
// test all functionality of Crypt_RSA class
///////////////////////////////////////////////
// create Crypt_RSA object
$rsa_obj = new Crypt_RSA(array(), MATH_LIBRARY, 'check_error');

// create Crypt_RSA_KeyPair object
$key_pair = new Crypt_RSA_KeyPair(256, MATH_LIBRARY, 'check_error');

// check encrypting/decrypting function's behaviour
$params = array(
    'enc_key' => $key_pair->getPublicKey(),
    'dec_key' => $key_pair->getPrivateKey(),
);
$rsa_obj->setParams($params);

$text = '1234567890';
$enc_text = $rsa_obj->encrypt($text);
$text1 = $rsa_obj->decrypt($enc_text);

if ($text != $text1) {
    $errors[] = "error in encrypting/decrypting functions";
}

// check signing/sign validating
$params = array(
    'public_key' => $key_pair->getPublicKey(),
    'private_key' => $key_pair->getPrivateKey(),
);
$rsa_obj->setParams($params);

$text = '1234567890';
$sign = $rsa_obj->createSign($text);

if (!$rsa_obj->validateSign($text, $sign)) {
    $errors[] = "error in signing/sign validating functions with default hash function";
}

// check signing/sign validating with specific hash function
$params = array(
    'hash_func' => create_function('$text', 'return 0x1234;'), // silly hash function :)
);
$rsa_obj->setParams($params);
$text = '1234567890';
$sign = $rsa_obj->createSign($text);
if (!$rsa_obj->validateSign($text, $sign)) {
    $errors[] = "error in signing/sign validating functions with user specific hash function";
}

///////////////////////////////////////////////
// generate key with user-defined random generator.
///////////////////////////////////////////////
// use mt_rand function ( http://php.net/mt_rand ) as random generator
$key_pair->setRandomGenerator('mt_rand');
$key_pair->generate();

// try to encrypt/decrypt data with new keys
$params = array(
    'enc_key' => $key_pair->getPublicKey(),
    'dec_key' => $key_pair->getPrivateKey(),
);
$rsa_obj->setParams($params);

$text = '1234567890';
$enc_text = $rsa_obj->encrypt($text);
$text1 = $rsa_obj->decrypt($enc_text);
if ($text != $text1) {
    $errors[] = "error in encrypting/decrypting functions";
}

echo "end\n";

$errors_cnt = sizeof($errors);
echo "\nTotal number of errors: {$errors_cnt}\n";
if ($errors_cnt) {
    foreach ($errors as $key => $value) {
        echo "    {$value}\n";
    }
}
exit;

/**************************************/
function check_error(&$obj)
{
    if ($obj->isError()) {
        $error = $obj->getLastError();
        echo "error: ", $error->getMessage(), "\n";
//        var_dump($error->getBacktrace());
        exit;
    }
}

?>