X-Git-Url: https://git.distorted.org.uk/~mdw/tripe/blobdiff_plain/d8b106a3c886e95f1ba58a989347be984aa7682e..c70a7c5cedab62209640b76f03d97c1876e38dc6:/server/tripe.h diff --git a/server/tripe.h b/server/tripe.h index 86d3779e..24cec434 100644 --- a/server/tripe.h +++ b/server/tripe.h @@ -158,32 +158,114 @@ typedef struct keyset keyset; typedef struct algswitch algswitch; +typedef struct admin admin; -typedef struct bulkcrypto { +typedef struct bulkalgs { + const struct bulkops *ops; +} bulkalgs; + +typedef struct bulkctx { + const struct bulkops *ops; +} bulkctx; + +typedef struct bulkchal { + const struct bulkops *ops; + size_t tagsz; +} bulkchal; + +struct rawkey; + +typedef struct bulkops { const char *name; - unsigned prim; - int (*check)(const algswitch */*a*/, dstr */*e*/); - size_t (*overhead)(const algswitch */*a*/); - int (*encrypt)(keyset */*ks*/, unsigned /*ty*/, buf */*b*/, buf */*bb*/); - int (*decrypt)(keyset */*ks*/, unsigned /*ty*/, + + bulkalgs *(*getalgs)(const algswitch */*asw*/, dstr */*e*/, + key_file */*kf*/, key */*k*/); + /* Determine algorithms to use and return a @bulkalgs@ object + * representing the decision. On error, write tokens to @e@ and + * return null. + */ + + T( void (*tracealgs)(const bulkalgs */*a*/); ) + /* Write trace information about the algorithm selection. */ + + int (*checkalgs)(bulkalgs */*a*/, const algswitch */*asw*/, dstr */*e*/); + /* Check that the algorithms in @a@ and @asw@ are acceptable. On + * error, write tokens to @e@ and return @-1@; otherwise return zero. + */ + + int (*samealgsp)(const bulkalgs */*a*/, const bulkalgs */*aa*/); + /* If @a@ and @aa@ represent the same algorithm selection, return + * nonzero; if not, return zero. + */ + + void (*alginfo)(const bulkalgs */*a*/, admin */*adm*/); + /* Report on the algorithm selection to an admin client: call + * @a_info@ with appropriate key-value pairs. + */ + + size_t (*overhead)(const bulkalgs */*a*/); + /* Return the per-packet overhead of the bulk transform, in bytes. */ + + size_t (*expsz)(const bulkalgs */*a*/); + /* Return the total size limit for the bulk transform, in bytes, + * after which the keys must no longer be used. + */ + + bulkctx *(*genkeys)(const bulkalgs */*a*/, const struct rawkey */*rk*/); + /* Generate session keys and construct and return an appropriate + * context for using them, by calling @ks_derive@. + */ + + bulkchal *(*genchal)(const bulkalgs */*a*/); + /* Construct and return a challenge issuing and verification + * context with a fresh random key. + */ + + void (*freealgs)(bulkalgs */*a*/); + /* Release an algorithm selection object. (Associated bulk + * encryption contexts and challenge contexts may still exist and + * must remain valid.) + */ + + int (*encrypt)(bulkctx */*bc*/, unsigned /*ty*/, + buf */*b*/, buf */*bb*/, uint32 /*seq*/); + /* Encrypt the packet in @b@, with type @ty@ (which doesn't need + * encoding separately) and sequence number @seq@ (which must be + * recoverable by @decrypt@), and write the result to @bb@. On + * error, return a @KSERR_...@ code and/or break the output buffer. + */ + + int (*decrypt)(bulkctx */*bc*/, unsigned /*ty*/, buf */*b*/, buf */*bb*/, uint32 */*seq*/); -} bulkcrypto; + /* Decrypt the packet in @b@, with type @ty@, writing the result to + * @bb@ and storing the incoming (claimed) sequence number in @seq@. + * On error, return a @KSERR_...@ code. + */ + + void (*freectx)(bulkctx */*a*/); + /* Release a bulk encryption context and the resources it holds. */ + + int (*chaltag)(bulkchal */*bc*/, const void */*m*/, size_t /*msz*/, + void */*t*/); + /* Calculate a tag for the challenge in @m@, @msz@, and write it to + * @t@. Return @-1@ on error, zero on success. + */ -#define BCP_CIPHER 1 -#define BCP_MAC 2 -#define BCP_BLKC 4 + int (*chalvrf)(bulkchal */*bc*/, const void */*m*/, size_t /*msz*/, + const void */*t*/); + /* Check the tag @t@ on @m@, @msz@: return zero if the tag is OK, + * nonzero if it's bad. + */ + + void (*freechal)(bulkchal */*bc*/); + /* Release a challenge context and the resources it holds. */ + +} bulkops; struct algswitch { - const gchash *h; /* Hash function */ + const gchash *h; size_t hashsz; /* Hash function */ const gccipher *mgf; /* Mask-generation function */ - const bulkcrypto *bulk; /* Bulk crypto transformation */ - const gccipher *c; /* Symmetric encryption scheme */ - const gcmac *m; /* Message authentication code */ - const gccipher *b; /* Block cipher */ - size_t hashsz; /* Hash output size */ - size_t tagsz; /* Length to truncate MAC tags */ - size_t expsz; /* Size of data to process */ - size_t cksz, mksz, bksz; /* Key lengths for things */ + bulkalgs *bulk; /* Bulk crypto algorithms */ }; typedef struct kdata { @@ -210,7 +292,7 @@ typedef struct knode { #define HASH_STRING(h, s) GH_HASH((h), (s), sizeof(s)) -extern const bulkcrypto bulktab[]; +extern const bulkops bulktab[]; /*----- Data structures ---------------------------------------------------*/ @@ -258,6 +340,8 @@ typedef struct seqwin { * expiry. */ +enum { DIR_IN, DIR_OUT, NDIR }; + struct keyset { struct keyset *next; /* Next active keyset in the list */ unsigned ref; /* Reference count for keyset */ @@ -266,13 +350,7 @@ struct keyset { unsigned long sz_exp, sz_regen; /* Data limits for the keyset */ T( unsigned seq; ) /* Sequence number for tracing */ unsigned f; /* Various useful flags */ - const bulkcrypto *bulk; /* Bulk crypto transform */ - size_t tagsz; /* Length to truncate MAC tags */ - struct ksdir { - gcipher *c; /* Keyset cipher for encryption */ - gmac *m; /* Keyset MAC for integrity */ - gcipher *b; /* Block cipher, just in case */ - } in, out; + bulkctx *bulk; /* Bulk crypto transform */ uint32 oseq; /* Outbound sequence number */ seqwin iseq; /* Inbound sequence number */ }; @@ -529,7 +607,7 @@ typedef struct admin_jobtable { admin_jobentry *v; /* And the big array of entries */ } admin_jobtable; -typedef struct admin { +struct admin { struct admin *next, *prev; /* Links to next and previous */ unsigned f; /* Various useful flags */ unsigned ref; /* Reference counter */ @@ -543,7 +621,7 @@ typedef struct admin { admin_jobtable j; /* Table of outstanding jobs */ selbuf b; /* Line buffer for commands */ sel_file w; /* Selector for write buffering */ -} admin; +}; #define AF_DEAD 1u /* Destroy this admin block */ #define AF_CLOSE 2u /* Client closed connection */ @@ -748,6 +826,27 @@ extern int kx_init(keyexch */*kx*/, peer */*p*/, extern void ks_drop(keyset */*ks*/); +/* --- @ks_derivekey@ --- * + * + * Arguments: @octet *k@ = pointer to an output buffer of at least + * @MAXHASHSZ@ bytes + * @size_t ksz@ = actual size wanted (for tracing) + * @const struct rawkey *rk@ = a raw key, as passed into + * @genkeys@ + * @int dir@ = direction for the key (@DIR_IN@ or @DIR_OUT@) + * @const char *what@ = label for the key (input to derivation) + * + * Returns: --- + * + * Use: Derives a session key, for use on incoming or outgoing data. + * This function is part of a private protocol between @ks_gen@ + * and the bulk crypto transform @genkeys@ operation. + */ + +extern void ks_derivekey(octet */*k*/, size_t /*ksz*/, + const struct rawkey */*rk*/, + int /*dir*/, const char */*what*/); + /* --- @ks_gen@ --- * * * Arguments: @const void *k@ = pointer to key material @@ -980,6 +1079,19 @@ extern void a_vformat(dstr */*d*/, const char */*fmt*/, va_list */*ap*/); extern void EXECL_LIKE(0) a_format(dstr */*d*/, const char */*fmt*/, ...); +/* --- @a_info@ --- * + * + * Arguments: @admin *a@ = connection + * @const char *fmt@ = format string + * @...@ = other arguments + * + * Returns: --- + * + * Use: Report information to an admin client. + */ + +extern void EXECL_LIKE(0) a_info(admin */*a*/, const char */*fmt*/, ...); + /* --- @a_warn@ --- * * * Arguments: @const char *fmt@ = pointer to format string