diff --git a/t/bignum.t b/t/bignum.t index 68776d9..883ebba 100644 --- a/t/bignum.t +++ b/t/bignum.t @@ -7,28 +7,30 @@ $INC{'Crypt/OpenSSL/Bignum.pm'} ? plan( tests => 64 ) : plan( skip_all => "Crypt::OpenSSL::Bignum required for bignum tests" ); +my @PARAM_NAMES = qw(n e d p q dmp1 dmq1 iqmp); + sub check_datum { - my ( $p_expected, $p_actual ) = @_; - ok( - defined($p_expected) - ? $p_actual && $p_expected->equals($p_actual) - : !defined($p_actual) - ); + my ( $p_expected, $p_actual, $name ) = @_; + if ( defined($p_expected) ) { + ok( $p_actual && $p_expected->equals($p_actual), $name ); + } + else { + is( $p_actual, undef, $name ); + } } sub check_key_parameters # runs 8 tests { - my ( $p_rsa, $n, $e, $d, $p, $q, $dmp1, $dmq1, $iqmp ) = @_; + my ( $p_rsa, $label, $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 ); + my @expected = ( $n, $e, $d, $p, $q, $dmp1, $dmq1, $iqmp ); + my @actual = ( $rn, $re, $rd, $rp, $rq, $rdmp1, $rdmq1, $riqmp ); + + for my $i ( 0 .. 7 ) { + check_datum( $expected[$i], $actual[$i], + "$label: $PARAM_NAMES[$i] matches expected" ); + } } { @@ -44,42 +46,42 @@ sub check_key_parameters # runs 8 tests my $iqmp = $q->mod_inverse( $p, $ctx ); my $rsa = Crypt::OpenSSL::RSA->new_key_from_parameters( $n, $e, $d, $p, $q ); - ok($rsa); + ok( $rsa, "new_key_from_parameters(n,e,d,p,q) returns an object" ); $rsa->use_no_padding(); my $plaintext = pack( 'C*', 100, 100, 100, 12 ); my $ciphertext = Crypt::OpenSSL::Bignum->new_from_bin($plaintext)->mod_exp( $e, $n, $ctx )->to_bin(); - check_key_parameters( $rsa, $n, $e, $d, $p, $q, $dmp1, $dmq1, $iqmp ); + check_key_parameters( $rsa, "full key", $n, $e, $d, $p, $q, $dmp1, $dmq1, $iqmp ); - ok( $rsa->encrypt($plaintext) eq $ciphertext ); - ok( $rsa->decrypt($ciphertext) eq $plaintext ); + is( $rsa->encrypt($plaintext), $ciphertext, "encrypt produces expected ciphertext" ); + is( $rsa->decrypt($ciphertext), $plaintext, "decrypt recovers original plaintext" ); my $rsa_pub = Crypt::OpenSSL::RSA->new_public_key( $rsa->get_public_key_string() ); $rsa_pub->use_no_padding(); - ok( $rsa->private_encrypt($ciphertext) eq $plaintext ); - ok( $rsa_pub->public_decrypt($plaintext) eq $ciphertext ); + is( $rsa->private_encrypt($ciphertext), $plaintext, "private_encrypt produces expected plaintext" ); + is( $rsa_pub->public_decrypt($plaintext), $ciphertext, "public_decrypt produces expected ciphertext" ); my @pub_parameters = $rsa_pub->get_key_parameters(); - ok( scalar(@pub_parameters) == 8 ); + is( scalar(@pub_parameters), 8, "public key returns 8 parameters" ); - check_key_parameters( $rsa_pub, $n, $e ); + check_key_parameters( $rsa_pub, "public key", $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 ); + check_key_parameters( $rsa, "from (n,e,d,p)", $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 ); + check_key_parameters( $rsa, "from (n,e,d,undef,q)", $n, $e, $d, $p, $q, $dmp1, $dmq1, $iqmp ); $rsa = Crypt::OpenSSL::RSA->new_key_from_parameters( $n, $e ); - check_key_parameters( $rsa, $n, $e ); + check_key_parameters( $rsa, "from (n,e)", $n, $e ); $rsa = Crypt::OpenSSL::RSA->new_key_from_parameters( $n, $e, $d ); - check_key_parameters( $rsa, $n, $e, $d ); + check_key_parameters( $rsa, "from (n,e,d)", $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 ); + check_key_parameters( $rsa, "from (n,e,undef,p)", $n, $e, $d, $p, $q, $dmp1, $dmq1, $iqmp ); eval { Crypt::OpenSSL::RSA->new_key_from_parameters( @@ -87,7 +89,7 @@ sub check_key_parameters # runs 8 tests $e, $d, undef, $q ); }; - ok( $@ =~ /OpenSSL error: p not prime/ ); + like( $@, qr/OpenSSL error: p not prime/, "bad n with q triggers 'p not prime' error" ); #try again, to make sure the error queue was properly flushed eval { @@ -96,5 +98,5 @@ sub check_key_parameters # runs 8 tests $e, $d, undef, $q ); }; - ok( $@ =~ /OpenSSL error: p not prime/ ); + like( $@, qr/OpenSSL error: p not prime/, "error queue flushed: repeat triggers same error" ); }