Skip to content

Commit bdda830

Browse files
committed
Merge tag 'random-5.18-rc5-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/crng/random
Pull random number generator fixes from Jason Donenfeld: - Eric noticed that the memmove() in crng_fast_key_erasure() was bogus, so this has been changed to a memcpy() and the confusing situation clarified with a detailed comment. - [Half]SipHash documentation updates from Bagas and Eric, after Eric pointed out that the use of HalfSipHash in random.c made a bit of the text potentially misleading. * tag 'random-5.18-rc5-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/crng/random: Documentation: siphash: disambiguate HalfSipHash algorithm from hsiphash functions Documentation: siphash: enclose HalfSipHash usage example in the literal block Documentation: siphash: convert danger note to warning for HalfSipHash random: document crng_fast_key_erasure() destination possibility
2 parents bd383b8 + 5a7e470 commit bdda830

File tree

2 files changed

+36
-19
lines changed

2 files changed

+36
-19
lines changed

Documentation/security/siphash.rst

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -121,26 +121,36 @@ even scarier, uses an easily brute-forcable 64-bit key (with a 32-bit output)
121121
instead of SipHash's 128-bit key. However, this may appeal to some
122122
high-performance `jhash` users.
123123

124-
Danger!
125-
126-
Do not ever use HalfSipHash except for as a hashtable key function, and only
127-
then when you can be absolutely certain that the outputs will never be
128-
transmitted out of the kernel. This is only remotely useful over `jhash` as a
129-
means of mitigating hashtable flooding denial of service attacks.
130-
131-
Generating a HalfSipHash key
132-
============================
124+
HalfSipHash support is provided through the "hsiphash" family of functions.
125+
126+
.. warning::
127+
Do not ever use the hsiphash functions except for as a hashtable key
128+
function, and only then when you can be absolutely certain that the outputs
129+
will never be transmitted out of the kernel. This is only remotely useful
130+
over `jhash` as a means of mitigating hashtable flooding denial of service
131+
attacks.
132+
133+
On 64-bit kernels, the hsiphash functions actually implement SipHash-1-3, a
134+
reduced-round variant of SipHash, instead of HalfSipHash-1-3. This is because in
135+
64-bit code, SipHash-1-3 is no slower than HalfSipHash-1-3, and can be faster.
136+
Note, this does *not* mean that in 64-bit kernels the hsiphash functions are the
137+
same as the siphash ones, or that they are secure; the hsiphash functions still
138+
use a less secure reduced-round algorithm and truncate their outputs to 32
139+
bits.
140+
141+
Generating a hsiphash key
142+
=========================
133143

134144
Keys should always be generated from a cryptographically secure source of
135-
random numbers, either using get_random_bytes or get_random_once:
145+
random numbers, either using get_random_bytes or get_random_once::
136146

137-
hsiphash_key_t key;
138-
get_random_bytes(&key, sizeof(key));
147+
hsiphash_key_t key;
148+
get_random_bytes(&key, sizeof(key));
139149

140150
If you're not deriving your key from here, you're doing it wrong.
141151

142-
Using the HalfSipHash functions
143-
===============================
152+
Using the hsiphash functions
153+
============================
144154

145155
There are two variants of the function, one that takes a list of integers, and
146156
one that takes a buffer::
@@ -183,7 +193,7 @@ You may then iterate like usual over the returned hash bucket.
183193
Performance
184194
===========
185195

186-
HalfSipHash is roughly 3 times slower than JenkinsHash. For many replacements,
187-
this will not be a problem, as the hashtable lookup isn't the bottleneck. And
188-
in general, this is probably a good sacrifice to make for the security and DoS
189-
resistance of HalfSipHash.
196+
hsiphash() is roughly 3 times slower than jhash(). For many replacements, this
197+
will not be a problem, as the hashtable lookup isn't the bottleneck. And in
198+
general, this is probably a good sacrifice to make for the security and DoS
199+
resistance of hsiphash().

drivers/char/random.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,13 @@ static void crng_reseed(bool force)
318318
* the resultant ChaCha state to the user, along with the second
319319
* half of the block containing 32 bytes of random data that may
320320
* be used; random_data_len may not be greater than 32.
321+
*
322+
* The returned ChaCha state contains within it a copy of the old
323+
* key value, at index 4, so the state should always be zeroed out
324+
* immediately after using in order to maintain forward secrecy.
325+
* If the state cannot be erased in a timely manner, then it is
326+
* safer to set the random_data parameter to &chacha_state[4] so
327+
* that this function overwrites it before returning.
321328
*/
322329
static void crng_fast_key_erasure(u8 key[CHACHA_KEY_SIZE],
323330
u32 chacha_state[CHACHA_STATE_WORDS],
@@ -333,7 +340,7 @@ static void crng_fast_key_erasure(u8 key[CHACHA_KEY_SIZE],
333340
chacha20_block(chacha_state, first_block);
334341

335342
memcpy(key, first_block, CHACHA_KEY_SIZE);
336-
memmove(random_data, first_block + CHACHA_KEY_SIZE, random_data_len);
343+
memcpy(random_data, first_block + CHACHA_KEY_SIZE, random_data_len);
337344
memzero_explicit(first_block, sizeof(first_block));
338345
}
339346

0 commit comments

Comments
 (0)