* exec.c (expand_args): Remove loop left over from earlier implementation.
[gnupg.git] / cipher / dsa.c
index 9154f49..d728a1b 100644 (file)
@@ -1,5 +1,5 @@
-/* dsa.c  -  DSA signature scheme
- *     Copyright (C) 1998 Free Software Foundation, Inc.
+/* dsa.c  -  DSA signature algorithm
+ *     Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
@@ -52,13 +52,29 @@ static void generate( DSA_secret_key *sk, unsigned nbits, MPI **ret_factors );
 static void sign(MPI r, MPI s, MPI input, DSA_secret_key *skey);
 static int  verify(MPI r, MPI s, MPI input, DSA_public_key *pkey);
 
+
+static void (*progress_cb) ( void *, int );
+static void *progress_cb_data;
+
+void
+register_pk_dsa_progress ( void (*cb)( void *, int), void *cb_data )
+{
+    progress_cb = cb;
+    progress_cb_data = cb_data;
+}
+
+
 static void
 progress( int c )
 {
-    fputc( c, stderr );
+    if ( progress_cb )
+       progress_cb ( progress_cb_data, c );
+    else
+       fputc( c, stderr );
 }
 
 
+
 /****************
  * Generate a random secret exponent k less than q
  */
@@ -257,6 +273,9 @@ check_secret_key( DSA_secret_key *sk )
 
 /****************
  * Make a DSA signature from HASH and put it into r and s.
+ *
+ * Without generating the k this function runs in 
+ * about 26ms on a 300 Mhz Mobile Pentium
  */
 
 static void
@@ -291,6 +310,9 @@ sign(MPI r, MPI s, MPI hash, DSA_secret_key *skey )
 
 /****************
  * Returns true if the signature composed from R and S is valid.
+ *
+ * Without the checks this function runs in 
+ * about 31ms on a 300 Mhz Mobile Pentium
  */
 static int
 verify(MPI r, MPI s, MPI hash, DSA_public_key *pkey )
@@ -300,6 +322,7 @@ verify(MPI r, MPI s, MPI hash, DSA_public_key *pkey )
     MPI base[3];
     MPI exp[3];
 
+
     if( !(mpi_cmp_ui( r, 0 ) > 0 && mpi_cmp( r, pkey->q ) < 0) )
        return 0; /* assertion  0 < r < q  failed */
     if( !(mpi_cmp_ui( s, 0 ) > 0 && mpi_cmp( s, pkey->q ) < 0) )
@@ -365,6 +388,8 @@ dsa_check_secret_key( int algo, MPI *skey )
 
     if( algo != PUBKEY_ALGO_DSA )
        return G10ERR_PUBKEY_ALGO;
+    if( !skey[0] || !skey[1] || !skey[2] || !skey[3] || !skey[4] )
+       return G10ERR_BAD_MPI;
 
     sk.p = skey[0];
     sk.q = skey[1];
@@ -386,6 +411,8 @@ dsa_sign( int algo, MPI *resarr, MPI data, MPI *skey )
 
     if( algo != PUBKEY_ALGO_DSA )
        return G10ERR_PUBKEY_ALGO;
+    if( !data || !skey[0] || !skey[1] || !skey[2] || !skey[3] || !skey[4] )
+       return G10ERR_BAD_MPI;
 
     sk.p = skey[0];
     sk.q = skey[1];
@@ -406,6 +433,9 @@ dsa_verify( int algo, MPI hash, MPI *data, MPI *pkey,
 
     if( algo != PUBKEY_ALGO_DSA )
        return G10ERR_PUBKEY_ALGO;
+    if( !data[0] || !data[1] || !hash
+       || !pkey[0] || !pkey[1] || !pkey[2] || !pkey[3] )
+       return G10ERR_BAD_MPI;
 
     pk.p = pkey[0];
     pk.q = pkey[1];