diff --git a/siphash24.c b/siphash24.c index 9847e2e..ae63b08 100644 --- a/siphash24.c +++ b/siphash24.c @@ -15,20 +15,21 @@ #include #include +/* 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) \ +#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); + (p)[2] = (uint8_t)((v) >> 16); (p)[3] = (uint8_t)((v) >> 24); -#define U64TO8_LE(p, v) \ +#define U64TO8_LE(p, v) \ U32TO8_LE((p), (uint32_t)((v) )); \ -U32TO8_LE((p) + 4, (uint32_t)((v) >> 32)); + U32TO8_LE((p) + 4, (uint32_t)((v) >> 32)); -#define U8TO64_LE(p) \ +#define U8TO64_LE(p) \ (((uint64_t)((p)[0]) ) | \ ((uint64_t)((p)[1]) << 8) | \ ((uint64_t)((p)[2]) << 16) | \ @@ -38,15 +39,30 @@ U32TO8_LE((p) + 4, (uint32_t)((v) >> 32)); ((uint64_t)((p)[6]) << 48) | \ ((uint64_t)((p)[7]) << 56)) -#define SIPROUND \ - do { \ +#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 += 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) -/* SipHash-2-4 */ +#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" */ @@ -74,15 +90,9 @@ int siphash( uint8_t *out, const uint8_t *in, uint64_t inlen, const uint8_t *k for ( ; in != end; in += 8 ) { m = U8TO64_LE( in ); -#ifdef DEBUG - 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 ); - printf( "(%3d) compress %08x %08x\n", ( int )inlen, ( uint32_t )( m >> 32 ), ( uint32_t )m ); -#endif v3 ^= m; + TRACE; for( i=0; i> 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 ); - printf( "(%3d) padding %08x %08x\n", ( int )inlen, ( uint32_t )( b >> 32 ), ( uint32_t )b ); -#endif + v3 ^= b; + TRACE; for( i=0; i> 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 ); -#endif #ifndef DOUBLE v2 ^= 0xff; @@ -132,6 +131,7 @@ int siphash( uint8_t *out, const uint8_t *in, uint64_t inlen, const uint8_t *k v2 ^= 0xee; #endif + TRACE; for( i=0; i