From: Mark Wooding Date: Wed, 27 Nov 2019 15:11:08 +0000 (+0000) Subject: Merge branch '1.2.x' into 1.3.x X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/pyke/commitdiff_plain/8963e6870299fa42fe81f2b6acc3fcddf2058a9b?hp=b0783435d0481f5034c46c65a0802ca25f646058 Merge branch '1.2.x' into 1.3.x * 1.2.x: (89 commits) t/: Add a test suite. ec.c: Don't lose error status when constructing points from a sequence. ec.c: Free partially constructed points coordinatewise. *.c: Be more careful about `PySequence_Size'. key.c: Reformat the rest of the `KeyError' constructor. key.c: Parse `KeyError' constructor arguments by hand. catacomb-python.h: Add a macro for raising `OverflowError'. key.c: Collect `KeyError' argument count as a separate step. key.c: Use tuple functions on `KeyError' argument tuple. key.c: Rename sad-path label to `end'. key.c: Delete duplicate setting of `errstring'. util.c (mkexc): Populate dictionary before constructing exception class. key.c: Only set the error code. catacomb.c, util.c: Publish negative constants correctly. field.c: Delete the completely unused `getfe' function. key.c (convfilter): Fix sense of error tests. buffer.c, ec.c: Fix required size for EC `buffer' encoding. algorithms.c: Fix `max' property name in docstrings. catacomb/__init__.py (_HashBase): Check that integers are within bounds. debian/rules: Build using the provided Makefile. ... --- diff --git a/catacomb-python.h b/catacomb-python.h index ad27461..6c1ae21 100644 --- a/catacomb-python.h +++ b/catacomb-python.h @@ -61,6 +61,7 @@ #include #include +#include #include #include #include @@ -135,6 +136,7 @@ #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) #define SYSERR(str) EXCERR(PyExc_SystemError, str) #define NIERR(str) EXCERR(PyExc_NotImplementedError, str) @@ -234,6 +236,8 @@ MODULES(DO) return (d); \ } +#define KWLIST (/*unconst*/ char **)kwlist + struct nameval { const char *name; unsigned f; unsigned long value; }; #define CF_SIGNED 1u extern void setconstants(PyObject *, const struct nameval *); @@ -531,24 +535,130 @@ typedef struct gccipher_pyobj { 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 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 *); + typedef struct gchash_pyobj { PyHeapTypeObject ty; gchash *ch; @@ -557,13 +667,11 @@ typedef struct gchash_pyobj { extern PyTypeObject *gchash_pytype; #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 int convgchash(PyObject *, void *); typedef struct ghash_pyobj { PyObject_HEAD - unsigned f; ghash *h; } ghash_pyobj; @@ -571,8 +679,7 @@ 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 PyObject *ghash_pywrap(PyObject *, ghash *); extern int convghash(PyObject *, void *); extern int convgmhash(PyObject *, void *); @@ -590,7 +697,6 @@ extern int convgcmac(PyObject *, void *); typedef struct gmac_pyobj { PyHeapTypeObject ty; - unsigned f; gmac *m; } gmac_pyobj; @@ -598,7 +704,7 @@ 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 PyObject *gmac_pywrap(PyObject *, gmac *); extern int convgmac(PyObject *, void *); /*----- Key generation ----------------------------------------------------*/ diff --git a/catacomb.c b/catacomb.c index e24e5ec..e9c9513 100644 --- a/catacomb.c +++ b/catacomb.c @@ -52,6 +52,8 @@ static const struct nameval consts[] = { C(ED25519_KEYSZ), C(ED25519_PUBSZ), C(ED25519_SIGSZ), C(ED25519_MAXPERSOSZ), C(ED448_KEYSZ), C(ED448_PUBSZ), C(ED448_SIGSZ), C(ED448_MAXPERSOSZ), + C(AEADF_PCHSZ), C(AEADF_PCMSZ), C(AEADF_PCTSZ), + C(AEADF_AADNDEP), C(AEADF_AADFIRST), C(AEADF_NOAAD), #define ENTRY(tag, val, str) C(KERR_##tag), KEY_ERRORS(ENTRY) #undef ENTRY diff --git a/util.c b/util.c index 29f7d12..723c819 100644 --- a/util.c +++ b/util.c @@ -737,13 +737,15 @@ end: return (rc); } -static char *def_kwlist[] = { "key", "default", 0 }; +static const char *const def_kwlist[] = { "key", "default", 0 }; PyObject *gmapmeth_get(PyObject *me, PyObject *arg, PyObject *kw) { PyObject *k, *def = Py_None, *v; - if (!PyArg_ParseTupleAndKeywords(arg, kw, "O|O:get", def_kwlist, &k, &def)) + if (!PyArg_ParseTupleAndKeywords(arg, kw, "O|O:get", + (/*unconst*/ char **)def_kwlist, + &k, &def)) return (0); if ((v = PyObject_GetItem(me, k)) != 0) return (v); PyErr_Clear(); @@ -755,7 +757,8 @@ PyObject *gmapmeth_setdefault(PyObject *me, PyObject *arg, PyObject *kw) PyObject *k, *def = Py_None, *v; if (!PyArg_ParseTupleAndKeywords(arg, kw, "O|O:setdefault", - def_kwlist, &k, &def)) + (/*unconst*/ char **)def_kwlist, + &k, &def)) return (0); if ((v = PyObject_GetItem(me, k)) != 0) return (v); PyErr_Clear(); @@ -767,7 +770,9 @@ PyObject *gmapmeth_pop(PyObject *me, PyObject *arg, PyObject *kw) { PyObject *k, *def = 0, *v; - if (!PyArg_ParseTupleAndKeywords(arg, kw, "O|O:pop", def_kwlist, &k, &def)) + if (!PyArg_ParseTupleAndKeywords(arg, kw, "O|O:pop", + (/*unconst*/ char **)def_kwlist, + &k, &def)) return (0); if ((v = PyObject_GetItem(me, k)) != 0) { PyObject_DelItem(me, k);