5 # Interface to crypto algorithms
7 # (c) 2001 Straylight/Edgeware
10 #----- Licensing notice -----------------------------------------------------
12 # This file is part of the Perl interface to Catacomb.
14 # Catacomb/Perl is free software; you can redistribute it and/or modify
15 # it under the terms of the GNU General Public License as published by
16 # the Free Software Foundation; either version 2 of the License, or
17 # (at your option) any later version.
19 # Catacomb/Perl is distributed in the hope that it will be useful,
20 # but WITHOUT ANY WARRANTY; without even the implied warranty of
21 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 # GNU General Public License for more details.
24 # You should have received a copy of the GNU General Public License
25 # along with Catacomb/Perl; if not, write to the Free Software Foundation,
26 # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
28 MODULE = Catacomb PACKAGE = Catacomb::PRPClass
38 for (i = 0; prptab[i]; i++) {
39 if (strcmp(name, prptab[i]->name) == 0) {
53 for (i = 0; prptab[i]; i++)
54 XPUSHs(RET(prptab[i], "Catacomb::PRPClass"));
89 if (keysz(len, p->ksz) != len)
90 croak("key size mismatch");
91 RETVAL = sub_alloc(sizeof(PRP) + p->ctxsz);
93 p->init(RETVAL + 1, pp, len);
97 MODULE = Catacomb PACKAGE = Catacomb::PRP
103 sub_free(p, sizeof(PRP) + p->c->ctxsz);
115 if (len != p->c->blksz)
116 croak("block size mismatch");
117 RETVAL = NEWSV(0, p->c->blksz);
118 p->c->eblk(p + 1, pp, SvPVX(RETVAL));
120 SvCUR_set(RETVAL, p->c->blksz);
133 if (len != p->c->blksz)
134 croak("block size mismatch");
135 RETVAL = NEWSV(0, p->c->blksz);
136 p->c->dblk(p + 1, pp, SvPVX(RETVAL));
138 SvCUR_set(RETVAL, p->c->blksz);
150 MODULE = Catacomb PACKAGE = Catacomb::CipherClass
159 RETVAL = (gccipher *)gcipher_byname(name);
175 RETVAL = (char *)cc->name;
196 if (keysz(len, cc->keysz) != len) {
197 croak("bad key size %lu for cipher `%s'",
198 (unsigned long)len, cc->name);
200 RETVAL = cc->init(p, len);
204 MODULE = Catacomb PACKAGE = Catacomb::Cipher
221 p = SvPV(plain, len);
222 RETVAL = NEWSV(0, len ? len : 1);
223 c->ops->encrypt(c, p, SvPVX(RETVAL), len);
224 SvCUR_set(RETVAL, len);
237 p = SvPV(cipher, len);
238 RETVAL = NEWSV(0, len ? len : 1);
239 c->ops->decrypt(c, p, SvPVX(RETVAL), len);
240 SvCUR_set(RETVAL, len);
254 if (c->ops->c->blksz && len != c->ops->c->blksz) {
255 croak("IV for block cipher `%s' must be %lu",
256 c->ops->c->name, (unsigned long)c->ops->c->blksz);
272 RETVAL = (gccipher *)c->ops->c;
276 MODULE = Catacomb PACKAGE = Catacomb::HashClass
283 RETVAL = (gchash *)ghash_byname(name);
299 RETVAL = (char *)hc->name;
311 MODULE = Catacomb PACKAGE = Catacomb::Hash
329 h->ops->hash(h, p, len);
336 RETVAL = NEWSV(0, h->ops->c->hashsz);
337 h->ops->done(h, SvPVX(RETVAL));
338 SvCUR_set(RETVAL, h->ops->c->hashsz);
347 RETVAL = h->ops->copy(h);
355 RETVAL = (gchash *)h->ops->c;
359 MODULE = Catacomb PACKAGE = Catacomb::MACClass
366 RETVAL = (gcMAC *)gmac_byname(name);
374 const gcMAC *const *mc;
376 for (mc = gmactab; *mc; mc++)
377 XPUSHs(RET((gcMAC *)*mc, "Catacomb::MACClass"));
399 RETVAL = (char *)mc->name;
412 if (keysz(len, mc->keysz) != len) {
413 croak("bad key size %lu for mac `%s'",
414 (unsigned long)len, mc->name);
416 RETVAL = mc->key(p, len);
420 MODULE = Catacomb PACKAGE = Catacomb::MAC
433 RETVAL = m->ops->init(m);
441 RETVAL = (gcMAC *)m->ops->c;
445 MODULE = Catacomb PACKAGE = Catacomb::Rand
452 if (!r->ops->misc(r, GRAND_CHECK, GRAND_SEEDUINT32))
453 croak("rng `%s' doesn't support `seedint'", r->ops->name);
454 r->ops->misc(r, GRAND_SEEDUINT32, seed);
465 if (!r->ops->misc(r, GRAND_CHECK, GRAND_SEEDBLOCK))
466 croak("rng `%s' doesn't support `seedblock'", r->ops->name);
468 r->ops->misc(r, GRAND_SEEDBLOCK, p, len);
476 if (!r->ops->misc(r, GRAND_CHECK, GRAND_SEEDMP))
477 croak("rng `%s' doesn't support `seedmp'", r->ops->name);
478 r->ops->misc(r, GRAND_SEEDMP, seed);
486 if (!r->ops->misc(r, GRAND_CHECK, GRAND_SEEDRAND))
487 croak("rng `%s' doesn't support `seedrand'", r->ops->name);
488 r->ops->misc(r, GRAND_SEEDRAND, seed);
495 RETVAL = r->ops->raw(r);
503 RETVAL = r->ops->word(r);
511 RETVAL = r->ops->byte(r);
519 RETVAL = r->ops->byte(r);
528 RETVAL = r->ops->range(r, limit);
538 RETVAL = mprand(MP_NEW, bits, r, or);
547 RETVAL = mprand_range(MP_NEW, limit, r, 0);
556 RETVAL = NEWSV(0, n ? n : 1);
557 r->ops->fill(r, SvPVX(RETVAL), n);
558 SvCUR_set(RETVAL, n);
567 RETVAL = (char *)r->ops->name;
583 RETVAL = r->ops->max;
587 MODULE = Catacomb PACKAGE = Catacomb::Rand::True
593 RETVAL = &rand_global;
601 RETVAL = rand_create();
609 r->ops->misc(r, RAND_GATE);
616 r->ops->misc(r, RAND_STRETCH);
628 r->ops->misc(r, RAND_KEY, p, len);
635 r->ops->misc(r, RAND_NOISESRC, &noise_source);
643 r->ops->misc(r, RAND_SEED, bits);
646 MODULE = Catacomb PACKAGE = Catacomb::Rand::Fib
653 RETVAL = MAKE(fibrand_create(seed), "Catacomb::Rand::Fib");
657 MODULE = Catacomb PACKAGE = Catacomb::Rand::LC
664 RETVAL = MAKE(lcrand_create(seed), "Catacomb::Rand::LC");
668 MODULE = Catacomb PACKAGE = Catacomb::Rand::DSA
679 RETVAL = dsarand_create(p, len);
688 r->ops->misc(r, DSARAND_PASSES, n);
697 sz = r->ops->misc(r, DSARAND_SEEDSZ);
698 RETVAL = NEWSV(0, sz ? sz : 1);
699 r->ops->misc(r, DSARAND_GETSEED, SvPVX(RETVAL));
700 SvCUR_set(RETVAL, sz);
705 MODULE = Catacomb PACKAGE = Catacomb::Rand::RC4
716 RETVAL = MAKE(rc4_rand(p, len), "Catacomb::Rand::RC4");
720 MODULE = Catacomb PACKAGE = Catacomb::Rand::SEAL
732 RETVAL = MAKE(seal_rand(p, len, n), "Catacomb::Rand::SEAL");
736 MODULE = Catacomb PACKAGE = Catacomb::Rand::MGF
744 RETVAL = findrand(mgftab, "Catacomb::Rand::MGF", name, k);
748 MODULE = Catacomb PACKAGE = Catacomb::Rand::Counter
756 RETVAL = findrand(ctrtab, "Catacomb::Rand::Counter", name, k);
760 MODULE = Catacomb PACKAGE = Catacomb::Rand::OFB
768 RETVAL = findrand(ofbtab, "Catacomb::Rand::OFB", name, k);
772 MODULE = Catacomb PACKAGE = Catacomb::Rand::Magic
780 #----- That's all, folks ----------------------------------------------------