/* -*-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>
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
};
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;
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);
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)
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);
ecdodump(a, fp);
}
-test_type type_ec = { eccvt, ecdump };
+const test_type type_ec = { eccvt, ecdump };
/*----- Testing elliptic curve functionality ------------------------------*/
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;
}
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;
}
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;
}