/* -*-c-*-
*
- * $Id: ec-prime.c,v 1.3.4.2 2004/03/20 00:13:31 mdw Exp $
+ * $Id: ec-prime.c,v 1.4 2004/03/21 22:52:06 mdw Exp $
*
* Elliptic curves over prime fields
*
/*----- Revision history --------------------------------------------------*
*
* $Log: ec-prime.c,v $
+ * Revision 1.4 2004/03/21 22:52:06 mdw
+ * Merge and close elliptic curve branch.
+ *
+ * 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
*
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);
}
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;
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);
}
#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);
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);