X-Git-Url: https://git.distorted.org.uk/~mdw/pyke/blobdiff_plain/26a7f37a5423cc8252d88ee8482f96b5692c0dce..648aea952d6d6d0bff5df946c0a7b55848ccbe37:/catacomb-python.h diff --git a/catacomb-python.h b/catacomb-python.h index 5815343..5638812 100644 --- a/catacomb-python.h +++ b/catacomb-python.h @@ -149,6 +149,7 @@ PRIVATE_SYMBOLS; goto end; \ } while (0) #define VALERR(str) EXCERR(PyExc_ValueError, str) +#define OVFERR(str) EXCERR(PyExc_OverflowError, str) #define TYERR(str) EXCERR(PyExc_TypeError, str) #define IXERR(str) EXCERR(PyExc_IndexError, str) #define ZDIVERR(str) EXCERR(PyExc_ZeroDivisionError, str) @@ -162,7 +163,7 @@ PRIVATE_SYMBOLS; PyErr_SetFromErrnoWithFilename(PyExc_OSError, name); \ goto end; \ } while (0) -#define PGENERR do { pgenerr(); goto end; } while (0) +#define PGENERR(exc) do { pgenerr(exc); goto end; } while (0) #define CONVFUNC(ty, cty, ext) \ int conv##ty(PyObject *o, void *p) \ @@ -175,11 +176,6 @@ PRIVATE_SYMBOLS; 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_META(ty, base, meta) do { \ @@ -188,7 +184,9 @@ PRIVATE_SYMBOLS; } while (0) #define INITTYPE(ty, base) INITTYPE_META(ty, base, type) -#define INSERT(name, ob) do { \ +extern PyObject *home_module; + +#define INSERT(name, ob) do { \ PyObject *_o = (PyObject *)(ob); \ Py_INCREF(_o); \ PyModule_AddObject(mod, name, _o); \ @@ -250,7 +248,8 @@ MODULES(DO) #define KWLIST (/*unconst*/ char **)kwlist -struct nameval { const char *name; unsigned long value; }; +struct nameval { const char *name; unsigned f; unsigned long value; }; +#define CF_SIGNED 1u extern void setconstants(PyObject *, const struct nameval *); extern PyObject *mexp_common(PyObject *, PyObject *, size_t, @@ -274,7 +273,34 @@ extern PyObject *getulong(unsigned long); extern PyObject *getk64(kludge64); extern void *newtype(PyTypeObject *, const PyTypeObject *, const char *); +struct excinfo { PyObject *ty, *val, *tb; }; +#define EXCINFO_INIT { 0, 0, 0 } + extern PyObject *mkexc(PyObject *, PyObject *, const char *, PyMethodDef *); +#define INIT_EXCINFO(exc) do { \ + struct excinfo *_exc = (exc); _exc->ty = _exc->val = _exc->tb = 0; \ +} while (0) +#define RELEASE_EXCINFO(exc) do { \ + struct excinfo *_exc = (exc); \ + Py_XDECREF(_exc->ty); _exc->ty = 0; \ + Py_XDECREF(_exc->val); _exc->val = 0; \ + Py_XDECREF(_exc->tb); _exc->tb = 0; \ +} while (0) +#define STASH_EXCINFO(exc) do { \ + struct excinfo *_exc = (exc); \ + PyErr_Fetch(&_exc->ty, &_exc->val, &_exc->tb); \ + PyErr_NormalizeException(&_exc->ty, &_exc->val, &_exc->tb); \ +} while (0) +#define RESTORE_EXCINFO(exc) do { \ + struct excinfo *_exc = (exc); \ + PyErr_Restore(_exc->ty, _exc->val, _exc->tb); \ + _exc->ty = _exc->val = _exc->tb = 0; \ +} while (0) +extern void report_lost_exception(struct excinfo *, const char *, ...); +extern void report_lost_exception_v(struct excinfo *, const char *, va_list); +extern void stash_exception(struct excinfo *, const char *, ...); +extern void restore_exception(struct excinfo *, const char *, ...); + extern void typeready(PyTypeObject *); extern PyTypeObject *inittype(PyTypeObject *, PyTypeObject *); extern void addmethods(const PyMethodDef *); @@ -317,7 +343,6 @@ extern PyMethodDef gmap_pymethods[]; /*----- Bytestrings -------------------------------------------------------*/ -PyTypeObject *bytestring_pyobj; PyObject *bytestring_pywrap(const void *, size_t); PyObject *bytestring_pywrapbuf(buf *); @@ -343,6 +368,7 @@ 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 *); @@ -355,20 +381,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; @@ -380,8 +392,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; @@ -402,23 +444,6 @@ 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; @@ -434,15 +459,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; @@ -462,7 +478,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 *); @@ -477,9 +492,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) @@ -487,161 +500,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) -extern PyObject *gccipher_pywrap(gccipher *); extern int convgccipher(PyObject *, void *); - -typedef struct gcipher_pyobj { - PyObject_HEAD - 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) -extern PyObject *gcipher_pywrap(PyObject *, gcipher *); -extern int convgcipher(PyObject *, void *); - -typedef struct gcaead_pyobj { - PyHeapTypeObject ty; - gcaead *aec; - struct gcaeadaad_pyobj *aad; - struct gcaeadenc_pyobj *enc; - struct gcaeaddec_pyobj *dec; -} gcaead_pyobj; - -extern PyTypeObject *gcaead_pytype; -#define GCAEAD_PYCHECK(o) PyObject_TypeCheck((o), gcaead_pytype) -#define GCAEAD_AEC(o) (((gcaead_pyobj *)(o))->aec) -#define GCAEAD_AAD(o) (((gcaead_pyobj *)(o))->aad) -#define GCAEAD_ENC(o) (((gcaead_pyobj *)(o))->enc) -#define GCAEAD_DEC(o) (((gcaead_pyobj *)(o))->dec) -extern PyObject *gcaead_pywrap(gcaead *); -extern int convgcaead(PyObject *, void *); - -typedef struct gaeadkey_pyobj { - PyObject_HEAD - gaead_key *k; -} gaeadkey_pyobj; - -extern PyTypeObject *gaeadkey_pytype; -#define GAEADKEY_PYCHECK(o) PyObject_TypeCheck((o), gaeadkey_pytype) -#define GAEADKEY_K(o) (((gaeadkey_pyobj *)(o))->k) -extern PyObject *gaeadkey_pywrap(PyObject *, gaead_key *); -extern int convgaeadkey(PyObject *, void *); - -typedef struct gcaeadaad_pyobj { - PyHeapTypeObject ty; - gcaead_pyobj *key; -} gcaeadaad_pyobj; -#define GCAEADAAD_KEY(o) (((gcaeadaad_pyobj *)(o))->key) -extern PyTypeObject *gcaeadaad_pytype; - -typedef struct gaeadaad_pyobj { - PyObject_HEAD - gaead_aad *a; - unsigned f; -#define AEADF_DEAD 32768u - size_t hsz, hlen; -} gaeadaad_pyobj; - -extern PyTypeObject *gaeadaad_pytype; -#define GAEADAAD_PYCHECK(o) PyObject_TypeCheck((o), gaeadaad_pytype) -#define GAEADAAD_A(o) (((gaeadaad_pyobj *)(o))->a) -#define GAEADAAD_F(o) (((gaeadaad_pyobj *)(o))->f) -#define GAEADAAD_HSZ(o) (((gaeadaad_pyobj *)(o))->hsz) -#define GAEADAAD_HLEN(o) (((gaeadaad_pyobj *)(o))->hlen) -extern PyObject *gaeadaad_pywrap(PyObject *, gaead_aad *, unsigned, size_t); -extern int convgaeadaad(PyObject *, void *); - -typedef struct gcaeadenc_pyobj { - PyHeapTypeObject ty; - gcaead_pyobj *key; -} gcaeadenc_pyobj; -#define GCAEADENC_KEY(o) (((gcaeadenc_pyobj *)(o))->key) -extern PyTypeObject *gcaeadenc_pytype; - -typedef struct gaeadenc_pyobj { - PyObject_HEAD - gaead_enc *e; - gaeadaad_pyobj *aad; - unsigned f; - size_t hsz, msz, tsz; - size_t mlen; -} gaeadenc_pyobj; - -extern PyTypeObject *gaeadenc_pytype; -#define GAEADENC_PYCHECK(o) PyObject_TypeCheck((o), gaeadenc_pytype) -#define GAEADENC_AAD(o) (((gaeadenc_pyobj *)(o))->aad) -#define GAEADENC_E(o) (((gaeadenc_pyobj *)(o))->e) -#define GAEADENC_F(o) (((gaeadenc_pyobj *)(o))->f) -#define GAEADENC_HSZ(o) (((gaeadenc_pyobj *)(o))->hsz) -#define GAEADENC_MSZ(o) (((gaeadenc_pyobj *)(o))->msz) -#define GAEADENC_TSZ(o) (((gaeadenc_pyobj *)(o))->tsz) -#define GAEADENC_MLEN(o) (((gaeadenc_pyobj *)(o))->mlen) -extern PyObject *gaeadenc_pywrap(PyObject *, gaead_enc *, unsigned, - size_t, size_t, size_t); -extern int convgaeadenc(PyObject *, void *); - -typedef struct gcaeaddec_pyobj { - PyHeapTypeObject ty; - gcaead_pyobj *key; -} gcaeaddec_pyobj; -#define GCAEADDEC_KEY(o) (((gcaeaddec_pyobj *)(o))->key) -extern PyTypeObject *gcaeaddec_pytype; - -typedef struct gaeaddec_pyobj { - PyObject_HEAD - gaead_dec *d; - gaeadaad_pyobj *aad; - unsigned f; - size_t hsz, csz, tsz; - size_t clen; -} gaeaddec_pyobj; - -extern PyTypeObject *gaeaddec_pytype; -#define GAEADDEC_PYCHECK(o) PyObject_TypeCheck((o), gaeaddec_pytype) -#define GAEADDEC_AAD(o) (((gaeaddec_pyobj *)(o))->aad) -#define GAEADDEC_D(o) (((gaeaddec_pyobj *)(o))->d) -#define GAEADDEC_F(o) (((gaeaddec_pyobj *)(o))->f) -#define GAEADDEC_HSZ(o) (((gaeaddec_pyobj *)(o))->hsz) -#define GAEADDEC_CSZ(o) (((gaeaddec_pyobj *)(o))->csz) -#define GAEADDEC_TSZ(o) (((gaeaddec_pyobj *)(o))->tsz) -#define GAEADDEC_CLEN(o) (((gaeaddec_pyobj *)(o))->clen) -extern PyObject *gaeaddec_pywrap(PyObject *, gaead_dec *, unsigned, - size_t, size_t, size_t); -extern int convgaeaddec(PyObject *, void *); +extern PyObject *gccipher_pywrap(gccipher *); typedef struct gchash_pyobj { PyHeapTypeObject ty; @@ -649,48 +513,15 @@ 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) -extern PyObject *gchash_pywrap(gchash *); -extern int convgchash(PyObject *, void *); - -typedef struct ghash_pyobj { - PyObject_HEAD - 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) extern PyObject *ghash_pywrap(PyObject *, ghash *); +extern int convgchash(PyObject *, void *); 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; - 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 *); -extern int convgmac(PyObject *, void *); - /*----- Key generation ----------------------------------------------------*/ typedef struct pfilt_pyobj { @@ -715,9 +546,15 @@ extern PyTypeObject *pgev_pytype; #define PGEV_PYCHECK(o) PyObject_TypeCheck(o, pgev_pytype) #define PGEV_PG(o) (&((pgev_pyobj *)(o))->pg) +typedef struct pypgev { + pgev ev; + PyObject *obj; + struct excinfo *exc; +} pypgev; + extern int convpgev(PyObject *, void *); -extern void droppgev(pgev *); -extern void pgenerr(void); +extern void droppgev(pypgev *); +extern void pgenerr(struct excinfo *exc); /*----- That's all, folks -------------------------------------------------*/