General utilities cleanup. Add signature support to catcrypt. Throw in
[u/mdw/catacomb] / ec-test.c
index 59acf4e..30d1069 100644 (file)
--- a/ec-test.c
+++ b/ec-test.c
@@ -1,6 +1,6 @@
 /* -*-c-*-
  *
- * $Id: ec-test.c,v 1.2 2004/03/27 00:04:46 mdw Exp $
+ * $Id$
  *
  * Code for testing elliptic-curve stuff
  *
  * MA 02111-1307, USA.
  */
 
-/*----- Revision history --------------------------------------------------* 
- *
- * $Log: ec-test.c,v $
- * Revision 1.2  2004/03/27 00:04:46  mdw
- * Implement efficient reduction for pleasant-looking primes.
- *
- * Revision 1.1  2004/03/23 15:19:32  mdw
- * Test elliptic curves more thoroughly.
- *
- */
-
 /*----- Header files ------------------------------------------------------*/
 
 #include <assert.h>
@@ -107,8 +96,14 @@ static int ecCHECK(ec_curve *cc, const ec *p)
   return (EC_CHECK(c->real, p));
 }
 
-static ec_ops ecops = {
-  ecDESTROY, ecIN, ecOUT, ecFIX,
+static int ecSAMEP(ec_curve *cc, ec_curve *dd)
+{
+  ecctx *c = (ecctx *)cc, *d = (ecctx *)dd;
+  return (ec_samep(c->real, d->real));
+}
+
+static const ec_ops ecops = {
+  ecDESTROY, ecSAMEP, ecIN, ecOUT, ecFIX,
   ecFIND, ecNEG, ecADD, ecSUB, ecDBL, ecCHECK
 };
 
@@ -117,6 +112,8 @@ static ec_curve *ec_cutout(ec_curve *real, const char *name)
   ecctx *c = CREATE(ecctx);
   c->c.f = real->f;
   c->c.ops = &ecops;
+  c->c.a = real->a;
+  c->c.b = real->b;
   c->magic = MAGIC;
   c->name = xstrdup(name);
   c->real = real;
@@ -130,95 +127,20 @@ static const char *ec_name(ec_curve *cc)
   return (c->name);
 }
 
-/*----- Test field types --------------------------------------------------*
- *
- * Really lazy parser.  Sorry.
- */
-
-static void skipws(const char **p)
-{
-  while (isspace((unsigned char)**p)) (*p)++;
-}
-
-static void ckchar(const char **p, int ch)
-{ skipws(p); if (**p == ch) (*p)++; }
-
-static void ckend(const char **p)
-{
-  skipws(p);
-  if (**p) {
-    fprintf(stderr, "syntax error: junk at end of line\n");
-    abort();
-  }
-}
-
-static int ckstring(const char **p, const char **s)
-{
-  int i;
-  size_t n;
-
-  skipws(p);
-  for (i = 0; s[i]; i++) {
-    n = strlen(s[i]);
-    if (strncmp(*p, s[i], n) == 0 && !isalnum((unsigned char)(*p)[n])) {
-      *p += n;
-      return (i);
-    }
-  }
-  fprintf(stderr, "syntax error: couldn't recognize keyword\n");
-  abort();
-}
-
-static mp *getmp(const char **p)
-{
-  char *q;
-  mp *m;
-  skipws(p);
-  m = mp_readstring(MP_NEW, *p, &q, 0);
-  if (!m || isalnum((unsigned char)*q)) {
-    fprintf(stderr, "syntax error: bad number\n");
-    abort();
-  }
-  *p = q;
-  return (m);
-}
+/*----- Test field types --------------------------------------------------*/
 
 static void ecvcvt(const char *buf, dstr *d)
 {
-  field *f;
   ec_curve *v;
-  mp *m, *n;
-  const char *p = buf;
-  int i;
-
-  static const char *fnames[] = {
-    "prime", "niceprime", "binpoly", 0
-  };
-  static const char *ecnames[] = {
-    "prime", "primeproj", "bin", "binproj", 0
-  };
-
-  switch (i = ckstring(&p, fnames), ckchar(&p, ':'), i) {
-    case 0: m = getmp(&p); f = field_prime(m); mp_drop(m); break;
-    case 1: m = getmp(&p); f = field_niceprime(m); mp_drop(m); break;
-    case 2: m = getmp(&p); f = field_binpoly(m); mp_drop(m); break;
-    default: abort();
+  qd_parse qd;
+
+  qd.p = buf;
+  qd.e = 0;
+  if ((v = ec_curveparse(&qd)) == 0) {
+    fprintf(stderr, "bad curve `%.*s|%s': %s\n",
+           qd.p - buf, buf, qd.p, qd.e);
+    exit(1);
   }
-  ckchar(&p, '/');
-
-  switch (i = ckstring(&p, ecnames), ckchar(&p, ':'), i) {
-    case 0: m = getmp(&p); ckchar(&p, ','); n = getmp(&p);
-      v = ec_prime(f, m, n); mp_drop(m); mp_drop(n); break;
-    case 1: m = getmp(&p); ckchar(&p, ','); n = getmp(&p);
-      v = ec_primeproj(f, m, n); mp_drop(m); mp_drop(n); break;
-    case 2: m = getmp(&p); ckchar(&p, ','); n = getmp(&p);
-      v = ec_bin(f, m, n); mp_drop(m); mp_drop(n); break;
-    case 3: m = getmp(&p); ckchar(&p, ','); n = getmp(&p);
-      v = ec_binproj(f, m, n); mp_drop(m); mp_drop(n); break;
-    default: abort();
-  }
-  ckend(&p);
-
   dstr_ensure(d, sizeof(v));
   *(ec_curve **)d->buf = ec_cutout(v, buf);
   d->len += sizeof(v);
@@ -230,21 +152,23 @@ static void ecvdump(dstr *d, FILE *fp)
   fprintf(fp, "%s", ec_name(v));
 }
 
-test_type type_ecurve = { ecvcvt, ecvdump };
+const test_type type_ecurve = { ecvcvt, ecvdump };
 
 static void eccvt(const char *p, dstr *d)
 {
   ec *a;
+  qd_parse qd;
 
+  qd.p = p;
+  qd.e = 0;
   dstr_ensure(d, sizeof(ec));
   a = (ec *)d->buf;
   d->len += sizeof(ec);
   ec_create(a);
-  skipws(&p);
-  if (strcmp(p, "inf") == 0)
-    EC_SETINF(a);
-  else
-  { a->x = getmp(&p); ckchar(&p, ','); a->y = getmp(&p); ckend(&p); }
+  if (!ec_ptparse(&qd, a)) {
+    fprintf(stderr, "bad point `%.*s|%s': %s\n", qd.p - p, p, qd.p, qd.e);
+    exit(1);
+  }
 }
 
 static void ecdodump(ec *a, FILE *fp)
@@ -265,7 +189,7 @@ static void ecdump(dstr *d, FILE *fp)
   ecdodump(a, fp);
 }
 
-test_type type_ec = { eccvt, ecdump };
+const test_type type_ec = { eccvt, ecdump };
 
 /*----- Testing elliptic curve functionality ------------------------------*/