]> git.bitcoin.ninja Git - flowspec-xdp/commitdiff
Simplify siphash as we always have a round number of 64-bit words
authorMatt Corallo <git@bluematt.me>
Mon, 17 Jun 2024 18:10:21 +0000 (18:10 +0000)
committerMatt Corallo <git@bluematt.me>
Mon, 17 Jun 2024 18:13:30 +0000 (18:13 +0000)
siphash.h

index 1d748b9beab3298622b9d7b566f276825d151322..f6d5fb3a93b25951426523cd3ebbfa01314a8321 100644 (file)
--- a/siphash.h
+++ b/siphash.h
@@ -18,6 +18,7 @@
 
 #include <stddef.h>
 #include <stdint.h>
+#include <string.h>
 
 /* default: SipHash-2-4 */
 #ifndef cROUNDS
@@ -73,8 +74,7 @@
 #endif
 
 __attribute__((always_inline))
-static inline uint64_t siphash(const void *in, const size_t inlen, const uint8_t k[16]) {
-    const unsigned char *ni = (const unsigned char *)in;
+static inline uint64_t siphash(const uint64_t *in, const size_t inwords, const uint8_t k[16]) {
     const unsigned char *kk = (const unsigned char *)k;
 
     uint64_t v0 = UINT64_C(0x736f6d6570736575);
@@ -85,16 +85,16 @@ static inline uint64_t siphash(const void *in, const size_t inlen, const uint8_t
     uint64_t k1 = U8TO64_LE(kk + 8);
     uint64_t m;
     int i;
-    const unsigned char *end = ni + inlen - (inlen % sizeof(uint64_t));
-    const int left = inlen & 7;
-    uint64_t b = ((uint64_t)inlen) << 56;
+    size_t j;
+    uint64_t b = ((uint64_t)inwords) << (56 + 3);
     v3 ^= k1;
     v2 ^= k0;
     v1 ^= k1;
     v0 ^= k0;
 
-    for (; ni != end; ni += 8) {
-        m = U8TO64_LE(ni);
+    for (j = 0; j < inwords; ++j) {
+        m = *in;
+        in += 1;
         v3 ^= m;
 
         TRACE;
@@ -104,26 +104,6 @@ static inline uint64_t siphash(const void *in, const size_t inlen, const uint8_t
         v0 ^= m;
     }
 
-    switch (left) {
-    case 7:
-        b |= ((uint64_t)ni[6]) << 48;
-    case 6:
-        b |= ((uint64_t)ni[5]) << 40;
-    case 5:
-        b |= ((uint64_t)ni[4]) << 32;
-    case 4:
-        b |= ((uint64_t)ni[3]) << 24;
-    case 3:
-        b |= ((uint64_t)ni[2]) << 16;
-    case 2:
-        b |= ((uint64_t)ni[1]) << 8;
-    case 1:
-        b |= ((uint64_t)ni[0]);
-        break;
-    case 0:
-        break;
-    }
-
     v3 ^= b;
 
     TRACE;
@@ -143,8 +123,10 @@ static inline uint64_t siphash(const void *in, const size_t inlen, const uint8_t
 
 #include "rand.h"
 static uint64_t siphash_uint64_t(const uint64_t in) {
-       return siphash(&in, sizeof(uint64_t), COMPILE_TIME_RAND);
+       return siphash(&in, 1, COMPILE_TIME_RAND);
 }
 static uint64_t siphash_uint128_t(const __uint128_t in) {
-       return siphash(&in, sizeof(__uint128_t), COMPILE_TIME_RAND);
+       uint64_t words[2];
+       memcpy(words, &in, sizeof(__uint128_t));
+       return siphash(words, 2, COMPILE_TIME_RAND);
 }