release 0.2.3
authorWerner Koch <wk@gnupg.org>
Mon, 9 Feb 1998 17:43:42 +0000 (17:43 +0000)
committerWerner Koch <wk@gnupg.org>
Mon, 9 Feb 1998 17:43:42 +0000 (17:43 +0000)
41 files changed:
Makefile.am
Makefile.in
NEWS
README
VERSION
acconfig.h
acinclude.m4
cipher/elgamal.c
cipher/elgamal.h
cipher/md.c
cipher/primegen.c
cipher/random.c
config.h.in
configure.in
g10/Makefile.am
g10/Makefile.in
g10/armor.c
g10/comment.c
g10/g10.c
g10/g10maint.c
g10/keygen.c
g10/keyid.c
g10/main.h
g10/parse-packet.c
g10/plaintext.c
g10/pubring.g10 [new file with mode: 0644]
g10/sign.c
include/cipher.h
include/i18n.h
mpi/Makefile.am
mpi/Makefile.in
po/POTFILES.in
po/de.po
scripts/distfiles
tools/Makefile.am
tools/Makefile.in
tools/bftest.c
tools/mpicalc.c
util/Makefile.am
util/Makefile.in
util/secmem.c

index dea36e9..dbc888c 100644 (file)
@@ -1,6 +1,6 @@
 ## Process this file with automake to produce Makefile.in
 
-SUBDIRS =  util mpi cipher tools g10
+SUBDIRS =  intl po util mpi cipher tools g10
 EXTRA_DIST = VERSION
 
 
index 3c7b2a4..6097936 100644 (file)
@@ -86,7 +86,7 @@ POSUB = @POSUB@
 RANLIB = @RANLIB@
 VERSION = @VERSION@
 
-SUBDIRS =  util mpi cipher tools g10
+SUBDIRS =  intl po util mpi cipher tools g10
 EXTRA_DIST = VERSION
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 mkinstalldirs = $(SHELL) $(top_srcdir)/scripts/mkinstalldirs
@@ -214,7 +214,7 @@ distcheck: dist
        mkdir $(distdir)/=inst
        dc_install_base=`cd $(distdir)/=inst && pwd`; \
        cd $(distdir)/=build \
-         && ../configure --srcdir=.. --prefix=$$dc_install_base \
+         && ../configure --with-included-gettext --srcdir=.. --prefix=$$dc_install_base \
          && $(MAKE) \
          && $(MAKE) dvi \
          && $(MAKE) check \
diff --git a/NEWS b/NEWS
index 253e8a8..ef258c6 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,4 +1,12 @@
 
+    * Found a bug in the calculation of ELG fingerprints. This is now
+      fixed, but all existing fingerprints and keyids for ELG keys
+      are not any more valid.
+
+    * armor should now work; including clear signed text.
+
+    * moved some options to the new program g10maint
+
     * It's now 64 bit clean and runs fine on an alpha--linux.
 
     * Key generation is much faster now.  I fixed this by using not
diff --git a/README b/README
index c2a0fd0..91d3ac9 100644 (file)
--- a/README
+++ b/README
@@ -10,9 +10,6 @@
 
     * Some features are not yet implemented
 
-    PLEASE USE "--no-armor" BECAUSE THERE IS STILL A BUG IN IT!
-    (put it into the option file)
-
 
     Please subscribe to g10@net.lut.ac.uk by sending a mail with
     the word "subscribe" in the body to "g10-request@net.lut.ac.uk".
diff --git a/VERSION b/VERSION
index f3bfaf0..7179039 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-0.2.1w
+0.2.3
index f8ddcd5..11096ee 100644 (file)
 /* Define as 1 if you have gettext and don't want to use GNU gettext.  */
 #undef HAVE_GETTEXT
 
+/* libintl.h is available; this is obsolete because if we don't have
+ * this header we use a symlink to the one in intl/ */
+#undef HAVE_LIBINTL_H
+
+
 #undef HAVE_STPCPY
 
 
index 5b9d355..9c1486c 100644 (file)
@@ -61,7 +61,7 @@ AC_DEFUN(ud_WITH_NLS,
        CATOBJEXT=NONE
 
        dnl Debian 1.3.1 does not have libintl.h but libintl.a
-       AC_CHECK_HEADERS(libintl.h)
+       AC_CHECK_HEADER(libintl.h, [ AC_DEFINE(HAVE_LIBINTL_H) ])
        if    test "$ac_cv_lib_intl_main" = yes \
           && test "$ac_cv_header_libintl_h" != "yes" ; then
            nls_cv_use_gnu_gettext=yes
@@ -98,7 +98,7 @@ AC_DEFUN(ud_WITH_NLS,
                   INTLDEPS="\${top_srcdir}/intl/libintl.a"
                   INTLLIBS=$INTLDEPS
                   LIBS=`echo $LIBS | sed -e 's/-lintl//'`
-                  nls_cv_header_intl=intl/libintl.h
+                  nls_cv_header_intl=libintl.h
                   nls_cv_header_libgt=intl/libgettext.h
                 fi])
            fi
@@ -124,7 +124,7 @@ AC_DEFUN(ud_WITH_NLS,
        INTLDEPS="\${top_srcdir}/intl/libintl.a"
        INTLLIBS=$INTLDEPS
        LIBS=`echo $LIBS | sed -e 's/-lintl//'`
-       nls_cv_header_intl=intl/libintl.h
+       nls_cv_header_intl=libintl.h
        nls_cv_header_libgt=intl/libgettext.h
       fi
 
@@ -133,7 +133,7 @@ AC_DEFUN(ud_WITH_NLS,
       POSUB=po
     else
       DATADIRNAME=share
-      nls_cv_header_intl=intl/libintl.h
+      nls_cv_header_intl=libintl.h
       nls_cv_header_libgt=intl/libgettext.h
     fi
 
@@ -271,8 +271,8 @@ AC_DEFUN(WK_CHECK_TYPEDEF,
 
 
 dnl WK_LINK_FILES( SRC, DEST )
-dnl same as AC_LINK_FILES, but collet the files to link in
-dnl some special variables and do the link macro
+dnl same as AC_LINK_FILES, but collect the files to link in
+dnl some special variables and do the link
 dnl when WK_DO_LINK_FILES is called
 dnl This is a workaround for AC_LINK_FILES, because it does not work
 dnl correct when using a caching scheme
index 9e6805d..5e6bd0c 100644 (file)
@@ -113,9 +113,11 @@ gen_k( MPI p )
 /****************
  * Generate a key pair with a key of size NBITS
  * Returns: 2 structures filles with all needed values
+ *         and an array with n-1 factors of (p-1)
  */
 void
-elg_generate( ELG_public_key *pk, ELG_secret_key *sk, unsigned nbits )
+elg_generate( ELG_public_key *pk, ELG_secret_key *sk,
+             unsigned nbits, MPI **ret_factors )
 {
     MPI p;    /* the prime */
     MPI p_min1;
@@ -136,7 +138,7 @@ elg_generate( ELG_public_key *pk, ELG_secret_key *sk, unsigned nbits )
     else
        qbits = 240;
     g = mpi_alloc(1);
-    p = generate_elg_prime( nbits, qbits, g );
+    p = generate_elg_prime( nbits, qbits, g, ret_factors );
     mpi_sub_ui(p_min1, p, 1);
 
 
index 15121f5..26af1a0 100644 (file)
@@ -39,7 +39,8 @@ typedef struct {
 
 void elg_free_public_key( ELG_public_key *pk );
 void elg_free_secret_key( ELG_secret_key *sk );
-void elg_generate( ELG_public_key *pk, ELG_secret_key *sk, unsigned nbits );
+void elg_generate( ELG_public_key *pk, ELG_secret_key *sk,
+                               unsigned nbits, MPI **factors );
 int  elg_check_secret_key( ELG_secret_key *sk );
 void elg_encrypt(MPI a, MPI b, MPI input, ELG_public_key *pkey );
 void elg_decrypt(MPI output, MPI a, MPI b, ELG_secret_key *skey );
index 221cf71..c89c8bb 100644 (file)
@@ -28,6 +28,8 @@
 #include "errors.h"
 
 
+static FILE *dumpfp;
+
 /****************
  * Open a message digest handle for use with algorithm ALGO.
  * More algorithms may be added by md_enable(). The initial algorithm
@@ -38,6 +40,12 @@ md_open( int algo, int secure )
 {
     MD_HANDLE hd;
 
+    if( !dumpfp )
+       dumpfp = fopen("md.out", "w");
+    if( !dumpfp )
+       BUG();
+    { int i; for(i=0; i < 16; i++ ) putc('\xff', dumpfp ); }
+
     hd = secure ? m_alloc_secure_clear( sizeof *hd )
                : m_alloc_clear( sizeof *hd );
     if( algo )
@@ -70,6 +78,7 @@ md_copy( MD_HANDLE a )
 {
     MD_HANDLE b;
 
+    { int i; for(i=0; i < 16; i++ ) putc('\xee', dumpfp ); }
     b = m_is_secure(a)? m_alloc_secure( sizeof *b )
                      : m_alloc( sizeof *b );
     memcpy( b, a, sizeof *a );
@@ -89,6 +98,10 @@ md_close(MD_HANDLE a)
 void
 md_write( MD_HANDLE a, byte *inbuf, size_t inlen)
 {
+    if( a->bufcount && fwrite(a->buffer, a->bufcount, 1, dumpfp ) != 1 )
+       BUG();
+    if( inlen && fwrite(inbuf, inlen, 1, dumpfp ) != 1 )
+       BUG();
     if( a->use_rmd160 ) {
        rmd160_write( &a->rmd160, a->buffer, a->bufcount );
        rmd160_write( &a->rmd160, inbuf, inlen  );
@@ -111,6 +124,7 @@ md_final(MD_HANDLE a)
 {
     if( a->bufcount )
        md_write( a, NULL, 0 );
+    { int i; for(i=0; i < 16; i++ ) putc('\xcc', dumpfp ); }
     if( a->use_rmd160 ) {
        byte *p;
        rmd160_final( &a->rmd160 );
index 9d91ae4..3a2a91f 100644 (file)
@@ -65,12 +65,12 @@ generate_public_prime( unsigned  nbits )
  * indeed a strong prime.
  */
 MPI
-generate_elg_prime( unsigned pbits, unsigned qbits, MPI g )
+generate_elg_prime( unsigned pbits, unsigned qbits, MPI g, MPI **ret_factors )
 {
     int n;  /* number of factors */
     int m;  /* number of primes in pool */
     unsigned fbits; /* length of prime factors */
-    MPI *factors; /* curent factors */
+    MPI *factors; /* current factors */
     MPI *pool; /* pool of primes */
     MPI q;     /* first prime factor */
     MPI prime; /* prime test value */
@@ -167,7 +167,6 @@ generate_elg_prime( unsigned pbits, unsigned qbits, MPI g )
            count2 = 0;
     } while( !(nprime == pbits && check_prime( prime )) );
 
-
     if( DBG_CIPHER ) {
        putc('\n', stderr);
        log_mpidump( "prime    : ", prime );
@@ -180,6 +179,12 @@ generate_elg_prime( unsigned pbits, unsigned qbits, MPI g )
        putc('\n', stderr);
     }
 
+    if( ret_factors ) { /* caller wants the factors */
+       *ret_factors = m_alloc_clear( (n+1) * sizeof **ret_factors );
+       for(i=0; i < n; i++ )
+           (*ret_factors)[i] = mpi_copy( factors[i] );
+    }
+
     if( g ) { /* create a generator (start with 3)*/
        MPI tmp   = mpi_alloc( mpi_get_nlimbs(prime) );
        MPI b     = mpi_alloc( mpi_get_nlimbs(prime) );
index ac98f54..26777aa 100644 (file)
@@ -144,8 +144,9 @@ fill_buffer( byte *buffer, size_t length, int level )
        if( !(rc=select(fd+1, &rfds, NULL, NULL, &tv)) ) {
            if( !warn )
                tty_printf( _(
-"\nNot enough random bytes available.  Please do some other work to give
-the OS a chance to collect more entropy! (Need %d more bytes)\n"), length );
+"\n"
+"Not enough random bytes available.  Please do some other work to give\n"
+"the OS a chance to collect more entropy! (Need %d more bytes)\n"), length );
            warn = 1;
            continue;
        }
index 31e7990..082e5c5 100644 (file)
 #define _GNU_SOURCE  1
 
 
+/* Define if using alloca.c.  */
+#undef C_ALLOCA
+
 /* Define to empty if the keyword does not work.  */
 #undef const
 
+/* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems.
+   This function is required for alloca.c support on those systems.  */
+#undef CRAY_STACKSEG_END
+
+/* Define if you have alloca, as a function or macro.  */
+#undef HAVE_ALLOCA
+
+/* Define if you have <alloca.h> and it should be used (not on Ultrix).  */
+#undef HAVE_ALLOCA_H
+
 /* Define if you don't have vprintf but do have _doprnt.  */
 #undef HAVE_DOPRNT
 
+/* Define if you have a working `mmap' system call.  */
+#undef HAVE_MMAP
+
 /* Define if you have the vprintf function.  */
 #undef HAVE_VPRINTF
 
 /* Define as __inline if that's what the C compiler calls it.  */
 #undef inline
 
+/* Define to `long' if <sys/types.h> doesn't define.  */
+#undef off_t
+
 /* Define to `unsigned' if <sys/types.h> doesn't define.  */
 #undef size_t
 
+/* If using the C implementation of alloca, define if you know the
+   direction of stack growth for your system; otherwise it will be
+   automatically deduced at run-time.
+ STACK_DIRECTION > 0 => grows toward higher addresses
+ STACK_DIRECTION < 0 => grows toward lower addresses
+ STACK_DIRECTION = 0 => direction of growth unknown
+ */
+#undef STACK_DIRECTION
+
 /* Define if you have the ANSI C header files.  */
 #undef STDC_HEADERS
 
 #undef PACKAGE
 #undef G10_LOCALEDIR
 
+/* Define if your locale.h file contains LC_MESSAGES.  */
+#undef HAVE_LC_MESSAGES
+
+/* Define to 1 if NLS is requested.  */
+#undef ENABLE_NLS
+
+/* Define as 1 if you have catgets and don't want to use GNU gettext.  */
+#undef HAVE_CATGETS
+
+/* Define as 1 if you have gettext and don't want to use GNU gettext.  */
+#undef HAVE_GETTEXT
+
+/* libintl.h is available; this is obsolete because if we don't have
+ * this header we use a symlink to the one in intl/ */
+#undef HAVE_LIBINTL_H
+
+#undef HAVE_STPCPY
+
 #undef BIG_ENDIAN_HOST
 #undef LITTLE_ENDIAN_HOST
 
 /* The number of bytes in a unsigned short.  */
 #undef SIZEOF_UNSIGNED_SHORT
 
+/* Define if you have the dcgettext function.  */
+#undef HAVE_DCGETTEXT
+
+/* Define if you have the getcwd function.  */
+#undef HAVE_GETCWD
+
+/* Define if you have the getpagesize function.  */
+#undef HAVE_GETPAGESIZE
+
 /* Define if you have the mlock function.  */
 #undef HAVE_MLOCK
 
 /* Define if you have the mmap function.  */
 #undef HAVE_MMAP
 
+/* Define if you have the munmap function.  */
+#undef HAVE_MUNMAP
+
+/* Define if you have the putenv function.  */
+#undef HAVE_PUTENV
+
 /* Define if you have the rand function.  */
 #undef HAVE_RAND
 
+/* Define if you have the setenv function.  */
+#undef HAVE_SETENV
+
+/* Define if you have the setlocale function.  */
+#undef HAVE_SETLOCALE
+
 /* Define if you have the stpcpy function.  */
 #undef HAVE_STPCPY
 
+/* Define if you have the strcasecmp function.  */
+#undef HAVE_STRCASECMP
+
+/* Define if you have the strchr function.  */
+#undef HAVE_STRCHR
+
 /* Define if you have the strerror function.  */
 #undef HAVE_STRERROR
 
 /* Define if you have the tcgetattr function.  */
 #undef HAVE_TCGETATTR
 
+/* Define if you have the <limits.h> header file.  */
+#undef HAVE_LIMITS_H
+
+/* Define if you have the <locale.h> header file.  */
+#undef HAVE_LOCALE_H
+
+/* Define if you have the <malloc.h> header file.  */
+#undef HAVE_MALLOC_H
+
+/* Define if you have the <nl_types.h> header file.  */
+#undef HAVE_NL_TYPES_H
+
+/* Define if you have the <string.h> header file.  */
+#undef HAVE_STRING_H
+
 /* Define if you have the <unistd.h> header file.  */
 #undef HAVE_UNISTD_H
 
+/* Define if you have the <values.h> header file.  */
+#undef HAVE_VALUES_H
+
 /* Define if you have the <zlib.h> header file.  */
 #undef HAVE_ZLIB_H
 
+/* Define if you have the i library (-li).  */
+#undef HAVE_LIBI
+
+/* Define if you have the intl library (-lintl).  */
+#undef HAVE_LIBINTL
+
 
 /* The AC_CHECK_SIZEOF() fails for some machines.
  * we provide some fallback values here */
index c7fe37b..747d7cd 100644 (file)
@@ -5,9 +5,6 @@ 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 -I.. to
-dnl       every Makefile.am
 AM_CONFIG_HEADER(config.h)
 
 
@@ -25,13 +22,10 @@ fi
 VERSION=`cat $srcdir/VERSION`
 PACKAGE=g10
 ALL_LINGUAS="de"
-G10_LOCALEDIR="$g10_prefix/share/locale"
 AC_SUBST(VERSION)
 AC_SUBST(PACKAGE)
-AC_SUBST(G10_LOCALEDIR)
 AC_DEFINE_UNQUOTED(VERSION, "$VERSION")
 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])
@@ -91,10 +85,12 @@ dnl Checks for header files.
 AC_HEADER_STDC
 AC_CHECK_HEADERS(unistd.h)
 
-dnl AM_GNU_GETTEXT
-dnl WK_LINK_FILES($nls_cv_header_libgt, $nls_cv_header_intl )
-AC_MSG_WARN([i18n disabled for this release - sorry])
+AM_GNU_GETTEXT
+G10_LOCALEDIR="$g10_prefix/$DATADIRNAME/locale"
+AC_SUBST(G10_LOCALEDIR)
+AC_DEFINE_UNQUOTED(G10_LOCALEDIR, "$G10_LOCALEDIR")
 
+WK_LINK_FILES($nls_cv_header_libgt, $nls_cv_header_intl )
 
 dnl Checks for typedefs, structures, and compiler characteristics.
 AC_C_CONST
@@ -193,6 +189,13 @@ fi
 AC_SUBST(CIPHER_EXTRA_OBJS)
 AC_SUBST(CIPHER_EXTRA_DIST)
 
+dnl
+dnl If no gettext is found, default to gnu gettext
+dnl
+if test x$ac_cv_func_gettext = xno; then
+    LIBS="$LIBS -lintl -L\$(topbuilddir)/intl"
+fi
+
 
 WK_DO_LINK_FILES
 
index b0a2e92..5bb3db2 100644 (file)
@@ -1,7 +1,7 @@
 ## Process this file with automake to produce Makefile.in
 
-INCLUDES = -I.. -I$(top_srcdir)/include
-EXTRA_DIST = OPTIONS
+INCLUDES = -I$(top_srcdir)/include
+EXTRA_DIST = OPTIONS  pubring.g10
 needed_libs = ../cipher/libcipher.a ../mpi/libmpi.a ../util/libutil.a
 
 bin_PROGRAMS = g10 g10maint
@@ -55,7 +55,7 @@ g10_SOURCES  = g10.c          \
 g10maint_SOURCES = g10maint.c  \
              $(common_source)
 
-LDADD = $(needed_libs)
+LDADD = @INTLLIBS@ $(needed_libs)
 
 $(PROGRAMS): $(needed_libs)
 
index 808d99f..6bcb29e 100644 (file)
@@ -86,8 +86,8 @@ POSUB = @POSUB@
 RANLIB = @RANLIB@
 VERSION = @VERSION@
 
-INCLUDES = -I.. -I$(top_srcdir)/include
-EXTRA_DIST = OPTIONS
+INCLUDES = -I$(top_srcdir)/include
+EXTRA_DIST = OPTIONS  pubring.g10
 needed_libs = ../cipher/libcipher.a ../mpi/libmpi.a ../util/libutil.a
 
 bin_PROGRAMS = g10 g10maint
@@ -140,7 +140,7 @@ g10_SOURCES  = g10.c                \
 g10maint_SOURCES = g10maint.c  \
              $(common_source)
 
-LDADD = $(needed_libs)
+LDADD = @INTLLIBS@ $(needed_libs)
 mkinstalldirs = $(SHELL) $(top_srcdir)/scripts/mkinstalldirs
 CONFIG_HEADER = ../config.h
 CONFIG_CLEAN_FILES = 
index e397346..37e37e7 100644 (file)
@@ -172,6 +172,52 @@ invalid_armor(void)
 
 
 /****************
+ * check wether the armor header is valid on a signed message.
+ * this is for security reasons: the header lines are not included in the
+ * hash and by using some creative formatting rules, Mallory could fake
+ * any text at the beginning of a document; assuming it is read with
+ * a simple viewer. We do only allow the Hash Header.
+ */
+static int
+parse_hash_header( const char *line )
+{
+    const char *s, *s2;
+    unsigned found = 0;
+
+    if( strlen(line) < 6  || strlen(line) > 60 )
+       return 0; /* too short or too long */
+    if( memcmp( line, "Hash:", 5 ) )
+       return 0; /* invalid header */
+    s = line+5;
+    for(s=line+5;;s=s2) {
+       for(; *s && (*s==' ' || *s == '\t'); s++ )
+           ;
+       if( !*s )
+           break;
+       for(s2=s+1; *s2 && *s2!=' ' && *s2 != '\t' && *s2 != ','; s2++ )
+           ;
+       if( !strncmp( s, "RIPEMD160", s2-s ) )
+           found |= 1;
+       else if( !strncmp( s, "SHA1", s2-s ) )
+           found |= 2;
+       else if( !strncmp( s, "MD5", s2-s ) )
+           found |= 4;
+       else if( !strncmp( s, "MD2", s2-s ) )
+           found |= 8;
+       else
+           return 0;
+       for(; *s2 && (*s2==' ' || *s2 == '\t'); s2++ )
+           ;
+       if( *s2 && *s2 != ',' )
+           return 0;
+       if( *s2 )
+           s2++;
+    }
+    return found;
+}
+
+
+/****************
  * parse an ascii armor.
  * Returns: the state,
  *         the remaining bytes in BUF are returned in RBUFLEN.
@@ -197,15 +243,17 @@ find_header( fhdr_state_t state, byte *buf, size_t *r_buflen,
     do {
        switch( state ) {
          case fhdrHASArmor:
-           /* read 28 bytes, which is the bare minimum for a BEGIN...
-            * and check wether this has a Armor. */
+           /* read at least the first byte to check wether it is armored
+            * or not */
            c = 0;
            for(n=0; n < 28 && (c=iobuf_get2(a)) != -1 && c != '\n'; )
                buf[n++] = c;
-           if( n < 28 || c == -1 )
+           if( !n  || c == -1 )
                state = fhdrNOArmor; /* too short */
            else if( !is_armored( buf ) )
                state = fhdrNOArmor;
+           else if( c == '\n' )
+               state = fhdrCHECKBegin;
            else
                state = fhdrINITCont;
            break;
@@ -243,7 +291,12 @@ find_header( fhdr_state_t state, byte *buf, size_t *r_buflen,
                        log_debug("armor header: ");
                        print_string( stderr, buf, n );
                        putc('\n', stderr);
-                       state = fhdrWAITHeader;
+                       if( clearsig && !parse_hash_header( buf ) ) {
+                           log_error("invalid clearsig header\n");
+                           state = fhdrERROR;
+                       }
+                       else
+                           state = fhdrWAITHeader;
                    }
                    else
                        state = fhdrCHECKDashEscaped3;
@@ -605,7 +658,6 @@ fake_packet( armor_filter_context_t *afx, IOBUF a,
            break;
 
          case fhdrENDClearsig:
-           log_debug("endclearsig: emplines=%u n=%u\n", emplines, n );
            assert( emplines );
            emplines--; /* don't count the last one */
            state = fhdrENDClearsigHelp;
@@ -760,12 +812,14 @@ armor_filter( void *opaque, int control,
     int  idx, idx2;
     size_t n=0;
     u32 crc;
+  #if 1
     static FILE *fp ;
 
     if( !fp ) {
        fp = fopen("armor.out", "w");
        assert(fp);
     }
+  #endif
 
     if( DBG_FILTER )
        log_debug("armor-filter: control: %d\n", control );
@@ -794,8 +848,14 @@ armor_filter( void *opaque, int control,
            rc = fake_packet( afx, a, &n, buf, size );
        else if( !afx->inp_checked ) {
            rc = check_input( afx, a );
-           if( afx->inp_bypass )
-               ;
+           if( afx->inp_bypass ) {
+               for( n=0; n < size && n < afx->helplen; n++ )
+                   buf[n] = afx->helpbuf[n];
+               if( !n )
+                   rc = -1;
+               assert( n == afx->helplen );
+               afx->helplen = 0;
+           }
            else if( afx->faked ) {
                /* the buffer is at least 30 bytes long, so it
                 * is easy to construct the packets */
@@ -824,9 +884,11 @@ armor_filter( void *opaque, int control,
        }
        else
            rc = radix64_read( afx, a, &n, buf, size );
+      #if 1
        if( n )
            if( fwrite(buf, n, 1, fp ) != 1 )
                BUG();
+      #endif
        *ret_len = n;
     }
     else if( control == IOBUFCTRL_FLUSH ) {
index 00bbac7..ce2e6cc 100644 (file)
@@ -69,3 +69,30 @@ make_comment_node( const char *s )
 }
 
 
+KBNODE
+make_mpi_comment_node( const char *s, MPI a )
+{
+    PACKET *pkt;
+    byte *buf, *p, *pp;
+    unsigned n1, nb1;
+    size_t n = strlen(s);
+
+    nb1 = mpi_get_nbits( a );
+    p = buf = mpi_get_buffer( a, &n1, NULL );
+    for( ; !*p && n1; p++, n1-- )  /* skip leading null bytes */
+       ;
+
+    pkt = m_alloc_clear( sizeof *pkt );
+    pkt->pkttype = PKT_COMMENT;
+    pkt->pkt.comment = m_alloc( sizeof *pkt->pkt.comment + n + 2 + n1 );
+    pkt->pkt.comment->len = n+1+2+n1;
+    pp = pkt->pkt.comment->data;
+    memcpy(pp, s, n+1);
+    pp[n+1] = nb1 >> 8;
+    pp[n+2] = nb1 ;
+    memcpy(pp+n+3, p, n1 );
+    m_free(buf);
+    return new_kbnode( pkt );
+}
+
+
index b648969..410aeaa 100644 (file)
--- a/g10/g10.c
+++ b/g10/g10.c
@@ -101,8 +101,12 @@ strusage( int level )
 static void
 i18n_init(void)
 {
-  #ifdef ENABLE_NLS
-    setlocale( LC_MESSAGES, "" );
+  #ifdef HAVE_LIBINTL
+    #ifdef HAVE_LC_MESSAGES
+       setlocale( LC_MESSAGES, "" );
+    #else
+       setlocale( LC_ALL, "" );
+    #endif
     bindtextdomain( PACKAGE, G10_LOCALEDIR );
     textdomain( PACKAGE );
   #endif
@@ -235,8 +239,10 @@ main( int argc, char **argv )
     enum cmd_values cmd = 0;
     const char *trustdb_name = NULL;
 
-
-    secmem_init( 16384 );
+    /* Please note that we may running SUID(ROOT), so be very CAREFUL
+     * when adding any stuff between here and the call to
+     * secmem_init()  somewhere after the option parsing
+     */
 
     i18n_init();
     opt.compress = -1; /* defaults to standard compress level */
@@ -397,6 +403,10 @@ main( int argc, char **argv )
     if( errors )
        g10_exit(2);
 
+    /* initialize the secure memory. */
+    secmem_init( 16384 );
+    /* Okay, we are now working under our real uid */
+
     write_status( STATUS_ENTER );
 
     set_debug();
index a6ba7dc..4352045 100644 (file)
@@ -101,8 +101,12 @@ strusage( int level )
 static void
 i18n_init(void)
 {
-  #ifdef ENABLE_NLS
-    setlocale( LC_MESSAGES, "" );
+  #ifdef HAVE_LIBINTL
+    #ifdef HAVE_LC_MESSAGES
+       setlocale( LC_MESSAGES, "" );
+    #else
+       setlocale( LC_ALL, "" );
+    #endif
     bindtextdomain( PACKAGE, G10_LOCALEDIR );
     textdomain( PACKAGE );
   #endif
@@ -449,13 +453,13 @@ main( int argc, char **argv )
        }
        else if( argc == 2 ) {
            mpi_print( stdout, generate_elg_prime( atoi(argv[0]),
-                                                  atoi(argv[1]), NULL ), 1);
+                                                  atoi(argv[1]), NULL,NULL ), 1);
            putchar('\n');
        }
        else if( argc == 3 ) {
            MPI g = mpi_alloc(1);
            mpi_print( stdout, generate_elg_prime( atoi(argv[0]),
-                                                  atoi(argv[1]), g ), 1);
+                                                  atoi(argv[1]), g, NULL ), 1);
            printf("\nGenerator: ");
            mpi_print( stdout, g, 1 );
            putchar('\n');
index a817463..d73573c 100644 (file)
@@ -145,13 +145,15 @@ gen_elg(unsigned nbits, KBNODE pub_root, KBNODE sec_root, DEK *dek,
        PKT_secret_cert **ret_skc )
 {
     int rc;
+    int i;
     PACKET *pkt;
     PKT_secret_cert *skc;
     PKT_public_cert *pkc;
     ELG_public_key pk;
     ELG_secret_key sk;
+    MPI *factors;
 
-    elg_generate( &pk, &sk, nbits );
+    elg_generate( &pk, &sk, nbits, &factors );
 
     skc = m_alloc_clear( sizeof *skc );
     pkc = m_alloc_clear( sizeof *pkc );
@@ -190,10 +192,15 @@ gen_elg(unsigned nbits, KBNODE pub_root, KBNODE sec_root, DEK *dek,
     pkt->pkt.public_cert = pkc;
     add_kbnode(pub_root, new_kbnode( pkt ));
 
+    /* don't know wether it make sense to have the factors, so for now
+     * we store them in the secret keyring (but they are of secret) */
     pkt = m_alloc_clear(sizeof *pkt);
     pkt->pkttype = PKT_SECRET_CERT;
     pkt->pkt.secret_cert = skc;
     add_kbnode(sec_root, new_kbnode( pkt ));
+    for(i=0; factors[i]; i++ )
+       add_kbnode( sec_root,
+                   make_mpi_comment_node("#:ELG_factor:", factors[i] ));
 
     return 0;
 }
index 5d5a043..6e7b120 100644 (file)
@@ -59,14 +59,18 @@ v3_elg_fingerprint_md( PKT_public_cert *pkc )
     byte *buf1, *buf2, *buf3;
     byte *p1, *p2, *p3;
     unsigned n1, n2, n3;
+    unsigned nb1, nb2, nb3;
     unsigned n;
 
+    nb1 = mpi_get_nbits(pkc->d.elg.p);
     p1 = buf1 = mpi_get_buffer( pkc->d.elg.p, &n1, NULL );
     for( ; !*p1 && n1; p1++, n1-- )  /* skip leading null bytes */
        ;
+    nb2 = mpi_get_nbits(pkc->d.elg.g);
     p2 = buf2 = mpi_get_buffer( pkc->d.elg.g, &n2, NULL );
     for( ; !*p2 && n2; p2++, n2-- )  /* skip leading null bytes */
        ;
+    nb3 = mpi_get_nbits(pkc->d.elg.y);
     p3 = buf3 = mpi_get_buffer( pkc->d.elg.y, &n3, NULL );
     for( ; !*p3 && n3; p3++, n3-- )  /* skip leading null bytes */
        ;
@@ -90,9 +94,9 @@ v3_elg_fingerprint_md( PKT_public_cert *pkc )
        md_putc( md, a      );
     }
     md_putc( md, pkc->pubkey_algo );
-    md_putc( md, n1>>8); md_putc( md, n1 ); md_write( md, p1, n1 );
-    md_putc( md, n2>>8); md_putc( md, n2 ); md_write( md, p2, n2 );
-    md_putc( md, n3>>8); md_putc( md, n3 ); md_write( md, p3, n3 );
+    md_putc( md, nb1>>8); md_putc( md, nb1 ); md_write( md, p1, n1 );
+    md_putc( md, nb2>>8); md_putc( md, nb2 ); md_write( md, p2, n2 );
+    md_putc( md, nb3>>8); md_putc( md, nb3 ); md_write( md, p3, n3 );
     m_free(buf1);
     m_free(buf2);
     m_free(buf3);
index 67091e7..55b99ce 100644 (file)
@@ -76,6 +76,7 @@ MPI encode_md_value( MD_HANDLE md, unsigned nbits );
 
 /*-- comment.c --*/
 KBNODE make_comment_node( const char *s );
+KBNODE make_mpi_comment_node( const char *s, MPI a );
 
 /*-- elg.c --*/
 void g10_elg_encrypt( PKT_public_cert *pkc, PKT_pubkey_enc *enc, DEK *dek );
index f364d3b..c49b6f5 100644 (file)
@@ -714,7 +714,7 @@ parse_subkey( IOBUF inp, int pkttype, unsigned long pktlen )
     version = iobuf_get_noeof(inp); pktlen--;
     if( pkttype == PKT_PUBKEY_SUBCERT && version == '#' ) {
        /* early versions of G10 use old comments packets; luckily all those
-        * comments are are started by a hash */
+        * comments are started by a hash */
        if( list_mode ) {
            printf(":old comment packet: \"" );
            for( ; pktlen; pktlen-- ) {
@@ -829,8 +829,6 @@ parse_plaintext( IOBUF inp, int pkttype, unsigned long pktlen, PACKET *pkt )
     pktlen = 0;
 
     if( list_mode ) {
-       /* a value if 'c' is used by armor to indicate a faked packet
-        * it should be considered as 't' */
        printf(":literal data packet:\n"
               "\tmode %c, created %lu, name=\"",
                    mode >= ' ' && mode <'z'? mode : '?',
index ea43a1e..196da81 100644 (file)
@@ -45,6 +45,10 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx )
     FILE *fp = NULL;
     int rc = 0;
     int c;
+static FILE *abc;
+if( !abc )
+    abc=fopen("plaintext.out", "wb");
+if( !abc ) BUG();
 
     /* create the filename as C string */
     if( opt.outfile ) {
@@ -78,6 +82,7 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx )
                rc = G10ERR_READ_FILE;
                goto leave;
            }
+           putc( c, abc );
            if( mfx->md )
                md_putc(mfx->md, c );
            if( putc( c, fp ) == EOF ) {
@@ -89,6 +94,7 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx )
     }
     else {
        while( (c = iobuf_get(pt->buf)) != -1 ) {
+           putc( c, abc );
            if( mfx->md )
                md_putc(mfx->md, c );
            if( putc( c, fp ) == EOF ) {
diff --git a/g10/pubring.g10 b/g10/pubring.g10
new file mode 100644 (file)
index 0000000..f458371
Binary files /dev/null and b/g10/pubring.g10 differ
index 010c6bc..883a8d4 100644 (file)
@@ -144,7 +144,7 @@ sign_file( STRLIST filenames, int detached, STRLIST locusr,
     }
 
     /* prepare to calculate the MD over the input */
-    if( opt.textmode && opt.armor && !outfile )
+    if( opt.textmode && !outfile )
        iobuf_push_filter( inp, text_filter, &tfx );
     mfx.md = md_open(DIGEST_ALGO_RMD160, 0);
     if( !multifile )
@@ -301,22 +301,36 @@ sign_file( STRLIST filenames, int detached, STRLIST locusr,
 
 
 
+/****************
+ * note: we do not count empty lines at the beginning
+ */
 static int
 write_dash_escaped( IOBUF inp, IOBUF out, MD_HANDLE md )
 {
     int c;
     int lastlf = 1;
+    int skip_empty = 1;
 
     while( (c = iobuf_get(inp)) != -1 ) {
        /* Note: We don't escape "From " because the MUA should cope with it */
-       if( lastlf && c == '-' ) {
-           iobuf_put( out, c );
-           iobuf_put( out, ' ' );
+       if( lastlf ) {
+           if( c == '-' ) {
+               iobuf_put( out, c );
+               iobuf_put( out, ' ' );
+               skip_empty = 0;
+           }
+           else if( skip_empty && c == '\r' )
+               skip_empty = 2;
+           else
+               skip_empty = 0;
        }
 
-       md_putc(md, c );
+       if( !skip_empty )
+           md_putc(md, c );
        iobuf_put( out, c );
        lastlf = c == '\n';
+       if( skip_empty == 2 )
+           skip_empty = lastlf ? 0 : 1;
     }
     return 0; /* fixme: add error handling */
 }
@@ -368,7 +382,8 @@ clearsign_file( const char *fname, STRLIST locusr, const char *outfile )
        goto leave;
     }
 
-    iobuf_writestr(out, "-----BEGIN PGP SIGNED MESSAGE-----\n\n" );
+    iobuf_writestr(out, "-----BEGIN PGP SIGNED MESSAGE-----\n"
+                       "Hash: RIPEMD160\n\n" );
 
     textmd = md_open(DIGEST_ALGO_RMD160, 0);
     iobuf_push_filter( inp, text_filter, &tfx );
index 52d1a75..7262d5c 100644 (file)
@@ -88,7 +88,7 @@ extern ushort small_prime_numbers[];
 /*-- primegen.c --*/
 MPI generate_secret_prime( unsigned nbits );
 MPI generate_public_prime( unsigned nbits );
-MPI generate_elg_prime( unsigned pbits, unsigned qbits, MPI g );
+MPI generate_elg_prime( unsigned pbits, unsigned qbits, MPI g, MPI **factors );
 
 
 #endif /*G10_CIPHER_H*/
index 55911b4..a75f3c4 100644 (file)
 #ifndef G10_I18N_H
 #define G10_I18N_H
 
-#ifdef ENABLE_NLS
-#ifdef HAVE_LIBINTL_H
+#ifdef HAVE_LIBINTL
   #include <libintl.h>
-#else
-  #include "../intl/libintl.h"
-#endif
   #define _(a) gettext (a)
   #ifdef gettext_noop
     #define N_(a) gettext_noop (a)
index 3c4995c..1c32e13 100644 (file)
@@ -1,6 +1,6 @@
 ## Process this file with automake to produce Makefile.in
 
-INCLUDES = -I..  -I$(top_srcdir)/include
+INCLUDES =  -I$(top_srcdir)/include
 CFLAGS += -O2
 
 SUFFIXES = .S .s
index c9ae7cf..aae7160 100644 (file)
@@ -86,7 +86,7 @@ POSUB = @POSUB@
 RANLIB = @RANLIB@
 VERSION = @VERSION@
 
-INCLUDES = -I..  -I$(top_srcdir)/include
+INCLUDES =  -I$(top_srcdir)/include
 
 SUFFIXES = .S .s
 
index a5dabe2..1435eac 100644 (file)
@@ -2,6 +2,7 @@
 # Copyright (c) 1998 by Werner Koch (dd9jn)
 
 # utility
+util/secmem.c
 
 # cipher
 cipher/random.c
index a3ea55f..512e34e 100644 (file)
--- a/po/de.po
+++ b/po/de.po
@@ -6,15 +6,30 @@ msgstr ""
 "Xgettext-Options: --default-domain=g10 --directory=.. --add-comments --keyword=_ --keyword=N_ --files-from=./POTFILES.in\n"
 "Files: g10/g10.c g10/pkclist.c\n"
 
-#: cipher/random.c:146
+
+#: util/secmem.c:85
+msgid "Warning: using insecure memory!\n"
+msgstr ""
+"Achtung: Speicher mit sensibeln Daten kann auf Platte ausgelagert werden.\n"
+"(um dies zu vermeiden, kann das Programm suid(root) installiert werden;\n"
+" bitte wenden Sie sich hierzu an den Systemadministraor)\n"
+
+#: cipher/random.c:147
 msgid ""
 "\n"
-"Not enough random bytes available.  Please do some other work to give"
+"Not enough random bytes available.  Please do some other work to give\n"
+"the OS a chance to collect more entropy! (Need %d more bytes)\n"
 msgstr ""
+"\n"
+"Es sind nicht genügend Zufalls Bytes vorhanden.  Bitte führen Sie andere\n"
+"Arbeiten durch, damit das BS weitere Entropy sammeln kann!\n"
+"(Es werden noch %d Bytes benötigt)\n"
 
 #: cipher/random.c:185
 msgid "warning: using insecure random number generator!!\n"
 msgstr ""
+"Der Zufallszahlengenerator erzeugt keine sicheren Zufallszahlen!\n"
+
 
 #: cipher/random.c:186
 msgid ""
@@ -24,6 +39,11 @@ msgid ""
 "DON'T USE ANY DATA GENERATED BY THIS PROGRAM!!\n"
 "\n"
 msgstr ""
+"Der Zufallszahlengenerator ist lediglich ein \"kludge\", um ein\n"
+"übersetzen des Programms zu ermöglichen - Es ist KEIN starker RNG!\n"
+"\n"
+"BENUTZEN SIE DIE DURCH DIESES PROGRAMM ERZEUGTEN DATEN NICHT!\n"
+"\n"
 
 #: g10/g10.c:72
 msgid ""
@@ -31,6 +51,9 @@ msgid ""
 "sign, check, encrypt or decrypt\n"
 "default operation depends on the input data\n"
 msgstr ""
+"Aufruf: g10 [Optionen] [Dateien]\n"
+"Signieren, prüfen, verschlüsseln, entschlüsseln\n"
+"Die voreingestellte Operation ist abhängig von den Eingabedaten\n"
 
 #: g10/g10.c:77
 msgid "Please report bugs to <g10-bugs@isil.d.shuttle.de>.\n"
@@ -68,7 +91,7 @@ msgstr "Aufruf: g10 [Opeionen] "
 
 #: g10/g10.c:152
 msgid "conflicting commands\n"
-msgstr ""
+msgstr "Widersprechende Kommandos\n"
 
 #: g10/g10.c:164
 msgid "create ascii armored output"
@@ -88,27 +111,27 @@ msgstr "Keine wirklichen 
 
 #: g10/g10.c:168
 msgid "do only a symmetric encryption"
-msgstr ""
+msgstr "Nur konventionell verschlüsseln"
 
 #: g10/g10.c:169
 msgid "use as output file"
-msgstr ""
+msgstr "dies als Ausgabedatei benutzen"
 
 #: g10/g10.c:170
 msgid "batch mode: never ask"
-msgstr ""
+msgstr "Stapel Modus: Keine Abfragen"
 
 #: g10/g10.c:171
 msgid "assume yes on most questions"
-msgstr ""
+msgstr "\"Ja\" als Standard Antwort annehmen"
 
 #: g10/g10.c:172
 msgid "assume no on most questions"
-msgstr ""
+msgstr "\"Nein\" als Standard Antwort annehmen"
 
 #: g10/g10.c:173
 msgid "generate a new key pair"
-msgstr ""
+msgstr "Einen neues Schlüsselpaar erzeugen"
 
 #: g10/g10.c:174
 msgid "add key to the public keyring"
@@ -371,10 +394,14 @@ msgid ""
 "              default keysize is 1024 bits\n"
 "    highest suggested keysize is 2048 bits\n"
 msgstr ""
+"Es wird ein neues %s Schlüsselpaar erzeugt.\n"
+"              kleinste Schlüssellänge ist  768 bits\n"
+"              standard Schlüssellänge ist 1024 bits\n"
+"      größte sinnvolle Schlüssellänge ist 2048 bits\n"
 
 #: g10/keygen.c:351
 msgid "What keysize do you want? (1024) "
-msgstr ""
+msgstr "Welche Schlüssellänge wünschen Sie? (1024)"
 
 #: g10/keygen.c:357
 msgid "DSA does only allow keysizes from 512 to 1024\n"
@@ -382,19 +409,22 @@ msgstr ""
 
 #: g10/keygen.c:359
 msgid "keysize too small; 768 is smallest value allowed.\n"
-msgstr ""
+msgstr "zu kurz; 768 ist die kleinste mögliche Schlüssellänge.\n"
 
 #: g10/keygen.c:361
 msgid "Keysizes larger than 2048 are not suggested, because computations take REALLY long!\n"
 msgstr ""
+"Schlüssellängen größer als 2048 werden nicht empfohlen, da die "
+"Berechnungen dann WIRKLICH lange brauchen\n"
 
 #: g10/keygen.c:363
 msgid "Are you sure, that you want this keysize? "
-msgstr ""
+msgstr "Sind Sie sicher, daß Sie diese Schlüssellänge wünschen? "
 
 #: g10/keygen.c:367
 msgid "Okay, but keep in mind that your monitor and keyboard radiation is also very vulnerable to attacks!\n"
-msgstr ""
+msgstr "Gut, aber bitte denken Sie auch daran, daß Monitor und Tastatur "
+"Daten abstrahlen und diese leicht mitgelesen werden können.\n"
 
 #: g10/keygen.c:377
 msgid "Requested keysize is %u bits\n"
@@ -412,39 +442,47 @@ msgid ""
 "    \"Heinrich Heine (Der Dichter) <heinrichh@uni-duesseldorf.de>\"\n"
 "\n"
 msgstr ""
+"\n"
+"Sie benötigen einen User-ID um Ihren Schlüssel eindeutig zu machen; das\n"
+"Programm baut diese User-ID aus Ihrem echten Namen, einem Kommentar und\n"
+"Ihrer Email Adresse in dieser Form auf:\n"
+"    \"Heinrich Heine (Der Dichter) <heinrichh@uni-duesseldorf.de>\"\n"
+"\n"
+
+
 
 #: g10/keygen.c:403
 msgid "Real name: "
-msgstr ""
+msgstr "Vorname, Nachname: "
 
 #: g10/keygen.c:407
 msgid "Invalid character in name\n"
-msgstr ""
+msgstr "Ungültiges Zeichen im Namen\n"
 
 #: g10/keygen.c:409
 msgid "Name may not start with a digit\n"
-msgstr ""
+msgstr "Der Name darf nicht mit einer Ziffer beginnen\n"
 
 #: g10/keygen.c:411
 msgid "Name must be at least 5 characters long\n"
-msgstr ""
+msgstr "Der Name muß min. 5 Zeichen lang sein\n"
 
 #: g10/keygen.c:419
 msgid "Email address: "
-msgstr ""
+msgstr "Email Adresse: "
 
 #: g10/keygen.c:431
 msgid "Not a valid email address\n"
-msgstr ""
+msgstr "Email Adresse is ungültig\n"
 
 #: g10/keygen.c:439
 msgid "Comment: "
-msgstr ""
+msgstr "Kommentar: "
 
 #. no comment is okay
 #: g10/keygen.c:445
 msgid "Invalid character in comment\n"
-msgstr ""
+msgstr "Ungültiges Zeichen im Kommentar\n"
 
 #: g10/keygen.c:465
 msgid ""
@@ -452,16 +490,21 @@ msgid ""
 "    \"%s\"\n"
 "\n"
 msgstr ""
+"Sie haben diese User-ID gewählt:\n"
+"    \"%s\"\n"
+"\n"
 
 #: g10/keygen.c:467
 msgid "Edit (N)ame, (C)omment, (E)mail or (O)kay? "
-msgstr ""
+msgstr "Ändern: N=Name, C=Kommentar, E=Email, O=Okay? "
 
 #: g10/keygen.c:499
 msgid ""
 "You need a Passphrase to protect your secret key.\n"
 "\n"
 msgstr ""
+"Sie benötigen eine \"passphrase\" um den geheimen Schlüssel zu schützen.\n"
+"\n"
 
 #: g10/keygen.c:508
 msgid ""
@@ -470,10 +513,16 @@ msgid ""
 "using this program with the option \"--change-passphrase\"\n"
 "\n"
 msgstr ""
+"Sie möchten keine \"passphrase\" - Dies ist einen *schlechte* Idee!\n"
+"Es ist trotzdem möglich.  Sie können Ihre \"phassphrase\" jederzeit\n"
+"ändern, indem sie dieses Programm mit dem Kommando \"--change-passphrase\"\n"
+"aufrufen\n"
+"\n"
+
 
 #: g10/keygen.c:514
 msgid "passphrase not correctly repeated; try again.\n"
-msgstr ""
+msgstr "\"passphrase\" nicht richtig wiederholt; noch einmal.\n"
 
 #: g10/keygen.c:531
 msgid "writing public certificate to '%s'\n"
@@ -490,10 +539,13 @@ msgid ""
 "network and the disks) during the prime generation; this gives the random\n"
 "number generator a better chance to gain enough entropy.\n"
 msgstr ""
+"Wir müßen eine ganze Menge Zufallszahlen erzeugen.  Sie können dies\n"
+"unterstützen, indem Sie z.B. in einem anderen Fenster/Konsole irgendetwas\n"
+"tippen oder irgendwelche anderen Programme benutzen.\n"
 
 #: g10/keygen.c:611
 msgid "public and secret key created and signed.\n"
-msgstr ""
+msgstr "Öffentlichen und geheimen Schlüssel erzeugt und signiert.\n"
 
 #: g10/keygen.c:622
 msgid "Key generation failed: %s\n"
index f048185..c6a8d74 100644 (file)
@@ -3,3 +3,4 @@ config.sub
 install-sh
 mkinstalldirs
 mkdiff
+missing
index 3b43090..fb88d91 100644 (file)
@@ -1,6 +1,7 @@
 ## Process this file with automake to produce Makefile.in
 
-INCLUDES = -I.. -I$(top_srcdir)/include
+INCLUDES = -I$(top_srcdir)/include
+needed_libs = ../cipher/libcipher.a  ../util/libutil.a ../mpi/libmpi.a ../util/libutil.a
 
 noinst_PROGRAMS = mpicalc bftest
 
@@ -9,8 +10,7 @@ mpicalc_SOURCES = mpicalc.c
 bftest_SOURCES = bftest.c
 
 
-LDADD = -L ../cipher -L ../mpi -L ../util -L ../cipher \
-       -lmpi -lutil -lmpi -lutil -lcipher
+LDADD = @INTLLIBS@  $(needed_libs)
 
-$(PROGRAMS): ../mpi/libmpi.a ../cipher/libcipher.a
+$(PROGRAMS): $(needed_libs)
 
index 6b9d2a3..0594ccd 100644 (file)
@@ -86,7 +86,8 @@ POSUB = @POSUB@
 RANLIB = @RANLIB@
 VERSION = @VERSION@
 
-INCLUDES = -I.. -I$(top_srcdir)/include
+INCLUDES = -I$(top_srcdir)/include
+needed_libs = ../cipher/libcipher.a  ../util/libutil.a ../mpi/libmpi.a ../util/libutil.a
 
 noinst_PROGRAMS = mpicalc bftest
 
@@ -94,8 +95,7 @@ mpicalc_SOURCES = mpicalc.c
 
 bftest_SOURCES = bftest.c
 
-LDADD = -L ../cipher -L ../mpi -L ../util -L ../cipher \
-       -lmpi -lutil -lmpi -lutil -lcipher
+LDADD = @INTLLIBS@  $(needed_libs)
 mkinstalldirs = $(SHELL) $(top_srcdir)/scripts/mkinstalldirs
 CONFIG_HEADER = ../config.h
 CONFIG_CLEAN_FILES = 
@@ -108,11 +108,13 @@ LDFLAGS = @LDFLAGS@
 LIBS = @LIBS@
 mpicalc_OBJECTS =  mpicalc.o
 mpicalc_LDADD = $(LDADD)
-mpicalc_DEPENDENCIES =  ../cipher ../mpi ../util ../cipher
+mpicalc_DEPENDENCIES =  ../cipher/libcipher.a ../util/libutil.a \
+../mpi/libmpi.a ../util/libutil.a
 mpicalc_LDFLAGS = 
 bftest_OBJECTS =  bftest.o
 bftest_LDADD = $(LDADD)
-bftest_DEPENDENCIES =  ../cipher ../mpi ../util ../cipher
+bftest_DEPENDENCIES =  ../cipher/libcipher.a ../util/libutil.a \
+../mpi/libmpi.a ../util/libutil.a
 bftest_LDFLAGS = 
 CFLAGS = @CFLAGS@
 COMPILE = $(CC) $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS)
@@ -304,7 +306,7 @@ installdirs mostlyclean-generic distclean-generic clean-generic \
 maintainer-clean-generic clean mostlyclean distclean maintainer-clean
 
 
-$(PROGRAMS): ../mpi/libmpi.a ../cipher/libcipher.a
+$(PROGRAMS): $(needed_libs)
 
 # 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.
index c5d31eb..cd0eef9 100644 (file)
@@ -29,6 +29,7 @@
 
 #include "util.h"
 #include "cipher.h"
+#include "i18n.h"
 
 static void
 my_usage(void)
@@ -43,6 +44,20 @@ strusage( int level )
     return default_strusage(level);
 }
 
+static void
+i18n_init(void)
+{
+  #ifdef HAVE_LIBINTL
+    #ifdef HAVE_LC_MESSAGES
+       setlocale( LC_MESSAGES, "" );
+    #else
+       setlocale( LC_ALL, "" );
+    #endif
+    bindtextdomain( PACKAGE, G10_LOCALEDIR );
+    textdomain( PACKAGE );
+  #endif
+}
+
 int
 main(int argc, char **argv)
 {
@@ -57,6 +72,7 @@ main(int argc, char **argv)
     setmode( fileno(stdout), O_BINARY );
   #endif
 
+    i18n_init();
     if( argc > 1 && !strcmp(argv[1], "-e") ) {
        encode++;
        argc--; argv++;
index 28c4985..0bee7fc 100644 (file)
@@ -31,6 +31,7 @@
 
 #include "util.h"
 #include "mpi.h"
+#include "i18n.h"
 
 #define STACKSIZE  100
 static MPI stack[STACKSIZE];
@@ -62,6 +63,21 @@ strusage( int level )
 
 
 static void
+i18n_init(void)
+{
+  #ifdef HAVE_LIBINTL
+    #ifdef HAVE_LC_MESSAGES
+       setlocale( LC_MESSAGES, "" );
+    #else
+       setlocale( LC_ALL, "" );
+    #endif
+    bindtextdomain( PACKAGE, G10_LOCALEDIR );
+    textdomain( PACKAGE );
+  #endif
+}
+
+
+static void
 do_add(void)
 {
     if( stackidx < 2 ) {
@@ -201,6 +217,7 @@ main(int argc, char **argv)
     char strbuf[1000];
     int stridx=0;
 
+    i18n_init();
     while( arg_parse( &pargs, opts) ) {
        switch( pargs.r_opt ) {
          default : pargs.err = 2; break;
index 8af2b14..e8f920f 100644 (file)
@@ -1,6 +1,6 @@
 ## Process this file with automake to produce Makefile.in
 
-INCLUDES = -I.. -I$(top_srcdir)/include
+INCLUDES = -I$(top_srcdir)/include
 
 noinst_LIBRARIES = libutil.a
 
index 7b067bf..99ac0a5 100644 (file)
@@ -86,7 +86,7 @@ POSUB = @POSUB@
 RANLIB = @RANLIB@
 VERSION = @VERSION@
 
-INCLUDES = -I.. -I$(top_srcdir)/include
+INCLUDES = -I$(top_srcdir)/include
 
 noinst_LIBRARIES = libutil.a
 
index a08e24a..2777ca8 100644 (file)
@@ -33,6 +33,7 @@
 #include "types.h"
 #include "memory.h"
 #include "util.h"
+#include "i18n.h"
 
 
 #define DEFAULT_POOLSIZE 8196
@@ -79,8 +80,9 @@ lock_pool( void *p, size_t n )
     }
 
     if( err ) {
-       log_error("can´t lock memory: %s\n", strerror(err));
-       log_info("Warning: using insecure memory!\n");
+       if( errno != EPERM )
+           log_error("can´t lock memory: %s\n", strerror(err));
+       log_info(_("Warning: using insecure memory!\n"));
     }
 
   #else