+ for (i = 0; prptab[i]; i++)
+ XPUSHs(RET(prptab[i], "Catacomb::PRPClass"));
+
+keysize *
+keysz(p)
+ PRPClass *p
+ CODE:
+ RETVAL = p->ksz;
+ OUTPUT:
+ RETVAL
+
+char *
+name(p)
+ PRPClass *p
+ CODE:
+ RETVAL = p->name;
+ OUTPUT:
+ RETVAL
+
+UV
+blksz(p)
+ PRPClass *p
+ CODE:
+ RETVAL = p->blksz;
+ OUTPUT:
+ RETVAL
+
+PRP *
+init(p, k)
+ PRPClass *p
+ SV *k
+ PREINIT:
+ char *pp;
+ STRLEN len;
+ CODE:
+ pp = SvPV(k, len);
+ if (keysz(len, p->ksz) != len)
+ croak("key size mismatch");
+ RETVAL = sub_alloc(sizeof(PRP) + p->ctxsz);
+ RETVAL->c = p;
+ p->init(RETVAL + 1, pp, len);
+ OUTPUT:
+ RETVAL
+
+MODULE = Catacomb PACKAGE = Catacomb::PRP
+
+SV *
+DESTROY(p)
+ PRP *p
+ CODE:
+ sub_free(p, sizeof(PRP) + p->c->ctxsz);
+ XSRETURN_YES;
+
+SV *
+eblk(p, x)
+ PRP *p
+ SV *x
+ PREINIT:
+ char *pp;
+ STRLEN len;
+ CODE:
+ pp = SvPV(x, len);
+ if (len != p->c->blksz)
+ croak("block size mismatch");
+ RETVAL = NEWSV(0, p->c->blksz);
+ p->c->eblk(p + 1, pp, SvPVX(RETVAL));
+ SvPOK_on(RETVAL);
+ SvCUR_set(RETVAL, p->c->blksz);
+ OUTPUT:
+ RETVAL
+
+SV *
+dblk(p, x)
+ PRP *p
+ SV *x
+ PREINIT:
+ char *pp;
+ STRLEN len;
+ CODE:
+ pp = SvPV(x, len);
+ if (len != p->c->blksz)
+ croak("block size mismatch");
+ RETVAL = NEWSV(0, p->c->blksz);
+ p->c->dblk(p + 1, pp, SvPVX(RETVAL));
+ SvPOK_on(RETVAL);
+ SvCUR_set(RETVAL, p->c->blksz);
+ OUTPUT:
+ RETVAL
+
+PRPClass *
+class(p)
+ PRP *p
+ CODE:
+ RETVAL = p->c;
+ OUTPUT:
+ RETVAL
+
+MODULE = Catacomb PACKAGE = Catacomb::CipherClass
+
+PROTOTYPES: DISABLE
+
+gccipher *
+find(me, name)
+ SV *me
+ char *name
+ CODE:
+ RETVAL = (gccipher *)gcipher_byname(name);
+ OUTPUT:
+ RETVAL