aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--siphash24.c61
1 files changed, 31 insertions, 30 deletions
diff --git a/siphash24.c b/siphash24.c
index 9847e2e..ae63b08 100644
--- a/siphash24.c
+++ b/siphash24.c
@@ -15,20 +15,21 @@
#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) \
+#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<cROUNDS; ++i ) SIPROUND;
v0 ^= m;
@@ -107,24 +117,13 @@ int siphash( uint8_t *out, const uint8_t *in, uint64_t inlen, const uint8_t *k
case 0: break;
}
-#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) padding %08x %08x\n", ( int )inlen, ( uint32_t )( b >> 32 ), ( uint32_t )b );
-#endif
+
v3 ^= b;
+ TRACE;
for( i=0; i<cROUNDS; ++i ) SIPROUND;
v0 ^= b;
-#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 );
-#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<dROUNDS; ++i ) SIPROUND;
b = v0 ^ v1 ^ v2 ^ v3;
@@ -140,6 +140,7 @@ int siphash( uint8_t *out, const uint8_t *in, uint64_t inlen, const uint8_t *k
#ifdef DOUBLE
v1 ^= 0xdd;
+ TRACE;
for( i=0; i<dROUNDS; ++i ) SIPROUND;
b = v0 ^ v1 ^ v2 ^ v3;