aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/random.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2019-09-29 22:25:39 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2019-09-29 22:25:39 -0400
commit3f2dc2798b81531fd93a3b9b7c39da47ec689e55 (patch)
tree075660db24621f4be8e24882bcaa88e15bc797f4 /drivers/char/random.c
parenta3c0e7b1fe1fc62bba5f591c4bc404eea96823b8 (diff)
parent02f03c4206c1b2a7451d3b3546f86c9c783eac13 (diff)
Merge branch 'entropy'
Merge active entropy generation updates. This is admittedly partly "for discussion". We need to have a way forward for the boot time deadlocks where user space ends up waiting for more entropy, but no entropy is forthcoming because the system is entirely idle just waiting for something to happen. While this was triggered by what is arguably a user space bug with GDM/gnome-session asking for secure randomness during early boot, when they didn't even need any such truly secure thing, the issue ends up being that our "getrandom()" interface is prone to that kind of confusion, because people don't think very hard about whether they want to block for sufficient amounts of entropy. The approach here-in is to decide to not just passively wait for entropy to happen, but to start actively collecting it if it is missing. This is not necessarily always possible, but if the architecture has a CPU cycle counter, there is a fair amount of noise in the exact timings of reasonably complex loads. We may end up tweaking the load and the entropy estimates, but this should be at least a reasonable starting point. As part of this, we also revert the revert of the ext4 IO pattern improvement that ended up triggering the reported lack of external entropy. * getrandom() active entropy waiting: Revert "Revert "ext4: make __ext4_get_inode_loc plug"" random: try to actively add entropy rather than passively wait for it
Diffstat (limited to 'drivers/char/random.c')
-rw-r--r--drivers/char/random.c62
1 files changed, 61 insertions, 1 deletions
diff --git a/drivers/char/random.c b/drivers/char/random.c
index d3beed084c0a..c2f7de9dc543 100644
--- a/drivers/char/random.c
+++ b/drivers/char/random.c
@@ -1732,6 +1732,56 @@ void get_random_bytes(void *buf, int nbytes)
1732} 1732}
1733EXPORT_SYMBOL(get_random_bytes); 1733EXPORT_SYMBOL(get_random_bytes);
1734 1734
1735
1736/*
1737 * Each time the timer fires, we expect that we got an unpredictable
1738 * jump in the cycle counter. Even if the timer is running on another
1739 * CPU, the timer activity will be touching the stack of the CPU that is
1740 * generating entropy..
1741 *
1742 * Note that we don't re-arm the timer in the timer itself - we are
1743 * happy to be scheduled away, since that just makes the load more
1744 * complex, but we do not want the timer to keep ticking unless the
1745 * entropy loop is running.
1746 *
1747 * So the re-arming always happens in the entropy loop itself.
1748 */
1749static void entropy_timer(struct timer_list *t)
1750{
1751 credit_entropy_bits(&input_pool, 1);
1752}
1753
1754/*
1755 * If we have an actual cycle counter, see if we can
1756 * generate enough entropy with timing noise
1757 */
1758static void try_to_generate_entropy(void)
1759{
1760 struct {
1761 unsigned long now;
1762 struct timer_list timer;
1763 } stack;
1764
1765 stack.now = random_get_entropy();
1766
1767 /* Slow counter - or none. Don't even bother */
1768 if (stack.now == random_get_entropy())
1769 return;
1770
1771 timer_setup_on_stack(&stack.timer, entropy_timer, 0);
1772 while (!crng_ready()) {
1773 if (!timer_pending(&stack.timer))
1774 mod_timer(&stack.timer, jiffies+1);
1775 mix_pool_bytes(&input_pool, &stack.now, sizeof(stack.now));
1776 schedule();
1777 stack.now = random_get_entropy();
1778 }
1779
1780 del_timer_sync(&stack.timer);
1781 destroy_timer_on_stack(&stack.timer);
1782 mix_pool_bytes(&input_pool, &stack.now, sizeof(stack.now));
1783}
1784
1735/* 1785/*
1736 * Wait for the urandom pool to be seeded and thus guaranteed to supply 1786 * Wait for the urandom pool to be seeded and thus guaranteed to supply
1737 * cryptographically secure random numbers. This applies to: the /dev/urandom 1787 * cryptographically secure random numbers. This applies to: the /dev/urandom
@@ -1746,7 +1796,17 @@ int wait_for_random_bytes(void)
1746{ 1796{
1747 if (likely(crng_ready())) 1797 if (likely(crng_ready()))
1748 return 0; 1798 return 0;
1749 return wait_event_interruptible(crng_init_wait, crng_ready()); 1799
1800 do {
1801 int ret;
1802 ret = wait_event_interruptible_timeout(crng_init_wait, crng_ready(), HZ);
1803 if (ret)
1804 return ret > 0 ? 0 : ret;
1805
1806 try_to_generate_entropy();
1807 } while (!crng_ready());
1808
1809 return 0;
1750} 1810}
1751EXPORT_SYMBOL(wait_for_random_bytes); 1811EXPORT_SYMBOL(wait_for_random_bytes);
1752 1812