diff options
author | Werner Koch <wk@gnupg.org> | 2008-09-01 08:18:46 +0000 |
---|---|---|
committer | Werner Koch <wk@gnupg.org> | 2008-09-01 08:18:46 +0000 |
commit | f2f48e70e7b3c8d48272594843474236311a23e2 (patch) | |
tree | 94c54e134237b1a45c72ca3c19744b90e558d2fe /random | |
parent | 936035b491fab2e32f651ed201bc10a6731ebe05 (diff) | |
download | libgcrypt-f2f48e70e7b3c8d48272594843474236311a23e2.tar.gz |
Prepare a release candidatelibgcrypt-1.4.2rc2
Diffstat (limited to 'random')
-rw-r--r-- | random/ChangeLog | 8 | ||||
-rw-r--r-- | random/random-fips.c | 43 |
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); |