X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/tripe/blobdiff_plain/383a9d7197f7a2c86d1f4267789ea3599314baf8..d8310a3a69671d7aeb6ea351a1f931f24a559a42:/server/keyset.c diff --git a/server/keyset.c b/server/keyset.c index 99fad2f5..66a59618 100644 --- a/server/keyset.c +++ b/server/keyset.c @@ -28,11 +28,6 @@ #include "tripe.h" -/*----- Tunable parameters ------------------------------------------------*/ - -#define T_EXP MIN(60) /* Expiry time for a key */ -#define T_REGEN MIN(45) /* Regeneration time for a key */ - /*----- Handy macros ------------------------------------------------------*/ #define KEYOK(ks, now) ((ks)->sz_exp > 0 && (ks)->t_exp > now) @@ -188,7 +183,7 @@ static int dodecrypt(keyset *ks, unsigned ty, buf *b, buf *bb, uint32 *seq) if (psz < ivsz + SEQSZ + tagsz) { T( trace(T_KEYSET, "keyset: block too small for keyset %u", ks->seq); ) - return (KSERR_DECRYPT); + return (KSERR_MALFORMED); } sz = psz - ivsz - SEQSZ - tagsz; pmac = BCUR(b); pseq = pmac + tagsz; piv = pseq + SEQSZ; ppk = piv + ivsz; @@ -206,7 +201,7 @@ static int dodecrypt(keyset *ks, unsigned ty, buf *b, buf *bb, uint32 *seq) GH_HASH(h, t, sizeof(t)); GH_HASH(h, pseq, SEQSZ + ivsz + sz); mac = GH_DONE(h, 0); - eq = !memcmp(mac, pmac, tagsz); + eq = ct_memeq(mac, pmac, tagsz); IF_TRACING(T_KEYSET, { trace_block(T_CRYPTO, "crypto: computed MAC", mac, tagsz); }) @@ -293,6 +288,7 @@ keyset *ks_gen(const void *k, size_t x, size_t y, size_t z, peer *p) keyset *ks = CREATE(keyset); time_t now = time(0); const octet *pp = k; + const algswitch *algs = &p->kx.kpriv->algs; T( static unsigned seq = 0; ) T( trace(T_KEYSET, "keyset: adding new keyset %u", seq); ) @@ -308,21 +304,21 @@ keyset *ks_gen(const void *k, size_t x, size_t y, size_t z, peer *p) #define HASH_in MINE; YOURS; OURS #define HASH_out YOURS; MINE; OURS -#define INIT_c(k) GC_INIT(algs.c, (k), algs.cksz) -#define INIT_m(k) GM_KEY(algs.m, (k), algs.mksz) +#define INIT_c(k) GC_INIT(algs->c, (k), algs->cksz) +#define INIT_m(k) GM_KEY(algs->m, (k), algs->mksz) #define STR_c "encryption" #define STR_m "integrity" #define STR_in "incoming" #define STR_out "outgoing" #define SETKEY(a, dir) do { \ - h = GH_INIT(algs.h); \ + h = GH_INIT(algs->h); \ HASH_STRING(h, "tripe-" STR_##a); \ HASH_##dir; \ hh = GH_DONE(h, 0); \ IF_TRACING(T_KEYSET, { \ trace_block(T_CRYPTO, "crypto: " STR_##dir " key " STR_##a, \ - hh, algs.a##ksz); \ + hh, algs->a##ksz); \ }) \ ks->a##dir = INIT_##a(hh); \ GH_DESTROY(h); \ @@ -347,26 +343,17 @@ keyset *ks_gen(const void *k, size_t x, size_t y, size_t z, peer *p) T( ks->seq = seq++; ) ks->ref = 1; ks->t_exp = now + T_EXP; - ks->sz_exp = algs.expsz; - ks->sz_regen = algs.expsz/2; + ks->sz_exp = algs->expsz; + ks->sz_regen = algs->expsz/2; ks->oseq = 0; seq_reset(&ks->iseq); ks->next = 0; ks->p = p; ks->f = KSF_LISTEN; - ks->tagsz = algs.tagsz; + ks->tagsz = algs->tagsz; return (ks); } -/* --- @ks_tregen@ --- * - * - * Arguments: @keyset *ks@ = pointer to a keyset - * - * Returns: The time at which moves ought to be made to replace this key. - */ - -time_t ks_tregen(keyset *ks) { return (ks->t_exp - T_EXP + T_REGEN); } - /* --- @ks_activate@ --- * * * Arguments: @keyset *ks@ = pointer to a keyset @@ -421,7 +408,7 @@ int ks_encrypt(keyset *ks, unsigned ty, buf *b, buf *bb) * @buf *b@ = pointer to an input buffer * @buf *bb@ = pointer to an output buffer * - * Returns: Zero on success; @KSERR_DECRYPT@ on failure. Also returns + * Returns: Zero on success; @KSERR_...@ on failure. Also returns * zero if there was insufficient buffer (but the output buffer * is broken in this case). * @@ -434,12 +421,12 @@ int ks_decrypt(keyset *ks, unsigned ty, buf *b, buf *bb) { time_t now = time(0); uint32 seq; + int err; - if (!KEYOK(ks, now) || - buf_ensure(bb, BLEN(b)) || - dodecrypt(ks, ty, b, bb, &seq) || - seq_check(&ks->iseq, seq, "SYMM")) - return (KSERR_DECRYPT); + if (!KEYOK(ks, now)) return (KSERR_DECRYPT); + if (buf_ensure(bb, BLEN(b))) return (0); + if ((err = dodecrypt(ks, ty, b, bb, &seq)) != 0) return (err); + if (seq_check(&ks->iseq, seq, "SYMM")) return (KSERR_SEQ); return (0); } @@ -574,24 +561,26 @@ int ksl_decrypt(keyset **ksroot, unsigned ty, buf *b, buf *bb) time_t now = time(0); keyset *ks; uint32 seq; + int err; if (buf_ensure(bb, BLEN(b))) - return (KSERR_DECRYPT); + return (0); for (ks = *ksroot; ks; ks = ks->next) { if (!KEYOK(ks, now)) continue; - if (!dodecrypt(ks, ty, b, bb, &seq)) { + if ((err = dodecrypt(ks, ty, b, bb, &seq)) == 0) { if (ks->f & KSF_LISTEN) { T( trace(T_KEYSET, "keyset: implicitly activating keyset %u", ks->seq); ) ks->f &= ~KSF_LISTEN; } if (seq_check(&ks->iseq, seq, "SYMM")) - return (KSERR_DECRYPT); + return (KSERR_SEQ); else return (0); } + if (err != KSERR_DECRYPT) return (err); } T( trace(T_KEYSET, "keyset: no matching keys, or incorrect MAC"); ) return (KSERR_DECRYPT);