--- /dev/null
+#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);
+}