Merge branch 'master' of git+ssh://metalzone.distorted.org.uk/~mdw/public-git/catacomb/
[u/mdw/catacomb] / utils / ecptdecompress.c
index dcfdcbd..e438696 100644 (file)
@@ -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);
 }