-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