]> Pileus Git - ~andy/linux/blobdiff - lib/random32.c
random32: add periodic reseeding
[~andy/linux] / lib / random32.c
index 01e8890d1089419668eb9cfc9d5764fabba89e4b..12215df701e87441bc0b8b09340dac815594463a 100644 (file)
@@ -142,6 +142,7 @@ void prandom_seed(u32 entropy)
        for_each_possible_cpu (i) {
                struct rnd_state *state = &per_cpu(net_rand_state, i);
                state->s1 = __seed(state->s1 ^ entropy, 2);
+               prandom_u32_state(state);
        }
 }
 EXPORT_SYMBOL(prandom_seed);
@@ -174,6 +175,27 @@ static int __init prandom_init(void)
 }
 core_initcall(prandom_init);
 
+static void __prandom_timer(unsigned long dontcare);
+static DEFINE_TIMER(seed_timer, __prandom_timer, 0, 0);
+
+static void __prandom_timer(unsigned long dontcare)
+{
+       u32 entropy;
+
+       get_random_bytes(&entropy, sizeof(entropy));
+       prandom_seed(entropy);
+       /* reseed every ~60 seconds, in [40 .. 80) interval with slack */
+       seed_timer.expires = jiffies + (40 * HZ + (prandom_u32() % (40 * HZ)));
+       add_timer(&seed_timer);
+}
+
+static void prandom_start_seed_timer(void)
+{
+       set_timer_slack(&seed_timer, HZ);
+       seed_timer.expires = jiffies + 40 * HZ;
+       add_timer(&seed_timer);
+}
+
 /*
  *     Generate better values after random number generator
  *     is fully initialized.
@@ -194,6 +216,7 @@ static int __init prandom_reseed(void)
                /* mix it in */
                prandom_u32_state(state);
        }
+       prandom_start_seed_timer();
        return 0;
 }
 late_initcall(prandom_reseed);