aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/random.c
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2022-05-07 14:03:46 +0200
committerJason A. Donenfeld <Jason@zx2c4.com>2022-05-18 15:53:52 +0200
commite73aaae2fa9024832e1f42e30c787c7baf61d014 (patch)
tree151a956250ad489a31c98047f24ea82fa157a1a8 /drivers/char/random.c
parentrandom: help compiler out with fast_mix() by using simpler arguments (diff)
downloadlinux-dev-e73aaae2fa9024832e1f42e30c787c7baf61d014.tar.xz
linux-dev-e73aaae2fa9024832e1f42e30c787c7baf61d014.zip
siphash: use one source of truth for siphash permutations
The SipHash family of permutations is currently used in three places: - siphash.c itself, used in the ordinary way it was intended. - random32.c, in a construction from an anonymous contributor. - random.c, as part of its fast_mix function. Each one of these places reinvents the wheel with the same C code, same rotation constants, and same symmetry-breaking constants. This commit tidies things up a bit by placing macros for the permutations and constants into siphash.h, where each of the three .c users can access them. It also leaves a note dissuading more users of them from emerging. Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to 'drivers/char/random.c')
-rw-r--r--drivers/char/random.c30
1 files changed, 7 insertions, 23 deletions
diff --git a/drivers/char/random.c b/drivers/char/random.c
index 8be3efd65ef2..c1763bcbcaed 100644
--- a/drivers/char/random.c
+++ b/drivers/char/random.c
@@ -52,6 +52,7 @@
#include <linux/uuid.h>
#include <linux/uaccess.h>
#include <linux/suspend.h>
+#include <linux/siphash.h>
#include <crypto/chacha.h>
#include <crypto/blake2s.h>
#include <asm/processor.h>
@@ -1086,12 +1087,11 @@ struct fast_pool {
static DEFINE_PER_CPU(struct fast_pool, irq_randomness) = {
#ifdef CONFIG_64BIT
- /* SipHash constants */
- .pool = { 0x736f6d6570736575UL, 0x646f72616e646f6dUL,
- 0x6c7967656e657261UL, 0x7465646279746573UL }
+#define FASTMIX_PERM SIPHASH_PERMUTATION
+ .pool = { SIPHASH_CONST_0, SIPHASH_CONST_1, SIPHASH_CONST_2, SIPHASH_CONST_3 }
#else
- /* HalfSipHash constants */
- .pool = { 0, 0, 0x6c796765U, 0x74656462U }
+#define FASTMIX_PERM HSIPHASH_PERMUTATION
+ .pool = { HSIPHASH_CONST_0, HSIPHASH_CONST_1, HSIPHASH_CONST_2, HSIPHASH_CONST_3 }
#endif
};
@@ -1103,27 +1103,11 @@ static DEFINE_PER_CPU(struct fast_pool, irq_randomness) = {
*/
static void fast_mix(unsigned long s[4], unsigned long v1, unsigned long v2)
{
-#ifdef CONFIG_64BIT
-#define PERM() do { \
- s[0] += s[1]; s[1] = rol64(s[1], 13); s[1] ^= s[0]; s[0] = rol64(s[0], 32); \
- s[2] += s[3]; s[3] = rol64(s[3], 16); s[3] ^= s[2]; \
- s[0] += s[3]; s[3] = rol64(s[3], 21); s[3] ^= s[0]; \
- s[2] += s[1]; s[1] = rol64(s[1], 17); s[1] ^= s[2]; s[2] = rol64(s[2], 32); \
-} while (0)
-#else
-#define PERM() do { \
- s[0] += s[1]; s[1] = rol32(s[1], 5); s[1] ^= s[0]; s[0] = rol32(s[0], 16); \
- s[2] += s[3]; s[3] = rol32(s[3], 8); s[3] ^= s[2]; \
- s[0] += s[3]; s[3] = rol32(s[3], 7); s[3] ^= s[0]; \
- s[2] += s[1]; s[1] = rol32(s[1], 13); s[1] ^= s[2]; s[2] = rol32(s[2], 16); \
-} while (0)
-#endif
-
s[3] ^= v1;
- PERM();
+ FASTMIX_PERM(s[0], s[1], s[2], s[3]);
s[0] ^= v1;
s[3] ^= v2;
- PERM();
+ FASTMIX_PERM(s[0], s[1], s[2], s[3]);
s[0] ^= v2;
}