hwrng: add randomness to system from rng sources
authorKees Cook <keescook@chromium.org>
Mon, 3 Mar 2014 23:51:48 +0000 (15:51 -0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Mon, 10 Mar 2014 12:17:06 +0000 (20:17 +0800)
When bringing a new RNG source online, it seems like it would make sense
to use some of its bytes to make the system entropy pool more random,
as done with all sorts of other devices that contain per-device or
per-boot differences.

Signed-off-by: Kees Cook <keescook@chromium.org>
Reviewed-by: Jason Cooper <jason@lakedaemon.net>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/char/hw_random/core.c

index cf49f1c88f01f87c96d7ec012057cf2698efcfbf..7ac96fbc06edf4374d5bfc085a60ed5c0c1b9b54 100644 (file)
@@ -41,6 +41,7 @@
 #include <linux/miscdevice.h>
 #include <linux/delay.h>
 #include <linux/slab.h>
+#include <linux/random.h>
 #include <asm/uaccess.h>
 
 
@@ -304,6 +305,8 @@ int hwrng_register(struct hwrng *rng)
 {
        int err = -EINVAL;
        struct hwrng *old_rng, *tmp;
+       unsigned char bytes[16];
+       int bytes_read;
 
        if (rng->name == NULL ||
            (rng->data_read == NULL && rng->read == NULL))
@@ -344,6 +347,10 @@ int hwrng_register(struct hwrng *rng)
        }
        INIT_LIST_HEAD(&rng->list);
        list_add_tail(&rng->list, &rng_list);
+
+       bytes_read = rng_get_data(rng, bytes, sizeof(bytes), 1);
+       if (bytes_read > 0)
+               add_device_randomness(bytes, bytes_read);
 out_unlock:
        mutex_unlock(&rng_mutex);
 out: