From a02032a37c71fcbe35796781d3dad8ff068ca611 Mon Sep 17 00:00:00 2001 From: mdw Date: Sat, 5 Mar 2005 16:43:25 +0000 Subject: [PATCH] Add some fast paths for standard operations. --- ec.c | 51 ++++++++++++++++++++++----------------------------- 1 file changed, 22 insertions(+), 29 deletions(-) diff --git a/ec.c b/ec.c index a84dd7a..e5e1c87 100644 --- a/ec.c +++ b/ec.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: ec.c,v 1.10 2004/04/08 01:36:15 mdw Exp $ + * $Id$ * * Elliptic curve definitions * @@ -46,7 +46,8 @@ int ec_samep(ec_curve *c, ec_curve *d) { - return (field_samep(c->f, d->f) && c->ops == d->ops && EC_SAMEP(c, d)); + return (c == d || (field_samep(c->f, d->f) && + c->ops == d->ops && EC_SAMEP(c, d))); } /* --- @ec_create@ --- * @@ -127,9 +128,7 @@ int ec_eq(const ec *p, const ec *q) { return (EC_EQ(p, q)); } */ int ec_stdsamep(ec_curve *c, ec_curve *d) -{ - return (MP_EQ(c->a, d->a) && MP_EQ(c->b, d->b)); -} + { return (MP_EQ(c->a, d->a) && MP_EQ(c->b, d->b)); } /* --- @ec_idin@, @ec_idout@, @ec_idfix@ --- * * @@ -171,10 +170,7 @@ ec *ec_idout(ec_curve *c, ec *d, const ec *p) } ec *ec_idfix(ec_curve *c, ec *d, const ec *p) -{ - EC_COPY(d, p); - return (d); -} + { EC_COPY(d, p); return (d); } /* --- @ec_projin@, @ec_projout@, @ec_projfix@ --- * * @@ -208,16 +204,21 @@ ec *ec_projout(ec_curve *c, ec *d, const ec *p) else { mp *x, *y, *z, *zz; field *f = c->f; - z = F_INV(f, MP_NEW, p->z); - zz = F_SQR(f, MP_NEW, z); - z = F_MUL(f, z, zz, z); - x = F_MUL(f, d->x, p->x, zz); - y = F_MUL(f, d->y, p->y, z); - mp_drop(z); - mp_drop(zz); + if (p->z == f->one) { + d->x = F_OUT(f, d->x, p->x); + d->y = F_OUT(f, d->y, p->y); + } else { + z = F_INV(f, MP_NEW, p->z); + zz = F_SQR(f, MP_NEW, z); + z = F_MUL(f, z, zz, z); + x = F_MUL(f, d->x, p->x, zz); + y = F_MUL(f, d->y, p->y, z); + mp_drop(z); + mp_drop(zz); + d->x = F_OUT(f, x, x); + d->y = F_OUT(f, y, y); + } mp_drop(d->z); - d->x = F_OUT(f, x, x); - d->y = F_OUT(f, y, y); d->z = 0; } return (d); @@ -227,7 +228,7 @@ ec *ec_projfix(ec_curve *c, ec *d, const ec *p) { if (EC_ATINF(p)) EC_SETINF(d); - else if (d->z == c->f->one) + else if (p->z == c->f->one) EC_COPY(d, p); else { mp *z, *zz; @@ -315,11 +316,7 @@ ec *ec_find(ec_curve *c, ec *d, mp *x) */ ec *ec_neg(ec_curve *c, ec *d, const ec *p) -{ - EC_IN(c, d, p); - EC_NEG(c, d, d); - return (EC_OUT(c, d, d)); -} + { EC_IN(c, d, p); EC_NEG(c, d, d); return (EC_OUT(c, d, d)); } /* --- @ec_add@ --- * * @@ -379,11 +376,7 @@ ec *ec_sub(ec_curve *c, ec *d, const ec *p, const ec *q) */ ec *ec_dbl(ec_curve *c, ec *d, const ec *p) -{ - EC_IN(c, d, p); - EC_DBL(c, d, d); - return (EC_OUT(c, d, d)); -} + { EC_IN(c, d, p); EC_DBL(c, d, d); return (EC_OUT(c, d, d)); } /* --- @ec_check@ --- * * -- 2.11.0