3 # $Id: algorithms.xs,v 1.2 2004/04/08 01:36:21 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 MODULE = Catacomb PACKAGE = Catacomb::CipherClass
40 for (cc = ciphertab; *cc; cc++) {
41 if (strcmp((*cc)->name, name) == 0) {
42 RETVAL = (gccipher *)*cc;
56 for (cc = ciphertab; *cc; cc++)
57 XPUSHs(RET(*cc, "Catacomb::CipherClass"));
71 RETVAL = (char *)cc->name;
92 if (keysz(len, cc->keysz) != len) {
93 croak("bad key size %lu for cipher `%s'",
94 (unsigned long)len, cc->name);
96 RETVAL = cc->init(p, len);
100 MODULE = Catacomb PACKAGE = Catacomb::Cipher
117 p = SvPV(plain, len);
118 RETVAL = NEWSV(0, len ? len : 1);
119 c->ops->encrypt(c, p, SvPVX(RETVAL), len);
120 SvCUR_set(RETVAL, len);
133 p = SvPV(cipher, len);
134 RETVAL = NEWSV(0, len ? len : 1);
135 c->ops->decrypt(c, p, SvPVX(RETVAL), len);
136 SvCUR_set(RETVAL, len);
150 if (c->ops->c->blksz && len != c->ops->c->blksz) {
151 croak("IV for block cipher `%s' must be %lu",
152 c->ops->c->name, (unsigned long)c->ops->c->blksz);
168 RETVAL = (gccipher *)c->ops->c;
172 MODULE = Catacomb PACKAGE = Catacomb::HashClass
182 for (hc = hashtab; *hc; hc++) {
183 if (strcmp((*hc)->name, name) == 0) {
184 RETVAL = (gchash *)*hc;
198 for (hc = hashtab; *hc; hc++)
199 XPUSHs(RET(*hc, "Catacomb::HashClass"));
213 RETVAL = (char *)hc->name;
225 MODULE = Catacomb PACKAGE = Catacomb::Hash
243 h->ops->hash(h, p, len);
250 RETVAL = NEWSV(0, h->ops->c->hashsz);
251 h->ops->done(h, SvPVX(RETVAL));
252 SvCUR_set(RETVAL, h->ops->c->hashsz);
261 RETVAL = h->ops->copy(h);
269 RETVAL = (gchash *)h->ops->c;
273 MODULE = Catacomb PACKAGE = Catacomb::MACClass
283 for (mc = mactab; *mc; mc++) {
284 if (strcmp((*mc)->name, name) == 0) {
285 RETVAL = (gcMAC *)*mc;
299 for (mc = mactab; *mc; mc++)
300 XPUSHs(RET(*mc, "Catacomb::MACClass"));
322 RETVAL = (char *)mc->name;
335 if (keysz(len, mc->keysz) != len) {
336 croak("bad key size %lu for mac `%s'",
337 (unsigned long)len, mc->name);
339 RETVAL = mc->key(p, len);
343 MODULE = Catacomb PACKAGE = Catacomb::MAC
356 RETVAL = m->ops->init(m);
364 RETVAL = (gcMAC *)m->ops->c;
368 MODULE = Catacomb PACKAGE = Catacomb::Rand
375 if (!r->ops->misc(r, GRAND_CHECK, GRAND_SEEDUINT32))
376 croak("rng `%s' doesn't support `seedint'", r->ops->name);
377 r->ops->misc(r, GRAND_SEEDUINT32, seed);
388 if (!r->ops->misc(r, GRAND_CHECK, GRAND_SEEDBLOCK))
389 croak("rng `%s' doesn't support `seedblock'", r->ops->name);
391 r->ops->misc(r, GRAND_SEEDBLOCK, p, len);
399 if (!r->ops->misc(r, GRAND_CHECK, GRAND_SEEDMP))
400 croak("rng `%s' doesn't support `seedmp'", r->ops->name);
401 r->ops->misc(r, GRAND_SEEDMP, seed);
409 if (!r->ops->misc(r, GRAND_CHECK, GRAND_SEEDRAND))
410 croak("rng `%s' doesn't support `seedrand'", r->ops->name);
411 r->ops->misc(r, GRAND_SEEDRAND, seed);
418 RETVAL = r->ops->raw(r);
426 RETVAL = r->ops->word(r);
434 RETVAL = r->ops->byte(r);
442 RETVAL = r->ops->byte(r);
451 RETVAL = r->ops->range(r, limit);
461 RETVAL = mprand(MP_NEW, bits, r, or);
470 RETVAL = mprand_range(MP_NEW, limit, r, 0);
479 RETVAL = NEWSV(0, n ? n : 1);
480 r->ops->fill(r, SvPVX(RETVAL), n);
481 SvCUR_set(RETVAL, n);
490 RETVAL = (char *)r->ops->name;
506 RETVAL = r->ops->max;
510 MODULE = Catacomb PACKAGE = Catacomb::Rand::True
516 RETVAL = &rand_global;
524 RETVAL = rand_create();
532 r->ops->misc(r, RAND_GATE);
539 r->ops->misc(r, RAND_STRETCH);
551 r->ops->misc(r, RAND_KEY, p, len);
558 r->ops->misc(r, RAND_NOISESRC, &noise_source);
566 r->ops->misc(r, RAND_SEED, bits);
569 MODULE = Catacomb PACKAGE = Catacomb::Rand::Fib
576 RETVAL = MAKE(fibrand_create(seed), "Catacomb::Rand::Fib");
580 MODULE = Catacomb PACKAGE = Catacomb::Rand::LC
587 RETVAL = MAKE(lcrand_create(seed), "Catacomb::Rand::LC");
591 MODULE = Catacomb PACKAGE = Catacomb::Rand::DSA
602 RETVAL = dsarand_create(p, len);
611 r->ops->misc(r, DSARAND_PASSES, n);
620 sz = r->ops->misc(r, DSARAND_SEEDSZ);
621 RETVAL = NEWSV(0, sz ? sz : 1);
622 r->ops->misc(r, DSARAND_GETSEED, SvPVX(RETVAL));
623 SvCUR_set(RETVAL, sz);
628 MODULE = Catacomb PACKAGE = Catacomb::Rand::RC4
639 RETVAL = MAKE(rc4_rand(p, len), "Catacomb::Rand::RC4");
643 MODULE = Catacomb PACKAGE = Catacomb::Rand::SEAL
655 RETVAL = MAKE(seal_rand(p, len, n), "Catacomb::Rand::SEAL");
659 MODULE = Catacomb PACKAGE = Catacomb::Rand::MGF
666 RETVAL = findrand(mgftab, "Catacomb::Rand::MGF", name, k);
676 MODULE = Catacomb PACKAGE = Catacomb::Rand::Counter
683 RETVAL = findrand(ctrtab, "Catacomb::Rand::Counter", name, k);
693 MODULE = Catacomb PACKAGE = Catacomb::Rand::OFB
700 RETVAL = findrand(ofbtab, "Catacomb::Rand::OFB", name, k);
710 MODULE = Catacomb PACKAGE = Catacomb::Rand::Magic
718 #----- That's all, folks ----------------------------------------------------