aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2017-10-12 01:51:43 +0200
committerJason A. Donenfeld <Jason@zx2c4.com>2017-10-12 14:06:34 +0200
commit046becd0b7aa8b478e82be1c6f734982964ece7b (patch)
treeb86f7ffb5ab20bad5dc940f473884e5fcb223aa3
parentMerge tag 'f2fs-for-4.14-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs (diff)
downloadlinux-dev-jd/hsiphash128.tar.xz
linux-dev-jd/hsiphash128.zip
hsiphash: always use 128-bit keysjd/hsiphash128
This gives us a larger security margin by adding two extra inexpensive rounds. Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-rw-r--r--include/linux/siphash.h6
-rw-r--r--lib/siphash.c8
2 files changed, 12 insertions, 2 deletions
diff --git a/include/linux/siphash.h b/include/linux/siphash.h
index fa7a6b9cedbf..c5abb71ad844 100644
--- a/include/linux/siphash.h
+++ b/include/linux/siphash.h
@@ -86,7 +86,11 @@ static inline u64 siphash(const void *data, size_t len,
#define HSIPHASH_ALIGNMENT __alignof__(unsigned long)
typedef struct {
- unsigned long key[2];
+#if BITS_PER_LONG == 64
+ u64 key[2];
+#else
+ u32 key[4];
+#endif
} hsiphash_key_t;
u32 __hsiphash_aligned(const void *data, size_t len,
diff --git a/lib/siphash.c b/lib/siphash.c
index 3ae58b4edad6..726c43620960 100644
--- a/lib/siphash.c
+++ b/lib/siphash.c
@@ -406,7 +406,13 @@ EXPORT_SYMBOL(hsiphash_4u32);
v3 ^= key->key[1]; \
v2 ^= key->key[0]; \
v1 ^= key->key[1]; \
- v0 ^= key->key[0];
+ v0 ^= key->key[0]; \
+ v3 ^= key->key[2]; \
+ HSIPROUND; \
+ v1 ^= key->key[2]; \
+ v3 ^= key->key[3]; \
+ HSIPROUND; \
+ v1 ^= key->key[3];
#define HPOSTAMBLE \
v3 ^= b; \