#include "ec.h"
#include "mp.h"
#include "rand.h"
+#include "field-guts.h"
static void puthex(const char *name, mp *x, size_t n)
{
size_t n;
octet *p;
mp *x, *y = 0, *yy = 0;
+ mp *t = MP_NEW;
const char *err;
qd.p = argv[1];
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);
}
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:
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);
}