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_
134 key_fulltag(k->k, &d);
135 RETVAL = newSVpvn(d.buf, d.len);
148 putattr(k, a, v = &PL_sv_undef)
160 RETVAL = key_putattr(&k->kf->kf, k->k, a, vv);
168 RETVAL = CREATE(Key_AttrIter);
169 key_mkattriter(&RETVAL->i, k->k);
179 RETVAL = key_expired(k->k);
197 key_fingerprint(k, h, kf = 0)
205 key_strerror(me, err)
211 MODULE = Catacomb PACKAGE = Catacomb::Key::AttrIter
219 if (key_nextattr(&i->i, &a, &v)) {
220 XPUSHs(sv_2mortal(newSVpv(a, 0)));
221 if (GIMME_V == G_ARRAY)
222 XPUSHs(sv_2mortal(newSVpv(v, 0)));
233 MODULE = Catacomb PACKAGE = Catacomb::Key::Filter
236 new(me, f = 0, m = 0)
244 RETVAL = CREATE(Key_Filter);
246 RETVAL->f = RETVAL->m = 0;
252 if (key_readflags(p, 0, &RETVAL->f, &RETVAL->m)) {
277 key_writeflags(kf->f, &d);
278 RETVAL = newSVpvn(d.buf, d.len);
287 RETVAL = kf ? kf->f : 0;
295 RETVAL = kf ? kf->m : 0;
299 MODULE = Catacomb PACKAGE = Catacomb::Key::DataImpl PREFIX = key_
305 RETVAL = CREATE(key_data);
340 key_binary(kd, p, len);
353 key_encrypted(kd, p, len);
397 croak("can't change encoding flags");
398 kd->e = (kd->e & KF_ENCMASK) | (f & ~KF_ENCMASK);
405 if ((kd->e & KF_ENCMASK) != KENC_BINARY)
406 croak("key is not binary");
407 RETVAL = newSVpvn(kd->u.k.k, kd->u.k.sz);
415 if ((kd->e & KF_ENCMASK) != KENC_ENCRYPT)
416 croak("key is not encrypted");
417 RETVAL = newSVpvn(kd->u.k.k, kd->u.k.sz);
425 if ((kd->e & KF_ENCMASK) != KENC_MP)
426 croak("key is not bignum");
427 RETVAL = MP_COPY(kd->u.m);
435 if ((kd->e & KF_ENCMASK) != KENC_EC)
436 croak("key is not a curve point");
439 EC_COPY(RETVAL, &kd->u.e);
447 if ((kd->e & KF_ENCMASK) != KENC_STRING)
448 croak("key is not string");
462 key_structfind(kd, tag)
466 if ((kd->e & KF_ENCMASK) != KENC_STRUCT)
470 key_structcreate(kd, tag)
474 if ((kd->e & KF_ENCMASK) != KENC_STRUCT)
475 croak("key is not structured");
481 if ((kd->e & KF_ENCMASK) != KENC_STRUCT)
482 croak("key is not structured");
483 RETVAL = CREATE(Key_StructIter);
484 sym_mkiter(RETVAL, &kd->u.s);
495 if ((kd->e & KF_ENCMASK) != KENC_STRUCT)
496 croak("key is not structured");
497 if ((ks = sym_find(&kd->u.s, tag, -1, 0, 0)) == 0)
500 sym_remove(&kd->u.s, ks);
518 RETVAL = key_copy(kd, kkd, kf);
530 if ((kd->e & KF_ENCMASK) == KENC_ENCRYPT)
531 croak("already encrypted");
532 RETVAL = CREATE(Key_DataImpl);
534 key_lock(RETVAL, kd, p, len);
547 if ((kd->e & KF_ENCMASK) != KENC_ENCRYPT)
548 croak("not encrypted");
549 RETVAL = CREATE(Key_DataImpl);
551 if ((rc = key_unlock(RETVAL, kd, p, len)) != 0) {
566 if ((kd->e & KF_ENCMASK) == KENC_ENCRYPT)
567 croak("already encrypted");
568 RETVAL = CREATE(Key_DataImpl);
569 if ((rc = key_plock(tag, kd, RETVAL)) != 0) {
584 if ((kd->e & KF_ENCMASK) != KENC_ENCRYPT)
585 croak("not encrypted");
586 RETVAL = CREATE(Key_DataImpl);
587 if ((rc = key_punlock(tag, kd, RETVAL)) != 0) {
603 kd = CREATE(key_data);
604 if (key_read(p, kd, &pp))
607 XPUSHs(RET(kd, "Catacomb::Key::DataImpl"));
608 if (GIMME_V == G_ARRAY)
609 XPUSHs(sv_2mortal(newSVpvn(pp, strlen(pp))));
619 if (key_write(kd, &d, kf))
620 RETVAL = newSVpvn(d.buf, d.len);
622 RETVAL = &PL_sv_undef;
636 RETVAL = CREATE(key_data);
637 if (key_decode(p, len, RETVAL)) {
651 if (key_encode(kd, &d, kf))
652 RETVAL = newSVpvn(d.buf, d.len);
654 RETVAL = &PL_sv_undef;
659 MODULE = Catacomb PACKAGE = Catacomb::Key::StructIter
667 if ((s = sym_next(i)) == 0)
669 RETVAL = newSVpvn(SYM_NAME(s), SYM_LEN(s));
680 MODULE = Catacomb PACKAGE = Catacomb::Key::Data
689 if (key_readflags(p, &p, &f, &m) || *p)
690 croak("bad flags string");
691 XPUSHs(sv_2mortal(newSVuv(m)));
692 XPUSHs(sv_2mortal(newSVuv(f)));
701 key_writeflags(f, &d);
702 RETVAL = newSVpvn(d.buf, d.len);
707 MODULE = Catacomb PACKAGE = Catacomb::Key::File PREFIX = key_
710 new(me, file, how = KOPEN_READ, report = &PL_sv_undef)
716 RETVAL = CREATE(key_file);
717 if (key_open(&RETVAL->kf, file, how, keyreport, report)) {
732 merge(kf, name, fp, report = &PL_sv_undef)
738 RETVAL = key_merge(&kf->kf, name, fp, keyreport, report);
743 key_extract(kf, k, fp, kfilt = 0)
749 &kf->kf, k->k, fp, kfilt
762 RETVAL = CREATE(Key);
763 if ((RETVAL->k = key_bytype(&kf->kf, type)) != 0) {
778 RETVAL = CREATE(Key);
779 if ((RETVAL->k = key_byid(&kf->kf, id)) != 0) {
794 RETVAL = CREATE(Key);
795 if ((RETVAL->k = key_bytag(&kf->kf, tag)) != 0) {
806 newkey(kf, id, type, exp)
814 RETVAL = CREATE(Key);
815 if ((RETVAL->k = key_new(&kf->kf, id, type, exp, &err)) == 0) {
831 RETVAL = CREATE(Key_FileIter);
832 key_mkiter(&RETVAL->i, &kf->kf);
838 MODULE = Catacomb PACKAGE = Catacomb::Key::FileIter
844 RETVAL = CREATE(Key);
845 if ((RETVAL->k = key_next(&ki->i)) == 0) {
863 #----- That's all, folks ----------------------------------------------------