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