Standard curves and curve checking.
[u/mdw/catacomb] / ec-bin.c
index a71ed2d..0efb72f 100644 (file)
--- a/ec-bin.c
+++ b/ec-bin.c
@@ -1,6 +1,6 @@
 /* -*-c-*-
  *
- * $Id: ec-bin.c,v 1.4 2004/03/23 15:19:32 mdw Exp $
+ * $Id: ec-bin.c,v 1.5 2004/03/27 17:54:11 mdw Exp $
  *
  * Arithmetic for elliptic curves over binary fields
  *
@@ -30,6 +30,9 @@
 /*----- Revision history --------------------------------------------------* 
  *
  * $Log: ec-bin.c,v $
+ * Revision 1.5  2004/03/27 17:54:11  mdw
+ * Standard curves and curve checking.
+ *
  * Revision 1.4  2004/03/23 15:19:32  mdw
  * Test elliptic curves more thoroughly.
  *
@@ -56,7 +59,6 @@
 
 typedef struct ecctx {
   ec_curve c;
-  mp *a, *b;
   mp *bb;
 } ecctx;
 
@@ -86,15 +88,14 @@ static ec *ecprojneg(ec_curve *c, ec *d, const ec *p)
 static ec *ecfind(ec_curve *c, ec *d, mp *x)
 {
   field *f = c->f;
-  ecctx *cc = (ecctx *)c;
   mp *y, *u, *v;
   
   if (F_ZEROP(f, x))
-    y = F_SQRT(f, MP_NEW, cc->b);
+    y = F_SQRT(f, MP_NEW, c->b);
   else {
     u = F_SQR(f, MP_NEW, x);           /* %$x^2$% */
-    y = F_MUL(f, MP_NEW, u, cc->a);    /* %$a x^2$% */
-    y = F_ADD(f, y, y, cc->b);         /* %$a x^2 + b$% */
+    y = F_MUL(f, MP_NEW, u, c->a);     /* %$a x^2$% */
+    y = F_ADD(f, y, y, c->b);          /* %$a x^2 + b$% */
     v = F_MUL(f, MP_NEW, u, x);                /* %$x^3$% */
     y = F_ADD(f, y, y, v);             /* %$A = x^3 + a x^2 + b$% */
     if (!F_ZEROP(f, y)) {
@@ -120,7 +121,6 @@ static ec *ecdbl(ec_curve *c, ec *d, const ec *a)
     EC_SETINF(d);
   else {
     field *f = c->f;
-    ecctx *cc = (ecctx *)c;
     mp *lambda;
     mp *dx, *dy;
 
@@ -130,7 +130,7 @@ static ec *ecdbl(ec_curve *c, ec *d, const ec *a)
 
     dx = F_SQR(f, dx, lambda);         /* %$\lambda^2$% */
     dx = F_ADD(f, dx, dx, lambda);     /* %$\lambda^2 + \lambda$% */
-    dx = F_ADD(f, dx, dx, cc->a);     /* %$x' = a + \lambda^2 + \lambda$% */
+    dx = F_ADD(f, dx, dx, c->a);       /* %$x' = a + \lambda^2 + \lambda$% */
 
     dy = F_ADD(f, MP_NEW, a->x, dx);   /* %$ x + x' $% */
     dy = F_MUL(f, dy, dy, lambda);     /* %$ (x + x') \lambda$% */
@@ -196,7 +196,6 @@ static ec *ecadd(ec_curve *c, ec *d, const ec *a, const ec *b)
     EC_COPY(d, a);
   else {
     field *f = c->f;
-    ecctx *cc = (ecctx *)c;
     mp *lambda;
     mp *dx, *dy;
 
@@ -209,7 +208,7 @@ static ec *ecadd(ec_curve *c, ec *d, const ec *a, const ec *b)
 
       dx = F_SQR(f, dx, lambda);       /* %$\lambda^2$% */
       dx = F_ADD(f, dx, dx, lambda);   /* %$\lambda^2 + \lambda$% */
-      dx = F_ADD(f, dx, dx, cc->a);    /* %$a + \lambda^2 + \lambda$% */
+      dx = F_ADD(f, dx, dx, c->a);     /* %$a + \lambda^2 + \lambda$% */
       dx = F_ADD(f, dx, dx, a->x);    /* %$a + \lambda^2 + \lambda + x_0$% */
       dx = F_ADD(f, dx, dx, b->x);
                            /* %$x' = a + \lambda^2 + \lambda + x_0 + x_1$% */
@@ -223,7 +222,7 @@ static ec *ecadd(ec_curve *c, ec *d, const ec *a, const ec *b)
 
       dx = F_SQR(f, dx, lambda);       /* %$\lambda^2$% */
       dx = F_ADD(f, dx, dx, lambda);   /* %$\lambda^2 + \lambda$% */
-      dx = F_ADD(f, dx, dx, cc->a);    /* %$x' = a + \lambda^2 + \lambda$% */
+      dx = F_ADD(f, dx, dx, c->a);    /* %$x' = a + \lambda^2 + \lambda$% */
       dy = MP_NEW;
     }
       
@@ -251,7 +250,6 @@ static ec *ecprojadd(ec_curve *c, ec *d, const ec *a, const ec *b)
     EC_COPY(d, a);
   else {
     field *f = c->f;
-    ecctx *cc = (ecctx *)c;
     mp *dx, *dy, *dz, *u, *uu, *v, *t, *s, *ss, *r, *w, *l;
 
     dz = F_SQR(f, MP_NEW, b->z);       /* %$z_1^2$% */
@@ -293,7 +291,7 @@ static ec *ecprojadd(ec_curve *c, ec *d, const ec *a, const ec *b)
     t = F_ADD(f, t, r, dz);            /* %$t = r + z'$% */
 
     uu = F_SQR(f, MP_NEW, dz);         /* %$z'^2$% */
-    dx = F_MUL(f, MP_NEW, uu, cc->a);  /* %$a z'^2$% */
+    dx = F_MUL(f, MP_NEW, uu, c->a);   /* %$a z'^2$% */
     uu = F_MUL(f, uu, t, r);           /* %$t r$% */
     dx = F_ADD(f, dx, dx, uu);         /* %$a z'^2 + t r$% */
     r = F_SQR(f, r, w);                        /* %$w^2$% */
@@ -320,16 +318,15 @@ static ec *ecprojadd(ec_curve *c, ec *d, const ec *a, const ec *b)
 
 static int eccheck(ec_curve *c, const ec *p)
 {
-  ecctx *cc = (ecctx *)c;
   field *f = c->f;
   int rc;
   mp *u, *v;
 
   v = F_SQR(f, MP_NEW, p->x);
   u = F_MUL(f, MP_NEW, v, p->x);
-  v = F_MUL(f, v, v, cc->a);
+  v = F_MUL(f, v, v, c->a);
   u = F_ADD(f, u, u, v);
-  u = F_ADD(f, u, u, cc->b);
+  u = F_ADD(f, u, u, c->b);
   v = F_MUL(f, v, p->x, p->y);
   u = F_ADD(f, u, u, v);
   v = F_SQR(f, v, p->y);
@@ -354,8 +351,8 @@ static int ecprojcheck(ec_curve *c, const ec *p)
 static void ecdestroy(ec_curve *c)
 {
   ecctx *cc = (ecctx *)c;
-  MP_DROP(cc->a);
-  MP_DROP(cc->b);
+  MP_DROP(cc->c.a);
+  MP_DROP(cc->c.b);
   if (cc->bb) MP_DROP(cc->bb);
   DESTROY(cc);
 }
@@ -377,8 +374,8 @@ ec_curve *ec_bin(field *f, mp *a, mp *b)
   ecctx *cc = CREATE(ecctx);
   cc->c.ops = &ec_binops;
   cc->c.f = f;
-  cc->a = F_IN(f, MP_NEW, a);
-  cc->b = F_IN(f, MP_NEW, b);
+  cc->c.a = F_IN(f, MP_NEW, a);
+  cc->c.b = F_IN(f, MP_NEW, b);
   cc->bb = 0;
   return (&cc->c);
 }
@@ -388,8 +385,8 @@ ec_curve *ec_binproj(field *f, mp *a, mp *b)
   ecctx *cc = CREATE(ecctx);
   cc->c.ops = &ec_binprojops;
   cc->c.f = f;
-  cc->a = F_IN(f, MP_NEW, a);
-  cc->b = F_IN(f, MP_NEW, b);
+  cc->c.a = F_IN(f, MP_NEW, a);
+  cc->c.b = F_IN(f, MP_NEW, b);
   cc->bb = F_SQRT(f, MP_NEW, b);
   cc->bb = F_SQRT(f, cc->bb, cc->bb);
   return (&cc->c);