Linux Headquarters
[ Register ]
[ About us ] [ Home Page ]

Advertisement
[ Kernel ] [ Documentation ] [ Links ] [ Books ]

Advertisement

Kernel v2.6.31-git14 /drivers/char/random.c

Filename:/drivers/char/random.c
Lines Added:14
Lines Deleted:0
Also changed in: (Previous) 2.6.31-git13  2.6.31-git12  2.6.31-git11  2.6.31-git10  2.6.31-git9  2.6.31-git8 
(Following) 2.6.31-git15  2.6.31-git16  2.6.31-git17  2.6.31-git18  2.6.32-rc2  2.6.32-rc3 

Location
[  2.6.31-git14
  [  drivers
    [  char
       o  random.c

Patch

diff --git a/drivers/char/random.c b/drivers/char/random.c
index 8c74448..d8a9255 100644
--- a/drivers/char/random.c
+++ b/drivers/char/random.c
@@ -240,6 +240,7 @@
 #include <linux/spinlock.h>
 #include <linux/percpu.h>
 #include <linux/cryptohash.h>
+#include <linux/fips.h>
 
 #ifdef CONFIG_GENERIC_HARDIRQS
 # include <linux/irq.h>
@@ -413,6 +414,7 @@ struct entropy_store {
    unsigned add_ptr;
    int entropy_count;
    int input_rotate;
+   __u8 *last_data;
 };
 
 static __u32 input_pool_data[INPUT_POOL_WORDS];
@@ -852,12 +854,21 @@ static ssize_t extract_entropy(struct entropy_store *r, void *buf,
 {
    ssize_t ret = 0, i;
    __u8 tmp[EXTRACT_SIZE];
+   unsigned long flags;
 
    xfer_secondary_pool(r, nbytes);
    nbytes = account(r, nbytes, min, reserved);
 
    while (nbytes) {
       extract_buf(r, tmp);
+
+      if (r->last_data) {
+         spin_lock_irqsave(&r->lock, flags);
+         if (!memcmp(tmp, r->last_data, EXTRACT_SIZE))
+            panic("Hardware RNG duplicated output!\n");
+         memcpy(r->last_data, tmp, EXTRACT_SIZE);
+         spin_unlock_irqrestore(&r->lock, flags);
+      }
       i = min_t(int, nbytes, EXTRACT_SIZE);
       memcpy(buf, tmp, i);
       nbytes -= i;
@@ -940,6 +951,9 @@ static void init_std_data(struct entropy_store *r)
    now = ktime_get_real();
    mix_pool_bytes(r, &now, sizeof(now));
    mix_pool_bytes(r, utsname(), sizeof(*(utsname())));
+   /* Enable continuous test in fips mode */
+   if (fips_enabled)
+      r->last_data = kmalloc(EXTRACT_SIZE, GFP_KERNEL);
 }
 
 static int rand_initialize(void)


Comments: webmaster (at) linuxhq.com.
Advertising: banners (at) linuxhq.com.
Compilation ©1998-2008 Linux Headquarters, Inc.