summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/lib/crypto/krb/prng_fortuna.c16
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);