tests: Use common code for all tests.
[libgcrypt.git] / tests / rsacvt.c
index 78dad70..0c13819 100644 (file)
@@ -2,17 +2,17 @@
    Copyright (C) 2009 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/>.
  */
@@ -25,7 +25,7 @@ e861b700e17e8afe68[...]f1
 f7a7ca5367c661f8e6[...]61
 10001
 
-# After an empty line another input block may follow. 
+# After an empty line another input block may follow.
 7861b700e17e8afe68[...]f3
 e7a7ca5367c661f8e6[...]71
 3
@@ -52,7 +52,7 @@ e7a7ca5367c661f8e6[...]71
 #include <unistd.h>
 
 #ifdef _GCRYPT_IN_LIBGCRYPT
-# include "../src/gcrypt.h"
+# include "../src/gcrypt-int.h"
 #else
 # include <gcrypt.h>
 # define PACKAGE_BUGREPORT "devnull@example.org"
@@ -61,41 +61,18 @@ e7a7ca5367c661f8e6[...]71
 
 
 #define PGM "rsacvt"
-
-#define my_isascii(c) (!((c) & 0x80))
-#define digitp(p)   (*(p) >= '0' && *(p) <= '9')
-#define hexdigitp(a) (digitp (a)                     \
-                      || (*(a) >= 'A' && *(a) <= 'F')  \
-                      || (*(a) >= 'a' && *(a) <= 'f'))
-#define xtoi_1(p)   (*(p) <= '9'? (*(p)- '0'): \
-                     *(p) <= 'F'? (*(p)-'A'+10):(*(p)-'a'+10))
-#define xtoi_2(p)   ((xtoi_1(p) * 16) + xtoi_1((p)+1))
-#define DIM(v)               (sizeof(v)/sizeof((v)[0]))
-#define DIMof(type,member)   DIM(((type *)0)->member)
+#include "t-common.h"
 
 
-/* Verbose mode flag.  */
-static int verbose;
-
 /* Prefix output with labels.  */
 static int with_labels;
 
 /* Do not suppress leading zeroes.  */
-static int keep_lz; 
-
-
-/* Print a error message and exit the process with an error code.  */
-static void
-die (const char *format, ...)
-{
-  va_list arg_ptr;
+static int keep_lz;
 
-  va_start (arg_ptr, format);
-  fputs (PGM ": ", stderr);
-  vfprintf (stderr, format, arg_ptr);
-  va_end (arg_ptr);
-  exit (1);
-}
+/* Create parameters as specified by OpenPGP (rfc4880).  That is we
+   don't store dmp1 and dmp1 but d and make sure that p is less than  q.  */
+static int openpgp_mode;
 
 
 static char *
@@ -108,7 +85,7 @@ read_textline (FILE *fp)
   /* Read line but skip over initial empty lines.  */
   do
     {
-      do 
+      do
         {
           if (!fgets (line, sizeof line, fp))
             {
@@ -197,7 +174,7 @@ print_mpi_line (const char *label, gcry_mpi_t a)
   p = buf;
   if (!keep_lz && p[0] == '0' && p[1] == '0' && p[2])
     p += 2;
-    
+
   printf ("%s\n", p);
   if (ferror (stdout))
     writerr++;
@@ -226,15 +203,15 @@ compute_missing (gcry_mpi_t rsa_p, gcry_mpi_t rsa_q, gcry_mpi_t rsa_e)
   tmp_f = gcry_mpi_new (0);
   tmp_g = gcry_mpi_new (0);
 
-  /* Check that p < q; if not swap p and q.  */ 
-  if (gcry_mpi_cmp (rsa_p, rsa_q) > 0)
+  /* Check that p < q; if not swap p and q.  */
+  if (openpgp_mode && gcry_mpi_cmp (rsa_p, rsa_q) > 0)
     {
       fprintf (stderr, PGM ": swapping p and q\n");
       gcry_mpi_swap (rsa_p, rsa_q);
     }
 
   gcry_mpi_mul (rsa_n, rsa_p, rsa_q);
-  
+
 
   /* Compute the Euler totient:  phi = (p-1)(q-1)  */
   gcry_mpi_sub_ui (rsa_pm1, rsa_p, 1);
@@ -253,10 +230,14 @@ compute_missing (gcry_mpi_t rsa_p, gcry_mpi_t rsa_q, gcry_mpi_t rsa_e)
 
   /* Compute the CRT helpers: d mod (p-1), d mod (q-1)   */
   gcry_mpi_mod (rsa_pm1, rsa_d, rsa_pm1);
-  gcry_mpi_mod (rsa_qm1, rsa_d, rsa_pm1);
+  gcry_mpi_mod (rsa_qm1, rsa_d, rsa_qm1);
 
-  /* Compute the CRT value: u = p^{-1} mod q  */
-  gcry_mpi_invm (rsa_u, rsa_p, rsa_q);
+  /* Compute the CRT value:   OpenPGP:    u = p^{-1} mod q
+                             Standard: iqmp = q^{-1} mod p */
+  if (openpgp_mode)
+    gcry_mpi_invm (rsa_u, rsa_p, rsa_q);
+  else
+    gcry_mpi_invm (rsa_u, rsa_q, rsa_p);
 
   gcry_mpi_release (phi);
   gcry_mpi_release (tmp_f);
@@ -265,12 +246,18 @@ compute_missing (gcry_mpi_t rsa_p, gcry_mpi_t rsa_q, gcry_mpi_t rsa_e)
   /* Print everything.  */
   print_mpi_line ("n", rsa_n);
   print_mpi_line ("e", rsa_e);
-  print_mpi_line ("d", rsa_d);
+  if (openpgp_mode)
+    print_mpi_line ("d", rsa_d);
   print_mpi_line ("p", rsa_p);
   print_mpi_line ("q", rsa_q);
-  print_mpi_line ("dmp1", rsa_pm1);
-  print_mpi_line ("dmq1", rsa_qm1);
-  print_mpi_line ("u", rsa_u);
+  if (openpgp_mode)
+    print_mpi_line ("u", rsa_u);
+  else
+    {
+      print_mpi_line ("dmp1", rsa_pm1);
+      print_mpi_line ("dmq1", rsa_qm1);
+      print_mpi_line ("iqmp", rsa_u);
+    }
 
   gcry_mpi_release (rsa_n);
   gcry_mpi_release (rsa_d);
@@ -286,7 +273,7 @@ usage (int show_help)
 {
   if (!show_help)
     {
-      fputs ("usage: " PGM 
+      fputs ("usage: " PGM
              " [OPTION] [FILE] (try --help for more information)\n", stderr);
       exit (2);
     }
@@ -294,10 +281,11 @@ usage (int show_help)
     ("Usage: " PGM " [OPTIONS] [FILE]\n"
      "Take RSA parameters p, n, e and compute missing parameters.\n"
      "OPTIONS:\n"
-     "  --version        Print version information\n"
-     "  --verbose        Print additional information\n"
+     "  --openpgp        Compute as specified by RFC4880\n"
      "  --labels         Prefix output with labels\n"
      "  --keep-lz        Keep all leading zeroes in the output\n"
+     "  --verbose        Print additional information\n"
+     "  --version        Print version information\n"
      "  --help           Print this text\n"
      "With no FILE, or if FILE is -, read standard input.\n"
      "Report bugs to " PACKAGE_BUGREPORT ".\n" , stdout);
@@ -350,7 +338,12 @@ main (int argc, char **argv)
           keep_lz = 1;
           argc--; argv++;
         }
-    }          
+      else if (!strcmp (*argv, "--openpgp"))
+        {
+          openpgp_mode = 1;
+          argc--; argv++;
+        }
+    }
 
   if (argc > 1)
     usage (0);
@@ -388,12 +381,12 @@ main (int argc, char **argv)
       if (!rsa_e)
         die ("RSA parameter 'e' missing or not properly hex encoded\n");
       got_eof = skip_to_empty_line (input);
-      
+
       if (any)
         putchar ('\n');
 
       compute_missing (rsa_p, rsa_q, rsa_e);
-      
+
       gcry_mpi_release (rsa_p);
       gcry_mpi_release (rsa_q);
       gcry_mpi_release (rsa_e);
@@ -401,7 +394,6 @@ main (int argc, char **argv)
       any = 1;
     }
   while (!got_eof);
-  
+
   return 0;
 }
-