# ---?---
#
-# $Id: key.xs,v 1.2 2004/04/08 01:36:21 mdw Exp $
+# $Id$
#
# Key-management interface
#
# along with Catacomb/Perl; if not, write to the Free Software Foundation,
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-MODULE = Catacomb PACKAGE = Catacomb::Key
+MODULE = Catacomb PACKAGE = Catacomb::Key PREFIX = key_
+
+SV *
+DESTROY(k)
+ Key *k
+ CODE:
+ keyfile_dec(k->kf);
+ DESTROY(k);
+ XSRETURN_YES;
+
+bool
+key_chkident(me, p)
+ SV *me
+ char *p
+ C_ARGS:
+ p
+
+bool
+key_chkcomment(me, p)
+ SV *me
+ char *p
+ C_ARGS:
+ p
+
+time_t
+exp(k)
+ Key *k
+ CODE:
+ RETVAL = k->k->exp;
+ OUTPUT:
+ RETVAL
+
+time_t
+del(k)
+ Key *k
+ CODE:
+ RETVAL = k->k->del;
+ OUTPUT:
+ RETVAL
+
+Key_DataImpl *
+_data(k)
+ Key *k
+ CODE:
+ RETVAL = &k->k->k;
+ OUTPUT:
+ RETVAL
+
+char *
+comment(k)
+ Key *k
+ CODE:
+ RETVAL = k->k->c;
+ OUTPUT:
+ RETVAL
+
+U32
+id(k)
+ Key *k
+ CODE:
+ RETVAL = k->k->id;
+ OUTPUT:
+ RETVAL
+
+char *
+tag(k)
+ Key *k
+ CODE:
+ RETVAL = k->k->tag;
+ OUTPUT:
+ RETVAL
+
+char *
+type(k)
+ Key *k
+ CODE:
+ RETVAL = k->k->type;
+ OUTPUT:
+ RETVAL
+
+KeyErr
+key_setcomment(k, p)
+ Key *k
+ char *p
+ C_ARGS:
+ &k->kf->kf, k->k, p
+
+KeyErr
+key_settag(k, p)
+ Key *k
+ char *p
+ C_ARGS:
+ &k->kf->kf, k->k, p
+
+KeyErr
+key_delete(k)
+ Key *k
+ C_ARGS:
+ &k->kf->kf, k->k
+
+SV *
+fulltag(k)
+ Key *k
+ PREINIT:
+ dstr d = DSTR_INIT;
+ CODE:
+ key_fulltag(k->k, &d);
+ RETVAL = newSVpvn(d.buf, d.len);
+ dstr_destroy(&d);
+ OUTPUT:
+ RETVAL
+
+const char *
+key_getattr(k, a)
+ Key *k
+ char *a
+ C_ARGS:
+ &k->kf->kf, k->k, a
+
+KeyErr
+putattr(k, a, v = &PL_sv_undef)
+ Key *k
+ char *a
+ SV *v
+ PREINIT:
+ char *vv;
+ STRLEN len;
+ CODE:
+ if (!SvOK(v))
+ vv = 0;
+ else
+ vv = SvPV(v, len);
+ RETVAL = key_putattr(&k->kf->kf, k->k, a, vv);
+ OUTPUT:
+ RETVAL
+
+Key_AttrIter *
+attriter(k)
+ Key *k
+ CODE:
+ RETVAL = CREATE(Key_AttrIter);
+ key_mkattriter(&RETVAL->i, k->k);
+ RETVAL->kf = k->kf;
+ k->kf->ref++;
+ OUTPUT:
+ RETVAL
+
+bool
+expiredp(k)
+ Key *k
+ CODE:
+ RETVAL = key_expired(k->k);
+ OUTPUT:
+ RETVAL
+
+KeyErr
+key_expire(k)
+ Key *k
+ C_ARGS:
+ &k->kf->kf, k->k
+
+KeyErr
+key_used(k, t)
+ Key *k
+ time_t t
+ C_ARGS:
+ &k->kf->kf, k->k, t
+
+bool
+key_fingerprint(k, h, kf = 0)
+ Key *k
+ ghash *h
+ Key_Filter *kf
+ C_ARGS:
+ k->k, h, kf
+
+const char *
+key_strerror(me, err)
+ SV *me
+ int err
+ C_ARGS:
+ err
+
+MODULE = Catacomb PACKAGE = Catacomb::Key::AttrIter
+
+void
+next(i)
+ Key_AttrIter *i
+ PREINIT:
+ const char *a, *v;
+ PPCODE:
+ if (key_nextattr(&i->i, &a, &v)) {
+ XPUSHs(sv_2mortal(newSVpv(a, 0)));
+ if (GIMME_V == G_ARRAY)
+ XPUSHs(sv_2mortal(newSVpv(v, 0)));
+ }
+
+SV *
+DESTROY(i)
+ Key_AttrIter *i
+ CODE:
+ keyfile_dec(i->kf);
+ DESTROY(i);
+ XSRETURN_YES;
+
+MODULE = Catacomb PACKAGE = Catacomb::Key::Filter
+
+Key_Filter *
+new(me, f = 0, m = 0)
+ SV *me
+ SV *f
+ SV *m
+ PREINIT:
+ char *p;
+ STRLEN len;
+ CODE:
+ RETVAL = CREATE(Key_Filter);
+ if (!f || !SvOK(f))
+ RETVAL->f = RETVAL->m = 0;
+ else if (m) {
+ RETVAL->f = SvUV(f);
+ RETVAL->m = SvUV(m);
+ } else {
+ p = SvPV(f, len);
+ if (key_readflags(p, 0, &RETVAL->f, &RETVAL->m)) {
+ DESTROY(RETVAL);
+ RETVAL = 0;
+ }
+ }
+ OUTPUT:
+ RETVAL
+
+SV *
+DESTROY(kf)
+ Key_Filter *kf
+ CODE:
+ if (!kf)
+ XSRETURN_UNDEF;
+ DESTROY(kf);
+ XSRETURN_YES;
+
+SV *
+tostring(kf)
+ Key_Filter *kf
+ PREINIT:
+ dstr d = DSTR_INIT;
+ CODE:
+ if (!kf)
+ XSRETURN_UNDEF;
+ key_writeflags(kf->f, &d);
+ RETVAL = newSVpvn(d.buf, d.len);
+ dstr_destroy(&d);
+ OUTPUT:
+ RETVAL
+
+UV
+f(kf)
+ Key_Filter *kf
+ CODE:
+ RETVAL = kf ? kf->f : 0;
+ OUTPUT:
+ RETVAL
+
+UV
+m(kf)
+ Key_Filter *kf
+ CODE:
+ RETVAL = kf ? kf->m : 0;
+ OUTPUT:
+ RETVAL
+
+MODULE = Catacomb PACKAGE = Catacomb::Key::DataImpl PREFIX = key_
+
+Key_DataImpl *
+new(me)
+ SV *me
+ CODE:
+ RETVAL = CREATE(key_data);
+ RETVAL->e = 0;
+ RETVAL->u.k.k = 0;
+ RETVAL->u.k.sz = 0;
+ OUTPUT:
+ RETVAL
+
+SV *
+free(kd)
+ Key_DataImpl *kd
+ CODE:
+ key_destroy(kd);
+ DESTROY(kd);
+ XSRETURN_YES;
+
+SV *
+clear(kd)
+ Key_DataImpl *kd
+ CODE:
+ key_destroy(kd);
+ kd->e = 0;
+ kd->u.k.k = 0;
+ kd->u.k.sz = 0;
+ XSRETURN_YES;
+
+SV *
+setbinary(kd, sv)
+ Key_DataImpl *kd
+ SV *sv
+ PREINIT:
+ char *p;
+ STRLEN len;
+ CODE:
+ p = SvPV(sv, len);
+ key_destroy(kd);
+ key_binary(kd, p, len);
+ XSRETURN_YES;
+
+SV *
+setencrypted(kd, sv)
+ Key_DataImpl *kd
+ SV *sv
+ PREINIT:
+ char *p;
+ STRLEN len;
+ CODE:
+ p = SvPV(sv, len);
+ key_destroy(kd);
+ key_encrypted(kd, p, len);
+ XSRETURN_YES;
+
+SV *
+setmp(kd, x)
+ Key_DataImpl *kd
+ mp *x
+ CODE:
+ key_destroy(kd);
+ key_mp(kd, x);
+ XSRETURN_YES;
+
+SV *
+setstring(kd, p)
+ Key_DataImpl *kd
+ char *p
+ CODE:
+ key_destroy(kd);
+ key_string(kd, p);
+ XSRETURN_YES;
+
+SV *
+setec(kd, p)
+ Key_DataImpl *kd
+ ec *p
+ CODE:
+ key_destroy(kd);
+ key_ec(kd, p);
+ XSRETURN_YES;
+
+U32
+flags(kd)
+ Key_DataImpl *kd
+ CODE:
+ RETVAL = kd->e;
+ OUTPUT:
+ RETVAL
+
+SV *
+setflags(kd, f)
+ Key_DataImpl *kd
+ U32 f
+ CODE:
+ if (f & KF_ENCMASK)
+ croak("can't change encoding flags");
+ kd->e = (kd->e & KF_ENCMASK) | (f & ~KF_ENCMASK);
+ XSRETURN_YES;
+
+SV *
+getbinary(kd)
+ Key_DataImpl *kd
+ CODE:
+ if ((kd->e & KF_ENCMASK) != KENC_BINARY)
+ croak("key is not binary");
+ RETVAL = newSVpvn(kd->u.k.k, kd->u.k.sz);
+ OUTPUT:
+ RETVAL
+
+SV *
+getencrypted(kd)
+ Key_DataImpl *kd
+ CODE:
+ if ((kd->e & KF_ENCMASK) != KENC_ENCRYPT)
+ croak("key is not encrypted");
+ RETVAL = newSVpvn(kd->u.k.k, kd->u.k.sz);
+ OUTPUT:
+ RETVAL
+
+mp *
+getmp(kd)
+ Key_DataImpl *kd
+ CODE:
+ if ((kd->e & KF_ENCMASK) != KENC_MP)
+ croak("key is not bignum");
+ RETVAL = MP_COPY(kd->u.m);
+ OUTPUT:
+ RETVAL
+
+ec *
+getec(kd)
+ Key_DataImpl *kd
+ CODE:
+ if ((kd->e & KF_ENCMASK) != KENC_EC)
+ croak("key is not a curve point");
+ RETVAL = CREATE(ec);
+ EC_CREATE(RETVAL);
+ EC_COPY(RETVAL, &kd->u.e);
+ OUTPUT:
+ RETVAL
+
+char *
+getstring(kd)
+ Key_DataImpl *kd
+ CODE:
+ if ((kd->e & KF_ENCMASK) != KENC_STRING)
+ croak("key is not string");
+ RETVAL = kd->u.p;
+ OUTPUT:
+ RETVAL
+
+SV *
+setstruct(kd)
+ Key_DataImpl *kd
+ CODE:
+ key_destroy(kd);
+ key_structure(kd);
+ XSRETURN_YES;
+
+Key_DataImpl *
+key_structfind(kd, tag)
+ Key_DataImpl *kd
+ char *tag
+ INIT:
+ if ((kd->e & KF_ENCMASK) != KENC_STRUCT)
+ XSRETURN_UNDEF;
+
+Key_DataImpl *
+key_structcreate(kd, tag)
+ Key_DataImpl *kd
+ char *tag
+ INIT:
+ if ((kd->e & KF_ENCMASK) != KENC_STRUCT)
+ croak("key is not structured");
+
+Key_StructIter *
+structiter(kd)
+ Key_DataImpl *kd
+ CODE:
+ if ((kd->e & KF_ENCMASK) != KENC_STRUCT)
+ croak("key is not structured");
+ RETVAL = CREATE(Key_StructIter);
+ sym_mkiter(RETVAL, &kd->u.s);
+ OUTPUT:
+ RETVAL
+
+SV *
+structdel(kd, tag)
+ Key_DataImpl *kd
+ char *tag
+ PREINIT:
+ key_struct *ks;
+ CODE:
+ if ((kd->e & KF_ENCMASK) != KENC_STRUCT)
+ croak("key is not structured");
+ if ((ks = sym_find(&kd->u.s, tag, -1, 0, 0)) == 0)
+ XSRETURN_UNDEF;
+ key_destroy(&ks->k);
+ sym_remove(&kd->u.s, ks);
+ XSRETURN_YES;
+
+bool
+key_match(kd, kf)
+ Key_DataImpl *kd
+ Key_Filter *kf
+
+bool
+set(kd, kkd, kf = 0)
+ Key_DataImpl *kd
+ Key_DataImpl *kkd
+ Key_Filter *kf
+ CODE:
+ key_destroy(kd);
+ kd->e = 0;
+ kd->u.k.k = 0;
+ kd->u.k.sz = 0;
+ RETVAL = key_copy(kd, kkd, kf);
+ OUTPUT:
+ RETVAL
+
+Key_DataImpl *
+lock(kd, key)
+ Key_DataImpl *kd
+ SV *key
+ PREINIT:
+ STRLEN len;
+ char *p;
+ CODE:
+ if ((kd->e & KF_ENCMASK) == KENC_ENCRYPT)
+ croak("already encrypted");
+ RETVAL = CREATE(Key_DataImpl);
+ p = SvPV(key, len);
+ key_lock(RETVAL, kd, p, len);
+ OUTPUT:
+ RETVAL
+
+Key_DataImpl *
+unlock(kd, key)
+ Key_DataImpl *kd
+ SV *key
+ PREINIT:
+ STRLEN len;
+ char *p;
+ int rc;
+ CODE:
+ if ((kd->e & KF_ENCMASK) != KENC_ENCRYPT)
+ croak("not encrypted");
+ RETVAL = CREATE(Key_DataImpl);
+ p = SvPV(key, len);
+ if ((rc = key_unlock(RETVAL, kd, p, len)) != 0) {
+ DESTROY(RETVAL);
+ keyerr(rc);
+ RETVAL = 0;
+ }
+ OUTPUT:
+ RETVAL
+
+Key_DataImpl *
+plock(kd, tag)
+ Key_DataImpl *kd
+ char *tag
+ PREINIT:
+ int rc;
+ CODE:
+ if ((kd->e & KF_ENCMASK) == KENC_ENCRYPT)
+ croak("already encrypted");
+ RETVAL = CREATE(Key_DataImpl);
+ if ((rc = key_plock(tag, kd, RETVAL)) != 0) {
+ DESTROY(RETVAL);
+ keyerr(rc);
+ RETVAL = 0;
+ }
+ OUTPUT:
+ RETVAL
+
+Key_DataImpl *
+punlock(kd, tag)
+ Key_DataImpl *kd
+ char *tag
+ PREINIT:
+ int rc;
+ CODE:
+ if ((kd->e & KF_ENCMASK) != KENC_ENCRYPT)
+ croak("not encrypted");
+ RETVAL = CREATE(Key_DataImpl);
+ if ((rc = key_punlock(tag, kd, RETVAL)) != 0) {
+ DESTROY(RETVAL);
+ keyerr(rc);
+ RETVAL = 0;
+ }
+ OUTPUT:
+ RETVAL
+
+void
+read(me, p)
+ SV *me
+ char *p
+ PREINIT:
+ key_data *kd;
+ char *pp;
+ PPCODE:
+ kd = CREATE(key_data);
+ if (key_read(p, kd, &pp))
+ DESTROY(kd);
+ else {
+ XPUSHs(RET(kd, "Catacomb::Key::DataImpl"));
+ if (GIMME_V == G_ARRAY)
+ XPUSHs(sv_2mortal(newSVpvn(pp, strlen(pp))));
+ }
+
+SV *
+write(kd, kf = 0)
+ Key_DataImpl *kd
+ Key_Filter *kf
+ PREINIT:
+ dstr d = DSTR_INIT;
+ CODE:
+ if (key_write(kd, &d, kf))
+ RETVAL = newSVpvn(d.buf, d.len);
+ else
+ RETVAL = &PL_sv_undef;
+ dstr_destroy(&d);
+ OUTPUT:
+ RETVAL
+
+Key_DataImpl *
+decode(me, sv)
+ SV *me
+ SV *sv
+ PREINIT:
+ char *p;
+ STRLEN len;
+ CODE:
+ p = SvPV(sv, len);
+ RETVAL = CREATE(key_data);
+ if (key_decode(p, len, RETVAL)) {
+ DESTROY(RETVAL);
+ RETVAL = 0;
+ }
+ OUTPUT:
+ RETVAL
+
+SV *
+encode(kd, kf = 0)
+ Key_DataImpl *kd
+ Key_Filter *kf
+ PREINIT:
+ dstr d = DSTR_INIT;
+ CODE:
+ if (key_encode(kd, &d, kf))
+ RETVAL = newSVpvn(d.buf, d.len);
+ else
+ RETVAL = &PL_sv_undef;
+ dstr_destroy(&d);
+ OUTPUT:
+ RETVAL
+
+MODULE = Catacomb PACKAGE = Catacomb::Key::StructIter
+
+SV *
+next(i)
+ Key_StructIter *i
+ PREINIT:
+ key_struct *s;
+ CODE:
+ if ((s = sym_next(i)) == 0)
+ XSRETURN_UNDEF;
+ RETVAL = newSVpvn(SYM_NAME(s), SYM_LEN(s));
+ OUTPUT:
+ RETVAL
+
+SV *
+DESTROY(i)
+ Key_StructIter *i
+ CODE:
+ DESTROY(i);
+ XSRETURN_YES;
MODULE = Catacomb PACKAGE = Catacomb::Key::Data
+void
+readflags(me, p)
+ SV *me
+ char *p
+ PREINIT:
+ unsigned f, m;
+ PPCODE:
+ if (key_readflags(p, &p, &f, &m) || *p)
+ croak("bad flags string");
+ XPUSHs(sv_2mortal(newSVuv(m)));
+ XPUSHs(sv_2mortal(newSVuv(f)));
+
+SV *
+getflags(me, f)
+ SV *me
+ U32 f
+ PREINIT:
+ dstr d = DSTR_INIT;
+ CODE:
+ key_writeflags(f, &d);
+ RETVAL = newSVpvn(d.buf, d.len);
+ dstr_destroy(&d);
+ OUTPUT:
+ RETVAL
+
MODULE = Catacomb PACKAGE = Catacomb::Key::File PREFIX = key_
Key_File *
-new(file, how)
+new(me, file, how = KOPEN_READ, report = &PL_sv_undef)
+ SV *me
char *file
unsigned how
+ SV *report
CODE:
RETVAL = CREATE(key_file);
- if (key_open(RETVAL, file, how, warn_keyreporter, 0)) {
+ if (key_open(&RETVAL->kf, file, how, keyreport, report)) {
DESTROY(RETVAL);
RETVAL = 0;
}
DESTROY(kf)
Key_File *kf
CODE:
- key_close(kf);
+ keyfile_dec(kf);
XSRETURN_UNDEF;
-KEYERR
-merge(kf, name, fp)
+KeyErr
+merge(kf, name, fp, report = &PL_sv_undef)
Key_File *kf
char *name
FILE *fp
+ SV *report
+ CODE:
+ RETVAL = key_merge(&kf->kf, name, fp, keyreport, report);
+ OUTPUT:
+ RETVAL
+
+bool
+key_extract(kf, k, fp, kfilt = 0)
+ Key_File *kf
+ Key *k
+ FILE *fp
+ Key_Filter *kfilt
+ C_ARGS:
+ &kf->kf, k->k, fp, kfilt
+
+int
+key_save(kf)
+ Key_File *kf
+ C_ARGS:
+ &kf->kf
+
+Key *
+bytype(kf, type)
+ Key_File *kf
+ char *type
+ CODE:
+ RETVAL = CREATE(Key);
+ if ((RETVAL->k = key_bytype(&kf->kf, type)) != 0) {
+ kf->ref++;
+ RETVAL->kf = kf;
+ } else {
+ DESTROY(RETVAL);
+ RETVAL = 0;
+ }
+ OUTPUT:
+ RETVAL
+
+Key *
+byid(kf, id)
+ Key_File *kf
+ U32 id
CODE:
- RETVAL = key_merge(kf, name, fp, warn_keyreporter, 0);
+ RETVAL = CREATE(Key);
+ if ((RETVAL->k = key_byid(&kf->kf, id)) != 0) {
+ kf->ref++;
+ RETVAL->kf = kf;
+ } else {
+ DESTROY(RETVAL);
+ RETVAL = 0;
+ }
+ OUTPUT:
+ RETVAL
+
+Key *
+bytag(kf, tag)
+ Key_File *kf
+ char *tag
+ CODE:
+ RETVAL = CREATE(Key);
+ if ((RETVAL->k = key_bytag(&kf->kf, tag)) != 0) {
+ kf->ref++;
+ RETVAL->kf = kf;
+ } else {
+ DESTROY(RETVAL);
+ RETVAL = 0;
+ }
+ OUTPUT:
+ RETVAL
+
+Key *
+newkey(kf, id, type, exp)
+ Key_File *kf
+ U32 id
+ const char *type
+ time_t exp
+ PREINIT:
+ int err;
+ CODE:
+ RETVAL = CREATE(Key);
+ if ((RETVAL->k = key_new(&kf->kf, id, type, exp, &err)) == 0) {
+ DESTROY(RETVAL);
+ keyerr(err);
+ RETVAL = 0;
+ } else {
+ kf->ref++;
+ RETVAL->kf = kf;
+ }
+ OUTPUT:
+ RETVAL
+
+
+Key_FileIter *
+iterate(kf)
+ Key_File *kf
+ CODE:
+ RETVAL = CREATE(Key_FileIter);
+ key_mkiter(&RETVAL->i, &kf->kf);
+ RETVAL->kf = kf;
+ kf->ref++;
+ OUTPUT:
+ RETVAL
+
+MODULE = Catacomb PACKAGE = Catacomb::Key::FileIter
+
+Key *
+next(ki)
+ Key_FileIter *ki
+ CODE:
+ RETVAL = CREATE(Key);
+ if ((RETVAL->k = key_next(&ki->i)) == 0) {
+ DESTROY(RETVAL);
+ RETVAL = 0;
+ } else {
+ RETVAL->kf = ki->kf;
+ ki->kf->ref++;
+ }
OUTPUT:
RETVAL
SV *
-extract
+DESTROY(ki)
+ Key_FileIter *ki
+ CODE:
+ keyfile_dec(ki->kf);
+ DESTROY(ki);
+ XSRETURN_YES;
#----- That's all, folks ----------------------------------------------------