Fixed a few bugs
authorWerner Koch <wk@gnupg.org>
Tue, 3 Feb 1998 12:09:19 +0000 (12:09 +0000)
committerWerner Koch <wk@gnupg.org>
Tue, 3 Feb 1998 12:09:19 +0000 (12:09 +0000)
13 files changed:
acinclude.m4
cipher/Makefile.in
cipher/elgamal.c
cipher/md.c
cipher/primegen.c
cipher/random.c
configure.in
mpi/Makefile.am
mpi/Makefile.in
mpi/mpi-bit.c
mpi/mpi-scan.c
mpi/mpicoder.c
mpi/mpiutil.c

index 0c30b7d..5b9d355 100644 (file)
@@ -311,7 +311,7 @@ define(WK_CHECK_ENDIAN,
        #include <sys/param.h>], [
        #if BYTE_ORDER != BIG_ENDIAN
         not big endian
-       #endif], wk_cv_c_endian=big, wk_cv_c_endian=big)])
+       #endif], wk_cv_c_endian=big, wk_cv_c_endian=little)])
        if test "$wk_cv_c_endian" = unknown; then
            AC_TRY_RUN([main () {
              /* Are we little or big endian?  From Harbison&Steele.  */
index a1cfa5a..9e4860f 100644 (file)
@@ -72,6 +72,7 @@ G10_LOCALEDIR = @G10_LOCALEDIR@
 GENCAT = @GENCAT@
 GMOFILES = @GMOFILES@
 GMSGFMT = @GMSGFMT@
+HAVE_ZLIB_H = @HAVE_ZLIB_H@
 INSTOBJEXT = @INSTOBJEXT@
 INTLDEPS = @INTLDEPS@
 INTLLIBS = @INTLLIBS@
index 1f1699f..9e6805d 100644 (file)
@@ -142,6 +142,9 @@ elg_generate( ELG_public_key *pk, ELG_secret_key *sk, unsigned nbits )
 
     /* select a random number which has these properties:
      *  0 < x < p-1
+     * This must be a very good random number because this is the
+     * secret part.  The prime is public and may be shared anyware,
+     * so a random generator level of 1 has been used for the prime
      */
     x = mpi_alloc_secure( nbits/BITS_PER_MPI_LIMB );
     if( DBG_CIPHER )
index eb7b7b8..221cf71 100644 (file)
@@ -21,6 +21,7 @@
 #include <config.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 #include <errno.h>
 #include "util.h"
 #include "cipher.h"
index 9514fda..9d91ae4 100644 (file)
@@ -58,6 +58,12 @@ generate_public_prime( unsigned  nbits )
 }
 
 
+/****************
+ * We do not need to use the strongest RNG because we gain no extra
+ * security from it - The prime number is public and we could also
+ * offer the factors for those who are willing to check that it is
+ * indeed a strong prime.
+ */
 MPI
 generate_elg_prime( unsigned pbits, unsigned qbits, MPI g )
 {
@@ -87,7 +93,7 @@ generate_elg_prime( unsigned pbits, unsigned qbits, MPI g )
                    pbits, qbits, fbits, n  );
 
     prime = mpi_alloc( (pbits + BITS_PER_MPI_LIMB - 1) /  BITS_PER_MPI_LIMB );
-    q = gen_prime( qbits, 0, 2 );
+    q = gen_prime( qbits, 0, 1 );
 
     /* allocate an array to hold the factors + 2 for later usage */
     factors = m_alloc_clear( (n+2) * sizeof *factors );
@@ -112,7 +118,7 @@ generate_elg_prime( unsigned pbits, unsigned qbits, MPI g )
            perms = m_alloc_clear( m );
            for(i=0; i < n; i++ ) {
                perms[i] = 1;
-               pool[i] = gen_prime( fbits, 0, 2 );
+               pool[i] = gen_prime( fbits, 0, 1 );
                factors[i] = pool[i];
            }
        }
@@ -121,7 +127,7 @@ generate_elg_prime( unsigned pbits, unsigned qbits, MPI g )
            for(i=j=0; i < m && j < n ; i++ )
                if( perms[i] ) {
                    if( !pool[i] )
-                       pool[i] = gen_prime( fbits, 0, 2 );
+                       pool[i] = gen_prime( fbits, 0, 1 );
                    factors[j++] = pool[i];
                }
            if( i == n ) {
@@ -142,7 +148,7 @@ generate_elg_prime( unsigned pbits, unsigned qbits, MPI g )
                count1 = 0;
                qbits++;
                fputc('>', stderr);
-               q = gen_prime( qbits, 0, 2 );
+               q = gen_prime( qbits, 0, 1 );
                goto next_try;
            }
        }
@@ -153,7 +159,7 @@ generate_elg_prime( unsigned pbits, unsigned qbits, MPI g )
                count2 = 0;
                qbits--;
                fputc('<', stderr);
-               q = gen_prime( qbits, 0, 2 );
+               q = gen_prime( qbits, 0, 1 );
                goto next_try;
            }
        }
@@ -379,8 +385,9 @@ is_prime( MPI n, int steps, int *count )
        else {
            mpi_set_bytes( x, nbits-1, get_random_byte, 0 );
            /* work around a bug in mpi_set_bytes */
-           if( mpi_test_bit( x, nbits-2 ) )
+           if( mpi_test_bit( x, nbits-2 ) ) {
                mpi_set_highbit( x, nbits-2 ); /* clear all higher bits */
+           }
            else {
                mpi_set_highbit( x, nbits-2 );
                mpi_clear_bit( x, nbits-2 );
index 3355abf..ac98f54 100644 (file)
@@ -26,6 +26,7 @@
 #include <sys/time.h>
 #include <sys/types.h>
 #include <sys/stat.h>
+#include <string.h>
 #include <unistd.h>
 #include <fcntl.h>
 #include "util.h"
index e83e10d..c7fe37b 100644 (file)
@@ -6,8 +6,8 @@ dnl (Process this file with autoconf to produce a configure script.)
 AC_INIT(g10/g10.c)
 AC_CONFIG_AUX_DIR(scripts)
 dnl Ooops: automake 1.2d looks for AC_CONFIG_HEADER (and not AM_..)
-dnl       to decide where config.h is - so we have to add it to
-dnl       every makefile.am
+dnl       to decide where config.h is - so we have to add -I.. to
+dnl       every Makefile.am
 AM_CONFIG_HEADER(config.h)
 
 
@@ -34,10 +34,20 @@ AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE")
 AC_DEFINE_UNQUOTED(G10_LOCALEDIR, "$G10_LOCALEDIR")
 
 AC_ARG_ENABLE(m-debug,
-[  --enable-m-debug    Enable debugging of memory allocation])
+[  --enable-m-debug      Enable debugging of memory allocation])
 if test "$enableval" = y || test "$enableval" = yes; then
     AC_DEFINE(M_DEBUG)
 fi
+
+dnl Some systems have a broken zlib. "--disable-zlib" avoids it's usage
+enableval=yes
+AC_ARG_ENABLE(zlib,
+[  --disable-zlib        Avoid usage of zlib])
+if test "$enableval" = y || test "$enableval" = yes; then
+    g10_use_zlib=yes
+else
+    g10_use_zlib=no
+fi
 CFLAGS="-g -Wall"
 
 
@@ -159,13 +169,15 @@ AC_MSG_RESULT()
 fi
 AC_SUBST(MPI_EXTRA_ASM_OBJS)
 
-
 dnl Do we have zlib? Must do it here because Solaris failed
 dnl when compiling a conftest (due to the "-lz" from LIBS).
+if test "$g10_use_zlib" = "yes"; then
 AC_CHECK_HEADERS(zlib.h,
                 [LIBS="$LIBS -lz"],
                 AC_MSG_WARN([zlib missing - creating without ZLIB support!])
                )
+fi
+AC_SUBST(HAVE_ZLIB_H)
 
 dnl checking whether we have other cipher source files
 CIPHER_EXTRA_OBJS=""
index 11b15dd..3c4995c 100644 (file)
@@ -11,6 +11,8 @@ EXTRA_DIST = config.links
 noinst_LIBRARIES = libmpi.a
 # noinst_HEADERS   =
 
+
+
 libmpi_a_SOURCES = longlong.h    \
              mpi-add.c      \
              mpi-bit.c      \
@@ -31,11 +33,16 @@ libmpi_a_SOURCES = longlong.h         \
              mpih-mul.c     \
              mpiutil.c
 
-libmpi_a_LIBADD =  mpih-mul1.o   \
-             mpih-mul2.o    \
-             mpih-mul3.o    \
-             mpih-add1.o    \
-             mpih-sub1.o    \
-             mpih-shift.o  @MPI_EXTRA_ASM_OBJS@
+# Note this objects are actually links, the sourcefiles are
+# distributed by special code in dist-hook
+common_asm_objects = mpih-mul1.o    \
+                    mpih-mul2.o    \
+                    mpih-mul3.o    \
+                    mpih-add1.o    \
+                    mpih-sub1.o    \
+                    mpih-shift.o
+
+libmpi_a_LIBADD = $(common_asm_objects) @MPI_EXTRA_ASM_OBJS@
 
+$(LIBRARIES): $(common_asm_objects) @MPI_EXTRA_ASM_OBJS@
 
index 98b4275..c9ae7cf 100644 (file)
@@ -72,6 +72,7 @@ G10_LOCALEDIR = @G10_LOCALEDIR@
 GENCAT = @GENCAT@
 GMOFILES = @GMOFILES@
 GMSGFMT = @GMSGFMT@
+HAVE_ZLIB_H = @HAVE_ZLIB_H@
 INSTOBJEXT = @INSTOBJEXT@
 INTLDEPS = @INTLDEPS@
 INTLLIBS = @INTLLIBS@
@@ -114,12 +115,16 @@ libmpi_a_SOURCES = longlong.h       \
              mpih-mul.c     \
              mpiutil.c
 
-libmpi_a_LIBADD =  mpih-mul1.o   \
-             mpih-mul2.o    \
-             mpih-mul3.o    \
-             mpih-add1.o    \
-             mpih-sub1.o    \
-             mpih-shift.o  @MPI_EXTRA_ASM_OBJS@
+# Note this objects are actually links, the sourcefiles are
+# distributed by special code in dist-hook
+common_asm_objects = mpih-mul1.o    \
+                    mpih-mul2.o    \
+                    mpih-mul3.o    \
+                    mpih-add1.o    \
+                    mpih-sub1.o    \
+                    mpih-shift.o
+
+libmpi_a_LIBADD = $(common_asm_objects) @MPI_EXTRA_ASM_OBJS@
 mkinstalldirs = $(SHELL) $(top_srcdir)/scripts/mkinstalldirs
 CONFIG_HEADER = ../config.h
 CONFIG_CLEAN_FILES = 
@@ -328,6 +333,8 @@ maintainer-clean-generic clean mostlyclean distclean maintainer-clean
 
 CFLAGS += -O2
 
+$(LIBRARIES): $(common_asm_objects) @MPI_EXTRA_ASM_OBJS@
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
index 0f69b65..0d8cab7 100644 (file)
@@ -45,6 +45,7 @@ __clz_tab[] =
 #endif
 
 
+#define A_LIMB_1 ((mpi_limb_t)1)
 
 
 
@@ -88,7 +89,7 @@ mpi_test_bit( MPI a, unsigned n )
     if( limbno >= a->nlimbs )
        return 0; /* too far left: this is a 0 */
     limb = a->d[limbno];
-    return (limb & (1 << bitno))? 1: 0;
+    return (limb & (A_LIMB_1 << bitno))? 1: 0;
 }
 
 
@@ -108,7 +109,7 @@ mpi_set_bit( MPI a, unsigned n )
            mpi_resize(a, limbno+1 );
        a->nlimbs = limbno+1;
     }
-    a->d[limbno] |= (1<<bitno);
+    a->d[limbno] |= (A_LIMB_1<<bitno);
 }
 
 /****************
@@ -127,9 +128,9 @@ mpi_set_highbit( MPI a, unsigned n )
            mpi_resize(a, limbno+1 );
        a->nlimbs = limbno+1;
     }
-    a->d[limbno] |= (1<<bitno);
+    a->d[limbno] |= (A_LIMB_1<<bitno);
     for( bitno++; bitno < BITS_PER_MPI_LIMB; bitno++ )
-       a->d[limbno] &= ~(1 << bitno);
+       a->d[limbno] &= ~(A_LIMB_1 << bitno);
     a->nlimbs = limbno+1;
 }
 
@@ -146,7 +147,7 @@ mpi_clear_bit( MPI a, unsigned n )
 
     if( limbno >= a->nlimbs )
        return; /* don't need to clear this bit, it's to far to left */
-    a->d[limbno] &= ~(1 << bitno);
+    a->d[limbno] &= ~(A_LIMB_1 << bitno);
 }
 
 
index b9745e1..329b868 100644 (file)
@@ -54,22 +54,20 @@ mpi_getbyte( MPI a, unsigned index )
  * Put a value at position INDEX into A. index counts from lsb to msb
  */
 void
-mpi_putbyte( MPI a, unsigned index, int c )
+mpi_putbyte( MPI a, unsigned index, int xc )
 {
     int i, j;
     unsigned n;
     mpi_ptr_t ap;
-    mpi_limb_t limb;
+    mpi_limb_t limb, c;
 
-#if BYTES_PER_MPI_LIMB != 4
-  #error please enhance this function, its ugly - i know.
-#endif
-    c &= 0xff;
+    c = xc & 0xff;
     ap = a->d;
     for(n=0,i=0; i < a->alloced; i++ ) {
        limb = ap[i];
        for( j=0; j < BYTES_PER_MPI_LIMB; j++, n++ )
            if( n == index ) {
+             #if BYTES_PER_MPI_LIMB == 4
                if( j == 0 )
                    limb = (limb & 0xffffff00) | c;
                else if( j == 1 )
@@ -78,6 +76,26 @@ mpi_putbyte( MPI a, unsigned index, int c )
                    limb = (limb & 0xff00ffff) | (c<<16);
                else
                    limb = (limb & 0x00ffffff) | (c<<24);
+             #elif BYTES_PER_MPI_LIMB == 8
+               if( j == 0 )
+                   limb = (limb & 0xffffffffffffff00) | c;
+               else if( j == 1 )
+                   limb = (limb & 0xffffffffffff00ff) | (c<<8);
+               else if( j == 2 )
+                   limb = (limb & 0xffffffffff00ffff) | (c<<16);
+               else if( j == 3 )
+                   limb = (limb & 0xffffffff00ffffff) | (c<<24);
+               else if( j == 4 )
+                   limb = (limb & 0xffffff00ffffffff) | (c<<32);
+               else if( j == 5 )
+                   limb = (limb & 0xffff00ffffffffff) | (c<<40);
+               else if( j == 6 )
+                   limb = (limb & 0xff00ffffffffffff) | (c<<48);
+               else
+                   limb = (limb & 0x00ffffffffffffff) | (c<<56);
+             #else
+                #error please enhance this function, its ugly - i know.
+             #endif
                if( a->nlimbs <= i )
                    a->nlimbs = i+1;
                ap[i] = limb;
index efb5d09..bccb51f 100644 (file)
@@ -20,6 +20,7 @@
 
 #include <config.h>
 #include <stdio.h>
+#include <string.h>
 #include <stdlib.h>
 #include <assert.h>
 
@@ -326,14 +327,15 @@ mpi_set_buffer( MPI a, const byte *buffer, unsigned nbytes, int sign )
        alimb |= *p-- << 16 ;
        alimb |= *p-- << 24 ;
       #elif BYTES_PER_MPI_LIMB == 8
-       alimb  = *p--       ;
-       alimb |= *p-- <<  8 ;
-       alimb |= *p-- << 16 ;
-       alimb |= *p-- << 24 ;
-       alimb |= *p-- << 32 ;
-       alimb |= *p-- << 40 ;
-       alimb |= *p-- << 48 ;
-       alimb |= *p-- << 56 ;
+       /* cast due to egc's "left shift count >= width of type" warning*/
+       alimb  = (mpi_limb_t)*p--       ;
+       alimb |= (mpi_limb_t)*p-- <<  8 ;
+       alimb |= (mpi_limb_t)*p-- << 16 ;
+       alimb |= (mpi_limb_t)*p-- << 24 ;
+       alimb |= (mpi_limb_t)*p-- << 32 ;
+       alimb |= (mpi_limb_t)*p-- << 40 ;
+       alimb |= (mpi_limb_t)*p-- << 48 ;
+       alimb |= (mpi_limb_t)*p-- << 56 ;
       #else
        #error please implement for this limb size.
       #endif
@@ -346,14 +348,14 @@ mpi_set_buffer( MPI a, const byte *buffer, unsigned nbytes, int sign )
        if( p >= buffer ) alimb |= *p-- << 16 ;
        if( p >= buffer ) alimb |= *p-- << 24 ;
       #elif BYTES_PER_MPI_LIMB == 8
-       alimb  = *p--       ;
-       if( p >= buffer ) alimb |= *p-- <<  8 ;
-       if( p >= buffer ) alimb |= *p-- << 16 ;
-       if( p >= buffer ) alimb |= *p-- << 24 ;
-       if( p >= buffer ) alimb |= *p-- << 32 ;
-       if( p >= buffer ) alimb |= *p-- << 40 ;
-       if( p >= buffer ) alimb |= *p-- << 48 ;
-       if( p >= buffer ) alimb |= *p-- << 56 ;
+       alimb  = (mpi_limb_t)*p-- ;
+       if( p >= buffer ) alimb |= (mpi_limb_t)*p-- <<  8 ;
+       if( p >= buffer ) alimb |= (mpi_limb_t)*p-- << 16 ;
+       if( p >= buffer ) alimb |= (mpi_limb_t)*p-- << 24 ;
+       if( p >= buffer ) alimb |= (mpi_limb_t)*p-- << 32 ;
+       if( p >= buffer ) alimb |= (mpi_limb_t)*p-- << 40 ;
+       if( p >= buffer ) alimb |= (mpi_limb_t)*p-- << 48 ;
+       if( p >= buffer ) alimb |= (mpi_limb_t)*p-- << 56 ;
       #else
        #error please implement for this limb size.
       #endif
index 7515eaf..09be317 100644 (file)
@@ -103,7 +103,7 @@ mpi_alloc_limb_space( unsigned nlimbs, int secure )
     size_t len = nlimbs * sizeof(mpi_limb_t);
 
     if( DBG_MEMORY )
-       log_debug("mpi_alloc_limb_space(%u)\n", len*8 );
+       log_debug("mpi_alloc_limb_space(%u)\n", (unsigned)len*8 );
   #ifdef M_DEBUG
     return secure? m_debug_alloc_secure(len, info):m_debug_alloc( len, info );
   #else