General utilities cleanup. Add signature support to catcrypt. Throw in
[u/mdw/catacomb] / key-data.c
index 5da8b38..7cbc6fd 100644 (file)
@@ -1,6 +1,6 @@
 /* -*-c-*-
  *
- * $Id: key-data.c,v 1.2 2000/02/12 18:21:02 mdw Exp $
+ * $Id: key-data.c,v 1.6 2004/04/08 01:36:15 mdw Exp $
  *
  * Encoding and decoding of key data
  *
  * 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 <assert.h>
@@ -110,6 +99,39 @@ void key_mp(key_data *k, mp *m)
   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)
+{
+  k->e = (k->e & ~KF_ENCMASK) | 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)
+{
+  k->e = (k->e & ~KF_ENCMASK) | KENC_EC;
+  EC_CREATE(&k->u.e);
+  EC_COPY(&k->u.e, e);
+}
+
 /* --- @key_structure@ --- *
  *
  * Arguments:  @key_data *k@ = pointer to key data block
@@ -138,8 +160,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);
 }
 
@@ -189,6 +214,12 @@ void key_destroy(key_data *k)
     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;
@@ -226,7 +257,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)
@@ -277,6 +308,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: {