chiark / gitweb /
catacomb/__init__.py: Add `_clsname' for printing class names.
[catacomb-python] / algorithms.c
index 4561b9ae34e9b5d503fbac233d9993dd3474b3bd..cb594ca31dd604f8297ea964b9457390f52ca89d 100644 (file)
@@ -462,7 +462,7 @@ static PyObject *gcipher_pynew(PyTypeObject *ty, PyObject *arg, PyObject *kw)
 {
   char *kwlist[] = { "k", 0 };
   char *k;
-  int sz;
+  Py_ssize_t sz;
 
   if (!PyArg_ParseTupleAndKeywords(arg, kw, "s#:new", kwlist, &k, &sz))
     goto end;
@@ -511,7 +511,7 @@ static PyObject *gccget_blksz(PyObject *me, void *hunoz)
 static PyObject *gcmeth_encrypt(PyObject *me, PyObject *arg)
 {
   char *p;
-  int sz;
+  Py_ssize_t sz;
   PyObject *rc = 0;
 
   if (!PyArg_ParseTuple(arg, "s#:encrypt", &p, &sz)) return (0);
@@ -537,7 +537,7 @@ static PyObject *gcmeth_enczero(PyObject *me, PyObject *arg)
 static PyObject *gcmeth_decrypt(PyObject *me, PyObject *arg)
 {
   char *p;
-  int sz;
+  Py_ssize_t sz;
   PyObject *rc = 0;
 
   if (!PyArg_ParseTuple(arg, "s#:decrypt", &p, &sz)) return (0);
@@ -563,7 +563,7 @@ static PyObject *gcmeth_deczero(PyObject *me, PyObject *arg)
 static PyObject *gcmeth_setiv(PyObject *me, PyObject *arg)
 {
   char *p;
-  int sz;
+  Py_ssize_t sz;
 
   if (!PyArg_ParseTuple(arg, "s#:setiv", &p, &sz)) goto end;
   if (!GC_CLASS(GCIPHER_C(me))->blksz) VALERR("not a block cipher mode");
@@ -766,7 +766,7 @@ static PyObject *gchget_bufsz(PyObject *me, void *hunoz)
 static PyObject *ghmeth_hash(PyObject *me, PyObject *arg)
 {
   char *p;
-  int sz;
+  Py_ssize_t sz;
   if (!PyArg_ParseTuple(arg, "s#:hash", &p, &sz)) return (0);
   GH_HASH(GHASH_H(me), p, sz);
   RETURN_ME;
@@ -788,7 +788,7 @@ DOUINTCONV(GHMETH_HASHU_)
   static PyObject *ghmeth_hashbuf##w(PyObject *me, PyObject *arg)      \
   {                                                                    \
     char *p;                                                           \
-    int sz;                                                            \
+    Py_ssize_t sz;                                                     \
     if (!PyArg_ParseTuple(arg, "s#:hashbuf" #w, &p, &sz)) goto end;    \
     if (sz > MASK##n) TYERR("string too long");                                \
     GH_HASHBUF##W(GHASH_H(me), p, sz);                                 \
@@ -950,7 +950,7 @@ static PyObject *gmac_pynew(PyTypeObject *ty, PyObject *arg, PyObject *kw)
 {
   char *kwlist[] = { "k", 0 };
   char *k;
-  int sz;
+  Py_ssize_t sz;
 
   if (!PyArg_ParseTupleAndKeywords(arg, kw, "s#:new", kwlist, &k, &sz))
     goto end;
@@ -1212,7 +1212,7 @@ static PyObject *poly1305hash_pynew(PyTypeObject *ty,
   poly1305key_pyobj *pk = (poly1305key_pyobj *)ty;
   poly1305hash_pyobj *ph;
   char *m = 0;
-  int sz;
+  Py_ssize_t sz;
 
   if (!PyArg_ParseTupleAndKeywords(arg, kw, "|s#:new", kwlist, &m, &sz))
     return (0);
@@ -1233,7 +1233,7 @@ static PyObject *poly1305key_pynew(PyTypeObject *ty,
   char *kwlist[] = { "k", 0 };
   poly1305key_pyobj *pk;
   char *k;
-  int sz;
+  Py_ssize_t sz;
 
   if (!PyArg_ParseTupleAndKeywords(arg, kw, "s#:new", kwlist, &k, &sz))
     goto end;
@@ -1285,7 +1285,7 @@ static PyObject *polymeth_copy(PyObject *me, PyObject *arg)
 static PyObject *polymeth_hash(PyObject *me, PyObject *arg)
 {
   char *p;
-  int sz;
+  Py_ssize_t sz;
   if (!PyArg_ParseTuple(arg, "s#:hash", &p, &sz)) return (0);
   poly1305_hash(P1305_CTX(me), p, sz);
   RETURN_ME;
@@ -1297,7 +1297,7 @@ static PyObject *polymeth_hash(PyObject *me, PyObject *arg)
     uint##n x;                                                         \
     octet b[SZ_##W];                                                   \
     if (!PyArg_ParseTuple(arg, "O&:hashu" #w, convu##n, &x)) goto end; \
-    STORE##W(b, n); poly1305_hash(P1305_CTX(me), b, sizeof(b));                \
+    STORE##W(b, x); poly1305_hash(P1305_CTX(me), b, sizeof(b));                \
     RETURN_ME;                                                         \
   end:                                                                 \
     return (0);                                                                \
@@ -1308,11 +1308,11 @@ DOUINTCONV(POLYMETH_HASHU_)
   static PyObject *polymeth_hashbuf##w(PyObject *me, PyObject *arg)    \
   {                                                                    \
     char *p;                                                           \
-    int sz;                                                            \
+    Py_ssize_t sz;                                                     \
     octet b[SZ_##W];                                                   \
     if (!PyArg_ParseTuple(arg, "s#:hashbuf" #w, &p, &sz)) goto end;    \
     if (sz > MASK##n) TYERR("string too long");                                \
-    STORE##W(b, n); poly1305_hash(P1305_CTX(me), b, sizeof(b));                \
+    STORE##W(b, sz); poly1305_hash(P1305_CTX(me), b, sizeof(b));       \
     poly1305_hash(P1305_CTX(me), p, sz);                               \
     RETURN_ME;                                                         \
   end:                                                                 \
@@ -1335,6 +1335,13 @@ static PyObject *polymeth_flush(PyObject *me, PyObject *arg)
   RETURN_ME;
 }
 
+static PyObject *polymeth_flushzero(PyObject *me, PyObject *arg)
+{
+  if (!PyArg_ParseTuple(arg, ":flushzero")) return (0);
+  poly1305_flushzero(P1305_CTX(me));
+  RETURN_ME;
+}
+
 static PyObject *polymeth_concat(PyObject *me, PyObject *arg)
 {
   PyObject *pre, *suff;
@@ -1385,6 +1392,7 @@ static PyMethodDef poly1305hash_pymethods[] = {
 #undef METHBUF_
   METH (hashstrz,              "P.hashstrz(STRING)")
   METH  (flush,                        "P.flush()")
+  METH  (flushzero,            "P.flushzero()")
   METH  (concat,               "P.concat(PREFIX, SUFFIX)")
   METH (done,                  "P.done() -> TAG")
 #undef METHNAME
@@ -1535,6 +1543,35 @@ static PyTypeObject poly1305hash_pytype_skel = {
   0                                    /* @tp_is_gc@ */
 };
 
+/*----- Special snowflake for HSalsa and HChaCha --------------------------*/
+
+#define DEF_HDANCE(DANCE, HDANCE, dance, hdance)                       \
+  static PyObject *meth_##hdance##_prf(PyObject *me, PyObject *arg)    \
+  {                                                                    \
+    dance##_ctx dance;                                                 \
+    char *k, *n;                                                       \
+    Py_ssize_t ksz, nsz;                                               \
+    PyObject *rc;                                                      \
+    if (!PyArg_ParseTuple(arg, "s#s#:" #hdance "_prf",                 \
+                         &k, &ksz, &n, &nsz))                          \
+      goto end;                                                                \
+    if (ksz != DANCE##_KEYSZ) VALERR("bad key length");                        \
+    if (nsz != HDANCE##_INSZ) VALERR("bad input length");              \
+    rc = bytestring_pywrap(0, HSALSA20_OUTSZ);                         \
+    dance##_init(&dance, k, ksz, 0);                                   \
+    hdance##_prf(&dance, n, PyString_AS_STRING(rc));                   \
+    return (rc);                                                       \
+  end:                                                                 \
+    return (0);                                                                \
+  }
+
+DEF_HDANCE(SALSA20, HSALSA20, salsa20, hsalsa20)
+DEF_HDANCE(SALSA20, HSALSA20, salsa20, hsalsa2012)
+DEF_HDANCE(SALSA20, HSALSA20, salsa20, hsalsa208)
+
+DEF_HDANCE(CHACHA, HCHACHA, chacha, hchacha20)
+DEF_HDANCE(CHACHA, HCHACHA, chacha, hchacha12)
+DEF_HDANCE(CHACHA, HCHACHA, chacha, hchacha8)
 
 /*----- Pseudorandom permutations -----------------------------------------*/
 
@@ -1597,7 +1634,7 @@ static PyObject *gprp_pynew(PyTypeObject *ty, PyObject *arg, PyObject *kw)
 {
   char *kwlist[] = { "key", 0 };
   char *k;
-  int sz;
+  Py_ssize_t sz;
   const prpinfo *prp = GCPRP_PRP(ty);
   PyObject *me;
 
@@ -1643,7 +1680,7 @@ static PyObject *gcpget_blksz(PyObject *me, void *hunoz)
 static PyObject *gpmeth_encrypt(PyObject *me, PyObject *arg)
 {
   char *p;
-  int n;
+  Py_ssize_t n;
   PyObject *rc = 0;
 
   if (!PyArg_ParseTuple(arg, "s#:encrypt", &p, &n)) goto end;
@@ -1657,7 +1694,7 @@ end:
 static PyObject *gpmeth_decrypt(PyObject *me, PyObject *arg)
 {
   char *p;
-  int n;
+  Py_ssize_t n;
   PyObject *rc = 0;
 
   if (!PyArg_ParseTuple(arg, "s#:decrypt", &p, &n)) goto end;
@@ -1801,6 +1838,17 @@ toschnorr(N) -> M: convert work factor to Schnorr group order")
 toif(N) -> M: convert work factor to integer factorization problem size")
   METH (_KeySZ_toec,           "\
 toec(N) -> M: convert work factor to elliptic curve group order")
+  METH (_KeySZ_toec,           "\
+toec(N) -> M: convert work factor to elliptic curve group order")
+#define METH_HDANCE(hdance, HDance) METH(hdance##_prf, "\
+" #hdance "_prf(K, N) -> H: calculate " HDance " hash of N with K")
+  METH_HDANCE(hsalsa20, "HSalsa20")
+  METH_HDANCE(hsalsa2012, "HSalsa20/12")
+  METH_HDANCE(hsalsa208, "HSalsa20/8")
+  METH_HDANCE(hchacha20, "HChaCha20")
+  METH_HDANCE(hchacha12, "HChaCha12")
+  METH_HDANCE(hchacha8, "HChaCha8")
+#undef METH_DANCE
 #undef METHNAME
   { 0 }
 };