hashsum.c: Document `--progress' in the `--help' display.
[u/mdw/catacomb] / ec-test.c
index 6d42a70..ad2af90 100644 (file)
--- a/ec-test.c
+++ b/ec-test.c
@@ -1,13 +1,13 @@
 /* -*-c-*-
  *
- * $Id: ec-test.c,v 1.1 2004/03/23 15:19:32 mdw Exp $
+ * $Id$
  *
  * Code for testing elliptic-curve stuff
  *
  * (c) 2004 Straylight/Edgeware
  */
 
-/*----- Licensing notice --------------------------------------------------* 
+/*----- Licensing notice --------------------------------------------------*
  *
  * This file is part of Catacomb.
  *
  * it under the terms of the GNU Library General Public License as
  * published by the Free Software Foundation; either version 2 of the
  * License, or (at your option) any later version.
- * 
+ *
  * Catacomb is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU Library General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Library General Public
  * License along with Catacomb; if not, write to the Free
  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
  * MA 02111-1307, USA.
  */
 
-/*----- Revision history --------------------------------------------------* 
- *
- * $Log: ec-test.c,v $
- * Revision 1.1  2004/03/23 15:19:32  mdw
- * Test elliptic curves more thoroughly.
- *
- */
-
 /*----- Header files ------------------------------------------------------*/
 
 #include <assert.h>
@@ -104,8 +96,15 @@ 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 = {
+  "cardboard",
+  ecDESTROY, ecSAMEP, ecIN, ecOUT, ecFIX,
   ecFIND, ecNEG, ecADD, ecSUB, ecDBL, ecCHECK
 };
 
@@ -114,6 +113,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;
@@ -127,94 +128,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", "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_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);
@@ -226,21 +153,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)
@@ -248,7 +177,7 @@ static void ecdodump(ec *a, FILE *fp)
   if (EC_ATINF(a))
     fputs("inf", fp);
   else {
-    fputs("0x", fp); 
+    fputs("0x", fp);
     mp_writefile(a->x, fp, 16);
     fputs(", 0x", fp);
     mp_writefile(a->y, fp, 16);
@@ -261,7 +190,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 ------------------------------*/
 
@@ -338,9 +267,9 @@ static int vcheck(dstr v[])
   if (r != c) {
     fprintf(stderr, "check failed");
     fprintf(stderr, "\ncurve = "); type_ecurve.dump(v, stderr);
-    fprintf(stderr, "\n    a = "); ecdodump(a, stderr);
-    fprintf(stderr, "\n    r = %d", r);
-    fprintf(stderr, "\n    c = %d", c); 
+    fprintf(stderr, "\n           a = "); ecdodump(a, stderr);
+    fprintf(stderr, "\n           r = %d", r);
+    fprintf(stderr, "\n           c = %d", c);
     fprintf(stderr, "\n");
     ok = 0;
   }
@@ -361,10 +290,10 @@ static int vmul(dstr v[])
   if (!EC_EQ(r, &c)) {
     fprintf(stderr, "mul failed");
     fprintf(stderr, "\ncurve = "); type_ecurve.dump(v, stderr);
-    fprintf(stderr, "\n    a = "); ecdodump(a, stderr);
-    fprintf(stderr, "\n    n = "); mp_writefile(n, stderr, 10);
-    fprintf(stderr, "\n    r = "); ecdodump(r, stderr);
-    fprintf(stderr, "\n    c = "); ecdodump(&c, stderr);
+    fprintf(stderr, "\n           a = "); ecdodump(a, stderr);
+    fprintf(stderr, "\n           n = "); mp_writefile(n, stderr, 10);
+    fprintf(stderr, "\n           r = "); ecdodump(r, stderr);
+    fprintf(stderr, "\n           c = "); ecdodump(&c, stderr);
     fprintf(stderr, "\n");
     ok = 0;
   }
@@ -384,9 +313,9 @@ static int vfind(dstr v[])
   if (!EC_EQ(r, &c)) {
     fprintf(stderr, "find failed");
     fprintf(stderr, "\ncurve = "); type_ecurve.dump(v, stderr);
-    fprintf(stderr, "\n    x = "); mp_writefile(x, stderr, 16);
-    fprintf(stderr, "\n    r = "); ecdodump(r, stderr);
-    fprintf(stderr, "\n    c = "); ecdodump(&c, stderr);
+    fprintf(stderr, "\n           x = "); mp_writefile(x, stderr, 16);
+    fprintf(stderr, "\n           r = "); ecdodump(r, stderr);
+    fprintf(stderr, "\n           c = "); ecdodump(&c, stderr);
     fprintf(stderr, "\n");
     ok = 0;
   }