chiark / gitweb /
infra: Add a copy of the GPL.
[catacomb-perl] / key.xs
1 # ---?---
2 #
3 # $Id$
4 #
5 # Key-management interface
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::Key PREFIX = key_
29
30 SV *
31 DESTROY(k)
32         Key *k
33         CODE:
34         keyfile_dec(k->kf);
35         DESTROY(k);
36         XSRETURN_YES;
37
38 bool
39 key_chkident(me, p)
40         SV *me
41         char *p
42         C_ARGS:
43         p
44
45 bool
46 key_chkcomment(me, p)
47         SV *me
48         char *p
49         C_ARGS:
50         p
51
52 time_t
53 exp(k)
54         Key *k
55         CODE:
56         RETVAL = k->k->exp;
57         OUTPUT:
58         RETVAL
59
60 time_t
61 del(k)
62         Key *k
63         CODE:
64         RETVAL = k->k->del;
65         OUTPUT:
66         RETVAL
67
68 Key_Data *
69 data(k)
70         Key *k
71         CODE:
72         RETVAL = k->k->k;
73         key_incref(RETVAL);
74         OUTPUT:
75         RETVAL
76
77 KeyErr
78 setdata(k, kd)
79         Key *k
80         Key_Data *kd
81         CODE:
82         RETVAL = key_setkeydata(&k->kf->kf, k->k, kd);
83         OUTPUT:
84         RETVAL
85
86 char *
87 comment(k)
88         Key *k
89         CODE:
90         RETVAL = k->k->c;
91         OUTPUT:
92         RETVAL
93
94 U32
95 id(k)
96         Key *k
97         CODE:
98         RETVAL = k->k->id;
99         OUTPUT:
100         RETVAL
101
102 char *
103 tag(k)
104         Key *k
105         CODE:
106         RETVAL = k->k->tag;
107         OUTPUT:
108         RETVAL
109
110 char *
111 type(k)
112         Key *k
113         CODE:
114         RETVAL = k->k->type;
115         OUTPUT:
116         RETVAL
117
118 KeyErr
119 key_setcomment(k, p)
120         Key *k
121         char *p
122         C_ARGS:
123         &k->kf->kf, k->k, p
124
125 KeyErr
126 key_settag(k, p)
127         Key *k
128         char *p
129         C_ARGS:
130         &k->kf->kf, k->k, p
131
132 KeyErr
133 key_delete(k)
134         Key *k
135         C_ARGS:
136         &k->kf->kf, k->k
137
138 SV *
139 fulltag(k)
140         Key *k
141         PREINIT:
142         dstr d = DSTR_INIT;
143         CODE:
144         key_fulltag(k->k, &d);
145         RETVAL = newSVpvn(d.buf, d.len);
146         dstr_destroy(&d);
147         OUTPUT:
148         RETVAL
149
150 const char *
151 key_getattr(k, a)
152         Key *k
153         char *a
154         C_ARGS:
155         &k->kf->kf, k->k, a
156
157 KeyErr
158 putattr(k, a, v = &PL_sv_undef)
159         Key *k
160         char *a
161         SV *v
162         PREINIT:
163         char *vv;
164         STRLEN len;
165         CODE:
166         if (!SvOK(v))
167           vv = 0;
168         else
169           vv = SvPV(v, len);
170         RETVAL = key_putattr(&k->kf->kf, k->k, a, vv);
171         OUTPUT:
172         RETVAL
173
174 Key_AttrIter *
175 attriter(k)
176         Key *k
177         CODE:
178         RETVAL = CREATE(Key_AttrIter);
179         key_mkattriter(&RETVAL->i, k->k);
180         RETVAL->kf = k->kf;
181         k->kf->ref++;
182         OUTPUT:
183         RETVAL
184
185 bool
186 expiredp(k)
187         Key *k
188         CODE:
189         RETVAL = key_expired(k->k);
190         OUTPUT:
191         RETVAL
192
193 KeyErr
194 key_expire(k)
195         Key *k
196         C_ARGS:
197         &k->kf->kf, k->k
198
199 KeyErr
200 key_used(k, t)
201         Key *k
202         time_t t
203         C_ARGS:
204         &k->kf->kf, k->k, t
205
206 bool
207 key_fingerprint(k, h, kf = 0)
208         Key *k
209         ghash *h
210         Key_Filter *kf
211         C_ARGS:
212         k->k, h, kf
213
214 const char *
215 key_strerror(me, err)
216         SV *me
217         int err
218         C_ARGS:
219         err
220
221 MODULE = Catacomb PACKAGE = Catacomb::Key::AttrIter
222
223 void
224 next(i)
225         Key_AttrIter *i
226         PREINIT:
227         const char *a, *v;
228         PPCODE:
229         if (key_nextattr(&i->i, &a, &v)) {
230           XPUSHs(sv_2mortal(newSVpv(a, 0)));
231           if (GIMME_V == G_ARRAY)
232             XPUSHs(sv_2mortal(newSVpv(v, 0)));
233         }
234
235 SV *
236 DESTROY(i)
237         Key_AttrIter *i
238         CODE:
239         keyfile_dec(i->kf);
240         DESTROY(i);
241         XSRETURN_YES;
242
243 MODULE = Catacomb PACKAGE = Catacomb::Key::Filter
244
245 Key_Filter *
246 new(me, f = 0, m = 0)
247         SV *me
248         SV *f
249         SV *m
250         PREINIT:
251         char *p;
252         STRLEN len;
253         CODE:
254         RETVAL = CREATE(Key_Filter);
255         if (!f || !SvOK(f))
256           RETVAL->f = RETVAL->m = 0;
257         else if (m) {
258           RETVAL->f = SvUV(f);
259           RETVAL->m = SvUV(m);
260         } else {
261           p = SvPV(f, len);
262           if (key_readflags(p, 0, &RETVAL->f, &RETVAL->m)) {
263             DESTROY(RETVAL);
264             RETVAL = 0;
265           }
266         }
267         OUTPUT:
268         RETVAL
269
270 SV *
271 DESTROY(kf)
272         Key_Filter *kf
273         CODE:
274         if (!kf)
275           XSRETURN_UNDEF;
276         DESTROY(kf);
277         XSRETURN_YES;
278
279 SV *
280 tostring(kf)
281         Key_Filter *kf
282         PREINIT:
283         dstr d = DSTR_INIT;
284         CODE:
285         if (!kf)
286           XSRETURN_UNDEF;
287         key_writeflags(kf->f, &d);
288         RETVAL = newSVpvn(d.buf, d.len);
289         dstr_destroy(&d);
290         OUTPUT:
291         RETVAL
292
293 UV
294 f(kf)
295         Key_Filter *kf
296         CODE:
297         RETVAL = kf ? kf->f : 0;
298         OUTPUT:
299         RETVAL
300
301 UV
302 m(kf)
303         Key_Filter *kf
304         CODE:
305         RETVAL = kf ? kf->m : 0;
306         OUTPUT:
307         RETVAL
308
309 MODULE = Catacomb PACKAGE = Catacomb::Key::Data PREFIX = key_
310
311 SV *
312 DESTROY(kd)
313         Key_Data *kd
314         CODE:
315         key_drop(kd);
316         XSRETURN_YES;
317
318 U32
319 flags(kd)
320         Key_Data *kd
321         CODE:
322         RETVAL = kd->e;
323         OUTPUT: 
324         RETVAL
325
326 void
327 readflags(me, p)
328         SV *me
329         char *p
330         PREINIT:
331         unsigned f, m;
332         PPCODE:
333         if (key_readflags(p, &p, &f, &m) || *p)
334           croak("bad flags string");
335         XPUSHs(sv_2mortal(newSVuv(m)));
336         XPUSHs(sv_2mortal(newSVuv(f)));
337
338 SV *
339 getflags(me, f)
340         SV *me
341         U32 f
342         PREINIT:
343         dstr d = DSTR_INIT;
344         CODE:
345         key_writeflags(f, &d);
346         RETVAL = newSVpvn(d.buf, d.len);
347         dstr_destroy(&d);
348         OUTPUT:
349         RETVAL
350
351 SV *
352 setflags(kd, f)
353         Key_Data *kd
354         U32 f
355         CODE:
356         kd->e = (kd->e & KF_ENCMASK) | (f & ~KF_ENCMASK);
357         XSRETURN_YES;
358
359 void
360 read(me, p)
361         SV *me
362         char *p
363         PREINIT:
364         key_data *kd;
365         char *pp;
366         PPCODE:
367         if ((kd = key_read(p, &pp)) != 0) {
368           XPUSHs(RET(kd, keydata_type(kd)));
369           if (GIMME_V == G_ARRAY)
370             XPUSHs(sv_2mortal(newSVpvn(pp, strlen(pp))));
371         }
372
373 SV *
374 write(kd, kf = 0)
375         Key_Data *kd
376         Key_Filter *kf
377         PREINIT:
378         dstr d = DSTR_INIT;
379         CODE:
380         if (key_write(kd, &d, kf))
381           RETVAL = newSVpvn(d.buf, d.len);
382         else
383           RETVAL = &PL_sv_undef;
384         dstr_destroy(&d);
385         OUTPUT:
386         RETVAL
387
388 Key_Data *
389 decode(me, sv)
390         SV *me
391         SV *sv
392         PREINIT:
393         char *p;
394         STRLEN len;
395         CODE:
396         p = SvPV(sv, len);
397         RETVAL = key_decode(p, len);
398         OUTPUT:
399         RETVAL
400
401 SV *
402 encode(kd, kf = 0)
403         Key_Data *kd
404         Key_Filter *kf
405         PREINIT:
406         dstr d = DSTR_INIT;
407         CODE:
408         if (key_encode(kd, &d, kf))
409           RETVAL = newSVpvn(d.buf, d.len);
410         else
411           RETVAL = &PL_sv_undef;
412         dstr_destroy(&d);
413         OUTPUT:
414         RETVAL
415
416 Key_Data *
417 lock(kd, key)
418         Key_Data *kd
419         SV *key
420         PREINIT:
421         STRLEN len;
422         char *p;
423         CODE:
424         p = SvPV(key, len);
425         key_lock(&RETVAL, kd, p, len);
426         OUTPUT:
427         RETVAL
428
429 Key_Data *
430 plock(kd, tag)
431         Key_Data *kd
432         char *tag
433         PREINIT:
434         int rc;
435         CODE:
436         if ((rc = key_plock(&RETVAL, kd, tag)) != 0) {
437           keyerr(rc);
438           RETVAL = 0;
439         }
440         OUTPUT:
441         RETVAL
442
443 bool
444 key_match(kd, kf)
445         Key_Data *kd
446         Key_Filter *kf
447
448 MODULE = Catacomb PACKAGE = Catacomb::Key::Data::Binary PREFIX = key_
449
450 Key_Data *
451 new(me, sv, f = 0)
452         SV *me
453         SV *sv
454         unsigned f
455         PREINIT:
456         char *p;
457         STRLEN len;
458         CODE:
459         p = SvPV(sv, len);
460         RETVAL = key_newbinary(f, p, len);
461         OUTPUT:
462         RETVAL
463
464 SV *
465 bin(kd)
466         Key_Data *kd
467         CODE:
468         RETVAL = newSVpvn((char *)kd->u.k.k, kd->u.k.sz);
469         OUTPUT:
470         RETVAL
471
472 MODULE = Catacomb PACKAGE = Catacomb::Key::Data::Encrypted PREFIX = key_
473
474 Key_Data *
475 new(me, sv, f = 0)
476         SV *me
477         SV *sv
478         unsigned f
479         PREINIT:
480         char *p;
481         STRLEN len;
482         CODE:
483         p = SvPV(sv, len);
484         RETVAL = key_newencrypted(f, p, len);
485         OUTPUT:
486         RETVAL
487
488 SV *
489 ct(kd)
490         Key_Data *kd
491         CODE:
492         RETVAL = newSVpvn((char *)kd->u.k.k, kd->u.k.sz);
493         OUTPUT:
494         RETVAL
495
496 SV *
497 lock(kd, key)
498         Key_Data *kd
499         SV *key
500         CODE:
501         croak("already encrypted");
502
503 SV *
504 plock(kd, tag)
505         Key_Data *kd
506         char *tag
507         CODE:
508         croak("already encrypted");
509
510 Key_Data *
511 unlock(kd, key)
512         Key_Data *kd
513         SV *key
514         PREINIT:
515         STRLEN len;
516         char *p;
517         int rc;
518         CODE:
519         p = SvPV(key, len);
520         if ((rc = key_unlock(&RETVAL, kd, p, len)) != 0) {
521           keyerr(rc);
522           RETVAL = 0;
523         }
524         OUTPUT:
525         RETVAL
526
527 Key_Data *
528 punlock(kd, tag)
529         Key_Data *kd
530         char *tag
531         PREINIT:
532         int rc;
533         CODE:
534         if ((rc = key_punlock(&RETVAL, kd, tag)) != 0) {
535           keyerr(rc);
536           RETVAL = 0;
537         }
538         OUTPUT:
539         RETVAL
540
541 MODULE = Catacomb PACKAGE = Catacomb::Key::Data::MP PREFIX = key_
542
543 Key_Data *
544 new(me, x, f = 0)
545         SV *me
546         mp *x
547         unsigned f
548         CODE:
549         RETVAL = key_newmp(f, x);
550         OUTPUT:
551         RETVAL
552
553 mp *
554 mp(kd)
555         Key_Data *kd
556         CODE:
557         RETVAL = MP_COPY(kd->u.m);
558         OUTPUT:
559         RETVAL
560
561 MODULE = Catacomb PACKAGE = Catacomb::Key::Data::EC PREFIX = key_
562
563 Key_Data *
564 new(me, p, f = 0)
565         SV *me
566         ec *p
567         unsigned f
568         CODE:
569         RETVAL = key_newec(f, p);
570         OUTPUT:
571         RETVAL
572
573 ec *
574 ec(kd)
575         Key_Data *kd
576         CODE:
577         RETVAL = CREATE(ec);
578         EC_CREATE(RETVAL);
579         EC_COPY(RETVAL, &kd->u.e);
580         OUTPUT:
581         RETVAL
582
583 MODULE = Catacomb PACKAGE = Catacomb::Key::Data::String PREFIX = key_
584
585 Key_Data *
586 new(me, p, f = 0)
587         SV *me
588         char *p
589         unsigned f
590         CODE:
591         RETVAL = key_newstring(f, p);
592         OUTPUT:
593         RETVAL
594
595 char *
596 str(kd)
597         Key_Data *kd
598         CODE:
599         RETVAL = kd->u.p;
600         OUTPUT:
601         RETVAL
602
603 MODULE = Catacomb PACKAGE = Catacomb::Key::Data::Structured PREFIX = key_
604
605 Key_Data *
606 new()
607         CODE:
608         RETVAL = key_newstruct();
609         OUTPUT:
610         RETVAL
611
612 Key_StructIter *
613 iterate(kd)
614         Key_Data *kd
615         CODE:
616         RETVAL = CREATE(Key_StructIter);
617         sym_mkiter(RETVAL, &kd->u.s);
618         OUTPUT:
619         RETVAL
620
621 Key_Data *
622 find(kd, tag)
623         Key_Data *kd
624         char *tag
625         CODE:
626         RETVAL = key_structfind(kd, tag);
627         if (RETVAL) key_incref(RETVAL);
628         OUTPUT:
629         RETVAL
630
631 SV *
632 del(kd, tag)
633         Key_Data *kd
634         char *tag
635         CODE:
636         key_structset(kd, tag, 0);
637         XSRETURN_YES;
638
639 SV *
640 set(kd, tag, kdnew = 0)
641         Key_Data *kd
642         char *tag
643         Key_Data *kdnew
644         CODE:
645         key_structset(kd, tag, kdnew);
646         XSRETURN_YES;
647         
648 MODULE = Catacomb PACKAGE = Catacomb::Key::StructIter
649
650 SV *
651 next(i)
652         Key_StructIter *i
653         PREINIT:
654         key_struct *s;
655         CODE:
656         if ((s = sym_next(i)) == 0)
657           XSRETURN_UNDEF;
658         RETVAL = newSVpvn(SYM_NAME(s), SYM_LEN(s));
659         OUTPUT:
660         RETVAL
661
662 SV *
663 DESTROY(i)
664         Key_StructIter *i
665         CODE:
666         DESTROY(i);
667         XSRETURN_YES;
668
669 MODULE = Catacomb PACKAGE = Catacomb::Key::Data
670
671 MODULE = Catacomb PACKAGE = Catacomb::Key::File PREFIX = key_
672
673 Key_File *
674 new(me, file, how = KOPEN_READ, report = &PL_sv_undef)
675         SV *me
676         char *file
677         unsigned how
678         SV *report
679         CODE:
680         RETVAL = CREATE(key_file);
681         if (key_open(&RETVAL->kf, file, how, keyreport, report)) {
682           DESTROY(RETVAL);
683           RETVAL = 0;
684         }
685         OUTPUT:
686         RETVAL
687
688 SV *
689 DESTROY(kf)
690         Key_File *kf
691         CODE:
692         keyfile_dec(kf);
693         XSRETURN_UNDEF;
694
695 KeyErr
696 merge(kf, name, fp, report = &PL_sv_undef)
697         Key_File *kf
698         char *name
699         FILE *fp
700         SV *report
701         CODE:
702         RETVAL = key_merge(&kf->kf, name, fp, keyreport, report);
703         OUTPUT:
704         RETVAL
705
706 bool
707 key_extract(kf, k, fp, kfilt = 0)
708         Key_File *kf
709         Key *k
710         FILE *fp
711         Key_Filter *kfilt
712         C_ARGS:
713         &kf->kf, k->k, fp, kfilt
714
715 void
716 qtag(kf, tag, kdnew = 0)
717         Key_File *kf
718         char *tag
719         Key_Data *kdnew
720         PREINIT:
721         dstr d = DSTR_INIT;
722         key_data **kd;
723         key_data *okd;
724         key *k;
725         Key *kk;
726         PPCODE:
727         if (key_qtag(&kf->kf, tag, &d, &k, &kd)) {
728           keyerr(KERR_NOTFOUND);
729           XSRETURN_UNDEF;
730         }
731         okd = *kd;
732         if (kdnew) {
733           if (!(kf->kf.f & KF_WRITE)) {
734             keyerr(KERR_READONLY);
735             XSRETURN_UNDEF;
736           }
737           kf->kf.f |= KF_MODIFIED;
738           *kd = kdnew;
739         }
740         key_incref(*kd);
741         kk = CREATE(Key);
742         kk->k = k;
743         kk->kf = kf;
744         kf->ref++;
745         XPUSHs(sv_2mortal(newSVpvn(d.buf, d.len)));
746         XPUSHs(RET(kk, "Catacomb::Key"));
747         XPUSHs(RET(okd, keydata_type(okd)));
748         dstr_destroy(&d);
749
750 int
751 key_save(kf)
752         Key_File *kf
753         C_ARGS:
754         &kf->kf
755
756 Key *
757 bytype(kf, type)
758         Key_File *kf
759         char *type
760         CODE:
761         RETVAL = CREATE(Key);
762         if ((RETVAL->k = key_bytype(&kf->kf, type)) != 0) {
763           kf->ref++;
764           RETVAL->kf = kf;
765         } else {
766           DESTROY(RETVAL);
767           RETVAL = 0;
768         }
769         OUTPUT:
770         RETVAL
771
772 Key *
773 byid(kf, id)
774         Key_File *kf
775         U32 id
776         CODE:
777         RETVAL = CREATE(Key);
778         if ((RETVAL->k = key_byid(&kf->kf, id)) != 0) {
779           kf->ref++;
780           RETVAL->kf = kf;
781         } else {
782           DESTROY(RETVAL);
783           RETVAL = 0;
784         }
785         OUTPUT:
786         RETVAL
787
788 Key *
789 bytag(kf, tag)
790         Key_File *kf
791         char *tag
792         CODE:
793         RETVAL = CREATE(Key);
794         if ((RETVAL->k = key_bytag(&kf->kf, tag)) != 0) {
795           kf->ref++;
796           RETVAL->kf = kf;
797         } else {
798           DESTROY(RETVAL);
799           RETVAL = 0;
800         }
801         OUTPUT:
802         RETVAL
803
804 Key *
805 newkey(kf, id, type, exp = KEXP_FOREVER)
806         Key_File *kf
807         U32 id
808         const char *type
809         time_t exp
810         PREINIT:
811         int err;
812         CODE:
813         RETVAL = CREATE(Key);
814         if ((err = key_new(&kf->kf, id, type, exp, &RETVAL->k)) == 0) {
815           DESTROY(RETVAL);
816           keyerr(err);
817           RETVAL = 0;
818         } else {
819           kf->ref++;
820           RETVAL->kf = kf;
821         }
822         OUTPUT:
823         RETVAL
824
825 Key_FileIter *
826 iterate(kf)
827         Key_File *kf
828         CODE:
829         RETVAL = CREATE(Key_FileIter);
830         key_mkiter(&RETVAL->i, &kf->kf);
831         RETVAL->kf = kf;
832         kf->ref++;
833         OUTPUT: 
834         RETVAL
835
836 MODULE = Catacomb PACKAGE = Catacomb::Key::FileIter
837
838 Key *
839 next(ki)
840         Key_FileIter *ki
841         CODE:
842         RETVAL = CREATE(Key);
843         if ((RETVAL->k = key_next(&ki->i)) == 0) {
844           DESTROY(RETVAL);
845           RETVAL = 0;
846         } else {
847           RETVAL->kf = ki->kf;
848           ki->kf->ref++;
849         }
850         OUTPUT:
851         RETVAL
852
853 SV *
854 DESTROY(ki)
855         Key_FileIter *ki
856         CODE:
857         keyfile_dec(ki->kf);
858         DESTROY(ki);
859         XSRETURN_YES;
860
861 #----- That's all, folks ----------------------------------------------------