aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/random.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2012-07-04 11:16:01 -0400
committerTheodore Ts'o <tytso@mit.edu>2012-07-14 20:17:44 -0400
commita2080a67abe9e314f9e9c2cc3a4a176e8a8f8793 (patch)
tree47506f87de3ec08934d3333980b29a15cc86e764 /drivers/char/random.c
parent902c098a3663de3fa18639efbb71b6080f0bcd3c (diff)
random: create add_device_randomness() interface
Add a new interface, add_device_randomness() for adding data to the random pool that is likely to differ between two devices (or possibly even per boot). This would be things like MAC addresses or serial numbers, or the read-out of the RTC. This does *not* add any actual entropy to the pool, but it initializes the pool to different values for devices that might otherwise be identical and have very little entropy available to them (particularly common in the embedded world). [ Modified by tytso to mix in a timestamp, since there may be some variability caused by the time needed to detect/configure the hardware in question. ] Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: "Theodore Ts'o" <tytso@mit.edu> Cc: stable@vger.kernel.org
Diffstat (limited to 'drivers/char/random.c')
-rw-r--r--drivers/char/random.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/drivers/char/random.c b/drivers/char/random.c
index 315feb1f59f3..df3358ab5b99 100644
--- a/drivers/char/random.c
+++ b/drivers/char/random.c
@@ -125,11 +125,20 @@
125 * The current exported interfaces for gathering environmental noise 125 * The current exported interfaces for gathering environmental noise
126 * from the devices are: 126 * from the devices are:
127 * 127 *
128 * void add_device_randomness(const void *buf, unsigned int size);
128 * void add_input_randomness(unsigned int type, unsigned int code, 129 * void add_input_randomness(unsigned int type, unsigned int code,
129 * unsigned int value); 130 * unsigned int value);
130 * void add_interrupt_randomness(int irq, int irq_flags); 131 * void add_interrupt_randomness(int irq, int irq_flags);
131 * void add_disk_randomness(struct gendisk *disk); 132 * void add_disk_randomness(struct gendisk *disk);
132 * 133 *
134 * add_device_randomness() is for adding data to the random pool that
135 * is likely to differ between two devices (or possibly even per boot).
136 * This would be things like MAC addresses or serial numbers, or the
137 * read-out of the RTC. This does *not* add any actual entropy to the
138 * pool, but it initializes the pool to different values for devices
139 * that might otherwise be identical and have very little entropy
140 * available to them (particularly common in the embedded world).
141 *
133 * add_input_randomness() uses the input layer interrupt timing, as well as 142 * add_input_randomness() uses the input layer interrupt timing, as well as
134 * the event type information from the hardware. 143 * the event type information from the hardware.
135 * 144 *
@@ -646,6 +655,25 @@ static void set_timer_rand_state(unsigned int irq,
646} 655}
647#endif 656#endif
648 657
658/*
659 * Add device- or boot-specific data to the input and nonblocking
660 * pools to help initialize them to unique values.
661 *
662 * None of this adds any entropy, it is meant to avoid the
663 * problem of the nonblocking pool having similar initial state
664 * across largely identical devices.
665 */
666void add_device_randomness(const void *buf, unsigned int size)
667{
668 unsigned long time = get_cycles() ^ jiffies;
669
670 mix_pool_bytes(&input_pool, buf, size, NULL);
671 mix_pool_bytes(&input_pool, &time, sizeof(time), NULL);
672 mix_pool_bytes(&nonblocking_pool, buf, size, NULL);
673 mix_pool_bytes(&nonblocking_pool, &time, sizeof(time), NULL);
674}
675EXPORT_SYMBOL(add_device_randomness);
676
649static struct timer_rand_state input_timer_state; 677static struct timer_rand_state input_timer_state;
650 678
651/* 679/*