X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Fsiphash%2Fsiphash.c;h=05292b9ffcc75e8289c95dee335127f283901db6;hb=c8e75cdce11b3ad7db6c1fff580c587395b59965;hp=93eac040fc14b9181b00785adb829076de346718;hpb=480b3117c39b91fcb6d39c60222232b7608f5507;p=ccan diff --git a/ccan/siphash/siphash.c b/ccan/siphash/siphash.c index 93eac040..05292b9f 100644 --- a/ccan/siphash/siphash.c +++ b/ccan/siphash/siphash.c @@ -2,9 +2,9 @@ #include -#include "siphash.h" +#include -typedef uint64_t u64; +#include "siphash.h" enum sip_index { A=0, B=2, C=1, D=3, E=4 }; @@ -23,10 +23,15 @@ enum sip_index { A=0, B=2, C=1, D=3, E=4 }; SIP_HALF_ROUND((W)[C], (W)[B], (W)[A], (W)[D], 17, 21); \ } while(0) -/* Load a 64-bit word as little endian */ -#define W64(S,I) (le64_to_cpu(*((u64 *)(S) + (I)))) -static void siphash_init(u64 v[5], const unsigned char key[16]) +static inline uint64_t W64(const unsigned char *p, size_t j) +{ + uint64_t x; + memcpy(&x, p + j*sizeof(x), sizeof(x)); + return le64_to_cpu(x); +} + +static void siphash_init(uint64_t v[5], const unsigned char key[16]) { v[A] = W64(key, 0) ^ UINT64_C(0x736f6d6570736575); v[B] = W64(key, 1) ^ UINT64_C(0x646f72616e646f6d); @@ -36,25 +41,25 @@ static void siphash_init(u64 v[5], const unsigned char key[16]) } /* Load the last 0-7 bytes of `in` and put in len & 255 */ -static void siphash_epilogue(u64 *m, const void *in, size_t len) +static void siphash_epilogue(uint64_t *m, const unsigned char *in, size_t len) { - in = (char *)in + (len & ~7); - *m = (u64)(len & 255) << 56; + in += len & ~(size_t)7; + *m = (uint64_t)(len & 255) << 56; switch (len & 7) { - case 7: *m |= (u64)*((unsigned char *)in+6) << 48; - case 6: *m |= (u64)*((unsigned char *)in+5) << 40; - case 5: *m |= (u64)*((unsigned char *)in+4) << 32; - case 4: *m |= (u64)*((unsigned char *)in+3) << 24; - case 3: *m |= (u64)*((unsigned char *)in+2) << 16; - case 2: *m |= (u64)*((unsigned char *)in+1) << 8; - case 1: *m |= (u64)*((unsigned char *)in+0); + case 7: *m |= (uint64_t) in[6] << 48; + case 6: *m |= (uint64_t) in[5] << 40; + case 5: *m |= (uint64_t) in[4] << 32; + case 4: *m |= (uint64_t) in[3] << 24; + case 3: *m |= (uint64_t) in[2] << 16; + case 2: *m |= (uint64_t) in[1] << 8; + case 1: *m |= (uint64_t) in[0]; case 0: ; } } -u64 siphash_2_4(const void *in, size_t len, const unsigned char key[16]) +uint64_t siphash_2_4(const void *in, size_t len, const unsigned char key[16]) { - u64 v[5]; + uint64_t v[5]; size_t j; siphash_init(v, key);