1#!/usr/bin/perl 2 3use strict; 4BEGIN { 5 $| = 1; 6 $^W = 1; 7} 8use Test::More tests => 13; 9use Math::BigInt; 10use Crypt::DSA::Util qw( bin2mp mp2bin bitsize mod_exp mod_inverse ); 11 12my $string = "abcdefghijklmnopqrstuvwxyz-0123456789"; 13my $number = Math::BigInt->new( 14 '48431489725691895261376655659836964813311343' . 15 '892465012587212197286379595482592365885470777' 16); 17my $n = bin2mp($string); 18is( $n, $number, 'bin2mp is correct for long string' ); 19is( bitsize($number), 295, 'bitsize is correct for large number' ); 20is( bitsize($n), 295, 'bitsize is correct for large mp' ); 21is( mp2bin($n), $string, 'mp2bin is correct for large number' ); 22 23$string = "abcd"; 24$number = 1_633_837_924; 25$n = bin2mp($string); 26is( $n, $number, 'bin2mp is correct for short string' ); 27is( bitsize($number), 31, 'bitsize is correct for small number' ); 28is( bitsize($n), 31, 'bitsize is correct for small mp' ); 29is( mp2bin($n), $string, 'mp2bin is correct for small number' ); 30 31$string = ""; 32$number = 0; 33$n = bin2mp($string); 34is( $n, $number, 'bin2mp is correct for empty string' ); 35is( mp2bin($n), $string, 'mp2bin is correct for empty string' ); 36 37my ($n1, $n2, $n3, $n4) = map { 38 Math::BigInt->new($_) 39} qw{ 40 23098230958 41 35 42 10980295809854 43 5115018827600 44}; 45$number = mod_exp($n1, $n2, $n3); 46is( $number, $n4, 'mod_exp is correct' ); 47 48($n1, $n2, $n3) = map { 49 Math::BigInt->new($_) 50} qw{ 51 34093840983 52 23509283509 53 7281956166 54}; 55$number = mod_inverse($n1, $n2); 56is( $number, $n3, 'mod_inverse is correct' ); 57is( 1, ($n1*$number)%$n2, 'mod_inverse reverses correctly' ); 58