Much wider support for Catacomb in all its glory.
[catacomb-perl] / Catacomb.pod
diff --git a/Catacomb.pod b/Catacomb.pod
new file mode 100644 (file)
index 0000000..d2b328c
--- /dev/null
@@ -0,0 +1,629 @@
+=head1 NAME
+
+Catacomb - cryptographic library
+
+=head1 SYNOPSIS
+
+    use Catacomb qw(:const :mp :random :pgen);
+
+    $x = Catacomb::MP->new($str, [$radix]);
+    $x = Catacomb::MP->new($i);
+    $x = Catacomb::MP->loadb($bytes);
+    $x = Catacomb::MP->loadl($bytes);
+    $x = Catacomb::MP->loadb2c($bytes);
+    $x = Catacomb::MP->loadl2c($bytes);
+    ($x, $rest) = Catacomb::MP->fromstring($str, [$radix]);
+    $x = mp($str, [$radix]);
+    $x = mp($i);
+    ($x, $rest) = mp_fromstring($str, [$radix]);
+    $a = $b + $c;
+    $a = $b - $c;
+    $a = $b * $c;
+    $a = $b / $c;
+    $a = $b % $c;
+    $a = $b ** $n;
+    $a = $b << $n;
+    $a = $b >> $n;
+    $a = $b & $c;
+    $a = $b | $c;
+    $a = $b ^ $c;
+    $a = ~$b;
+    $p = $b == $c;
+    $p = $b != $c;
+    $p = $b < $c;
+    $p = $b > $c;
+    $p = $b <= $c;
+    $p = $b >= $c;
+    $a = sqrt($b);
+    $a = -$b;
+    $a = $b->add($c);
+    $a = $b->sub($c);
+    $a = $b->mul($c);
+    ($q, $r) = $a->div($b);
+    $a = $b->exp($c);
+    $a = $b->sqr();
+    $a = $b->sqrt();
+    $a = $b->neg();
+    $a = $b->not();
+    $a = $b->not2c();
+    $a = $b->mod($c);
+    $p = $b->eq($c);
+    $cmp = $b->cmp($c);
+    $a = $b->and($c);
+    $a = $b->and2c($c);
+    $a = $b->or($c);
+    $a = $b->or2c($c);
+    $a = $b->xor($c);
+    $a = $b->xor2c($c);
+    $a = $b->nand($c);
+    $a = $b->nand2c($c);
+    $a = $b->nor($c);
+    $a = $b->nor2c($c);
+    $a = $b->not();
+    $a = $b->not2c();
+    $a = $b->lsl($n);
+    $a = $b->lsl2c($n);
+    $a = $b->lsr($n);
+    $a = $b->lsr2c($n);
+    $a = $b->setbit($n);
+    $a = $b->setbit2c($n);
+    $a = $b->clearbit($n);
+    $a = $b->clearbit2c($n);
+    $p = $b->testbit($n);
+    $p = $b->testbit2c($n);
+    $x = $y->copy(); # largely useless
+    $g = $a->gcd($b);
+    ($g, $u, $v) = $a->gcd($b);
+    ($s, $t) = $m->odd(); # m = 2^s t
+    $a = $p->modexp($x, $e);
+    $a = $p->modinv($b);
+    $r = $p->modsqrt($x);
+    $q = $n->jac($a);
+    $p = $x->primep([$rng]);
+    $nbits = $x->bits();
+    $nbytes = $x->octets();
+    $bytes = $x->storeb([$nbytes]);
+    $bytes = $x->storel([$nbytes]);
+    $bytes = $x->storeb2c([$nbytes]);
+    $bytes = $x->storel2c([$nbytes]);
+    $str = $x->tostring([$radix]);
+    $n = $x->toint();
+
+    $barrett = Catacomb::MP::Barrett->new($p);
+    $barrett = $p->barrett();
+    $p = $barrett->m();
+    $x = $barrett->reduce($y);
+    $a = $barrett->exp($x, $y);
+
+    $mont = Catacomb::MP::Mont->new($p);
+    $mont = $p->mont();
+    $r = $mont->r();
+    $r2 = $mont->r2();
+    $p = $mont->m();
+    $x = $mont->in($y);
+    $a = $mont->mul($x, $y);
+    $a = $mont->expr($x, $y);
+    $a = $mont->mexpr($x0, $e0, $x1, $e1, ...);
+    $x = $mont->reduce($y);
+    $x = $mont->out($y);
+    $a = $mont->exp($x, $y);
+    $a = $mont->mexp($x0, $e0, $x1, $e1, ...);
+
+    $reduce = Catacomb::MP::Reduce->new($p);
+    $reduce = $p->mkreduce();
+    $p = $reduce->m();
+    $x = $reduce->reduce($y);
+    $a = $barrett->exp($x, $y);
+
+    $crt = Catacomb::MP::CRT->new(@n);
+    $n = $crt->product();
+    @n = $crt->moduli();
+    $x = $crt->solve(@r);
+
+    $p = newprime($nbits, [$rng]);
+
+    $filt = Catacomb::MP::Prime::Filter->new($x);
+    $filt = $x->filter();
+    $rc = $filt->status();
+    $x = $filt->m();
+    $rc = $filt->step($n);
+    $rc = $filt->jump($jfilt);
+    $newfilt = $filt->muladd($mul, $add); # integers
+
+    $stepper = Catacomb::MP::Prime::Filter->stepper($step); # integer
+    $stepper = filterstepper($step);
+    $jumper = Catacomb::MP::Prime::Filter->stepper($jump); # MP
+    $jumper = filterjumper($jump);
+
+    $rabin = Catacomb::MP::Prime::Rabin->new($m);
+    $rabin = $p->rabin();
+    $m = $rabin->m();
+    $rc = $rabin->test($wit);
+    $n = $rabin->iters();
+    $n = Catacomb::MP::Prime::Rabin->ntests($bits);
+    $tester = Catacomb::MP::Prime::Rabin->tester();
+    $tester = $rabintester;
+
+    $events = Catacomb::MP::Prime::Gen::Proc->ev();
+    $events = Catacomb::MP::Prime::Gen::Proc->evspin();
+    $events = Catacomb::MP::Prime::Gen::Proc->subev();
+
+    $p = Catacomb::MP::Prime->gen
+      ($name, $x, $nsteps, $stepper, $ntests, $tester, [$events]);
+    $p = primegen
+      ($name, $x, $nsteps, $stepper, $ntests, $tester, [$events]);
+    if (($x, $j) = Catacomb::MP::Prime->strongprime_setup
+      ($name, $nbits, [$rng], [$nsteps], [$subevents])) {
+      $p = Catacomb::MP::Prime->gen
+        ($name, $x, $nsteps, $j, $ntests, $tester, [$events]);
+    }
+    ($p, @f) = Catacomb::MP::Prime->limlee
+      ($name, $qbits, $pbits, [$rng], [$on], [$oev], [$iev]);
+    ($p, @f) = limleegen
+      ($name, $qbits, $pbits, [$rng], [$on], [$oev], [$iev]);
+
+    package MyPrimeGenObject;
+    sub new { ... };
+    sub BEGIN { ... };
+    sub TRY { ... };
+    sub FAIL { ... };
+    sub PASS { ... };
+    sub DONE { ... };
+    sub ABORT { ... };
+    $name = $ev->name();
+    $x = $ev->m([$xx]);
+    $rng = $ev->rand();
+
+    $a = Catacomb::GF->new($x);
+    $a = Catacomb::GF->loadb($bytes);
+    $a = Catacomb::GF->loadl($bytes);
+    ($x, $rest) = Catacomb::GF->fromstring($str, [$radix]);
+    $a = gf($mp);
+    $a = gf($str);
+    $a = gf($i);
+    $a = gf_loadb($bytes);
+    $a = gf_loadl($bytes);
+    ($x, $rest) = gf_fromstring($str, [$radix]);
+    $x = mp($a);
+    $a = $b + $c;
+    $a = $b - $c; # same as +
+    $a = $b * $c;
+    $a = $b / $c;
+    $a = $b % $c;
+    $a = $b << $n;
+    $a = $b >> $n;
+    $a = $b & $c;
+    $a = $b | $c;
+    $a = $b ^ $c;
+    $a = ~$b;
+    $p = $b == $c;
+    $p = $b != $c;
+    $a = -$b; # does nothing
+    $a = $b->copy(); # largely pointless
+    $a = $b->add($c);
+    $a = $b->sub($c);
+    $a = $b->mul($c);
+    $a = $b->sqr();
+    ($q, $r) = $a->div($b);
+    $a = $b->lsl($n);
+    $a = $b->lsr($n);
+    $a = $b->and($c);
+    $a = $b->or($c);
+    $a = $b->xor($c);
+    $a = $b->nand($c);
+    $a = $b->nor($c);
+    $a = $b->setbit($n);
+    $a = $b->clearbit($n);
+    $g = $a->gcd($b);
+    ($g, $u, $v) = $a->gcd($b);
+    $p = $p->irreduciblep();
+    $a = $b->modinv($c);
+    $a = $b->modexp($c, $n);
+    # and all the Catacomb::MP methods
+
+    $F = Catacomb::Field->prime($p);
+    $F = Catacomb::Field->niceprime($p);
+    $F = Catacomb::Field->binpoly($p);
+    $F = Catacomb::Field->binnorm($p, $beta);
+    $F = Catacomb::Field->byname($name);
+    $F = $p->primefield();
+    $F = $p->niceprimefield();
+    $F = $p->binpolyfield();
+    $F = $p>binnormfield($beta);
+    $name = $F->name();
+    $ty = $F->type();
+    $info = $F->get();
+    $p = $F->samep($FF);
+    $q = $F->q();
+    $m = $F->m();
+    $nbits = $F->nbits();
+    $nbytes = $F-noctets();
+    $xi = $F->in($x);
+    $x = $F->out($xi);
+    $p = $F->zerop($xi);
+    $xi = $F->neg($yi);
+    $xi = $F->add($yi, $zi);
+    $xi = $F->sub($yi, $zi);
+    $xi = $F->mul($yi, $zi);
+    $xi = $F->div($yi, $zi);
+    $xi = $F->sqr($yi, $zi);
+    $xi = $F->inv($yi);
+    $xi = $F->reduce($yi);
+    $xi = $F->sqrt($yi);
+    $xi = $F->quadsolve($yi);
+    $xi = $F->dbl($yi);    
+    $xi = $F->tpl($yi);
+    $xi = $F->hlv($yi);
+    $e = Catacomb::Field::Elt->new($F, $x);
+    $e = $F->elt($x);
+    $e = $F->zero();
+    $e = $F->one();
+    $e = $F->rand([$rng]);
+    $F = $e->field();
+    $x = $e->value();
+    $str = $e->tostring([$radix]);
+    $e = $f->inv();
+    $e = $f + $g;
+    $e = $f - $g;
+    $e = $f * $g;
+    $e = $f / $g;
+    $e = $f ** $n;
+    $p = $f == $g;
+    $p = $f != $g;
+    $e = -$f;
+    $e = sqrt($f);
+    $p = $f->zerop();
+
+    $P = Catacomb::EC::Point->new([$x], [$y], [$z]);
+    ($P, $rest) = Catacomb::EC::Point->get($buf);
+    $p = $P->atinfp();
+    $x = $P->x();
+    $y = $P->y();
+    $z = $P->z();
+    $p = $P->eq($Q);
+    $buf = $P->put();
+    $str = $P->tostring();
+
+    $C = Catacomb::EC::Curve->prime($F, $a, $b);
+    $C = Catacomb::EC::Curve->primeproj($F, $a, $b);
+    $C = Catacomb::EC::Curve->bin($F, $a, $b);
+    $C = Catacomb::EC::Curve->binproj($F, $a, $b);
+    ($C, $G, $r, $h) = Catacomb::EC::Curve->getinfo($name);
+    $C = $F->primecurve($F, $a, $b);
+    $C = $F->primeprojcurve($F, $a, $b);
+    $C = $F->bincurve($F, $a, $b);
+    $C = $F->binprojcurve($F, $a, $b);
+    $name = $C->name();
+    $a = $C->a();
+    $b = $C->b();
+    $F = $C->field();
+    $info = $C->get();
+    $p = $C->samep($CC);
+    $bytes = $C->putraw($P);
+    ($pp, $rest) = $C->getraw($bytes);
+    $buf = $C->putraw($P);
+    ($P, $rest) = $C->getraw($buf);
+    $P = $C->neg($Q);
+    $P = $C->add($Q, $R);
+    $P = $C->dbl($Q);
+    $p = $C->check($P);
+    $P = $C->mul($Q, $n);
+    $P = $C->mmul($P0, $n0, $P1, $n1, ...);
+    $err = $C->checkinfo($G, $r, $h);
+    $Pi = $C->in($P);
+    $Pi = $C->fix($Pi);
+    $Pi = $C->ifind($xi);
+    $Pi = $C->ineg($Qi);
+    $Pi = $C->iadd($Qi, $Ri);
+    $Pi = $C->isub($Qi, $Ri);
+    $Pi = $C->idbl($Qi);
+    $p = $C->icheck($Pi);
+    $Pi = $C->imul($Qi, $n);
+    $Pi = $C->immul($Qi0, $n0, $Qi1, $n1, ...);
+    $P = $C->out($Pi);
+
+    $P = Catacomb::EC::Point->new($C, [$p]);
+    $P = Catacomb::EC::Point->new($C, $x, $y);
+    $P = $C->inf();
+    $P = $C->pt($p);
+    $P = $C->pt($x, $y);
+    $P = $C->find($x);
+    $P = $C->rand([$rng]);
+    $C = $P->curve();
+    $F = $P->field();
+    $P = $Q->point();
+    $p = $P->atinfp();
+    $x = $P->x();
+    $y = $P->y();
+    $p = $P->check();
+    $P = $Q->mul($n);
+    $P = $Q + $R;
+    $P = $Q - $R;
+    $P = $Q * $n;
+    $P = $n * $Q;
+    $p = $Q == $R;
+    $p = $Q != $R;
+    $P = -$Q;
+
+    $G = Catacomb::Group->prime($p, $g, $q);
+    $G = Catacomb::Group->binary($p, $g, $q);
+    $G = Catacomb::Group->ec($C, $G, $r, $h);
+    $G = Catacomb::Group->byname($name);
+    $G = $p->primegroup($g, $q);
+    $G = $p->binpolygroup($g, $q);
+    $G = $C->ecgroup($G, $r, $h);
+    $info = $G->get();
+    $a = $G->mexp($a0, $n0, $a1, $n1, ...);
+    $p = $G->samep($GG);
+    $r = $G->r();
+    $h = $G->h();
+    ($p, $err) = $G->check($rng);
+
+    $a = Catacomb::Group::Elt($G, [$x]);
+    $a = $G->elt([$x]);
+    $a = $G->id();
+    $g = $G->g();
+    $a = $G->fromint($x);
+    $a = $G->fromec($P);
+    ($a, $rest) = $G->frombuf($buf);
+    ($a, $rest) = $G->fromraw($buf);
+    ($a, $rest) = $G->fromstring($str);
+    $x = $a->toint();
+    $P = $a->toec();
+    $buf = $a->tobuf();
+    $buf = $a->toraw();
+    $str = $a->tostring();
+    $G = $a->group();
+    $p = $a->identp();
+    $p = $a->check();
+    $a = $b->exp($n);
+    $a = $b->inv();
+    $a = $b * $c;
+    $a = $b / $c;
+    $a = $b ** $n;
+    $p = $b == $c;
+    $p = $b != $c;
+
+    $pc = Catacomb::PRPClass->find($name);
+    $pc = $Catacomb::rijndael;
+    $ksz = $pc->keysz();
+    $name = $pc->name();
+    $blksz = $pc->blksz();
+    $ct = $pc->eblk($k, $pt);
+    $pt = $pc->eblk($k, $ct);
+    $P = $pc->init($k);
+    $ct = $P->eblk($pt);
+    $pt = $P->dblk($ct);
+    $pc = $P->class();
+
+    $cc = Catacomb::CipherClass->find($name);
+    $cc = $Catacomb::rijndael_cbc;
+    $ksz = $cc->keysz();
+    $name = $cc->name();
+    $blksz = $cc->blksz();
+    $ct = $cc->encrypt($k, $pt, [$iv]);
+    $pt = $cc->decrypt($k, $ct, [$iv]);
+    $c = $cc->init();
+    $ct = $c->encrypt($pt);
+    $pt = $c->decrypt($ct);
+    $c->setiv($iv);
+    $c->bdry();
+    $pc = $c->class();
+
+    $hc = Catacomb::HashClass->find($name);
+    $hc = $Catacomb::sha;
+    $hsz = $hc->hashsz();
+    $name = $hc->name();
+    $res = $hc->hash($msg);
+    $h = $hc->init();
+    $h->hash($buf); # as often as necessary
+    $hh = $h->copy();
+    $hc = $h->class();
+    $res = $h->done();
+
+    $mc = Catacomb::MACClass->find($name);
+    $mc = $Catacomb::sha_hmac;
+    $hsz = $mc->hashsz();
+    $ksz = $mc->keysz();
+    $name = $mc->name();
+    $t = $mc->mac($k, $msg);
+    $m = $mc->key($k);
+    $mc = $m->class();
+    $t = $m->hash($msg);
+    $h = $m->init();
+
+    $rng = Catacomb::Rand::True->new();
+    $rng = Catacomb::random;
+    $rng->gate();
+    $rng->stretch();
+    $rng->key($k);
+    $rng->noisesrc();
+    $rng->seed([$nbits]);
+
+    $rng = Catacomb::Rand::DSA->new($k);
+    $rng->passes($n);
+    $k = $rng->seed();
+
+    $rng = Catacomb::Rand::Fib->new($seed);
+    $rng = Catacomb::Rand::LC->new($seed);
+    $rng = Catacomb::Rand::RC4->new($k);
+    $rng = Catacomb::Rand::SEAL->new($k);
+    $rng = Catacomb::Rand::MGF->new($name, $k);
+    $rng = Catacomb::Rand::Counter->new($name, $k);
+    $rng = Catacomb::Rand::OFB->new($name, $k);
+    
+    $rng->seedint($i);
+    $rng->seedblock($buf);
+    $rng->seedmp($x);
+    $rng->seedrand($rng2);
+    $u = $rng->raw();
+    $u = $rng->word();
+    $b = $rng->byte();
+    $c = $rng->char();
+    $u = $rng->range($max);
+    $x = $rng->mp($nbits, [$or]);
+    $x = $rng->mprange($max);
+    $buf = $rng->fill($nbytes);
+    $name = $rng->name();
+    $f = $rng->flags();
+    $u = $rng->max();
+
+    ($p, $g, $q) = Catacomb::PubKey->gen_dh
+      ($ql, $pl, [$steps], [$r], [$events]);
+    ($p, $g, $q, @f) = Catacomb::PubKey->gen_limlee
+      ($ql, $pl, [$flags], [$steps], [$r], [$oevents], [$ievents]);
+    ($p, $g, $q, $seed, $count) = Catacomb::PubKey->gen_dsa
+      ($ql, $pl, [$steps], [$k], [$events]);
+
+    $dsapub = Catacomb::DSA::Public->new([$G, $p, $hunoz, $h, $rng]);
+    $dsapub = Catacomb::DSA::Public->new
+      ({ G => $G, p => $p, h => $h, rng => $rng});
+    $h = $dsapub->beginhash();
+    $dsapub->endhash($h);
+    $p = $dsapub->verify($msg, $r, $s);
+
+    $dsapriv = Catacomb::DSA::Private->new([$G, $p, $u, $h, $rng]);
+    ($r, $s) = $dsapriv->sign($msg, [$k]);
+
+    $kcdsapub = Catacomb::KCDSA::Public->new([$G, $p, $hunoz, $h, $rng]);
+    $h = $kcdsapub->beginhash();
+    $kcdsapub->endhash($h);
+    $p = $kcdsapub->verify($msg, $r, $s);
+
+    $kcdsapriv = Catacomb::KCDSA::Private->new([$G, $p, $u, $h, $rng]);
+    ($r, $s) = $kcdsapriv->sign($msg, [$k]);
+
+    $p1pad = Catacomb::RSA::PKCS1Crypt->new([$ep, $rng]);
+    $p1pad = Catacomb::RSA::PKCS1Sign->new([$ep, $rng]);
+    $oaeppad = Catacomb::RSA::OAEP->new([$c, $h, $ep, $rng]);
+    $psspad = Catacomb::RSA::PSS->new([$c, $h, $ssz, $rng]);
+    $x = $pad->pad($m, $sz, $nbits);
+    $m = $cryptpad->unpad($m, $sz, $nbits);
+    $m = $sigpad->unpad($s, $m, $sz, $nbits);
+
+    $rsapub = Catacomb::RSA::Public->new([$n, $e]);
+    $rsapub = Catacomb::RSA::Public->new({ n => $n, e => $e });
+    $n = $rsapub->n();
+    $h = $rsapub->extract();
+    $x = $rsapub->op($y);
+    $c = $rsapub->encrypt($cryptpad, $m);
+    $rc = $rsapub->verify($signpad, $s, [$m]);
+
+    $rsapriv = Catacomb::RSA::Private->new
+      ([$n, $e, $d, $p, $q, $dp, $dq, $qi]);
+    $rsapriv = Catacomb::RSA::Public->new
+      ({ n => $n, e => $e, d => $d, 
+         p => $p, q => $q, dp => $dp, dq => $dq, qi => $qi });
+    $rsapriv = Catacomb::RSA::Private->generate
+      ($nbits, [$rng], [$steps], [$events]);
+    $n = $rsapriv->n();
+    $h = $rsapriv->extract();
+    $x = $rsapriv->op($y, [$rng]);
+    $m = $rsapriv->decrypt($cryptpad, $c, [$rng]);
+    $s = $rsapriv->sign($signpad, $m, [$rng]);
+
+    $s = Catacomb::Share::GF->new($t, $sz);
+    $sz = $s->sz();
+    $t = $s->t();
+    $i = $s->i();
+    $s->mkshares($secret, [$rng]);
+    $share = $s->get($i);
+    $left = $s->add($i, $share);
+    $secret = $s->combine();
+
+    $s = Catacomb::Share::Prime->new($t, [$p]);
+    $p = $s->p();
+    $t = $s->t();
+    $i = $s->i();
+    $s->mkshares($secret, [$rng]);
+    $share = $s->get($i);
+    $left = $s->add($i, $share);
+    $secret = $s->combine();
+
+    $pp = Catacomb::Passphrase->read($tag, [$len]);
+    $pp = Catacomb::Passphrase->verify($tag, [$len]);
+    Catacomb::Passphrase->cancel($tag);
+
+    $ssz = $ksz->keysz($sz);
+    @ksz = $ksz->expand();
+
+    $kf = Catacomb::Key::File->new($name, [$kopen], [$reporter]);
+    $p = $kf->merge($name, $fh, [$reporter]);
+    $p = $kf->extract($key, $fh, [$kfilt]);
+    $kwriteerr = $kf->save();
+    $i = $kf->iterate();
+    $key = $i->next();
+
+    $key = $kf->bytype($kf, $type);
+    $key = $kf->byid($kf, $id);
+    $key = $kf->bytag($kf, $tag);
+    $key = $kf->newkey($kf, $id, $type, $exp);
+    ($key, $kd, $ftag) = $kf->qtag($qtag);
+    $p = $key->chkident($id);
+    $p = $key->chkcomment($id);
+    $exp = $key->exp();
+    $exp = $key->del();
+    $comm = $key->comment();
+    $id = $key->id();
+    $tag = $key->tag();
+    $type = $key->type();
+    $p = $key->setcomment($comm);
+    $p = $key->settag($tag);
+    $p = $key->delete();
+    $ftag = $key->fulltag();
+    $v = $key->getattr($a);
+    $p = $key->putattr($a, $v);
+    $p = $key->expiredp();
+    $p = $key->used();
+    $p = $key->fingerprint($h, [$kfilt]);
+    $Catacomb::Key::error;
+    $str = Catacomb::Key->strerror($errnum);
+    $ah = $key->attrs(); # returns hashref
+    $i = $key->attriter();
+    ($a, $v) = $i->next();
+
+    $kfilt = Catacomb::Key::Filter->new($f, $m);
+    $kfilt = Catacomb::Key::Filter->new($fstr);
+    $fstr = $kfilt->tostring();
+    $f = $kfilt->f();
+    $m = $kfilt->m();
+
+    $kd = Catacomb::Key::Data->new();
+    ($kd, $rest) = Catacomb::Key::Data->read($str);
+    $kd = Catacomb::Key::Data->decode($buf);
+    $kd = $key->data();
+    $kd->setbinary($bin);
+    $kd->setencrypted($crypted);
+    $kd->setmp($x);
+    $kd->setstring($str);
+    $kd->setec($P);
+    $f = $kd->flags();
+    $bin = $kd->getbinary();
+    $crypted = $kd->getcrypted();
+    $x = $kd->getmp();
+    $str = $kd->getstring();
+    $P = $kd->getec();
+     $kd->setstruct();
+    $kkd = $kd->structfind($t);
+    $kkd = $kd->structcreate($t);
+    $kd->structdel($t);
+    $kh = $kd->structopen(); # returns hashref
+    $kkd = $kd->copy();
+    $kkd = $kd->lock($k);
+    $kkd = $kd->unlock($k);
+    $kkd = $kd->plock($tag);
+    $kkd = $kd->punlock($tag);
+    $str = $kd->write();
+    $buf = $kd->encode();
+    $i = $kd->structiter();
+
+=head1 DESCRIPTION
+
+=head1 SEE ALSO
+
+Catacomb(3).
+
+=head1 AUTHOR
+
+Mark Wooding, <mdw@nsict.org>