X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb-python/blobdiff_plain/46e6ad89d596d0987f00440c77e42c36f7d347f7..c93e8163160949406149bf490440bbff23ea4e50:/catacomb-python.h diff --git a/catacomb-python.h b/catacomb-python.h index b9b1fd5..6bae38a 100644 --- a/catacomb-python.h +++ b/catacomb-python.h @@ -1,13 +1,11 @@ /* -*-c-*- * - * $Id$ - * * Definitions for Catacomb bindings * * (c) 2004 Straylight/Edgeware */ -/*----- Licensing notice --------------------------------------------------* +/*----- Licensing notice --------------------------------------------------* * * This file is part of the Python interface to Catacomb. * @@ -15,12 +13,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. - * + * * Catacomb/Python 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 General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with Catacomb/Python; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. @@ -35,19 +33,18 @@ /*----- Header files ------------------------------------------------------*/ -#include -#include -#include +#include "pyke/pyke-mLib.h" -#undef ULLONG_MAX -#undef ULONG_LONG_MAX +PUBLIC_SYMBOLS; +#include -#include #include #include #include +#include #include +#include #include #include @@ -59,15 +56,20 @@ #include #include #include +#include #include +#include #include #include #include #include +#include #include #include #include +#include +#include #include #include @@ -76,6 +78,7 @@ #include #include #include +#include #include #include @@ -85,6 +88,10 @@ #include #include #include +#include +#include +#include +#include #include #include @@ -110,98 +117,53 @@ #include #include +PRIVATE_SYMBOLS; -/*----- Utility macros ----------------------------------------------------*/ - -#define RETURN_OBJ(obj) do { Py_INCREF(obj); return (obj); } while (0) -#define RETURN_NONE RETURN_OBJ(Py_None) -#define RETURN_NOTIMPL RETURN_OBJ(Py_NotImplemented) -#define RETURN_TRUE RETURN_OBJ(Py_True) -#define RETURN_FALSE RETURN_OBJ(Py_False) -#define RETURN_ME RETURN_OBJ(me) - -#define EXCERR(exc, str) do { \ - PyErr_SetString(exc, str); \ - goto end; \ -} while (0) -#define VALERR(str) EXCERR(PyExc_ValueError, str) -#define TYERR(str) EXCERR(PyExc_TypeError, str) -#define ZDIVERR(str) EXCERR(PyExc_ZeroDivisionError, str) -#define SYNERR(str) EXCERR(PyExc_SyntaxError, str) -#define SYSERR(str) EXCERR(PyExc_SystemError, str) -#define INDEXERR(idx) do { \ - PyErr_SetObject(PyExc_KeyError, idx); \ - goto end; \ -} while (0) -#define OSERR(name) do { \ - PyErr_SetFromErrnoWithFilename(PyExc_OSError, name); \ - goto end; \ -} while (0) -#define PGENERR do { pgenerr(); goto end; } while (0) - -#define CONVFUNC(ty, cty, ext) \ - int conv##ty(PyObject *o, void *p) \ - { \ - if (!PyObject_TypeCheck(o, ty##_pytype)) \ - TYERR("wanted a " #ty); \ - *(cty *)p = ext(o); \ - return (1); \ - end: \ - return (0); \ - } - -#define root_pytype 0 -#define type_pytype &PyType_Type -#define INITTYPE(ty, base) do { \ - ty##_pytype_skel.tp_base = base##_pytype; \ - ty##_pytype = inittype(&ty##_pytype_skel); \ -} while (0) - -#define INSERT(name, ob) do { \ - PyObject *_o = (PyObject *)(ob); \ - Py_INCREF(_o); \ - PyModule_AddObject(mod, name, _o); \ -} while (0) - -#define INSEXC(name, var, base, meth) \ - INSERT(name, var = mkexc(mod, base, name, meth)) - -#define METH(func, doc) \ - { #func, METHNAME(func), METH_VARARGS, doc }, -#define KWMETH(func, doc) \ - { #func, (PyCFunction)METHNAME(func), \ - METH_VARARGS | METH_KEYWORDS, doc }, - -#define GET(func, doc) \ - { #func, GETSETNAME(get, func), 0, doc }, -#define GETSET(func, doc) \ - { #func, GETSETNAME(get, func), GETSETNAME(set, func), doc }, - -#define MEMBER(name, ty, f, doc) \ - { #name, ty, offsetof(MEMBERSTRUCT, name), f, doc }, +/*----- Miscellaneous preliminaries ---------------------------------------*/ +/* Submodules. */ #define MODULES(_) \ + _(pyke_core) _(pyke_gmap) \ _(bytestring) _(buffer) \ _(rand) _(algorithms) _(pubkey) _(pgen) \ _(mp) _(field) _(ec) _(group) \ _(passphrase) _(share) _(key) -#define DOMODINIT(m) m##_pyinit(); -#define DOMODINSERT(m) m##_pyinsert(mod); -#define INIT_MODULES do { MODULES(DOMODINIT) } while (0) -#define INSERT_MODULES do { MODULES(DOMODINSERT) } while (0) +MODULES(DECLARE_MODINIT) + +/* Exceptions. */ +#define PGENERR(err) do { pgenerr(err); goto end; } while (0) + +/* Conversions. */ +extern int convmpw(PyObject *, void *); -#define DO(m) \ - extern void m##_pyinit(void); \ - extern void m##_pyinsert(PyObject *); -MODULES(DO) -#undef DO +/* Make a dictionary of generic-crypto classes. */ +#define GEN(func, base) \ + static PyObject *func(void) \ + { \ + PyObject *d = PyDict_New(); \ + PyObject *o; \ + int i; \ + \ + for (i = 0; g##base##tab[i]; i++) { \ + o = gc##base##_pywrap((/*unconst*/ gc##base *)g##base##tab[i]); \ + PyDict_SetItemString(d, \ + (/*unconst*/ char *)g##base##tab[i]->name, \ + o); \ + Py_DECREF(o); \ + } \ + return (d); \ + } -#define FREEOBJ(obj) \ - (((PyObject *)(obj))->ob_type->tp_free((PyObject *)(obj))) +/* Common handling for simultaneous exponentiation. */ +extern PyObject *mexp_common(PyObject *, PyObject *, size_t, + PyObject *(*id)(PyObject *), + int (*fill)(void *, PyObject *, + PyObject *, PyObject *), + PyObject *(*exp)(PyObject *, void *, int), + void (*drop)(void *)); /*----- Bytestrings -------------------------------------------------------*/ -PyTypeObject *bytestring_pyobj; PyObject *bytestring_pywrap(const void *, size_t); PyObject *bytestring_pywrapbuf(buf *); @@ -218,8 +180,8 @@ extern PyTypeObject *gf_pytype; #define MP_PYCHECK(o) PyObject_TypeCheck((o), mp_pytype) #define GF_PYCHECK(o) PyObject_TypeCheck((o), gf_pytype) -extern mp *mp_frompylong(PyLongObject *); -extern PyLongObject *mp_topylong(mp *); +extern mp *mp_frompylong(PyObject *); +extern PyObject *mp_topylong(mp *); extern mp *tomp(PyObject *); extern mp *getmp(PyObject *); extern int convmp(PyObject *, void *); @@ -227,10 +189,11 @@ extern mp *getgf(PyObject *); extern int convgf(PyObject *, void *); extern PyObject *mp_pywrap(mp *); extern PyObject *gf_pywrap(mp *); +extern long mphash(mp *); extern mp *mp_frompyobject(PyObject *, int); extern PyObject *mp_topystring(mp *, int, const char *, const char *, const char *); -extern int mp_tolong_checked(mp *, long *); +extern int mp_tolong_checked(mp *, long *, int); /*----- Abstract fields ---------------------------------------------------*/ @@ -239,20 +202,6 @@ typedef struct field_pyobj { field *f; } field_pyobj; -extern PyTypeObject *fe_pytype; -#define FE_PYCHECK(o) PyObject_TypeCheck((o), fe_pytype) -#define FE_F(o) (((fe_pyobj *)(o))->f) -#define FE_FOBJ(o) ((PyObject *)(o)->ob_type) -#define FE_X(o) (((fe_pyobj *)(o))->x) -extern PyObject *fe_pywrap(PyObject *, mp *); -extern mp *getfe(field *, PyObject *); - -typedef struct fe_pyobj { - PyObject_HEAD - field *f; - mp *x; -} fe_pyobj; - extern PyTypeObject *field_pytype; extern PyTypeObject *primefield_pytype; extern PyTypeObject *niceprimefield_pytype; @@ -264,8 +213,38 @@ extern PyTypeObject *binnormfield_pytype; extern PyObject *field_pywrap(field *); extern field *field_copy(field *); +typedef struct fe_pyobj { + PyObject_HEAD + field *f; + mp *x; +} fe_pyobj; + +extern PyTypeObject *fe_pytype; +#define FE_PYCHECK(o) PyObject_TypeCheck((o), fe_pytype) +#define FE_F(o) (((fe_pyobj *)(o))->f) +#define FE_FOBJ(o) ((PyObject *)(o)->ob_type) +#define FE_X(o) (((fe_pyobj *)(o))->x) +extern PyObject *fe_pywrap(PyObject *, mp *); + /*----- Elliptic curves ---------------------------------------------------*/ +typedef struct eccurve_pyobj { + PyHeapTypeObject ty; + ec_curve *c; + PyObject *fobj; +} eccurve_pyobj; + +extern PyTypeObject *eccurve_pytype; +extern PyTypeObject *ecprimecurve_pytype; +extern PyTypeObject *ecprimeprojcurve_pytype; +extern PyTypeObject *ecbincurve_pytype; +extern PyTypeObject *ecbinprojcurve_pytype; +#define ECCURVE_PYCHECK(o) PyObject_TypeCheck((o), eccurve_pytype) +#define ECCURVE_C(o) (((eccurve_pyobj *)(o))->c) +#define ECCURVE_FOBJ(o) (((eccurve_pyobj *)(o))->fobj) +extern PyObject *eccurve_pywrap(PyObject *, ec_curve *); +extern ec_curve *eccurve_copy(ec_curve *); + typedef struct ecpt_pyobj { PyObject_HEAD ec_curve *c; @@ -286,29 +265,12 @@ extern int getecpt(ec_curve *, ec *, PyObject *); extern void getecptout(ec *, PyObject *); extern int convecpt(PyObject *, void *); -typedef struct eccurve_pyobj { - PyHeapTypeObject ty; - ec_curve *c; - PyObject *fobj; -} eccurve_pyobj; - -extern PyTypeObject *eccurve_pytype; -extern PyTypeObject *ecprimecurve_pytype; -extern PyTypeObject *ecprimeprojcurve_pytype; -extern PyTypeObject *ecbincurve_pytype; -extern PyTypeObject *ecbinprojcurve_pytype; -#define ECCURVE_PYCHECK(o) PyObject_TypeCheck((o), eccurve_pytype) -#define ECCURVE_C(o) (((eccurve_pyobj *)(o))->c) -#define ECCURVE_FOBJ(o) (((eccurve_pyobj *)(o))->fobj) -extern PyObject *eccurve_pywrap(PyObject *, ec_curve *); -extern ec_curve *eccurve_copy(ec_curve *); - typedef struct ecinfo_pyobj { PyObject_HEAD ec_info ei; PyObject *cobj; } ecinfo_pyobj; - + extern PyTypeObject *ecinfo_pytype; #define ECINFO_PYCHECK(o) PyObject_TypeCheck((o), ecinfo_pytype) #define ECINFO_EI(o) (&((ecinfo_pyobj *)(o))->ei) @@ -318,15 +280,6 @@ extern PyObject *ecinfo_pywrap(ec_info *); /*----- Cyclic groups -----------------------------------------------------*/ -typedef struct fginfo_pyobj { - PyObject_HEAD - gprime_param dp; -} fginfo_pyobj; - -PyTypeObject *fginfo_pytype, *dhinfo_pytype, *bindhinfo_pytype; -#define FGINFO_DP(fg) (&((fginfo_pyobj *)(fg))->dp) -PyObject *fginfo_pywrap(gprime_param *, PyTypeObject *); - typedef struct ge_pyobj { PyObject_HEAD ge *x; @@ -346,7 +299,6 @@ typedef struct group_pyobj { } group_pyobj; extern PyTypeObject *group_pytype; -extern PyTypeObject *primegroup_pytype, *bingroup_pytype, *ecgroup_pytype; #define GROUP_G(o) (((group_pyobj *)(o))->g) extern PyObject *group_pywrap(group *); extern group *group_copy(group *); @@ -361,9 +313,7 @@ typedef struct grand_pyobj { grand *r; } grand_pyobj; -extern PyTypeObject *grand_pytype, *truerand_pytype; -extern PyTypeObject *lcrand_pytype,* fibrand_pytype; -extern PyTypeObject *dsarand_pytype, *bbs_pytype; +extern PyTypeObject *grand_pytype; extern PyObject *rand_pyobj; #define GRAND_PYCHECK(o) PyObject_TypeCheck((o), grand_pytype) #define GRAND_F(o) (((grand_pyobj *)(o))->f) @@ -371,55 +321,12 @@ extern PyObject *rand_pyobj; extern PyObject *grand_pywrap(grand *, unsigned); extern int convgrand(PyObject *, void *); -/*----- Key sizes ---------------------------------------------------------*/ - -typedef struct keysz_pyobj { - PyObject_HEAD - int dfl; -} keysz_pyobj; - -typedef struct keyszrange_pyobj { - PyObject_HEAD - int dfl; - int min, max, mod; -} keyszrange_pyobj; - -typedef struct keyszset_pyobj { - PyObject_HEAD - int dfl; - PyObject *set; -} keyszset_pyobj; - -#define KEYSZ_PYCHECK(o) PyObject_TypeCheck((o), keysz_pytype) -extern PyObject *keysz_pywrap(const octet *); - /*----- Symmetric cryptography --------------------------------------------*/ -typedef struct gccipher_pyobj { - PyHeapTypeObject ty; - gccipher *cc; -} gccipher_pyobj; +extern PyObject *keysz_pywrap(const octet *); -extern PyTypeObject *gccipher_pytype; -#define GCCIPHER_PYCHECK(o) PyObject_TypeCheck((o), gccipher_pytype) -#define GCCIPHER_CC(o) (((gccipher_pyobj *)(o))->cc) -#define GCCIPHER_F(o) (((gccipher_pyobj *)(o))->f) -extern PyObject *gccipher_pywrap(gccipher *); extern int convgccipher(PyObject *, void *); -extern int convgcipher(PyObject *, void *); - -typedef struct gcipher_pyobj { - PyObject_HEAD - unsigned f; - gcipher *c; -} gcipher_pyobj; - -extern PyTypeObject *gcipher_pytype; -#define GCIPHER_PYCHECK(o) PyObject_TypeCheck((o), gcipher_pytype) -#define GCIPHER_C(o) (((gcipher_pyobj *)(o))->c) -#define GCIPHER_F(o) (((gcipher_pyobj *)(o))->f) -extern PyObject *gcipher_pywrap(PyObject *, gcipher *, unsigned); -extern int convgcipher(PyObject *, void *); +extern PyObject *gccipher_pywrap(gccipher *); typedef struct gchash_pyobj { PyHeapTypeObject ty; @@ -427,54 +334,17 @@ typedef struct gchash_pyobj { } gchash_pyobj; extern PyTypeObject *gchash_pytype; +extern PyObject *sha_pyobj, *has160_pyobj; #define GCHASH_PYCHECK(o) PyObject_TypeCheck((o), gchash_pytype) #define GCHASH_CH(o) (((gchash_pyobj *)(o))->ch) -#define GCHASH_F(o) (((gchash_pyobj *)(o))->f) -extern PyObject *gchash_pywrap(gchash *); +extern PyObject *ghash_pywrap(PyObject *, ghash *); extern int convgchash(PyObject *, void *); - -typedef struct ghash_pyobj { - PyObject_HEAD - unsigned f; - ghash *h; -} ghash_pyobj; - -extern PyTypeObject *ghash_pytype, *gmhash_pytype; -extern PyObject *sha_pyobj, *has160_pyobj; -#define GHASH_PYCHECK(o) PyObject_TypeCheck((o), ghash_pytype) -#define GHASH_H(o) (((ghash_pyobj *)(o))->h) -#define GHASH_F(o) (((ghash_pyobj *)(o))->f) -extern PyObject *ghash_pywrap(PyObject *, ghash *, unsigned); extern int convghash(PyObject *, void *); -extern int convgmhash(PyObject *, void *); -typedef struct gcmac_pyobj { - PyHeapTypeObject ty; - gcmac *cm; -} gcmac_pyobj; - -extern PyTypeObject *gcmac_pytype; -#define GCMAC_PYCHECK(o) PyObject_TypeCheck((o), gcmac_pytype) -#define GCMAC_CM(o) (((gcmac_pyobj *)(o))->cm) -#define GCMAC_F(o) (((gcmac_pyobj *)(o))->f) -extern PyObject *gcmac_pywrap(gcmac *); extern int convgcmac(PyObject *, void *); -typedef struct gmac_pyobj { - PyHeapTypeObject ty; - unsigned f; - gmac *m; -} gmac_pyobj; - -extern PyTypeObject *gmac_pytype; -#define GMAC_PYCHECK(o) PyObject_TypeCheck((o), gmac_pytype) -#define GMAC_M(o) (((gmac_pyobj *)(o))->m) -#define GMAC_F(o) (((gmac_pyobj *)(o))->f) -extern PyObject *gmac_pywrap(PyObject *, gmac *, unsigned); -extern int convgmac(PyObject *, void *); - /*----- Key generation ----------------------------------------------------*/ - + typedef struct pfilt_pyobj { PyObject_HEAD pfilt f; @@ -497,34 +367,15 @@ extern PyTypeObject *pgev_pytype; #define PGEV_PYCHECK(o) PyObject_TypeCheck(o, pgev_pytype) #define PGEV_PG(o) (&((pgev_pyobj *)(o))->pg) -extern int convpgev(PyObject *, void *); -extern void droppgev(pgev *); -extern void pgenerr(void); - -/*----- Core utility functions --------------------------------------------*/ +typedef struct pypgev { + pgev ev; + PyObject *obj; + struct excinfo *exc; +} pypgev; -extern PyObject *mexp_common(PyObject *, PyObject *, size_t, - PyObject *(*id)(PyObject *), - int (*fill)(void *, PyObject *, - PyObject *, PyObject *), - PyObject *(*exp)(PyObject *, void *, int), - void (*drop)(void *)); - -extern int convulong(PyObject *, void *); -#define DECL_CONVU_(n) extern int convu##n(PyObject *, void *); -DOUINTSZ(DECL_CONVU_) -extern int convmpw(PyObject *, void *); -extern int convuint(PyObject *, void *); -extern int convszt(PyObject *, void *); -extern int convbool(PyObject *, void *); -extern PyObject *abstract_pynew(PyTypeObject *, PyObject *, PyObject *); -extern PyObject *getbool(int); -#define DECL_GETU_(n) extern PyObject *getu##n(uint##n); -DOUINTSZ(DECL_GETU_) -extern PyObject * mkexc(PyObject *, PyObject *, const char *, PyMethodDef *); -extern void *newtype(PyTypeObject *, const PyTypeObject *, const char *); -extern PyTypeObject *inittype(PyTypeObject *); -extern void addmethods(const PyMethodDef *); +extern int convpgev(PyObject *, void *); +extern void droppgev(pypgev *); +extern void pgenerr(struct excinfo *exc); /*----- That's all, folks -------------------------------------------------*/