some more internall structure changes
[gnupg.git] / cipher / pubkey.c
index 3357ae1..f59996c 100644 (file)
 #include "errors.h"
 #include "mpi.h"
 #include "cipher.h"
+#include "elgamal.h"
+#include "dsa.h"
 #include "dynload.h"
 
 
-#define TABLE_SIZE 20
+#define TABLE_SIZE 10
 
 struct pubkey_table_s {
     const char *name;
@@ -46,7 +48,8 @@ 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 (*verify)( int algo, MPI hash, MPI *data, MPI *pkey,
+                  int (*cmp)(void *, MPI), void *opaquev );
     unsigned (*get_nbits)( int algo, MPI *pkey );
 };
 
@@ -75,7 +78,8 @@ 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 )
+dummy_verify( int algo, MPI hash, MPI *data, MPI *pkey,
+               int (*cmp)(void *, MPI), void *opaquev )
 { log_bug("no verify() for %d\n", algo ); return G10ERR_PUBKEY_ALGO; }
 
 static unsigned
@@ -89,13 +93,8 @@ dummy_get_nbits( int algo, MPI *pkey )
 static void
 setup_pubkey_table()
 {
-
-    static int initialized = 0;
     int i;
 
-    if( initialized )
-       return;
-
     i = 0;
     pubkey_table[i].algo = PUBKEY_ALGO_ELGAMAL;
     pubkey_table[i].name = elg_get_info( pubkey_table[i].algo,
@@ -151,7 +150,6 @@ setup_pubkey_table()
 
     for( ; i < TABLE_SIZE; i++ )
        pubkey_table[i].name = NULL;
-    initialized = 1;
 }
 
 
@@ -161,6 +159,7 @@ setup_pubkey_table()
 static int
 load_pubkey_modules()
 {
+    static int initialized = 0;
     static int done = 0;
     void *context = NULL;
     struct pubkey_table_s *ct;
@@ -169,6 +168,12 @@ load_pubkey_modules()
     const char *name;
     int any = 0;
 
+
+    if( !initialized ) {
+       setup_pubkey_table();
+       initialized = 1;
+       return 1;
+    }
     if( done )
        return 0;
     done = 1;
@@ -233,7 +238,6 @@ string_to_pubkey_algo( const char *string )
     int i;
     const char *s;
 
-    setup_pubkey_table();
     do {
        for(i=0; (s=pubkey_table[i].name); i++ )
            if( !stricmp( s, string ) )
@@ -251,7 +255,6 @@ pubkey_algo_to_string( int algo )
 {
     int i;
 
-    setup_pubkey_table();
     do {
        for(i=0; pubkey_table[i].name; i++ )
            if( pubkey_table[i].algo == algo )
@@ -276,7 +279,6 @@ check_pubkey_algo2( int algo, unsigned usage )
 {
     int i;
 
-    setup_pubkey_table();
     do {
        for(i=0; pubkey_table[i].name; i++ )
            if( pubkey_table[i].algo == algo ) {
@@ -300,7 +302,6 @@ int
 pubkey_get_npkey( int algo )
 {
     int i;
-    setup_pubkey_table();
     do {
        for(i=0; pubkey_table[i].name; i++ )
            if( pubkey_table[i].algo == algo )
@@ -316,7 +317,6 @@ int
 pubkey_get_nskey( int algo )
 {
     int i;
-    setup_pubkey_table();
     do {
        for(i=0; pubkey_table[i].name; i++ )
            if( pubkey_table[i].algo == algo )
@@ -332,7 +332,6 @@ int
 pubkey_get_nsig( int algo )
 {
     int i;
-    setup_pubkey_table();
     do {
        for(i=0; pubkey_table[i].name; i++ )
            if( pubkey_table[i].algo == algo )
@@ -348,7 +347,6 @@ int
 pubkey_get_nenc( int algo )
 {
     int i;
-    setup_pubkey_table();
     do {
        for(i=0; pubkey_table[i].name; i++ )
            if( pubkey_table[i].algo == algo )
@@ -365,7 +363,6 @@ pubkey_nbits( int algo, MPI *pkey )
 {
     int i;
 
-    setup_pubkey_table();
     do {
        for(i=0; pubkey_table[i].name; i++ )
            if( pubkey_table[i].algo == algo )
@@ -380,7 +377,6 @@ pubkey_generate( int algo, unsigned nbits, MPI *skey, MPI **retfactors )
 {
     int i;
 
-    setup_pubkey_table();
     do {
        for(i=0; pubkey_table[i].name; i++ )
            if( pubkey_table[i].algo == algo )
@@ -396,7 +392,6 @@ pubkey_check_secret_key( int algo, MPI *skey )
 {
     int i;
 
-    setup_pubkey_table();
     do {
        for(i=0; pubkey_table[i].name; i++ )
            if( pubkey_table[i].algo == algo )
@@ -419,7 +414,6 @@ pubkey_encrypt( int algo, MPI *resarr, MPI data, MPI *pkey )
 
     /* FIXME: check that data fits into the key (in xxx_encrypt)*/
 
-    setup_pubkey_table();
     if( DBG_CIPHER ) {
        log_debug("pubkey_encrypt: algo=%d\n", algo );
        for(i=0; i < pubkey_get_npkey(algo); i++ )
@@ -457,7 +451,6 @@ pubkey_decrypt( int algo, MPI *result, MPI *data, MPI *skey )
 {
     int i, rc;
 
-    setup_pubkey_table();
     *result = NULL; /* so the caller can always do an mpi_free */
     if( DBG_CIPHER ) {
        log_debug("pubkey_decrypt: algo=%d\n", algo );
@@ -494,7 +487,6 @@ pubkey_sign( int algo, MPI *resarr, MPI data, MPI *skey )
 {
     int i, rc;
 
-    setup_pubkey_table();
     if( DBG_CIPHER ) {
        log_debug("pubkey_sign: algo=%d\n", algo );
        for(i=0; i < pubkey_get_nskey(algo); i++ )
@@ -523,15 +515,16 @@ 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 )
+pubkey_verify( int algo, MPI hash, MPI *data, MPI *pkey,
+                   int (*cmp)(void *, MPI), void *opaquev )
 {
     int i, rc;
 
-    setup_pubkey_table();
     do {
        for(i=0; pubkey_table[i].name; i++ )
            if( pubkey_table[i].algo == algo ) {
-               rc = (*pubkey_table[i].verify)( algo, hash, data, pkey );
+               rc = (*pubkey_table[i].verify)( algo, hash, data, pkey,
+                                                           cmp, opaquev );
                goto ready;
            }
     } while( load_pubkey_modules() );