- my $mb = Catacomb::MP::Barrett->new($p);
- return $mb->exp($g, $x);
- }
-}
-
-sub modinv {
- croak("Usage: Catacomb::MP::modinv(p, x)") unless @_ == 2;
- my ($g, undef, $i) = gcd($_[0], $_[1]);
- croak("Arguments aren't coprime in Catacomb::MP::modinv") unless $g == 1;
- return $i;
-}
-
-#----- Binary polynomials ---------------------------------------------------
-
-package Catacomb::GF;
-use Carp;
-
-@ISA = qw(Catacomb::MP);
-
-use overload
- '+' => sub { _binop(\&add, @_); },
- '-' => sub { _binop(\&add, @_); },
- '*' => sub { _binop(\&mul, @_); },
- '/' => sub { _binop(\&div, @_); },
- '%' => sub { _binop(\&mod, @_); },
- '&' => sub { _binop(\&Catacomb::MP::and, @_); },
- '|' => sub { _binop(\&Catacomb::MP::or, @_); },
- '^' => sub { _binop(\&Catacomb::MP::xor, @_); },
- '>>' => sub { &Catacomb::MP::lsr(@_[0, 1]); },
- '<<' => sub { &Catacomb::MP::lsl(@_[0, 1]); },
- '~' => sub { &Catacomb::MP::not($_[0]) },
- '==' => sub { _binop(\&Catacomb::MP::eq, @_); },
- '<=>' => sub { _binop(\&Catacomb::MP::cmp, @_); },
- '""' => sub { "0x" . &Catacomb::MP::tostring($_[0], 16); },
- 'neg' => sub { $_[0]; },
- '0+' => sub { &Catacomb::MP::toint($_[0]); };
-
-sub mod { (&div($_[0], $_[1]))[1]; }
-
-sub _binop {
- my ($func, $a, $b, $flag) = @_;
- return $flag ? &$func($b, $a) : &$func($a, $b);
-}
-
-#----- Prime testing --------------------------------------------------------
-
-{
- my $cmpg = "Catacomb::MP::Prime::Gen";
- foreach my $i (qw(FilterStepper JumpStepper RabinTester)) {
- @{"${cmpg}::${i}::ISA"} = ("${cmpg}::MagicProc");
- }
- @{"${cmpg}::MagicProc::ISA"} = ("${cmpg}::Proc");
-}
-
-#----- Crypto algorithms ----------------------------------------------------
-
-package Catacomb;
-
-foreach my $i (qw(Cipher Hash MAC)) {
- my $tag = lc($i);
- my @v = ();
- my $cl = "Catacomb::${i}Class";
- foreach my $c (&{"${cl}::list"}($cl)) {
- my $x = $c->name(); $x =~ tr/a-zA-Z0-9/_/cs;
- ${"Catacomb::${i}::${x}"} = undef; # SUYB
- ${"Catacomb::${i}::${x}"} = $c;
- push(@v, "\$Catacomb::${i}::${x}");