Elliptic curves on binary fields work.
[u/mdw/catacomb] / ec-prime.c
index 14e4c16..40f487e 100644 (file)
@@ -1,6 +1,6 @@
 /* -*-c-*-
  *
 /* -*-c-*-
  *
- * $Id: ec-prime.c,v 1.3.4.2 2004/03/20 00:13:31 mdw Exp $
+ * $Id: ec-prime.c,v 1.3.4.3 2004/03/21 22:39:46 mdw Exp $
  *
  * Elliptic curves over prime fields
  *
  *
  * Elliptic curves over prime fields
  *
@@ -30,6 +30,9 @@
 /*----- Revision history --------------------------------------------------* 
  *
  * $Log: ec-prime.c,v $
 /*----- Revision history --------------------------------------------------* 
  *
  * $Log: ec-prime.c,v $
+ * Revision 1.3.4.3  2004/03/21 22:39:46  mdw
+ * Elliptic curves on binary fields work.
+ *
  * Revision 1.3.4.2  2004/03/20 00:13:31  mdw
  * Projective coordinates for prime curves
  *
  * Revision 1.3.4.2  2004/03/20 00:13:31  mdw
  * Projective coordinates for prime curves
  *
@@ -67,7 +70,8 @@ static const ec_ops ec_primeops, ec_primeprojops, ec_primeprojxops;
 static ec *ecneg(ec_curve *c, ec *d, const ec *p)
 {
   EC_COPY(d, p);
 static ec *ecneg(ec_curve *c, ec *d, const ec *p)
 {
   EC_COPY(d, p);
-  d->y = F_NEG(c->f, d->y, d->y);
+  if (d->y)
+    d->y = F_NEG(c->f, d->y, d->y);
   return (d);
 }
 
   return (d);
 }
 
@@ -254,8 +258,7 @@ static ec *ecadd(ec_curve *c, ec *d, const ec *a, const ec *b)
     dx = F_SUB(f, dx, dx, b->x);       /* %$x' = \lambda^2 - x_0 - x_1$% */
     dy = F_SUB(f, dy, b->x, dx);       /* %$x_1 - x'$% */
     dy = F_MUL(f, dy, lambda, dy);     /* %$\lambda (x_1 - x')$% */
     dx = F_SUB(f, dx, dx, b->x);       /* %$x' = \lambda^2 - x_0 - x_1$% */
     dy = F_SUB(f, dy, b->x, dx);       /* %$x_1 - x'$% */
     dy = F_MUL(f, dy, lambda, dy);     /* %$\lambda (x_1 - x')$% */
-    dy = F_SUB(f, dy, dy, b->y);
-                                      /* %$y' = \lambda (x_1 - x') - y_1$% */
+    dy = F_SUB(f, dy, dy, b->y);      /* %$y' = \lambda (x_1 - x') - y_1$% */
 
     EC_DESTROY(d);
     d->x = dx;
 
     EC_DESTROY(d);
     d->x = dx;
@@ -286,17 +289,14 @@ static ec *ecprojadd(ec_curve *c, ec *d, const ec *a, const ec *b)
     w = F_SUB(f, p, a->x, u);          /* %$w = x_0 - u$% */
     r = F_SUB(f, MP_NEW, a->y, s);     /* %$r = y_0 - s$% */
     if (F_ZEROP(f, w)) {
     w = F_SUB(f, p, a->x, u);          /* %$w = x_0 - u$% */
     r = F_SUB(f, MP_NEW, a->y, s);     /* %$r = y_0 - s$% */
     if (F_ZEROP(f, w)) {
+      MP_DROP(w);
+      MP_DROP(u);
+      MP_DROP(s);
       if (F_ZEROP(f, r)) {
       if (F_ZEROP(f, r)) {
-       MP_DROP(w);
        MP_DROP(r);
        MP_DROP(r);
-       MP_DROP(u);
-       MP_DROP(s);
        return (c->ops->dbl(c, d, a));
       } else {
        return (c->ops->dbl(c, d, a));
       } else {
-       MP_DROP(w);
        MP_DROP(r);
        MP_DROP(r);
-       MP_DROP(u);
-       MP_DROP(s);
        EC_SETINF(d);
        return (d);
       }
        EC_SETINF(d);
        return (d);
       }
@@ -430,12 +430,13 @@ static const ec_ops ec_primeprojxops = {
 
 #define MP(x) mp_readstring(MP_NEW, #x, 0, 0)
 
 
 #define MP(x) mp_readstring(MP_NEW, #x, 0, 0)
 
-int main(void)
+int main(int argc, char *argv[])
 {
   field *f;
   ec_curve *c;
   ec g = EC_INIT, d = EC_INIT;
   mp *p, *a, *b, *r;
 {
   field *f;
   ec_curve *c;
   ec g = EC_INIT, d = EC_INIT;
   mp *p, *a, *b, *r;
+  int i, n = argc == 1 ? 1 : atoi(argv[1]);
 
   printf("ec-prime: ");
   fflush(stdout);
 
   printf("ec-prime: ");
   fflush(stdout);
@@ -445,25 +446,26 @@ int main(void)
   r = MP(6277101735386680763835789423176059013767194773182842284080);
 
   f = field_prime(p);
   r = MP(6277101735386680763835789423176059013767194773182842284080);
 
   f = field_prime(p);
-  c = ec_prime(f, a, b);
+  c = ec_primeproj(f, a, b);
   
   g.x = MP(0x188da80eb03090f67cbf20eb43a18800f4ff0afd82ff1012);
   g.y = MP(0x07192b95ffc8da78631011ed6b24cdd573f977a11e794811);
 
   
   g.x = MP(0x188da80eb03090f67cbf20eb43a18800f4ff0afd82ff1012);
   g.y = MP(0x07192b95ffc8da78631011ed6b24cdd573f977a11e794811);
 
-  ec_mul(c, &d, &g, r);
-  if (EC_ATINF(&d)) {
-    fprintf(stderr, "zero too early\n");
-    return (1);
-  }
-  ec_add(c, &d, &d, &g);
-  if (!EC_ATINF(&d)) {
-    fprintf(stderr, "didn't reach zero\n");
-    MP_EPRINT("d.x", d.x);
-    MP_EPRINT("d.y", d.y);
-    return (1);
+  for (i = 0; i < n; i++) { 
+    ec_mul(c, &d, &g, r);
+    if (EC_ATINF(&d)) {
+      fprintf(stderr, "zero too early\n");
+      return (1);
+    }
+    ec_add(c, &d, &d, &g);
+    if (!EC_ATINF(&d)) {
+      fprintf(stderr, "didn't reach zero\n");
+      MP_EPRINT("d.x", d.x);
+      MP_EPRINT("d.y", d.y);
+      return (1);
+    }
+    ec_destroy(&d);
   }
   }
-
-  ec_destroy(&d);
   ec_destroy(&g);
   ec_destroycurve(c);
   F_DESTROY(f);
   ec_destroy(&g);
   ec_destroycurve(c);
   F_DESTROY(f);