chiark / gitweb /
catacomb/__init__.py: Settle on SHAKE256 for X448 box-key generation.
[catacomb-python] / pubkey.c
index 642da3efd3342ce0be11b606b162450f106961a8..73744299be232a845a2804ce30397c8c59d71cae 100644 (file)
--- a/pubkey.c
+++ b/pubkey.c
@@ -1164,9 +1164,9 @@ XDHS(DEFXDH)
 /*----- Ed25519 and related algorithms ------------------------------------*/
 
 #define EDDSAS(_)                                                      \
-  _(ED25519, ed25519)
+  _(ED25519, ed25519, -1, ctx)
 
-#define DEFEDDSA(ED, ed)                                               \
+#define DEFEDDSA(ED, ed, phdflt, sigver)                               \
                                                                        \
   static PyObject *meth_##ed##_pubkey(PyObject *me, PyObject *arg)     \
   {                                                                    \
@@ -1185,21 +1185,26 @@ XDHS(DEFXDH)
   static PyObject *meth_##ed##_sign(PyObject *me, PyObject *arg,       \
                                    PyObject *kw)                       \
   {                                                                    \
-    const char *k, *p = 0, *m;                                         \
-    Py_ssize_t ksz, psz, msz;                                          \
+    const char *k, *p = 0, *c = 0, *m;                                 \
+    Py_ssize_t ksz, psz, csz = 0, msz;                                 \
+    int ph = phdflt;                                                   \
     PyObject *rc = 0;                                                  \
     octet pp[ED##_PUBSZ];                                              \
-    char *kwlist[] = { "key", "msg", "pub", 0 };                       \
+    char *kwlist[] = { "key", "msg", "pub", "perso", "phflag", 0 };    \
     if (!PyArg_ParseTupleAndKeywords(arg, kw,                          \
-                                    "s#s#|s#:" #ed "_sign",            \
+                                    "s#s#|s#s#O&:" #ed "_sign",        \
                                     kwlist,                            \
-                                    &k, &ksz, &m, &msz, &p, &psz))     \
+                                    &k, &ksz, &m, &msz, &p, &psz,      \
+                                    &c, &csz, convbool, &ph))          \
       goto end;                                                                \
     if (p && psz != ED##_PUBSZ) VALERR("bad public length");           \
+    if (c && csz > ED##_MAXPERSOSZ)                                    \
+      VALERR("personalization string too long");                       \
+    if (c && ph == -1) ph = 0;                                         \
     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);                                \
+    ed##sigver##_sign((octet *)PyString_AS_STRING(rc), k, ksz,         \
+                     (const octet *)p, ph, c, csz, m, msz);            \
     return (rc);                                                       \
   end:                                                                 \
     return (0);                                                                \
@@ -1208,19 +1213,24 @@ XDHS(DEFXDH)
   static PyObject *meth_##ed##_verify(PyObject *me,                    \
                                      PyObject *arg, PyObject *kw)      \
   {                                                                    \
-    const char *p, *m, *s;                                             \
-    Py_ssize_t psz, msz, ssz;                                          \
+    const char *p, *c = 0, *m, *s;                                     \
+    Py_ssize_t psz, csz = 0, msz, ssz;                                 \
+    int ph = phdflt;                                                   \
     PyObject *rc = 0;                                                  \
-    char *kwlist[] = { "pub", "msg", "sig", 0 };                       \
+    char *kwlist[] = { "pub", "msg", "sig", "perso", "phflag", 0 };    \
     if (!PyArg_ParseTupleAndKeywords(arg, kw,                          \
-                                    "s#s#s#:" #ed "_verify",           \
+                                    "s#s#s#|s#O&:" #ed "_verify",      \
                                     kwlist,                            \
-                                    &p, &psz, &m, &msz, &s, &ssz))     \
+                                    &p, &psz, &m, &msz, &s, &ssz,      \
+                                    &c, &csz, convbool, &ph))          \
       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));               \
+    if (c && csz > ED##_MAXPERSOSZ)                                    \
+      VALERR("personalization string too long");                       \
+    if (c && ph == -1) ph = 0;                                         \
+    rc = getbool(!ed##sigver##_verify((const octet *)p, ph, c, csz,    \
+                                     m, msz, (const octet *)s));       \
     return (rc);                                                       \
   end:                                                                 \
     return (0);                                                                \
@@ -1247,7 +1257,7 @@ generate(NBITS, [event = pgen_nullev, rng = rand, nsteps = 0]) -> R")
 " #x "(KEY, PUBLIC) -> SHARED")
   XDHS(DEFMETH)
 #undef DEFMETH
-#define DEFMETH(ED, ed)                                                        \
+#define DEFMETH(ED, ed, phdflt, sigver)                                        \
   METH  (ed##_pubkey,                  "\
 " #ed "_pubkey(KEY) -> PUBLIC")                                                \
   KWMETH(ed##_sign,                    "\