tests: Rename 'errorcount' to 'error_count'.
[libgcrypt.git] / tests / t-ed25519.c
index e113913..d63c145 100644 (file)
@@ -32,6 +32,7 @@
 #include "stopwatch.h"
 
 #define PGM "t-ed25519"
+#define N_TESTS 1026
 
 #define my_isascii(c) (!((c) & 0x80))
 #define digitp(p)   (*(p) >= '0' && *(p) <= '9')
@@ -52,6 +53,7 @@ static int debug;
 static int error_count;
 static int sign_with_pk;
 static int no_verify;
+static int custom_data_file;
 
 static void
 die (const char *format, ...)
@@ -83,7 +85,7 @@ fail (const char *format, ...)
   if (*format && format[strlen(format)-1] != '\n')
     putc ('\n', stderr);
   error_count++;
-  if (error_count)
+  if (error_count >= 50)
     die ("stopped after 50 errors.");
 }
 
@@ -104,6 +106,23 @@ show (const char *format, ...)
 
 
 static void
+show_note (const char *format, ...)
+{
+  va_list arg_ptr;
+
+  if (!verbose && getenv ("srcdir"))
+    fputs ("      ", stderr);  /* To align above "PASS: ".  */
+  else
+    fprintf (stderr, "%s: ", PGM);
+  va_start (arg_ptr, format);
+  vfprintf (stderr, format, arg_ptr);
+  if (*format && format[strlen(format)-1] != '\n')
+    putc ('\n', stderr);
+  va_end (arg_ptr);
+}
+
+
+static void
 show_sexp (const char *prefix, gcry_sexp_t a)
 {
   char *buf;
@@ -269,6 +288,7 @@ one_test (int testno, const char *sk, const char *pk,
                            "(private-key"
                            " (ecc"
                            "  (curve \"Ed25519\")"
+                           "  (flags eddsa)"
                            "  (q %b)"
                            "  (d %b)))",
                            (int)buflen2, buffer2,
@@ -278,6 +298,7 @@ one_test (int testno, const char *sk, const char *pk,
                            "(private-key"
                            " (ecc"
                            "  (curve \"Ed25519\")"
+                           "  (flags eddsa)"
                            "  (d %b)))",
                            (int)buflen, buffer);
   if (err)
@@ -291,6 +312,7 @@ one_test (int testno, const char *sk, const char *pk,
                               "(public-key"
                               " (ecc"
                               "  (curve \"Ed25519\")"
+                              "  (flags eddsa)"
                               "  (q %b)))",  (int)buflen2, buffer2)))
     {
       fail ("error building s-exp for test %d, %s: %s",
@@ -326,7 +348,7 @@ one_test (int testno, const char *sk, const char *pk,
   if (s_tmp)
     {
       s_tmp2 = s_tmp;
-      s_tmp = gcry_sexp_find_token (s_tmp2, "ecdsa", 0);
+      s_tmp = gcry_sexp_find_token (s_tmp2, "eddsa", 0);
       if (s_tmp)
         {
           gcry_sexp_release (s_tmp2);
@@ -387,9 +409,8 @@ one_test (int testno, const char *sk, const char *pk,
 
 
 static void
-check_ed25519 (void)
+check_ed25519 (const char *fname)
 {
-  char *fname;
   FILE *fp;
   int lineno, ntests;
   char *line;
@@ -398,7 +419,6 @@ check_ed25519 (void)
 
   show ("Checking Ed25519.\n");
 
-  fname = prepend_srcdir ("t-ed25519.inp");
   fp = fopen (fname, "r");
   if (!fp)
     die ("error opening '%s': %s\n", fname, strerror (errno));
@@ -427,6 +447,8 @@ check_ed25519 (void)
           hexdowncase (sig);
           one_test (testno, sk, pk, msg, sig);
           ntests++;
+          if (!(ntests % 256))
+            show_note ("%d of %d tests done\n", ntests, N_TESTS);
           xfree (pk);  pk = NULL;
           xfree (sk);  sk = NULL;
           xfree (msg); msg = NULL;
@@ -439,11 +461,12 @@ check_ed25519 (void)
   xfree (msg);
   xfree (sig);
 
-  if (ntests != 1024)
-    fail ("did %d tests but expected 1024", ntests);
+  if (ntests != N_TESTS && !custom_data_file)
+    fail ("did %d tests but expected %d", ntests, N_TESTS);
+  else if ((ntests % 256))
+    show_note ("%d tests done\n", ntests);
 
   fclose (fp);
-  xfree (fname);
 }
 
 
@@ -451,6 +474,7 @@ int
 main (int argc, char **argv)
 {
   int last_argc = -1;
+  char *fname = NULL;
 
   if (argc)
     { argc--; argv++; }
@@ -470,7 +494,8 @@ main (int argc, char **argv)
                  "  --verbose       print timings etc.\n"
                  "  --debug         flyswatter\n"
                  "  --sign-with-pk  also use the public key for signing\n"
-                 "  --no-verify     skip the verify test\n",
+                 "  --no-verify     skip the verify test\n"
+                 "  --data FNAME    take test data from file FNAME\n",
                  stdout);
           exit (0);
         }
@@ -495,11 +520,25 @@ main (int argc, char **argv)
           no_verify = 1;
           argc--; argv++;
         }
+      else if (!strcmp (*argv, "--data"))
+        {
+          argc--; argv++;
+          if (argc)
+            {
+              xfree (fname);
+              fname = xstrdup (*argv);
+              argc--; argv++;
+            }
+        }
       else if (!strncmp (*argv, "--", 2))
         die ("unknown option '%s'", *argv);
 
     }
 
+  if (!fname)
+    fname = prepend_srcdir ("t-ed25519.inp");
+  else
+    custom_data_file = 1;
 
   gcry_control (GCRYCTL_DISABLE_SECMEM, 0);
   if (!gcry_check_version (GCRYPT_VERSION))
@@ -509,11 +548,17 @@ main (int argc, char **argv)
   gcry_control (GCRYCTL_ENABLE_QUICK_RANDOM, 0);
   gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);
 
+  /* Ed25519 isn't supported in fips mode */
+  if (gcry_fips_mode_active())
+    return 77;
+
   start_timer ();
-  check_ed25519 ();
+  check_ed25519 (fname);
   stop_timer ();
 
+  xfree (fname);
+
   show ("All tests completed in %s.  Errors: %d\n",
-        elapsed_time (), error_count);
+        elapsed_time (1), error_count);
   return !!error_count;
 }