math/Makefile.am, symm/Makefile.am: Use `--no-install' on oddball tests.
[catacomb] / pub / gkcdsa.c
index eb5a3de..94f22aa 100644 (file)
@@ -27,6 +27,7 @@
 
 /*----- Header files ------------------------------------------------------*/
 
+#include "dsa.h"
 #include "gkcdsa.h"
 #include "group.h"
 #include "ghash.h"
@@ -125,7 +126,7 @@ void gkcdsa_sign(const gkcdsa *c, gkcdsa_sig *s, const void *m, mp *k)
 
   if (k) { MP_COPY(k); goto have_k; }
 new_k:
-  k = mprand_range(k, g->r, c->r, 0);
+  k = dsa_nonce(k, g->r, c->u, m, c->h, c->r);
 have_k:
   if (MP_ZEROP(k)) goto new_k;
   G_EXP(g, z, g->g, k);
@@ -183,12 +184,17 @@ int gkcdsa_verify(const gkcdsa *c, const gkcdsa_sig *s, const void *m)
 
 #ifdef TEST_RIG
 
+#include "rand.h"
+
 static group *getgroup(const char *p) {
   group *g; qd_parse qd;
   qd.p = p; qd.e = 0; g = group_parse(&qd);
   if (g && !qd_eofp(&qd)) { G_DESTROYGROUP(g); g = 0; qd.e = "junk at eof"; }
-  if (!g) { fprintf(stderr, "bad group string `%.*s|%s': %s\n", qd.p - p,
-                   p, qd.p, qd.e); exit(1); }
+  if (!g) {
+    fprintf(stderr, "bad group string `%.*s|%s': %s\n",
+           (int)(qd.p - p), p, qd.p, qd.e);
+    exit(1);
+  }
   return (g);
 }
 
@@ -216,6 +222,7 @@ static int tsign(dstr *v)
   gdsa c;
   gkcdsa_sig s, ss = GKCDSA_SIG_INIT;
   ghash *h;
+  octet *m;
   mp *k;
   dstr d = DSTR_INIT;
   mp *x;
@@ -233,6 +240,7 @@ static int tsign(dstr *v)
   GH_HASH(h, v[3].buf, v[3].len);
   gkcdsa_endhash(&c, h);
   gkcdsa_sign(&c, &ss, GH_DONE(h, 0), k);
+  GH_DESTROY(h);
   if (memcmp(s.r, ss.r, c.h->hashsz) || !MP_EQ(s.s, ss.s)) {
     ok = 0;
     fprintf(stderr, "*** sign failed!\n");
@@ -244,12 +252,32 @@ static int tsign(dstr *v)
     fprintf(stderr, "*** computed r = ");
     type_hex.dump(&d, stderr); putc('\n', stderr);
     showmp("computed s", ss.s, 16);
-    fprintf(stderr, "*** computed r = ");
+    fprintf(stderr, "*** expected r = ");
     type_hex.dump(&v[5], stderr); putc('\n', stderr);
     showmp("expected s", s.s, 16);
   }
-  mp_drop(s.s); dstr_destroy(&d); mp_drop(ss.s); mp_drop(x); mp_drop(k);
-  mp_drop(c.u); G_DESTROY(c.g, c.p); G_DESTROYGROUP(c.g); GH_DESTROY(h);
+
+  c.r = &rand_global;
+  h = gkcdsa_beginhash(&c);
+  GH_HASH(h, v[3].buf, v[3].len);
+  m = GH_DONE(h, 0);
+  GH_DESTROY(h);
+  gkcdsa_sign(&c, &ss, m, 0);
+  if (gkcdsa_verify(&c, &ss, m)) {
+    ok = 0;
+    fprintf(stderr, "*** sign cross-check failed!\n");
+    fprintf(stderr, "*** group: %s\n", v[0].buf);
+    fprintf(stderr, "*** hash: %s\n", c.h->name);
+    showmp("private key", c.u, 16);
+    showge(c.g, "public key", c.p);
+    fprintf(stderr, "*** message: `%s'\n", v[3].buf);
+    fprintf(stderr, "*** computed r = ");
+    type_hex.dump(&d, stderr); putc('\n', stderr);
+    showmp("computed s", ss.s, 16);
+  }
+
+  mp_drop(s.s); mp_drop(x); mp_drop(k); dstr_destroy(&d); mp_drop(ss.s);
+  mp_drop(c.u); G_DESTROY(c.g, c.p); G_DESTROYGROUP(c.g);
   assert(mparena_count(MPARENA_GLOBAL) == 0);
   return (ok);
 }