diff options
author | Jean-Philippe Aumasson <jeanphilippe.aumasson@gmail.com> | 2021-03-12 08:30:41 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-03-12 08:30:41 +0100 |
commit | a774642c9c720bea3e9a07e35c6bde36759dca9d (patch) | |
tree | 97332feec6ad9440bc517ef49173d0dae2505a37 /siphash.c | |
parent | Merge pull request #34 from veorq/moretest (diff) | |
parent | consts (diff) | |
download | siphash-a774642c9c720bea3e9a07e35c6bde36759dca9d.tar.gz siphash-a774642c9c720bea3e9a07e35c6bde36759dca9d.tar.xz |
Merge pull request #35 from veorq/uint8t2uchar
address potential strict aliasing violation
Diffstat (limited to 'siphash.c')
-rw-r--r-- | siphash.c | 31 |
1 files changed, 17 insertions, 14 deletions
@@ -76,19 +76,22 @@ #define TRACE #endif -int siphash(const uint8_t *in, const size_t inlen, const uint8_t *k, - uint8_t *out, const size_t outlen) { +int siphash(const void *in, const size_t inlen, const void *k, uint8_t *out, + const size_t outlen) { + + const unsigned char *ni = (const unsigned char *)in; + const unsigned char *kk = (const unsigned char *)k; assert((outlen == 8) || (outlen == 16)); uint64_t v0 = UINT64_C(0x736f6d6570736575); uint64_t v1 = UINT64_C(0x646f72616e646f6d); uint64_t v2 = UINT64_C(0x6c7967656e657261); uint64_t v3 = UINT64_C(0x7465646279746573); - uint64_t k0 = U8TO64_LE(k); - uint64_t k1 = U8TO64_LE(k + 8); + uint64_t k0 = U8TO64_LE(kk); + uint64_t k1 = U8TO64_LE(kk + 8); uint64_t m; int i; - const uint8_t *end = in + inlen - (inlen % sizeof(uint64_t)); + const unsigned char *end = ni + inlen - (inlen % sizeof(uint64_t)); const int left = inlen & 7; uint64_t b = ((uint64_t)inlen) << 56; v3 ^= k1; @@ -99,8 +102,8 @@ int siphash(const uint8_t *in, const size_t inlen, const uint8_t *k, if (outlen == 16) v1 ^= 0xee; - for (; in != end; in += 8) { - m = U8TO64_LE(in); + for (; ni != end; ni += 8) { + m = U8TO64_LE(ni); v3 ^= m; TRACE; @@ -112,19 +115,19 @@ int siphash(const uint8_t *in, const size_t inlen, const uint8_t *k, switch (left) { case 7: - b |= ((uint64_t)in[6]) << 48; + b |= ((uint64_t)ni[6]) << 48; case 6: - b |= ((uint64_t)in[5]) << 40; + b |= ((uint64_t)ni[5]) << 40; case 5: - b |= ((uint64_t)in[4]) << 32; + b |= ((uint64_t)ni[4]) << 32; case 4: - b |= ((uint64_t)in[3]) << 24; + b |= ((uint64_t)ni[3]) << 24; case 3: - b |= ((uint64_t)in[2]) << 16; + b |= ((uint64_t)ni[2]) << 16; case 2: - b |= ((uint64_t)in[1]) << 8; + b |= ((uint64_t)ni[1]) << 8; case 1: - b |= ((uint64_t)in[0]); + b |= ((uint64_t)ni[0]); break; case 0: break; |