use strict; use Test; use Crypt::OpenSSL::Random; use Crypt::OpenSSL::RSA; BEGIN { plan tests => 11 } #suppress deprecation warnings sub no_warn { my $sub = shift; my $warn = $SIG{__WARN__}; $SIG{__WARN__} = sub { warn( @_ ) unless $_[0] =~ m/deprecated/i }; my $return = &$sub(); $SIG{__WARN__} = $warn; return $return; } # On platforms without a /dev/random, we need to manually seed. In # real life, the following would stink, but for testing purposes, it # suffices to seed with any old thing, even if it is not actually # random. We'll at least emulate seeding from Crypt::OpenSSL::Random, # which is what we would have to do in "real life", since the private # data used by the OpenSSL random library apparently does not span # across perl XS modules. Crypt::OpenSSL::Random::random_seed("Here are 20 bytes..."); Crypt::OpenSSL::RSA->import_random_seed(); my $rsa = no_warn( sub { Crypt::OpenSSL::RSA->new() } ); no_warn( sub { $rsa->generate_key(512) } ); ok( $rsa->size() * 8 == 512 ); no_warn( sub { $rsa->generate_key(1024) } ); ok( $rsa->size() * 8 == 1024 ); ok( $rsa->check_key() ); my ($ciphertext, $decoded_text); $rsa->use_no_padding(); my $plaintext = "X" x $rsa->size; ok( $ciphertext = $rsa->encrypt($plaintext) ); ok( $decoded_text = $rsa->decrypt($ciphertext) ); ok( $decoded_text eq $plaintext ); my $private_key_string = $rsa->get_private_key_string(); my $public_key_string = $rsa->get_public_key_string(); ok( $private_key_string and $public_key_string ); my $rsa_priv = no_warn( sub{ Crypt::OpenSSL::RSA->new(); } ); $rsa_priv->use_no_padding(); $rsa_priv->load_private_key( $private_key_string ); $decoded_text = $rsa_priv->decrypt($ciphertext); ok( $decoded_text eq $plaintext ); my $rsa_pub = no_warn( sub{ Crypt::OpenSSL::RSA->new(); } ); $rsa_pub->load_public_key($public_key_string); $rsa_pub->use_no_padding(); $ciphertext = $rsa_pub->encrypt($plaintext); $decoded_text = $rsa->decrypt($ciphertext); ok ($decoded_text eq $plaintext); # check subclassing eval { no_warn ( sub { Crypt::OpenSSL::RSA::Subpackage->new()->generate_key(256); } ) }; ok( !$@ ); eval { no_warn( sub { Crypt::OpenSSL::RSA::generate_key( {}, 256 ); } ) }; ok( $@ ); package Crypt::OpenSSL::RSA::Subpackage; use base qw( Crypt::OpenSSL::RSA );