chiark / gitweb /
pubkey.c: Factor out commonality between X25519 and X448.
authorMark Wooding <mdw@distorted.org.uk>
Thu, 11 May 2017 09:42:15 +0000 (10:42 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Sun, 14 May 2017 03:29:20 +0000 (04:29 +0100)
pubkey.c

index 4067ae0ff10219ed5dbff4f24df93be1c4d41af7..5611508c976e951d4e7deb1f91358a5e0da3791c 100644 (file)
--- 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,                 "\