chiark / gitweb /
pubkey.c, catacomb/__init__.py: Add bindings for Hamburg's X448.
[catacomb-python] / pubkey.c
index 391db319d4106aef59b02335c4a78c15a2fd18e5..5292717f5b4c0804783682a05f4c2876751cbc39 100644 (file)
--- a/pubkey.c
+++ b/pubkey.c
@@ -1118,7 +1118,7 @@ end:
   return (rc);
 }
 
-/*----- X25519 ------------------------------------------------------------*/
+/*----- X25519 and related algorithms -------------------------------------*/
 
 static PyObject *meth_x25519(PyObject *me, PyObject *arg)
 {
@@ -1136,6 +1136,22 @@ 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);
+}
+
 /*----- Ed25519 -----------------------------------------------------------*/
 
 static PyObject *meth_ed25519_pubkey(PyObject *me, PyObject *arg)
@@ -1203,6 +1219,8 @@ static PyMethodDef methods[] = {
 generate(NBITS, [event = pgen_nullev, rng = rand, nsteps = 0]) -> R")
   METH  (x25519,                       "\
 x25519(KEY, PUBLIC) -> SHARED")
+  METH  (x448,                         "\
+x448(KEY, PUBLIC) -> SHARED")
   METH  (ed25519_pubkey,               "\
 ed25519_pubkey(KEY) -> PUBLIC")
   KWMETH(ed25519_sign,                 "\