summaryrefslogtreecommitdiff
path: root/random
diff options
context:
space:
mode:
authorWerner Koch <wk@gnupg.org>2008-09-01 08:18:46 +0000
committerWerner Koch <wk@gnupg.org>2008-09-01 08:18:46 +0000
commitf2f48e70e7b3c8d48272594843474236311a23e2 (patch)
tree94c54e134237b1a45c72ca3c19744b90e558d2fe /random
parent936035b491fab2e32f651ed201bc10a6731ebe05 (diff)
downloadlibgcrypt-f2f48e70e7b3c8d48272594843474236311a23e2.tar.gz
Prepare a release candidate
Diffstat (limited to 'random')
-rw-r--r--random/ChangeLog8
-rw-r--r--random/random-fips.c43
2 files changed, 36 insertions, 15 deletions
diff --git a/random/ChangeLog b/random/ChangeLog
index df3cac7a..bb308688 100644
--- a/random/ChangeLog
+++ b/random/ChangeLog
@@ -1,3 +1,11 @@
+2008-09-01 Werner Koch <wk@g10code.com>
+
+ * random-fips.c (x931_get_dt) [W32]: Do not use getppid.
+ (get_entropy): Prepare for use under Windows.
+ (_gcry_rngfips_selftest): Ditto.
+ (entropy_collect_cb): Make sure that the gatherer never overflows
+ the buffers.
+
2008-08-29 Werner Koch <wk@g10code.com>
* random-fips.c (SEED_TTL): New.
diff --git a/random/random-fips.c b/random/random-fips.c
index 68f0ec40..effce500 100644
--- a/random/random-fips.c
+++ b/random/random-fips.c
@@ -304,7 +304,9 @@ x931_get_dt (unsigned char *buffer, size_t length, rng_context_t rng_ctx)
to an not so easy predictable value to avoid always
starting at 0. Not really needed but it doesn't harm. */
counter1 = (u32)getpid ();
+#ifndef HAVE_W32_SYSTEM
counter0 = (u32)getppid ();
+#endif
}
@@ -513,10 +515,11 @@ entropy_collect_cb (const void *buffer, size_t length,
gcry_assert (fips_rng_is_locked);
gcry_assert (entropy_collect_buffer);
-
- while (length--)
+
+ /* Note that we need to protect against gatherers returning more
+ than the requested bytes (e.g. rndw32). */
+ while (length-- && entropy_collect_buffer_len < entropy_collect_buffer_size)
{
- gcry_assert (entropy_collect_buffer_len < entropy_collect_buffer_size);
entropy_collect_buffer[entropy_collect_buffer_len++] ^= *p++;
}
}
@@ -528,17 +531,31 @@ entropy_collect_cb (const void *buffer, size_t length,
static void *
get_entropy (size_t nbytes)
{
-#if USE_RNDLINUX
void *result;
+ int rc;
gcry_assert (!entropy_collect_buffer);
entropy_collect_buffer = gcry_xmalloc_secure (nbytes);
entropy_collect_buffer_size = nbytes;
entropy_collect_buffer_len = 0;
- if (_gcry_rndlinux_gather_random (entropy_collect_cb, 0,
- X931_AES_KEYLEN,
- GCRY_VERY_STRONG_RANDOM) < 0
- || entropy_collect_buffer_len != entropy_collect_buffer_size)
+
+#if USE_RNDLINUX
+ rc = _gcry_rndlinux_gather_random (entropy_collect_cb, 0,
+ X931_AES_KEYLEN,
+ GCRY_VERY_STRONG_RANDOM);
+#elif USE_RNDW32
+ do
+ {
+ rc = _gcry_rndw32_gather_random (entropy_collect_cb, 0,
+ X931_AES_KEYLEN,
+ GCRY_VERY_STRONG_RANDOM);
+ }
+ while (rc >= 0 && entropy_collect_buffer_len < entropy_collect_buffer_size);
+#else
+ rc = -1;
+#endif
+
+ if (rc < 0 || entropy_collect_buffer_len != entropy_collect_buffer_size)
{
gcry_free (entropy_collect_buffer);
entropy_collect_buffer = NULL;
@@ -547,10 +564,6 @@ get_entropy (size_t nbytes)
result = entropy_collect_buffer;
entropy_collect_buffer = NULL;
return result;
-#else
- log_fatal ("/dev/random support is not compiled in\n");
- return NULL; /* NOTREACHED */
-#endif
}
@@ -953,7 +966,7 @@ _gcry_rngfips_selftest (selftest_report_func_t report)
{
gcry_err_code_t ec;
-#if USE_RNDLINUX
+#if defined(USE_RNDLINUX) || defined(USE_RNDW32)
{
char buffer[8];
@@ -966,8 +979,8 @@ _gcry_rngfips_selftest (selftest_report_func_t report)
ec = selftest_kat (report);
-#else /*!USE_RNDLINUX*/
- report ("random", 0, "setup", "no support for /dev/random");
+#else /*!(USE_RNDLINUX||USE_RNDW32)*/
+ report ("random", 0, "setup", "no entropy gathering module");
ec = GPG_ERR_SELFTEST_FAILED;
#endif
return gpg_error (ec);