Hi,
arc4random() rekeys currently rekeys from the kernel every 1.6MB.
It costs us almost nothing to make this interval non-deterministic,
so let's do that.
With the below it will rekey randomly somewhere between 1MB and 2MB.
ok?
Index: crypt/arc4random.c
===================================================================
RCS file: /cvs/src/lib/libc/crypt/arc4random.c,v
retrieving revision 1.56
diff -u -p -r1.56 arc4random.c
--- crypt/arc4random.c 28 Feb 2022 21:56:29 -0000 1.56
+++ crypt/arc4random.c 28 Jul 2022 00:37:13 -0000
@@ -49,6 +49,8 @@
#define BLOCKSZ 64
#define RSBUFSZ (16*BLOCKSZ)
+#define REKEY_BASE (1<<20) /* NB. *must* be a power of 2 */
+
/* Marked MAP_INHERIT_ZERO, so zero'd out in fork children. */
static struct _rs {
size_t rs_have; /* valid bytes at end of rs_buf */
@@ -63,6 +65,8 @@ static struct _rsx {
static inline int _rs_allocate(struct _rs **, struct _rsx **);
static inline void _rs_forkdetect(void);
+static inline void _rs_random_u32(uint32_t *);
+
#include "arc4random.h"
static inline void _rs_rekey(u_char *dat, size_t datlen);
@@ -86,6 +90,7 @@ static void
_rs_stir(void)
{
u_char rnd[KEYSZ + IVSZ];
+ uint32_t rekey_fuzz;
if (getentropy(rnd, sizeof rnd) == -1)
_getentropy_fail();
@@ -100,7 +105,10 @@ _rs_stir(void)
rs->rs_have = 0;
memset(rsx->rs_buf, 0, sizeof(rsx->rs_buf));
- rs->rs_count = 1600000;
+ rs->rs_count = REKEY_BASE;
+ /* rekey interval should not be predictable */
+ _rs_random_u32(&rekey_fuzz);
+ rs->rs_count += rekey_fuzz & (REKEY_BASE - 1);
}
static inline void