aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/random.c
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2017-06-07 23:06:55 -0400
committerTheodore Ts'o <tytso@mit.edu>2017-06-19 22:06:28 -0400
commitd06bfd1989fe97623b32d6df4ffa6e4338c99dc8 (patch)
tree26155c03fdfc23828c93712813a55f75b1b39e29 /drivers/char/random.c
parent7aed9f72c3c70bdc18e72ec086c1a0eafdcd273f (diff)
random: warn when kernel uses unseeded randomness
This enables an important dmesg notification about when drivers have used the crng without it being seeded first. Prior, these errors would occur silently, and so there hasn't been a great way of diagnosing these types of bugs for obscure setups. By adding this as a config option, we can leave it on by default, so that we learn where these issues happen, in the field, will still allowing some people to turn it off, if they really know what they're doing and do not want the log entries. However, we don't leave it _completely_ by default. An earlier version of this patch simply had `default y`. I'd really love that, but it turns out, this problem with unseeded randomness being used is really quite present and is going to take a long time to fix. Thus, as a compromise between log-messages-for-all and nobody-knows, this is `default y`, except it is also `depends on DEBUG_KERNEL`. This will ensure that the curious see the messages while others don't have to. Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com> Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Diffstat (limited to 'drivers/char/random.c')
-rw-r--r--drivers/char/random.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/drivers/char/random.c b/drivers/char/random.c
index 3853dd4f92e7..fa5bbd5a7ca0 100644
--- a/drivers/char/random.c
+++ b/drivers/char/random.c
@@ -288,7 +288,6 @@
288#define SEC_XFER_SIZE 512 288#define SEC_XFER_SIZE 512
289#define EXTRACT_SIZE 10 289#define EXTRACT_SIZE 10
290 290
291#define DEBUG_RANDOM_BOOT 0
292 291
293#define LONGS(x) (((x) + sizeof(unsigned long) - 1)/sizeof(unsigned long)) 292#define LONGS(x) (((x) + sizeof(unsigned long) - 1)/sizeof(unsigned long))
294 293
@@ -1481,7 +1480,7 @@ void get_random_bytes(void *buf, int nbytes)
1481{ 1480{
1482 __u8 tmp[CHACHA20_BLOCK_SIZE]; 1481 __u8 tmp[CHACHA20_BLOCK_SIZE];
1483 1482
1484#if DEBUG_RANDOM_BOOT > 0 1483#ifdef CONFIG_WARN_UNSEEDED_RANDOM
1485 if (!crng_ready()) 1484 if (!crng_ready())
1486 printk(KERN_NOTICE "random: %pF get_random_bytes called " 1485 printk(KERN_NOTICE "random: %pF get_random_bytes called "
1487 "with crng_init = %d\n", (void *) _RET_IP_, crng_init); 1486 "with crng_init = %d\n", (void *) _RET_IP_, crng_init);
@@ -2075,6 +2074,12 @@ u64 get_random_u64(void)
2075 return ret; 2074 return ret;
2076#endif 2075#endif
2077 2076
2077#ifdef CONFIG_WARN_UNSEEDED_RANDOM
2078 if (!crng_ready())
2079 printk(KERN_NOTICE "random: %pF get_random_u64 called "
2080 "with crng_init = %d\n", (void *) _RET_IP_, crng_init);
2081#endif
2082
2078 batch = &get_cpu_var(batched_entropy_u64); 2083 batch = &get_cpu_var(batched_entropy_u64);
2079 if (use_lock) 2084 if (use_lock)
2080 read_lock_irqsave(&batched_entropy_reset_lock, flags); 2085 read_lock_irqsave(&batched_entropy_reset_lock, flags);
@@ -2101,6 +2106,12 @@ u32 get_random_u32(void)
2101 if (arch_get_random_int(&ret)) 2106 if (arch_get_random_int(&ret))
2102 return ret; 2107 return ret;
2103 2108
2109#ifdef CONFIG_WARN_UNSEEDED_RANDOM
2110 if (!crng_ready())
2111 printk(KERN_NOTICE "random: %pF get_random_u32 called "
2112 "with crng_init = %d\n", (void *) _RET_IP_, crng_init);
2113#endif
2114
2104 batch = &get_cpu_var(batched_entropy_u32); 2115 batch = &get_cpu_var(batched_entropy_u32);
2105 if (use_lock) 2116 if (use_lock)
2106 read_lock_irqsave(&batched_entropy_reset_lock, flags); 2117 read_lock_irqsave(&batched_entropy_reset_lock, flags);