GNUnet  0.11.x
Macros | Functions | Variables
crypto_random.c File Reference

functions to gather random numbers More...

#include "platform.h"
#include "gnunet_crypto_lib.h"
#include "gnunet_time_lib.h"
#include <gcrypt.h>
Include dependency graph for crypto_random.c:

Go to the source code of this file.

Macros

#define LOG(kind, ...)   GNUNET_log_from (kind, "util-crypto-random", __VA_ARGS__)
 
#define LOG_STRERROR(kind, syscall)   GNUNET_log_from_strerror (kind, "util-crypto-random", syscall)
 
#define RANDOM()   glibc_weak_rand32 ()
 
#define SRANDOM(s)   glibc_weak_srand32 (s)
 
#define RAND_MAX   0x7fffffff /* Hopefully this is correct */
 

Functions

void glibc_weak_srand32 (int32_t s)
 
int32_t glibc_weak_rand32 ()
 
static double get_weak_random (void)
 Create a cryptographically weak pseudo-random number in the interval of 0 to 1. More...
 
void GNUNET_CRYPTO_seed_weak_random (int32_t seed)
 Seed a weak random generator. More...
 
void GNUNET_CRYPTO_zero_keys (void *buffer, size_t length)
 Zero out buffer, securely against compiler optimizations. More...
 
void GNUNET_CRYPTO_random_block (enum GNUNET_CRYPTO_Quality mode, void *buffer, size_t length)
 Fill block with a random values. More...
 
uint32_t GNUNET_CRYPTO_random_u32 (enum GNUNET_CRYPTO_Quality mode, uint32_t i)
 Produce a random unsigned 32-bit number modulo i. More...
 
unsigned int * GNUNET_CRYPTO_random_permute (enum GNUNET_CRYPTO_Quality mode, unsigned int n)
 Get an array with a random permutation of the numbers 0...n-1. More...
 
uint64_t GNUNET_CRYPTO_random_u64 (enum GNUNET_CRYPTO_Quality mode, uint64_t max)
 Generate random unsigned 64-bit value. More...
 
void GNUNET_CRYPTO_random_timeflake (enum GNUNET_CRYPTO_Quality mode, struct GNUNET_Uuid *uuid)
 Fill UUID with a timeflake pseudo-random value. More...
 
static void * w_malloc (size_t n)
 Allocation wrapper for libgcrypt, used to avoid bad locking strategy of libgcrypt implementation. More...
 
static int w_check (const void *p)
 Allocation wrapper for libgcrypt, used to avoid bad locking strategy of libgcrypt implementation. More...
 
void __attribute__ ((constructor))
 Initialize libgcrypt. More...
 
void __attribute__ ((destructor))
 Nicely shut down libgcrypt. More...
 

Variables

static int32_t glibc_weak_rand32_state = 1
 

Detailed Description

functions to gather random numbers

Author
Christian Grothoff

Definition in file crypto_random.c.

Macro Definition Documentation

◆ LOG

#define LOG (   kind,
  ... 
)    GNUNET_log_from (kind, "util-crypto-random", __VA_ARGS__)

Definition at line 32 of file crypto_random.c.

◆ LOG_STRERROR

#define LOG_STRERROR (   kind,
  syscall 
)    GNUNET_log_from_strerror (kind, "util-crypto-random", syscall)

Definition at line 34 of file crypto_random.c.

◆ RANDOM

#define RANDOM ( )    glibc_weak_rand32 ()

Definition at line 47 of file crypto_random.c.

◆ SRANDOM

#define SRANDOM (   s)    glibc_weak_srand32 (s)

Definition at line 48 of file crypto_random.c.

◆ RAND_MAX

#define RAND_MAX   0x7fffffff /* Hopefully this is correct */

Definition at line 52 of file crypto_random.c.

Referenced by get_weak_random().

Function Documentation

◆ glibc_weak_srand32()

void glibc_weak_srand32 ( int32_t  s)

Definition at line 59 of file crypto_random.c.

References glibc_weak_rand32_state.

60 {
62 }
static int32_t glibc_weak_rand32_state
Definition: crypto_random.c:55

◆ glibc_weak_rand32()

int32_t glibc_weak_rand32 ( )

Definition at line 66 of file crypto_random.c.

References glibc_weak_rand32_state.

67 {
68  int32_t val = glibc_weak_rand32_state;
69 
70  val = ((glibc_weak_rand32_state * 1103515245) + 12345) & 0x7fffffff;
72  return val;
73 }
static int32_t glibc_weak_rand32_state
Definition: crypto_random.c:55

◆ get_weak_random()

static double get_weak_random ( void  )
static

Create a cryptographically weak pseudo-random number in the interval of 0 to 1.

Returns
number between 0 and 1.

Definition at line 84 of file crypto_random.c.

References RAND_MAX.

Referenced by GNUNET_CRYPTO_random_u32(), and GNUNET_CRYPTO_random_u64().

85 {
86  return((double) random () / RAND_MAX);
87 }
#define RAND_MAX
Definition: crypto_random.c:52
Here is the caller graph for this function:

◆ w_malloc()

static void* w_malloc ( size_t  n)
static

Allocation wrapper for libgcrypt, used to avoid bad locking strategy of libgcrypt implementation.

Definition at line 351 of file crypto_random.c.

Referenced by __attribute__().

352 {
353  return calloc (n, 1);
354 }
Here is the caller graph for this function:

◆ w_check()

static int w_check ( const void *  p)
static

Allocation wrapper for libgcrypt, used to avoid bad locking strategy of libgcrypt implementation.

Definition at line 362 of file crypto_random.c.

Referenced by __attribute__().

363 {
364  (void) p;
365  return 0; /* not secure memory */
366 }
static struct GNUNET_OS_Process * p
Helper process we started.
Definition: gnunet-qr.c:59
Here is the caller graph for this function:

◆ __attribute__() [1/2]

void __attribute__ ( (constructor)  )

Initialize libgcrypt.

Definition at line 372 of file crypto_random.c.

References _, GNUNET_assert, GNUNET_CRYPTO_QUALITY_NONCE, GNUNET_CRYPTO_random_u32(), GNUNET_CRYPTO_seed_weak_random(), w_check(), and w_malloc().

374 {
375  gcry_error_t rc;
376 
377  if (! gcry_check_version (NEED_LIBGCRYPT_VERSION))
378  {
379  fprintf (
380  stderr,
381  _ ("libgcrypt has not the expected version (version %s is required).\n"),
382  NEED_LIBGCRYPT_VERSION);
383  GNUNET_assert (0);
384  }
385  /* set custom allocators */
386  gcry_set_allocation_handler (&w_malloc, &w_malloc, &w_check, &realloc, &free);
387  /* Disable use of secure memory */
388  if ((rc = gcry_control (GCRYCTL_DISABLE_SECMEM, 0)))
389  fprintf (stderr,
390  "Failed to set libgcrypt option %s: %s\n",
391  "DISABLE_SECMEM",
392  gcry_strerror (rc));
393  /* Otherwise gnunet-ecc takes forever to complete, besides
394  we are fine with "just" using GCRY_STRONG_RANDOM */
395  if ((rc = gcry_control (GCRYCTL_ENABLE_QUICK_RANDOM, 0)))
396  fprintf (stderr,
397  "Failed to set libgcrypt option %s: %s\n",
398  "ENABLE_QUICK_RANDOM",
399  gcry_strerror (rc));
400  gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);
401  gcry_fast_random_poll ();
403  time (NULL)
405 }
static void * w_malloc(size_t n)
Allocation wrapper for libgcrypt, used to avoid bad locking strategy of libgcrypt implementation...
static int w_check(const void *p)
Allocation wrapper for libgcrypt, used to avoid bad locking strategy of libgcrypt implementation...
uint32_t GNUNET_CRYPTO_random_u32(enum GNUNET_CRYPTO_Quality mode, uint32_t i)
Produce a random unsigned 32-bit number modulo i.
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
#define _(String)
GNU gettext support macro.
Definition: platform.h:178
Randomness for IVs etc.
void GNUNET_CRYPTO_seed_weak_random(int32_t seed)
Seed a weak random generator.
Definition: crypto_random.c:97
Here is the call graph for this function:

◆ __attribute__() [2/2]

void __attribute__ ( (destructor)  )

Nicely shut down libgcrypt.

Definition at line 411 of file crypto_random.c.

413 {
414  gcry_set_progress_handler (NULL, NULL);
415 #ifdef GCRYCTL_CLOSE_RANDOM_DEVICE
416  (void) gcry_control (GCRYCTL_CLOSE_RANDOM_DEVICE, 0);
417 #endif
418 }

Variable Documentation

◆ glibc_weak_rand32_state

int32_t glibc_weak_rand32_state = 1
static

Definition at line 55 of file crypto_random.c.

Referenced by glibc_weak_rand32(), and glibc_weak_srand32().