X-Git-Url: https://git.distorted.org.uk/~mdw/pyke/blobdiff_plain/b6a86d2eeff0cc45053e38970493bf6108f53a4f..8d57d6ea0cd45e997bad93a878cd9579a272fbad:/catacomb-python.h diff --git a/catacomb-python.h b/catacomb-python.h index c93ef07..40ac758 100644 --- a/catacomb-python.h +++ b/catacomb-python.h @@ -39,9 +39,13 @@ #include #include +#undef ULLONG_MAX +#undef ULONG_LONG_MAX + #include #include #include +#include #include @@ -55,6 +59,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; \ @@ -152,6 +165,9 @@ 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 +182,11 @@ #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(_) \ + _(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) @@ -182,6 +198,85 @@ MODULES(DO) #undef 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); +#define DECL_GETU_(n) extern PyObject *getu##n(uint##n); +DOUINTSZ(DECL_GETU_) +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_DOMETHODS(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") \ + METH (clear, "D.clear()") \ + KWMETH(get, "D.get(KEY, [default = None]) -> VALUE") \ + 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_METHODS GMAP_DOMETHODS(GMAP_METH, GMAP_KWMETH) +extern int gmap_pysize(PyObject *); +extern PySequenceMethods gmap_pysequence; +extern PyMethodDef gmap_pymethods[]; + /*----- Bytestrings -------------------------------------------------------*/ PyTypeObject *bytestring_pyobj; @@ -201,8 +296,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 *); @@ -218,7 +313,7 @@ extern int mp_tolong_checked(mp *, long *); /*----- Abstract fields ---------------------------------------------------*/ typedef struct field_pyobj { - PyTypeObject ty; + PyHeapTypeObject ty; field *f; } field_pyobj; @@ -233,7 +328,6 @@ extern mp *getfe(field *, PyObject *); typedef struct fe_pyobj { PyObject_HEAD field *f; - PyObject *fobj; /* to keep it alive */ mp *x; } fe_pyobj; @@ -268,10 +362,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; @@ -325,7 +419,7 @@ extern PyTypeObject *ge_pytype; extern PyObject *ge_pywrap(PyObject *, ge *); typedef struct group_pyobj { - PyTypeObject ty; + PyHeapTypeObject ty; group *g; } group_pyobj; @@ -380,7 +474,7 @@ extern PyObject *keysz_pywrap(const octet *); /*----- Symmetric cryptography --------------------------------------------*/ typedef struct gccipher_pyobj { - PyTypeObject ty; + PyHeapTypeObject ty; gccipher *cc; } gccipher_pyobj; @@ -406,7 +500,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; @@ -433,7 +527,7 @@ extern int convghash(PyObject *, void *); extern int convgmhash(PyObject *, void *); typedef struct gcmac_pyobj { - PyTypeObject ty; + PyHeapTypeObject ty; gcmac *cm; } gcmac_pyobj; @@ -445,22 +539,18 @@ 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 { @@ -489,28 +579,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