5 # Key-management interface
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::Key PREFIX = key_
82 RETVAL = key_setkeydata(&k->kf->kf, k->k, kd);
144 key_fulltag(k->k, &d);
145 RETVAL = newSVpvn(d.buf, d.len);
158 putattr(k, a, v = &PL_sv_undef)
170 RETVAL = key_putattr(&k->kf->kf, k->k, a, vv);
178 RETVAL = CREATE(Key_AttrIter);
179 key_mkattriter(&RETVAL->i, k->k);
189 RETVAL = key_expired(k->k);
207 key_fingerprint(k, h, kf = 0)
215 key_strerror(me, err)
221 MODULE = Catacomb PACKAGE = Catacomb::Key::AttrIter
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)));
243 MODULE = Catacomb PACKAGE = Catacomb::Key::Filter
246 new(me, f = 0, m = 0)
254 RETVAL = CREATE(Key_Filter);
256 RETVAL->f = RETVAL->m = 0;
262 if (key_readflags(p, 0, &RETVAL->f, &RETVAL->m)) {
287 key_writeflags(kf->f, &d);
288 RETVAL = newSVpvn(d.buf, d.len);
297 RETVAL = kf ? kf->f : 0;
305 RETVAL = kf ? kf->m : 0;
309 MODULE = Catacomb PACKAGE = Catacomb::Key::Data PREFIX = key_
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)));
345 key_writeflags(f, &d);
346 RETVAL = newSVpvn(d.buf, d.len);
356 kd->e = (kd->e & KF_ENCMASK) | (f & ~KF_ENCMASK);
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))));
380 if (key_write(kd, &d, kf))
381 RETVAL = newSVpvn(d.buf, d.len);
383 RETVAL = &PL_sv_undef;
397 RETVAL = key_decode(p, len);
408 if (key_encode(kd, &d, kf))
409 RETVAL = newSVpvn(d.buf, d.len);
411 RETVAL = &PL_sv_undef;
425 key_lock(&RETVAL, kd, p, len);
436 if ((rc = key_plock(&RETVAL, kd, tag)) != 0) {
448 MODULE = Catacomb PACKAGE = Catacomb::Key::Data::Binary PREFIX = key_
460 RETVAL = key_newbinary(f, p, len);
468 RETVAL = newSVpvn((char *)kd->u.k.k, kd->u.k.sz);
472 MODULE = Catacomb PACKAGE = Catacomb::Key::Data::Encrypted PREFIX = key_
484 RETVAL = key_newencrypted(f, p, len);
492 RETVAL = newSVpvn((char *)kd->u.k.k, kd->u.k.sz);
501 croak("already encrypted");
508 croak("already encrypted");
520 if ((rc = key_unlock(&RETVAL, kd, p, len)) != 0) {
534 if ((rc = key_punlock(&RETVAL, kd, tag)) != 0) {
541 MODULE = Catacomb PACKAGE = Catacomb::Key::Data::MP PREFIX = key_
549 RETVAL = key_newmp(f, x);
557 RETVAL = MP_COPY(kd->u.m);
561 MODULE = Catacomb PACKAGE = Catacomb::Key::Data::EC PREFIX = key_
569 RETVAL = key_newec(f, p);
579 EC_COPY(RETVAL, &kd->u.e);
583 MODULE = Catacomb PACKAGE = Catacomb::Key::Data::String PREFIX = key_
591 RETVAL = key_newstring(f, p);
603 MODULE = Catacomb PACKAGE = Catacomb::Key::Data::Structured PREFIX = key_
608 RETVAL = key_newstruct();
616 RETVAL = CREATE(Key_StructIter);
617 sym_mkiter(RETVAL, &kd->u.s);
626 RETVAL = key_structfind(kd, tag);
627 if (RETVAL) key_incref(RETVAL);
636 key_structset(kd, tag, 0);
640 set(kd, tag, kdnew = 0)
645 key_structset(kd, tag, kdnew);
648 MODULE = Catacomb PACKAGE = Catacomb::Key::StructIter
656 if ((s = sym_next(i)) == 0)
658 RETVAL = newSVpvn(SYM_NAME(s), SYM_LEN(s));
669 MODULE = Catacomb PACKAGE = Catacomb::Key::Data
671 MODULE = Catacomb PACKAGE = Catacomb::Key::File PREFIX = key_
674 new(me, file, how = KOPEN_READ, report = &PL_sv_undef)
680 RETVAL = CREATE(key_file);
681 if (key_open(&RETVAL->kf, file, how, keyreport, report)) {
696 merge(kf, name, fp, report = &PL_sv_undef)
702 RETVAL = key_merge(&kf->kf, name, fp, keyreport, report);
707 key_extract(kf, k, fp, kfilt = 0)
713 &kf->kf, k->k, fp, kfilt
716 qtag(kf, tag, kdnew = 0)
727 if (key_qtag(&kf->kf, tag, &d, &k, &kd)) {
728 keyerr(KERR_NOTFOUND);
733 if (!(kf->kf.f & KF_WRITE)) {
734 keyerr(KERR_READONLY);
737 kf->kf.f |= KF_MODIFIED;
745 XPUSHs(sv_2mortal(newSVpvn(d.buf, d.len)));
746 XPUSHs(RET(kk, "Catacomb::Key"));
747 XPUSHs(RET(okd, keydata_type(okd)));
761 RETVAL = CREATE(Key);
762 if ((RETVAL->k = key_bytype(&kf->kf, type)) != 0) {
777 RETVAL = CREATE(Key);
778 if ((RETVAL->k = key_byid(&kf->kf, id)) != 0) {
793 RETVAL = CREATE(Key);
794 if ((RETVAL->k = key_bytag(&kf->kf, tag)) != 0) {
805 newkey(kf, id, type, exp = KEXP_FOREVER)
813 RETVAL = CREATE(Key);
814 if ((err = key_new(&kf->kf, id, type, exp, &RETVAL->k)) == 0) {
829 RETVAL = CREATE(Key_FileIter);
830 key_mkiter(&RETVAL->i, &kf->kf);
836 MODULE = Catacomb PACKAGE = Catacomb::Key::FileIter
842 RETVAL = CREATE(Key);
843 if ((RETVAL->k = key_next(&ki->i)) == 0) {
861 #----- That's all, folks ----------------------------------------------------