If we forked, force a reseed again. Add the pid as part of the reseed().

git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@23171 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Love Hörnquist Åstrand
2008-05-22 02:52:44 +00:00
parent dc8e94beda
commit de2bd2f00b

View File

@@ -118,6 +118,7 @@ struct fortuna_state
unsigned pool0_bytes; unsigned pool0_bytes;
unsigned rnd_pos; unsigned rnd_pos;
int tricks_done; int tricks_done;
pid_t pid;
}; };
typedef struct fortuna_state FState; typedef struct fortuna_state FState;
@@ -175,6 +176,7 @@ init_state(FState * st)
memset(st, 0, sizeof(*st)); memset(st, 0, sizeof(*st));
for (i = 0; i < NUM_POOLS; i++) for (i = 0; i < NUM_POOLS; i++)
md_init(&st->pool[i]); md_init(&st->pool[i]);
st->pid = getpid();
} }
/* /*
@@ -276,6 +278,9 @@ reseed(FState * st)
/* add old key into mix too */ /* add old key into mix too */
md_update(&key_md, st->key, BLOCK); md_update(&key_md, st->key, BLOCK);
/* add pid to make output diverse after fork() */
md_update(&key_md, &st->pid, sizeof(st->pid));
/* now we have new key */ /* now we have new key */
md_result(&key_md, st->key); md_result(&key_md, st->key);
@@ -384,6 +389,7 @@ extract_data(FState * st, unsigned count, unsigned char *dst)
{ {
unsigned n; unsigned n;
unsigned block_nr = 0; unsigned block_nr = 0;
pid_t pid = getpid();
/* Should we reseed? */ /* Should we reseed? */
if (st->pool0_bytes >= POOL0_FILL || st->reseed_count == 0) if (st->pool0_bytes >= POOL0_FILL || st->reseed_count == 0)
@@ -394,6 +400,12 @@ extract_data(FState * st, unsigned count, unsigned char *dst)
if (!st->tricks_done) if (!st->tricks_done)
startup_tricks(st); startup_tricks(st);
/* If we forked, force a reseed again */
if (pid != st->pid) {
st->pid = pid;
reseed();
}
while (count > 0) while (count > 0)
{ {
/* produce bytes */ /* produce bytes */