chiark / gitweb /
pubkey.c, ...: Support Bernstein's `X25519' key-agreement algorithm.
[catacomb-python] / pubkey.c
index 311152ac4bf69fd9f0bf687a18731dab65de6773..50fa78c1b8af70d51c623720bd2daa91bf11beb0 100644 (file)
--- a/pubkey.c
+++ b/pubkey.c
@@ -1118,6 +1118,24 @@ end:
   return (rc);
 }
 
+/*----- X25519 ------------------------------------------------------------*/
+
+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);
+}
+
 /*----- Global stuff ------------------------------------------------------*/
 
 static PyMethodDef methods[] = {
@@ -1132,6 +1150,8 @@ 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")
 #undef METHNAME
   { 0 }
 };