X-Git-Url: https://git.distorted.org.uk/~mdw/pyke/blobdiff_plain/b6a86d2eeff0cc45053e38970493bf6108f53a4f..62058916b6c4b39764824d24be670525b7cdfd7a:/catacomb-python.h diff --git a/catacomb-python.h b/catacomb-python.h index c93ef07..d71caa9 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,10 @@ #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; \ @@ -152,6 +164,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 +181,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 +197,9 @@ MODULES(DO) #undef DO +#define FREEOBJ(obj) \ + (((PyObject *)(obj))->ob_type->tp_free((PyObject *)(obj))) + /*----- Bytestrings -------------------------------------------------------*/ PyTypeObject *bytestring_pyobj; @@ -218,7 +236,7 @@ extern int mp_tolong_checked(mp *, long *); /*----- Abstract fields ---------------------------------------------------*/ typedef struct field_pyobj { - PyTypeObject ty; + PyHeapTypeObject ty; field *f; } field_pyobj; @@ -233,7 +251,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 +285,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 +342,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 +397,7 @@ extern PyObject *keysz_pywrap(const octet *); /*----- Symmetric cryptography --------------------------------------------*/ typedef struct gccipher_pyobj { - PyTypeObject ty; + PyHeapTypeObject ty; gccipher *cc; } gccipher_pyobj; @@ -406,7 +423,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 +450,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 +462,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 { @@ -499,15 +512,18 @@ extern PyObject *mexp_common(PyObject *, PyObject *, size_t, void (*drop)(void *)); extern int convulong(PyObject *, void *); -extern int convu32(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 *getu32(uint32); -extern void *newtype(PyTypeObject *, const PyTypeObject *); +#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 *);