X-Git-Url: https://git.distorted.org.uk/u/mdw/catacomb/blobdiff_plain/38b901110909d19388502b487f0529514cf853ff..298182ad446aaced14dea7ed0e7c968946787288:/utils/ecptdecompress.c diff --git a/utils/ecptdecompress.c b/utils/ecptdecompress.c index dcfdcbd..e438696 100644 --- a/utils/ecptdecompress.c +++ b/utils/ecptdecompress.c @@ -9,6 +9,7 @@ #include "ec.h" #include "mp.h" #include "rand.h" +#include "field-guts.h" static void puthex(const char *name, mp *x, size_t n) { @@ -42,6 +43,7 @@ int main(int argc, char *argv[]) size_t n; octet *p; mp *x, *y = 0, *yy = 0; + mp *t = MP_NEW; const char *err; qd.p = argv[1]; @@ -77,7 +79,7 @@ int main(int argc, char *argv[]) y = mp_loadb(MP_NEW, p + n + 1, n); } if (p[0] & 0x02) { - if (!EC_FIND(c, &pt, x)) { + if (!ec_find(c, &pt, x)) { fprintf(stderr, "no matching y\n"); exit(1); } @@ -85,26 +87,30 @@ int main(int argc, char *argv[]) ec_destroy(&pt); switch (F_TYPE(c->f)) { case FTY_PRIME: - if (!MP_ISODD(yy) != !(p[0] & 1)) + if (!MP_ODDP(yy) != !(p[0] & 1)) yy = mp_sub(yy, c->f->m, yy); break; case FTY_BINARY: - if (MP_ISZERO(x)) + if (MP_ZEROP(x)) yy = F_SQRT(c->f, MP_NEW, c->b); else { - mp *xx = F_SQR(c->f, MP_NEW, x); + mp *xin = F_IN(c->f, MP_NEW, x); + mp *xx = F_SQR(c->f, MP_NEW, xin); mp *b = F_MUL(c->f, MP_NEW, xx, c->a); - mp *xxx = F_MUL(c->f, MP_NEW, xx, x); + mp *xxx = F_MUL(c->f, MP_NEW, xx, xin); b = F_ADD(c->f, b, b, xxx); b = F_ADD(c->f, b, b, c->b); xx = F_INV(c->f, xx, xx); b = F_MUL(c->f, b, b, xx); mp_drop(xxx); - mp_drop(xx); yy = F_QUADSOLVE(c->f, MP_NEW, b); - if (!MP_ISODD(yy) != !(p[0] & 1)) - yy = mp_add(yy, yy, MP_ONE); - yy = F_MUL(c->f, yy, yy, x); + xx = F_OUT(c->f, xx, yy); + if (!MP_ODDP(xx) != !(p[0] & 1)) + yy = gf_add(yy, yy, MP_ONE); + yy = F_MUL(c->f, yy, yy, xin); + yy = F_OUT(c->f, yy, yy); + mp_drop(xin); + mp_drop(xx); } break; default: @@ -120,18 +126,21 @@ int main(int argc, char *argv[]) mp_drop(y); mp_drop(yy); } - if ((err = ec_checkinfo(&ei, &rand_global)) != 0) { + if ((err = ec_checkinfo(&ei, &rand_global)) != 0) fprintf(stderr, "bad curve: %s\n", err); - exit(0); - } puthex("p", ei.c->f->m, 0); - puthex("a", ei.c->a, c->f->noctets); - puthex("b", ei.c->b, c->f->noctets); + if (strcmp(F_NAME(ei.c->f), "binnorm") == 0) { + fctx_binnorm *fc = (fctx_binnorm *)ei.c->f; + puthex("beta", fc->ntop.r[fc->ntop.n - 1], c->f->noctets); + } + t = F_OUT(ei.c->f, t, ei.c->a); puthex("a", t, c->f->noctets); + t = F_OUT(ei.c->f, t, ei.c->b); puthex("b", t, c->f->noctets); puthex("r", ei.r, c->f->noctets); printf(" h "); mp_writefile(ei.h, stdout, 10); putchar('\n'); puthex("gx", ei.g.x, c->f->noctets); puthex("gy", ei.g.y, c->f->noctets); ec_freeinfo(&ei); + mp_drop(t); dstr_destroy(&d); return (0); }