X-Git-Url: https://git.distorted.org.uk/u/mdw/catacomb/blobdiff_plain/1ba83484ee5bb486da9aa958576de4bc29ef0c1d..34e4f738bcba58e6d8c4cabbb0b3232a65b42a9d:/ec-prime.c diff --git a/ec-prime.c b/ec-prime.c index ce81ba1..b2652b2 100644 --- a/ec-prime.c +++ b/ec-prime.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: ec-prime.c,v 1.8 2004/03/27 17:54:11 mdw Exp $ + * $Id: ec-prime.c,v 1.9 2004/04/01 12:50:09 mdw Exp $ * * Elliptic curves over prime fields * @@ -30,6 +30,13 @@ /*----- Revision history --------------------------------------------------* * * $Log: ec-prime.c,v $ + * Revision 1.9 2004/04/01 12:50:09 mdw + * Add cyclic group abstraction, with test code. Separate off exponentation + * functions for better static linking. Fix a buttload of bugs on the way. + * Generally ensure that negative exponents do inversion correctly. Add + * table of standard prime-field subgroups. (Binary field subgroups are + * currently unimplemented but easy to add if anyone ever finds a good one.) + * * Revision 1.8 2004/03/27 17:54:11 mdw * Standard curves and curve checking. * @@ -349,10 +356,12 @@ static ec *ecprojadd(ec_curve *c, ec *d, const ec *a, const ec *b) static int eccheck(ec_curve *c, const ec *p) { field *f = c->f; + mp *l, *x, *r; int rc; - mp *l = F_SQR(f, MP_NEW, p->y); - mp *x = F_SQR(f, MP_NEW, p->x); - mp *r = F_MUL(f, MP_NEW, x, p->x); + if (EC_ATINF(p)) return (0); + l = F_SQR(f, MP_NEW, p->y); + x = F_SQR(f, MP_NEW, p->x); + r = F_MUL(f, MP_NEW, x, p->x); x = F_MUL(f, x, c->a, p->x); r = F_ADD(f, r, r, x); r = F_ADD(f, r, r, c->b); @@ -422,17 +431,17 @@ extern ec_curve *ec_primeproj(field *f, mp *a, mp *b) } static const ec_ops ec_primeops = { - ecdestroy, ec_idin, ec_idout, ec_idfix, + ecdestroy, ec_stdsamep, ec_idin, ec_idout, ec_idfix, ecfind, ecneg, ecadd, ec_stdsub, ecdbl, eccheck }; static const ec_ops ec_primeprojops = { - ecdestroy, ec_projin, ec_projout, ec_projfix, + ecdestroy, ec_stdsamep, ec_projin, ec_projout, ec_projfix, ecfind, ecneg, ecprojadd, ec_stdsub, ecprojdbl, ecprojcheck }; static const ec_ops ec_primeprojxops = { - ecdestroy, ec_projin, ec_projout, ec_projfix, + ecdestroy, ec_stdsamep, ec_projin, ec_projout, ec_projfix, ecfind, ecneg, ecprojadd, ec_stdsub, ecprojxdbl, ecprojcheck };