added test for siphash

This commit is contained in:
Niels Werensteijn 2016-10-11 11:16:01 +02:00
parent 4e3670842d
commit 984bab5a3f
4 changed files with 260 additions and 0 deletions

2
test/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
*.o
/test_siphash

18
test/Makefile Normal file
View File

@ -0,0 +1,18 @@
CC = gcc
CFLAGS = -g
RM = rm -f
default: all
all: test_siphash
%_test.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
test_siphash: test_siphash_test.o siphash24_ref_test.o ../src/siphash24_test.o
$(CC) $(CFLAGS) -o $@ $^
clean veryclean:
$(RM) test_siphash *.o ../src/siphash24_test.o

165
test/siphash24_ref.c Normal file
View File

@ -0,0 +1,165 @@
/*
SipHash reference C implementation
Copyright (c) 2012-2014 Jean-Philippe Aumasson
<jeanphilippe.aumasson@gmail.com>
Copyright (c) 2012-2014 Daniel J. Bernstein <djb@cr.yp.to>
To the extent possible under law, the author(s) have dedicated all copyright
and related and neighboring rights to this software to the public domain
worldwide. This software is distributed without any warranty.
You should have received a copy of the CC0 Public Domain Dedication along
with
this software. If not, see
<http://creativecommons.org/publicdomain/zero/1.0/>.
*/
#include <stdint.h>
#include <stdio.h>
#include <string.h>
/* default: SipHash-2-4 */
#define cROUNDS 2
#define dROUNDS 4
#define ROTL(x, b) (uint64_t)(((x) << (b)) | ((x) >> (64 - (b))))
#define U32TO8_LE(p, v) \
(p)[0] = (uint8_t)((v)); \
(p)[1] = (uint8_t)((v) >> 8); \
(p)[2] = (uint8_t)((v) >> 16); \
(p)[3] = (uint8_t)((v) >> 24);
#define U64TO8_LE(p, v) \
U32TO8_LE((p), (uint32_t)((v))); \
U32TO8_LE((p) + 4, (uint32_t)((v) >> 32));
#define U8TO64_LE(p) \
(((uint64_t)((p)[0])) | ((uint64_t)((p)[1]) << 8) | \
((uint64_t)((p)[2]) << 16) | ((uint64_t)((p)[3]) << 24) | \
((uint64_t)((p)[4]) << 32) | ((uint64_t)((p)[5]) << 40) | \
((uint64_t)((p)[6]) << 48) | ((uint64_t)((p)[7]) << 56))
#define SIPROUND \
do { \
v0 += v1; \
v1 = ROTL(v1, 13); \
v1 ^= v0; \
v0 = ROTL(v0, 32); \
v2 += v3; \
v3 = ROTL(v3, 16); \
v3 ^= v2; \
v0 += v3; \
v3 = ROTL(v3, 21); \
v3 ^= v0; \
v2 += v1; \
v1 = ROTL(v1, 17); \
v1 ^= v2; \
v2 = ROTL(v2, 32); \
} while (0)
#ifdef DEBUG
#define TRACE \
do { \
printf("(%3d) v0 %08x %08x\n", (int)inlen, (uint32_t)(v0 >> 32), \
(uint32_t)v0); \
printf("(%3d) v1 %08x %08x\n", (int)inlen, (uint32_t)(v1 >> 32), \
(uint32_t)v1); \
printf("(%3d) v2 %08x %08x\n", (int)inlen, (uint32_t)(v2 >> 32), \
(uint32_t)v2); \
printf("(%3d) v3 %08x %08x\n", (int)inlen, (uint32_t)(v3 >> 32), \
(uint32_t)v3); \
} while (0)
#else
#define TRACE
#endif
int siphash(uint8_t *out, const uint8_t *in, uint64_t inlen, const uint8_t *k) {
/* "somepseudorandomlygeneratedbytes" */
uint64_t v0 = 0x736f6d6570736575ULL;
uint64_t v1 = 0x646f72616e646f6dULL;
uint64_t v2 = 0x6c7967656e657261ULL;
uint64_t v3 = 0x7465646279746573ULL;
uint64_t b;
uint64_t k0 = U8TO64_LE(k);
uint64_t k1 = U8TO64_LE(k + 8);
uint64_t m;
int i;
const uint8_t *end = in + inlen - (inlen % sizeof(uint64_t));
const int left = inlen & 7;
b = ((uint64_t)inlen) << 56;
v3 ^= k1;
v2 ^= k0;
v1 ^= k1;
v0 ^= k0;
#ifdef DOUBLE
v1 ^= 0xee;
#endif
for (; in != end; in += 8) {
m = U8TO64_LE(in);
v3 ^= m;
TRACE;
for (i = 0; i < cROUNDS; ++i)
SIPROUND;
v0 ^= m;
}
switch (left) {
case 7:
b |= ((uint64_t)in[6]) << 48;
case 6:
b |= ((uint64_t)in[5]) << 40;
case 5:
b |= ((uint64_t)in[4]) << 32;
case 4:
b |= ((uint64_t)in[3]) << 24;
case 3:
b |= ((uint64_t)in[2]) << 16;
case 2:
b |= ((uint64_t)in[1]) << 8;
case 1:
b |= ((uint64_t)in[0]);
break;
case 0:
break;
}
v3 ^= b;
TRACE;
for (i = 0; i < cROUNDS; ++i)
SIPROUND;
v0 ^= b;
#ifndef DOUBLE
v2 ^= 0xff;
#else
v2 ^= 0xee;
#endif
TRACE;
for (i = 0; i < dROUNDS; ++i)
SIPROUND;
b = v0 ^ v1 ^ v2 ^ v3;
U64TO8_LE(out, b);
#ifdef DOUBLE
v1 ^= 0xdd;
TRACE;
for (i = 0; i < dROUNDS; ++i)
SIPROUND;
b = v0 ^ v1 ^ v2 ^ v3;
U64TO8_LE(out + 8, b);
#endif
return 0;
}

75
test/test_siphash.c Normal file
View File

@ -0,0 +1,75 @@
/*
* test to see if ts3init_siphash24 behaves like it should
*
* Authors:
* Niels Werensteijn <niels werensteijn [at] teampseak com>, 2016-10-03
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License; either version 2
* or 3 of the License, as published by the Free Software Foundation.
*/
#include <stdint.h>
#include <stdio.h>
#include <inttypes.h>
#include "../src/siphash24.h"
int siphash(uint8_t *out, const uint8_t *in, uint64_t inlen, const uint8_t *k);
int main()
{
uint64_t keys[8][2];
uint8_t data[40];
int i, j, k, l;
union
{
uint8_t out1[8];
uint64_t out2;
} o;
uint64_t out64;
struct ts3init_siphash_state state;
/* initialize */
for (i=0; i<8; ++i)
{
keys[i][0] = 1 + i;
keys[i][1] = 9 + i;
}
for (i=0; i < 40; ++i)
data[i] = 100 + i;
for (i=0; i < 8; ++i)
{
for (j = 0; j < 40; ++j)
{
siphash(o.out1, data, j, (uint8_t*)keys[i] );
ts3init_siphash_setup(&state, keys[i][0], keys[i][1]);
ts3init_siphash_update(&state, data, j);
out64 = ts3init_siphash_finalize(&state);
if (out64 != o.out2)
printf("failed i:%d j:%d 0x%" PRIx64 " 0x%" PRIx64 " \n", i, j, out64, o.out2);
for(k=0; k < j; ++k)
{
for (l=k; l < j; ++l)
{
ts3init_siphash_setup(&state, keys[i][0], keys[i][1]);
ts3init_siphash_update(&state, data, k);
ts3init_siphash_update(&state, data+k, l-k);
ts3init_siphash_update(&state, data+l, j-l);
out64 = ts3init_siphash_finalize(&state);
if (out64 != o.out2)
printf("failed i:%d j:%d k:%d l:%d 0x%" PRIx64 " 0x%" PRIx64 " \n", i, j, k, l, out64, o.out2);
}
}
}
}
printf("test complete\n");
}