Poly1305-AEAD: updated implementation to match draft-irtf-cfrg-chacha20-poly1305-03
[libgcrypt.git] / tests / fipsrngdrv.c
index bda0bde..0fc19d5 100644 (file)
@@ -2,17 +2,17 @@
    Copyright (C) 2008 Free Software Foundation, Inc.
 
    This file is part of Libgcrypt.
-  
+
    Libgcrypt is free software; you can redistribute it and/or modify
    it under the terms of the GNU Lesser General Public License as
    published by the Free Software Foundation; either version 2.1 of
    the License, or (at your option) any later version.
-  
+
    Libgcrypt is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    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, see <http://www.gnu.org/licenses/>.
  */
@@ -63,7 +63,7 @@ die (const char *format, ...)
    exactly to LENGTH bytes. The string is delimited by either end of
    string or a white space character.  The function returns -1 on
    error or the length of the parsed string.  */
-int
+static int
 hex2bin (const char *string, void *buffer, size_t length)
 {
   int i;
@@ -89,13 +89,13 @@ hex2bin (const char *string, void *buffer, size_t length)
 
 
 static gcry_error_t
-init_external_test (void **r_context, 
+init_external_test (void **r_context,
                     unsigned int flags,
                     const void *key, size_t keylen,
                     const void *seed, size_t seedlen,
                     const void *dt, size_t dtlen)
 {
-  return gcry_control (58, 
+  return gcry_control (58,
                        r_context, flags,
                        key, keylen,
                        seed, seedlen,
@@ -131,6 +131,7 @@ main (int argc, char **argv)
   int binary = 0;
   int loop = 0;
   int progress = 0;
+  int no_fips = 0;
   unsigned char key[16];
   unsigned char seed[16];
   unsigned char dt[16];
@@ -149,9 +150,21 @@ main (int argc, char **argv)
           argc--; argv++;
           break;
         }
+      else if (!strcmp (*argv, "--help"))
+        {
+          fputs ("usage: " PGM
+                 " [--verbose] [--binary] [--loop] [--progress] KEY V DT\n",
+                 stdout);
+          exit (0);
+        }
       else if (!strcmp (*argv, "--verbose"))
         {
-          verbose = 2;
+          verbose++;
+          argc--; argv++;
+        }
+      else if (!strcmp (*argv, "--no-fips"))
+        {
+          no_fips++;
           argc--; argv++;
         }
       else if (!strcmp (*argv, "--binary"))
@@ -169,8 +182,8 @@ main (int argc, char **argv)
           progress = 1;
           argc--; argv++;
         }
-    }          
-  
+    }
+
   if (!argc)
     {
       memcpy (key,  "1234567890123456", 16);
@@ -185,46 +198,59 @@ main (int argc, char **argv)
         die ("args are not 32 hex digits each\n");
     }
   else
-    die ("invalid usage\n");
+    die ("invalid usage (try --help)\n");
 
 #ifndef HAVE_W32_SYSTEM
   if (loop)
     signal (SIGPIPE, SIG_IGN);
 #endif
 
+  if (verbose)
+    fputs (PGM ": started\n", stderr);
+
   gcry_control (GCRYCTL_SET_VERBOSITY, (int)verbose);
-  gcry_control (GCRYCTL_FORCE_FIPS_MODE, 0);
+  if (!no_fips)
+    gcry_control (GCRYCTL_FORCE_FIPS_MODE, 0);
   if (!gcry_check_version ("1.4.3"))
     die ("version mismatch\n");
   gcry_control (GCRYCTL_DISABLE_SECMEM, 0);
   gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);
 
-  err = init_external_test (&context, 0, key, 16, seed, 16, dt, 16);
+  /* The flag value 1 disables the dup check, so that the RNG returns
+     all generated data.  */
+  err = init_external_test (&context, 1, key, 16, seed, 16, dt, 16);
   if (err)
     die ("init external test failed: %s\n", gpg_strerror (err));
 
-  do 
+  do
     {
+      int writerr = 0;
+
       err = run_external_test (context, buffer, sizeof buffer);
       if (err)
         die ("run external test failed: %s\n", gpg_strerror (err));
       if (binary)
         {
           if (fwrite (buffer, 16, 1, stdout) != 1)
-            {
-#ifndef HAVE_W32_SYSTEM
-              if (loop && errno == EPIPE)
-                break;
-#endif
-              die ("writing output failed: %s\n", strerror (errno));
-            }
-          fflush (stdout);
+            writerr = 1;
+          else
+            fflush (stdout);
         }
       else
         {
           print_buffer (buffer, sizeof buffer);
-          putchar ('\n');
+          if (putchar ('\n') == EOF)
+            writerr = 1;
         }
+      if (writerr)
+        {
+#ifndef HAVE_W32_SYSTEM
+          if (loop && errno == EPIPE)
+            break;
+#endif
+          die ("writing output failed: %s\n", strerror (errno));
+        }
+
       if (progress)
         {
           putc ('.', stderr);
@@ -238,6 +264,8 @@ main (int argc, char **argv)
 
   deinit_external_test (context);
 
+  if (verbose)
+    fputs (PGM ": ready\n", stderr);
+
   return 0;
 }
-