From: Mark Wooding Date: Thu, 11 May 2017 09:42:15 +0000 (+0100) Subject: pubkey.c: Capture Ed25519 binding in a macro. X-Git-Tag: 1.2.0~6 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/catacomb-python/commitdiff_plain/dca3bdfd8f6be8bacaff9142e9fb71a043bab445?hp=058f0a00a3fbce84d8963e140505a5fa35962b90 pubkey.c: Capture Ed25519 binding in a macro. Now we can add more EdDSA instances with similar shapes without too much trouble. Also, slightly sneakily, make EdDSA verification functions take keyword arguments. --- diff --git a/pubkey.c b/pubkey.c index 5611508..642da3e 100644 --- a/pubkey.c +++ b/pubkey.c @@ -1161,56 +1161,72 @@ end: XDHS(DEFXDH) #undef DEFXDH -/*----- Ed25519 -----------------------------------------------------------*/ +/*----- Ed25519 and related algorithms ------------------------------------*/ -static PyObject *meth_ed25519_pubkey(PyObject *me, PyObject *arg) -{ - const char *k; - Py_ssize_t ksz; - PyObject *rc = 0; - if (!PyArg_ParseTuple(arg, "s#:ed25519_pubkey", &k, &ksz)) goto end; - rc = bytestring_pywrap(0, ED25519_PUBSZ); - ed25519_pubkey((octet *)PyString_AS_STRING(rc), k, ksz); - return (rc); -end: - return (0); -} +#define EDDSAS(_) \ + _(ED25519, ed25519) -static PyObject *meth_ed25519_sign(PyObject *me, PyObject *arg, PyObject *kw) -{ - const char *k, *p = 0, *m; - Py_ssize_t ksz, psz, msz; - PyObject *rc = 0; - octet pp[ED25519_PUBSZ]; - char *kwlist[] = { "key", "msg", "pub", 0 }; - if (!PyArg_ParseTupleAndKeywords(arg, kw, "s#s#|s#:ed25519_sign", kwlist, - &k, &ksz, &m, &msz, &p, &psz)) - goto end; - if (p && psz != ED25519_PUBSZ) VALERR("bad public length"); - if (!p) { p = (const char *)pp; ed25519_pubkey(pp, k, ksz); } - rc = bytestring_pywrap(0, ED25519_SIGSZ); - ed25519_sign((octet *)PyString_AS_STRING(rc), k, ksz, - (const octet *)p, m, msz); - return (rc); -end: - return (0); -} - -static PyObject *meth_ed25519_verify(PyObject *me, PyObject *arg) -{ - const char *p, *m, *s; - Py_ssize_t psz, msz, ssz; - PyObject *rc = 0; - if (!PyArg_ParseTuple(arg, "s#s#s#:ed25519_verify", - &p, &psz, &m, &msz, &s, &ssz)) - goto end; - if (psz != ED25519_PUBSZ) VALERR("bad public length"); - if (ssz != ED25519_SIGSZ) VALERR("bad signature length"); - rc = getbool(!ed25519_verify((const octet *)p, m, msz, (const octet *)s)); - return (rc); -end: - return (0); -} +#define DEFEDDSA(ED, ed) \ + \ + static PyObject *meth_##ed##_pubkey(PyObject *me, PyObject *arg) \ + { \ + const char *k; \ + Py_ssize_t ksz; \ + PyObject *rc = 0; \ + if (!PyArg_ParseTuple(arg, "s#:" #ed "_pubkey", &k, &ksz)) \ + goto end; \ + rc = bytestring_pywrap(0, ED##_PUBSZ); \ + ed##_pubkey((octet *)PyString_AS_STRING(rc), k, ksz); \ + return (rc); \ + end: \ + return (0); \ + } \ + \ + static PyObject *meth_##ed##_sign(PyObject *me, PyObject *arg, \ + PyObject *kw) \ + { \ + const char *k, *p = 0, *m; \ + Py_ssize_t ksz, psz, msz; \ + PyObject *rc = 0; \ + octet pp[ED##_PUBSZ]; \ + char *kwlist[] = { "key", "msg", "pub", 0 }; \ + if (!PyArg_ParseTupleAndKeywords(arg, kw, \ + "s#s#|s#:" #ed "_sign", \ + kwlist, \ + &k, &ksz, &m, &msz, &p, &psz)) \ + goto end; \ + if (p && psz != ED##_PUBSZ) VALERR("bad public length"); \ + if (!p) { p = (const char *)pp; ed##_pubkey(pp, k, ksz); } \ + rc = bytestring_pywrap(0, ED##_SIGSZ); \ + ed##_sign((octet *)PyString_AS_STRING(rc), k, ksz, \ + (const octet *)p, m, msz); \ + return (rc); \ + end: \ + return (0); \ + } \ + \ + static PyObject *meth_##ed##_verify(PyObject *me, \ + PyObject *arg, PyObject *kw) \ + { \ + const char *p, *m, *s; \ + Py_ssize_t psz, msz, ssz; \ + PyObject *rc = 0; \ + char *kwlist[] = { "pub", "msg", "sig", 0 }; \ + if (!PyArg_ParseTupleAndKeywords(arg, kw, \ + "s#s#s#:" #ed "_verify", \ + kwlist, \ + &p, &psz, &m, &msz, &s, &ssz)) \ + goto end; \ + if (psz != ED##_PUBSZ) VALERR("bad public length"); \ + if (ssz != ED##_SIGSZ) VALERR("bad signature length"); \ + rc = getbool(!ed##_verify((const octet *)p, \ + m, msz, (const octet *)s)); \ + return (rc); \ + end: \ + return (0); \ + } +EDDSAS(DEFEDDSA) +#undef DEFEDDSA /*----- Global stuff ------------------------------------------------------*/ @@ -1231,12 +1247,17 @@ generate(NBITS, [event = pgen_nullev, rng = rand, nsteps = 0]) -> R") " #x "(KEY, PUBLIC) -> SHARED") XDHS(DEFMETH) #undef DEFMETH - METH (ed25519_pubkey, "\ -ed25519_pubkey(KEY) -> PUBLIC") - KWMETH(ed25519_sign, "\ -ed25519_sign(KEY, MSG, [PUBLIC]) -> SIG") - METH (ed25519_verify, "\ -ed25519_verify(PUBLIC, MSG, SIG) -> BOOL") +#define DEFMETH(ED, ed) \ + METH (ed##_pubkey, "\ +" #ed "_pubkey(KEY) -> PUBLIC") \ + KWMETH(ed##_sign, "\ +" #ed "_sign(KEY, MSG, [pub = PUBLIC, " \ + "perso = STRING, phflag = BOOL]) -> SIG") \ + KWMETH(ed##_verify, "\ +" #ed "_verify(PUBLIC, MSG, SIG, " \ + "[perso = STRING, phflag = BOOL]) -> BOOL") + EDDSAS(DEFMETH) +#undef DEFMETH #undef METHNAME { 0 } };