@@@ fltfmt mess
[mLib] / hash / t / siphash-mktv.c
diff --git a/hash/t/siphash-mktv.c b/hash/t/siphash-mktv.c
new file mode 100644 (file)
index 0000000..285d1ec
--- /dev/null
@@ -0,0 +1,49 @@
+#include <stdio.h>
+
+#include "siphash.h"
+
+#define TAP 0x8299
+
+static void step(int *rng_inout)
+{
+  unsigned i;
+  int x = *rng_inout;
+
+  for (i = 0; i < 8; i++) x = (x << 1) ^ ((x >> 31)&TAP);
+  *rng_inout = x;
+}
+
+static void fill(int *rng_inout, unsigned char *p, size_t sz)
+  { while (sz--) { *p++ = *rng_inout&0xff; step(rng_inout); } }
+
+static void dump(const char *name, const unsigned char *p, size_t sz)
+{
+  size_t i;
+
+  printf("%s = ", name);
+  if (!sz)
+    fputs("\"\"", stdout);
+  else for (i = 0; i < sz; i++) {
+    if (!i || i%4) ;
+    else if (!(i%32)) fputs("\n    ", stdout);
+    else if (!(i%4)) fputc(' ', stdout);
+    printf("%02x", *p++);
+  }
+  fputc('\n', stdout);
+}
+
+int main(void)
+{
+  unsigned char k[16], h[8];
+  unsigned char msg[1024];
+  int rng = 0xe6161f4d;
+  unsigned i;
+
+  for (i = 0; i <= sizeof(msg); i++) {
+    if (i) fputc('\n', stdout);
+    fill(&rng, k, sizeof(k)); dump("k", k, sizeof(k));
+    fill(&rng, msg, i); dump("m", msg, i);
+    siphash(msg, i, k, h, sizeof(h)); dump("h", h, sizeof(h));
+  }
+  return (0);
+}