Much wider support for Catacomb in all its glory.
[catacomb-perl] / algorithms.xs
CommitLineData
660b443c 1# ---?---
2#
a1a90aaf 3# $Id$
660b443c 4#
5# Interface to crypto algorithms
6#
7# (c) 2001 Straylight/Edgeware
8#
9
10#----- Licensing notice -----------------------------------------------------
11#
12# This file is part of the Perl interface to Catacomb.
13#
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.
18#
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.
23#
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.
27
fcd15e0b 28MODULE = Catacomb PACKAGE = Catacomb::PRPClass
660b443c 29
fcd15e0b 30PRPClass *
660b443c 31find(me, name)
32 SV *me
33 char *name
fcd15e0b 34 PREINIT:
35 int i;
36 CODE:
37 RETVAL = 0;
38 for (i = 0; prptab[i]; i++) {
39 if (strcmp(name, prptab[i]->name) == 0) {
40 RETVAL = prptab[i];
41 break;
42 }
43 }
660b443c 44 OUTPUT:
45 RETVAL
46
47SV *
48list(me)
49 SV *me
50 PREINIT:
fcd15e0b 51 int i;
660b443c 52 PPCODE:
fcd15e0b 53 for (i = 0; prptab[i]; i++)
54 XPUSHs(RET(prptab[i], "Catacomb::PRPClass"));
55
56keysize *
57keysz(p)
58 PRPClass *p
59 CODE:
60 RETVAL = p->ksz;
61 OUTPUT:
62 RETVAL
63
64char *
65name(p)
66 PRPClass *p
67 CODE:
68 RETVAL = p->name;
69 OUTPUT:
70 RETVAL
71
72UV
73blksz(p)
74 PRPClass *p
75 CODE:
76 RETVAL = p->blksz;
77 OUTPUT:
78 RETVAL
79
80PRP *
81init(p, k)
82 PRPClass *p
83 SV *k
84 PREINIT:
85 char *pp;
86 STRLEN len;
87 CODE:
88 pp = SvPV(k, len);
89 if (keysz(len, p->ksz) != len)
90 croak("key size mismatch");
91 RETVAL = sub_alloc(sizeof(PRP) + p->ctxsz);
92 RETVAL->c = p;
93 p->init(RETVAL + 1, pp, len);
94 OUTPUT:
95 RETVAL
96
97MODULE = Catacomb PACKAGE = Catacomb::PRP
98
99SV *
100DESTROY(p)
101 PRP *p
102 CODE:
103 sub_free(p, sizeof(PRP) + p->c->ctxsz);
104 XSRETURN_YES;
105
106SV *
107eblk(p, x)
108 PRP *p
109 SV *x
110 PREINIT:
111 char *pp;
112 STRLEN len;
113 CODE:
114 pp = SvPV(x, len);
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));
119 SvPOK_on(RETVAL);
120 SvCUR_set(RETVAL, p->c->blksz);
121 OUTPUT:
122 RETVAL
123
124SV *
125dblk(p, x)
126 PRP *p
127 SV *x
128 PREINIT:
129 char *pp;
130 STRLEN len;
131 CODE:
132 pp = SvPV(x, len);
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));
137 SvPOK_on(RETVAL);
138 SvCUR_set(RETVAL, p->c->blksz);
139 OUTPUT:
140 RETVAL
141
142PRPClass *
143class(p)
144 PRP *p
145 CODE:
146 RETVAL = p->c;
147 OUTPUT:
148 RETVAL
149
150MODULE = Catacomb PACKAGE = Catacomb::CipherClass
151
152PROTOTYPES: DISABLE
153
154gccipher *
155find(me, name)
156 SV *me
157 char *name
158 CODE:
159 RETVAL = (gccipher *)gcipher_byname(name);
160 OUTPUT:
161 RETVAL
660b443c 162
163keysize *
164keysz(cc)
165 gccipher *cc
166 CODE:
167 RETVAL = cc->keysz;
168 OUTPUT:
169 RETVAL
170
171char *
172name(cc)
173 gccipher *cc
174 CODE:
175 RETVAL = (char *)cc->name;
176 OUTPUT:
177 RETVAL
178
179size_t
180blksz(cc)
181 gccipher *cc
182 CODE:
183 RETVAL = cc->blksz;
184 OUTPUT:
185 RETVAL
186
187gcipher *
188init(cc, k)
189 gccipher *cc
190 SV *k
191 PREINIT:
192 STRLEN len;
193 char *p;
194 CODE:
195 p = SvPV(k, len);
196 if (keysz(len, cc->keysz) != len) {
197 croak("bad key size %lu for cipher `%s'",
198 (unsigned long)len, cc->name);
199 }
200 RETVAL = cc->init(p, len);
201 OUTPUT:
202 RETVAL
203
204MODULE = Catacomb PACKAGE = Catacomb::Cipher
205
206SV *
207DESTROY(c)
208 gcipher *c
209 CODE:
210 c->ops->destroy(c);
fcd15e0b 211 XSRETURN_YES;
660b443c 212
213SV *
214encrypt(c, plain)
215 gcipher *c
216 SV *plain
217 PREINIT:
218 STRLEN len;
219 char *p;
220 CODE:
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);
225 SvPOK_on(RETVAL);
226 OUTPUT:
227 RETVAL
228
229SV *
230decrypt(c, cipher)
231 gcipher *c
232 SV *cipher
233 PREINIT:
234 STRLEN len;
235 char *p;
236 CODE:
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);
241 SvPOK_on(RETVAL);
242 OUTPUT:
243 RETVAL
244
245SV *
246setiv(c, iv)
247 gcipher *c
248 SV *iv
249 PREINIT:
250 STRLEN len;
251 char *p;
252 CODE:
253 p = SvPV(iv, 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);
257 }
258 c->ops->setiv(c, p);
fcd15e0b 259 XSRETURN_YES;
660b443c 260
261SV *
262bdry(c)
263 gcipher *c
264 CODE:
265 c->ops->bdry(c);
fcd15e0b 266 XSRETURN_YES;
660b443c 267
268gccipher *
269class(c)
270 gcipher *c
271 CODE:
272 RETVAL = (gccipher *)c->ops->c;
273 OUTPUT:
274 RETVAL
275
276MODULE = Catacomb PACKAGE = Catacomb::HashClass
277
278gchash *
279find(me, name)
280 SV *me
281 char *name
660b443c 282 CODE:
a1a90aaf 283 RETVAL = (gchash *)ghash_byname(name);
660b443c 284 OUTPUT:
285 RETVAL
286
660b443c 287size_t
288hashsz(hc)
289 gchash *hc
290 CODE:
291 RETVAL = hc->hashsz;
292 OUTPUT:
293 RETVAL
294
295char *
296name(hc)
297 gchash *hc
298 CODE:
299 RETVAL = (char *)hc->name;
300 OUTPUT:
301 RETVAL
302
303ghash *
304init(hc)
305 gchash *hc
306 CODE:
307 RETVAL = hc->init();
308 OUTPUT:
309 RETVAL
310
311MODULE = Catacomb PACKAGE = Catacomb::Hash
312
313SV *
314DESTROY(h)
315 ghash *h
316 CODE:
317 h->ops->destroy(h);
fcd15e0b 318 XSRETURN_YES;
660b443c 319
320SV *
321hash(h, sv)
322 ghash *h
323 SV *sv
324 PREINIT:
325 STRLEN len;
326 char *p;
327 CODE:
328 p = SvPV(sv, len);
329 h->ops->hash(h, p, len);
fcd15e0b 330 XSRETURN_YES;
660b443c 331
332SV *
333done(h)
334 ghash *h
335 CODE:
336 RETVAL = NEWSV(0, h->ops->c->hashsz);
337 h->ops->done(h, SvPVX(RETVAL));
338 SvCUR_set(RETVAL, h->ops->c->hashsz);
339 SvPOK_on(RETVAL);
340 OUTPUT:
341 RETVAL
342
343ghash *
344copy(h)
345 ghash *h
346 CODE:
347 RETVAL = h->ops->copy(h);
348 OUTPUT:
349 RETVAL
350
351gchash *
352class(h)
353 ghash *h
354 CODE:
355 RETVAL = (gchash *)h->ops->c;
356 OUTPUT:
357 RETVAL
358
359MODULE = Catacomb PACKAGE = Catacomb::MACClass
360
361gcMAC *
362find(me, name)
363 SV *me
364 char *name
660b443c 365 CODE:
a1a90aaf 366 RETVAL = (gcMAC *)gmac_byname(name);
660b443c 367 OUTPUT:
368 RETVAL
369
370SV *
371list(me)
372 SV *me
373 PREINIT:
a1a90aaf 374 const gcMAC *const *mc;
660b443c 375 PPCODE:
a1a90aaf 376 for (mc = gmactab; *mc; mc++)
377 XPUSHs(RET((gcMAC *)*mc, "Catacomb::MACClass"));
660b443c 378
379size_t
380hashsz(mc)
381 gcMAC *mc
382 CODE:
383 RETVAL = mc->hashsz;
384 OUTPUT:
385 RETVAL
386
387keysize *
388keysz(mc)
389 gcMAC *mc
390 CODE:
391 RETVAL = mc->keysz;
392 OUTPUT:
393 RETVAL
394
395char *
396name(mc)
397 gcMAC *mc
398 CODE:
399 RETVAL = (char *)mc->name;
400 OUTPUT:
401 RETVAL
402
403gMAC *
404key(mc, k)
405 gcMAC *mc
406 SV *k
407 PREINIT:
408 STRLEN len;
409 char *p;
410 CODE:
411 p = SvPV(k, len);
412 if (keysz(len, mc->keysz) != len) {
413 croak("bad key size %lu for mac `%s'",
414 (unsigned long)len, mc->name);
415 }
416 RETVAL = mc->key(p, len);
417 OUTPUT:
418 RETVAL
419
420MODULE = Catacomb PACKAGE = Catacomb::MAC
421
422SV *
423DESTROY(m)
424 gMAC *m
425 CODE:
426 m->ops->destroy(m);
fcd15e0b 427 XSRETURN_YES;
660b443c 428
429ghash *
430init(m)
431 gMAC *m
432 CODE:
433 RETVAL = m->ops->init(m);
434 OUTPUT:
435 RETVAL
436
437gcMAC *
438class(m)
439 gMAC *m
440 CODE:
441 RETVAL = (gcMAC *)m->ops->c;
442 OUTPUT:
443 RETVAL
444
445MODULE = Catacomb PACKAGE = Catacomb::Rand
446
447SV *
448seedint(r, seed)
449 grand *r
450 U32 seed
451 CODE:
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);
fcd15e0b 455 XSRETURN_YES;
660b443c 456
457SV *
458seedblock(r, seed)
459 grand *r
460 SV *seed
461 PREINIT:
462 STRLEN len;
463 char *p;
464 CODE:
465 if (!r->ops->misc(r, GRAND_CHECK, GRAND_SEEDBLOCK))
466 croak("rng `%s' doesn't support `seedblock'", r->ops->name);
467 p = SvPV(seed, len);
468 r->ops->misc(r, GRAND_SEEDBLOCK, p, len);
fcd15e0b 469 XSRETURN_YES;
660b443c 470
471SV *
472seedmp(r, seed)
473 grand *r
474 mp *seed
475 CODE:
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);
fcd15e0b 479 XSRETURN_YES;
660b443c 480
481SV *
482seedrand(r, seed)
483 grand *r
484 grand *seed
485 CODE:
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);
fcd15e0b 489 XSRETURN_YES;
660b443c 490
491U32
492raw(r)
493 grand *r
494 CODE:
495 RETVAL = r->ops->raw(r);
496 OUTPUT:
497 RETVAL
498
499U32
500word(r)
501 grand *r
502 CODE:
503 RETVAL = r->ops->word(r);
504 OUTPUT:
505 RETVAL
506
507U8
508byte(r)
509 grand *r
510 CODE:
511 RETVAL = r->ops->byte(r);
512 OUTPUT:
513 RETVAL
514
515char
516char(r)
517 grand *r
518 CODE:
519 RETVAL = r->ops->byte(r);
520 OUTPUT:
521 RETVAL
522
523U32
524range(r, limit)
525 grand *r
526 U32 limit
527 CODE:
528 RETVAL = r->ops->range(r, limit);
529 OUTPUT:
530 RETVAL
531
532mp *
533mp(r, bits, or = 0)
534 grand *r
535 unsigned or
536 unsigned bits
537 CODE:
538 RETVAL = mprand(MP_NEW, bits, r, or);
539 OUTPUT:
540 RETVAL
541
542mp *
543mprange(r, limit)
544 grand *r
545 mp *limit
546 CODE:
547 RETVAL = mprand_range(MP_NEW, limit, r, 0);
548 OUTPUT:
549 RETVAL
550
551SV *
552fill(r, n)
553 grand *r
554 size_t n
555 CODE:
556 RETVAL = NEWSV(0, n ? n : 1);
557 r->ops->fill(r, SvPVX(RETVAL), n);
558 SvCUR_set(RETVAL, n);
559 SvPOK_on(RETVAL);
560 OUTPUT:
561 RETVAL
562
563char *
564name(r)
565 grand *r
566 CODE:
567 RETVAL = (char *)r->ops->name;
568 OUTPUT:
569 RETVAL
570
571U32
572flags(r)
573 grand *r
574 CODE:
575 RETVAL = r->ops->f;
576 OUTPUT:
577 RETVAL
578
579U32
580max(r)
581 grand *r
582 CODE:
583 RETVAL = r->ops->max;
584 OUTPUT:
585 RETVAL
586
587MODULE = Catacomb PACKAGE = Catacomb::Rand::True
588
589Rand_True *
590_global(me)
591 SV *me
592 CODE:
593 RETVAL = &rand_global;
594 OUTPUT:
595 RETVAL
596
597Rand_True *
598rand(me)
599 SV *me
600 CODE:
601 RETVAL = rand_create();
602 OUTPUT:
603 RETVAL
604
605SV *
606gate(r)
607 Rand_True *r
608 CODE:
609 r->ops->misc(r, RAND_GATE);
fcd15e0b 610 XSRETURN_YES;
660b443c 611
612SV *
613stretch(r)
614 Rand_True *r
615 CODE:
616 r->ops->misc(r, RAND_STRETCH);
fcd15e0b 617 XSRETURN_YES;
660b443c 618
619SV *
620key(r, k)
621 Rand_True *r
622 SV *k
623 PREINIT:
624 STRLEN len;
625 char *p;
626 CODE:
627 p = SvPV(k, len);
628 r->ops->misc(r, RAND_KEY, p, len);
fcd15e0b 629 XSRETURN_YES;
660b443c 630
631SV *
632noisesrc(r)
633 Rand_True *r
634 CODE:
635 r->ops->misc(r, RAND_NOISESRC, &noise_source);
fcd15e0b 636 XSRETURN_YES;
660b443c 637
638SV *
639seed(r, bits = 160)
640 Rand_True *r
641 int bits
642 CODE:
643 r->ops->misc(r, RAND_SEED, bits);
fcd15e0b 644 XSRETURN_YES;
660b443c 645
646MODULE = Catacomb PACKAGE = Catacomb::Rand::Fib
647
648SV *
649new(me, seed)
650 SV *me
651 U32 seed
652 CODE:
653 RETVAL = MAKE(fibrand_create(seed), "Catacomb::Rand::Fib");
654 OUTPUT:
655 RETVAL
656
657MODULE = Catacomb PACKAGE = Catacomb::Rand::LC
658
659SV *
660new(me, seed)
661 SV *me
662 U32 seed
663 CODE:
664 RETVAL = MAKE(lcrand_create(seed), "Catacomb::Rand::LC");
665 OUTPUT:
666 RETVAL
667
668MODULE = Catacomb PACKAGE = Catacomb::Rand::DSA
669
670Rand_DSA *
671new(me, k)
672 SV *me
673 SV *k
674 PREINIT:
675 STRLEN len;
676 char *p;
677 CODE:
678 p = SvPV(k, len);
679 RETVAL = dsarand_create(p, len);
680 OUTPUT:
681 RETVAL
682
683SV *
684passes(r, n)
685 Rand_DSA *r
686 unsigned n
687 CODE:
688 r->ops->misc(r, DSARAND_PASSES, n);
fcd15e0b 689 XSRETURN_YES;
660b443c 690
691SV *
692seed(r)
693 Rand_DSA *r
694 PREINIT:
695 size_t sz;
696 CODE:
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);
701 SvPOK_on(RETVAL);
702 OUTPUT:
703 RETVAL
704
705MODULE = Catacomb PACKAGE = Catacomb::Rand::RC4
706
707SV *
708new(me, k)
709 SV *me
710 SV *k
711 PREINIT:
712 STRLEN len;
713 char *p;
714 CODE:
715 p = SvPV(k, len);
716 RETVAL = MAKE(rc4_rand(p, len), "Catacomb::Rand::RC4");
717 OUTPUT:
718 RETVAL
719
720MODULE = Catacomb PACKAGE = Catacomb::Rand::SEAL
721
722SV *
723new(me, k, n = 0)
724 SV *me
725 SV *k
726 U32 n
727 PREINIT:
728 STRLEN len;
729 char *p;
730 CODE:
731 p = SvPV(k, len);
732 RETVAL = MAKE(seal_rand(p, len, n), "Catacomb::Rand::SEAL");
733 OUTPUT:
734 RETVAL
735
736MODULE = Catacomb PACKAGE = Catacomb::Rand::MGF
737
738SV *
fcd15e0b 739new(me, name, k)
740 SV *me
660b443c 741 char *name
742 SV *k
743 CODE:
744 RETVAL = findrand(mgftab, "Catacomb::Rand::MGF", name, k);
745 OUTPUT:
746 RETVAL
747
660b443c 748MODULE = Catacomb PACKAGE = Catacomb::Rand::Counter
749
750SV *
fcd15e0b 751new(me, name, k)
752 SV *me
660b443c 753 char *name
754 SV *k
755 CODE:
756 RETVAL = findrand(ctrtab, "Catacomb::Rand::Counter", name, k);
757 OUTPUT:
758 RETVAL
759
660b443c 760MODULE = Catacomb PACKAGE = Catacomb::Rand::OFB
761
762SV *
fcd15e0b 763new(me, name, k)
764 SV *me
660b443c 765 char *name
766 SV *k
767 CODE:
768 RETVAL = findrand(ofbtab, "Catacomb::Rand::OFB", name, k);
769 OUTPUT:
770 RETVAL
771
660b443c 772MODULE = Catacomb PACKAGE = Catacomb::Rand::Magic
773
774SV *
775DESTROY(r)
776 grand *r
777 CODE:
fcd15e0b 778 XSRETURN_YES;
660b443c 779
780#----- That's all, folks ----------------------------------------------------