/* -*-c-*-
*
- * $Id: key-data.c,v 1.5 2004/03/28 01:58:47 mdw Exp $
+ * $Id$
*
* Encoding and decoding of key data
*
* 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 <assert.h>
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;
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;
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);
}
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);
}
*/
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);
}
void key_structure(key_data *k)
{
- k->e = KENC_STRUCT;
+ key_destroy(k);
+ k->e |= KENC_STRUCT;
sym_create(&k->u.s);
}
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);
}
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);
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@ --- *
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;