X-Git-Url: https://git.distorted.org.uk/u/mdw/catacomb/blobdiff_plain/34e4f738bcba58e6d8c4cabbb0b3232a65b42a9d..0f3faccdf5f2f0cfa40bd9bec495c4930052a51f:/g-ec.c diff --git a/g-ec.c b/g-ec.c index 1f214f7..dcf8a10 100644 --- a/g-ec.c +++ b/g-ec.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: g-ec.c,v 1.1 2004/04/01 12:50:09 mdw Exp $ + * $Id: g-ec.c,v 1.3 2004/04/04 19:04:11 mdw Exp $ * * Abstraction for elliptic curve groups * @@ -30,6 +30,12 @@ /*----- Revision history --------------------------------------------------* * * $Log: g-ec.c,v $ + * Revision 1.3 2004/04/04 19:04:11 mdw + * Raw I/O of elliptic curve points and group elements. + * + * Revision 1.2 2004/04/03 03:32:05 mdw + * General robustification. + * * Revision 1.1 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. @@ -47,6 +53,7 @@ #define ge ec #include "group.h" +#include "ec-raw.h" /*----- Data structures ---------------------------------------------------*/ @@ -179,6 +186,19 @@ static int gfrombuf(group *gg, buf *b, ec *d) { if (!rc) EC_COPY(d, &t); EC_DESTROY(&t); return (rc); } +static int gtoraw(group *gg, buf *b, ec *x) { + gctx *g = (gctx *)gg; ec t = EC_INIT; int rc; + EC_OUT(g->ei.c, &t, x); rc = ec_putraw(g->ei.c, b, &t); + EC_DESTROY(&t); return (rc); +} + +static int gfromraw(group *gg, buf *b, ec *d) { + gctx *g = (gctx *)gg; ec t = EC_INIT; int rc; + if (ec_getraw(g->ei.c, b, &t)) return (-1); + EC_IN(g->ei.c, &t, &t); rc = EC_CHECK(g->ei.c, &t); + if (!rc) EC_COPY(d, &t); EC_DESTROY(&t); return (rc); +} + /* --- @group_ec@ --- * * * Arguments: @const ec_info *ei@ = elliptic curve parameters @@ -199,7 +219,7 @@ static const group_ops gops = { gcheck, gmul, gsqr, ginv, gdiv, gexp, gmexp, gread, gwrite, - gtoint, gfromint, gtoec, gfromec, gtobuf, gfrombuf + gtoint, gfromint, gtoec, gfromec, gtobuf, gfrombuf, gtoraw, gfromraw }; group *group_ec(const ec_info *ei) @@ -208,11 +228,12 @@ group *group_ec(const ec_info *ei) g->g.ops = &gops; g->g.nbits = ei->c->f->nbits * 2; - g->g.noctets = ei->c->f->noctets * 2; + g->g.noctets = ei->c->f->noctets * 2 + 1; g->ei = *ei; EC_CREATE(&g->id); g->g.i = &g->id; EC_CREATE(&g->gen); + g->g.g = &g->gen; EC_IN(g->ei.c, &g->gen, &ei->g); g->g.r = ei->r; g->g.h = ei->h;