From f334c698b9bf85bdb5861b4ed30a7b3ae4597447 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Wed, 9 Jun 2010 11:06:50 +0000 Subject: [PATCH] fixing bias --- src/util/crypto_random.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/util/crypto_random.c b/src/util/crypto_random.c index eea047ac6..676416c63 100644 --- a/src/util/crypto_random.c +++ b/src/util/crypto_random.c @@ -55,6 +55,7 @@ GNUNET_CRYPTO_random_u32 (enum GNUNET_CRYPTO_Quality mode, uint32_t i) static unsigned int invokeCount; #endif uint32_t ret; + uint32_t ul; GNUNET_assert (i > 0); @@ -65,8 +66,13 @@ GNUNET_CRYPTO_random_u32 (enum GNUNET_CRYPTO_Quality mode, uint32_t i) if ((invokeCount++ % 256) == 0) gcry_fast_random_poll (); #endif - gcry_randomize ((unsigned char *) &ret, - sizeof (uint32_t), GCRY_STRONG_RANDOM); + ul = ((uint32_t)-1) - (((uint32_t)-1) % i); + do + { + gcry_randomize ((unsigned char *) &ret, + sizeof (uint32_t), GCRY_STRONG_RANDOM); + } + while (ret >= ul); return ret % i; } else @@ -121,12 +127,18 @@ uint64_t GNUNET_CRYPTO_random_u64 (enum GNUNET_CRYPTO_Quality mode, uint64_t max) { uint64_t ret; + uint64_t ul; GNUNET_assert (max > 0); if (mode == GNUNET_CRYPTO_QUALITY_STRONG) { - gcry_randomize ((unsigned char *) &ret, - sizeof (uint64_t), GCRY_STRONG_RANDOM); + ul = ((uint64_t)-1LL) - (((uint64_t)-1LL) % max); + do + { + gcry_randomize ((unsigned char *) &ret, + sizeof (uint64_t), GCRY_STRONG_RANDOM); + } + while (ret >= ul); return ret % max; } else -- 2.25.1