aboutsummaryrefslogtreecommitdiff
path: root/siphash.c
diff options
context:
space:
mode:
authorJean-Philippe Aumasson <jeanphilippe.aumasson@gmail.com>2021-03-12 08:30:41 +0100
committerGitHub <noreply@github.com>2021-03-12 08:30:41 +0100
commita774642c9c720bea3e9a07e35c6bde36759dca9d (patch)
tree97332feec6ad9440bc517ef49173d0dae2505a37 /siphash.c
parentMerge pull request #34 from veorq/moretest (diff)
parentconsts (diff)
downloadsiphash-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.c31
1 files changed, 17 insertions, 14 deletions
diff --git a/siphash.c b/siphash.c
index 065a593..f724058 100644
--- a/siphash.c
+++ b/siphash.c
@@ -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;