X-Git-Url: https://git.distorted.org.uk/u/mdw/catacomb/blobdiff_plain/1ba83484ee5bb486da9aa958576de4bc29ef0c1d..78660a58940d42126106e9c8e26243e3c4412d49:/key-data.c diff --git a/key-data.c b/key-data.c index 494e9c8..8bb9099 100644 --- a/key-data.c +++ b/key-data.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: key-data.c,v 1.5 2004/03/28 01:58:47 mdw Exp $ + * $Id$ * * Encoding and decoding of key data * @@ -27,27 +27,6 @@ * MA 02111-1307, USA. */ -/*----- Revision history --------------------------------------------------* - * - * $Log: key-data.c,v $ - * Revision 1.5 2004/03/28 01:58:47 mdw - * Generate, store and retreive elliptic curve keys. - * - * Revision 1.4 2000/07/16 19:51:58 mdw - * Shut stupid compiler up. - * - * Revision 1.3 2000/06/17 11:26:03 mdw - * key_structfind: track minor data structure change, and cope if the - * subkey isn't available. - * - * 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 @@ -79,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; @@ -98,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; @@ -116,7 +97,8 @@ 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); } @@ -132,7 +114,8 @@ void key_mp(key_data *k, mp *m) void key_string(key_data *k, const char *p) { - k->e = (k->e & ~KF_ENCMASK) | KENC_STRING; + key_destroy(k); + k->e |= KENC_STRING; k->u.p = xstrdup(p); } @@ -147,8 +130,9 @@ void key_string(key_data *k, const char *p) */ void key_ec(key_data *k, const ec *e) -{ - k->e = (k->e & ~KF_ENCMASK) | KENC_EC; +{ + key_destroy(k); + k->e |= KENC_EC; EC_CREATE(&k->u.e); EC_COPY(&k->u.e, e); } @@ -164,7 +148,8 @@ void key_ec(key_data *k, const ec *e) void key_structure(key_data *k) { - k->e = KENC_STRUCT; + key_destroy(k); + k->e |= KENC_STRUCT; sym_create(&k->u.s); } @@ -208,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); } @@ -228,9 +215,11 @@ 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); @@ -245,13 +234,14 @@ void key_destroy(key_data *k) 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@ --- * @@ -318,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;