* random.c: Fix prototype of the fast random gatherer. Noted by Joe
[gnupg.git] / cipher / pubkey.c
index 3a54cb8..d6d1ff1 100644 (file)
@@ -1,5 +1,6 @@
 /* pubkey.c  - pubkey dispatcher
- * Copyright (C) 1998, 1999, 2000, 2001, 2003 Free Software Foundation, Inc.
+ * Copyright (C) 1998, 1999, 2000, 2001, 2003,
+ *               2004 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
@@ -15,7 +16,8 @@
  *
  * You should have received a copy of the GNU 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
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
  */
 
 #include <config.h>
@@ -47,8 +49,7 @@ struct pubkey_table_s {
     int (*encrypt)( int algo, MPI *resarr, MPI data, MPI *pkey );
     int (*decrypt)( int algo, MPI *result, MPI *data, MPI *skey );
     int (*sign)( int algo, MPI *resarr, MPI data, MPI *skey );
-    int (*verify)( int algo, MPI hash, MPI *data, MPI *pkey,
-                  int (*cmp)(void *, MPI), void *opaquev );
+    int (*verify)( int algo, MPI hash, MPI *data, MPI *pkey );
     unsigned (*get_nbits)( int algo, MPI *pkey );
 };
 
@@ -79,8 +80,7 @@ dummy_sign( int algo, MPI *resarr, MPI data, MPI *skey )
 { log_bug("no sign() for %d\n", algo ); return G10ERR_PUBKEY_ALGO; }
 
 static int
-dummy_verify( int algo, MPI hash, MPI *data, MPI *pkey,
-               int (*cmp)(void *, MPI), void *opaquev )
+dummy_verify( int algo, MPI hash, MPI *data, MPI *pkey )
 { log_bug("no verify() for %d\n", algo ); return G10ERR_PUBKEY_ALGO; }
 
 #if 0
@@ -97,26 +97,8 @@ dummy_get_nbits( int algo, MPI *pkey )
 static void
 setup_pubkey_table(void)
 {
-    int i;
+    int i=0;
 
-    i = 0;
-    pubkey_table[i].algo = PUBKEY_ALGO_ELGAMAL;
-    pubkey_table[i].name = elg_get_info( pubkey_table[i].algo,
-                                        &pubkey_table[i].npkey,
-                                        &pubkey_table[i].nskey,
-                                        &pubkey_table[i].nenc,
-                                        &pubkey_table[i].nsig,
-                                        &pubkey_table[i].use );
-    pubkey_table[i].generate        = elg_generate;
-    pubkey_table[i].check_secret_key = elg_check_secret_key;
-    pubkey_table[i].encrypt         = elg_encrypt;
-    pubkey_table[i].decrypt         = elg_decrypt;
-    pubkey_table[i].sign            = elg_sign;
-    pubkey_table[i].verify          = elg_verify;
-    pubkey_table[i].get_nbits       = elg_get_nbits;
-    if( !pubkey_table[i].name )
-       BUG();
-    i++;
     pubkey_table[i].algo = PUBKEY_ALGO_ELGAMAL_E;
     pubkey_table[i].name = elg_get_info( pubkey_table[i].algo,
                                         &pubkey_table[i].npkey,
@@ -128,8 +110,8 @@ setup_pubkey_table(void)
     pubkey_table[i].check_secret_key = elg_check_secret_key;
     pubkey_table[i].encrypt         = elg_encrypt;
     pubkey_table[i].decrypt         = elg_decrypt;
-    pubkey_table[i].sign            = elg_sign;
-    pubkey_table[i].verify          = elg_verify;
+    pubkey_table[i].sign            = dummy_sign;
+    pubkey_table[i].verify          = dummy_verify;
     pubkey_table[i].get_nbits       = elg_get_nbits;
     if( !pubkey_table[i].name )
        BUG();
@@ -327,8 +309,15 @@ pubkey_get_npkey( int algo )
            if( pubkey_table[i].algo == algo )
                return pubkey_table[i].npkey;
     } while( load_pubkey_modules() );
+
+#ifndef USE_RSA
     if( is_RSA(algo) )   /* special hack, so that we are able to */
        return 2;         /* see the RSA keyids */
+#endif /* USE_RSA */
+
+    if(algo==PUBKEY_ALGO_ELGAMAL)
+      return 3;
+
     return 0;
 }
 
@@ -344,8 +333,15 @@ pubkey_get_nskey( int algo )
            if( pubkey_table[i].algo == algo )
                return pubkey_table[i].nskey;
     } while( load_pubkey_modules() );
+
+#ifndef USE_RSA
     if( is_RSA(algo) )   /* special hack, so that we are able to */
        return 6;         /* see the RSA keyids */
+#endif /* USE_RSA */
+
+    if(algo==PUBKEY_ALGO_ELGAMAL)
+      return 4;
+
     return 0;
 }
 
@@ -361,8 +357,15 @@ pubkey_get_nsig( int algo )
            if( pubkey_table[i].algo == algo )
                return pubkey_table[i].nsig;
     } while( load_pubkey_modules() );
+
+#ifndef USE_RSA
     if( is_RSA(algo) )   /* special hack, so that we are able to */
        return 1;         /* see the RSA keyids */
+#endif /* USE_RSA */
+
+    if(algo==PUBKEY_ALGO_ELGAMAL)
+      return 2;
+
     return 0;
 }
 
@@ -378,8 +381,15 @@ pubkey_get_nenc( int algo )
            if( pubkey_table[i].algo == algo )
                return pubkey_table[i].nenc;
     } while( load_pubkey_modules() );
+
+#ifndef USE_RSA
     if( is_RSA(algo) )   /* special hack, so that we are able to */
        return 1;         /* see the RSA keyids */
+#endif /* USE_RSA */
+
+    if(algo==PUBKEY_ALGO_ELGAMAL)
+      return 2;
+
     return 0;
 }
 
@@ -396,8 +406,15 @@ pubkey_nbits( int algo, MPI *pkey )
            if( pubkey_table[i].algo == algo )
                return (*pubkey_table[i].get_nbits)( algo, pkey );
     } while( load_pubkey_modules() );
+
+#ifndef USE_RSA
     if( is_RSA(algo) ) /* we always wanna see the length of a key :-) */
        return mpi_get_nbits( pkey[0] );
+#endif /* USE_RSA */
+
+    if(algo==PUBKEY_ALGO_ELGAMAL)
+      return mpi_get_nbits(pkey[0]);
+
     return 0;
 }
 
@@ -522,9 +539,6 @@ pubkey_sign( int algo, MPI *resarr, MPI data, MPI *skey )
        log_mpidump("  data:", data );
     }
 
-    if (is_ELGAMAL (algo))
-      return G10ERR_UNU_SECKEY;
-
     do {
        for(i=0; pubkey_table[i].name; i++ )
            if( pubkey_table[i].algo == algo ) {
@@ -546,16 +560,14 @@ pubkey_sign( int algo, MPI *resarr, MPI data, MPI *skey )
  * Return 0 if the signature is good
  */
 int
-pubkey_verify( int algo, MPI hash, MPI *data, MPI *pkey,
-                   int (*cmp)(void *, MPI), void *opaquev )
+pubkey_verify( int algo, MPI hash, MPI *data, MPI *pkey )
 {
     int i, rc;
 
     do {
        for(i=0; pubkey_table[i].name; i++ )
            if( pubkey_table[i].algo == algo ) {
-               rc = (*pubkey_table[i].verify)( algo, hash, data, pkey,
-                                                           cmp, opaquev );
+               rc = (*pubkey_table[i].verify)( algo, hash, data, pkey );
                goto ready;
            }
     } while( load_pubkey_modules() );