X-Git-Url: https://git.distorted.org.uk/~mdw/pyke/blobdiff_plain/ba45a729eaab33a44d166d65dd27e624ca22ba32..dfe0a89785e70fdb3c75196b54ae05f006a35ca3:/catacomb-python.h diff --git a/catacomb-python.h b/catacomb-python.h index 368c7bb..bf2a840 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. @@ -39,9 +37,14 @@ #include #include +#undef ULLONG_MAX +#undef ULONG_LONG_MAX + #include #include #include +#include +#include #include @@ -55,6 +58,7 @@ #include #include #include +#include #include #include @@ -72,6 +76,7 @@ #include #include #include +#include #include #include @@ -104,6 +109,9 @@ #include #include +#include +#include + /*----- Utility macros ----------------------------------------------------*/ #define RETURN_OBJ(obj) do { Py_INCREF(obj); return (obj); } while (0) @@ -122,6 +130,11 @@ #define ZDIVERR(str) EXCERR(PyExc_ZeroDivisionError, str) #define SYNERR(str) EXCERR(PyExc_SyntaxError, str) #define SYSERR(str) EXCERR(PyExc_SystemError, str) +#define NIERR(str) EXCERR(PyExc_NotImplementedError, 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; \ @@ -139,6 +152,11 @@ return (0); \ } +#if PY_VERSION_HEX < 0x02050000 /* Compatibility hack */ +# define ht_name name +# define ht_type type +#endif + #define root_pytype 0 #define type_pytype &PyType_Type #define INITTYPE(ty, base) do { \ @@ -148,10 +166,13 @@ #define INSERT(name, ob) do { \ PyObject *_o = (PyObject *)(ob); \ - Py_INCREF(_o); \ + 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) \ @@ -166,11 +187,12 @@ #define MEMBER(name, ty, f, doc) \ { #name, ty, offsetof(MEMBERSTRUCT, name), f, doc }, -#define MODULES(DO) \ - DO(bytestring) \ - DO(rand) DO(algorithms) DO(pubkey) DO(pgen) \ - DO(mp) DO(field) DO(ec) DO(group) \ - DO(passphrase) +#define MODULES(_) \ + _(util) \ + _(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) @@ -185,6 +207,85 @@ MODULES(DO) #define FREEOBJ(obj) \ (((PyObject *)(obj))->ob_type->tp_free((PyObject *)(obj))) +#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); \ + } + +struct nameval { const char *name; unsigned long value; }; +extern void setconstants(PyObject *, const struct nameval *); + +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); +extern PyObject *getulong(unsigned long); +extern void *newtype(PyTypeObject *, const PyTypeObject *, const char *); + +extern PyObject *mkexc(PyObject *, PyObject *, const char *, PyMethodDef *); +extern PyTypeObject *inittype(PyTypeObject *); +extern void addmethods(const PyMethodDef *); +extern PyMethodDef *donemethods(void); + +/*----- Mapping methods ---------------------------------------------------*/ + +#define GMAP_METH(func, doc) { #func, gmapmeth_##func, METH_VARARGS, doc }, +#define GMAP_KWMETH(func, doc) \ + { #func, (PyCFunction)gmapmeth_##func, METH_VARARGS|METH_KEYWORDS, doc }, +#define GMAP_METHDECL(func, doc) \ + extern PyObject *gmapmeth_##func(PyObject *, PyObject *); +#define GMAP_KWMETHDECL(func, doc) \ + extern PyObject *gmapmeth_##func(PyObject *, PyObject *, PyObject *); + +#define GMAP_DOROMETHODS(METH, KWMETH) \ + METH (has_key, "D.has_key(KEY) -> BOOL") \ + METH (keys, "D.keys() -> LIST") \ + METH (values, "D.values() -> LIST") \ + METH (items, "D.items() -> LIST") \ + METH (iterkeys, "D.iterkeys() -> ITER") \ + METH (itervalues, "D.itervalues() -> ITER") \ + METH (iteritems, "D.iteritems() -> ITER") \ + KWMETH(get, "D.get(KEY, [default = None]) -> VALUE") \ + +#define GMAP_DOMETHODS(METH, KWMETH) \ + GMAP_DOROMETHODS(METH, KWMETH) \ + METH (clear, "D.clear()") \ + KWMETH(setdefault, "D.setdefault(K, [default = None]) -> VALUE") \ + KWMETH(pop, "D.pop(KEY, [default = ]) -> VALUE") \ + METH (popitem, "D.popitem() -> (KEY, VALUE)") \ + METH (update, "D.update(MAP)") + +GMAP_DOMETHODS(GMAP_METHDECL, GMAP_KWMETHDECL) +#define GMAP_ROMETHODS GMAP_DOROMETHODS(GMAP_METH, GMAP_KWMETH) +#define GMAP_METHODS GMAP_DOMETHODS(GMAP_METH, GMAP_KWMETH) +extern int gmap_pysize(PyObject *); +extern PySequenceMethods gmap_pysequence; +extern PyMethodDef gmap_pymethods[]; + /*----- Bytestrings -------------------------------------------------------*/ PyTypeObject *bytestring_pyobj; @@ -204,8 +305,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 *); @@ -221,7 +322,7 @@ extern int mp_tolong_checked(mp *, long *); /*----- Abstract fields ---------------------------------------------------*/ typedef struct field_pyobj { - PyTypeObject ty; + PyHeapTypeObject ty; field *f; } field_pyobj; @@ -236,10 +337,9 @@ extern mp *getfe(field *, PyObject *); typedef struct fe_pyobj { PyObject_HEAD field *f; - PyObject *fobj; /* to keep it alive */ mp *x; } fe_pyobj; - + extern PyTypeObject *field_pytype; extern PyTypeObject *primefield_pytype; extern PyTypeObject *niceprimefield_pytype; @@ -271,10 +371,10 @@ extern PyObject *ecpt_pywrapout(void *, ec *); extern int toecpt(ec_curve *, ec *, PyObject *); extern int getecpt(ec_curve *, ec *, PyObject *); extern void getecptout(ec *, PyObject *); -extern int convec(PyObject *, void *); +extern int convecpt(PyObject *, void *); typedef struct eccurve_pyobj { - PyTypeObject ty; + PyHeapTypeObject ty; ec_curve *c; PyObject *fobj; } eccurve_pyobj; @@ -295,7 +395,7 @@ typedef struct ecinfo_pyobj { 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) @@ -328,7 +428,7 @@ extern PyTypeObject *ge_pytype; extern PyObject *ge_pywrap(PyObject *, ge *); typedef struct group_pyobj { - PyTypeObject ty; + PyHeapTypeObject ty; group *g; } group_pyobj; @@ -383,7 +483,7 @@ extern PyObject *keysz_pywrap(const octet *); /*----- Symmetric cryptography --------------------------------------------*/ typedef struct gccipher_pyobj { - PyTypeObject ty; + PyHeapTypeObject ty; gccipher *cc; } gccipher_pyobj; @@ -409,7 +509,7 @@ extern PyObject *gcipher_pywrap(PyObject *, gcipher *, unsigned); extern int convgcipher(PyObject *, void *); typedef struct gchash_pyobj { - PyTypeObject ty; + PyHeapTypeObject ty; gchash *ch; } gchash_pyobj; @@ -436,7 +536,7 @@ extern int convghash(PyObject *, void *); extern int convgmhash(PyObject *, void *); typedef struct gcmac_pyobj { - PyTypeObject ty; + PyHeapTypeObject ty; gcmac *cm; } gcmac_pyobj; @@ -448,24 +548,20 @@ extern PyObject *gcmac_pywrap(gcmac *); extern int convgcmac(PyObject *, void *); typedef struct gmac_pyobj { - PyTypeObject ty; + PyHeapTypeObject ty; unsigned f; gmac *m; - PyObject *nameobj; } 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_NAMEOBJ(o) (((gmac_pyobj *)(o))->nameobj) #define GMAC_F(o) (((gmac_pyobj *)(o))->f) extern PyObject *gmac_pywrap(PyObject *, gmac *, unsigned); extern int convgmac(PyObject *, void *); -/*----- Public key crypto -------------------------------------------------*/ - /*----- Key generation ----------------------------------------------------*/ - + typedef struct pfilt_pyobj { PyObject_HEAD pfilt f; @@ -492,28 +588,6 @@ extern int convpgev(PyObject *, void *); extern void droppgev(pgev *); extern void pgenerr(void); -/*----- Core utility functions --------------------------------------------*/ - -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 *); -extern int convu32(PyObject *, void *); -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); -extern PyObject *getu32(uint32); -extern void *newtype(PyTypeObject *, const PyTypeObject *); -extern PyTypeObject *inittype(PyTypeObject *); -extern void addmethods(const PyMethodDef *); - /*----- That's all, folks -------------------------------------------------*/ #ifdef __cplusplus