diff options
-rw-r--r-- | src/lib/crypto/krb/prng_fortuna.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/src/lib/crypto/krb/prng_fortuna.c b/src/lib/crypto/krb/prng_fortuna.c index d54d6529a2..8b96a40c92 100644 --- a/src/lib/crypto/krb/prng_fortuna.c +++ b/src/lib/crypto/krb/prng_fortuna.c @@ -343,7 +343,9 @@ accumulator_output(struct fortuna_state *st, unsigned char *dst, size_t len) static k5_mutex_t fortuna_lock = K5_MUTEX_PARTIAL_INITIALIZER; static struct fortuna_state main_state; -#ifndef _WIN32 +#ifdef _WIN32 +static DWORD last_pid; +#else static pid_t last_pid; #endif static krb5_boolean have_entropy = FALSE; @@ -359,7 +361,9 @@ k5_prng_init(void) return ret; init_state(&main_state); -#ifndef _WIN32 +#ifdef _WIN32 + last_pid = GetCurrentProcessId(); +#else last_pid = getpid(); #endif if (k5_get_os_entropy(osbuf, sizeof(osbuf))) { @@ -411,10 +415,12 @@ krb5_error_code KRB5_CALLCONV krb5_c_random_make_octets(krb5_context context, krb5_data *outdata) { krb5_error_code ret; -#ifndef _WIN32 +#ifdef _WIN32 + DWORD pid = GetCurrentProcessId(); +#else pid_t pid = getpid(); - unsigned char pidbuf[4]; #endif + unsigned char pidbuf[4]; ret = k5_mutex_lock(&fortuna_lock); if (ret) @@ -425,14 +431,12 @@ krb5_c_random_make_octets(krb5_context context, krb5_data *outdata) return KRB5_CRYPTO_INTERNAL; } -#ifndef _WIN32 /* no 'fork' on windows; does not apply */ if (pid != last_pid) { /* We forked; make sure child's PRNG stream differs from parent's. */ store_32_be(pid, pidbuf); generator_reseed(&main_state, pidbuf, 4); last_pid = pid; } -#endif accumulator_output(&main_state, (unsigned char *)outdata->data, outdata->length); |