From: Mark Wooding Date: Thu, 11 May 2017 09:42:15 +0000 (+0100) Subject: pubkey.c: Factor out commonality between X25519 and X448. X-Git-Tag: 1.2.0~9 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/catacomb-python/commitdiff_plain/34bea1860bbbf768746ccacdd608e1a68ff01c01?ds=sidebyside;hp=-c pubkey.c: Factor out commonality between X25519 and X448. --- 34bea1860bbbf768746ccacdd608e1a68ff01c01 diff --git a/pubkey.c b/pubkey.c index 4067ae0..5611508 100644 --- a/pubkey.c +++ b/pubkey.c @@ -1137,37 +1137,29 @@ end: /*----- X25519 and related algorithms -------------------------------------*/ -static PyObject *meth_x25519(PyObject *me, PyObject *arg) -{ - const char *k, *p; - Py_ssize_t ksz, psz; - PyObject *rc = 0; - if (!PyArg_ParseTuple(arg, "s#s#:x25519", &k, &ksz, &p, &psz)) goto end; - if (ksz != X25519_KEYSZ) VALERR("bad key length"); - if (psz != X25519_PUBSZ) VALERR("bad public length"); - rc = bytestring_pywrap(0, X25519_OUTSZ); - x25519((octet *)PyString_AS_STRING(rc), - (const octet *)k, (const octet *)p); - return (rc); -end: - return (0); -} - -static PyObject *meth_x448(PyObject *me, PyObject *arg) -{ - const char *k, *p; - Py_ssize_t ksz, psz; - PyObject *rc = 0; - if (!PyArg_ParseTuple(arg, "s#s#:x448", &k, &ksz, &p, &psz)) goto end; - if (ksz != X448_KEYSZ) VALERR("bad key length"); - if (psz != X448_PUBSZ) VALERR("bad public length"); - rc = bytestring_pywrap(0, X448_OUTSZ); - x448((octet *)PyString_AS_STRING(rc), - (const octet *)k, (const octet *)p); - return (rc); -end: - return (0); -} +#define XDHS(_) \ + _(X25519, x25519) \ + _(X448, x448) + +#define DEFXDH(X, x) \ + static PyObject *meth_##x(PyObject *me, PyObject *arg) \ + { \ + const char *k, *p; \ + Py_ssize_t ksz, psz; \ + PyObject *rc = 0; \ + if (!PyArg_ParseTuple(arg, "s#s#:" #x, &k, &ksz, &p, &psz)) \ + goto end; \ + if (ksz != X##_KEYSZ) VALERR("bad key length"); \ + if (psz != X##_PUBSZ) VALERR("bad public length"); \ + rc = bytestring_pywrap(0, X##_OUTSZ); \ + x((octet *)PyString_AS_STRING(rc), \ + (const octet *)k, (const octet *)p); \ + return (rc); \ + end: \ + return (0); \ + } +XDHS(DEFXDH) +#undef DEFXDH /*----- Ed25519 -----------------------------------------------------------*/ @@ -1234,10 +1226,11 @@ static PyMethodDef methods[] = { KWMETH(_pss_decode, 0) KWMETH(_RSAPriv_generate, "\ generate(NBITS, [event = pgen_nullev, rng = rand, nsteps = 0]) -> R") - METH (x25519, "\ -x25519(KEY, PUBLIC) -> SHARED") - METH (x448, "\ -x448(KEY, PUBLIC) -> SHARED") +#define DEFMETH(X, x) \ + METH (x, "\ +" #x "(KEY, PUBLIC) -> SHARED") + XDHS(DEFMETH) +#undef DEFMETH METH (ed25519_pubkey, "\ ed25519_pubkey(KEY) -> PUBLIC") KWMETH(ed25519_sign, "\