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