projects
/
u
/
mdw
/
catacomb
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Provide better interface to key locking.
[u/mdw/catacomb]
/
key-data.c
diff --git
a/key-data.c
b/key-data.c
index
7cbc6fd
..
8bb9099
100644
(file)
--- a/
key-data.c
+++ b/
key-data.c
@@
-1,6
+1,6
@@
/* -*-c-*-
*
/* -*-c-*-
*
- * $Id
: key-data.c,v 1.6 2004/04/08 01:36:15 mdw Exp
$
+ * $Id$
*
* Encoding and decoding of key data
*
*
* Encoding and decoding of key data
*
@@
-58,7
+58,8
@@
void key_binary(key_data *k, const void *p, size_t sz)
{
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;
k->u.k.k = sub_alloc(sz);
memcpy(k->u.k.k, p, sz);
k->u.k.sz = sz;
@@
-77,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)
{
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;
k->u.k.k = sub_alloc(sz);
memcpy(k->u.k.k, p, sz);
k->u.k.sz = sz;
@@
-95,7
+97,8
@@
void key_encrypted(key_data *k, const void *p, size_t sz)
void key_mp(key_data *k, mp *m)
{
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);
}
k->u.m = MP_COPY(m);
}
@@
-111,7
+114,8
@@
void key_mp(key_data *k, mp *m)
void key_string(key_data *k, const char *p)
{
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);
}
k->u.p = xstrdup(p);
}
@@
-126,8
+130,9
@@
void key_string(key_data *k, const char *p)
*/
void key_ec(key_data *k, const ec *e)
*/
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);
}
EC_CREATE(&k->u.e);
EC_COPY(&k->u.e, e);
}
@@
-143,7
+148,8
@@
void key_ec(key_data *k, const ec *e)
void key_structure(key_data *k)
{
void key_structure(key_data *k)
{
- k->e = KENC_STRUCT;
+ key_destroy(k);
+ k->e |= KENC_STRUCT;
sym_create(&k->u.s);
}
sym_create(&k->u.s);
}
@@
-187,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 = 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);
}
return (&ks->k);
}
@@
-207,9
+215,11
@@
void key_destroy(key_data *k)
switch (k->e & KF_ENCMASK) {
case KENC_BINARY:
case KENC_ENCRYPT:
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_MP:
mp_drop(k->u.m);
@@
-224,13
+234,14
@@
void key_destroy(key_data *k)
sym_iter i;
key_struct *ks;
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;
}
sym_destroy(&k->u.s);
} break;
}
+ k->e = (k->e & ~KF_ENCMASK);
+ k->u.k.k = 0;
+ k->u.k.sz = 0;
}
/* --- @key_do@ --- *
}
/* --- @key_do@ --- *
@@
-297,8
+308,12
@@
int key_copy(key_data *kd, key_data *k, const key_filter *kf)
case KENC_BINARY:
case KENC_ENCRYPT:
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;
kd->u.k.sz = k->u.k.sz;
break;