* http.h: Add HTTP_FLAG_TRY_SRV.
[gnupg.git] / cipher / random.c
index 2c958d9..8b750a7 100644 (file)
@@ -1,5 +1,5 @@
 /* random.c  - random number generator
- *     Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
@@ -56,8 +56,7 @@
 #include "i18n.h"
 #include "random.h"
 #include "rand-internal.h"
-#include "dynload.h"
-
+#include "algorithms.h"
 
 #ifndef RAND_MAX   /* for SunOS */
   #define RAND_MAX 32767
@@ -125,6 +124,69 @@ static struct {
     ulong naddbytes;
 } rndstats;
 
+
+static int (*
+getfnc_gather_random (void))(void (*)(const void*, size_t, int), int,
+                        size_t, int)
+{
+#ifdef USE_ALL_RANDOM_MODULES
+  static int (*fnc)(void (*)(const void*, size_t, int), int, size_t, int);
+  
+  if (fnc)
+    return fnc;
+# ifdef USE_RNDLINUX
+  if ( !access (NAME_OF_DEV_RANDOM, R_OK)
+       && !access (NAME_OF_DEV_RANDOM, R_OK))
+    {
+      fnc = rndlinux_gather_random;
+      return fnc;
+    }
+# endif
+# ifdef USE_RNDEGD
+  if ( rndegd_connect_socket (1) != -1 )
+    {
+      fnc = rndegd_gather_random;
+      return fnc;
+    }
+# endif
+# ifdef USE_RNDUNIX
+  fnc = rndunix_gather_random;
+  return fnc;
+# endif
+
+  log_fatal (_("no entropy gathering module detected\n"));
+
+#else
+# ifdef USE_RNDLINUX
+  return rndlinux_gather_random;
+# endif
+# ifdef USE_RNDUNIX
+  return rndunix_gather_random;
+# endif
+# ifdef USE_RNDEGD
+  return rndegd_gather_random;
+# endif
+# ifdef USE_RNDW32
+  return rndw32_gather_random;
+# endif
+# ifdef USE_RNDRISCOS
+  return rndriscos_gather_random;
+# endif
+#endif
+  return NULL;
+}
+
+static void (*
+getfnc_fast_random_poll (void))( void (*)(const void*, size_t, int), int)
+{
+#ifdef USE_RNDW32
+  return rndw32_gather_random_fast;
+#endif
+  return NULL;
+}
+
+
+
 static void
 initialize(void)
 {
@@ -136,7 +198,6 @@ initialize(void)
     keypool = secure_alloc ? m_alloc_secure_clear(POOLSIZE+BLOCKLEN)
                           : m_alloc_clear(POOLSIZE+BLOCKLEN);
     is_initialized = 1;
-    cipher_modules_constructor();
 }
 
 static void
@@ -144,7 +205,7 @@ burn_stack (int bytes)
 {
     char buf[128];
     
-    memset (buf, 0, sizeof buf);
+    wipememory(buf,sizeof buf);
     bytes -= sizeof buf;
     if (bytes > 0)
         burn_stack (bytes);
@@ -250,9 +311,9 @@ mix_pool(byte *pool)
     RMD160_CONTEXT md;
 
     rmd160_init( &md );
- #if DIGESTLEN != 20
+#if DIGESTLEN != 20
     #error must have a digest length of 20 for ripe-md-160
- #endif
+#endif
     /* loop over the pool */
     pend = pool + POOLSIZE;
     memcpy(hashbuf, pend - DIGESTLEN, DIGESTLEN );
@@ -306,11 +367,11 @@ read_seed_file(void)
     if( !seed_file_name )
        return 0;
 
-  #ifdef HAVE_DOSISH_SYSTEM
+#if defined(HAVE_DOSISH_SYSTEM) || defined(__CYGWIN__)
     fd = open( seed_file_name, O_RDONLY | O_BINARY );
-  #else
+#else
     fd = open( seed_file_name, O_RDONLY );
-  #endif
+#endif
     if( fd == -1 && errno == ENOENT) {
        allow_seed_file_update = 1;
        return 0;
@@ -396,12 +457,12 @@ update_random_seed_file()
     mix_pool(rndpool); rndstats.mixrnd++;
     mix_pool(keypool); rndstats.mixkey++;
 
-  #ifdef HAVE_DOSISH_SYSTEM
+#if defined(HAVE_DOSISH_SYSTEM) || defined(__CYGWIN__)
     fd = open( seed_file_name, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY,
                                                        S_IRUSR|S_IWUSR );
-  #else
+#else
     fd = open( seed_file_name, O_WRONLY|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR );
-  #endif
+#endif
     if( fd == -1 ) {
        log_info(_("can't create `%s': %s\n"), seed_file_name, strerror(errno) );
        return;
@@ -503,7 +564,7 @@ read_pool( byte *buffer, size_t length, int level )
        if( pool_balance < 0 )
            pool_balance = 0;
        /* and clear the keypool */
-       memset( keypool, 0, POOLSIZE );
+       wipememory(keypool, POOLSIZE);
     }
 }
 
@@ -560,7 +621,7 @@ fast_random_poll()
        if( !is_initialized )
            initialize();
        initialized = 1;
-       fnc = dynload_getfnc_fast_random_poll();
+       fnc = getfnc_fast_random_poll();
     }
     if( fnc ) {
        (*fnc)( add_randomness, 1 );
@@ -612,7 +673,7 @@ fast_random_poll()
         getrusage( RUSAGE_SELF, &buf );
         
        add_randomness( &buf, sizeof buf, 1 );
-       memset( &buf, 0, sizeof buf );
+       wipememory( &buf, sizeof buf );
     }
     #endif
   #endif
@@ -637,7 +698,7 @@ read_random_source( int requester, size_t length, int level )
     if( !fnc ) {
        if( !is_initialized )
            initialize();
-       fnc = dynload_getfnc_gather_random();
+       fnc = getfnc_gather_random();
        if( !fnc ) {
            faked_rng = 1;
            fnc = gather_faked;
@@ -685,3 +746,4 @@ gather_faked( void (*add)(const void*, size_t, int), int requester,
     return 0; /* okay */
 }
 
+