Overhaul of key management (again).
[u/mdw/catacomb] / key.h
diff --git a/key.h b/key.h
index 6a17ded..d779489 100644 (file)
--- a/key.h
+++ b/key.h
@@ -1,6 +1,6 @@
 /* -*-c-*-
  *
- * $Id: key.h,v 1.3 1999/12/22 15:47:48 mdw Exp $
+ * $Id: key.h,v 1.4 2000/02/12 18:21:02 mdw Exp $
  *
  * Simple key management
  *
@@ -30,6 +30,9 @@
 /*----- Revision history --------------------------------------------------* 
  *
  * $Log: key.h,v $
+ * Revision 1.4  2000/02/12 18:21:02  mdw
+ * Overhaul of key management (again).
+ *
  * Revision 1.3  1999/12/22 15:47:48  mdw
  * Major key-management revision.
  *
 #include <mLib/hash.h>
 #include <mLib/sym.h>
 
+#ifndef CATACOMB_KEY_DATA_H
+#  include "key-data.h"
+#endif
+
 #ifndef CATACOMB_MP_H
 #  include "mp.h"
 #endif
@@ -76,99 +83,6 @@ typedef struct key_attr {
   char *p;                             /* Pointer to attribute value */
 } key_attr;
 
-/* --- Key data structure --- */
-
-typedef struct key_data {
-  unsigned e;                          /* Encoding type for key data */
-  union {
-
-    /* --- Plain binary key data --- *
-     *
-     * Also used for encrypted key types.
-     */
-
-    struct {
-      octet *k;                                /* Actual key data */
-      size_t sz;                       /* Size of the key data */
-    } k;                               /* Plain binary key */
-
-    /* --- Multiprecision integer keys --- */
-
-    mp *m;                             /* Multiprecision integer */
-
-    /* --- Structured key data --- */
-
-    sym_table s;                       /* Structured key data */
-  } u;
-} key_data;
-
-typedef struct key_struct {
-  sym_base _b;
-  key_data k;
-} key_struct;
-
-/* --- Key binary encoding --- *
- *
- * The binary encoding consists of a header containing a 16-bit encoding type
- * and a 16-bit length, followed immediately by the key data, followed by
- * between zero and three zero bytes to make the total length a multiple of
- * four.  The format of the following data depends on the encoding type:
- *
- * @KENC_BINARY@       Binary data.
- *
- * @KENC_MP@           Octet array interpreted in big-endian byte order.
- *
- * @KENC_STRUCT@       An array of pairs, each containing a string (8-bit
- *                     length followed by data and zero-padding to 4-byte
- *                     boundary) and key binary encodings.
- *
- * @KENC_ENCRYPT@      Binary data, format
- */
-
-/* --- Key encoding methods and other flags--- */
-
-enum {
-
-  /* --- Bottom two bits are the encoding type --- */
-
-  KF_ENCMASK   = 0x03,                 /* Encoding mask */
-  KENC_BINARY  = 0x00,                 /* Plain binary key (@k@) */
-  KENC_MP      = 0x01,                 /* Multiprecision integer (@i@) */
-  KENC_STRUCT  = 0x02,                 /* Structured key data (@s@) */
-  KENC_ENCRYPT = 0x03,                 /* Encrypted key type (@k@) */
-
-  /* --- Key category bits --- */
-
-  KF_CATMASK   = 0x0c,                 /* Category mask */
-  KCAT_SYMM    = 0x00,                 /* Symmetric encryption key */
-  KCAT_PRIV    = 0x04,                 /* Private (asymmetric) key */
-  KCAT_PUB     = 0x08,                 /* Public (asymmetric) key */
-  KCAT_SHARE   = 0x0c,                 /* Shared (asymmetric) key */
-  KF_NONSECRET = 0x08,                 /* Bit flag for non-secret keys */
-
-  /* --- Other flags --- */
-
-  KF_BURN      = 0x10,                 /* Burn key after use */
-
-  /* --- Tag end --- */
-
-  KENC_MAX                             /* Dummy limit constant */
-};
-
-/* --- Key flag filtering --- */
-
-typedef struct key_filter {
-  unsigned f;
-  unsigned m;
-} key_filter;
-
-/* --- Matching aginst key selection --- */
-
-#define KEY_MATCH(kd, kf)                                              \
-  (!(kf) ||                                                            \
-   ((kd)->e & KF_ENCMASK) == KENC_STRUCT ||                            \
-   ((kd)->e & (kf)->m) == (kf)->f)
-
 /* --- Main key structure --- *
  *
  * Each key is stored in two symbol tables, one indexed by keyid, and the
@@ -250,7 +164,7 @@ enum {
 /* --- Key error codes --- */
 
 enum {
-  KERR_OK,                             /* No error */
+  KERR_OK = 0,                         /* No error */
   KERR_BADTAG = -1,                    /* Malformed tag string */
   KERR_BADTYPE = -2,                   /* Malformed type string */
   KERR_BADCOMMENT = -3,                        /* Malformed comment string */
@@ -260,6 +174,9 @@ enum {
   KERR_WILLEXPIRE = -7,                        /* Key will eventually expire */
   KERR_EXPIRED = -8,                   /* Key has already expired */
   KERR_BADFLAGS = -9,                  /* Error in flags string */
+  KERR_BADPASS = -10,                  /* Error decrypting locked key */
+  KERR_BADTYPE = -11,                  /* Key has incorrect type */
+  KERR_NOTFOUND = -12,                 /* Key couldn't be found */
   KERR_MAX                             /* Largest possible error */
 };
 
@@ -281,244 +198,6 @@ typedef void key_reporter(const char */*file*/, int /*line*/,
 #define KEY_EXPIRED(now, exp)                                          \
   ((exp) == KEXP_EXPIRE || ((exp) != KEXP_FOREVER && (exp) < (now)))
 
-/*----- Key data manipulation ---------------------------------------------*/
-
-/* --- @key_destroy@ --- *
- *
- * Arguments:  @key_data *k@ = pointer to key data to destroy
- *
- * Returns:    ---
- *
- * Use:                Destroys a lump of key data.
- */
-
-extern void key_destroy(key_data */*k*/);
-
-/* --- @key_readflags@ --- *
- *
- * Arguments:  @const char *p@ = pointer to string to read
- *             @char **pp@ = where to store the end pointer
- *             @unsigned *ff@ = where to store the flags
- *             @unsigned *mm@ = where to store the mask
- *
- * Returns:    Zero if all went well, nonzero if there was an error.
- *
- * Use:                Reads a flag string.
- */
-
-extern int key_readflags(const char */*p*/, char **/*pp*/,
-                        unsigned */*ff*/, unsigned */*mm*/);
-
-/* --- @key_writeflags@ --- *
- *
- * Arguments:  @unsigned f@ = flags to write
- *             @dstr *d@ = pointer to destination string
- *
- * Returns:    ---
- *
- * Use:                Emits a flags word as a string representation.
- */
-
-extern void key_writeflags(unsigned /*f*/, dstr */*d*/);
-
-/* --- @key_binary@ --- *
- *
- * Arguments:  @key_data *k@ = pointer to key data block
- *             @const void *p@ = pointer to key data
- *             @size_t sz@ = size of the key data
- *
- * Returns:    ---
- *
- * Use:                Sets a binary key in a key data block.
- */
-
-extern void key_binary(key_data */*k*/, const void */*p*/, size_t /*sz*/);
-
-/* --- @key_encrypted@ --- *
- *
- * Arguments:  @key_data *k@ = pointer to key data block
- *             @const void *p@ = pointer to key data
- *             @size_t sz@ = size of the key data
- *
- * Returns:    ---
- *
- * Use:                Sets an encrypted key in a key data block.
- */
-
-extern void key_encrypted(key_data */*k*/, const void */*p*/, size_t /*sz*/);
-
-/* --- @key_mp@ --- *
- *
- * Arguments:  @key_data *k@ = pointer to key data block
- *             @mp *m@ = pointer to the value to set
- *
- * Returns:    ---
- *
- * Use:                Sets a multiprecision integer key in a key block.
- */
-
-extern void key_mp(key_data */*k*/, mp */*m*/);
-
-/* --- @key_structure@ --- *
- *
- * Arguments:  @key_data *k@ = pointer to key data block
- *
- * Returns:    ---
- *
- * Use:                Initializes a structured key type.
- */
-
-extern void key_structure(key_data */*k*/);
-
-/* --- @key_structfind@ --- *
- *
- * Arguments:  @key_data *k@ = pointer to key data block
- *             @const char *tag@ = pointer to tag string
- *
- * Returns:    Pointer to key data block, or null.
- *
- * Use:                Looks up the tag in a structured key.
- */
-
-extern key_data *key_structfind(key_data */*k*/, const char */*tag*/);
-
-/* --- @key_structcreate@ --- *
- *
- * Arguments:  @key_data *k@ = pointer to key data block
- *             @const char *tag@ = pointer to tag string
- *
- * Returns:    Pointer to newly created key data.
- *
- * Use:                Creates a new uninitialized subkey.
- */
-
-extern key_data *key_structcreate(key_data */*k*/, const char */*tag*/);
-
-/* --- @key_match@ --- *
- *
- * Arguments:  @key_data *k@ = pointer to key data block
- *             @const key_filter *kf@ = pointer to filter block
- *
- * Returns:    Nonzero if the key matches the filter.
- *
- * Use:                Checks whether a key matches a filter.
- */
-
-extern int key_match(key_data */*k*/, const key_filter */*kf*/);
-
-/* --- @key_do@ --- *
- *
- * Arguments:  @key_data *k@ = pointer to key data block
- *             @const key_filter *kf@ = pointer to filter block
- *             @dstr *d@ = pointer to base string
- *             @int (*func)(key_data *kd, dstr *d, void *p@ = function
- *             @void *p@ = argument to function
- *
- * Returns:    Nonzero return code from function, or zero.
- *
- * Use:                Runs a function over all the leaves of a key. 
- */
-
-extern int key_do(key_data */*k*/, const key_filter */*kf*/, dstr */*d*/,
-                 int (*/*func*/)(key_data */*kd*/,
-                                 dstr */*d*/, void */*p*/),
-                 void */*p*/);
-
-/* --- @key_copy@ --- *
- *
- * Arguments:  @key_data *kd@ = pointer to destination data block
- *             @key_data *k@ = pointer to source data block
- *             @const key_filter *kf@ = pointer to filter block
- *
- * Returns:    Nonzero if an item was actually copied.
- *
- * Use:                Copies a chunk of key data from one place to another.
- */
-
-extern int key_copy(key_data */*kd*/, key_data */*k*/,
-                   const key_filter */*kf*/);
-
-/* --- @key_read@ --- *
- *
- * Arguments:  @const char *p@ = pointer to textual key representation
- *             @key_data *k@ = pointer to output block for key data
- *             @char **pp@ = where to store the end pointer
- *
- * Returns:    Zero if all went well, nonzero if there was a problem.
- *
- * Use:                Parses a textual key description.
- */
-
-extern int key_read(const char */*p*/, key_data */*k*/, char **/*pp*/);
-
-/* --- @key_write@ --- *
- *
- * Arguments:  @key_data *k@ = pointer to key data
- *             @dstr *d@ = destination string to write on
- *             @const key_filter *kf@ = pointer to key selection block
- *
- * Returns:    Nonzero if any items were actually written.
- *
- * Use:                Writes a key in a textual encoding.
- */
-
-extern int key_write(key_data */*k*/, dstr */*d*/,
-                     const key_filter */*kf*/);
-
-/* --- @key_decode@ --- *
- *
- * Arguments:  @const void *p@ = pointer to buffer to read
- *             @size_t sz@ = size of the buffer
- *             @key_data *k@ = pointer to key data block to write to
- *
- * Returns:    Zero if everything worked, nonzero otherwise.
- *
- * Use:                Decodes a binary representation of a key.
- */
-
-extern int key_decode(const void */*p*/, size_t /*sz*/, key_data */*k*/);
-
-/* --- @key_encode@ --- *
- *
- * Arguments:  @key_data *k@ = pointer to key data block
- *             @dstr *d@ = pointer to destination string
- *             @const key_filter *kf@ = pointer to key selection block
- *
- * Returns:    Nonzero if any items were actually written.
- *
- * Use:                Encodes a key block as binary data.
- */
-
-extern int key_encode(key_data */*k*/, dstr */*d*/,
-                     const key_filter */*kf*/);
-
-/* --- @key_plock@ --- *
- *
- * Arguments:  @const char *tag@ = tag to use for passphrase
- *             @key_data *k@ = source key data block
- *             @key_data *kt@ = target key data block
- *
- * Returns:    Zero if successful, nonzero if there was a problem.
- *
- * Use:                Locks a key by encrypting it with a passphrase.
- */
-
-extern int key_plock(const char */*tag*/, key_data */*k*/, key_data */*kt*/);
-
-/* --- @key_punlock@ --- *
- *
- * Arguments:  @const char *tag@ = tag to use for passphrase
- *             @key_data *k@ = source key data block
- *             @key_data *kt@ = target key data block
- *
- * Returns:    Zero if it worked, nonzero if it didn't.
- *
- * Use:                Unlocks a passphrase-locked key.
- */
-
-extern int key_punlock(const char */*tag*/,
-                      key_data */*k*/, key_data */*kt*/);
-
 /*----- Reading and writing keys and files --------------------------------*/
 
 /* --- @key_merge@ --- *