Add support for the HW RNG. However i was not able to test it because it
authorWerner Koch <wk@gnupg.org>
Fri, 30 Nov 2007 16:33:09 +0000 (16:33 +0000)
committerWerner Koch <wk@gnupg.org>
Fri, 30 Nov 2007 16:33:09 +0000 (16:33 +0000)
seems to be disabled by the OS.

cipher/ChangeLog
cipher/Makefile.am
cipher/rand-internal.h
cipher/random.c
cipher/rndlinux.c
cipher/rndw32.c
tests/ChangeLog
tests/benchmark.c

index e01dfe6..39ec1ce 100644 (file)
@@ -1,3 +1,11 @@
+2007-11-30  Werner Koch  <wk@g10code.com>
+
+       * rndhw.c: New.
+       * rndlinux.c (_gcry_rndlinux_gather_random): Try to read 50%
+       directly from the hwrng.
+       * random.c (do_fast_random_poll): Also run the hw rng fast poll.
+       (_gcry_random_dump_stats): Tell whether the hw rng failed.
+
 2007-11-29  Werner Koch  <wk@g10code.com>
 
        * rijndael.c (USE_PADLOCK): Define new macro used for ia32.
index 4fb47b3..2e7e027 100644 (file)
@@ -41,6 +41,7 @@ cipher.c pubkey.c ac.c md.c \
 bithelp.h  \
 primegen.c  \
 random.c random.h \
+rndhw.c \
 rand-internal.h \
 rmd.h
 
index aa292ff..7195b79 100644 (file)
@@ -61,6 +61,14 @@ void _gcry_rndw32_gather_random_fast (void (*add)(const void*, size_t,
                                                   enum random_origins),
                                       enum random_origins origin );
 
+int _gcry_rndhw_failed_p (void);
+void _gcry_rndhw_poll_fast (void (*add)(const void*, size_t,
+                                        enum random_origins),
+                            enum random_origins origin);
+size_t _gcry_rndhw_poll_slow (void (*add)(const void*, size_t,
+                                          enum random_origins),
+                              enum random_origins origin);
+
 
 
 #endif /*G10_RAND_INTERNAL_H*/
index 40a4219..3d4cf8b 100644 (file)
@@ -15,8 +15,7 @@
  * GNU Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ * License along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
 
 /*
@@ -398,11 +397,12 @@ _gcry_random_dump_stats ()
      might_ run into problems.  Needs to be checked.  -wk */
 
   log_info ("random usage: poolsize=%d mixed=%lu polls=%lu/%lu added=%lu/%lu\n"
-           "              outmix=%lu getlvl1=%lu/%lu getlvl2=%lu/%lu\n",
+           "              outmix=%lu getlvl1=%lu/%lu getlvl2=%lu/%lu%s\n",
             POOLSIZE, rndstats.mixrnd, rndstats.slowpolls, rndstats.fastpolls,
             rndstats.naddbytes, rndstats.addbytes,
             rndstats.mixkey, rndstats.ngetbytes1, rndstats.getbytes1,
-            rndstats.ngetbytes2, rndstats.getbytes2 );
+            rndstats.ngetbytes2, rndstats.getbytes2,
+            _gcry_rndhw_failed_p()? " (hwrng failed)":"");
 }
 
 
@@ -1251,8 +1251,8 @@ do_fast_random_poll (void)
 # endif /*!RUSAGE_SELF*/
 #endif /*HAVE_GETRUSAGE*/
 
-  /* time and clock are availabe on all systems - so we better do it
-     just in case one of the above functions didn't work */
+  /* Time and clock are availabe on all systems - so we better do it
+     just in case one of the above functions didn't work */
   {
     time_t x = time(NULL);
     add_randomness( &x, sizeof(x), RANDOM_ORIGIN_FASTPOLL );
@@ -1261,6 +1261,10 @@ do_fast_random_poll (void)
     clock_t x = clock();
     add_randomness( &x, sizeof(x), RANDOM_ORIGIN_FASTPOLL );
   }
+
+  /* If the system features a fast hardware RNG, read some bytes from
+     there.  */
+  _gcry_rndhw_poll_fast (add_randomness, RANDOM_ORIGIN_FASTPOLL);
 }
 
 
index 76cf918..574ef6d 100644 (file)
@@ -1,5 +1,5 @@
 /* rndlinux.c  -  raw random number for OSes with /dev/random
- * Copyright (C) 1998, 2001, 2002, 2003  Free Software Foundation, Inc.
+ * Copyright (C) 1998, 2001, 2002, 2003, 2007  Free Software Foundation, Inc.
  *
  * This file is part of Libgcrypt.
  *
@@ -14,8 +14,7 @@
  * GNU Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ * License along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
 
 
@@ -96,8 +95,18 @@ _gcry_rndlinux_gather_random (void (*add)(const void*, size_t,
   int n;
   int warn=0;
   byte buffer[768];
-
-  if( level >= 2 )
+  size_t n_hw;
+
+  /* First read from a hardware source.  However let it account only
+     for up to 50% of the requested bytes.  */
+  n_hw = _gcry_rndhw_poll_slow (add, origin);
+  if (n_hw > length/2)
+    n_hw = length/2;
+  if (length > 1)
+    length -= n_hw;
+
+  /* Open the requested device.  */
+  if (level >= 2)
     {
       if( fd_random == -1 )
         fd_random = open_device ( NAME_OF_DEV_RANDOM );
@@ -110,6 +119,7 @@ _gcry_rndlinux_gather_random (void (*add)(const void*, size_t,
       fd = fd_urandom;
     }
 
+  /* And enter the read loop.  */
   while (length)
     {
       fd_set rfds;
index ddd653c..b04482d 100644 (file)
@@ -958,4 +958,6 @@ _gcry_rndw32_gather_random_fast (void (*add)(const void*, size_t,
           (*add) (&aword, sizeof (aword), origin );
         }
     }
+
+
 }
index 928bb0a..497fa9c 100644 (file)
@@ -1,3 +1,9 @@
+2007-11-30  Werner Koch  <wk@g10code.com>
+
+       * benchmark.c (main): Add optione --verbose and reworked the
+       option parsing.
+       (random_bench): Dump random stats.
+
 2007-10-31  Werner Koch  <wk@g10code.com>
 
        * benchmark.c (start_timer, stop_timer, elapsed_time) [W32]: Fixed.
index 3b2e8f9..4dcd022 100644 (file)
@@ -14,8 +14,7 @@
  * GNU Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ * License along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
 
 #ifdef HAVE_CONFIG_H
@@ -34,6 +33,8 @@
 
 #define PGM "benchmark"
 
+static int verbose;
+
 static const char sample_private_dsa_key_1024[] =
 "(private-key\n"
 "  (dsa\n"
@@ -347,6 +348,8 @@ random_bench (int very_strong)
   printf (" %s", elapsed_time ());
 
   putchar ('\n');
+  if (verbose)
+    gcry_control (GCRYCTL_DUMP_RANDOM_STATS);
 }
 
 
@@ -928,6 +931,8 @@ mpi_bench (void)
 int
 main( int argc, char **argv )
 {
+  int last_argc = -1;
+
   if (argc)
     { argc--; argv++; }
 
@@ -942,6 +947,33 @@ main( int argc, char **argv )
       gcry_control (GCRYCTL_USE_RANDOM_DAEMON, 1);
       argc--; argv++;
     }
+
+  while (argc && last_argc != argc )
+    {
+      last_argc = argc;
+      if (!strcmp (*argv, "--"))
+        {
+          argc--; argv++;
+          break;
+        }
+      else if (!strcmp (*argv, "--help"))
+        {
+          fputs ("usage: benchmark "
+                 "[md|cipher|random|mpi|rsa|dsa|ecc [algonames]]\n",
+                 stdout);
+          exit (0);
+        }
+      else if (!strcmp (*argv, "--verbose"))
+        {
+          verbose = 1;
+          argc--; argv++;
+        }
+      else if (!strcmp (*argv, "--use-random-daemon"))
+        {
+          gcry_control (GCRYCTL_USE_RANDOM_DAEMON, 1);
+          argc--; argv++;
+        }
+    }          
   gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);
 
   
@@ -960,10 +992,6 @@ main( int argc, char **argv )
       putchar ('\n');
       random_bench (0);
     }
-  else if ( !strcmp (*argv, "--help"))
-     fputs ("usage: benchmark "
-            "[md|cipher|random|mpi|rsa|dsa|ecc [algonames]]\n",
-            stdout);
   else if ( !strcmp (*argv, "random") || !strcmp (*argv, "strongrandom"))
     {
       if (argc == 1)