-bootstrap Catacomb;
-
-@EXPORT_OK = qw($random);
-%EXPORT_TAGS = ("const" => [qw(GRAND_CRYPTO PGEN_TRY PGEN_FAIL PGEN_PASS
- PGEN_DONE PGEN_ABORT PGEN_BEGIN)]);
-Exporter::export_ok_tags("const");
-
-sub AUTOLOAD {
- my $val = const($AUTOLOAD);
- *$AUTOLOAD = sub { $val };
- goto &$AUTOLOAD;
-}
-
-#----- Multiprecision arithmetic --------------------------------------------
-
-package Catacomb::MP;
-use Carp;
-
-use overload
- '+' => sub { _binop(\&add, @_); },
- '-' => sub { _binop(\&sub, @_); },
- '*' => sub { _binop(\&mul, @_); },
- '/' => sub { _binop(\&div, @_); },
- '%' => sub { _binop(\&mod, @_); },
- '&' => sub { _binop(\&and, @_); },
- '|' => sub { _binop(\&or, @_); },
- '^' => sub { _binop(\&xor, @_); },
- '**' => sub { _binop(\&pow, @_); },
- '>>' => sub { &lsr(@_[0, 1]); },
- '<<' => sub { &lsl(@_[0, 1]); },
- '~' => sub { ¬($_[0]) },
- '==' => sub { _binop(\&eq, @_); },
- '<=>' => sub { _binop(\&cmp, @_); },
- '""' => sub { &tostring($_[0]); },
- '0+' => sub { &toint($_[0]); },
- 'sqrt' => sub { &sqrt($_[0]); },
- 'neg' => sub { &neg($_[0]); };
-
-sub mod { (&div($_[0], $_[1]))[1]; }
-
-sub pow {
- croak("Usage: Catacomb::MP::pow(a, b)") unless @_ == 2;
- my ($a, $b) = @_;
- my $r = Catacomb::MP->new(1);
- while ($b) {
- $r *= $a if $b & 1;
- $a = sqr($a);
- $b >>= 1;
- }
- return $r;
-}
-
-sub _binop {
- my ($func, $a, $b, $flag) = @_;
- return $flag ? &$func($b, $a) : &$func($a, $b);
-}
-
-sub modexp {
- croak("Usage: Catacomb::MP::modexp(p, g, x)") unless @_ == 3;
- my ($p, $g, $x) = @_;
- $g = $p - $g if $g < 0;
- $g = $g % $p if $g > $p;
- if ($p & 1) {
- my $mm = Catacomb::MP::Mont->new($p);
- return $mm->exp($g, $x);
+BEGIN { @EXPORT_OK = (); }
+
+use Catacomb::MP;
+use Catacomb::GF;
+use Catacomb::Field;
+use Catacomb::EC;
+use Catacomb::Group;
+use Catacomb::Rand;
+use Catacomb::Crypto;
+use Catacomb::Key;
+
+foreach $_ (qw(Catacomb::MP::mp Catacomb::GF::gf
+ Catacomb::MP::newprime
+ Catacomb::MP::mp_loadl Catacomb::MP::mp_loadb
+ Catacomb::MP::mp_loadl2c Catacomb::MP::mp_loadb2c
+ Catacomb::MP::mp_fromstring
+ Catacomb::GF::gf_loadl Catacomb::GF::gf_loadb
+ Catacomb::GF::gf_fromstring
+ Catacomb::MP::Prime::primegen
+ Catacomb::MP::Prime::limleegen
+ Catacomb::MP::Prime::Filter::filterstepper)) {
+ my $new;
+ my $proc;
+ if (m:^(.*)/(.*)$:) {
+ $proc = $1;
+ $new = $2;
+ } elsif (/:(\w+)$/) {
+ $new = $1;
+ $proc = $_;