chiark / gitweb /
server/: Make bulk crypto transforms responsible for algorithm selection.
[tripe] / server / chal.c
index 387f0db1fb29e182d36b28d9df979d7ebce21082..71fde49c48b962bc48722988bdb9f13016838a92 100644 (file)
@@ -30,7 +30,7 @@
 
 /*----- Static variables --------------------------------------------------*/
 
-static gmac *mac;
+static bulkchal *bulk;
 static uint32 oseq;
 static seqwin iseq;
 
@@ -47,17 +47,13 @@ static seqwin iseq;
 
 static void c_genkey(void)
 {
-  if (mac && GM_CLASS(mac) == master->algs.m && oseq < 0x07ffffff) return;
-  if (mac) GM_DESTROY(mac);
-  assert(master->algs.mksz < sizeof(buf_t));
-  rand_get(RAND_GLOBAL, buf_t, master->algs.mksz);
-  mac = GM_KEY(master->algs.m, buf_t, master->algs.mksz);
+  if (bulk && bulk->ops == master->algs.bulk->ops && oseq < 0x07ffffff)
+    return;
+  if (bulk) bulk->ops->freechal(bulk);
+  bulk = master->algs.bulk->ops->genchal(master->algs.bulk);
+  bulk->ops = master->algs.bulk->ops;
   oseq = 0;
   seq_reset(&iseq);
-  IF_TRACING(T_CHAL, {
-    trace(T_CHAL, "chal: generated new challenge key");
-    trace_block(T_CRYPTO, "chal: new key", buf_t, master->algs.mksz);
-  })
 }
 
 /* --- @c_new@ --- *
@@ -72,16 +68,11 @@ static void c_genkey(void)
 int c_new(buf *b)
 {
   octet *p;
-  ghash *h;
 
   c_genkey();
   p = BCUR(b);
-  if (buf_putu32(b, oseq++)) return (-1);
-  h = GM_INIT(mac);
-  GH_HASH(h, p, BCUR(b) - p);
-  buf_put(b, GH_DONE(h, 0), master->algs.tagsz);
-  GH_DESTROY(h);
-  if (BBAD(b)) return (-1);
+  if (buf_putu32(b, oseq++) || !buf_get(b, bulk->tagsz)) return (-1);
+  if (bulk->ops->chaltag(bulk, p, 4, p + 4)) return (-1);
   IF_TRACING(T_CHAL, {
     trace(T_CHAL, "chal: issuing challenge %lu", (unsigned long)(oseq - 1));
     trace_block(T_CRYPTO, "chal: challenge block", p, BCUR(b) - p);
@@ -101,25 +92,20 @@ int c_new(buf *b)
 int c_check(buf *b)
 {
   const octet *p;
-  size_t sz = 4 + master->algs.tagsz;
+  size_t sz;
   uint32 seq;
-  ghash *h;
-  int ok;
 
+  if (!bulk) {
+    a_warn("CHAL", "impossible-challenge", A_END);
+    goto fail;
+  }
+  sz = 4 + bulk->tagsz;
   if ((p = buf_get(b, sz)) == 0) {
     a_warn("CHAL", "invalid-challenge", A_END);
     goto fail;
   }
   IF_TRACING(T_CHAL, trace_block(T_CRYPTO, "chal: check challenge", p, sz); )
-  if (!mac) {
-    a_warn("CHAL", "impossible-challenge", A_END);
-    goto fail;
-  }
-  h = GM_INIT(mac);
-  GH_HASH(h, p, 4);
-  ok = ct_memeq(GH_DONE(h, 0), p + 4, master->algs.tagsz);
-  GH_DESTROY(h);
-  if (!ok) {
+  if (bulk->ops->chalvrf(bulk, p, 4, p + 4)) {
     a_warn("CHAL", "incorrect-tag", A_END);
     goto fail;
   }