X-Git-Url: https://git.distorted.org.uk/u/mdw/catacomb/blobdiff_plain/052b36d05a622a93733b735acce2de865b14627b..025c5f4aa5ffbf8948482a4233318db81c2df5d2:/key-data.c diff --git a/key-data.c b/key-data.c index 5da8b38..8bb9099 100644 --- a/key-data.c +++ b/key-data.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: key-data.c,v 1.2 2000/02/12 18:21:02 mdw Exp $ + * $Id$ * * Encoding and decoding of key data * @@ -27,17 +27,6 @@ * MA 02111-1307, USA. */ -/*----- Revision history --------------------------------------------------* - * - * $Log: key-data.c,v $ - * Revision 1.2 2000/02/12 18:21:02 mdw - * Overhaul of key management (again). - * - * Revision 1.1 1999/12/22 15:47:48 mdw - * Major key-management revision. - * - */ - /*----- Header files ------------------------------------------------------*/ #include @@ -69,7 +58,8 @@ void key_binary(key_data *k, const void *p, size_t sz) { - k->e = (k->e & ~KF_ENCMASK) | KENC_BINARY; + key_destroy(k); + k->e |= KENC_BINARY; k->u.k.k = sub_alloc(sz); memcpy(k->u.k.k, p, sz); k->u.k.sz = sz; @@ -88,7 +78,8 @@ void key_binary(key_data *k, const void *p, size_t sz) void key_encrypted(key_data *k, const void *p, size_t sz) { - k->e = (k->e & ~KF_ENCMASK) | KENC_ENCRYPT; + key_destroy(k); + k->e |= KENC_ENCRYPT; k->u.k.k = sub_alloc(sz); memcpy(k->u.k.k, p, sz); k->u.k.sz = sz; @@ -106,10 +97,46 @@ void key_encrypted(key_data *k, const void *p, size_t sz) void key_mp(key_data *k, mp *m) { - k->e = (k->e & ~KF_ENCMASK) | KENC_MP; + key_destroy(k); + k->e |= KENC_MP; k->u.m = MP_COPY(m); } +/* --- @key_string@ --- * + * + * Arguments: @key_data *k@ = pointer to key data block + * @const char *p@ = pointer to the value to set + * + * Returns: --- + * + * Use: Sets a plain string in a key block. + */ + +void key_string(key_data *k, const char *p) +{ + key_destroy(k); + k->e |= KENC_STRING; + k->u.p = xstrdup(p); +} + +/* --- @key_ec@ --- * + * + * Arguments: @key_data *k@ = pointer to key data block + * @const ec *e@ = pointer to the value to set + * + * Returns: --- + * + * Use: Sets an elliptic curve point in a key block. + */ + +void key_ec(key_data *k, const ec *e) +{ + key_destroy(k); + k->e |= KENC_EC; + EC_CREATE(&k->u.e); + EC_COPY(&k->u.e, e); +} + /* --- @key_structure@ --- * * * Arguments: @key_data *k@ = pointer to key data block @@ -121,7 +148,8 @@ void key_mp(key_data *k, mp *m) void key_structure(key_data *k) { - k->e = KENC_STRUCT; + key_destroy(k); + k->e |= KENC_STRUCT; sym_create(&k->u.s); } @@ -138,8 +166,11 @@ void key_structure(key_data *k) key_data *key_structfind(key_data *k, const char *tag) { key_struct *ks; - assert(((void)"Key is not structured", k->e == KENC_STRUCT)); + assert(((void)"Key is not structured", + (k->e & KF_ENCMASK) == KENC_STRUCT)); ks = sym_find(&k->u.s, tag, -1, 0, 0); + if (!ks) + return (0); return (&ks->k); } @@ -162,7 +193,9 @@ key_data *key_structcreate(key_data *k, const char *tag) ks = sym_find(&k->u.s, tag, -1, sizeof(*ks), &f); if (f) key_destroy(&ks->k); - ks->k.e = KF_TEMP; + ks->k.e = 0; + ks->k.u.k.k = 0; + ks->k.u.k.sz = 0; return (&ks->k); } @@ -182,24 +215,33 @@ void key_destroy(key_data *k) switch (k->e & KF_ENCMASK) { case KENC_BINARY: case KENC_ENCRYPT: - if (k->e & KF_BURN) - memset(k->u.k.k, 0, k->u.k.sz); - sub_free(k->u.k.k, k->u.k.sz); + if (k->u.k.k) { + if (k->e & KF_BURN) + memset(k->u.k.k, 0, k->u.k.sz); + sub_free(k->u.k.k, k->u.k.sz); + } break; case KENC_MP: mp_drop(k->u.m); break; + case KENC_STRING: + xfree(k->u.p); + break; + case KENC_EC: + EC_DESTROY(&k->u.e); + break; case KENC_STRUCT: { sym_iter i; key_struct *ks; - for (sym_mkiter(&i, &k->u.s); (ks = sym_next(&i)) != 0; ) { - if (!(ks->k.e & KF_TEMP)) - key_destroy(&ks->k); - } + for (sym_mkiter(&i, &k->u.s); (ks = sym_next(&i)) != 0; ) + key_destroy(&ks->k); sym_destroy(&k->u.s); } break; } + k->e = (k->e & ~KF_ENCMASK); + k->u.k.k = 0; + k->u.k.sz = 0; } /* --- @key_do@ --- * @@ -226,7 +268,7 @@ int key_do(key_data *k, const key_filter *kf, dstr *d, else { sym_iter i; key_struct *ks; - size_t n; + size_t n = 0; int rc; if (d) @@ -266,8 +308,12 @@ int key_copy(key_data *kd, key_data *k, const key_filter *kf) case KENC_BINARY: case KENC_ENCRYPT: - kd->u.k.k = sub_alloc(k->u.k.sz); - memcpy(kd->u.k.k, k->u.k.k, k->u.k.sz); + if (!k->u.k.k) + kd->u.k.k = 0; + else { + kd->u.k.k = sub_alloc(k->u.k.sz); + memcpy(kd->u.k.k, k->u.k.k, k->u.k.sz); + } kd->u.k.sz = k->u.k.sz; break; @@ -277,6 +323,19 @@ int key_copy(key_data *kd, key_data *k, const key_filter *kf) kd->u.m = MP_COPY(k->u.m); break; + /* --- Strings --- */ + + case KENC_STRING: + kd->u.p = xstrdup(k->u.p); + break; + + /* --- Elliptic curve points --- */ + + case KENC_EC: + EC_CREATE(&kd->u.e); + EC_COPY(&kd->u.e, &k->u.e); + break; + /* --- Structured key data --- */ case KENC_STRUCT: {