X-Git-Url: https://git.distorted.org.uk/u/mdw/catacomb/blobdiff_plain/34e4f738bcba58e6d8c4cabbb0b3232a65b42a9d..b817bfc642225b8c3c0b6a7e42d1fb949b61a606:/ec-info.c diff --git a/ec-info.c b/ec-info.c index a99cba5..1a95cd2 100644 --- a/ec-info.c +++ b/ec-info.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: ec-info.c,v 1.2 2004/04/01 12:50:09 mdw Exp $ + * $Id: ec-info.c,v 1.5 2004/04/08 01:36:15 mdw Exp $ * * Elliptic curve information management * @@ -27,21 +27,6 @@ * MA 02111-1307, USA. */ -/*----- Revision history --------------------------------------------------* - * - * $Log: ec-info.c,v $ - * Revision 1.2 2004/04/01 12:50:09 mdw - * Add cyclic group abstraction, with test code. Separate off exponentation - * functions for better static linking. Fix a buttload of bugs on the way. - * Generally ensure that negative exponents do inversion correctly. Add - * table of standard prime-field subgroups. (Binary field subgroups are - * currently unimplemented but easy to add if anyone ever finds a good one.) - * - * Revision 1.1 2004/03/27 17:54:11 mdw - * Standard curves and curve checking. - * - */ - /*----- Header files ------------------------------------------------------*/ #include "ec.h" @@ -126,6 +111,10 @@ ec_curve *ec_curveparse(qd_parse *qd) default: goto fail; } + if (!c) { + qd->e = "bad curve parameters"; + goto fail; + } if (a) MP_DROP(a); if (b) MP_DROP(b); return (c); @@ -202,10 +191,15 @@ static void getinfo(ec_info *ei, ecdata *ed) f = field_binpoly(&ed->p); ei->c = ec_binproj(f, &ed->a, &ed->b); break; + case FTAG_BINNORM: + f = field_binnorm(&ed->p, &ed->beta); + ei->c = ec_binproj(f, &ed->a, &ed->b); + break; default: abort(); } + assert(f); assert(ei->c); EC_CREATE(&ei->g); ei->g.x = &ed->gx; ei->g.y = &ed->gy; ei->g.z = 0; ei->r = &ed->r; ei->h = &ed->h; } @@ -239,12 +233,9 @@ int ec_infoparse(qd_parse *qd, ec_info *ei) const ecentry *ee; mp *r = MP_NEW, *h = MP_NEW; - for (ee = ectab; ee->name; ee++) { - if (qd_enum(qd, ee->name) >= 0) { - getinfo(ei, ee->data); - goto found; - } - } + for (ee = ectab; ee->name; ee++) + if (qd_enum(qd, ee->name) >= 0) { getinfo(ei, ee->data); goto found; } + if ((c = ec_curveparse(qd)) == 0) goto fail; qd_delim(qd, '/'); if (!ec_ptparse(qd, &g)) goto fail; qd_delim(qd, ':'); if ((r = qd_getmp(qd)) == 0) goto fail;