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