X-Git-Url: https://git.distorted.org.uk/u/mdw/catacomb/blobdiff_plain/2cc51ff1a59f164bdf34b389ac100e6388e12cbd..025c5f4aa5ffbf8948482a4233318db81c2df5d2:/key-data.c diff --git a/key-data.c b/key-data.c index 2a57cf2..8bb9099 100644 --- a/key-data.c +++ b/key-data.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: key-data.c,v 1.4 2000/07/16 19:51:58 mdw Exp $ + * $Id$ * * Encoding and decoding of key data * @@ -27,24 +27,6 @@ * MA 02111-1307, USA. */ -/*----- Revision history --------------------------------------------------* - * - * $Log: key-data.c,v $ - * 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 @@ -76,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; @@ -95,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; @@ -113,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 @@ -128,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); } @@ -172,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); } @@ -192,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@ --- * @@ -276,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; @@ -287,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: {