|
@@ -125,11 +125,20 @@
|
|
* The current exported interfaces for gathering environmental noise
|
|
* The current exported interfaces for gathering environmental noise
|
|
* from the devices are:
|
|
* from the devices are:
|
|
*
|
|
*
|
|
|
|
+ * void add_device_randomness(const void *buf, unsigned int size);
|
|
* void add_input_randomness(unsigned int type, unsigned int code,
|
|
* void add_input_randomness(unsigned int type, unsigned int code,
|
|
* unsigned int value);
|
|
* unsigned int value);
|
|
* void add_interrupt_randomness(int irq, int irq_flags);
|
|
* void add_interrupt_randomness(int irq, int irq_flags);
|
|
* void add_disk_randomness(struct gendisk *disk);
|
|
* void add_disk_randomness(struct gendisk *disk);
|
|
*
|
|
*
|
|
|
|
+ * add_device_randomness() is 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).
|
|
|
|
+ *
|
|
* add_input_randomness() uses the input layer interrupt timing, as well as
|
|
* add_input_randomness() uses the input layer interrupt timing, as well as
|
|
* the event type information from the hardware.
|
|
* the event type information from the hardware.
|
|
*
|
|
*
|
|
@@ -646,6 +655,25 @@ static void set_timer_rand_state(unsigned int irq,
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * Add device- or boot-specific data to the input and nonblocking
|
|
|
|
+ * pools to help initialize them to unique values.
|
|
|
|
+ *
|
|
|
|
+ * None of this adds any entropy, it is meant to avoid the
|
|
|
|
+ * problem of the nonblocking pool having similar initial state
|
|
|
|
+ * across largely identical devices.
|
|
|
|
+ */
|
|
|
|
+void add_device_randomness(const void *buf, unsigned int size)
|
|
|
|
+{
|
|
|
|
+ unsigned long time = get_cycles() ^ jiffies;
|
|
|
|
+
|
|
|
|
+ mix_pool_bytes(&input_pool, buf, size, NULL);
|
|
|
|
+ mix_pool_bytes(&input_pool, &time, sizeof(time), NULL);
|
|
|
|
+ mix_pool_bytes(&nonblocking_pool, buf, size, NULL);
|
|
|
|
+ mix_pool_bytes(&nonblocking_pool, &time, sizeof(time), NULL);
|
|
|
|
+}
|
|
|
|
+EXPORT_SYMBOL(add_device_randomness);
|
|
|
|
+
|
|
static struct timer_rand_state input_timer_state;
|
|
static struct timer_rand_state input_timer_state;
|
|
|
|
|
|
/*
|
|
/*
|