bug fix release V0-3-4
authorWerner Koch <wk@gnupg.org>
Tue, 11 Aug 1998 17:29:34 +0000 (17:29 +0000)
committerWerner Koch <wk@gnupg.org>
Tue, 11 Aug 1998 17:29:34 +0000 (17:29 +0000)
43 files changed:
NEWS
THANKS
TODO
VERSION
checks/ChangeLog
checks/genkey1024.test
cipher/random.c
g10/ChangeLog
g10/OPTIONS
g10/armor.c
g10/build-packet.c
g10/comment.c
g10/compress.c
g10/dearmor.c
g10/encode.c
g10/export.c
g10/g10.c
g10/getkey.c
g10/import.c
g10/keyedit.c
g10/keygen.c
g10/keyid.c
g10/main.h
g10/openfile.c
g10/options.h
g10/parse-packet.c
g10/passphrase.c
g10/pkclist.c
g10/revoke.c
g10/seckey-cert.c
g10/sign.c
g10/status.c
g10/trustdb.c
include/errors.h
po/ChangeLog
po/POTFILES.in
po/de.po
po/en.po
po/it.po
util/ChangeLog
util/errors.c
util/miscutil.c
zlib/Makefile

diff --git a/NEWS b/NEWS
index a3546be..b2e229f 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,11 @@
+Noteworthy changes in version 0.3.4
+-----------------------------------
+    * New options --comment and --set-filename; see g10/OPTIONS
+
+    * yes/no, y/n localized.
+
+    * Fixed some bugs.
+
 Noteworthy changes in version 0.3.3
 -----------------------------------
     * IMPORTANT: I found yet another bug in the way the secret keys
diff --git a/THANKS b/THANKS
index 7c04f6a..8cbda75 100644 (file)
--- a/THANKS
+++ b/THANKS
@@ -4,6 +4,7 @@ code.  Here is a list of those people.  Help me keep it complete and free of
 errors.
 
 Anand Kumria           wildfire@progsoc.uts.edu.au
+Ariel T Glenn          ariel@columbia.edu
 Brian Warner           warner@lothar.com
 Caskey L. Dickson      caskey@technocage.com
 Charles Levert         charles@comm.polymtl.ca
diff --git a/TODO b/TODO
index e254d22..ac98f08 100644 (file)
--- a/TODO
+++ b/TODO
@@ -26,9 +26,6 @@
 
     * rewrite --list-packets or put it into another tool.
 
-    * add usage arguments to get_key_byname or return a PKC_LIST with
-      all keys and add a selection.
-
     * Burn the buffers used by fopen(), or use read(2). Does this
       really make sense?
 
@@ -51,5 +48,9 @@
 
     * Is it okay to use gettext for the help system???
 
-    * There are still problems with old v3 keys after passphrase change.
+    * configure checks two times for gcc
+
+    * update gettext
+
+    * Add some stuff for DU cc
 
diff --git a/VERSION b/VERSION
index 1c09c74..42045ac 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-0.3.3
+0.3.4
index 6e1cb41..2adfc1b 100644 (file)
@@ -1,3 +1,7 @@
+Mon Aug 10 21:33:38 1998  Werner Koch  (wk@(none))
+
+       * genkey1024.test: Ariel fixed this.
+
 Wed Jul  8 10:43:47 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
        * seat.test: New.
index faaea2d..ee282b2 100755 (executable)
@@ -2,59 +2,95 @@
 
 . defs.inc || exit 3
 
-info "This expect script does not yet work"
-info "Please, all those expect gurus, can you help me with it?"
-exit 0
-
 expect - <<EOF
-set timeout -1
+#set timeout -1
+set timeout 5
 match_max 100000
 spawn ../g10/gpg --no-batch --quick-random --homedir . --gen-key
-expect -exact "Please select the algorithm to use:\r
-   (1) ElGamal is the suggested one.\r
-   (2) DSA can only be used for signatures.\r
-Your selection? (1,2) "
-send -- "1\r"
-expect -exact "1\r
-\r                      \rAbout to generate a new ElGamal keypair.\r
-             minimum keysize is  768 bits\r
-             default keysize is 1024 bits\r
+expect { 
+    -exact "Please select what kind of key you want:\r
+   (1) DSA and ElGamal (default)\r
+   (2) ElGamal (sign and encrypt)\r
+   (3) ElGamal (encrypt only)\r
+   (4) DSA (sign only)\r
+   (5) ElGamal in a v3 packet\r
+Your selection? "  { send -- "1\r" }
+    timeout { exit 1 } }
+expect {
+    -exact "1\r
+\r                 \rDSA keypair will have 1024 bits.\r
+About to generate a new ELG-E keypair.\r
+              minimum keysize is  768 bits\r
+              default keysize is 1024 bits\r
     highest suggested keysize is 2048 bits\r
-What keysize do you want? (1024) "
-send -- "\r"
-expect -exact "\r
-\r                                \rRequested keysize is 1024 bits\r
-\r
+What keysize do you want? (1024) " { send -- "\r" }
+    timeout { exit 1 } }
+expect {
+    -exact "\r
+\r                                 \rRequested keysize is 1024 bits\r
+Please specify how long the key should be valid.\r
+         0 = key does not expire\r
+      <n>  = key expires in n days\r
+      <n>w = key expires in n weeks\r
+      <n>m = key expires in n months\r
+      <n>y = key expires in n years\r
+Key is valid for? (0) " { send -- "1\r" }
+    timeout { exit 1 } }
+expect {
+     -exact "1\r
+\r                       \rKey expires at " { }
+    timeout { exit 1 } }
+expect { 
+     -re "(.*)\r
+" {}
+    timeout { exit 1 } }
+expect {
+    -exact "Is this correct (y/n)? " { send -- "y\r" }
+    timeout { exit 1 } }
+expect {
+    -exact "y\r
+\r                        \r\r
 You need a User-ID to identify your key; the software constructs the user id\r
 from Real Name, Comment and Email Address in this form:\r
-    \"Heinrich Heine (Der Dichter) <heinrichh@uni-duesseldorf.de>\"\r
+    \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\r
 \r
-Real name: "
-send -- "Harry H.\r"
-expect -exact "Harry H.\r
-\r                  \rEmail address: "
-send -- "hh@ddorf.de\r"
-expect -exact "hh@ddorf.de\r
-\r                         \rComment: "
-send -- "a test\r"
-expect -exact "a test\r
-\r              \rYou selected this USER-ID:\r
+Real name: " { send -- "Harry H.\r" }
+    timeout { exit 1 } }
+expect {
+   -exact "Harry H.\r
+\r                   \rEmail address: " { send -- "hh@ddorf.de\r" }
+    timeout { exit 1 } }
+expect {
+   -exact "hh@ddorf.de\r
+\r                          \rComment: " { send -- "a test\r" }
+    timeout { exit 1 } }
+expect {
+   -exact "a test\r
+\r               \rYou selected this USER-ID:\r
     \"Harry H. (a test) <hh@ddorf.de> (INSECURE!)\"\r
 \r
-Edit (N)ame, (C)omment, (E)mail or (O)kay? "
-send -- "o\r"
-expect -exact "o\r
-\r                                           \rYou need a Passphrase to protect your secret key.\r
+Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? " { send -- "o\r" }
+    timeout { exit 1 } }
+expect {
+   -exact "o\r
+\r                                                     \rYou need a Passphrase to protect your secret key.\r
 \r
-Enter pass phrase: "
-send -- "abc\r"
-expect -ex "abc\r\n"
-expect -ex "\r                   \rRepeat pass phrase:\ "
-send -- "abc\r"
-expect -ex "abc\r\n"
-expect {
-    -ex "public and secret key created and signed.\r"
-    eof  abort
+Enter pass phrase: " { sleep 1; send -- "abc\r" }
+    timeout { exit 1 } }
+expect {
+  -ex "\r                   \rRepeat pass phrase: " { sleep 1; send -- "abc\r" }
+    timeout { exit 1 } }
+expect { 
+  -ex "\r                    \rWe need to generate a lot of random bytes. It is a good idea to perform\r
+some other action (work in another window, move the mouse, utilize the\r
+network and the disks) during the prime generation; this gives the random\r
+number generator a better chance to gain enough entropy.\r" {}
+    timeout { exit 1 } }
+set timeout 120
+expect {
+    -ex "public and secret key created and signed.\r" { exit 0 }
+    eof  { exit 1 }
 }
+exit 1
 EOF
 
index 29b82ee..e22f3d7 100644 (file)
@@ -124,6 +124,8 @@ get_random_bits( size_t nbits, int level, int secure )
     byte *buf;
     size_t nbytes = (nbits+7)/8;
 
+    if( quick_test && level > 1 )
+       level = 1;
     MASK_LEVEL(level);
     buf = secure && secure_alloc ? m_alloc_secure( nbytes ) : m_alloc( nbytes );
     read_pool( buf, nbytes, level );
index 6aef103..526cf15 100644 (file)
@@ -1,3 +1,48 @@
+Tue Aug 11 17:54:50 1998  Werner Koch  (wk@(none))
+
+       * build-packet.c (do_secret_key): Fixed handling of old keys.
+
+       * getkey.c (compare_name): Fixed exact and email matching
+
+       * openfile.c (open_outfile): Changed arguments and all callers.
+
+Tue Aug 11 09:14:35 1998  Werner Koch  (wk@(none))
+
+       * encode.c (encode_simple): Applied option set-filename and comment.
+       (encode_crypt): Ditto.
+       * sign.c (sign_file): Ditto.
+       * armor.c (armor_filter): Applied option comment.
+
+       * encode.c (encode_crypt): Moved init_packet to the begin.
+       (encode_simple): add an init_packet().
+
+       * comment (write_comment): Now enforces a hash sign as the 1st byte.
+
+       * import.c (import_one): Add explanation for "no user ids".
+
+       * compress.c (do_uncompress): Applied Brian Warner's patch to support
+       zlib 1.1.3 etc.
+
+       * trustdb.c (check_trust): Fixed a problem after inserting new keys.
+
+       * getkey (lookup): do not return the primary key if usage is given
+       (lookup_sk): Ditto and take usage into account.
+
+       * status.c (cpr_get_answer_is_yes): add display_help.
+
+Mon Aug 10 10:11:28 1998  Werner Koch  (wk@(none))
+
+       * getkey.c (lookup_sk): Now always returns the primary if arg
+       primary is true.
+       (lookup): Likewise.
+       (get_pubkey_byname): Now returns the primary key
+       (get_seckey_byname): Ditto.
+
+
+Mon Aug 10 08:34:03 1998  Werner Koch  (wk@(none))
+
+       * keyid.c (pubkey_letter): ELG_E is now a small g.
+
 Sat Aug  8 17:26:12 1998  Werner Koch  (wk@(none))
 
        * openfile (overwrite_filep): Changed semantics and all callers.
index 2e933f5..9555ce0 100644 (file)
@@ -50,3 +50,11 @@ run-as-shm-coprocess [request-locked-shm-size]
 # very special :-)
 # You will have to use "--status-fd" too
 
+
+set-filename <name>
+# Set <name> as the filename into the plaintext packet
+
+comment <string>
+# Add <string> as comment to the output
+
+
index 45f962f..f5116ac 100644 (file)
@@ -1002,8 +1002,25 @@ armor_filter( void *opaque, int control,
            iobuf_writestr(a, "-----\n");
            iobuf_writestr(a, "Version: GNUPG v"  VERSION " ("
                                            PRINTABLE_OS_NAME ")\n");
-           iobuf_writestr(a,
-               "Comment: Get GNUPG from ftp://ftp.guug.de/pub/gcrypt/\n");
+
+           if( opt.comment_string ) {
+               const char *s = opt.comment_string;
+               iobuf_writestr(a, "Comment: " );
+               for( ; *s; s++ ) {
+                   if( *s == '\n' )
+                       iobuf_writestr(a, "\\n" );
+                   else if( *s == '\r' )
+                       iobuf_writestr(a, "\\r" );
+                   else if( *s == '\v' )
+                       iobuf_writestr(a, "\\v" );
+                   else
+                       iobuf_put(a, *s );
+               }
+               iobuf_put(a, '\n' );
+           }
+           else
+               iobuf_writestr(a,
+                   "Comment: Get GNUPG from ftp://ftp.guug.de/pub/gcrypt/\n");
            if( afx->hdrlines )
                iobuf_writestr(a, afx->hdrlines);
            iobuf_put(a, '\n');
index 6373e0c..a7c7093 100644 (file)
@@ -291,7 +291,8 @@ do_secret_key( IOBUF out, int ctb, PKT_secret_key *sk )
     for(i=0; i < npkey; i++ )
        mpi_write(a, sk->skey[i] );
     if( sk->is_protected ) {
-       if( is_RSA(sk->pubkey_algo) && sk->version < 4 ) {
+       if( is_RSA(sk->pubkey_algo) && sk->version < 4
+                                   && !sk->protect.s2k.mode ) {
            iobuf_put(a, sk->protect.algo );
            iobuf_write(a, sk->protect.iv, 8 );
        }
index fef831c..71d524c 100644 (file)
@@ -44,9 +44,17 @@ write_comment( IOBUF out, const char *s )
     int rc=0;
 
     pkt.pkttype = PKT_COMMENT;
-    pkt.pkt.comment = m_alloc( sizeof *pkt.pkt.comment + n - 1 );
-    pkt.pkt.comment->len = n;
-    strcpy(pkt.pkt.comment->data, s);
+    if( *s != '#' ) {
+       pkt.pkt.comment = m_alloc( sizeof *pkt.pkt.comment + n );
+       pkt.pkt.comment->len = n+1;
+       *pkt.pkt.comment->data = '#';
+       strcpy(pkt.pkt.comment->data+1, s);
+    }
+    else {
+       pkt.pkt.comment = m_alloc( sizeof *pkt.pkt.comment + n - 1 );
+       pkt.pkt.comment->len = n;
+       strcpy(pkt.pkt.comment->data, s);
+    }
     if( (rc = build_packet( out, &pkt )) )
        log_error("build_packet(comment) failed: %s\n", g10_errstr(rc) );
     free_packet( &pkt );
index ca5adae..917a960 100644 (file)
@@ -151,19 +151,23 @@ do_uncompress( compress_filter_context_t *zfx, z_stream *zs,
        if( DBG_FILTER )
            log_debug("call inflate: avail_in=%u, avail_out=%u\n",
                    (unsigned)zs->avail_in, (unsigned)zs->avail_out);
+      #ifdef Z_SYNC_FLUSH
+       zrc = inflate( zs, Z_SYNC_FLUSH );
+      #else
        zrc = inflate( zs, Z_PARTIAL_FLUSH );
+      #endif
        if( DBG_FILTER )
            log_debug("inflate returned: avail_in=%u, avail_out=%u, zrc=%d\n",
                   (unsigned)zs->avail_in, (unsigned)zs->avail_out, zrc);
        if( zrc == Z_STREAM_END )
            rc = -1; /* eof */
-       else if( zrc != Z_OK ) {
+       else if( zrc != Z_OK && zrc != Z_BUF_ERROR ) {
            if( zs->msg )
                log_fatal("zlib inflate problem: %s\n", zs->msg );
            else
                log_fatal("zlib inflate problem: rc=%d\n", zrc );
        }
-    } while( zs->avail_out && zrc != Z_STREAM_END );
+    } while( zs->avail_out && zrc != Z_STREAM_END  && zrc != Z_BUF_ERROR );
     *ret_len = zfx->outbufsize - zs->avail_out;
     if( DBG_FILTER )
        log_debug("do_uncompress: returning %u bytes\n", (unsigned)*ret_len );
index 5fa0382..6b15f49 100644 (file)
@@ -58,10 +58,9 @@ dearmor_file( const char *fname )
 
     iobuf_push_filter( inp, armor_filter, &afx );
 
-    if( !(out = open_outfile( fname, 0 )) ) {
-       rc = G10ERR_CREATE_FILE;
+    if( (rc = open_outfile( fname, 0, &out )) )
        goto leave;
-    }
+
 
 
     while( (c = iobuf_get(inp)) != -1 )
@@ -100,10 +99,8 @@ enarmor_file( const char *fname )
     }
 
 
-    if( !(out = open_outfile( fname, 1 )) ) {
-       rc = G10ERR_CREATE_FILE;
+    if( (rc = open_outfile( fname, 1, &out )) )
        goto leave;
-    }
 
     afx.what = 4;
     afx.hdrlines = "Comment: Use \"gpgm --dearmor\" for unpacking\n";
index 142a5e2..1d50550 100644 (file)
@@ -80,6 +80,7 @@ encode_simple( const char *filename, int mode )
     memset( &cfx, 0, sizeof cfx);
     memset( &afx, 0, sizeof afx);
     memset( &zfx, 0, sizeof zfx);
+    init_packet(&pkt);
 
     /* prepare iobufs */
     if( !(inp = iobuf_open(filename)) ) {
@@ -107,19 +108,21 @@ encode_simple( const char *filename, int mode )
        }
     }
 
-    if( !(out = open_outfile( filename, opt.armor? 1:0 )) ) {
+    if( (rc = open_outfile( filename, opt.armor? 1:0, &out )) ) {
        iobuf_close(inp);
        m_free(cfx.dek);
        m_free(s2k);
-       return G10ERR_CREATE_FILE;  /* or user said: do not overwrite */
+       return rc;
     }
 
     if( opt.armor )
        iobuf_push_filter( out, armor_filter, &afx );
-    else
+    else {
        write_comment( out, "#created by GNUPG v" VERSION " ("
                                            PRINTABLE_OS_NAME ")");
-
+       if( opt.comment_string )
+           write_comment( out, opt.comment_string );
+    }
     if( s2k && !opt.rfc1991 ) {
        PKT_symkey_enc *enc = m_alloc_clear( sizeof *enc );
        enc->version = 4;
@@ -133,18 +136,22 @@ encode_simple( const char *filename, int mode )
     }
 
     /* setup the inner packet */
-    if( filename ) {
-       pt = m_alloc( sizeof *pt + strlen(filename) - 1 );
-       pt->namelen = strlen(filename);
-       memcpy(pt->name, filename, pt->namelen );
-       if( !(filesize = iobuf_get_filelength(inp)) )
-           log_info(_("%s: warning: empty file\n"), filename );
+    if( filename || opt.set_filename ) {
+       const char *s = opt.set_filename ? opt.set_filename : filename;
+       pt = m_alloc( sizeof *pt + strlen(s) - 1 );
+       pt->namelen = strlen(s);
+       memcpy(pt->name, s, pt->namelen );
     }
     else { /* no filename */
        pt = m_alloc( sizeof *pt - 1 );
        pt->namelen = 0;
-       filesize = 0; /* stdin */
     }
+    if( filename ) {
+       if( !(filesize = iobuf_get_filelength(inp)) )
+           log_info(_("%s: warning: empty file\n"), filename );
+    }
+    else
+       filesize = 0; /* stdin */
     pt->timestamp = make_timestamp();
     pt->mode = 'b';
     pt->len = filesize;
@@ -194,6 +201,7 @@ encode_crypt( const char *filename, STRLIST remusr )
     memset( &cfx, 0, sizeof cfx);
     memset( &afx, 0, sizeof afx);
     memset( &zfx, 0, sizeof zfx);
+    init_packet(&pkt);
 
     if( (rc=build_pk_list( remusr, &pk_list, PUBKEY_USAGE_ENC)) )
        return rc;
@@ -208,16 +216,18 @@ encode_crypt( const char *filename, STRLIST remusr )
     else if( opt.verbose )
        log_info(_("reading from '%s'\n"), filename? filename: "[stdin]");
 
-    if( !(out = open_outfile( filename, opt.armor? 1:0 )) ) {
-       rc = G10ERR_CREATE_FILE;  /* or user said: do not overwrite */
+    if( (rc = open_outfile( filename, opt.armor? 1:0, &out )) )
        goto leave;
-    }
+
 
     if( opt.armor )
        iobuf_push_filter( out, armor_filter, &afx );
-    else
+    else {
        write_comment( out, "#created by GNUPG v" VERSION " ("
                                            PRINTABLE_OS_NAME ")");
+       if( opt.comment_string )
+           write_comment( out, opt.comment_string );
+    }
 
     /* create a session key */
     cfx.dek = m_alloc_secure( sizeof *cfx.dek );
@@ -237,24 +247,27 @@ encode_crypt( const char *filename, STRLIST remusr )
        goto leave;
 
     /* setup the inner packet */
-    if( filename ) {
-       pt = m_alloc( sizeof *pt + strlen(filename) - 1 );
-       pt->namelen = strlen(filename);
-       memcpy(pt->name, filename, pt->namelen );
-       if( !(filesize = iobuf_get_filelength(inp)) )
-           log_info(_("%s: warning: empty file\n"), filename );
+    if( filename || opt.set_filename ) {
+       const char *s = opt.set_filename ? opt.set_filename : filename;
+       pt = m_alloc( sizeof *pt + strlen(s) - 1 );
+       pt->namelen = strlen(s);
+       memcpy(pt->name, s, pt->namelen );
     }
     else { /* no filename */
        pt = m_alloc( sizeof *pt - 1 );
        pt->namelen = 0;
-       filesize = 0; /* stdin */
     }
+    if( filename ) {
+       if( !(filesize = iobuf_get_filelength(inp)) )
+           log_info(_("%s: warning: empty file\n"), filename );
+    }
+    else
+       filesize = 0; /* stdin */
     pt->timestamp = make_timestamp();
     pt->mode = 'b';
     pt->len = filesize;
     pt->new_ctb = !pt->len && !opt.rfc1991;
     pt->buf = inp;
-    init_packet(&pkt);
     pkt.pkttype = PKT_PLAINTEXT;
     pkt.pkt.plaintext = pt;
     cfx.datalen = filesize && !opt.compress? calc_packet_length( &pkt ) : 0;
index 2c824d2..301cb5e 100644 (file)
@@ -71,10 +71,9 @@ do_export( STRLIST users, int secret )
     memset( &zfx, 0, sizeof zfx);
     init_packet( &pkt );
 
-    if( !(out = open_outfile( NULL, 0 )) ) {
-       rc = G10ERR_CREATE_FILE;
+    if( (rc = open_outfile( NULL, 0, &out )) )
        goto leave;
-    }
+
 
     if( opt.armor ) {
        afx.what = secret?5:1;
index 27cc865..d230ad9 100644 (file)
--- a/g10/g10.c
+++ b/g10/g10.c
 #endif
 
 
+enum cmd_and_opt_values { aNull = 0,
+    oArmor       = 'a',
+    aDetachedSign = 'b',
+    aSym         = 'c',
+    aDecrypt     = 'd',
+    aEncr        = 'e',
+    oKOption     = 'k',
+    oDryRun      = 'n',
+    oOutput      = 'o',
+    oRemote      = 'r',
+    aSign        = 's',
+    oTextmode    = 't',
+    oUser        = 'u',
+    oVerbose     = 'v',
+    oCompress    = 'z',
+    oBatch       = 500,
+    aClearsign   = 539,
+    aStore,
+    aKeygen,
+    aSignEncr,
+    aSignKey,
+    aListPackets,
+    aEditKey,
+    aDeleteKey,
+    aDeleteSecretKey,
+    aKMode,
+    aKModeC,
+    aImport,
+    aVerify,
+    aListKeys,
+    aListSigs,
+    aListSecretKeys,
+    aExport,
+    aExportSecret,
+    aCheckKeys,
+    aGenRevoke,
+    aPrimegen,
+    aPrintMD,
+    aPrintMDs,
+    aCheckTrustDB,
+    aListTrustDB,
+    aListTrustPath,
+    aExportOwnerTrust,
+    aImportOwnerTrust,
+    aDeArmor,
+    aEnArmor,
+    aGenRandom,
+aTest };
+
+
 static ARGPARSE_OPTS opts[] = {
 
     { 300, NULL, 0, N_("@Commands:\n ") },
 
   #ifdef IS_G10
-    { 's', "sign",      256, N_("|[file]|make a signature")},
-    { 539, "clearsign", 256, N_("|[file]|make a clear text signature") },
-    { 'b', "detach-sign", 256, N_("make a detached signature")},
-    { 'e', "encrypt",   256, N_("encrypt data")},
-    { 'c', "symmetric", 256, N_("encryption only with symmetric cipher")},
+    { aSign, "sign",      256, N_("|[file]|make a signature")},
+    { aClearsign, "clearsign", 256, N_("|[file]|make a clear text signature") },
+    { aDetachedSign, "detach-sign", 256, N_("make a detached signature")},
+    { aEncr, "encrypt",   256, N_("encrypt data")},
+    { aSym, "symmetric", 256, N_("encryption only with symmetric cipher")},
     { 507, "store",     256, N_("store only")},
-    { 'd', "decrypt",   256, N_("decrypt data (default)")},
+    { aDecrypt, "decrypt",   256, N_("decrypt data (default)")},
     { 550, "verify"   , 256, N_("verify a signature")},
   #endif
     { 551, "list-keys", 256, N_("list keys")},
@@ -93,17 +143,17 @@ static ARGPARSE_OPTS opts[] = {
 
     { 301, NULL, 0, N_("@\nOptions:\n ") },
 
-    { 'a', "armor",     0, N_("create ascii armored output")},
+    { oArmor, "armor",     0, N_("create ascii armored output")},
   #ifdef IS_G10
-    { 'u', "local-user",2, N_("use this user-id to sign or decrypt")},
-    { 'r', "remote-user", 2, N_("use this user-id for encryption")},
-    { 'z', NULL,        1, N_("|N|set compress level N (0 disables)") },
-    { 't', "textmode",  0, N_("use canonical text mode")},
+    { oUser, "local-user",2, N_("use this user-id to sign or decrypt")},
+    { oRemote, "remote-user", 2, N_("use this user-id for encryption")},
+    { oCompress, NULL,       1, N_("|N|set compress level N (0 disables)") },
+    { oTextmode, "textmode",  0, N_("use canonical text mode")},
   #endif
-    { 'o', "output",    2, N_("use as output file")},
-    { 'v', "verbose",   0, N_("verbose") },
-    { 'n', "dry-run",   0, N_("do not make any changes") },
-    { 500, "batch",     0, N_("batch mode: never ask")},
+    { oOutput, "output",    2, N_("use as output file")},
+    { oVerbose, "verbose",   0, N_("verbose") },
+ /* { oDryRun, "dry-run",   0, N_("do not make any changes") }, */
+    { oBatch, "batch",     0, N_("batch mode: never ask")},
     { 501, "yes",       0, N_("assume yes on most questions")},
     { 502, "no",        0, N_("assume no on most questions")},
     { 509, "keyring"   ,2, N_("add this keyring to the list of keyrings")},
@@ -147,7 +197,7 @@ static ARGPARSE_OPTS opts[] = {
     { 533, "list-trust-path",0, "@"},
   #endif
   #ifdef IS_G10
-    { 'k', NULL,        0, "@"},
+    { oKOption, NULL,   0, "@"},
     { 504, "delete-secret-key",0, "@" },
     { 524, "edit-sig"  ,0, "@"}, /* alias for edit-key */
     { 523, "passphrase-fd",1, "@" },
@@ -173,27 +223,18 @@ static ARGPARSE_OPTS opts[] = {
     { 559, "always-trust", 0, "@"},
     { 562, "emulate-checksum-bug", 0, "@"},
     { 554, "run-as-shm-coprocess", 4, "@" },
-     /* 568 unused */
+    { 568, "set-filename", 2, "@" },
+    { 569, "comment", 2, "@" },
 {0} };
 
 
-enum cmd_values { aNull = 0,
-    aSym, aStore, aEncr, aKeygen, aSign, aSignEncr,
-    aSignKey, aClearsign, aListPackets, aEditKey, aDeleteKey, aDeleteSecretKey,
-    aKMode, aKModeC,  aImport, aVerify, aDecrypt, aListKeys,
-    aListSigs, aListSecretKeys, aExport, aExportSecret,
-    aCheckKeys, aGenRevoke, aPrimegen, aPrintMD, aPrintMDs,
-    aCheckTrustDB, aListTrustDB, aListTrustPath,
-    aExportOwnerTrust, aImportOwnerTrust,
-    aDeArmor, aEnArmor, aGenRandom,
-aTest };
 
 static int maybe_setuid = 1;
 
 static char *build_list( const char *text,
                         const char *(*mapf)(int), int (*chkf)(int) );
-static void set_cmd( enum cmd_values *ret_cmd,
-                       enum cmd_values new_cmd );
+static void set_cmd( enum cmd_and_opt_values *ret_cmd,
+                       enum cmd_and_opt_values new_cmd );
 #ifdef IS_G10MAINT
 static void print_hex( byte *p, size_t n );
 static void print_mds( const char *fname, int algo );
@@ -337,9 +378,9 @@ set_debug(void)
 
 
 static void
-set_cmd( enum cmd_values *ret_cmd, enum cmd_values new_cmd )
+set_cmd( enum cmd_and_opt_values *ret_cmd, enum cmd_and_opt_values new_cmd )
 {
-    enum cmd_values cmd = *ret_cmd;
+    enum cmd_and_opt_values cmd = *ret_cmd;
 
     if( !cmd || cmd == new_cmd )
        cmd = new_cmd;
@@ -383,7 +424,7 @@ main( int argc, char **argv )
     int errors=0;
     int default_keyring = 1;
     int greeting = 1;
-    enum cmd_values cmd = 0;
+    enum cmd_and_opt_values cmd = 0;
     const char *trustdb_name = NULL;
     char *def_cipher_string = NULL;
     char *def_digest_string = NULL;
@@ -478,27 +519,27 @@ main( int argc, char **argv )
                                                &pargs, opts) ) {
        switch( pargs.r_opt ) {
 
-         case 'a': opt.armor = 1; opt.no_armor=0; break;
+         case oArmor: opt.armor = 1; opt.no_armor=0; break;
        #ifdef IS_G10
-         case 'b': detached_sig = 1; set_cmd( &cmd, aSign ); break;
-         case 'c': set_cmd( &cmd, aSym); break;
-         case 'd': set_cmd( &cmd, aDecrypt); break;
-         case 'e': set_cmd( &cmd, aEncr); break;
-         case 'r': /* store the remote users */
+         case aDetachedSign: detached_sig = 1; set_cmd( &cmd, aSign ); break;
+         case aSym: set_cmd( &cmd, aSym); break;
+         case aDecrypt: set_cmd( &cmd, aDecrypt); break;
+         case aEncr: set_cmd( &cmd, aEncr); break;
+         case oRemote: /* store the remote users */
            sl = m_alloc( sizeof *sl + strlen(pargs.r.ret_str));
            strcpy(sl->d, pargs.r.ret_str);
            sl->next = remusr;
            remusr = sl;
            break;
-         case 's': set_cmd( &cmd, aSign );  break;
-         case 't': opt.textmode=1;  break;
-         case 'u': /* store the local users */
+         case aSign: set_cmd( &cmd, aSign );  break;
+         case oTextmode: opt.textmode=1;  break;
+         case oUser: /* store the local users */
            sl = m_alloc( sizeof *sl + strlen(pargs.r.ret_str));
            strcpy(sl->d, pargs.r.ret_str);
            sl->next = locusr;
            locusr = sl;
            break;
-         case 'z': opt.compress = pargs.r.ret_int; break;
+         case oCompress: opt.compress = pargs.r.ret_int; break;
          case 503: set_cmd( &cmd, aKeygen); break;
          case 504: set_cmd( &cmd, aDeleteSecretKey); break;
          case 505: set_cmd( &cmd, aDeleteKey); break;
@@ -508,7 +549,7 @@ main( int argc, char **argv )
          case 524: set_cmd( &cmd, aEditKey); break;
          case 527: def_cipher_string = m_strdup(pargs.r.ret_str); break;
          case 529: def_digest_string = m_strdup(pargs.r.ret_str); break;
-         case 539: set_cmd( &cmd, aClearsign); break;
+         case aClearsign: set_cmd( &cmd, aClearsign); break;
          case 540: secmem_set_flags( secmem_get_flags() | 1 ); break;
          case 542: set_cmd( &cmd, aGenRevoke); break;
          case 550: set_cmd( &cmd, aVerify); break;
@@ -536,12 +577,12 @@ main( int argc, char **argv )
          case 525: set_cmd( &cmd, aImportOwnerTrust); break;
        #endif /* IS_G10MAINT */
 
-         case 'o': opt.outfile = pargs.r.ret_str; break;
-         case 'v': g10_opt_verbose++;
+         case oOutput: opt.outfile = pargs.r.ret_str; break;
+         case oVerbose: g10_opt_verbose++;
                    opt.verbose++; opt.list_sigs=1; break;
-         case 'k': set_cmd( &cmd, aKMode ); break;
+         case oKOption: set_cmd( &cmd, aKMode ); break;
 
-         case 500: opt.batch = 1; greeting = 0; break;
+         case oBatch: opt.batch = 1; greeting = 0; break;
          case 501: opt.answer_yes = 1; break;
          case 502: opt.answer_no = 1; break;
          case 508: set_cmd( &cmd, aCheckKeys); break;
@@ -598,6 +639,8 @@ main( int argc, char **argv )
            log_error("shared memory coprocessing is not available\n");
          #endif
            break;
+         case 568: opt.set_filename = pargs.r.ret_str; break;
+         case 569: opt.comment_string = pargs.r.ret_str; break;
          default : errors++; pargs.err = configfp? 1:2; break;
        }
     }
index 72bb3d9..10899a6 100644 (file)
@@ -71,9 +71,9 @@ static int pk_cache_entries;   /* number of entries in pk cache */
 
 static int lookup( PKT_public_key *pk,
                   int mode,  u32 *keyid, const char *name,
-                  KBNODE *ret_keyblock  );
+                  KBNODE *ret_keyblock, int primary  );
 static int lookup_sk( PKT_secret_key *sk,
-                  int mode,  u32 *keyid, const char *name );
+                  int mode,  u32 *keyid, const char *name, int primary );
 
 /* note this function may be called before secure memory is
  * available
@@ -263,7 +263,7 @@ get_pubkey( PKT_public_key *pk, u32 *keyid )
 
 
     /* do a lookup */
-    rc = lookup( pk, 11, keyid, NULL, NULL );
+    rc = lookup( pk, 11, keyid, NULL, NULL, 0 );
     if( !rc )
        goto leave;
 
@@ -321,15 +321,13 @@ hextobyte( const byte *s )
  *   on the length a short or complete one.
  * - If the username starts with 32,33,40 or 41 hex-digits (the first one
  *   must be in the range 0..9), this is considered a fingerprint.
- *   (Not yet implemented)
  * - If the username starts with a left angle, we assume it is a complete
  *   email address and look only at this part.
  * - If the username starts with a '.', we assume it is the ending
  *   part of an email address
  * - If the username starts with an '@', we assume it is a part of an
  *   email address
- * - If the userid start with an '=' an exact compare is done; this may
- *   also follow the keyid in which case both parts are matched.
+ * - If the userid start with an '=' an exact compare is done.
  * - If the userid starts with a '*' a case insensitive substring search is
  *   done (This is also the default).
  */
@@ -436,16 +434,16 @@ key_byname( int secret,
            sk = m_alloc_clear( sizeof *sk );
            internal++;
        }
-       rc = mode < 16? lookup_sk( sk, mode, keyid, name )
-                     : lookup_sk( sk, mode, keyid, fprint );
+       rc = mode < 16? lookup_sk( sk, mode, keyid, s, 1 )
+                     : lookup_sk( sk, mode, keyid, fprint, 1 );
     }
     else {
        if( !pk ) {
            pk = m_alloc_clear( sizeof *pk );
            internal++;
        }
-       rc = mode < 16? lookup( pk, mode, keyid, name, NULL )
-                     : lookup( pk, mode, keyid, fprint, NULL );
+       rc = mode < 16? lookup( pk, mode, keyid, s, NULL, 1 )
+                     : lookup( pk, mode, keyid, fprint, NULL, 1 );
     }
 
 
@@ -473,7 +471,7 @@ get_pubkey_byfprint( PKT_public_key *pk, const byte *fprint, size_t fprint_len)
     int rc;
 
     if( fprint_len == 20 || fprint_len == 16 )
-       rc = lookup( pk, fprint_len, NULL, fprint, NULL );
+       rc = lookup( pk, fprint_len, NULL, fprint, NULL, 0 );
     else
        rc = G10ERR_GENERAL; /* Oops */
     return rc;
@@ -491,7 +489,7 @@ get_keyblock_byfprint( KBNODE *ret_keyblock, const byte *fprint,
     PKT_public_key *pk = m_alloc_clear( sizeof *pk );
 
     if( fprint_len == 20 || fprint_len == 16 )
-       rc = lookup( pk, fprint_len, NULL, fprint, ret_keyblock );
+       rc = lookup( pk, fprint_len, NULL, fprint, ret_keyblock, 0 );
     else
        rc = G10ERR_GENERAL; /* Oops */
 
@@ -507,7 +505,7 @@ get_seckey( PKT_secret_key *sk, u32 *keyid )
 {
     int rc;
 
-    rc = lookup_sk( sk, 11, keyid, NULL );
+    rc = lookup_sk( sk, 11, keyid, NULL, 0 );
     if( !rc ) {
        /* check the secret key (this may prompt for a passprase to
         * unlock the secret key
@@ -530,7 +528,7 @@ seckey_available( u32 *keyid )
     int rc;
 
     sk = m_alloc_clear( sizeof *sk );
-    rc = lookup_sk( sk, 11, keyid, NULL );
+    rc = lookup_sk( sk, 11, keyid, NULL, 0 );
     free_secret_key( sk );
     return rc;
 }
@@ -549,7 +547,7 @@ get_seckey_byname( PKT_secret_key *sk, const char *name, int unprotect )
     if( !name && opt.def_secret_key && *opt.def_secret_key )
        rc = key_byname( 1, NULL, sk, opt.def_secret_key );
     else if( !name ) /* use the first one as default key */
-       rc = lookup_sk( sk, 15, NULL, NULL );
+       rc = lookup_sk( sk, 15, NULL, NULL, 1 );
     else
        rc = key_byname( 1, NULL, sk, name );
     if( !rc && unprotect )
@@ -587,7 +585,7 @@ compare_name( const char *uid, size_t uidlen, const char *name, int mode )
            if( i < uidlen ) {
                i = se - s;
                if( mode == 3 ) { /* exact email address */
-                   if( strlen(name) == i && !memicmp( s, name, i) )
+                   if( strlen(name)-2 == i && !memicmp( s, name+1, i) )
                        return 0;
                }
                else if( mode == 4 ) {  /* email substring */
@@ -679,7 +677,7 @@ add_stuff_from_selfsig( KBNODE keyblock, KBNODE knode )
  */
 static int
 lookup( PKT_public_key *pk, int mode,  u32 *keyid,
-       const char *name, KBNODE *ret_keyblock )
+       const char *name, KBNODE *ret_keyblock, int primary )
 {
     int rc;
     KBNODE keyblock = NULL;
@@ -705,7 +703,7 @@ lookup( PKT_public_key *pk, int mode,  u32 *keyid,
                    && !compare_name( k->pkt->pkt.user_id->name,
                                      k->pkt->pkt.user_id->len, name, mode)) {
                    /* we found a matching name, look for the key */
-                   for(kk=keyblock; kk; kk = kk->next )
+                   for(kk=keyblock; kk; kk = kk->next ) {
                        if( (    kk->pkt->pkttype == PKT_PUBLIC_KEY
                              || kk->pkt->pkttype == PKT_PUBLIC_SUBKEY )
                            && ( !pk->pubkey_algo
@@ -716,7 +714,8 @@ lookup( PKT_public_key *pk, int mode,  u32 *keyid,
                                       kk->pkt->pkt.public_key->pubkey_algo,
                                                           pk->pubkey_usage ))
                          )
-                       break;
+                           break;
+                   }
                    if( kk ) {
                        u32 aki[2];
                        keyid_from_pk( kk->pkt->pkt.public_key, aki );
@@ -805,9 +804,17 @@ lookup( PKT_public_key *pk, int mode,  u32 *keyid,
        if( k ) { /* found */
            assert(    k->pkt->pkttype == PKT_PUBLIC_KEY
                    || k->pkt->pkttype == PKT_PUBLIC_SUBKEY );
-           copy_public_key_new_namehash( pk, k->pkt->pkt.public_key,
-                                         use_namehash? namehash:NULL);
-           add_stuff_from_selfsig( keyblock, k );
+           assert( keyblock->pkt->pkttype == PKT_PUBLIC_KEY );
+           if( primary && !pk->pubkey_usage ) {
+               copy_public_key_new_namehash( pk, keyblock->pkt->pkt.public_key,
+                                             use_namehash? namehash:NULL);
+               add_stuff_from_selfsig( keyblock, keyblock );
+           }
+           else {
+               copy_public_key_new_namehash( pk, k->pkt->pkt.public_key,
+                                             use_namehash? namehash:NULL);
+               add_stuff_from_selfsig( keyblock, k );
+           }
            if( ret_keyblock ) {
                *ret_keyblock = keyblock;
                keyblock = NULL;
@@ -833,7 +840,8 @@ lookup( PKT_public_key *pk, int mode,  u32 *keyid,
  * Ditto for secret keys
  */
 static int
-lookup_sk( PKT_secret_key *sk, int mode,  u32 *keyid, const char *name )
+lookup_sk( PKT_secret_key *sk, int mode,  u32 *keyid, const char *name,
+          int primary )
 {
     int rc;
     KBNODE keyblock = NULL;
@@ -857,13 +865,19 @@ lookup_sk( PKT_secret_key *sk, int mode,  u32 *keyid, const char *name )
                    && !compare_name( k->pkt->pkt.user_id->name,
                                      k->pkt->pkt.user_id->len, name, mode)) {
                    /* we found a matching name, look for the key */
-                   for(kk=keyblock; kk; kk = kk->next )
+                   for(kk=keyblock; kk; kk = kk->next ) {
                        if( (    kk->pkt->pkttype == PKT_SECRET_KEY
                              || kk->pkt->pkttype == PKT_SECRET_SUBKEY )
                            && ( !sk->pubkey_algo
                                 || sk->pubkey_algo
-                                   == kk->pkt->pkt.secret_key->pubkey_algo))
-                       break;
+                                   == kk->pkt->pkt.secret_key->pubkey_algo)
+                           && ( !sk->pubkey_usage
+                                || !check_pubkey_algo2(
+                                      kk->pkt->pkt.secret_key->pubkey_algo,
+                                                          sk->pubkey_usage ))
+                         )
+                           break;
+                   }
                    if( kk ) {
                        u32 aki[2];
                        keyid_from_sk( kk->pkt->pkt.secret_key, aki );
@@ -936,7 +950,11 @@ lookup_sk( PKT_secret_key *sk, int mode,  u32 *keyid, const char *name )
        if( k ) { /* found */
            assert(    k->pkt->pkttype == PKT_SECRET_KEY
                    || k->pkt->pkttype == PKT_SECRET_SUBKEY );
-           copy_secret_key( sk, k->pkt->pkt.secret_key );
+           assert( keyblock->pkt->pkttype == PKT_SECRET_KEY );
+           if( primary && !sk->pubkey_usage )
+               copy_secret_key( sk, keyblock->pkt->pkt.secret_key );
+           else
+               copy_secret_key( sk, k->pkt->pkt.secret_key );
            break; /* enumeration */
        }
        release_kbnode( keyblock );
index c5eaf9b..73e04cb 100644 (file)
@@ -246,6 +246,7 @@ import_one( const char *fname, KBNODE keyblock )
     KBPOS kbpos;
     u32 keyid[2];
     int rc = 0;
+    int new_key = 0;
 
     /* get the key and print some info about it */
     node = find_kbnode( keyblock, PKT_PUBLIC_KEY );
@@ -279,6 +280,7 @@ import_one( const char *fname, KBNODE keyblock )
     if( !delete_inv_parts( fname, keyblock, keyid ) ) {
        log_info_f( fname, _("key %08lX: no valid user ids\n"),
                                                    (ulong)keyid[1]);
+       log_info(_("this may be caused by a missing self-signature\n"));
        return 0;
     }
 
@@ -307,6 +309,7 @@ import_one( const char *fname, KBNODE keyblock )
        unlock_keyblock( &kbpos );
        /* we are ready */
        log_info_f( fname, _("key %08lX: public key imported\n"), (ulong)keyid[1]);
+       new_key = 1;
     }
     else { /* merge */
        int n_uids, n_sigs, n_subk;
@@ -382,11 +385,11 @@ import_one( const char *fname, KBNODE keyblock )
            log_info_f(fname, _("key %08lX: not changed\n"), (ulong)keyid[1] );
     }
     if( !rc ) {
-       rc = query_trust_record( pk_orig );
+       rc = query_trust_record( new_key? pk : pk_orig );
        if( rc && rc != -1 )
            log_error("trustdb error: %s\n", g10_errstr(rc) );
-       else if( rc == -1 ) {
-           rc = insert_trust_record( pk_orig );
+       else if( rc == -1 ) { /* not found trustdb */
+           rc = insert_trust_record( new_key? pk : pk_orig );
            if( rc )
                log_error("key %08lX: trustdb insert failed: %s\n",
                                        (ulong)keyid[1], g10_errstr(rc) );
index c991be1..a0a6252 100644 (file)
@@ -264,15 +264,11 @@ sign_uids( KBNODE keyblock, STRLIST locusr, int *ret_modified )
             "with your key: \""));
        p = get_user_id( sk_keyid, &n );
        tty_print_string( p, n );
+       m_free(p); p = NULL;
        tty_printf("\"\n\n");
-       m_free(p);
-       p = cpr_get(N_("sign_uid.okay"), _("Really sign? "));
-       cpr_kill_prompt();
-       if( !answer_is_yes(p) ) {
-           m_free(p);
-           continue; /* No */
-       }
-       m_free(p);
+
+       if( !cpr_get_answer_is_yes(N_("sign_uid.okay"), _("Really sign? ")) )
+           continue;;
        /* now we can sign the user ids */
       reloop: /* (must use this, because we are modifing the list) */
        primary_pk = NULL;
@@ -328,6 +324,7 @@ delete_key( const char *username, int secret )
     PKT_secret_key *sk = NULL;
     u32 keyid[2];
     int okay=0;
+    int yes;
 
     /* search the userid */
     rc = secret? find_secret_keyblock_byname( &kbpos, username )
@@ -376,11 +373,11 @@ delete_key( const char *username, int secret )
     if( rc )
        rc = 0;
     else if( opt.batch && secret )
-       log_error(_("can't do that in batch-mode\n"));
+       log_error(_("can't do that in batchmode\n"));
     else if( opt.batch && opt.answer_yes )
        okay++;
     else if( opt.batch )
-       log_error(_("can't do that in batch-mode without \"--yes\"\n"));
+       log_error(_("can't do that in batchmode without \"--yes\"\n"));
     else {
        char *p;
        size_t n;
@@ -400,23 +397,20 @@ delete_key( const char *username, int secret )
        m_free(p);
        tty_printf("\n\n");
 
-       p = cpr_get( secret? N_("delete_key.secret.okay")
+       yes = cpr_get_answer_is_yes( secret? N_("delete_key.secret.okay")
                           : N_("delete_key.okay"),
                              _("Delete this key from the keyring? "));
-       cpr_kill_prompt();
-       if( !cpr_enabled() && secret && answer_is_yes(p)) {
+       if( !cpr_enabled() && secret && yes ) {
            /* I think it is not required to check a passphrase; if
             * the user is so stupid as to let others access his secret keyring
             * (and has no backup) - it is up him to read some very
             * basic texts about security.
             */
-           m_free(p);
-           p = cpr_get(N_("delete_key.secret.okay"),
+           yes = cpr_get_answer_is_yes(N_("delete_key.secret.okay"),
                         _("This is a secret key! - really delete? "));
        }
-       if( answer_is_yes(p) )
+       if( yes )
            okay++;
-       m_free(p);
     }
 
 
@@ -596,7 +590,7 @@ keyedit_menu( const char *username, STRLIST locusr )
 
 
     if( opt.batch ) {
-       log_error(_("can't do that in batch-mode\n"));
+       log_error(_("can't do that in batchmode\n"));
        goto leave;
     }
 
@@ -735,7 +729,7 @@ keyedit_menu( const char *username, STRLIST locusr )
 
          case cmdSIGN: /* sign (only the public key) */
            if( count_uids(keyblock) > 1 && !count_selected_uids(keyblock) ) {
-               if( !cpr_get_answer_is_yes(N_("keyedit.signall.okay"),
+               if( !cpr_get_answer_is_yes(N_("keyedit.sign_all.okay"),
                                           _("Really sign all user ids? ")) ) {
                    tty_printf(_("Hint: Select the user ids to sign\n"));
                    break;
index 90a6c71..afe5bb4 100644 (file)
@@ -444,8 +444,9 @@ ask_keysize( int algo )
        else if( nbits < 768 )
            tty_printf(_("keysize too small; 768 is smallest value allowed.\n"));
        else if( nbits > 2048 && !cpr_enabled() ) {
-           tty_printf(_("Keysizes larger than 2048 are not suggested because "
-                        "computations take REALLY long!\n"));
+           tty_printf(
+               _("Keysizes larger than 2048 are not suggested because\n"
+                 "computations take REALLY long!\n"));
            if( cpr_get_answer_is_yes(N_("keygen.size.huge.okay"),_(
                        "Are you sure that you want this keysize? ")) ) {
                tty_printf(_("Okay, but keep in mind that your monitor "
@@ -625,8 +626,10 @@ ask_user_id( int mode )
        tty_printf(_("You selected this USER-ID:\n    \"%s\"\n\n"), uid);
        /* fixme: add a warning if this user-id already exists */
        for(;;) {
-           char *ansstr = N_("NnCcEeOoQq");
+           char *ansstr = _("NnCcEeOoQq");
 
+           if( strlen(ansstr) != 10 )
+               BUG();
            if( cpr_enabled() ) {
                answer = m_strdup(ansstr+6);
                answer[1] = 0;
index 3493564..2de67cc 100644 (file)
@@ -40,7 +40,7 @@ pubkey_letter( int algo )
       case PUBKEY_ALGO_RSA:    return 'R' ;
       case PUBKEY_ALGO_RSA_E:  return 'r' ;
       case PUBKEY_ALGO_RSA_S:  return 's' ;
-      case PUBKEY_ALGO_ELGAMAL_E:
+      case PUBKEY_ALGO_ELGAMAL_E: return 'g';
       case PUBKEY_ALGO_ELGAMAL: return 'G' ;
       case PUBKEY_ALGO_DSA:    return 'D' ;
       default: return '?';
index 573158a..bba90ef 100644 (file)
@@ -82,7 +82,7 @@ int generate_subkeypair( KBNODE pub_keyblock, KBNODE sec_keyblock );
 
 /*-- openfile.c --*/
 int overwrite_filep( const char *fname );
-IOBUF open_outfile( const char *fname, int mode );
+int   open_outfile( const char *iname, int mode, IOBUF *a );
 IOBUF open_sigfile( const char *iname );
 
 /*-- seskey.c --*/
@@ -124,5 +124,6 @@ int hash_datafiles( MD_HANDLE md, STRLIST files, const char *sigfilename,
 
 /*-- signal.c --*/
 void init_signals(void);
+void pause_on_sigusr( int which );
 
 #endif /*G10_MAIN_H*/
index b8a6825..763ac2f 100644 (file)
@@ -65,19 +65,22 @@ overwrite_filep( const char *fname )
 
 /****************
  * Make an output filename for the inputfile INAME.
- * Returns an IOBUF
+ * Returns an IOBUF and an errorcode
  * Mode 0 = use ".gpg"
  *     1 = use ".asc"
  *     2 = use ".sig"
  */
-IOBUF
-open_outfile( const char *iname, int mode )
+int
+open_outfile( const char *iname, int mode, IOBUF *a )
 {
-    IOBUF a = NULL;
+    int rc = 0;
 
+    *a = NULL;
     if( (!iname || (*iname=='-' && !iname[1])) && !opt.outfile ) {
-       if( !(a = iobuf_create(NULL)) )
+       if( !(*a = iobuf_create(NULL)) ) {
            log_error("can't open [stdout]: %s\n", strerror(errno) );
+           rc = G10ERR_CREATE_FILE;
+       }
        else if( opt.verbose )
            log_info("writing to stdout\n");
     }
@@ -94,14 +97,18 @@ open_outfile( const char *iname, int mode )
            name = buf;
        }
        if( overwrite_filep( name ) ) {
-           if( !(a = iobuf_create( name )) )
+           if( !(*a = iobuf_create( name )) ) {
                log_error("can't create %s: %s\n", name, strerror(errno) );
+               rc = G10ERR_CREATE_FILE;
+           }
            else if( opt.verbose )
                log_info("writing to '%s'\n", name );
        }
+       else
+           rc = G10ERR_FILE_EXISTS;
        m_free(buf);
     }
-    return a;
+    return rc;
 }
 
 
index 630e43f..4c8ec61 100644 (file)
@@ -52,6 +52,8 @@ struct {
     int rfc1991;
     unsigned emulate_bugs; /* bug emulation flags EMUBUG_xxxx */
     int shm_coprocess;
+    const char *set_filename;
+    const char *comment_string;
 } opt;
 
 
index f534cbb..bc7aca5 100644 (file)
@@ -1068,15 +1068,14 @@ parse_key( IOBUF inp, int pkttype, unsigned long pktlen,
                    sk->protect.s2k.count = iobuf_get(inp);
                    pktlen--;
                }
-
            }
            else { /* old version; no S2K, so we set mode to 0, hash MD5 */
                sk->protect.s2k.mode = 0;
                /* We need a kludge to cope with old GNUPG versions */
                sk->protect.s2k.hash_algo =
-                        ( sk->protect.algo == CIPHER_ALGO_BLOWFISH160
-                          && algorithm == PUBKEY_ALGO_ELGAMAL_E ) ?
-                                 DIGEST_ALGO_RMD160 : DIGEST_ALGO_MD5;
+                            ( sk->protect.algo == CIPHER_ALGO_BLOWFISH160
+                              && algorithm == PUBKEY_ALGO_ELGAMAL_E ) ?
+                                     DIGEST_ALGO_RMD160 : DIGEST_ALGO_MD5;
                if( list_mode )
                    printf(  "\tprotect algo: %d  (hash algo: %d)\n",
                         sk->protect.algo, sk->protect.s2k.hash_algo );
index b9f4151..7dbaeb4 100644 (file)
@@ -223,8 +223,9 @@ hash_passphrase( DEK *dek, char *pw, STRING2KEY *s2k, int create )
            count -= len2;
        }
        if( count ) {
-           if( count < 8 )
+           if( count < 8 ) {
                md_write( md, s2k->salt, count );
+           }
            else {
                md_write( md, s2k->salt, 8 );
                count -= 8;
index 59cc9b7..e85b289 100644 (file)
@@ -81,9 +81,17 @@ edit_ownertrust( ulong lid, int mode )
 " 2 = I do NOT trust\n"
 " 3 = I trust marginally\n"
 " 4 = I trust fully\n"
-" s = please show me more information\n\n") );
+" s = please show me more information\n") );
+    if( mode )
+       tty_printf(_(" m = back to the main menu\n"));
+    tty_printf("\n");
 
     for(;;) {
+       /* a string with valid answers */
+       char *ans = _("sSmM");
+
+       if( strlen(ans) != 4 )
+           BUG();
        p = cpr_get(N_("edit_ownertrust.value"),_("Your decision? "));
        trim_spaces(p);
        cpr_kill_prompt();
@@ -102,9 +110,12 @@ edit_ownertrust( ulong lid, int mode )
                changed++;
            break;
        }
-       else if( *p == 's' || *p == 'S' ) {
+       else if( *p == ans[0] || *p == ans[1] ) {
            tty_printf(_("You will see a list of signators etc. here\n"));
        }
+       else if( mode && (*p == ans[2] || *p == ans[3]) ) {
+           break ; /* back to the menu */
+       }
        m_free(p); p = NULL;
     }
     m_free(p);
index c78d79c..278bdca 100644 (file)
@@ -142,10 +142,8 @@ gen_revoke( const char *uname )
     if( !opt.armor )
        tty_printf("ASCII armored output forced.\n");
 
-    if( !(out = open_outfile( NULL, 0 )) ) {
-       rc = G10ERR_CREATE_FILE;
+    if( (rc = open_outfile( NULL, 0, &out )) )
        goto leave;
-    }
 
     afx.what = 1;
     afx.hdrlines = "Comment: A revocation certificate should follow\n";
index 78673df..df5c2b9 100644 (file)
@@ -51,10 +51,12 @@ do_check( PKT_secret_key *sk )
 
        if( sk->protect.algo == CIPHER_ALGO_NONE )
            BUG();
-       if( check_cipher_algo( sk->protect.algo ) )
-           return G10ERR_CIPHER_ALGO; /* unsupported protection algorithm */
-       if( cipher_get_blocksize( sk->protect.algo ) != 8 )
-           return G10ERR_CIPHER_ALGO; /* unsupported protection algorithm */
+       if( check_cipher_algo( sk->protect.algo )
+           || cipher_get_blocksize( sk->protect.algo  ) != 8 ) {
+           log_info(_("protection algorithm %d is not supported\n"),
+                       sk->protect.algo );
+           return G10ERR_CIPHER_ALGO;
+       }
        keyid_from_sk( sk, keyid );
        dek = passphrase_to_dek( keyid, sk->protect.algo,
                                 &sk->protect.s2k, 0 );
@@ -164,21 +166,6 @@ check_secret_key( PKT_secret_key *sk )
        if( i )
            log_error(_("Invalid passphrase; please try again ...\n"));
        rc = do_check( sk );
-      #if 0 /* set to 1 to enable the workaround */
-       if( rc == G10ERR_BAD_PASS && sk->is_protected
-           && sk->protect.algo == CIPHER_ALGO_BLOWFISH
-           && sk->pubkey_algo != PUBKEY_ALGO_ELGAMAL ) {
-           /* Workaround for a bug in 0.2.16 which still used
-            * a 160 bit key for BLOWFISH. */
-           log_info("trying workaround for 0.2.16 passphrase bug ...\n");
-           log_info("If you don't need this, uncomment it in g10/seckey-cert.c\n\n");
-           sk->protect.algo = CIPHER_ALGO_BLOWFISH160;
-           rc = do_check( sk );
-           if( rc )
-               rc = G10ERR_BAD_PASS;
-           sk->protect.algo = CIPHER_ALGO_BLOWFISH;
-       }
-      #endif
        if( get_passphrase_fd() != -1 )
            break;
     }
index a5034c7..d3f49e1 100644 (file)
@@ -156,6 +156,7 @@ sign_file( STRLIST filenames, int detached, STRLIST locusr,
     int compr_algo = -1; /* unknown */
 
 
+
     memset( &afx, 0, sizeof afx);
     memset( &zfx, 0, sizeof zfx);
     memset( &mfx, 0, sizeof mfx);
@@ -203,10 +204,8 @@ sign_file( STRLIST filenames, int detached, STRLIST locusr,
        else if( opt.verbose )
            log_info("writing to '%s'\n", outfile );
     }
-    else if( !(out = open_outfile( fname, opt.armor? 1: detached? 2:0 )) ) {
-       rc = G10ERR_CREATE_FILE;
+    else if( (rc = open_outfile( fname, opt.armor? 1: detached? 2:0, &out )))
        goto leave;
-    }
 
     /* prepare to calculate the MD over the input */
     if( opt.textmode && !outfile )
@@ -223,9 +222,12 @@ sign_file( STRLIST filenames, int detached, STRLIST locusr,
 
     if( opt.armor && !outfile  )
        iobuf_push_filter( out, armor_filter, &afx );
-    else
+    else {
        write_comment( out, "#created by GNUPG v" VERSION " ("
                                            PRINTABLE_OS_NAME ")");
+       if( opt.comment_string )
+           write_comment( out, opt.comment_string );
+    }
     if( encrypt ) {
        efx.pk_list = pk_list;
        /* fixme: set efx.cfx.datalen if known */
@@ -312,10 +314,17 @@ sign_file( STRLIST filenames, int detached, STRLIST locusr,
        }
     }
     else {
+       if( fname || opt.set_filename ) {
+           const char *s = opt.set_filename ? opt.set_filename : fname;
+           pt = m_alloc( sizeof *pt + strlen(s) - 1 );
+           pt->namelen = strlen(s);
+           memcpy(pt->name, s, pt->namelen );
+       }
+       else { /* no filename */
+           pt = m_alloc( sizeof *pt - 1 );
+           pt->namelen = 0;
+       }
        if( fname ) {
-           pt = m_alloc( sizeof *pt + strlen(fname) - 1 );
-           pt->namelen = strlen(fname);
-           memcpy(pt->name, fname, pt->namelen );
            if( !(filesize = iobuf_get_filelength(inp)) )
                log_info("warning: '%s' is an empty file\n", fname );
 
@@ -329,11 +338,8 @@ sign_file( STRLIST filenames, int detached, STRLIST locusr,
            if( opt.textmode && !outfile )
                filesize = 0;
        }
-       else { /* no filename */
-           pt = m_alloc( sizeof *pt - 1 );
-           pt->namelen = 0;
+       else
            filesize = 0; /* stdin */
-       }
        pt->timestamp = make_timestamp();
        pt->mode = opt.textmode && !outfile ? 't':'b';
        pt->len = filesize;
@@ -533,10 +539,8 @@ clearsign_file( const char *fname, STRLIST locusr, const char *outfile )
        else if( opt.verbose )
            log_info("writing to '%s'\n", outfile );
     }
-    else if( !(out = open_outfile( fname, 1 )) ) {
-       rc = G10ERR_CREATE_FILE;
+    else if( (rc = open_outfile( fname, 1, &out )) )
        goto leave;
-    }
 
     iobuf_writestr(out, "-----BEGIN PGP SIGNED MESSAGE-----\n" );
 
index 6eb0749..3c22c0d 100644 (file)
@@ -286,10 +286,26 @@ cpr_kill_prompt(void)
 int
 cpr_get_answer_is_yes( const char *keyword, const char *prompt )
 {
+    int yes;
+    char *p;
+
   #ifdef USE_SHM_COPROCESSING
     if( opt.shm_coprocess )
        return !!do_shm_get( keyword, 0, 1 );
   #endif
-    return tty_get_answer_is_yes( prompt );
+    for(;;) {
+       p = tty_get( prompt );
+       trim_spaces(p); /* it is okay to do this here */
+       if( *p == '?' && !p[1] ) {
+           m_free(p);
+           display_help( keyword );
+       }
+       else {
+           tty_kill_prompt();
+           yes = answer_is_yes(p);
+           m_free(p);
+           return yes;
+       }
+    }
 }
 
index cc94ad8..642d1b5 100644 (file)
@@ -1617,6 +1617,11 @@ check_trust( PKT_public_key *pk, unsigned *r_trustlevel )
            }
            log_info(_("key %08lX.%lu: inserted into trustdb\n"),
                                          keyid[1], pk->local_id );
+           /* and re-read the dir record */
+           if( tdbio_read_record( pk->local_id, &rec, RECTYPE_DIR ) ) {
+               log_error("check_trust: reread dir record failed\n");
+               return G10ERR_TRUSTDB;
+           }
        }
     }
     cur_time = make_timestamp();
index 1633478..b1182ba 100644 (file)
@@ -61,6 +61,7 @@
 #define G10ERR_UNEXPECTED     39
 #define G10ERR_TIME_CONFLICT  40
 #define G10ERR_WR_PUBKEY_ALGO 41 /* unusabe pubkey algo */
+#define G10ERR_FILE_EXISTS    42
 
 
 #ifndef HAVE_STRERROR
index d374839..61c1c97 100644 (file)
@@ -1,3 +1,7 @@
+Tue Aug 11 12:28:11 1998  Werner Koch  (wk@(none))
+
+       * it.po: New file from Marco.
+
 Thu Jul  9 21:14:51 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
        * de.po: Fixed typos and added new translations.
index ffb9ff3..bce0769 100644 (file)
@@ -4,6 +4,7 @@
 # utility
 util/secmem.c
 util/argparse.c
+util/miscutil.c
 
 # cipher
 cipher/random.c
@@ -32,6 +33,6 @@ g10/trustdb.c
 g10/verify.c
 g10/status.c
 g10/pubkey-enc.c
-
+g10/openfile.c
 
 #---end--
index 85b2077..32fecfe 100644 (file)
--- a/po/de.po
+++ b/po/de.po
@@ -13,6 +13,15 @@ msgstr ""
 "(Um dies zu vermeiden, kann das Programm suid(root) installiert werden;\n"
 " bitte wenden Sie sich hierzu an den Systemadministrator.)\n"
 
+#: util/miscutil.c:87
+msgid  "yes"
+msgstr "ja"
+
+#: util/miscutil.c:88
+msgid  "yY"
+msgstr "jJ"
+
+
 #: cipher/rand-dummy.c:106
 msgid "warning: using insecure random number generator!!\n"
 msgstr "Der Zufallszahlengenerator erzeugt keine sicheren Zufallszahlen!\n"
@@ -467,7 +476,6 @@ msgid ""
 " 3 = I trust marginally\n"
 " 4 = I trust fully\n"
 " s = please show me more information\n"
-"\n"
 msgstr ""
 "\"\n"
 "\n"
@@ -480,7 +488,14 @@ msgstr ""
 " 3 = Ich vertraue ihm normalerweise\n"
 " 4 = Ich vertraue ihm immer\n"
 " s = Bitte weitere Information anzeigen\n"
-"\n"
+
+msgid  " m = back to the main menu\n"
+msgstr " m = Zurück zum Menü\n"
+
+# valid user replies (not including 1..4)
+msgid  "sSmM"
+msgstr "sSmM"
+
 
 #: g10/pkclist.c:84
 msgid "Your decision? "
@@ -517,6 +532,11 @@ msgid ""
 "\n"
 msgstr "Keine \"Owner trust\" Werte ge\344ndert.\n"
 
+#: g10/pkclist.c:186 g10/pkclist.c:273
+msgid "Use this key anyway? "
+msgstr "Den Schlüssel trotzdem benutzen?"
+
+
 #: g10/pkclist.c:268
 msgid ""
 "It is NOT certain that the key belongs to its owner.\n"
@@ -719,7 +739,7 @@ msgstr "Der Schl\374ssel verf\344llt am %s\n"
 
 #: g10/keygen.c:528
 msgid "Is this correct (y/n)? "
-msgstr "Ist dies richtig? (y/n) "
+msgstr "Ist dies richtig? (j/n) "
 
 #: g10/keygen.c:557
 msgid ""
@@ -923,7 +943,7 @@ msgstr "Sch\374ssel %08lX: \326ffentlicher Schl
 
 #: g10/import.c:317
 msgid "key %08lX: doesn't match our copy\n"
-msgstr "Sch\374ssel %08lX: Stimmt nicht mit unserer Kopie \374berein"
+msgstr "Sch\374ssel %08lX: Stimmt nicht mit unserer Kopie \374berein\n"
 
 #: g10/import.c:330 g10/import.c:501
 msgid "key %08lX: can't locate original keyblock: %s\n"
@@ -1116,11 +1136,11 @@ msgid "use option \"--delete-secret-key\" to delete it first.\n"
 msgstr "Benutzen Sie das Kommando \"--delete-decret-key\", um ihn vorab zu entfernen.\n"
 
 #: g10/keyedit.c:508
-msgid "can't do that in batch-mode\n"
+msgid "can't do that in batchmode\n"
 msgstr "Dies kann im Batchmodus nicht durchgef\374hrt werden.\n"
 
 #: g10/keyedit.c:512
-msgid "can't do that in batch-mode without \"--yes\"\n"
+msgid "can't do that in batchmode without \"--yes\"\n"
 msgstr "Dies kann im Batchmodus ohne \"--yes\" nicht durchgef\374hrt werden.\n"
 
 #: g10/keyedit.c:532
@@ -1287,3 +1307,29 @@ msgstr ""
 msgid "keyedit.cmd"
 msgstr "Geben Sie bitte \"help\" ein."
 
+#: g10/status.c:207
+msgid "No help available"
+msgstr "Keine Hilfe vorhanden."
+
+#: g10/status.c:213
+msgid "No help available for '%s'"
+msgstr "Keine Hilfe für '%s' vorhanden."
+
+#: g10/pubkey-enc.c:138
+msgid "note: cipher algorithm %d not found in preferences\n"
+msgstr ""
+"Hinweis: Algorithmus %d ist kein bevorzugtes Verschlüsselungsverfahren\n"
+
+
+#: g10/openfile.c:58
+msgid "File '%s' exists. "
+msgstr "Datei '%s' exsitier bereits. "
+
+#: g10/openfile.c:59
+msgid "openfile.overwrite.okay"
+msgstr "Geben Sie \"ja\" ein, wenn Sie die Datei überschreiben möchten"
+
+#: g10/openfile.c:60
+msgid "Overwrite (y/N)? "
+msgstr "Überschreiben (j/N)? "
+
index a7aaf45..99654ca 100644 (file)
--- a/po/en.po
+++ b/po/en.po
@@ -104,7 +104,7 @@ msgid "keyedit.cancel.okay"
 msgstr ""
 
 #: g10/keyedit.c:738
-msgid "keyedit.signall.okay"
+msgid "keyedit.sign_all.okay"
 msgstr ""
 
 #: g10/keyedit.c:772
index 64755f5..5d5e516 100644 (file)
--- a/po/it.po
+++ b/po/it.po
@@ -1,17 +1,55 @@
 msgid ""
 msgstr ""
-"POT-Creation-Date: 1998-06-25 22:06+0200\n"
+"POT-Creation-Date: 1998-08-09 11:28+0200\n"
 "Content-Type: text/plain; charset=iso-8859-1\n"
 "Date: 1998-03-07 12:16:14+0100\n"
 "From: Marco d'Itri <md@linux.it>\n"
-"Xgettext-Options: --default-domain=gnupg --directory=.. --add-comments --keyword=_ --keyword=N_ --files-from=./POTFILES.in\n"
+"Xgettext-Options: --default-domain=gnupg --directory=.. --add-comments "
+"--keyword=_ --keyword=N_ --files-from=./POTFILES.in\n"
 "Files: util/secmem.c cipher/random.c g10/g10.c g10/pkclist.c g10/keygen.c\n"
 
-#: util/secmem.c:180
+#: util/secmem.c:191
 msgid "Warning: using insecure memory!\n"
 msgstr "Attenzione: si sta usando memoria insicura!\n"
 
-#: g10/g10.c:51
+
+#: util/miscutil.c:87
+msgid  "yes"
+msgstr "sì"
+
+#: util/miscutil.c:88
+msgid  "yY"
+msgstr "sS"
+
+
+
+#: cipher/rand-dummy.c:106
+msgid "warning: using insecure random number generator!!\n"
+msgstr ""
+"Attenzione: si sta usando un generatore di numeri casuali non sicuro!!\n"
+
+#: cipher/rand-dummy.c:107
+msgid ""
+"The random number generator is only a kludge to let\n"
+"it compile - it is in no way a strong RNG!\n"
+"\n"
+"DON'T USE ANY DATA GENERATED BY THIS PROGRAM!!\n"
+"\n"
+msgstr "Il generatore di numeri casuali è solo un ripiego per fare\n"
+"compilare il programma - non è assolutamente un RNG forte!\n"
+
+#: cipher/rand-unix.c:149
+#, c-format
+msgid ""
+"\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"
+msgstr "\n"
+"Non ci sono abbastanza byte casuali disponibili. Per favore fai qualche\n"
+"altra cosa per dare all'OS la possibilità di raccogliere altra entropia!\n"
+"(Servono ancora %d altri byte)\n"
+
+#: g10/g10.c:52
 msgid ""
 "@Commands:\n"
 " "
@@ -19,87 +57,75 @@ msgstr ""
 "@Comandi:\n"
 " "
 
-#: g10/g10.c:54
+#: g10/g10.c:55
 msgid "|[file]|make a signature"
 msgstr "|[file]|fai una firma"
 
-#: g10/g10.c:55
+#: g10/g10.c:56
 msgid "|[file]|make a clear text signature"
 msgstr "|[file]|fai una firma mantenendo il testo in chiaro"
 
-#: g10/g10.c:56
+#: g10/g10.c:57
 msgid "make a detached signature"
 msgstr "fai una firma separata"
 
-#: g10/g10.c:57
+#: g10/g10.c:58
 msgid "encrypt data"
 msgstr "cifra dati"
 
-#: g10/g10.c:58
+#: g10/g10.c:59
 msgid "encryption only with symmetric cipher"
 msgstr "cifra solo con un cifrario simmetrico"
 
-#: g10/g10.c:59
+#: g10/g10.c:60
 msgid "store only"
 msgstr "immagazzina soltanto"
 
-#: g10/g10.c:60
+#: g10/g10.c:61
 msgid "decrypt data (default)"
 msgstr "decifra dati (predefinito)"
 
-#: g10/g10.c:61
+#: g10/g10.c:62
 msgid "verify a signature"
 msgstr "verifica una firma"
 
-#: g10/g10.c:63
+#: g10/g10.c:64
 msgid "list keys"
 msgstr "elenca le chiavi"
 
-#: g10/g10.c:64
+#: g10/g10.c:65
 msgid "list keys and signatures"
 msgstr "elenca le chiavi e le firme"
 
-#: g10/g10.c:65
+#: g10/g10.c:66
 msgid "check key signatures"
 msgstr "controlla le firme delle chiavi"
 
-#: g10/g10.c:66
+#: g10/g10.c:67
 msgid "list keys and fingerprints"
 msgstr "elenca le chiavi e le impronte digitali"
 
-#: g10/g10.c:67
+#: g10/g10.c:68
 msgid "list secret keys"
 msgstr "elenca le chiavi segrete"
 
-#: g10/g10.c:69
+#: g10/g10.c:70
 msgid "generate a new key pair"
 msgstr "genera una nuova coppia di chiavi"
 
-#: g10/g10.c:70
-msgid "add a subkey to a key pair"
-msgstr "aggiungi una sottochiave a una coppia di chiavi"
-
 #: g10/g10.c:71
-msgid "make a signature on a key in the keyring"
-msgstr "firma una chiave nel portachiavi"
-
-#: g10/g10.c:72
 msgid "remove key from the public keyring"
 msgstr "rimuove una chiave dal portachiavi pubblico"
 
-#: g10/g10.c:73
-msgid "edit a key signature"
-msgstr "modifica la firma di una chiave"
-
-#: g10/g10.c:74
-msgid "change the passphrase of your secret keyring"
-msgstr "cambia la passphrase del tuo portachiavi segreto"
+#: g10/g10.c:72
+msgid "sign or edit a key"
+msgstr "firma o modifica una chiave"
 
-#: g10/g10.c:75
+#: g10/g10.c:73
 msgid "generate a revocation certificate"
 msgstr "genera un certificato di revoca"
 
-#: g10/g10.c:77
+#: g10/g10.c:75
 msgid "export keys"
 msgstr "esporta delle chiavi"
 
@@ -112,22 +138,34 @@ msgid "list only the sequence of packets"
 msgstr "elenca solo la sequenza dei pacchetti"
 
 #: g10/g10.c:81
+msgid "export the ownertrust values"
+msgstr "esporta i valori di fiducia"
+
+#: g10/g10.c:82
+msgid "import ownertrust values"
+msgstr "importa i valori di fiducia"
+
+#: g10/g10.c:83
+msgid "|[NAMES]|check the trust database"
+msgstr "|[NAMES]|controlla il TrustDB"
+
+#: g10/g10.c:84
 msgid "De-Armor a file or stdin"
 msgstr "rimuovi l'armatura a un file o a stdin"
 
-#: g10/g10.c:82
+#: g10/g10.c:85
 msgid "En-Armor a file or stdin"
 msgstr "crea l'armatura a un file o a stdin"
 
-#: g10/g10.c:83
+#: g10/g10.c:86
 msgid "|algo [files]|print message digests"
 msgstr "|algo [files]|stampa tutti i message digests"
 
-#: g10/g10.c:84
+#: g10/g10.c:87
 msgid "print all message digests"
 msgstr "stampa tutti i message digests"
 
-#: g10/g10.c:89
+#: g10/g10.c:94
 msgid ""
 "@\n"
 "Options:\n"
@@ -137,111 +175,111 @@ msgstr ""
 "Opzioni:\n"
 " "
 
-#: g10/g10.c:91
+#: g10/g10.c:96
 msgid "create ascii armored output"
 msgstr "crea un output ascii con armatura"
 
-#: g10/g10.c:93
+#: g10/g10.c:98
 msgid "use this user-id to sign or decrypt"
 msgstr "usa questo user-id per firmare o decifrare"
 
-#: g10/g10.c:94
+#: g10/g10.c:99
 msgid "use this user-id for encryption"
 msgstr "usa questo user-id per cifrare"
 
-#: g10/g10.c:95
+#: g10/g10.c:100
 msgid "|N|set compress level N (0 disables)"
 msgstr "|N|imposta il livello di compressione (0 disabilita)"
 
-#: g10/g10.c:96
+#: g10/g10.c:101
 msgid "use canonical text mode"
 msgstr "usa il modo testo canonico"
 
-#: g10/g10.c:98
+#: g10/g10.c:103
 msgid "use as output file"
 msgstr "usa come file di output"
 
-#: g10/g10.c:99
+#: g10/g10.c:104
 msgid "verbose"
 msgstr "prolisso"
 
-#: g10/g10.c:100
+#: g10/g10.c:105
 msgid "do not make any changes"
 msgstr "non fare cambiamenti"
 
-#: g10/g10.c:101
+#: g10/g10.c:106
 msgid "batch mode: never ask"
 msgstr "modo batch: non fare domande"
 
-#: g10/g10.c:102
+#: g10/g10.c:107
 msgid "assume yes on most questions"
-msgstr "assumi \"s\354\" a quasi tutte le domande"
+msgstr "assumi \"sì\" a quasi tutte le domande"
 
-#: g10/g10.c:103
+#: g10/g10.c:108
 msgid "assume no on most questions"
 msgstr "assumi \"no\" a quasi tutte le domande"
 
-#: g10/g10.c:104
+#: g10/g10.c:109
 msgid "add this keyring to the list of keyrings"
 msgstr "aggiungi questo portachiavi alla lista"
 
-#: g10/g10.c:105
+#: g10/g10.c:110
 msgid "add this secret keyring to the list"
 msgstr "aggiungi questo portachiavi segreto alla lista"
 
-#: g10/g10.c:106
+#: g10/g10.c:111
+msgid "|NAME|use NAME as default secret key"
+msgstr "|NOME|usa NOME come chiave segreta predefinita"
+
+#: g10/g10.c:112
 msgid "read options from file"
 msgstr "leggi le opzioni dal file"
 
-#: g10/g10.c:108
+#: g10/g10.c:114
 msgid "set debugging flags"
 msgstr "imposta i flag di debugging"
 
-#: g10/g10.c:109
+#: g10/g10.c:115
 msgid "enable full debugging"
 msgstr "abilita il debugging completo"
 
-#: g10/g10.c:110
+#: g10/g10.c:116
 msgid "|FD|write status info to this FD"
 msgstr "|FD|scrivi le informazioni di stato su questo fd"
 
-#: g10/g10.c:111
+#: g10/g10.c:117
 msgid "do not write comment packets"
 msgstr "non scrivere pacchetti di commento"
 
-#: g10/g10.c:112
+#: g10/g10.c:118
 msgid "(default is 1)"
-msgstr "(predefinito \350 1)"
+msgstr "(predefinito è 1)"
 
-#: g10/g10.c:113
+#: g10/g10.c:119
 msgid "(default is 3)"
-msgstr "(predefinito \350 3)"
+msgstr "(predefinito è 3)"
 
-#: g10/g10.c:114
+#: g10/g10.c:120
 msgid "|file|load extension module"
 msgstr "|file|carica un modulo di estensione"
 
-#: g10/g10.c:115
+#: g10/g10.c:121
 msgid "emulate the mode described in RFC1991"
 msgstr "emula il modo descritto nel RFC1991"
 
-#: g10/g10.c:117
+#: g10/g10.c:123
 msgid "|NAME|use cipher algorithm NAME"
-msgstr "|NAME|seleziona l'algoritmo di cifratura predefinito"
-
-#: g10/g10.c:118
-msgid "|NAME|use public key algorithm NAME"
-msgstr "|NAME|seleziona l'algoritmo a chiave pubblica predefinito"
+msgstr "|NAME|usa l'algoritmo di cifratura NOME"
 
-#: g10/g10.c:119
+#: g10/g10.c:124
 msgid "|NAME|use message digest algorithm NAME"
-msgstr "|NAME|seleziona l'algoritmo di message digest predefinito"
+msgstr "|NAME|usa l'algoritmo di message digest NOME"
 
-#: g10/g10.c:120
+#: g10/g10.c:125
 msgid "|N|use compress algorithm N"
 msgstr "|N|usa l'algoritmo di compressione N"
 
-#: g10/g10.c:129
+#: g10/g10.c:133
 msgid ""
 "@\n"
 "Examples:\n"
@@ -261,19 +299,19 @@ msgstr ""
 " -k   [userid]              mostra le chiavi\n"
 " -kc  [userid]              mostra le impronte digitali\n"
 
-#: g10/g10.c:210
+#: g10/g10.c:218
 msgid "Please report bugs to <gnupg-bugs@gnu.org>.\n"
 msgstr "Per favore segnala i bug a <gnupg-bugs@gnu.org>.\n"
 
-#: g10/g10.c:215
+#: g10/g10.c:223
 msgid "Usage: gpgm [options] [files] (-h for help)"
 msgstr "Uso: gpgm [opzioni] [file] (-h per l'aiuto)"
 
-#: g10/g10.c:217
+#: g10/g10.c:225
 msgid "Usage: gpg [options] [files] (-h for help)"
 msgstr "Uso: gpg [opzioni] [file] (-h per l'aiuto)"
 
-#: g10/g10.c:222
+#: g10/g10.c:230
 msgid ""
 "Syntax: gpgm [options] [files]\n"
 "GNUPG maintenance utility\n"
@@ -281,7 +319,7 @@ msgstr ""
 "Sintassi: gpgm [opzioni] [file]\n"
 "Utility di manutenzione di GNUPG\n"
 
-#: g10/g10.c:225
+#: g10/g10.c:233
 msgid ""
 "Syntax: gpg [options] [files]\n"
 "sign, check, encrypt or decrypt\n"
@@ -291,161 +329,161 @@ msgstr ""
 "firma, controlla, cifra o decifra\n"
 "l'operazione predefinita dipende dai dati di input\n"
 
-#: g10/g10.c:302
+#: g10/g10.c:313
 msgid "usage: gpgm [options] "
 msgstr "uso: gpgm [options] "
 
-#: g10/g10.c:304
+#: g10/g10.c:315
 msgid "usage: gpg [options] "
 msgstr "uso: gpg [options] "
 
-#: g10/g10.c:345
+#: g10/g10.c:356
 msgid "conflicting commands\n"
 msgstr "comandi in conflitto\n"
 
-#: g10/g10.c:358
-msgid "selected cipher algorithm is invalid\n"
-msgstr "l'algoritmo di cifratura selezionato non \350 valido\n"
+# , c-format
+#: g10/g10.c:462
+#, c-format
+msgid "note: no default option file '%s'\n"
+msgstr "nota: nessun file con opzioni predefinite '%s'\n"
 
-#: g10/g10.c:360
-msgid "selected pubkey algorithm is invalid\n"
-msgstr "l'algoritmo a chiave pubblica selezionato non \350 valido\n"
+# , c-format
+#: g10/g10.c:466
+#, c-format
+msgid "option file '%s': %s\n"
+msgstr "file con opzioni predefinite '%s': %s\n"
 
-#: g10/g10.c:362
+# , c-format
+#: g10/g10.c:473
+#, c-format
+msgid "reading options from '%s'\n"
+msgstr "lettura delle opzioni da '%s'\n"
+
+#: g10/g10.c:644
+msgid "selected cipher algorithm is invalid\n"
+msgstr "l'algoritmo di cifratura selezionato non è valido\n"
+
+#: g10/g10.c:650
 msgid "selected digest algorithm is invalid\n"
-msgstr "l'algoritmo di digest selezionato non \350 valido\n"
+msgstr "l'algoritmo di digest selezionato non è valido\n"
 
 # , c-format
-#: g10/g10.c:364
+#: g10/g10.c:653
+#, c-format
 msgid "compress algorithm must be in range %d..%d\n"
 msgstr "l'algoritmo di compressione deve essere tra %d e %d\n"
 
-#: g10/g10.c:366
+#: g10/g10.c:655
 msgid "completes-needed must be greater than 0\n"
 msgstr "completes-needed deve essere maggiore di 0\n"
 
-#: g10/g10.c:368
+#: g10/g10.c:657
 msgid "marginals-needed must be greater than 1\n"
 msgstr "marginals-needed deve essere maggiore di 1\n"
 
 # , c-format
-#: g10/g10.c:465
-msgid "note: no default option file '%s'\n"
-msgstr "nota: nessun file con opzioni predefinite '%s'\n"
-
-# , c-format
-#: g10/g10.c:469
-msgid "option file '%s': %s\n"
-msgstr "file con opzioni predefinite '%s': %s\n"
-
-# , c-format
-#: g10/g10.c:476
-msgid "reading options from '%s'\n"
-msgstr "lettura delle opzioni da '%s'\n"
-
-# , c-format
-#: g10/g10.c:696
+#: g10/g10.c:740
+#, c-format
 msgid "failed to initialize the TrustDB: %s\n"
-msgstr "inizializzazione del TrustDB fallita: %s\n"
+msgstr "inizializzazione del trustdb fallita: %s\n"
 
-#: g10/g10.c:702
+#: g10/g10.c:746
 msgid "--store [filename]"
 msgstr "--store [nomefile]"
 
-#: g10/g10.c:710
+#: g10/g10.c:754
 msgid "--symmetric [filename]"
 msgstr "--symmetric [nomefile]"
 
-#: g10/g10.c:718
+#: g10/g10.c:762
 msgid "--encrypt [filename]"
 msgstr "--encrypt [nomefile]"
 
-#: g10/g10.c:731
+#: g10/g10.c:775
 msgid "--sign [filename]"
 msgstr "--sign [nomefile]"
 
-#. sign and encrypt the given file
-#: g10/g10.c:744
+#: g10/g10.c:788
 msgid "--sign --encrypt [filename]"
 msgstr "--sign --encrypt [nomefile]"
 
-#: g10/g10.c:758
+#: g10/g10.c:802
 msgid "--clearsign [filename]"
 msgstr "--clearsign [nomefile]"
 
-#: g10/g10.c:770
+#: g10/g10.c:814
 msgid "--decrypt [filename]"
 msgstr "--decrypt [nomefile]"
 
-#: g10/g10.c:778
-msgid "--sign-key username"
-msgstr ""
-
-#. Edit a key signature
-#: g10/g10.c:786
-msgid "--edit-sig username"
-msgstr ""
+#: g10/g10.c:823
+msgid "--edit-key username"
+msgstr "--edit-key nomeutente"
 
-#: g10/g10.c:794
+#: g10/g10.c:829
 msgid "--delete-secret-key username"
-msgstr ""
+msgstr "--delete-secret-key nomeutente"
 
-#: g10/g10.c:797
+#: g10/g10.c:832
 msgid "--delete-key username"
-msgstr ""
-
-#: g10/g10.c:805
-msgid "--change-passphrase [username]"
-msgstr ""
+msgstr "--delete-key nomeutente"
 
 # , c-format
-#. -kv userid keyring
-#: g10/g10.c:829
+#: g10/encode.c:203 g10/g10.c:856 g10/keylist.c:79
+#, c-format
 msgid "can't open %s: %s\n"
 msgstr "impossibile aprire '%s': %s\n"
 
-#: g10/g10.c:840
+#: g10/g10.c:867
 msgid "-k[v][v][v][c] [userid] [keyring]"
 msgstr "-k[v][v][v][c] [userid] [portachiavi]"
 
 # , c-format
-#: g10/g10.c:892
+#: g10/g10.c:922
+#, c-format
 msgid "dearmoring failed: %s\n"
 msgstr "rimozione dell'armatura fallita: %s\n"
 
 # , c-format
-#: g10/g10.c:900
+#: g10/g10.c:930
+#, c-format
 msgid "enarmoring failed: %s\n"
 msgstr "creazione dell'armatura fallita: %s\n"
 
 # , c-format
-#: g10/g10.c:956
+#: g10/g10.c:991
+#, c-format
 msgid "invalid hash algorithm '%s'\n"
-msgstr ""
+msgstr "algoritmo di hash non valido '%s'\n"
 
-#: g10/g10.c:1006
+#: g10/g10.c:1061
 msgid "[filename]"
 msgstr "[nomefile]"
 
 # , c-format
-#: g10/g10.c:1008
+#: g10/decrypt.c:59 g10/g10.c:1063 g10/verify.c:66
+#, c-format
 msgid "can't open '%s'\n"
 msgstr "impossibile aprire '%s'\n"
 
-# #### Md ???
+#: g10/g10.c:1108
+msgid ""
+"RSA keys are deprecated; please consider creating a new key and use this key "
+"in the future\n"
+msgstr ""
+"L'uso di chiavi RSA è deprecato; per favore in futuro considera di creare e\n"
+"usare una nuova chiave.\n"
+
 # , c-format
-#: g10/pkclist.c:65
+#: g10/pkclist.c:67
 msgid ""
-"No ownertrust defined for %lu:\n"
+"No owner trust defined for %lu:\n"
 "%4u%c/%08lX %s \""
 msgstr ""
 "Nessun valore di fiducia del proprietario definito per %lu:\n"
 "%4u%c/%08lX %s \""
 
-#: g10/pkclist.c:72
+#: g10/pkclist.c:77
 msgid ""
-"\"\n"
-"\n"
 "Please decide how far you trust this user to correctly\n"
 "verify other users' keys (by looking at passports,\n"
 "checking fingerprints from different sources...)?\n"
@@ -455,12 +493,9 @@ msgid ""
 " 3 = I trust marginally\n"
 " 4 = I trust fully\n"
 " s = please show me more information\n"
-"\n"
 msgstr ""
-"\"\n"
-"\n"
-"Per favore decidi quanto hai fiducia di questo utente perch\350 firmi\n"
-"correttamente le chiavi di altri utenti (guardando il suo passaporto,\n"
+"Per favore decidi quanto hai fiducia di questo utente perchè firmi\n"
+"correttamente le chiavi di altri utenti (guardando il loro passaporto,\n"
 "controllando le impronte digitali da diverse fonti ...)?\n"
 "\n"
 " 1 = Non lo so\n"
@@ -468,27 +503,31 @@ msgstr ""
 " 3 = Mi fido marginalmente\n"
 " 4 = Mi fido completamente\n"
 " s = mostrami ulteriori informazioni\n"
-"\n"
 
-#: g10/pkclist.c:83
-msgid "Your decision? "
-msgstr "Cosa hai deciso? "
 
-#: g10/pkclist.c:90
-msgid ""
-"It's up to you to assign a value here; this value will never be exported\n"
-"to any 3rd party.  We need it to implement the web-of-trust; it has nothing\n"
-"to do with the (implicitly created) web-of-certificates.\n"
+msgid  " m = back to the main menu\n"
 msgstr ""
-"\310 compito tuo assegnare qui un valore; questo valore non sar\340 mai esportato\n"
-"ad alcuna terza persona. Serve per implementare la ragnatela-di-fiducia; non\n"
-"ha nulla a che fare con la ragnatela-di-certificati (creata implicitamente).\n"
 
-#: g10/pkclist.c:108
+# valid user replies (not including 1..4)
+# [Marco, you can change 'm' and 's' to whatever letters you like]
+msgid  "sSmM"
+msgstr "sSmM"
+
+
+
+#: g10/pkclist.c:87
+msgid "edit_ownertrust.value"
+msgstr ""
+
+#: g10/pkclist.c:87
+msgid "Your decision? "
+msgstr "Cosa hai deciso? "
+
+#: g10/pkclist.c:106
 msgid "You will see a list of signators etc. here\n"
 msgstr "Qui vedrai una lista di firmatari, ecc.\n"
 
-#: g10/pkclist.c:132
+#: g10/pkclist.c:130
 msgid ""
 "Could not find a valid trust path to the key.  Let's see whether we\n"
 "can assign some missing owner trust values.\n"
@@ -498,31 +537,83 @@ msgstr ""
 "se possiamo assegnare qualche valore di fiducia del proprietario mancante.\n"
 "\n"
 
-#: g10/pkclist.c:157
+#: g10/pkclist.c:155
 msgid ""
-"No ownertrust values changed.\n"
+"No owner trust values changed.\n"
 "\n"
 msgstr ""
 "Nessun valore di fiducia del proprietario modificato.\n"
 "\n"
 
-#: g10/pkclist.c:267
+#: g10/pkclist.c:174
+msgid "revoked_key.override"
+msgstr ""
+
+#: g10/pkclist.c:175 g10/pkclist.c:262
+msgid "Use this key anyway? "
+msgstr "Uso lo stesso questa chiave? "
+
+#: g10/pkclist.c:257
 msgid ""
 "It is NOT certain that the key belongs to its owner.\n"
 "If you *really* know what you are doing, you may answer\n"
 "the next question with yes\n"
 "\n"
 msgstr ""
-"NON \350 sicuro che la chiave appartenga al suo proprietario.\n"
-"Se *veramente* sai cosa stai facendo, puoi rispondere s\354 alla\n"
+"NON è sicuro che la chiave appartenga al suo proprietario.\n"
+"Se *veramente* sai cosa stai facendo, puoi rispondere sì alla\n"
 "prossima domanda.\n"
 "\n"
 
-#: g10/pkclist.c:278
+#: g10/pkclist.c:261
+msgid "untrusted_key.override"
+msgstr ""
+
+#: g10/pkclist.c:266
 msgid "WARNING: Using untrusted key!\n"
+msgstr "ATTENZIONE: uso di una chiave non fidata!\n"
+
+#: g10/pkclist.c:302
+msgid "WARNING: This key has been revoked by its owner!\n"
+msgstr "ATTENZIONE: questa chiave è stata revocata dal suo proprietario!\n"
+
+#: g10/pkclist.c:303
+msgid "         This could mean that the signature is forgery.\n"
+msgstr "         Questo può significare che la firma è stata falsificata.\n"
+
+#: g10/pkclist.c:324
+msgid "Note: This key has expired!\n"
+msgstr "Nota: questa chiave è scaduta!\n"
+
+#: g10/pkclist.c:331
+msgid "WARNING: This key is not certified with a trusted signature!\n"
+msgstr "ATTENZIONE: questa chiave non è certificata con una firma fidata!\n"
+
+#: g10/pkclist.c:333
+msgid ""
+"         There is no indication that the signature belongs to the owner.\n"
+msgstr ""
+"         Non ci sono indicazioni che la firma appartenga al proprietario.\n"
+
+#: g10/pkclist.c:348
+msgid "WARNING: We do NOT trust this key!\n"
+msgstr "ATTENZIONE: NON ci fidiamo di questa chiave!\n"
+
+#: g10/pkclist.c:349
+msgid "         The signature is probably a FORGERY.\n"
+msgstr "          La firma è probabilmente un FALSO.\n"
+
+#: g10/pkclist.c:356
+msgid ""
+"WARNING: This key is not certified with sufficiently trusted signatures!\n"
 msgstr ""
+"ATTENZIONE: questa chiave non è certificata con firme abbastanza fidate!\n"
 
-#: g10/pkclist.c:308
+#: g10/pkclist.c:359
+msgid "         It is not certain that the signature belongs to the owner.\n"
+msgstr "         Non è sicuro che la firma appartenga al proprietario.\n"
+
+#: g10/pkclist.c:404
 msgid ""
 "You did not specify a user ID. (you may use \"-r\")\n"
 "\n"
@@ -530,57 +621,89 @@ msgstr ""
 "Non hai specificato un user ID. (puoi usare \"-r\")\n"
 "\n"
 
-#: g10/pkclist.c:312
+#: g10/pkclist.c:408
+msgid "pklist.user_id.enter"
+msgstr ""
+
+#: g10/pkclist.c:409
 msgid "Enter the user ID: "
 msgstr "Inserisci l'user ID: "
 
-#: g10/keygen.c:122
+#: g10/pkclist.c:420
+msgid "No such user ID.\n"
+msgstr "User ID inesistente.\n"
+
+#: g10/pkclist.c:454 g10/pkclist.c:481
+#, c-format
+msgid "%s: skipped: %s\n"
+msgstr "%s: saltata: %s\n"
+
+#: g10/pkclist.c:462
+#, c-format
+msgid "%s: error checking key: %s\n"
+msgstr "%s: errore nel controllare la chiave: %s\n"
+
+#: g10/pkclist.c:488
+msgid "no valid addressees\n"
+msgstr "nessun indirizzo valido\n"
+
+#: g10/keygen.c:123
 msgid "writing self signature\n"
 msgstr "scrittura della autofirma\n"
 
-#: g10/keygen.c:160
+#: g10/keygen.c:161
 msgid "writing key binding signature\n"
 msgstr "scrittura della autofirma\n"
 
-#: g10/keygen.c:382
+#: g10/keygen.c:383
 msgid "Please select what kind of key you want:\n"
 msgstr "Per favore scegli che tipo di chiave vuoi:\n"
 
 # , c-format
-#: g10/keygen.c:384
+#: g10/keygen.c:385
+#, c-format
 msgid "   (%d) DSA and ElGamal (default)\n"
 msgstr "   (%d) DSA e ElGamal (default)\n"
 
 # , c-format
-#: g10/keygen.c:385
+#: g10/keygen.c:386
+#, c-format
 msgid "   (%d) ElGamal (sign and encrypt)\n"
 msgstr "   (%d) ElGamal (firma e crittografa)\n"
 
 # , c-format
-#: g10/keygen.c:386
+#: g10/keygen.c:387
+#, c-format
 msgid "   (%d) ElGamal (encrypt only)\n"
 msgstr "   (%d) ElGamal (crittografa solo)\n"
 
 # , c-format
-#: g10/keygen.c:387
+#: g10/keygen.c:388
+#, c-format
 msgid "   (%d) DSA (sign only)\n"
 msgstr "   (%d) DSA (firma solo)\n"
 
 # , c-format
-#: g10/keygen.c:388
+#: g10/keygen.c:389
+#, c-format
 msgid "   (%d) ElGamal in a v3 packet\n"
 msgstr "   (%d) ElGamal in un pacchetto v3\n"
 
-#: g10/keygen.c:392
+#: g10/keygen.c:393
+msgid "keygen.algo"
+msgstr ""
+
+#: g10/keygen.c:393
 msgid "Your selection? "
 msgstr "Cosa scegli? "
 
-#: g10/keygen.c:418
+#: g10/keygen.c:419
 msgid "Invalid selection.\n"
 msgstr "Scelta non valida.\n"
 
 # , c-format
-#: g10/keygen.c:430
+#: g10/keygen.c:431
+#, c-format
 msgid ""
 "About to generate a new %s keypair.\n"
 "              minimum keysize is  768 bits\n"
@@ -588,49 +711,72 @@ msgid ""
 "    highest suggested keysize is 2048 bits\n"
 msgstr ""
 "Sto per generare una nuova coppia di chiavi %s.\n"
-"               la dimensione minima \350  768 bit\n"
-"          la dimensione predefinita \350 1024 bit\n"
-"    la dimensione massima suggerita \350 2048 bit\n"
+"               la dimensione minima è  768 bit\n"
+"          la dimensione predefinita è 1024 bit\n"
+"  la dimensione massima consigliata è 2048 bit\n"
 
-#: g10/keygen.c:436
+#: g10/keygen.c:437
+msgid "keygen.size"
+msgstr ""
+
+#: g10/keygen.c:438
 msgid "What keysize do you want? (1024) "
 msgstr "Di che dimensioni vuoi la chiave? (1024) "
 
-#: g10/keygen.c:441
+#: g10/keygen.c:443
 msgid "DSA only allows keysizes from 512 to 1024\n"
 msgstr "DSA permette solo chiavi di dimensioni da 512 a 1024\n"
 
-#: g10/keygen.c:443
-msgid "keysize too small; 768 is smallest value allowed.\n"
-msgstr "la chiave \350 troppo corta; 768 \350 il minimo valore permesso.\n"
-
 #: g10/keygen.c:445
-msgid "Keysizes larger than 2048 are not suggested, because computations take REALLY long!\n"
-msgstr "Chiavi pi\371 lunghe di 2048 non sono consigliate, perch\350 i calcoli sono VERAMENTE lunghi!\n"
+msgid "keysize too small; 768 is smallest value allowed.\n"
+msgstr "la chiave è troppo corta; 768 è il minimo valore permesso.\n"
 
 #: g10/keygen.c:447
-msgid "Are you sure, that you want this keysize? "
+msgid ""
+"Keysizes larger than 2048 are not suggested because\n"
+"computations take REALLY long!\n"
+msgstr ""
+"Chiavi più lunghe di 2048 non sono consigliate perchè i calcoli sono \n"
+"VERAMENTE lunghi!\n"
+
+#: g10/keygen.c:449
+msgid "keygen.size.huge.okay"
+msgstr ""
+
+#: g10/keygen.c:450
+#, fuzzy
+msgid "Are you sure that you want this keysize? "
 msgstr "Sei sicuro che vuoi una chiave di queste dimensioni? "
 
 #: g10/keygen.c:451
-msgid "Okay, but keep in mind that your monitor and keyboard radiation is also very vulnerable to attacks!\n"
-msgstr "Va bene, ma ricordati che anche le radiazioni emesse dal tuo monitor e dalla tua tastiera sono molto vulnerabili ad attacchi!\n"
+msgid ""
+"Okay, but keep in mind that your monitor and keyboard radiation is also very "
+"vulnerable to attacks!\n"
+msgstr ""
+"Va bene, ma ricordati che anche le radiazioni emesse dal tuo monitor e dalla "
+"tua tastiera sono molto vulnerabili ad attacchi!\n"
+
+#: g10/keygen.c:458
+msgid "keygen.size.large.okay"
+msgstr ""
 
 #: g10/keygen.c:459
 msgid "Do you really need such a large keysize? "
-msgstr "Ti serve davvero una chiave cos\354 lunga? "
+msgstr "Ti serve davvero una chiave così lunga? "
 
 # , c-format
-#: g10/keygen.c:470
+#: g10/keygen.c:465
+#, c-format
 msgid "Requested keysize is %u bits\n"
 msgstr "Le dimensioni della chiave richieste sono %u bit\n"
 
 # , c-format
-#: g10/keygen.c:473 g10/keygen.c:477
+#: g10/keygen.c:468 g10/keygen.c:472
+#, c-format
 msgid "rounded up to %u bits\n"
 msgstr "arrotondate a %u bit\n"
 
-#: g10/keygen.c:489
+#: g10/keygen.c:484
 msgid ""
 "Please specify how long the key should be valid.\n"
 "         0 = key does not expire\n"
@@ -639,82 +785,106 @@ msgid ""
 "      <n>m = key expires in n months\n"
 "      <n>y = key expires in n years\n"
 msgstr ""
-"Per favore specifica per quanto la chiave sar\340 valida.\n"
-"         0 = la chiave non scadr\340\n"
-"      <n>w = la chiave scadr\340 dopo n giorni\n"
-"      <n>m = la chiave scadr\340 dopo n mesi\n"
-"      <n>y = la chiave scadr\340 dopo n anni\n"
+"Per favore specifica per quanto la chiave sarà valida.\n"
+"         0 = la chiave non scadrà\n"
+"      <n>w = la chiave scadrà dopo n giorni\n"
+"      <n>m = la chiave scadrà dopo n mesi\n"
+"      <n>y = la chiave scadrà dopo n anni\n"
+
+#: g10/keygen.c:499
+msgid "keygen.valid"
+msgstr ""
 
-#: g10/keygen.c:504
+#: g10/keygen.c:499
 msgid "Key is valid for? (0) "
 msgstr "Chiave valida per? (0) "
 
-#: g10/keygen.c:515
+#: g10/keygen.c:510
 msgid "invalid value\n"
 msgstr "valore non valido\n"
 
-#: g10/keygen.c:520
+#: g10/keygen.c:515
 msgid "Key does not expire at all\n"
 msgstr "La chiave non scade\n"
 
 # , c-format
 #. print the date when the key expires
-#: g10/keygen.c:523
+#: g10/keygen.c:518
+#, c-format
 msgid "Key expires at %s\n"
-msgstr "La chiave scadr\340 il %s\n"
+msgstr "La chiave scadrà il %s\n"
+
+#: g10/keygen.c:523
+msgid "keygen.valid.okay"
+msgstr ""
 
-#: g10/keygen.c:528
+#: g10/keygen.c:524
 msgid "Is this correct (y/n)? "
-msgstr "\310 giusto (y/n)? "
+msgstr "È giusto (s/n)? "
 
-#: g10/keygen.c:557
+#: g10/keygen.c:552
 msgid ""
 "\n"
-"You need a User-ID to identify your key; the software constructs the user id\n"
+"You need a User-ID to identify your key; the software constructs the user "
+"id\n"
 "from Real Name, Comment and Email Address in this form:\n"
 "    \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n"
 "\n"
 msgstr ""
 "\n"
-"Ti serve un User ID per identificare la tua chiave; il software costruisce l'user id a partire da Nome e Cognome, Commento e Indirizzo di Email indicati in questa forma:\n"
+"Ti serve un User ID per identificare la tua chiave; il software costruisce "
+"l'user id a partire da Nome e Cognome, Commento e Indirizzo di Email "
+"indicati in questa forma:\n"
 "    \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n"
 "\n"
 
-#: g10/keygen.c:568
+#: g10/keygen.c:563
+msgid "keygen.name"
+msgstr ""
+
+#: g10/keygen.c:563
 msgid "Real name: "
 msgstr "Nome e Cognome: "
 
-#: g10/keygen.c:572
+#: g10/keygen.c:567
 msgid "Invalid character in name\n"
 msgstr "Carattere non valido nel nome\n"
 
-#: g10/keygen.c:574
+#: g10/keygen.c:569
 msgid "Name may not start with a digit\n"
-msgstr "Il nome non pu\362 iniziare con una cifra\n"
+msgstr "Il nome non può iniziare con una cifra\n"
 
-#: g10/keygen.c:576
+#: g10/keygen.c:571
 msgid "Name must be at least 5 characters long\n"
 msgstr "Il nome deve essere lungo almeno 5 caratteri\n"
 
-#: g10/keygen.c:584
+#: g10/keygen.c:579
+msgid "keygen.email"
+msgstr ""
+
+#: g10/keygen.c:579
 msgid "Email address: "
 msgstr "Indirizzo di Email: "
 
-#: g10/keygen.c:596
+#: g10/keygen.c:591
 msgid "Not a valid email address\n"
-msgstr "L'indirizzo di email non \350 valido\n"
+msgstr "L'indirizzo di email non è valido\n"
+
+#: g10/keygen.c:599
+msgid "keygen.comment"
+msgstr ""
 
-#: g10/keygen.c:604
+#: g10/keygen.c:599
 msgid "Comment: "
 msgstr "Commento: "
 
-#. no comment is okay
-#: g10/keygen.c:610
+#: g10/keygen.c:605
 msgid "Invalid character in comment\n"
 msgstr "Carattere non valido nel commento\n"
 
 # , c-format
-#: g10/keygen.c:630
+#: g10/keygen.c:625
+#, c-format
 msgid ""
 "You selected this USER-ID:\n"
 "    \"%s\"\n"
@@ -724,11 +894,20 @@ msgstr ""
 "    \"%s\"\n"
 "\n"
 
-#: g10/keygen.c:633
-msgid "Edit (N)ame, (C)omment, (E)mail or (O)kay? "
-msgstr "Modifica (N)ome, (C)ommento, (E)mail oppure (O)kay? "
+#: g10/keygen.c:628
+msgid "NnCcEeOoQq"
+msgstr ""
+
+#: g10/keygen.c:635
+msgid "keygen.userid.cmd"
+msgstr ""
+
+#: g10/keygen.c:636
+#, fuzzy
+msgid "Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? "
+msgstr "Modifica (N)ome, (C)ommento, (E)mail oppure (O)kay/(Q)uit? "
 
-#: g10/keygen.c:672
+#: g10/keygen.c:683
 msgid ""
 "You need a Passphrase to protect your secret key.\n"
 "\n"
@@ -736,71 +915,905 @@ msgstr ""
 "Ti serve una passphrase per proteggere la tua chiave segreta.\n"
 "\n"
 
-#: g10/keygen.c:680
+#: g10/keyedit.c:495 g10/keygen.c:691
 msgid "passphrase not correctly repeated; try again.\n"
 msgstr "passphrase non ripetuta correttamente; riprova.\n"
 
-#: g10/keygen.c:686
+#: g10/keygen.c:697
 msgid ""
 "You don't want a passphrase - this is probably a *bad* idea!\n"
 "I will do it anyway.  You can change your passphrase at any time,\n"
-"using this program with the option \"--change-passphrase\"\n"
+"using this program with the option \"--edit-key\".\n"
 "\n"
 msgstr ""
-"Non hai specificato una passphrase - questa \350 probabilmente una *cattiva*\n"
-"idea! Lo far\362 io comunque. Puoi cambiarla in ogni momento, usando questo\n"
-"programma con l'opzione \"--change-passphrase\"\n"
+"Non hai specificato una passphrase - questa è probabilmente una *cattiva*\n"
+"idea! Lo farò io comunque. Puoi cambiarla in ogni momento, usando questo\n"
+"programma con l'opzione \"--edit-key\".\n"
 "\n"
 
-#: g10/keygen.c:707
+#: g10/keygen.c:718
 msgid ""
 "We need to generate a lot of random bytes. It is a good idea to perform\n"
 "some other action (work in another window, move the mouse, utilize the\n"
 "network and the disks) during the prime generation; this gives the random\n"
 "number generator a better chance to gain enough entropy.\n"
 msgstr ""
-"Dobbiamo generare un mucchio di byte casuali. \310 una buona idea eseguire\n"
-"qualche altra azione (lavorare in un'altra finestra, muovere il mouse, usare\n"
-"la rete e i dischi) durante la generazione dei numeri primi; questo d\340 al\n"
-"generatore di numeri casuali la possibilit\340 di raccogliere abbastanza\n"
+"Dobbiamo generare un mucchio di byte casuali. È una buona idea eseguire\n"
+"qualche altra azione (lavorare in un'altra finestra, muovere il mouse, "
+"usare\n"
+"la rete e i dischi) durante la generazione dei numeri primi; questo dà al\n"
+"generatore di numeri casuali la possibilità di raccogliere abbastanza\n"
 "entropia.\n"
 
-#: g10/keygen.c:753 g10/keygen.c:901
+#: g10/keygen.c:785
 msgid "Key generation can only be used in interactive mode\n"
-msgstr "Una chiave pu\362 essere generata solo in modo interattivo\n"
+msgstr "Una chiave può essere generata solo in modo interattivo\n"
 
-#: g10/keygen.c:761
+#: g10/keygen.c:793
 msgid "DSA keypair will have 1024 bits.\n"
-msgstr "La coppia DSA avr\340 1024 bit.\n"
+msgstr "La coppia DSA avrà 1024 bit.\n"
+
+#: g10/keygen.c:799
+msgid "Key generation cancelled.\n"
+msgstr "Generazione della chiave annullata.\n"
 
 # , c-format
-#: g10/keygen.c:773
+#: g10/keygen.c:809
+#, c-format
 msgid "writing public certificate to '%s'\n"
 msgstr "scrittura del certificato pubblico in '%s'\n"
 
 # , c-format
-#: g10/keygen.c:774
+#: g10/keygen.c:810
+#, c-format
 msgid "writing secret certificate to '%s'\n"
 msgstr "scrittura del certificato privato in '%s'\n"
 
-#: g10/keygen.c:852
+#: g10/keygen.c:887
 msgid "public and secret key created and signed.\n"
 msgstr "chiavi pubbliche e segrete create e firmate.\n"
 
-#: g10/keygen.c:854
+#: g10/keygen.c:889
 msgid ""
 "Note that this key cannot be used for encryption.  You may want to use\n"
 "the command \"--add-key\" to generate a secondary key for this purpose.\n"
 msgstr ""
-"Nota che questa chiave non pu\362 essere usata per la crittografia. Forse\n"
+"Nota che questa chiave non può essere usata per la crittografia. Forse\n"
 "vorrai usare il comando \"--add-key\" per generare una chiave secondaria\n"
 "per questo scopo.\n"
 
 # , c-format
-#: g10/keygen.c:868 g10/keygen.c:1020
+#: g10/keygen.c:903 g10/keygen.c:987
+#, c-format
 msgid "Key generation failed: %s\n"
 msgstr "Generazione della chiave fallita: %s\n"
 
-#: g10/keygen.c:1015
-msgid "public and secret subkey created.\n"
-msgstr "sottochiavi pubbliche e segrete create.\n"
+#: g10/keygen.c:964
+msgid "keygen.sub.okay"
+msgstr ""
+
+#: g10/keygen.c:965
+msgid "Really create? "
+msgstr "Crea davvero? "
+
+# , c-format
+#: g10/encode.c:86
+#, c-format
+msgid "%s: can't open: %s\n"
+msgstr "%s: impossibile aprire: %s\n"
+
+#: g10/encode.c:105
+#, c-format
+msgid "error creating passphrase: %s\n"
+msgstr "errore nella creazione della passhprase: %s\n"
+
+#: g10/encode.c:141 g10/encode.c:245
+#, c-format
+msgid "%s: warning: empty file\n"
+msgstr "%s: attenzione: file vuoto\n"
+
+# , c-format
+#: g10/encode.c:209
+#,  c-format
+msgid "reading from '%s'\n"
+msgstr "lettura da '%s'\n"
+
+#: g10/encode.c:376
+#, c-format
+msgid "%s encrypted for: %s\n"
+msgstr "%s crittografato per: %s\n"
+
+# , c-format
+#: g10/import.c:105 g10/trustdb.c:1342
+#, c-format
+msgid "can't open file: %s\n"
+msgstr "impossibile aprire il file: %s\n"
+
+#: g10/import.c:121
+#, c-format
+msgid "skipping block of type %d\n"
+msgstr "salto un blocco di tipo %d\n"
+
+#: g10/import.c:131 g10/trustdb.c:1420
+#, c-format
+msgid "read error: %s\n"
+msgstr "errore di lettura: %s\n"
+
+#: g10/import.c:270 g10/import.c:436
+#, c-format
+msgid "key %08lX: no user id\n"
+msgstr "chiave %08lX: nessun user id\n"
+
+#: g10/import.c:280
+#, c-format
+msgid "key %08lX: no valid user ids\n"
+msgstr "chiave %08lX: nessun user id valido\n"
+
+#: g10/import.c:289 g10/import.c:503
+#, c-format
+msgid "key %08lX: public key not found: %s\n"
+msgstr "chiave %08lX: chiave pubblica non trovata: %s\n"
+
+#: g10/import.c:295
+msgid "no default public keyring\n"
+msgstr "nessun portachiavi pubblico predefinito\n"
+
+# , c-format
+#: g10/import.c:299
+#, c-format
+msgid "writing to '%s'\n"
+msgstr "scrittura in '%s'\n"
+
+# , c-format
+#: g10/import.c:303 g10/import.c:356 g10/import.c:557
+#, c-format
+msgid "can't lock public keyring: %s\n"
+msgstr "impossibile bloccare il portachiavi pubblico: %s\n"
+
+# , c-format
+#: g10/import.c:306
+#, c-format
+msgid "can't write to keyring: %s\n"
+msgstr "impossibile scrivere sul portachiavi pubblico: %s\n"
+
+#. we are ready
+#: g10/import.c:309
+#, c-format
+msgid "key %08lX: public key imported\n"
+msgstr "chiave %08lX: chiave pubblica importata\n"
+
+#: g10/import.c:317
+#, c-format
+msgid "key %08lX: doesn't match our copy\n"
+msgstr "chiave %08lX: non corrisponde alla nostra copia\n"
+
+#: g10/import.c:330 g10/import.c:512
+#, c-format
+msgid "key %08lX: can't locate original keyblock: %s\n"
+msgstr "chiave %08lX: impossibile individuare il keyblock originale: %s\n"
+
+#: g10/import.c:337 g10/import.c:519
+#, c-format
+msgid "key %08lX: can't read original keyblock: %s\n"
+msgstr "chiave %08lX: impossibile leggere il keyblock originale: %s\n"
+
+#: g10/import.c:353 g10/import.c:451 g10/import.c:554
+msgid "writing keyblock\n"
+msgstr "scrittura del keyblock\n"
+
+# , c-format
+#: g10/import.c:359 g10/import.c:560
+#, c-format
+msgid "can't write keyblock: %s\n"
+msgstr "impossibile aprire il keyblock: %s\n"
+
+#: g10/import.c:363
+#, c-format
+msgid "key %08lX: 1 new user-id\n"
+msgstr "chiave %08lX: un nuovo user id\n"
+
+#: g10/import.c:366
+#, c-format
+msgid "key %08lX: %d new user-ids\n"
+msgstr "chiave %08lX: %d nuovi user id\n"
+
+#: g10/import.c:369
+#, c-format
+msgid "key %08lX: 1 new signature\n"
+msgstr "chiave %08lX: una nuova firma\n"
+
+#: g10/import.c:372
+#, c-format
+msgid "key %08lX: %d new signatures\n"
+msgstr "chiave %08lX: %d nuove firme\n"
+
+#: g10/import.c:375
+#, c-format
+msgid "key %08lX: 1 new subkey\n"
+msgstr "chiave %08lX: una nuova subchiave\n"
+
+#: g10/import.c:378
+#, c-format
+msgid "key %08lX: %d new subkeys\n"
+msgstr "chiave %08lX: %d nuove subchiavi\n"
+
+#: g10/import.c:382
+#, c-format
+msgid "key %08lX: not changed\n"
+msgstr "chiave %08lX: non cambiata\n"
+
+#: g10/import.c:454
+#, c-format
+msgid "can't lock secret keyring: %s\n"
+msgstr "impossibile bloccare il portachiavi segreto: %s\n"
+
+#: g10/import.c:457
+msgid "can't write keyring\n"
+msgstr "impossibile scrivere il portachiavi\n"
+
+#. we are ready
+#: g10/import.c:460
+#, c-format
+msgid "key %08lX: secret key imported\n"
+msgstr "chiave %08lX: chiave segreta importata\n"
+
+#. we can't merge secret keys
+#: g10/import.c:463
+#, c-format
+msgid "key %08lX: already in secret keyring\n"
+msgstr "chiave %08lX: già nel portachiavi segreto\n"
+
+#: g10/import.c:467
+#, c-format
+msgid "key %08lX: secret key not found: %s\n"
+msgstr "chiave %08lX: chiave segreta non trovata: %s\n"
+
+#: g10/import.c:497
+#, c-format
+msgid "key %08lX: no public key - can't apply revocation certificate\n"
+msgstr ""
+"chiave %08lX: manca la chiave pubblica - impossibile applicare il\n"
+"certificato di revoca\n"
+
+#: g10/import.c:530
+#, c-format
+msgid "key %08lX: invalid revocation certificate: %s - rejected\n"
+msgstr "chiave %08lX: certificato di revoca non valido: %s - rifiutato\n"
+
+#. we are ready
+#: g10/import.c:563
+#, c-format
+msgid "key %08lX: revocation certificate imported\n"
+msgstr "chiave %08lX: certificato di revoca importato\n"
+
+#: g10/import.c:593
+#, c-format
+msgid "key %08lX: no user-id for signature\n"
+msgstr "chiave %08lX: nessun user id per la firma\n"
+
+#: g10/import.c:600
+#, c-format
+msgid "key %08lX: unsupported public key algorithm\n"
+msgstr "chiave %08lX: algoritmo a chiave pubblica non gestito\n"
+
+#: g10/import.c:601
+#, c-format
+msgid "key %08lX: invalid self-signature\n"
+msgstr "chiave %08lX: autofirma non valida\n"
+
+#: g10/import.c:630
+#, c-format
+msgid "key %08lX: skipped userid '"
+msgstr "chiave %08lX: saltato l'user id '"
+
+#: g10/import.c:653
+#, c-format
+msgid "key %08lX: revocation certificate at wrong place - skipped\n"
+msgstr "chiave %08lX: certificato di revoca nel posto sbagliato - saltato\n"
+
+#: g10/import.c:660
+#, c-format
+msgid "key %08lX: invalid revocation certificate: %s - skipped\n"
+msgstr "chiave %08lX: certificato di revoca non valido: %s - saltato\n"
+
+#: g10/import.c:722
+#, c-format
+msgid "key %08lX: revocation certificate added\n"
+msgstr "chiave %08lX: certificato di revoca aggiunto\n"
+
+#: g10/import.c:785 g10/import.c:821
+#, c-format
+msgid "key %08lX: our copy has no self-signature\n"
+msgstr "chiave %08lX: la nostra copia non ha autofirma\n"
+
+#: g10/keyedit.c:80 g10/keyedit.c:336
+#, c-format
+msgid "%s: user not found\n"
+msgstr "%s: utente non trovato\n"
+
+#: g10/keyedit.c:160
+msgid "[self-signature]"
+msgstr "[autofirma]"
+
+#: g10/keyedit.c:178
+msgid "1 bad signature\n"
+msgstr "una firma non corretta\n"
+
+#: g10/keyedit.c:180
+#, c-format
+msgid "%d bad signatures\n"
+msgstr "%d firme non corrette\n"
+
+#: g10/keyedit.c:182
+msgid "1 signature not checked due to a missing key\n"
+msgstr "1 firma non controllata per mancanza della chiave\n"
+
+#: g10/keyedit.c:184
+#, c-format
+msgid "%d signatures not checked due to missing keys\n"
+msgstr "%d firme non controllate per mancanza delle chiavi\n"
+
+#: g10/keyedit.c:186
+msgid "1 signature not checked due to an error\n"
+msgstr "1 firma non controllata a causa di un errore\n"
+
+#: g10/keyedit.c:188
+#, c-format
+msgid "%d signatures not checked due to errors\n"
+msgstr "%d firme non controllate a causa di errori\n"
+
+#: g10/keyedit.c:190
+msgid "1 user id without valid self-signature detected\n"
+msgstr "Trovato 1 user id senza autofirma valida\n"
+
+#: g10/keyedit.c:192
+#, c-format
+msgid "%d user ids without valid self-signatures detected\n"
+msgstr "Trovati %d user id senza autofirme valide\n"
+
+#: g10/keyedit.c:246
+#, c-format
+msgid "Already signed by key %08lX\n"
+msgstr "Già firmato dalla chiave %08lX\n"
+
+#: g10/keyedit.c:254
+#, c-format
+msgid "Nothing to sign with key %08lX\n"
+msgstr "Niente da firmare con la chiave %08lX\n"
+
+#: g10/keyedit.c:263
+msgid ""
+"Are you really sure that you want to sign this key\n"
+"with your key: \""
+msgstr ""
+"Sei davvero sicuro di volere firmare questa chiave\n"
+"con la tua chiave: \""
+
+#: g10/keyedit.c:269
+msgid "sign_uid.okay"
+msgstr ""
+
+#: g10/keyedit.c:269
+msgid "Really sign? "
+msgstr "Firmo davvero? "
+
+# , c-format
+#: g10/keyedit.c:295
+#, c-format
+msgid "signing failed: %s\n"
+msgstr "firma fallita: %s\n"
+
+#: g10/keyedit.c:365
+msgid "there is a secret key for this public key!\n"
+msgstr "c'è una chiave segreta per questa chiave pubblica!\n"
+
+#: g10/keyedit.c:367
+msgid "use option \"--delete-secret-key\" to delete it first.\n"
+msgstr "prima usa l'opzione \"--delete-secret-key\" per cancellarla.\n"
+
+#: g10/keyedit.c:379 g10/keyedit.c:599
+msgid "can't do that in batchmode\n"
+msgstr "impossibile fare questo in batch mode\n"
+
+#: g10/keyedit.c:383
+msgid "can't do that in batchmode without \"--yes\"\n"
+msgstr "impossibile fare questo in batch mode senza \"--yes\"\n"
+
+#: g10/keyedit.c:403 g10/keyedit.c:414
+msgid "delete_key.secret.okay"
+msgstr ""
+
+#: g10/keyedit.c:404
+msgid "delete_key.okay"
+msgstr ""
+
+#: g10/keyedit.c:405
+msgid "Delete this key from the keyring? "
+msgstr "Cancello questa chiave dal portachiavi? "
+
+#: g10/keyedit.c:415
+msgid "This is a secret key! - really delete? "
+msgstr "Questa è una chiave segreta! - la cancello davvero? "
+
+#: g10/keyedit.c:462
+msgid "This key is not protected.\n"
+msgstr "Questa chiave non è protetta.\n"
+
+#: g10/keyedit.c:465
+msgid "Key is protected.\n"
+msgstr "La chiave è protetta.\n"
+
+# , c-format
+#: g10/keyedit.c:482
+#, c-format
+msgid "Can't edit this key: %s\n"
+msgstr "Impossibile modificare questa chiave: %s\n"
+
+#: g10/keyedit.c:487
+msgid ""
+"Enter the new passphrase for this secret key.\n"
+"\n"
+msgstr "Inserisci la nuova passphrase per questa chiave segreta.\n"
+"\n"
+
+#: g10/keyedit.c:499
+msgid ""
+"You don't want a passphrase - this is probably a *bad* idea!\n"
+"\n"
+msgstr ""
+"Non vuoi una passphrase - questa è probabilmente una *cattiva* idea!\n"
+"\n"
+
+#: g10/keyedit.c:501
+msgid "change_passwd.empty.okay"
+msgstr ""
+
+#: g10/keyedit.c:502
+msgid "Do you really want to do this? "
+msgstr "Vuoi veramente farlo?"
+
+#: g10/keyedit.c:557
+msgid "quit"
+msgstr ""
+
+#: g10/keyedit.c:557
+msgid "quit this menu"
+msgstr "abbandona questo menù"
+
+#: g10/keyedit.c:558
+msgid "q"
+msgstr ""
+
+#: g10/keyedit.c:559
+msgid "save"
+msgstr ""
+
+#: g10/keyedit.c:559
+msgid "save and quit"
+msgstr "salva ed esci"
+
+#: g10/keyedit.c:560
+msgid "help"
+msgstr ""
+
+#: g10/keyedit.c:560
+msgid "show this help"
+msgstr "mostra questo aiuto"
+
+#: g10/keyedit.c:562
+msgid "fpr"
+msgstr ""
+
+#: g10/keyedit.c:562
+msgid "show fingerprint"
+msgstr "mostra le impronte digitali"
+
+#: g10/keyedit.c:563
+msgid "list"
+msgstr ""
+
+#: g10/keyedit.c:563
+msgid "list key and user ids"
+msgstr "elenca le chiavi e gli user id"
+
+#: g10/keyedit.c:564
+msgid "l"
+msgstr ""
+
+#: g10/keyedit.c:565
+msgid "uid"
+msgstr ""
+
+#: g10/keyedit.c:565
+msgid "select user id N"
+msgstr "scegli l'user id N"
+
+#: g10/keyedit.c:566
+msgid "key"
+msgstr ""
+
+#: g10/keyedit.c:566
+msgid "select secondary key N"
+msgstr "scegli la chiave secondaria N"
+
+#: g10/keyedit.c:567
+msgid "check"
+msgstr ""
+
+#: g10/keyedit.c:567
+msgid "list signatures"
+msgstr "elenca le firme"
+
+#: g10/keyedit.c:568
+msgid "c"
+msgstr ""
+
+#: g10/keyedit.c:569
+msgid "sign"
+msgstr ""
+
+#: g10/keyedit.c:569
+msgid "sign the key"
+msgstr "firma la chiave"
+
+#: g10/keyedit.c:570
+msgid "s"
+msgstr ""
+
+#: g10/keyedit.c:571
+msgid "debug"
+msgstr ""
+
+#: g10/keyedit.c:572
+msgid "adduid"
+msgstr ""
+
+#: g10/keyedit.c:572
+msgid "add a user id"
+msgstr "aggiungi un user id"
+
+#: g10/keyedit.c:573
+msgid "deluid"
+msgstr ""
+
+#: g10/keyedit.c:573
+msgid "delete user id"
+msgstr "cancella un user id"
+
+#: g10/keyedit.c:574
+msgid "addkey"
+msgstr ""
+
+#: g10/keyedit.c:574
+msgid "add a secondary key"
+msgstr "aggiungi una chiave secondaria"
+
+#: g10/keyedit.c:575
+msgid "delkey"
+msgstr ""
+
+#: g10/keyedit.c:575
+msgid "delete a secondary key"
+msgstr "cancella una chiave secondaria"
+
+#: g10/keyedit.c:576
+msgid "toggle"
+msgstr ""
+
+#: g10/keyedit.c:576
+msgid "toggle between secret and public key listing"
+msgstr "cambia tra visualizzare la chiave segreta e la chiave pubblica"
+
+#: g10/keyedit.c:578
+msgid "t"
+msgstr ""
+
+#: g10/keyedit.c:579
+msgid "pref"
+msgstr ""
+
+#: g10/keyedit.c:579
+msgid "list preferences"
+msgstr "elenca le impostazioni"
+
+#: g10/keyedit.c:580
+msgid "passwd"
+msgstr ""
+
+#: g10/keyedit.c:580
+msgid "change the passphrase"
+msgstr "cambia la passphrase"
+
+#: g10/keyedit.c:581
+msgid "trust"
+msgstr ""
+
+#: g10/keyedit.c:581
+msgid "change the ownertrust"
+msgstr ""
+
+#. check that they match
+#. FIXME: check that they both match
+#: g10/keyedit.c:621
+msgid "Secret key is available.\n"
+msgstr "È disponibile una chiave segreta.\n"
+
+#: g10/keyedit.c:637
+msgid "keyedit.cmd"
+msgstr ""
+
+#: g10/keyedit.c:637
+msgid "Command> "
+msgstr "Comando> "
+
+#: g10/keyedit.c:660
+msgid "Need the secret key to to this.\n"
+msgstr "Per fare questo serve la chiave segreta.\n"
+
+#: g10/keyedit.c:679
+msgid "keyedit.save.okay"
+msgstr ""
+
+#: g10/keyedit.c:680
+msgid "Save changes? "
+msgstr "Salvo i cambiamenti? "
+
+#: g10/keyedit.c:682
+msgid "keyedit.cancel.okay"
+msgstr ""
+
+#: g10/keyedit.c:683
+msgid "Quit without saving? "
+msgstr "Esco senza salvare? "
+
+# , c-format
+#: g10/keyedit.c:693
+#, c-format
+msgid "update failed: %s\n"
+msgstr "aggiornamento fallito: %s\n"
+
+# , c-format
+#: g10/keyedit.c:700
+#, c-format
+msgid "update secret failed: %s\n"
+msgstr "aggiornamento della chiave segreta fallito: %s\n"
+
+#: g10/keyedit.c:708
+msgid "Key not changed so no update needed.\n"
+msgstr "La chiave non è cambiata quindi non sono necessari aggiornamenti.\n"
+
+#: g10/keyedit.c:738
+msgid "keyedit.sign_all.okay"
+msgstr ""
+
+#: g10/keyedit.c:739
+msgid "Really sign all user ids? "
+msgstr "Firmo davvero tutti gli user id? "
+
+#: g10/keyedit.c:740
+msgid "Hint: Select the user ids to sign\n"
+msgstr "Suggerimento: seleziona gli user id da firmare\n"
+
+#: g10/keyedit.c:768
+msgid "You must select at least one user id.\n"
+msgstr "Devi selezionare almeno un user id.\n"
+
+#: g10/keyedit.c:770
+msgid "You can't delete the last user id!\n"
+msgstr "Non puoi cancellare l'ultimo user id!\n"
+
+#: g10/keyedit.c:772
+msgid "keyedit.remove.uid.okay"
+msgstr ""
+
+#: g10/keyedit.c:773
+msgid "Really remove all selected user ids? "
+msgstr "Tolgo davvero tutti gli user id selezionati? "
+
+#: g10/keyedit.c:774
+msgid "Really remove this user id? "
+msgstr "Tolgo davvero questo user id? "
+
+#: g10/keyedit.c:797
+msgid "You must select at least one key.\n"
+msgstr "Devi selezionare almeno una chiave.\n"
+
+#: g10/keyedit.c:799
+msgid "keyedit.remove.subkey.okay"
+msgstr ""
+
+#: g10/keyedit.c:801
+msgid "Do you really want to delete the selected keys? "
+msgstr "Vuoi davvero cancellare le chiavi selezionate? "
+
+#: g10/keyedit.c:802
+msgid "Do you really want to delete this key? "
+msgstr "Vuoi davvero cancellare questa chiave? "
+
+#: g10/keyedit.c:839
+msgid "Invalid command  (try \"help\")\n"
+msgstr "Comando non valido (prova \"help\")\n"
+
+#: g10/keyedit.c:1219
+#, c-format
+msgid "No user id with index %d\n"
+msgstr "Nessun user id con l'indice %d\n"
+
+#: g10/keyedit.c:1264
+#, c-format
+msgid "No secondary key with index %d\n"
+msgstr "Nessuna chiave secondaria con l'indice %d\n"
+
+# , c-format
+#: g10/mainproc.c:198
+#, c-format
+msgid "public key decryption failed: %s\n"
+msgstr "Decifratura della chiave pubblica fallita: %s\n"
+
+# , c-format
+#: g10/mainproc.c:228
+#, c-format
+msgid "decryption failed: %s\n"
+msgstr "decifratura fallita: %s\n"
+
+#: g10/mainproc.c:843
+#, c-format
+msgid "Signature made %.*s using %s key ID %08lX\n"
+msgstr "Firma fatta %.*s usando %s key ID %08lX\n"
+
+#: g10/mainproc.c:849
+msgid "BAD signature from \""
+msgstr "Firma NON corretta da \""
+
+#: g10/mainproc.c:850
+msgid "Good signature from \""
+msgstr "Buona firma da \""
+
+#: g10/mainproc.c:861
+#, c-format
+msgid "Can't check signature: %s\n"
+msgstr "Impossibile controllare la firma: %s\n"
+
+#: g10/passphrase.c:117
+#, fuzzy
+msgid ""
+"\n"
+"You need a passphrase to unlock the secret key for\n"
+"user: \""
+msgstr ""
+"Ti serve una passphrase per proteggere la tua chiave segreta.\n"
+"\n"
+
+#: g10/passphrase.c:126
+#, c-format
+#  "(chiave %s di %u-bit, ID %08lX, creata il %s)\n"
+msgid "(%u-bit %s key, ID %08lX, created %s)\n"
+msgstr "(%u-bit, chiave %s, ID %08lX, creata il %s)\n"
+
+#: g10/passphrase.c:167
+msgid "passphrase.enter"
+msgstr ""
+
+#: g10/passphrase.c:167
+msgid "Enter pass phrase: "
+msgstr "Inserisci la passphrase: "
+
+#: g10/passphrase.c:170
+msgid "passphrase.repeat"
+msgstr ""
+
+#: g10/passphrase.c:171
+msgid "Repeat pass phrase: "
+msgstr "Ripeti la passphrase: "
+
+#: g10/plaintext.c:210
+msgid "detached_signature.filename"
+msgstr ""
+
+#: g10/plaintext.c:211
+msgid "Please enter name of data file: "
+msgstr "Inserisci il nome del file di dati: "
+
+# , c-format
+#: g10/plaintext.c:295
+#, c-format
+msgid "can't open signed data '%s'\n"
+msgstr "impossibile aprire i dati firmati '%s'\n"
+
+#: g10/seckey-cert.c:165
+msgid "Invalid passphrase; please try again ...\n"
+msgstr "Passphrase non valida; riprova...\n"
+
+#: g10/sig-check.c:165
+msgid "public key created in future (time warp or clock problem)\n"
+msgstr "chiave pubblica creata nel futuro (salto nel tempo o problema con\n"
+"l'orologio)\n"
+
+#: g10/sig-check.c:171
+#, c-format
+msgid "warning: signature key expired %s\n"
+msgstr "attenzione: firma della chiave scaduta il %s\n"
+
+# , c-format
+#: g10/trustdb.c:316
+#, c-format
+msgid "error reading sigrec: %s\n"
+msgstr ""
+
+#: g10/trustdb.c:321
+#, c-format
+msgid "chained sigrec %lu has a wrong owner\n"
+msgstr ""
+
+#: g10/trustdb.c:364
+#, c-format
+msgid "key %08lX: secret key without public key\n"
+msgstr "key %08lX: chiave segreta senza chiave pubblica\n"
+
+#: g10/trustdb.c:369
+#, c-format
+msgid "key %08lX: secret and public key don't match\n"
+msgstr "key %08lX: le chiavi segreta e pubblica non corrispondono\n"
+
+#: g10/trustdb.c:380
+#, c-format
+msgid "key %08lX: can't put it into the trustdb\n"
+msgstr "key %08lX: impossibile metterla nel trustdb\n"
+
+#: g10/trustdb.c:386
+#, c-format
+msgid "key %08lX: query record failed\n"
+msgstr "key %08lX: richiesta del record fallita\n"
+
+#: g10/trustdb.c:395
+#, c-format
+msgid "key %08lX: already in ultikey_table\n"
+msgstr "key %08lX: già in ultikey_table\n"
+
+# , c-format
+#: g10/trustdb.c:402
+#, c-format
+msgid "enum_secret_keys failed: %s\n"
+msgstr "enum_secret_keys fallito: %s\n"
+
+#: g10/trustdb.c:1614
+#, c-format
+msgid "key %08lX: insert trust record failed: %s\n"
+msgstr "key %08lX: inserimento del record della fiducia fallito: %s\n"
+
+#: g10/trustdb.c:1618
+#, c-format
+msgid "key %08lX.%lu: inserted into trustdb\n"
+msgstr "key %08lX.%lu: inserita nel trustdb\n"
+
+#: g10/trustdb.c:1624
+#, c-format
+msgid "key %08lX.%lu: created in future (time warp or clock problem)\n"
+msgstr "key %08lX.%lu: creata nel futuro (salto nel tempo o problema\n"
+"con l'orologio)\n"
+
+# , c-format
+#: g10/trustdb.c:1632
+#, c-format
+msgid "key %08lX.%lu: expired at %s\n"
+msgstr "key %08lX.%lu: scaduta il %s\n"
+
+#: g10/trustdb.c:1641
+#, c-format
+msgid "key %08lX.%lu: trust check failed: %s\n"
+msgstr "key %08lX.%lu: controllo della fiducia fallito: %s\n"
+
+#: g10/status.c:207
+msgid "No help available"
+msgstr "Nessun aiuto disponibile"
+
+#: g10/status.c:213
+#, c-format
+msgid "No help available for '%s'"
+msgstr "Nessun aiuto disponibile per '%s'"
+
+#: g10/pubkey-enc.c:138
+#, c-format
+msgid "note: cipher algorithm %d not found in preferences\n"
+msgstr "nota: algoritmo di cifratura %d non trovato nelle impostazioni\n"
+
index c249e8d..9ef2325 100644 (file)
@@ -1,3 +1,7 @@
+Tue Aug 11 15:12:35 1998  Werner Koch  (wk@(none))
+
+       * miscutil.c (answer_is_yes): i18ned
+
 Sat Aug  8 18:35:00 1998  Werner Koch  (wk@(none))
 
        * ttyio.c (cleanup): New.
index 6b72576..54671a2 100644 (file)
@@ -91,7 +91,7 @@ g10_errstr( int err )
       X(UNEXPECTED     ,"Unexpected data")
       X(TIME_CONFLICT  ,"Timestamp conflict")
       X(WR_PUBKEY_ALGO ,"Unusable pubkey algorithm")
-
+      X(FILE_EXISTS    ,"File exists")
       default: p = buf; sprintf(buf, "g10err=%d", err); break;
     }
   #undef X
index e4c2cf1..041c6fa 100644 (file)
@@ -25,6 +25,7 @@
 #include <ctype.h>
 #include "types.h"
 #include "util.h"
+#include "i18n.h"
 
 u32
 make_timestamp()
@@ -79,14 +80,16 @@ print_string( FILE *fp, byte *p, size_t n, int delim )
            putc(*p, fp);
 }
 
+
 int
 answer_is_yes( const char *s )
 {
-    if( !stricmp(s, "yes") )
-       return 1;
-    if( *s == 'y' && !s[1] )
+    char *long_yes = _("yes");
+    char *short_yes = _("yY");
+
+    if( !stricmp(s, long_yes ) )
        return 1;
-    if( *s == 'Y' && !s[1] )
+    if( strchr( short_yes, *s ) && !s[1] )
        return 1;
     return 0;
 }
index 96197a8..c01b193 100644 (file)
@@ -92,7 +92,7 @@ POSUB = po
 RANLIB = ranlib
 USE_INCLUDED_LIBINTL = yes
 USE_NLS = yes
-VERSION = 0.3.3
+VERSION = 0.3.4
 ZLIBS = 
 l =