X-Git-Url: https://git.distorted.org.uk/u/mdw/catacomb/blobdiff_plain/343509982ee8c88ddafd0129b4dcf97e3c7a672d..ceb3f0c0a3b7bb3fa3250d31b04c382894095e52:/ec-prime.c?ds=sidebyside diff --git a/ec-prime.c b/ec-prime.c index 14e4c16..40f487e 100644 --- a/ec-prime.c +++ b/ec-prime.c @@ -1,6 +1,6 @@ /* -*-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 * @@ -30,6 +30,9 @@ /*----- 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 * @@ -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); - 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); } @@ -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')$% */ - 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; @@ -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)) { + MP_DROP(w); + MP_DROP(u); + MP_DROP(s); if (F_ZEROP(f, r)) { - MP_DROP(w); MP_DROP(r); - MP_DROP(u); - MP_DROP(s); return (c->ops->dbl(c, d, a)); } else { - MP_DROP(w); MP_DROP(r); - MP_DROP(u); - MP_DROP(s); 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) -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; + int i, n = argc == 1 ? 1 : atoi(argv[1]); printf("ec-prime: "); fflush(stdout); @@ -445,25 +446,26 @@ int main(void) 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); - 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);