X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb/blobdiff_plain/3f19a2c175f432aac4c1721495ed9863e6099818..HEAD:/math/ec-prime.c diff --git a/math/ec-prime.c b/math/ec-prime.c index c2ec2889..46b98856 100644 --- a/math/ec-prime.c +++ b/math/ec-prime.c @@ -328,6 +328,17 @@ static int ecprojcheck(ec_curve *c, const ec *p) return (rc); } +static int eccompr(ec_curve *c, const ec *p) +{ + /* --- Just take the LSB of %$y$% --- + * + * Since @p@ is odd, either %$y$% or %$-y = p - y$% must be odd, so this + * disambiguates. + */ + + return (MP_ODDP(p->y)); +} + static void ecdestroy(ec_curve *c) { MP_DROP(c->a); @@ -378,19 +389,19 @@ extern ec_curve *ec_primeproj(field *f, mp *a, mp *b) static const ec_ops ec_primeops = { "prime", ecdestroy, ec_stdsamep, ec_idin, ec_idout, ec_idfix, - ecfind, ecneg, ecadd, ec_stdsub, ecdbl, eccheck + ecfind, ecneg, ecadd, ec_stdsub, ecdbl, eccheck, eccompr }; static const ec_ops ec_primeprojops = { "primeproj", ecdestroy, ec_stdsamep, ec_projin, ec_projout, ec_projfix, - ecfind, ecneg, ecprojadd, ec_stdsub, ecprojdbl, ecprojcheck + ecfind, ecneg, ecprojadd, ec_stdsub, ecprojdbl, ecprojcheck, eccompr }; static const ec_ops ec_primeprojxops = { "primeproj", ecdestroy, ec_stdsamep, ec_projin, ec_projout, ec_projfix, - ecfind, ecneg, ecprojadd, ec_stdsub, ecprojxdbl, ecprojcheck + ecfind, ecneg, ecprojadd, ec_stdsub, ecprojxdbl, ecprojcheck, eccompr }; /*----- Test rig ----------------------------------------------------------*/