3 # $Id: algorithms.xs,v 1.1 2004/04/02 18:04:01 mdw Exp $
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 #----- Revision history -----------------------------------------------------
30 # $Log: algorithms.xs,v $
31 # Revision 1.1 2004/04/02 18:04:01 mdw
35 MODULE = Catacomb PACKAGE = Catacomb::CipherClass
47 for (cc = ciphertab; *cc; cc++) {
48 if (strcmp((*cc)->name, name) == 0) {
49 RETVAL = (gccipher *)*cc;
63 for (cc = ciphertab; *cc; cc++)
64 XPUSHs(RET(*cc, "Catacomb::CipherClass"));
78 RETVAL = (char *)cc->name;
99 if (keysz(len, cc->keysz) != len) {
100 croak("bad key size %lu for cipher `%s'",
101 (unsigned long)len, cc->name);
103 RETVAL = cc->init(p, len);
107 MODULE = Catacomb PACKAGE = Catacomb::Cipher
124 p = SvPV(plain, len);
125 RETVAL = NEWSV(0, len ? len : 1);
126 c->ops->encrypt(c, p, SvPVX(RETVAL), len);
127 SvCUR_set(RETVAL, len);
140 p = SvPV(cipher, len);
141 RETVAL = NEWSV(0, len ? len : 1);
142 c->ops->decrypt(c, p, SvPVX(RETVAL), len);
143 SvCUR_set(RETVAL, len);
157 if (c->ops->c->blksz && len != c->ops->c->blksz) {
158 croak("IV for block cipher `%s' must be %lu",
159 c->ops->c->name, (unsigned long)c->ops->c->blksz);
175 RETVAL = (gccipher *)c->ops->c;
179 MODULE = Catacomb PACKAGE = Catacomb::HashClass
189 for (hc = hashtab; *hc; hc++) {
190 if (strcmp((*hc)->name, name) == 0) {
191 RETVAL = (gchash *)*hc;
205 for (hc = hashtab; *hc; hc++)
206 XPUSHs(RET(*hc, "Catacomb::HashClass"));
220 RETVAL = (char *)hc->name;
232 MODULE = Catacomb PACKAGE = Catacomb::Hash
250 h->ops->hash(h, p, len);
257 RETVAL = NEWSV(0, h->ops->c->hashsz);
258 h->ops->done(h, SvPVX(RETVAL));
259 SvCUR_set(RETVAL, h->ops->c->hashsz);
268 RETVAL = h->ops->copy(h);
276 RETVAL = (gchash *)h->ops->c;
280 MODULE = Catacomb PACKAGE = Catacomb::MACClass
290 for (mc = mactab; *mc; mc++) {
291 if (strcmp((*mc)->name, name) == 0) {
292 RETVAL = (gcMAC *)*mc;
306 for (mc = mactab; *mc; mc++)
307 XPUSHs(RET(*mc, "Catacomb::MACClass"));
329 RETVAL = (char *)mc->name;
342 if (keysz(len, mc->keysz) != len) {
343 croak("bad key size %lu for mac `%s'",
344 (unsigned long)len, mc->name);
346 RETVAL = mc->key(p, len);
350 MODULE = Catacomb PACKAGE = Catacomb::MAC
363 RETVAL = m->ops->init(m);
371 RETVAL = (gcMAC *)m->ops->c;
375 MODULE = Catacomb PACKAGE = Catacomb::Rand
382 if (!r->ops->misc(r, GRAND_CHECK, GRAND_SEEDUINT32))
383 croak("rng `%s' doesn't support `seedint'", r->ops->name);
384 r->ops->misc(r, GRAND_SEEDUINT32, seed);
395 if (!r->ops->misc(r, GRAND_CHECK, GRAND_SEEDBLOCK))
396 croak("rng `%s' doesn't support `seedblock'", r->ops->name);
398 r->ops->misc(r, GRAND_SEEDBLOCK, p, len);
406 if (!r->ops->misc(r, GRAND_CHECK, GRAND_SEEDMP))
407 croak("rng `%s' doesn't support `seedmp'", r->ops->name);
408 r->ops->misc(r, GRAND_SEEDMP, seed);
416 if (!r->ops->misc(r, GRAND_CHECK, GRAND_SEEDRAND))
417 croak("rng `%s' doesn't support `seedrand'", r->ops->name);
418 r->ops->misc(r, GRAND_SEEDRAND, seed);
425 RETVAL = r->ops->raw(r);
433 RETVAL = r->ops->word(r);
441 RETVAL = r->ops->byte(r);
449 RETVAL = r->ops->byte(r);
458 RETVAL = r->ops->range(r, limit);
468 RETVAL = mprand(MP_NEW, bits, r, or);
477 RETVAL = mprand_range(MP_NEW, limit, r, 0);
486 RETVAL = NEWSV(0, n ? n : 1);
487 r->ops->fill(r, SvPVX(RETVAL), n);
488 SvCUR_set(RETVAL, n);
497 RETVAL = (char *)r->ops->name;
513 RETVAL = r->ops->max;
517 MODULE = Catacomb PACKAGE = Catacomb::Rand::True
523 RETVAL = &rand_global;
531 RETVAL = rand_create();
539 r->ops->misc(r, RAND_GATE);
546 r->ops->misc(r, RAND_STRETCH);
558 r->ops->misc(r, RAND_KEY, p, len);
565 r->ops->misc(r, RAND_NOISESRC, &noise_source);
573 r->ops->misc(r, RAND_SEED, bits);
576 MODULE = Catacomb PACKAGE = Catacomb::Rand::Fib
583 RETVAL = MAKE(fibrand_create(seed), "Catacomb::Rand::Fib");
587 MODULE = Catacomb PACKAGE = Catacomb::Rand::LC
594 RETVAL = MAKE(lcrand_create(seed), "Catacomb::Rand::LC");
598 MODULE = Catacomb PACKAGE = Catacomb::Rand::DSA
609 RETVAL = dsarand_create(p, len);
618 r->ops->misc(r, DSARAND_PASSES, n);
627 sz = r->ops->misc(r, DSARAND_SEEDSZ);
628 RETVAL = NEWSV(0, sz ? sz : 1);
629 r->ops->misc(r, DSARAND_GETSEED, SvPVX(RETVAL));
630 SvCUR_set(RETVAL, sz);
635 MODULE = Catacomb PACKAGE = Catacomb::Rand::RC4
646 RETVAL = MAKE(rc4_rand(p, len), "Catacomb::Rand::RC4");
650 MODULE = Catacomb PACKAGE = Catacomb::Rand::SEAL
662 RETVAL = MAKE(seal_rand(p, len, n), "Catacomb::Rand::SEAL");
666 MODULE = Catacomb PACKAGE = Catacomb::Rand::MGF
673 RETVAL = findrand(mgftab, "Catacomb::Rand::MGF", name, k);
683 MODULE = Catacomb PACKAGE = Catacomb::Rand::Counter
690 RETVAL = findrand(ctrtab, "Catacomb::Rand::Counter", name, k);
700 MODULE = Catacomb PACKAGE = Catacomb::Rand::OFB
707 RETVAL = findrand(ofbtab, "Catacomb::Rand::OFB", name, k);
717 MODULE = Catacomb PACKAGE = Catacomb::Rand::Magic
725 #----- That's all, folks ----------------------------------------------------