Fixed a few bugs
[gnupg.git] / cipher / random.c
index 41f001e..ac98f54 100644 (file)
 #include <sys/time.h>
 #include <sys/types.h>
 #include <sys/stat.h>
+#include <string.h>
 #include <unistd.h>
 #include <fcntl.h>
 #include "util.h"
 #include "cipher.h"
+#include "ttyio.h"
+#include "i18n.h"
 
 struct cache {
     int len;
@@ -41,6 +44,22 @@ static struct cache cache[3];
 
 
 static void fill_buffer( byte *buffer, size_t length, int level );
+static int quick_test;
+
+
+int
+quick_random_gen( int onoff )
+{
+    int last = quick_test;
+    if( onoff != -1 )
+       quick_test = onoff;
+  #ifdef HAVE_DEV_RANDOM
+    return last;
+  #else
+    return 1; /* insecure RNG */
+  #endif
+}
+
 
 /****************
  * Fill the buffer with LENGTH bytes of cryptologic strong
@@ -95,14 +114,13 @@ open_device( const char *name, int minor )
 static void
 fill_buffer( byte *buffer, size_t length, int level )
 {
-    FILE *fp;
     static int fd_urandom = -1;
     static int fd_random = -1;
     int fd;
     int n;
     int warn=0;
 
-    if( level == 2 ) {
+    if( level == 2 && !quick_test ) {
        if( fd_random == -1 )
            fd_random = open_device( "/dev/random", 8 );
        fd = fd_random;
@@ -125,9 +143,9 @@ fill_buffer( byte *buffer, size_t length, int level )
        tv.tv_usec = 0;
        if( !(rc=select(fd+1, &rfds, NULL, NULL, &tv)) ) {
            if( !warn )
-               tty_printf(
+               tty_printf( _(
 "\nNot enough random bytes available.  Please do some other work to give
-the OS a chance to collect more entropy! (Need %d more bytes)\n", length );
+the OS a chance to collect more entropy! (Need %d more bytes)\n"), length );
            warn = 1;
            continue;
        }
@@ -155,22 +173,35 @@ the OS a chance to collect more entropy! (Need %d more bytes)\n", length );
 #else /* not HAVE_DEV_RANDOM */
 
 
+#ifndef RAND_MAX   /* for SunOS */
+  #define RAND_MAX 32767
+#endif
+
 static void
 fill_buffer( byte *buffer, size_t length, int level )
 {
     static int initialized=0;
 
     if( !initialized ) {
-       log_info("warning: using insecure random number generator!!\n");
-       tty_printf("The random number generator is only a kludge to let\n"
+       log_info(_("warning: using insecure random number generator!!\n"));
+       tty_printf(_("The random number generator is only a kludge to let\n"
                   "it compile - it is in no way a strong RNG!\n\n"
-                  "DON'T USE ANY DATA GENERATED BY THIS PROGRAM!!\n\n");
+                  "DON'T USE ANY DATA GENERATED BY THIS PROGRAM!!\n\n"));
        initialized=1;
+      #ifdef HAVE_RAND
        srand(make_timestamp()*getpid());
+      #else
+       srandom(make_timestamp()*getpid());
+      #endif
     }
 
+  #ifdef HAVE_RAND
     while( length-- )
        *buffer++ = ((unsigned)(1 + (int) (256.0*rand()/(RAND_MAX+1.0)))-1);
+  #else
+    while( length-- )
+       *buffer++ = ((unsigned)(1 + (int) (256.0*random()/(RAND_MAX+1.0)))-1);
+  #endif
 }
 
 #endif