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);
234 RETVAL = NEWSV(0, len ? len : 1);
235 memset(SvPVX(RETVAL), 0, len);
236 c->ops->encrypt(c, SvPVX(RETVAL), SvPVX(RETVAL), len);
237 SvCUR_set(RETVAL, len);
250 p = SvPV(cipher, len);
251 RETVAL = NEWSV(0, len ? len : 1);
252 c->ops->decrypt(c, p, SvPVX(RETVAL), len);
253 SvCUR_set(RETVAL, len);
263 RETVAL = NEWSV(0, len ? len : 1);
264 memset(SvPVX(RETVAL), 0, len);
265 c->ops->decrypt(c, SvPVX(RETVAL), SvPVX(RETVAL), len);
266 SvCUR_set(RETVAL, len);
280 if (c->ops->c->blksz && len != c->ops->c->blksz) {
281 croak("IV for block cipher `%s' must be %lu",
282 c->ops->c->name, (unsigned long)c->ops->c->blksz);
298 RETVAL = (gccipher *)c->ops->c;
302 MODULE = Catacomb PACKAGE = Catacomb::HashClass
309 RETVAL = (gchash *)ghash_byname(name);
325 RETVAL = (char *)hc->name;
337 MODULE = Catacomb PACKAGE = Catacomb::Hash
355 h->ops->hash(h, p, len);
362 RETVAL = NEWSV(0, h->ops->c->hashsz);
363 h->ops->done(h, SvPVX(RETVAL));
364 SvCUR_set(RETVAL, h->ops->c->hashsz);
373 RETVAL = h->ops->copy(h);
381 RETVAL = (gchash *)h->ops->c;
385 MODULE = Catacomb PACKAGE = Catacomb::MACClass
392 RETVAL = (gcMAC *)gmac_byname(name);
400 const gcMAC *const *mc;
402 for (mc = gmactab; *mc; mc++)
403 XPUSHs(RET((gcMAC *)*mc, "Catacomb::MACClass"));
425 RETVAL = (char *)mc->name;
438 if (keysz(len, mc->keysz) != len) {
439 croak("bad key size %lu for mac `%s'",
440 (unsigned long)len, mc->name);
442 RETVAL = mc->key(p, len);
446 MODULE = Catacomb PACKAGE = Catacomb::MAC
459 RETVAL = m->ops->init(m);
467 RETVAL = (gcMAC *)m->ops->c;
471 MODULE = Catacomb PACKAGE = Catacomb::Rand
478 if (!r->ops->misc(r, GRAND_CHECK, GRAND_SEEDUINT32))
479 croak("rng `%s' doesn't support `seedint'", r->ops->name);
480 r->ops->misc(r, GRAND_SEEDUINT32, seed);
491 if (!r->ops->misc(r, GRAND_CHECK, GRAND_SEEDBLOCK))
492 croak("rng `%s' doesn't support `seedblock'", r->ops->name);
494 r->ops->misc(r, GRAND_SEEDBLOCK, p, len);
502 if (!r->ops->misc(r, GRAND_CHECK, GRAND_SEEDMP))
503 croak("rng `%s' doesn't support `seedmp'", r->ops->name);
504 r->ops->misc(r, GRAND_SEEDMP, seed);
512 if (!r->ops->misc(r, GRAND_CHECK, GRAND_SEEDRAND))
513 croak("rng `%s' doesn't support `seedrand'", r->ops->name);
514 r->ops->misc(r, GRAND_SEEDRAND, seed);
521 RETVAL = r->ops->raw(r);
529 RETVAL = r->ops->word(r);
537 RETVAL = r->ops->byte(r);
545 RETVAL = r->ops->byte(r);
554 RETVAL = r->ops->range(r, limit);
564 RETVAL = mprand(MP_NEW, bits, r, or);
573 RETVAL = mprand_range(MP_NEW, limit, r, 0);
582 RETVAL = NEWSV(0, n ? n : 1);
583 r->ops->fill(r, SvPVX(RETVAL), n);
584 SvCUR_set(RETVAL, n);
593 RETVAL = (char *)r->ops->name;
609 RETVAL = r->ops->max;
613 MODULE = Catacomb PACKAGE = Catacomb::Rand::True
619 RETVAL = &rand_global;
627 RETVAL = rand_create();
635 r->ops->misc(r, RAND_GATE);
642 r->ops->misc(r, RAND_STRETCH);
654 r->ops->misc(r, RAND_KEY, p, len);
661 r->ops->misc(r, RAND_NOISESRC, &noise_source);
669 r->ops->misc(r, RAND_SEED, bits);
672 MODULE = Catacomb PACKAGE = Catacomb::Rand::Fib
679 RETVAL = MAKE(fibrand_create(seed), "Catacomb::Rand::Fib");
683 MODULE = Catacomb PACKAGE = Catacomb::Rand::LC
690 RETVAL = MAKE(lcrand_create(seed), "Catacomb::Rand::LC");
694 MODULE = Catacomb PACKAGE = Catacomb::Rand::DSA
705 RETVAL = dsarand_create(p, len);
714 r->ops->misc(r, DSARAND_PASSES, n);
723 sz = r->ops->misc(r, DSARAND_SEEDSZ);
724 RETVAL = NEWSV(0, sz ? sz : 1);
725 r->ops->misc(r, DSARAND_GETSEED, SvPVX(RETVAL));
726 SvCUR_set(RETVAL, sz);
731 MODULE = Catacomb PACKAGE = Catacomb::Rand::RC4
742 RETVAL = MAKE(rc4_rand(p, len), "Catacomb::Rand::RC4");
746 MODULE = Catacomb PACKAGE = Catacomb::Rand::SEAL
758 RETVAL = MAKE(seal_rand(p, len, n), "Catacomb::Rand::SEAL");
762 MODULE = Catacomb PACKAGE = Catacomb::Rand::MGF
770 RETVAL = findrand(mgftab, "Catacomb::Rand::MGF", name, k);
774 MODULE = Catacomb PACKAGE = Catacomb::Rand::Counter
782 RETVAL = findrand(ctrtab, "Catacomb::Rand::Counter", name, k);
786 MODULE = Catacomb PACKAGE = Catacomb::Rand::OFB
794 RETVAL = findrand(ofbtab, "Catacomb::Rand::OFB", name, k);
798 MODULE = Catacomb PACKAGE = Catacomb::Rand::Magic
806 #----- That's all, folks ----------------------------------------------------