static unsigned int invokeCount;
#endif
uint32_t ret;
+ uint32_t ul;
GNUNET_assert (i > 0);
if ((invokeCount++ % 256) == 0)
gcry_fast_random_poll ();
#endif
- gcry_randomize ((unsigned char *) &ret,
- sizeof (uint32_t), GCRY_STRONG_RANDOM);
+ ul = UINT32_MAX - (UINT32_MAX % i);
+ do
+ {
+ gcry_randomize ((unsigned char *) &ret,
+ sizeof (uint32_t), GCRY_STRONG_RANDOM);
+ }
+ while (ret >= ul);
return ret % i;
}
else
ret = GNUNET_malloc (n * sizeof (unsigned int));
for (i = 0; i < n; i++)
ret[i] = i;
- for (i = 0; i < n; i++)
+ for (i = n - 1; i > 0; i--)
{
- x = GNUNET_CRYPTO_random_u32 (mode, n);
+ x = GNUNET_CRYPTO_random_u32 (mode, i+1);
tmp = ret[x];
ret[x] = ret[i];
ret[i] = tmp;
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_MAX - (UINT64_MAX % max);
+ do
+ {
+ gcry_randomize ((unsigned char *) &ret,
+ sizeof (uint64_t), GCRY_STRONG_RANDOM);
+ }
+ while (ret >= ul);
return ret % max;
}
else