use strict;
use Test;
use Crypt::OpenSSL::RSA;
my $bignum_missing;
sub check_datum
{
my( $p_expected, $p_actual ) = @_;
ok( defined( $p_expected )
? $p_actual && $p_expected->equals( $p_actual )
: ! defined( $p_actual ) );
}
sub check_key_parameters # runs 8 tests
{
my( $p_rsa, $n, $e, $d, $p, $q, $dmp1, $dmq1, $iqmp ) = @_;
my( $rn, $re, $rd, $rp, $rq, $rdmp1, $rdmq1, $riqmp ) =
$p_rsa->get_key_parameters();
check_datum( $n, $rn );
check_datum( $e, $re );
check_datum( $d, $rd );
check_datum( $p, $rp );
check_datum( $q, $rq );
check_datum( $dmp1, $rdmp1 );
check_datum( $dmq1, $rdmq1 );
check_datum( $iqmp, $riqmp );
}
BEGIN
{
eval { require Crypt::OpenSSL::Bignum; };
$bignum_missing = $@;
if( $bignum_missing )
{
plan tests => 0;
}
else
{
plan test => 60;
}
}
unless( $bignum_missing )
{
my $ctx = Crypt::OpenSSL::Bignum::CTX->new();
my $one = Crypt::OpenSSL::Bignum->one();
my $p = Crypt::OpenSSL::Bignum->new_from_word(11);
my $q = Crypt::OpenSSL::Bignum->new_from_word(17);
my $e = Crypt::OpenSSL::Bignum->new_from_word(3);
my $d = Crypt::OpenSSL::Bignum->new_from_word(107);
my $n = $p->mul($q, $ctx);
my $dmp1 = $d->mod( $p->sub( $one ), $ctx );
my $dmq1 = $d->mod( $q->sub( $one ), $ctx );
my $iqmp = $q->mod_inverse( $p, $ctx );
my $rsa = Crypt::OpenSSL::RSA->new_key_from_parameters
($n, $e, $d, $p, $q );
ok( $rsa );
$rsa->use_no_padding();
my $plaintext = pack('C*', 10);
my $ciphertext = pack('C*', 65);
check_key_parameters( $rsa, $n, $e, $d, $p, $q, $dmp1, $dmq1, $iqmp );
ok( $rsa->encrypt($plaintext) eq $ciphertext );
ok( $rsa->decrypt($ciphertext) eq $plaintext );
my $rsa_pub = Crypt::OpenSSL::RSA->
new_public_key( $rsa->get_public_key_string() );
my @pub_parameters = $rsa_pub->get_key_parameters();
ok( scalar( @pub_parameters ) == 8 );
check_key_parameters( $rsa_pub, $n, $e );
$rsa = Crypt::OpenSSL::RSA->new_key_from_parameters($n, $e, $d, $p );
check_key_parameters( $rsa, $n, $e, $d, $p, $q, $dmp1, $dmq1, $iqmp );
$rsa = Crypt::OpenSSL::RSA->new_key_from_parameters
($n, $e, $d, undef, $q );
check_key_parameters( $rsa, $n, $e, $d, $p, $q, $dmp1, $dmq1, $iqmp );
$rsa = Crypt::OpenSSL::RSA->new_key_from_parameters($n, $e );
check_key_parameters( $rsa, $n, $e );
$rsa = Crypt::OpenSSL::RSA->new_key_from_parameters($n, $e, $d );
check_key_parameters( $rsa, $n, $e, $d );
$rsa = Crypt::OpenSSL::RSA->new_key_from_parameters($n, $e, undef, $p );
check_key_parameters( $rsa, $n, $e, $d, $p, $q, $dmp1, $dmq1, $iqmp );
}