algorithms.c: Add a Keccak `set' method now there's upstream support.
[catacomb-python] / algorithms.c
index 48bd480..be07fb7 100644 (file)
@@ -2912,6 +2912,27 @@ end:
   return (0);
 }
 
+static PyObject *kxvikmeth_set(PyObject *me, PyObject *arg)
+{
+  kxvik_pyobj *k = (kxvik_pyobj *)me;
+  kludge64 t[25];
+  const octet *q;
+  unsigned i;
+  struct bin in;
+  size_t n;
+
+  if (!PyArg_ParseTuple(arg, "O&:set", convbin, &in)) goto end;
+  if (in.sz > 200) VALERR("out of range");
+  q = in.p; n = in.sz;
+  i = 0;
+  while (n >= 8) { LOAD64_L_(t[i], q); i++; q += 8; n -= 8; }
+  if (n) VALERR("not 64-bit aligned");
+  keccak1600_set(&k->s, t, i);
+  RETURN_ME;
+end:
+  return (0);
+}
+
 static PyObject *kxvikmeth_extract(PyObject *me, PyObject *arg)
 {
   kxvik_pyobj *k = (kxvik_pyobj *)me;
@@ -2951,6 +2972,7 @@ static const PyMethodDef kxvik_pymethods[] = {
 #define METHNAME(func) kxvikmeth_##func
   NAMETH(copy,         "KECCAK.copy() -> KECCAK'")
   METH (mix,           "KECCAK.mix(DATA)")
+  METH (set,           "KECCAK.set(DATA)")
   METH (extract,       "KECCAK.extract(NOCTETS)")
   NAMETH(step,         "KECCAK.step()")
 #undef METHNAME