X-Git-Url: https://git.distorted.org.uk/u/mdw/catacomb/blobdiff_plain/34e4f738bcba58e6d8c4cabbb0b3232a65b42a9d..b2524d68efdcf16f3f7340da16094f17826c7b95:/group.h diff --git a/group.h b/group.h index 383bc82..a144706 100644 --- a/group.h +++ b/group.h @@ -1,13 +1,13 @@ /* -*-c-*- * - * $Id: group.h,v 1.1 2004/04/01 12:50:09 mdw Exp $ + * $Id$ * * General cyclic group abstraction * * (c) 2004 Straylight/Edgeware */ -/*----- Licensing notice --------------------------------------------------* +/*----- Licensing notice --------------------------------------------------* * * This file is part of Catacomb. * @@ -15,30 +15,18 @@ * it under the terms of the GNU Library General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. - * + * * Catacomb is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. - * + * * You should have received a copy of the GNU Library General Public * License along with Catacomb; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, * MA 02111-1307, USA. */ -/*----- Revision history --------------------------------------------------* - * - * $Log: group.h,v $ - * 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. - * 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.) - * - */ - #ifndef CATACOMB_GROUP_H #define CATACOMB_GROUP_H @@ -76,10 +64,10 @@ typedef struct ge ge; /* Group element (abstract type) */ #endif -typedef struct group { +typedef struct group_ { const struct group_ops *ops; /* Operations table */ size_t nbits; /* Size of an element in bits */ - size_t noctets; /* Size of an element in octets */ + size_t noctets; /* Size of raw element in octets */ ge *i; /* Identity element */ ge *g; /* Generator element */ mp *r; /* Order of the generator */ @@ -92,7 +80,11 @@ typedef struct group_expfactor { } group_expfactor; typedef struct group_ops { + + /* --- General information --- */ + unsigned ty; /* Type of this group */ + const char *name; /* Textual name string */ /* --- Memory management --- */ @@ -134,9 +126,11 @@ typedef struct group_ops { mp *(*toint)(group */*g*/, mp */*d*/, ge */*x*/); int (*fromint)(group */*g*/, ge */*d*/, mp */*x*/); int (*toec)(group */*g*/, ec */*d*/, ge */*x*/); - int (*fromec)(group */*g*/, ge */*d*/, ec */*p*/); + int (*fromec)(group */*g*/, ge */*d*/, const ec */*p*/); int (*tobuf)(group */*h*/, buf */*b*/, ge */*x*/); int (*frombuf)(group */*h*/, buf */*b*/, ge */*d*/); + int (*toraw)(group */*h*/, buf */*b*/, ge */*x*/); + int (*fromraw)(group */*h*/, buf */*b*/, ge */*d*/); } group_ops; @@ -146,6 +140,9 @@ enum { GTY_EC /* Elliptic curve group */ }; +#define G_NAME(g) (g)->ops->name +#define G_TYPE(g) (g)->ops->ty + #define G_DESTROYGROUP(g) (g)->ops->destroygroup((g)) #define G_CREATE(g) (g)->ops->create((g)) #define G_COPY(g, d, x) (g)->ops->copy((g), (d), (x)) @@ -174,6 +171,8 @@ enum { #define G_FROMEC(g, d, p) (g)->ops->fromec((g), (d), (p)) #define G_TOBUF(g, b, x) (g)->ops->tobuf((g), (b), (x)) #define G_FROMBUF(g, b, d) (g)->ops->frombuf((g), (b), (d)) +#define G_TORAW(g, b, x) (g)->ops->toraw((g), (b), (x)) +#define G_FROMRAW(g, b, d) (g)->ops->fromraw((g), (b), (d)) /*----- Handy functions ---------------------------------------------------*/ @@ -313,7 +312,7 @@ extern int group_stdtoec(group */*g*/, ec */*d*/, ge */*x*/); * * Arguments: @group *g@ = abstract group * @ge *d@ = destination pointer - * @ec *p@ = elliptic curve point + * @const ec *p@ = elliptic curve point * * Returns: Zero for success, @-1@ on failure. * @@ -321,7 +320,7 @@ extern int group_stdtoec(group */*g*/, ec */*d*/, ge */*x*/); * coordinate. */ -extern int group_stdfromec(group */*g*/, ge */*d*/, ec */*p*/); +extern int group_stdfromec(group */*g*/, ge */*d*/, const ec */*p*/); /*----- Prime field subgroups ---------------------------------------------*/ @@ -334,7 +333,7 @@ typedef struct gprime_param { * * Arguments: @const gprime_param *gp@ = group parameters * - * Returns: A pointer to the group. + * Returns: A pointer to the group, or null. * * Use: Constructs an abstract group interface for a subgroup of a * prime field. Group elements are @mp *@ pointers. @@ -342,13 +341,29 @@ typedef struct gprime_param { group *group_prime(const gprime_param */*gp*/); +/*----- Binary field subgroups --------------------------------------------*/ + +typedef gprime_param gbin_param; + +/* --- @group_binary@ --- * + * + * Arguments: @const gbin_param *gb@ = group parameters + * + * Returns: A pointer to the group, or null. + * + * Use: Constructs an abstract group interface for a subgroup of a + * prime field. Group elements are @mp *@ pointers. + */ + +group *group_binary(const gbin_param */*gp*/); + /*----- Elliptic curve groups ---------------------------------------------*/ /* --- @group_ec@ --- * * * Arguments: @const ec_info *ei@ = elliptic curve parameters * - * Returns: A pointer to the group. + * Returns: A pointer to the group, or null. * * Use: Constructs an abstract group interface for an elliptic curve * group. Group elements are @ec@ structures. The contents of