Imported Upstream version 2.2.24 upstream/2.2.24
authorDongHun Kwak <dh0128.kwak@samsung.com>
Tue, 9 Feb 2021 07:00:56 +0000 (16:00 +0900)
committerDongHun Kwak <dh0128.kwak@samsung.com>
Tue, 9 Feb 2021 07:00:56 +0000 (16:00 +0900)
172 files changed:
NEWS
agent/Makefile.am
agent/agent.h
agent/command-ssh.c
agent/command.c
agent/cvt-openpgp.c
agent/divert-scd.c
agent/findkey.c
agent/gpg-agent-w32info.rc
agent/gpg-agent.c
agent/gpg-agent.w32-manifest.in [new file with mode: 0644]
agent/pkdecrypt.c
agent/pksign.c
agent/protect-tool.c
agent/protect.c
agent/trustlist.c
build-aux/speedo.mk
build-aux/speedo/w32/inst.nsi
build-aux/speedo/w32/wixlib.wxs
common/argparse.c
common/compliance.c
common/dotlock.c
common/exechelp-posix.c
common/exechelp-w32.c
common/gettime.c
common/helpfile.c
common/homedir.c
common/iobuf.c
common/mkdir_p.c
common/status.h
common/sysutils.c
common/sysutils.h
common/t-dotlock.c
common/t-exectool.c
common/util.h
common/w32info-rc.h.in
configure.ac
dirmngr/Makefile.am
dirmngr/certcache.c
dirmngr/crlcache.c
dirmngr/crlfetch.c
dirmngr/crlfetch.h
dirmngr/dirmngr-client.c
dirmngr/dirmngr-w32info.rc [new file with mode: 0644]
dirmngr/dirmngr.c
dirmngr/dirmngr.w32-manifest.in [new file with mode: 0644]
dirmngr/http-ntbtls.c
dirmngr/http.c
dirmngr/ks-engine-hkp.c
dirmngr/ldap.c
dirmngr/server.c
doc/DETAILS
doc/Makefile.am
doc/examples/Automatic.prf [new file with mode: 0644]
doc/examples/VS-NfD.prf [moved from doc/examples/vsnfd.prf with 82% similarity]
doc/gpg.texi
g10/Makefile.am
g10/call-agent.c
g10/card-util.c
g10/encrypt.c
g10/exec.c
g10/gpg.c
g10/gpg.w32-manifest.in
g10/gpgv-w32info.rc [new file with mode: 0644]
g10/gpgv.w32-manifest.in [new file with mode: 0644]
g10/keydb.c
g10/keydb.h
g10/keyedit.c
g10/keyedit.h
g10/keygen.c
g10/keylist.c
g10/keyring.c
g10/main.h
g10/mainproc.c
g10/migrate.c
g10/misc.c
g10/openfile.c
g10/passphrase.c
g10/photoid.c
g10/pkclist.c
g10/plaintext.c
g10/revoke.c
g10/sig-check.c
g10/sign.c
g10/tdbio.c
g10/textfilter.c
g10/tofu.c
g13/backend.c
g13/create.c
g13/g13-syshelp.c
g13/g13.c
g13/mount.c
g13/sh-dmcrypt.c
g13/suspend.c
kbx/kbxutil.c
kbx/keybox-defs.h
kbx/keybox-dump.c
kbx/keybox-file.c
kbx/keybox-init.c
kbx/keybox-search.c
kbx/keybox-update.c
kbx/keybox.h
po/POTFILES.in
po/ca.po
po/cs.po
po/da.po
po/de.po
po/el.po
po/eo.po
po/es.po
po/et.po
po/fi.po
po/fr.po
po/gl.po
po/hu.po
po/id.po
po/it.po
po/ja.po
po/nb.po
po/pl.po
po/pt.po
po/ro.po
po/ru.po
po/sk.po
po/sv.po
po/tr.po
po/uk.po
po/zh_CN.po
po/zh_TW.po
scd/Makefile.am
scd/apdu.c
scd/apdu.h
scd/app-openpgp.c
scd/app.c
scd/ccid-driver.c
scd/ccid-driver.h
scd/command.c
scd/iso7816.c
scd/scdaemon-w32info.rc
scd/scdaemon.c
scd/scdaemon.w32-manifest.in [new file with mode: 0644]
sm/Makefile.am
sm/certchain.c
sm/gpgsm-w32info.rc
sm/gpgsm.c
sm/gpgsm.w32-manifest.in [new file with mode: 0644]
sm/keydb.c
sm/minip12.c
sm/qualified.c
tests/openpgp/README
tests/openpgp/defs.scm
tools/Makefile.am
tools/gpg-check-pattern-w32info.rc [new file with mode: 0644]
tools/gpg-check-pattern.c
tools/gpg-check-pattern.w32-manifest.in [new file with mode: 0644]
tools/gpg-connect-agent-w32info.rc
tools/gpg-connect-agent.c
tools/gpg-connect-agent.w32-manifest.in [new file with mode: 0644]
tools/gpg-wks-client-w32info.rc [new file with mode: 0644]
tools/gpg-wks-client.c
tools/gpg-wks-client.w32-manifest.in [new file with mode: 0644]
tools/gpg-wks-server.c
tools/gpgconf-comp.c
tools/gpgconf-w32info.rc [new file with mode: 0644]
tools/gpgconf.c
tools/gpgconf.w32-manifest.in [new file with mode: 0644]
tools/gpgsplit.c
tools/gpgtar-create.c
tools/gpgtar-w32info.rc [new file with mode: 0644]
tools/gpgtar.w32-manifest.in [new file with mode: 0644]
tools/symcryptrun.c
tools/wks-util.c

diff --git a/NEWS b/NEWS
index b4c1283..5ddfec5 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,61 @@
+Noteworthy changes in version 2.2.24 (2020-11-17)
+-------------------------------------------------
+
+  * Allow Unicode file names on Windows almost everywhere.  Note that
+    it is still not possible to use Unicode strings on the command
+    line.  This change also fixes a regression in 2.2.22 related to
+    non-ascii file names.  [#5098]
+
+  * Fix localized time printing on Windows.  [#5073]
+
+  * gpg: New command --quick-revoke-sig.  [#5093]
+
+  * gpg: Do not use weak digest algos if selected by recipient
+    preference during sign+encrypt.  [4c181d51a6]
+
+  * gpg: Switch to AES256 for symmetric encryption in de-vs mode.
+    [166e779634]
+
+  * gpg: Silence weak digest warnings with --quiet.  [#4893]
+
+  * gpg: Print new status line CANCELED_BY_USER for a cancel during
+    symmetric encryption.  [f05d1772c4]
+
+  * gpg: Fix the encrypt+sign hash algo preference selection for
+    ECDSA.  This is in particular needed for keys created from
+    existing smartcard based keys.  [aeed0b93ff]
+
+  * agent: Fix secret key import of GnuPG 2.3 generated Ed25519 keys.
+    [#5114]
+
+  * agent: Keep some permissions of private-keys-v1.d.  [#2312]
+
+  * dirmngr: Align sks-keyservers.netCA.pem use between ntbtls and
+    gnutls builds.  [e4f3b74c91]
+
+  * dirmngr: Fix the pool keyserver case for a single host in the
+    pool.  [72e04b03b1a7]
+
+  * scd: Fix the use case of verify_chv2 by CHECKPIN.  [61aea64b3c]
+
+  * scd: Various improvements to the ccid-driver.  [#4616,#5065]
+
+  * scd: Minor fixes for Yubikey [25bec16d0b]
+
+  * gpgconf: New option --show-versions.
+
+  * w32: Install gpg-check-pattern and example profiles.  Install
+    Windows subsystem variant of gpgconf (gpgconf-w32).
+
+  * i18n: Complete overhaul and completion of the Italian translation.
+    Thanks to Denis Renzi.
+
+  * Require Libgcrypt 1.8 because 1.7 has long reached end-of-life.
+
+  Release-info: https://dev.gnupg.org/T5052
+  See-also: gnupg-announce/2020q4/000449.html
+
+
 Noteworthy changes in version 2.2.23 (2020-09-03)
 -------------------------------------------------
 
@@ -665,12 +723,17 @@ Noteworthy changes in version 2.2.6 (2018-04-09)
 
   * gpg: Print the keygrips in the --card-status.
 
+  * gpg: Improve the OpenPGP card's factory-reset.  [7f765a98fd]
+
   * scd: Support KDF DO setup.  [#3823]
 
   * scd: Fix some issues with PC/SC on Windows.  [#3825]
 
   * scd: Fix suspend/resume handling in the CCID driver.
 
+  * scd: Fix a race condition in the CCID driver leading to a segv for
+    some readers.  [#5121]
+
   * agent: Evict cached passphrases also via a timer.  [#3829]
 
   * agent: Use separate passphrase caches depending on the request
index 11d5427..f0ba964 100644 (file)
@@ -25,7 +25,9 @@ libexec_PROGRAMS += gpg-preset-passphrase
 endif
 noinst_PROGRAMS = $(TESTS)
 
-EXTRA_DIST = ChangeLog-2011 gpg-agent-w32info.rc all-tests.scm
+EXTRA_DIST = ChangeLog-2011 \
+             gpg-agent-w32info.rc gpg-agent.w32-manifest.in \
+             all-tests.scm
 
 
 AM_CPPFLAGS =
@@ -33,7 +35,10 @@ AM_CPPFLAGS =
 include $(top_srcdir)/am/cmacros.am
 
 if HAVE_W32_SYSTEM
-resource_objs += gpg-agent-w32info.o
+gpg_agent_robjs = $(resource_objs) gpg-agent-w32info.o
+gpg-agent-w32info.o : gpg-agent.w32-manifest
+else
+gpg_agent_robjs =
 endif
 
 AM_CFLAGS = $(LIBGCRYPT_CFLAGS) $(GPG_ERROR_CFLAGS)
@@ -69,9 +74,9 @@ gpg_agent_CFLAGS = $(AM_CFLAGS) $(LIBASSUAN_CFLAGS) $(NPTH_CFLAGS) \
 gpg_agent_LDADD = $(commonpth_libs) \
                 $(LIBGCRYPT_LIBS) $(LIBASSUAN_LIBS) $(NPTH_LIBS) \
                $(GPG_ERROR_LIBS) $(LIBINTL) $(NETLIBS) $(LIBICONV) \
-               $(resource_objs)
+               $(gpg_agent_robjs)
 gpg_agent_LDFLAGS = $(extra_bin_ldflags)
-gpg_agent_DEPENDENCIES = $(resource_objs)
+gpg_agent_DEPENDENCIES = $(gpg_agent_robjs)
 
 gpg_protect_tool_SOURCES = \
        protect-tool.c \
index 4d981ad..fb46412 100644 (file)
@@ -545,10 +545,12 @@ void agent_reload_trustlist (void);
 /*-- divert-scd.c --*/
 int divert_pksign (ctrl_t ctrl, const char *desc_text,
                    const unsigned char *digest, size_t digestlen, int algo,
+                   const unsigned char *grip,
                    const unsigned char *shadow_info, unsigned char **r_sig,
                    size_t *r_siglen);
 int divert_pkdecrypt (ctrl_t ctrl, const char *desc_text,
                       const unsigned char *cipher,
+                      const unsigned char *grip,
                       const unsigned char *shadow_info,
                       char **r_buf, size_t *r_len, int *r_padding);
 int divert_generic_cmd (ctrl_t ctrl,
index a26d604..bcc78bd 100644 (file)
@@ -216,7 +216,7 @@ struct ssh_key_type_spec
 struct ssh_control_file_s
 {
   char *fname;  /* Name of the file.  */
-  FILE *fp;     /* This is never NULL. */
+  estream_t fp; /* This is never NULL. */
   int lnr;      /* The current line number.  */
   struct {
     int valid;           /* True if the data of this structure is valid.  */
@@ -852,7 +852,7 @@ open_control_file (ssh_control_file_t *r_cf, int append)
     }
   /* FIXME: With "a+" we are not able to check whether this will
      be created and thus the blurb needs to be written first.  */
-  cf->fp = fopen (cf->fname, append? "a+":"r");
+  cf->fp = es_fopen (cf->fname, append? "a+":"r");
   if (!cf->fp && errno == ENOENT)
     {
       estream_t stream = es_fopen (cf->fname, "wx,mode=-rw-r");
@@ -865,7 +865,7 @@ open_control_file (ssh_control_file_t *r_cf, int append)
         }
       es_fputs (sshcontrolblurb, stream);
       es_fclose (stream);
-      cf->fp = fopen (cf->fname, append? "a+":"r");
+      cf->fp = es_fopen (cf->fname, append? "a+":"r");
     }
 
   if (!cf->fp)
@@ -882,7 +882,7 @@ open_control_file (ssh_control_file_t *r_cf, int append)
   if (err && cf)
     {
       if (cf->fp)
-        fclose (cf->fp);
+        es_fclose (cf->fp);
       xfree (cf->fname);
       xfree (cf);
     }
@@ -896,9 +896,9 @@ open_control_file (ssh_control_file_t *r_cf, int append)
 static void
 rewind_control_file (ssh_control_file_t cf)
 {
-  fseek (cf->fp, 0, SEEK_SET);
+  es_fseek (cf->fp, 0, SEEK_SET);
   cf->lnr = 0;
-  clearerr (cf->fp);
+  es_clearerr (cf->fp);
 }
 
 
@@ -907,7 +907,7 @@ close_control_file (ssh_control_file_t cf)
 {
   if (!cf)
     return;
-  fclose (cf->fp);
+  es_fclose (cf->fp);
   xfree (cf->fname);
   xfree (cf);
 }
@@ -924,13 +924,13 @@ read_control_file_item (ssh_control_file_t cf)
   long ttl = 0;
 
   cf->item.valid = 0;
-  clearerr (cf->fp);
+  es_clearerr (cf->fp);
 
   do
     {
-      if (!fgets (line, DIM(line)-1, cf->fp) )
+      if (!es_fgets (line, DIM(line)-1, cf->fp) )
         {
-          if (feof (cf->fp))
+          if (es_feof (cf->fp))
             return gpg_error (GPG_ERR_EOF);
           return gpg_error_from_syserror ();
         }
@@ -939,7 +939,7 @@ read_control_file_item (ssh_control_file_t cf)
       if (!*line || line[strlen(line)-1] != '\n')
         {
           /* Eat until end of line */
-          while ( (c=getc (cf->fp)) != EOF && c != '\n')
+          while ((c = es_getc (cf->fp)) != EOF && c != '\n')
             ;
           return gpg_error (*line? GPG_ERR_LINE_TOO_LONG
                                  : GPG_ERR_INCOMPLETE_LINE);
@@ -1095,7 +1095,7 @@ add_control_entry (ctrl_t ctrl, ssh_key_type_spec_t *spec,
       /* Not yet in the file - add it. Because the file has been
          opened in append mode, we simply need to write to it.  */
       tp = localtime (&atime);
-      fprintf (cf->fp,
+      es_fprintf (cf->fp,
                ("# %s key added on: %04d-%02d-%02d %02d:%02d:%02d\n"
                 "# Fingerprints:  %s\n"
                 "#                %s\n"
index 9e3483e..8642498 100644 (file)
@@ -1260,7 +1260,7 @@ cmd_keyinfo (assuan_context_t ctx, char *line)
   ctrl_t ctrl = assuan_get_pointer (ctx);
   int err;
   unsigned char grip[20];
-  DIR *dir = NULL;
+  gnupg_dir_t dir = NULL;
   int list_mode;
   int opt_data, opt_ssh_fpr, opt_with_ssh;
   ssh_control_file_t cf = NULL;
@@ -1316,7 +1316,7 @@ cmd_keyinfo (assuan_context_t ctx, char *line)
   else if (list_mode)
     {
       char *dirname;
-      struct dirent *dir_entry;
+      gnupg_dirent_t dir_entry;
 
       dirname = make_filename_try (gnupg_homedir (),
                                    GNUPG_PRIVATE_KEYS_DIR, NULL);
@@ -1325,7 +1325,7 @@ cmd_keyinfo (assuan_context_t ctx, char *line)
           err = gpg_error_from_syserror ();
           goto leave;
         }
-      dir = opendir (dirname);
+      dir = gnupg_opendir (dirname);
       if (!dir)
         {
           err = gpg_error_from_syserror ();
@@ -1334,7 +1334,7 @@ cmd_keyinfo (assuan_context_t ctx, char *line)
         }
       xfree (dirname);
 
-      while ( (dir_entry = readdir (dir)) )
+      while ( (dir_entry = gnupg_readdir (dir)) )
         {
           if (strlen (dir_entry->d_name) != 44
               || strcmp (dir_entry->d_name + 40, ".key"))
@@ -1385,8 +1385,7 @@ cmd_keyinfo (assuan_context_t ctx, char *line)
 
  leave:
   ssh_close_control_file (cf);
-  if (dir)
-    closedir (dir);
+  gnupg_closedir (dir);
   if (err && gpg_err_code (err) != GPG_ERR_NOT_FOUND)
     leave_cmd (ctx, err);
   return err;
@@ -3173,7 +3172,6 @@ cmd_getinfo (assuan_context_t ctx, char *line)
     }
   else if (!strcmp (line, "jent_active"))
     {
-#if GCRYPT_VERSION_NUMBER >= 0x010800
       char *buf;
       char *fields[5];
 
@@ -3185,9 +3183,6 @@ cmd_getinfo (assuan_context_t ctx, char *line)
       else
         rc = gpg_error (GPG_ERR_FALSE);
       gcry_free (buf);
-#else
-      rc = gpg_error (GPG_ERR_FALSE);
-#endif
     }
   else if (!strcmp (line, "s2k_count_cal"))
     {
index 758eab9..ff153c3 100644 (file)
@@ -158,7 +158,7 @@ convert_secret_key (gcry_sexp_t *r_key, int pubkey_algo, gcry_mpi_t *skey,
           if (!strcmp (curve, "Ed25519"))
             /* Do not store the OID as name but the real name and the
                EdDSA flag.  */
-            format = "(private-key(ecc(curve %s)(flags eddsa)(q%m)(d%m)))";
+            format = "(private-key(ecc(curve %s)(flags eddsa)(q%m)(d%M)))";
           else if (!strcmp (curve, "Curve25519"))
             format = "(private-key(ecc(curve %s)(flags djb-tweak)(q%m)(d%m)))";
           else
index b79f7a8..70a71e9 100644 (file)
@@ -79,7 +79,7 @@ ask_for_card (ctrl_t ctrl, const unsigned char *shadow_info, char **r_kid)
       rc = agent_card_serialno (ctrl, &serialno, want_sn);
       if (!rc)
         {
-          log_debug ("detected card with S/N %s\n", serialno);
+          log_info ("detected card with S/N %s\n", serialno);
           i = strcmp (serialno, want_sn);
           xfree (serialno);
           serialno = NULL;
@@ -93,13 +93,13 @@ ask_for_card (ctrl_t ctrl, const unsigned char *shadow_info, char **r_kid)
         }
       else if (gpg_err_code (rc) == GPG_ERR_ENODEV)
         {
-          log_debug ("no device present\n");
+          log_info ("no device present\n");
           rc = 0;
           no_card = 1;
         }
       else if (gpg_err_code (rc) == GPG_ERR_CARD_NOT_PRESENT)
         {
-          log_debug ("no card present\n");
+          log_info ("no card present\n");
           rc = 0;
           no_card = 2;
         }
@@ -436,6 +436,7 @@ getpin_cb (void *opaque, const char *desc_text, const char *info,
 int
 divert_pksign (ctrl_t ctrl, const char *desc_text,
                const unsigned char *digest, size_t digestlen, int algo,
+               const unsigned char *grip,
                const unsigned char *shadow_info, unsigned char **r_sig,
                size_t *r_siglen)
 {
@@ -450,6 +451,22 @@ divert_pksign (ctrl_t ctrl, const char *desc_text,
   if (rc)
     return rc;
 
+  /* For OpenPGP cards we better use the keygrip as key reference.
+   * This has the advantage that app-openpgp can check that the stored
+   * key matches our expectation.  This is important in case new keys
+   * have been created on the same card but the sub file has not been
+   * updated.  In that case we would get a error from our final
+   * signature checking code or, if the pubkey algo is different,
+   * weird errors from the card (Conditions of use not satisfied).  */
+  if (kid && grip && !strncmp (kid, "OPENPGP.", 8))
+    {
+      xfree (kid);
+      kid = bin2hex (grip, KEYGRIP_LEN, NULL);
+      if (!kid)
+        return gpg_error_from_syserror ();
+    }
+
+
   if (algo == MD_USER_TLS_MD5SHA1)
     {
       int save = ctrl->use_auth_call;
@@ -491,6 +508,7 @@ divert_pksign (ctrl_t ctrl, const char *desc_text,
 int
 divert_pkdecrypt (ctrl_t ctrl, const char *desc_text,
                   const unsigned char *cipher,
+                  const unsigned char *grip,
                   const unsigned char *shadow_info,
                   char **r_buf, size_t *r_len, int *r_padding)
 {
@@ -585,6 +603,21 @@ divert_pkdecrypt (ctrl_t ctrl, const char *desc_text,
   if (rc)
     return rc;
 
+  /* For OpenPGP cards we better use the keygrip as key reference.
+   * This has the advantage that app-openpgp can check that the stored
+   * key matches our expectation.  This is important in case new keys
+   * have been created on the same card but the sub file has not been
+   * updated.  In that case we would get a error from our final
+   * signature checking code or, if the pubkey algo is different,
+   * weird errors from the card (Conditions of use not satisfied).  */
+  if (kid && grip && !strncmp (kid, "OPENPGP.", 8))
+    {
+      xfree (kid);
+      kid = bin2hex (grip, KEYGRIP_LEN, NULL);
+      if (!kid)
+        return gpg_error_from_syserror ();
+    }
+
   rc = agent_card_pkdecrypt (ctrl, kid, getpin_cb, ctrl, NULL,
                              ciphertext, ciphertextlen,
                              &plaintext, &plaintextlen, r_padding);
index fa09d64..cea2195 100644 (file)
@@ -170,7 +170,7 @@ agent_write_private_key (const unsigned char *grip,
   /* FIXME: Write to a temp file first so that write failures during
      key updates won't lead to a key loss.  */
 
-  if (!force && !access (fname, F_OK))
+  if (!force && !gnupg_access (fname, F_OK))
     {
       log_error ("secret key file '%s' already exists\n", fname);
       xfree (fname);
@@ -1377,7 +1377,7 @@ agent_key_available (const unsigned char *grip)
 
   fname = make_filename (gnupg_homedir (), GNUPG_PRIVATE_KEYS_DIR,
                          hexgrip, NULL);
-  result = !access (fname, R_OK)? 0 : -1;
+  result = !gnupg_access (fname, R_OK)? 0 : -1;
   xfree (fname);
   return result;
 }
index d586cad..a0311b2 100644 (file)
@@ -48,3 +48,5 @@
       VALUE "Translation", 0x409, 0x4b0
     END
   END
+
+1 RT_MANIFEST "gpg-agent.w32-manifest"
index e03cc6b..795f282 100644 (file)
@@ -984,9 +984,7 @@ thread_init_once (void)
    * has already been initialized but at that point nPth was not
    * initialized and thus Libgcrypt could not set its system call
    * clamp.  */
-#if GCRYPT_VERSION_NUMBER >= 0x010800 /* 1.8.0 */
   gcry_control (GCRYCTL_REINIT_SYSCALL_CLAMP, 0, 0);
-#endif
 }
 
 
@@ -1156,7 +1154,7 @@ main (int argc, char **argv )
   if (configname)
     {
       configlineno = 0;
-      configfp = fopen (configname, "r");
+      configfp = gnupg_fopen (configname, "r");
       if (!configfp)
         {
           if (default_config)
@@ -1864,23 +1862,6 @@ agent_libgcrypt_progress_cb (void *data, const char *what, int printchar,
       break;
   if (dispatch && dispatch->cb)
     dispatch->cb (dispatch->ctrl, what, printchar, current, total);
-
-  /* Libgcrypt < 1.8 does not know about nPth and thus when it reads
-   * from /dev/random this will block the process.  To mitigate this
-   * problem we yield the thread when Libgcrypt tells us that it needs
-   * more entropy.  This way other threads have chance to run.  */
-#if GCRYPT_VERSION_NUMBER < 0x010800 /* 1.8.0 */
-  if (what && !strcmp (what, "need_entropy"))
-    {
-#if GPGRT_VERSION_NUMBER < 0x011900 /* 1.25 */
-      /* In older gpg-error versions gpgrt_yield is buggy for use with
-       * nPth and thus we need to resort to a sleep call.  */
-      npth_usleep (1000); /* 1ms */
-#else
-      gpgrt_yield ();
-#endif
-    }
-#endif
 }
 
 
@@ -2045,7 +2026,7 @@ reread_configuration (void)
   if (!config_filename)
     return; /* No config file. */
 
-  fp = fopen (config_filename, "r");
+  fp = gnupg_fopen (config_filename, "r");
   if (!fp)
     {
       log_info (_("option file '%s': %s\n"),
@@ -2307,17 +2288,27 @@ create_private_keys_directory (const char *home)
   struct stat statbuf;
 
   fname = make_filename (home, GNUPG_PRIVATE_KEYS_DIR, NULL);
-  if (stat (fname, &statbuf) && errno == ENOENT)
+  if (gnupg_stat (fname, &statbuf) && errno == ENOENT)
     {
       if (gnupg_mkdir (fname, "-rwx"))
         log_error (_("can't create directory '%s': %s\n"),
                    fname, strerror (errno) );
       else if (!opt.quiet)
         log_info (_("directory '%s' created\n"), fname);
+
+      if (gnupg_chmod (fname, "-rwx"))
+        log_error (_("can't set permissions of '%s': %s\n"),
+                   fname, strerror (errno));
+    }
+  else
+    {
+      /* The file exists or another error.  Make sure we have sensible
+       * permissions.  We enforce rwx for user but keep existing group
+       * permissions.  Permissions for other are always cleared.  */
+      if (gnupg_chmod (fname, "-rwx...---"))
+        log_error (_("can't set permissions of '%s': %s\n"),
+                   fname, strerror (errno));
     }
-  if (gnupg_chmod (fname, "-rwx"))
-    log_error (_("can't set permissions of '%s': %s\n"),
-               fname, strerror (errno));
   xfree (fname);
 }
 
@@ -2336,7 +2327,7 @@ create_directories (void)
   char *home;
 
   home = make_filename (gnupg_homedir (), NULL);
-  if ( stat (home, &statbuf) )
+  if (gnupg_stat (home, &statbuf))
     {
       if (errno == ENOENT)
         {
@@ -2424,7 +2415,7 @@ handle_tick (void)
   /* Check whether the homedir is still available.  */
   if (!shutdown_pending
       && (!have_homedir_inotify || !reliable_homedir_inotify)
-      && stat (gnupg_homedir (), &statbuf) && errno == ENOENT)
+      && gnupg_stat (gnupg_homedir (), &statbuf) && errno == ENOENT)
     {
       shutdown_pending = 1;
       log_info ("homedir has been removed - shutting down\n");
diff --git a/agent/gpg-agent.w32-manifest.in b/agent/gpg-agent.w32-manifest.in
new file mode 100644 (file)
index 0000000..d865aef
--- /dev/null
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+<description>GNU Privacy Guard (Private key daemon)</description>
+<assemblyIdentity
+    type="win32"
+    name="GnuPG.gpg-agent"
+    version="@BUILD_VERSION@"
+    />
+<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
+  <application>
+    <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/><!-- 10 -->
+    <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/><!-- 8.1 -->
+    <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/><!-- 8 -->
+    <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/><!-- 7 -->
+    <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/><!-- Vista -->
+  </application>
+</compatibility>
+</assembly>
index 06a8e0b..6aed96b 100644 (file)
@@ -86,7 +86,8 @@ agent_pkdecrypt (ctrl_t ctrl, const char *desc_text,
           goto leave;
         }
 
-      rc = divert_pkdecrypt (ctrl, desc_text, ciphertext, shadow_info,
+      rc = divert_pkdecrypt (ctrl, desc_text, ciphertext,
+                             ctrl->keygrip, shadow_info,
                              &buf, &len, r_padding);
       if (rc)
         {
index f54af08..09d61b8 100644 (file)
@@ -356,6 +356,7 @@ agent_pksign_do (ctrl_t ctrl, const char *cache_nonce,
         err = divert_pksign (ctrl, desc2? desc2 : desc_text,
                              data, datalen,
                              ctrl->digest.algo,
+                             ctrl->keygrip,
                              shadow_info, &buf, &len);
         xfree (desc2);
       }
@@ -473,12 +474,6 @@ agent_pksign_do (ctrl_t ctrl, const char *cache_nonce,
       if (err)
         goto leave;
 
-      if (dsaalgo == 0 && GCRYPT_VERSION_NUMBER < 0x010700)
-        {
-          /* It's RSA and Libgcrypt < 1.7 */
-          check_signature = 1;
-        }
-
       if (DBG_CRYPTO)
         {
           gcry_log_debugsxp ("skey", s_skey);
index 0ba31c1..f55a735 100644 (file)
@@ -275,7 +275,7 @@ read_file (const char *fname, size_t *r_length)
     {
       struct stat st;
 
-      fp = fopen (fname, "rb");
+      fp = gnupg_fopen (fname, "rb");
       if (!fp)
         {
           log_error ("can't open '%s': %s\n", fname, strerror (errno));
index 1766909..87df685 100644 (file)
@@ -1725,6 +1725,7 @@ parse_shadow_info (const unsigned char *shadow_info,
         }
       memcpy (*r_idstr, s, n);
       (*r_idstr)[n] = 0;
+      trim_spaces (*r_idstr);
     }
 
   /* Parse the optional PINLEN.  */
index af177b2..50f2ad4 100644 (file)
@@ -186,6 +186,7 @@ read_one_trustfile (const char *fname, int allow_include,
         {
           char *etcname;
           gpg_error_t err2;
+          gpg_err_code_t ec;
 
           if (!allow_include)
             {
@@ -199,7 +200,7 @@ read_one_trustfile (const char *fname, int allow_include,
           if ( !strcmp (etcname, fname) ) /* Same file. */
             log_info (_("statement \"%s\" ignored in '%s', line %d\n"),
                       "include-default", fname, lnr);
-          else if ( access (etcname, F_OK) && errno == ENOENT )
+          else if ((ec=gnupg_access (etcname, F_OK)) && ec == GPG_ERR_ENOENT)
             {
               /* A non existent system trustlist is not an error.
                  Just print a note. */
@@ -337,6 +338,7 @@ read_trustfiles (void)
   size_t tablesize;
   char *fname;
   int allow_include = 1;
+  gpg_err_code_t ec;
 
   tablesize = 20;
   table = xtrycalloc (tablesize, sizeof *table);
@@ -352,13 +354,13 @@ read_trustfiles (void)
       return err;
     }
 
-  if ( access (fname, F_OK) )
+  if ((ec = gnupg_access (fname, F_OK)))
     {
-      if ( errno == ENOENT )
+      if ( ec == GPG_ERR_ENOENT )
         ; /* Silently ignore a non-existing trustfile.  */
       else
         {
-          err = gpg_error_from_syserror ();
+          err = gpg_error (ec);
           log_error (_("error opening '%s': %s\n"), fname, gpg_strerror (err));
         }
       xfree (fname);
@@ -602,6 +604,7 @@ gpg_error_t
 agent_marktrusted (ctrl_t ctrl, const char *name, const char *fpr, int flag)
 {
   gpg_error_t err = 0;
+  gpg_err_code_t ec;
   char *desc;
   char *fname;
   estream_t fp;
@@ -619,7 +622,7 @@ agent_marktrusted (ctrl_t ctrl, const char *name, const char *fpr, int flag)
   if (!fname)
     return gpg_error_from_syserror ();
 
-  if ( access (fname, W_OK) && errno != ENOENT)
+  if ((ec = access (fname, W_OK)) && ec != GPG_ERR_ENOENT)
     {
       xfree (fname);
       return gpg_error (GPG_ERR_EPERM);
@@ -752,12 +755,12 @@ agent_marktrusted (ctrl_t ctrl, const char *name, const char *fpr, int flag)
       xfree (nameformatted);
       return err;
     }
-  if ( access (fname, F_OK) && errno == ENOENT)
+  if ((ec = access (fname, F_OK)) && ec == GPG_ERR_ENOENT)
     {
       fp = es_fopen (fname, "wx,mode=-rw-r");
       if (!fp)
         {
-          err = gpg_error_from_syserror ();
+          err = gpg_error (ec);
           log_error ("can't create '%s': %s\n", fname, gpg_strerror (err));
           xfree (fname);
           unlock_trusttable ();
index f6e97ea..7dc5be4 100644 (file)
@@ -110,7 +110,7 @@ help:
        @echo 'Use CUSTOM_SWDB=1 for an already downloaded swdb.lst.'
        @echo 'Use WIXPREFIX to provide the WIX binaries for the MSI package.'
        @echo '    Using WIX also requires wine with installed wine mono.'
-       @echo '    Seee help-wixlib for more information'
+       @echo '    See help-wixlib for more information'
 
 help-wixlib:
        @echo 'The buildsystem can create a wixlib to build MSI packages.'
index fb452d5..9eb4fb4 100644 (file)
@@ -627,6 +627,7 @@ Section "GnuPG" SEC_gnupg
   File "bin/gpgtar.exe"
   File "libexec/dirmngr_ldap.exe"
   File "libexec/gpg-preset-passphrase.exe"
+  File "libexec/gpg-check-pattern.exe"
   File "libexec/gpg-wks-client.exe"
 
   ClearErrors
@@ -657,6 +658,11 @@ Section "GnuPG" SEC_gnupg
   File "share/gnupg/distsigkey.gpg"
   File "share/gnupg/sks-keyservers.netCA.pem"
 
+  SetOutPath "$INSTDIR\share\doc\gnupg\examples"
+  File "share/doc/gnupg/examples/VS-NfD.prf"
+  File "share/doc/gnupg/examples/Automatic.prf"
+  File "share/doc/gnupg/examples/pwpattern.list"
+
   SetOutPath "$INSTDIR\share\locale\ca\LC_MESSAGES"
   File share/locale/ca/LC_MESSAGES/gnupg2.mo
   SetOutPath "$INSTDIR\share\locale\cs\LC_MESSAGES"
@@ -1315,8 +1321,14 @@ Section "-un.gnupg"
   Delete "$INSTDIR\bin\gpgtar.exe"
   Delete "$INSTDIR\bin\dirmngr_ldap.exe"
   Delete "$INSTDIR\bin\gpg-preset-passphrase.exe"
+  Delete "$INSTDIR\bin\gpg-check-pattern.exe"
   Delete "$INSTDIR\bin\gpg-wks-client.exe"
 
+  Delete "$INSTDIR\share\doc\gnupg\examples\VS-NfD.prf"
+  Delete "$INSTDIR\share\doc\gnupg\examples\Automatic.prf"
+  Delete "$INSTDIR\share\doc\gnupg\examples\pwpattern.list"
+  RMDir  "$INSTDIR\share\doc\gnupg\examples"
+
   Delete "$INSTDIR\share\gnupg\sks-keyservers.netCA.pem"
   Delete "$INSTDIR\share\gnupg\dirmngr-conf.skel"
   Delete "$INSTDIR\share\gnupg\distsigkey.gpg"
index a92fbf6..d3ffc08 100644 (file)
@@ -64,6 +64,9 @@ and then manually edited:
       <Component Id="cmp6C1FB70721B208E33DB24296B93AB93F" Directory="dirAA72FFDDFA224FB221D53750596B0142" Guid="FE29D2AA-3151-4421-B8C0-355F69F267A1">
         <File Id="fil563D2C0464DCE7ECADE6E15C0FC65821" KeyPath="yes" Source="$(var.SourceDir)\libexec\gpg-preset-passphrase.exe"/>
       </Component>
+      <Component Id="cmp6C1FB70721B208E33DB24296B93AB940" Directory="dirAA72FFDDFA224FB221D53750596B0142" Guid="FE29D2AA-3151-4421-B8C0-355F69F267A2">
+        <File Id="fil563D2C0464DCE7ECADE6E15C0FC65822" KeyPath="yes" Source="$(var.SourceDir)\libexec\gpg-check-pattern.exe"/>
+      </Component>
       <Component Id="cmpB87CCF9DDCB6D9B36B92B0F9FA24FDC9" Directory="dirAA72FFDDFA224FB221D53750596B0142" Guid="9BB809F3-C09B-4A1E-B52D-B68CBE59AE3B">
         <File Id="fil8A3F9D3F6E36120B183DDF4981D84C1B" KeyPath="yes" Source="$(var.SourceDir)\libexec\gpg-wks-client.exe"/>
       </Component>
@@ -73,6 +76,9 @@ and then manually edited:
       <Component Id="cmpAF601EA2DF4EFD403CBF65A0D5162912" Directory="dirAA72FFDDFA224FB221D53750596B0142" Guid="28A7D50E-4BC0-4A38-8420-52C5D1EB3F55">
         <File Id="fil00B1F6AD370147577D6F7C998ACE6121" KeyPath="yes" Source="$(var.SourceDir)\bin\gpgconf.exe"/>
       </Component>
+      <Component Id="cmpAF601EA2DF4EFD403CBF65A0D5162922" Directory="dirAA72FFDDFA224FB221D53750596B0142" Guid="EEF227D9-1FA3-4A96-AF86-12D1FDC12925">
+        <File Id="fil00B1F6AD370147577D6F7C998ACE6122" KeyPath="yes" Source="$(var.SourceDir)\bin\gpgconf-w32.exe"/>
+      </Component>
       <Component Id="cmp3BA8A06E4085F542FDAA78BAFB507AD4" Directory="dirAA72FFDDFA224FB221D53750596B0142" Guid="E026569F-F37A-49FC-A529-68BDE3097218">
         <File Id="fil1A596ECA8DC19F8EC626168033269CFE" KeyPath="yes" Source="$(var.SourceDir)\libexec\gpgme-w32spawn.exe"/>
       </Component>
@@ -152,7 +158,13 @@ and then manually edited:
         <File Id="fil0615847C26E386E0B892124531F2ABBC" KeyPath="yes" Source="$(var.SourceDir)\lib\libnpth.dll.a" Name="libnpth.imp"/>
       </Component>
       <Component Id="cmp909B0412FDFCFD5092D93932AF982A72" Directory="dirC2E6BF1CC65903EA3A1AD83349586122" Guid="D30E7138-0D1C-48F4-8F53-E1EC6333F610">
-        <File Id="fil322067E40CE41C36574A7CC520D75876" KeyPath="yes" Source="$(var.SourceDir)\share\doc\gnupg\examples\vsnfd.prf" Name="VS-NfD.prf"/>
+        <File Id="fil322067E40CE41C36574A7CC520D75876" KeyPath="yes" Source="$(var.SourceDir)\share\doc\gnupg\examples\VS-NfD.prf" Name="VS-NfD.prf"/>
+      </Component>
+      <Component Id="cmp909B0412FDFCFD5092D93932AF982A73" Directory="dirC2E6BF1CC65903EA3A1AD83349586122" Guid="D30E7138-0D1C-48F4-8F53-E1EC6333F611">
+        <File Id="fil322067E40CE41C36574A7CC520D75877" KeyPath="yes" Source="$(var.SourceDir)\share\doc\gnupg\examples\Automatic.prf" Name="Automatic.prf"/>
+      </Component>
+      <Component Id="cmp909B0412FDFCFD5092D93932AF982A74" Directory="dirC2E6BF1CC65903EA3A1AD83349586122" Guid="D30E7138-0D1C-48F4-8F53-E1EC6333F612">
+        <File Id="fil322067E40CE41C36574A7CC520D75878" KeyPath="yes" Source="$(var.SourceDir)\share\doc\gnupg\examples\pwpattern.list" Name="pwpattern.list"/>
       </Component>
       <Component Id="cmp59D652F2B6BBFD90563BF58D6CE6BE7B" Directory="dirF4B1502A83344E3C92AB58989653B465" Guid="1C51D4AF-B308-40A3-B8D8-CEDA5AB2A383">
         <File Id="filCB1BD20C87EE88A17D7502E26268DA65" KeyPath="yes" Source="$(var.SourceDir)\share\gnupg\distsigkey.gpg"/>
index c29f8e9..c04cf83 100644 (file)
 
 #else /* Used by GnuPG  */
 
+/* GnuPG has always been a part of the GNU project and thus we have
+ * shown the FSF as holder of the copyright.  We continue to do so for
+ * the reason that without the FSF the free software used all over the
+ * world would not have come into existence.  However, under Windows
+ * we print a different copyright string with --version because the
+ * copyright assignments of g10 Code and Werner Koch were terminated
+ * many years ago, g10 Code is still the major contributor to the
+ * code, and Windows is not an FSF endorsed platform.  Note that the
+ * list of copyright holders can be found in the AUTHORS file.  */
+
 # define ARGPARSE_GPL_VERSION      3
+# ifdef HAVE_W32_SYSTEM
+# define ARGPARSE_CRIGHT_STR "Copyright (C) 2020 g10 Code GmbH"
+# else
 # define ARGPARSE_CRIGHT_STR "Copyright (C) 2020 Free Software Foundation, Inc."
+# endif
 
 #endif /*GNUPG_MAJOR_VERSION*/
 
index e533dd4..e77b1af 100644 (file)
@@ -499,7 +499,6 @@ gnupg_rng_is_compliant (enum gnupg_compliance_mode compliance)
       /* In DE_VS mode under Windows we require that the JENT RNG
        * is active.  */
 #ifdef HAVE_W32_SYSTEM
-# if GCRYPT_VERSION_NUMBER >= 0x010800
       char *buf;
       char *fields[5];
 
@@ -511,9 +510,6 @@ gnupg_rng_is_compliant (enum gnupg_compliance_mode compliance)
       else
         result = 0;
       gcry_free (buf);
-# else
-      result = 0;  /* No JENT - can't be compliant.  */
-# endif
 #else /*!HAVE_W32_SYSTEM*/
       result = 1;  /* Not Windows - RNG is good.  */
 #endif /*!HAVE_W32_SYSTEM*/
index 5227bb6..e2cf6f6 100644 (file)
@@ -471,6 +471,21 @@ map_w32_to_errno (DWORD w32_err)
 }
 #endif /*HAVE_DOSISH_SYSTEM*/
 
+
+#ifdef HAVE_W32_SYSTEM
+static int
+any8bitchar (const char *string)
+{
+  if (string)
+    for ( ; *string; string++)
+      if ((*string & 0x80))
+        return 1;
+  return 0;
+}
+#endif /*HAVE_W32_SYSTEM*/
+
+
+
 \f
 /* Entirely disable all locking.  This function should be called
    before any locking is done.  It may be called right at startup of
@@ -794,7 +809,7 @@ dotlock_create_w32 (dotlock_t h, const char *file_to_lock)
   h->next = all_lockfiles;
   all_lockfiles = h;
 
-  h->lockname = xtrymalloc ( strlen (file_to_lock) + 6 );
+  h->lockname = strconcat (file_to_lock, EXTSEP_S "lock", NULL);
   if (!h->lockname)
     {
       all_lockfiles = h->next;
@@ -802,7 +817,6 @@ dotlock_create_w32 (dotlock_t h, const char *file_to_lock)
       xfree (h);
       return NULL;
     }
-  strcpy (stpcpy(h->lockname, file_to_lock), EXTSEP_S "lock");
 
   /* If would be nice if we would use the FILE_FLAG_DELETE_ON_CLOSE
      along with FILE_SHARE_DELETE but that does not work due to a race
@@ -812,25 +826,24 @@ dotlock_create_w32 (dotlock_t h, const char *file_to_lock)
      reasons why a lock file can't be created and thus the process
      would not stop as expected but spin until Windows crashes.  Our
      solution is to keep the lock file open; that does not harm. */
-  {
-#ifdef HAVE_W32CE_SYSTEM
-    wchar_t *wname = utf8_to_wchar (h->lockname);
-
-    if (wname)
-      h->lockhd = CreateFile (wname,
-                              GENERIC_READ|GENERIC_WRITE,
-                              FILE_SHARE_READ|FILE_SHARE_WRITE,
-                              NULL, OPEN_ALWAYS, 0, NULL);
-    else
-      h->lockhd = INVALID_HANDLE_VALUE;
-    xfree (wname);
-#else
-    h->lockhd = CreateFile (h->lockname,
-                            GENERIC_READ|GENERIC_WRITE,
-                            FILE_SHARE_READ|FILE_SHARE_WRITE,
-                            NULL, OPEN_ALWAYS, 0, NULL);
-#endif
-  }
+  if (any8bitchar (h->lockname))
+    {
+      wchar_t *wname = utf8_to_wchar (h->lockname);
+
+      if (wname)
+        h->lockhd = CreateFileW (wname,
+                                 GENERIC_READ|GENERIC_WRITE,
+                                 FILE_SHARE_READ|FILE_SHARE_WRITE,
+                                 NULL, OPEN_ALWAYS, 0, NULL);
+      else
+        h->lockhd = INVALID_HANDLE_VALUE;
+      xfree (wname);
+    }
+  else
+    h->lockhd = CreateFileA (h->lockname,
+                             GENERIC_READ|GENERIC_WRITE,
+                             FILE_SHARE_READ|FILE_SHARE_WRITE,
+                             NULL, OPEN_ALWAYS, 0, NULL);
   if (h->lockhd == INVALID_HANDLE_VALUE)
     {
       int saveerrno = map_w32_to_errno (GetLastError ());
index 3acf74a..0782152 100644 (file)
@@ -835,14 +835,15 @@ gpg_error_t
 gnupg_spawn_process_detached (const char *pgmname, const char *argv[],
                               const char *envp[] )
 {
+  gpg_err_code_t ec;
   pid_t pid;
   int i;
 
   if (getuid() != geteuid())
     return my_error (GPG_ERR_BUG);
 
-  if (access (pgmname, X_OK))
-    return my_error_from_syserror ();
+  if ((ec = gnupg_access (pgmname, X_OK)))
+    return gpg_err_make (default_errsource, ec);
 
   pid = fork ();
   if (pid == (pid_t)(-1))
index da17450..7bd9d22 100644 (file)
@@ -855,13 +855,13 @@ gnupg_spawn_process_detached (const char *pgmname, const char *argv[],
   STARTUPINFO si;
   int cr_flags;
   char *cmdline;
-
+  gpg_err_code_t ec;
 
   /* We don't use ENVP.  */
   (void)envp;
 
-  if (access (pgmname, X_OK))
-    return my_error_from_syserror ();
+  if ((ec = gnupg_access (pgmname, X_OK)))
+    return gpg_err_make (default_errsource, ec);
 
   /* Prepare security attributes.  */
   memset (&sec_attr, 0, sizeof sec_attr );
index 4ad99f5..03c152f 100644 (file)
@@ -31,6 +31,9 @@
 #include <stdlib.h>
 #include <time.h>
 #include <ctype.h>
+#ifdef HAVE_LOCALE_H
+#include <locale.h>
+#endif
 #ifdef HAVE_LANGINFO_H
 #include <langinfo.h>
 #endif
@@ -679,9 +682,9 @@ isotimestamp (u32 stamp)
 const char *
 asctimestamp (u32 stamp)
 {
-  static char buffer[50];
+  static char buffer[80];
 #if defined (HAVE_STRFTIME) && defined (HAVE_NL_LANGINFO)
-  static char fmt[50];
+  static char fmt[80];
 #endif
   struct tm *tp;
   time_t atime = stamp;
@@ -707,6 +710,32 @@ asctimestamp (u32 stamp)
      zone at all.  */
   strftime (buffer, DIM(buffer)-1, "%c", tp);
 # else
+#  if HAVE_W32_SYSTEM
+  {
+    static int done;
+
+    if (!done)
+      {
+        /* The locale names as used by Windows are in the form
+         * "German_Germany.1252" or "German_Austria.1252" with
+         * alternate names similar to Unix, e.g. "de-DE".  However
+         * that is the theory.  On current Windows and Mingw the
+         * alternate names do not work.  We would need a table to map
+         * them from the short names as provided by gpgrt to the long
+         * names and append some code page.  For now we use "" and
+         * take the locale from the user's system settings.  Thus the
+         * standard Unix envvars don't work for time and may mismatch
+         * with the string translations.  The new UCRT available since
+         * 2018 has a lot of additional support but that will for sure
+         * break other things.  We should move to ISO strings to get
+         * rid of such problems.  */
+        setlocale (LC_TIME, "");
+        done = 1;
+        /* log_debug ("LC_ALL  now '%s'\n", setlocale (LC_ALL, NULL)); */
+        /* log_debug ("LC_TIME now '%s'\n", setlocale (LC_TIME, NULL)); */
+      }
+  }
+#  endif
    /* FIXME: we should check whether the locale appends a " %Z" These
     * locales from glibc don't put the " %Z": fi_FI hr_HR ja_JP lt_LT
     * lv_LV POSIX ru_RU ru_SU sv_FI sv_SE zh_CN.  */
index 7cb01a4..7a7a235 100644 (file)
@@ -41,14 +41,14 @@ static char *
 findkey_fname (const char *key, const char *fname)
 {
   gpg_error_t err = 0;
-  FILE *fp;
+  estream_t fp;
   int lnr = 0;
   int c;
   char *p, line[256];
   int in_item = 0;
   membuf_t mb = MEMBUF_ZERO;
 
-  fp = fopen (fname, "r");
+  fp = es_fopen (fname, "r");
   if (!fp)
     {
       if (errno != ENOENT)
@@ -59,14 +59,14 @@ findkey_fname (const char *key, const char *fname)
       return NULL;
     }
 
-  while (fgets (line, DIM(line)-1, fp))
+  while (es_fgets (line, DIM(line)-1, fp))
     {
       lnr++;
 
       if (!*line || line[strlen(line)-1] != '\n')
         {
           /* Eat until end of line. */
-          while ( (c=getc (fp)) != EOF && c != '\n')
+          while ((c = es_getc (fp)) != EOF && c != '\n')
             ;
           err = gpg_error (*line? GPG_ERR_LINE_TOO_LONG
                            : GPG_ERR_INCOMPLETE_LINE);
@@ -130,14 +130,14 @@ findkey_fname (const char *key, const char *fname)
         }
 
     }
-  if ( !err && ferror (fp) )
+  if ( !err && es_ferror (fp) )
     {
       err = gpg_error_from_syserror ();
       log_error (_("error reading '%s', line %d: %s\n"),
                  fname, lnr, gpg_strerror (err));
     }
 
-  fclose (fp);
+  es_fclose (fp);
   if (is_membuf_ready (&mb))
     {
       /* We have collected something.  */
index 4b6e46e..85e09c4 100644 (file)
@@ -61,6 +61,7 @@
 
 #include "util.h"
 #include "sysutils.h"
+#include "i18n.h"
 #include "zb32.h"
 
 /* The GnuPG homedir.  This is only accessed by the functions
@@ -117,14 +118,16 @@ w32_try_mkdir (const char *dir)
 #endif
 
 
-/* This is a helper function to load a Windows function from either of
-   one DLLs. */
+/* This is a helper function to load and call a Windows function from
+ * either of one DLLs.  On success an UTF-8 file name is returned.
+ * ERRNO is _not_ set on error.  */
 #ifdef HAVE_W32_SYSTEM
-static HRESULT
-w32_shgetfolderpath (HWND a, int b, HANDLE c, DWORD d, LPSTR e)
+static char *
+w32_shgetfolderpath (HWND a, int b, HANDLE c, DWORD d)
 {
   static int initialized;
-  static HRESULT (WINAPI * func)(HWND,int,HANDLE,DWORD,LPSTR);
+  static HRESULT (WINAPI * func)(HWND,int,HANDLE,DWORD,LPWSTR);
+  wchar_t wfname[MAX_PATH];
 
   if (!initialized)
     {
@@ -139,7 +142,7 @@ w32_shgetfolderpath (HWND a, int b, HANDLE c, DWORD d, LPSTR e)
           handle = dlopen (dllnames[i], RTLD_LAZY);
           if (handle)
             {
-              func = dlsym (handle, "SHGetFolderPathA");
+              func = dlsym (handle, "SHGetFolderPathW");
               if (!func)
                 {
                   dlclose (handle);
@@ -149,10 +152,10 @@ w32_shgetfolderpath (HWND a, int b, HANDLE c, DWORD d, LPSTR e)
         }
     }
 
-  if (func)
-    return func (a,b,c,d,e);
+  if (func && func (a,b,c,d,wfname) >= 0)
+    return wchar_to_utf8 (wfname);
   else
-    return -1;
+    return NULL;
 }
 #endif /*HAVE_W32_SYSTEM*/
 
@@ -248,25 +251,17 @@ standard_homedir (void)
         }
       else
         {
-          char path[MAX_PATH];
-
-          /* It might be better to use LOCAL_APPDATA because this is
-             defined as "non roaming" and thus more likely to be kept
-             locally.  For private keys this is desired.  However,
-             given that many users copy private keys anyway forth and
-             back, using a system roaming services might be better
-             than to let them do it manually.  A security conscious
-             user will anyway use the registry entry to have better
-             control.  */
-          if (w32_shgetfolderpath (NULL, CSIDL_APPDATA|CSIDL_FLAG_CREATE,
-                                   NULL, 0, path) >= 0)
+          char *path;
+
+          path = w32_shgetfolderpath (NULL, CSIDL_APPDATA|CSIDL_FLAG_CREATE,
+                                      NULL, 0);
+          if (path)
             {
-              char *tmp = xmalloc (strlen (path) + 6 +1);
-              strcpy (stpcpy (tmp, path), "\\gnupg");
-              dir = tmp;
+              dir = xstrconcat (path, "\\gnupg", NULL);
+              xfree (path);
 
               /* Try to create the directory if it does not yet exists.  */
-              if (access (dir, F_OK))
+              if (gnupg_access (dir, F_OK))
                 w32_try_mkdir (dir);
             }
           else
@@ -360,10 +355,10 @@ check_portable_app (const char *dir)
   char *fname;
 
   fname = xstrconcat (dir, DIRSEP_S "gpgconf.exe", NULL);
-  if (!access (fname, F_OK))
+  if (!gnupg_access (fname, F_OK))
     {
       strcpy (fname + strlen (fname) - 3, "ctl");
-      if (!access (fname, F_OK))
+      if (!gnupg_access (fname, F_OK))
         {
           /* gpgconf.ctl file found.  Record this fact.  */
           w32_portable_app = 1;
@@ -440,7 +435,7 @@ w32_commondir (void)
   if (!dir)
     {
       const char *rdir;
-      char path[MAX_PATH];
+      char *path;
 
       /* Make sure that w32_rootdir has been called so that we are
          able to check the portable application flag.  The common dir
@@ -450,19 +445,17 @@ w32_commondir (void)
       if (w32_portable_app)
         return rdir;
 
-      if (w32_shgetfolderpath (NULL, CSIDL_COMMON_APPDATA,
-                               NULL, 0, path) >= 0)
+      path = w32_shgetfolderpath (NULL, CSIDL_COMMON_APPDATA, NULL, 0);
+      if (path)
         {
-          char *tmp = xmalloc (strlen (path) + 4 +1);
-          strcpy (stpcpy (tmp, path), "\\GNU");
-          dir = tmp;
+          dir = xstrconcat (path, "\\GNU", NULL);
           /* No auto create of the directory.  Either the installer or
-             the admin has to create these directories.  */
+           * the admin has to create these directories.  */
         }
       else
         {
-          /* Ooops: Not defined - probably an old Windows version.
-             Use the installation directory instead.  */
+          /* Folder not found or defined - probably an old Windows
+           * version.  Use the installation directory instead.  */
           dir = xstrdup (rdir);
         }
     }
@@ -497,6 +490,38 @@ gnupg_set_homedir (const char *newdir)
 }
 
 
+/* Create the homedir directory only if the supplied directory name is
+ * the same as the default one.  This way we avoid to create arbitrary
+ * directories when a non-default home directory is used.  To cope
+ * with HOME, we do compare only the suffix if we see that the default
+ * homedir does start with a tilde.  If the mkdir fails the function
+ * terminates the process.  If QUIET is set not diagnostic is printed
+ * on homedir creation.  */
+void
+gnupg_maybe_make_homedir (const char *fname, int quiet)
+{
+  const char *defhome = standard_homedir ();
+
+  if (
+#ifdef HAVE_W32_SYSTEM
+      ( !compare_filenames (fname, defhome) )
+#else
+      ( *defhome == '~'
+        && (strlen(fname) >= strlen (defhome+1)
+            && !strcmp(fname+strlen(fname)-strlen(defhome+1), defhome+1 ) ))
+      || (*defhome != '~'  && !compare_filenames( fname, defhome ) )
+#endif
+      )
+    {
+      if (gnupg_mkdir (fname, "-rwx"))
+        log_fatal ( _("can't create directory '%s': %s\n"),
+                    fname, strerror(errno) );
+      else if (!quiet )
+        log_info ( _("directory '%s' created\n"), fname );
+    }
+}
+
+
 /* Return the homedir.  The returned string is valid until another
  * gnupg-set-homedir call.  This is always an absolute directory name.
  * The function replaces the former global var opt.homedir.  */
@@ -903,7 +928,7 @@ gnupg_cachedir (void)
         }
       else
         {
-          char path[MAX_PATH];
+          char *path;
           const char *s1[] = { "GNU", "cache", "gnupg", NULL };
           int s1_len;
           const char **comp;
@@ -912,8 +937,10 @@ gnupg_cachedir (void)
           for (comp = s1; *comp; comp++)
             s1_len += 1 + strlen (*comp);
 
-          if (w32_shgetfolderpath (NULL, CSIDL_LOCAL_APPDATA|CSIDL_FLAG_CREATE,
-                                   NULL, 0, path) >= 0)
+          path = w32_shgetfolderpath (NULL,
+                                      CSIDL_LOCAL_APPDATA|CSIDL_FLAG_CREATE,
+                                      NULL, 0);
+          if (path)
             {
               char *tmp = xmalloc (strlen (path) + s1_len + 1);
               char *p;
@@ -924,11 +951,12 @@ gnupg_cachedir (void)
                   p = stpcpy (p, "\\");
                   p = stpcpy (p, *comp);
 
-                  if (access (tmp, F_OK))
+                  if (gnupg_access (tmp, F_OK))
                     w32_try_mkdir (tmp);
                 }
 
               dir = tmp;
+              xfree (path);
             }
           else
             {
@@ -976,6 +1004,8 @@ get_default_pinentry_name (int reset)
     /* Try Gpg4win directory (with bin and without.) */
     { w32_rootdir, "\\..\\Gpg4win\\bin\\pinentry.exe" },
     { w32_rootdir, "\\..\\Gpg4win\\pinentry.exe" },
+    /* Try a pinentry in a dir above us */
+    { w32_rootdir, "\\..\\bin\\pinentry.exe" },
     /* Try old Gpgwin directory.  */
     { w32_rootdir, "\\..\\GNU\\GnuPG\\pinentry.exe" },
     /* Try a Pinentry from the common GNU dir.  */
@@ -1002,7 +1032,7 @@ get_default_pinentry_name (int reset)
           char *name2;
 
           name2 = xstrconcat (names[i].rfnc (), names[i].name, NULL);
-          if (!access (name2, F_OK))
+          if (!gnupg_access (name2, F_OK))
             {
               /* Use that pinentry.  */
               xfree (name);
index b20761b..4fd8cf5 100644 (file)
@@ -193,6 +193,19 @@ fd_cache_strcmp (const char *a, const char *b)
 #endif
 }
 
+
+#ifdef HAVE_W32_SYSTEM
+static int
+any8bitchar (const char *string)
+{
+  if (string)
+    for ( ; *string; string++)
+      if ((*string & 0x80))
+        return 1;
+  return 0;
+}
+#endif /*HAVE_W32_SYSTEM*/
+
 /*
  * Invalidate (i.e. close) a cached iobuf
  */
@@ -294,21 +307,23 @@ direct_open (const char *fname, const char *mode, int mode700)
       sm = FILE_SHARE_READ;
     }
 
-#ifdef HAVE_W32CE_SYSTEM
-  {
-    wchar_t *wfname = utf8_to_wchar (fname);
-    if (wfname)
-      {
-        hfile = CreateFile (wfname, da, sm, NULL, cd,
-                            FILE_ATTRIBUTE_NORMAL, NULL);
-        xfree (wfname);
-      }
-    else
-      hfile = INVALID_HANDLE_VALUE;
-  }
-#else
-  hfile = CreateFile (fname, da, sm, NULL, cd, FILE_ATTRIBUTE_NORMAL, NULL);
-#endif
+  /* We use the Unicode version of the function only if needed to
+   * avoid an extra conversion step.  */
+  if (any8bitchar (fname))
+    {
+      wchar_t *wfname = utf8_to_wchar (fname);
+      if (wfname)
+        {
+          hfile = CreateFileW (wfname, da, sm, NULL, cd,
+                               FILE_ATTRIBUTE_NORMAL, NULL);
+          xfree (wfname);
+        }
+      else
+        hfile = INVALID_HANDLE_VALUE;
+    }
+  else
+    hfile = CreateFileA (fname, da, sm, NULL, cd, FILE_ATTRIBUTE_NORMAL, NULL);
+
   return hfile;
 
 #else /*!HAVE_W32_SYSTEM*/
index c26cfee..6fb98c3 100644 (file)
@@ -78,7 +78,7 @@ gnupg_amkdir_p (const char **directory_components)
 
       /* log_debug ("%s: stat(%s)\n", __func__, dirs[i]); */
 
-      if (!stat (dirs[i], &s))
+      if (!gnupg_stat (dirs[i], &s))
         {
           if ( ! S_ISDIR (s.st_mode))
             {
index dc62f36..d5564e4 100644 (file)
@@ -35,6 +35,7 @@ enum
     STATUS_ENTER,
     STATUS_LEAVE,
     STATUS_ABORT,
+    STATUS_CANCELED_BY_USER,
 
     STATUS_GOODSIG,
     STATUS_BADSIG,
index 2673e45..520aa56 100644 (file)
@@ -73,6 +73,7 @@
 # include <npth.h>
 #endif
 #include <fcntl.h>
+#include <dirent.h>
 
 #include <assuan.h>
 
 
 #define tohex(n) ((n) < 10 ? ((n) + '0') : (((n) - 10) + 'A'))
 
+
+/* The object used with our opendir functions.  We need to define our
+ * own so that we can properly handle Unicode on Windows.  */
+struct gnupg_dir_s
+{
+#ifdef HAVE_W32_SYSTEM
+  _WDIR *dir;                    /* The system's DIR pointer.  */
+#else
+  DIR *dir;                      /* The system's DIR pointer.  */
+#endif
+  struct gnupg_dirent_s dirent;  /* The current dirent.  */
+  size_t namesize;  /* If not 0 the allocated size of dirent.d_name.  */
+  char name[256];   /* Only used if NAMESIZE is 0.  */
+};
+
+
 /* Flag to tell whether special file names are enabled.  See gpg.c for
  * an explanation of these file names.  */
 static int allow_special_filenames;
@@ -171,6 +188,18 @@ enable_core_dumps (void)
 #endif
 }
 
+#ifdef HAVE_W32_SYSTEM
+static int
+any8bitchar (const char *string)
+{
+  if (string)
+    for ( ; *string; string++)
+      if ((*string & 0x80))
+        return 1;
+  return 0;
+}
+#endif /*HAVE_W32_SYSTEM*/
+
 
 /* Allow the use of special "-&nnn" style file names.  */
 void
@@ -629,7 +658,7 @@ gnupg_allow_set_foregound_window (pid_t pid)
 int
 gnupg_remove (const char *fname)
 {
-#ifdef HAVE_W32CE_SYSTEM
+#ifdef HAVE_W32_SYSTEM
   int rc;
   wchar_t *wfname;
 
@@ -638,7 +667,7 @@ gnupg_remove (const char *fname)
     rc = 0;
   else
     {
-      rc = DeleteFile (wfname);
+      rc = DeleteFileW (wfname);
       xfree (wfname);
     }
   if (!rc)
@@ -650,6 +679,36 @@ gnupg_remove (const char *fname)
 }
 
 
+/* Helper for gnupg_rename_file.  */
+#ifdef HAVE_W32_SYSTEM
+static int
+w32_rename (const char *oldname, const char *newname)
+{
+  if (any8bitchar (oldname) || any8bitchar (newname))
+    {
+      wchar_t *woldname, *wnewname;
+      int ret;
+
+      woldname = utf8_to_wchar (oldname);
+      if (!woldname)
+        return -1;
+      wnewname = utf8_to_wchar (newname);
+      if (!wnewname)
+        {
+          xfree (wnewname);
+          return -1;
+        }
+      ret = _wrename (woldname, wnewname);
+      xfree (wnewname);
+      xfree (woldname);
+      return ret;
+    }
+  else
+    return rename (oldname, newname);
+}
+#endif /*HAVE_W32_SYSTEM*/
+
+
 /* Wrapper for rename(2) to handle Windows peculiarities.  If
  * BLOCK_SIGNALS is not NULL and points to a variable set to true, all
  * signals will be blocked by calling gnupg_block_all_signals; the
@@ -669,7 +728,7 @@ gnupg_rename_file (const char *oldname, const char *newname, int *block_signals)
 
     gnupg_remove (newname);
   again:
-    if (rename (oldname, newname))
+    if (w32_rename (oldname, newname))
       {
         if (GetLastError () == ERROR_SHARING_VIOLATION)
           {
@@ -722,33 +781,38 @@ gnupg_rename_file (const char *oldname, const char *newname, int *block_signals)
 
 #ifndef HAVE_W32_SYSTEM
 static mode_t
-modestr_to_mode (const char *modestr)
+modestr_to_mode (const char *modestr, mode_t oldmode)
 {
+  static struct {
+    char letter;
+    mode_t value;
+  } table[] = { { '-', 0 },
+                { 'r', S_IRUSR }, { 'w', S_IWUSR }, { 'x', S_IXUSR },
+                { 'r', S_IRGRP }, { 'w', S_IWGRP }, { 'x', S_IXGRP },
+                { 'r', S_IROTH }, { 'w', S_IWOTH }, { 'x', S_IXOTH } };
+  int idx;
   mode_t mode = 0;
 
-  if (modestr && *modestr)
+  /* For now we only support a string as used by ls(1) and no octal
+   * numbers.  The first character must be a dash.  */
+  for (idx=0; idx < 10 && *modestr; idx++, modestr++)
     {
-      modestr++;
-      if (*modestr && *modestr++ == 'r')
-        mode |= S_IRUSR;
-      if (*modestr && *modestr++ == 'w')
-        mode |= S_IWUSR;
-      if (*modestr && *modestr++ == 'x')
-        mode |= S_IXUSR;
-      if (*modestr && *modestr++ == 'r')
-        mode |= S_IRGRP;
-      if (*modestr && *modestr++ == 'w')
-        mode |= S_IWGRP;
-      if (*modestr && *modestr++ == 'x')
-        mode |= S_IXGRP;
-      if (*modestr && *modestr++ == 'r')
-        mode |= S_IROTH;
-      if (*modestr && *modestr++ == 'w')
-        mode |= S_IWOTH;
-      if (*modestr && *modestr++ == 'x')
-        mode |= S_IXOTH;
+      if (*modestr == table[idx].letter)
+        mode |= table[idx].value;
+      else if (*modestr == '.')
+        {
+          if (!idx)
+            ;  /* Skip the dummy.  */
+          else if ((oldmode & table[idx].value))
+            mode |= (oldmode & table[idx].value);
+          else
+            mode &= ~(oldmode & table[idx].value);
+        }
+      else if (*modestr != '-')
+        break;
     }
 
+
   return mode;
 }
 #endif
@@ -790,7 +854,7 @@ gnupg_mkdir (const char *name, const char *modestr)
      because this sets ERRNO.  */
   return mkdir (name);
  #else
-  return mkdir (name, modestr_to_mode (modestr));
+  return mkdir (name, modestr_to_mode (modestr, 0));
  #endif
 #else
   /* Note that gpgrt_mkdir also sets ERRNO in addition to returing an
@@ -808,7 +872,7 @@ gnupg_chdir (const char *name)
 #if GPG_ERROR_VERSION_NUMBER < 0x011c00 /* 1.28 */
   return chdir (name);
 #else /* Use the improved version from libgpg_error.  */
-  /* Note that gpgrt_chdir also sets ERRNO in addition to returing a
+  /* Note that gpgrt_chdir also sets ERRNO in addition to returning a
    * gpg-error style error code.  */
   return gpgrt_chdir (name);
 #endif
@@ -818,7 +882,8 @@ gnupg_chdir (const char *name)
 /* A wrapper around chmod which takes a string for the mode argument.
    This makes it easier to handle the mode argument which is not
    defined on all systems.  The format of the modestring is the same
-   as for gnupg_mkdir.  */
+   as for gnupg_mkdir with extra feature that a '.' keeps the original
+   mode bit.  */
 int
 gnupg_chmod (const char *name, const char *modestr)
 {
@@ -827,7 +892,19 @@ gnupg_chmod (const char *name, const char *modestr)
   (void)modestr;
   return 0;
 #else
-  return chmod (name, modestr_to_mode (modestr));
+  mode_t oldmode;
+  if (strchr (modestr, '.'))
+    {
+      /* Get the old mode so that a '.' can copy that bit.  */
+      struct stat st;
+
+      if (stat (name, &st))
+        return -1;
+      oldmode = st.st_mode;
+    }
+  else
+    oldmode = 0;
+  return chmod (name, modestr_to_mode (modestr, oldmode));
 #endif
 }
 
@@ -1018,10 +1095,38 @@ gnupg_unsetenv (const char *name)
 
 
 /* Return the current working directory as a malloced string.  Return
-   NULL and sets ERRNo on error.  */
+   NULL and sets ERRNO on error.  */
 char *
 gnupg_getcwd (void)
 {
+#if GPGRT_VERSION_NUMBER < 0x012800 /* 1.40 */
+# ifdef HAVE_W32_SYSTEM
+  wchar_t wbuffer[MAX_PATH + sizeof(wchar_t)];
+  DWORD wlen;
+  char *buf, *p;
+
+  wlen = GetCurrentDirectoryW (MAX_PATH, wbuffer);
+  if (!wlen)
+    {
+      gpg_err_set_errno (EINVAL);
+      return NULL;
+
+    }
+  else if (wlen > MAX_PATH)
+    {
+      gpg_err_set_errno (ENAMETOOLONG);
+      return NULL;
+    }
+  buf = wchar_to_utf8 (wbuffer);
+  if (buf)
+    {
+      for (p=buf; *p; p++)
+        if (*p == '\\')
+          *p = '/';
+    }
+  return buf;
+
+# else /*Unix*/
   char *buffer;
   size_t size = 100;
 
@@ -1030,18 +1135,306 @@ gnupg_getcwd (void)
       buffer = xtrymalloc (size+1);
       if (!buffer)
         return NULL;
-#ifdef HAVE_W32CE_SYSTEM
-      strcpy (buffer, "/");  /* Always "/".  */
-      return buffer;
-#else
       if (getcwd (buffer, size) == buffer)
         return buffer;
       xfree (buffer);
       if (errno != ERANGE)
         return NULL;
       size *= 2;
+    }
+# endif /*Unix*/
+#else
+  return gpgrt_getcwd ();
+#endif
+}
+
+
+/* A simple wrapper around access.  NAME is expected to be utf8
+ * encoded.  This function returns an error code and sets ERRNO. */
+gpg_err_code_t
+gnupg_access (const char *name, int mode)
+{
+#if GPGRT_VERSION_NUMBER < 0x012800 /* 1.40 */
+# ifdef HAVE_W32_SYSTEM
+  wchar_t *wfname;
+  gpg_err_code_t ec;
+
+  wfname = utf8_to_wchar (name);
+  if (!wfname)
+    ec = gpg_err_code_from_syserror ();
+  else
+    {
+      ec = _waccess (wfname, mode)? gpg_err_code_from_syserror () : 0;
+      xfree (wfname);
+    }
+  return ec;
+# else
+  return access (name, mode)? gpg_err_code_from_syserror () : 0;
+# endif
+#else /* gpgrt 1.40 or newer.  */
+  return gpgrt_access (name, mode);
 #endif
+}
+
+
+/* A wrapper around stat to handle Unicode file names under Windows.  */
+#ifdef HAVE_STAT
+int
+gnupg_stat (const char *name, struct stat *statbuf)
+{
+# ifdef HAVE_W32_SYSTEM
+  if (any8bitchar (name))
+    {
+      wchar_t *wname;
+      struct _stat32 st32;
+      int ret;
+
+      wname = utf8_to_wchar (name);
+      if (!wname)
+        return -1;
+      ret = _wstat (wname, &st32);
+      xfree (wname);
+      if (!ret)
+        {
+          statbuf->st_dev   = st32.st_dev;
+          statbuf->st_ino   = st32.st_ino;
+          statbuf->st_mode  = st32.st_mode;
+          statbuf->st_nlink = st32.st_nlink;
+          statbuf->st_uid   = st32.st_uid;
+          statbuf->st_gid   = st32.st_gid;
+          statbuf->st_rdev  = st32.st_rdev;
+          statbuf->st_size  = st32.st_size;
+          statbuf->st_atime = st32.st_atime;
+          statbuf->st_mtime = st32.st_mtime;
+          statbuf->st_ctime = st32.st_ctime;
+        }
+      return ret;
     }
+  else
+    return stat (name, statbuf);
+# else
+  return stat (name, statbuf);
+# endif
+}
+#endif /*HAVE_STAT*/
+
+
+/* Wrapper around fopen for the cases where we have not yet switched
+ * to es_fopen.  Note that for convenience the prototype is in util.h */
+FILE *
+gnupg_fopen (const char *fname, const char *mode)
+{
+#ifdef HAVE_W32_SYSTEM
+  if (any8bitchar (fname))
+    {
+      wchar_t *wfname;
+      const wchar_t *wmode;
+      wchar_t *wmodebuf = NULL;
+      FILE *ret;
+
+      wfname = utf8_to_wchar (fname);
+      if (!wfname)
+        return NULL;
+      if (!strcmp (mode, "r"))
+        wmode = L"r";
+      else if (!strcmp (mode, "rb"))
+        wmode = L"rb";
+      else if (!strcmp (mode, "w"))
+        wmode = L"w";
+      else if (!strcmp (mode, "wb"))
+        wmode = L"wb";
+      else
+        {
+          wmodebuf = utf8_to_wchar (mode);
+          if (!wmodebuf)
+            {
+              xfree (wfname);
+              return NULL;
+            }
+          wmode = wmodebuf;
+        }
+      ret = _wfopen (wfname, wmode);
+      xfree (wfname);
+      xfree (wmodebuf);
+      return ret;
+    }
+  else
+    return fopen (fname, mode);
+
+#else /*Unix*/
+  return fopen (fname, mode);
+#endif /*Unix*/
+}
+
+
+
+/* A wrapper around open to handle Unicode file names under Windows.  */
+int
+gnupg_open (const char *name, int flags, unsigned int mode)
+{
+#ifdef HAVE_W32_SYSTEM
+  if (any8bitchar (name))
+    {
+      wchar_t *wname;
+      int ret;
+
+      wname = utf8_to_wchar (name);
+      if (!wname)
+        return -1;
+      ret = _wopen (wname, flags, mode);
+      xfree (wname);
+      return ret;
+    }
+  else
+    return open (name, flags, mode);
+#else
+  return open (name, flags, mode);
+#endif
+}
+
+
+/* A wrapper around opendir to handle Unicode file names under
+ * Windows.  This assumes the mingw toolchain.  */
+gnupg_dir_t
+gnupg_opendir (const char *name)
+{
+#ifdef HAVE_W32_SYSTEM
+  _WDIR *dir;
+  wchar_t *wname;
+#else
+  DIR *dir;
+#endif
+  gnupg_dir_t gdir;
+
+#ifdef HAVE_W32_SYSTEM
+  /* Note: See gpgtar-create for an alternative implementation which
+   * could be used here to avoid a mingw dependency.  */
+  wname = utf8_to_wchar (name);
+  if (!wname)
+    return NULL;
+  dir = _wopendir (wname);
+  xfree (wname);
+#else
+  dir = opendir (name);
+#endif
+
+  if (!dir)
+    return NULL;
+
+  gdir = xtrymalloc (sizeof *gdir);
+  if (!gdir)
+    {
+      int save_errno = errno;
+#ifdef HAVE_W32_SYSTEM
+      _wclosedir (dir);
+#else
+      closedir (dir);
+#endif
+      gpg_err_set_errno (save_errno);
+      return NULL;
+    }
+  gdir->dir = dir;
+  gdir->namesize = 0;
+  gdir->dirent.d_name = gdir->name;
+
+  return gdir;
+}
+
+
+gnupg_dirent_t
+gnupg_readdir (gnupg_dir_t gdir)
+{
+#ifdef HAVE_W32_SYSTEM
+  char *namebuffer = NULL;
+  struct _wdirent *de;
+#else
+  struct dirent *de;
+#endif
+  size_t n;
+  gnupg_dirent_t gde;
+  const char *name;
+
+  if (!gdir)
+    {
+      gpg_err_set_errno (EINVAL);
+      return 0;
+    }
+
+#ifdef HAVE_W32_SYSTEM
+  de = _wreaddir (gdir->dir);
+  if (!de)
+    return NULL;
+  namebuffer = wchar_to_utf8 (de->d_name);
+  if (!namebuffer)
+    return NULL;
+  name = namebuffer;
+#else
+  de = readdir (gdir->dir);
+  if (!de)
+    return NULL;
+  name = de->d_name;
+#endif
+
+  gde = &gdir->dirent;
+  n = strlen (name);
+  if (gdir->namesize)
+    {
+      /* Use allocated buffer.  */
+      if (n+1 >= gdir->namesize || !gde->d_name)
+        {
+          gdir->namesize = n + 256;
+          xfree (gde->d_name);
+          gde->d_name = xtrymalloc (gdir->namesize);
+          if (!gde->d_name)
+            return NULL;  /* ERRNO is already set.  */
+        }
+      strcpy (gde->d_name, name);
+    }
+  else if (n+1 >= sizeof (gdir->name))
+    {
+      /* Switch to allocated buffer.  */
+      gdir->namesize = n + 256;
+      gde->d_name = xtrymalloc (gdir->namesize);
+      if (!gde->d_name)
+        return NULL;  /* ERRNO is already set.  */
+      strcpy (gde->d_name, name);
+    }
+  else
+    {
+      /* Use static buffer.  */
+      gde->d_name = gdir->name;
+      strcpy (gde->d_name, name);
+    }
+
+#ifdef HAVE_W32_SYSTEM
+  xfree (namebuffer);
+#endif
+
+  return gde;
+}
+
+
+int
+gnupg_closedir (gnupg_dir_t gdir)
+{
+#ifdef HAVE_W32_SYSTEM
+  _WDIR *dir;
+#else
+  DIR *dir;
+#endif
+
+  if (!gdir)
+    return 0;
+  dir = gdir->dir;
+  if (gdir->namesize)
+    xfree (gdir->dirent.d_name);
+  xfree (gdir);
+
+#ifdef HAVE_W32_SYSTEM
+  return _wclosedir (dir);
+#else
+  return closedir (dir);
+#endif
 }
 
 
index 009b14b..63c259b 100644 (file)
@@ -46,6 +46,22 @@ typedef int gnupg_fd_t;
 #define FD2INT(h) (h)
 #endif
 
+#ifdef HAVE_STAT
+# include <sys/stat.h>
+#endif
+
+struct gnupg_dir_s;
+typedef struct gnupg_dir_s *gnupg_dir_t;
+struct gnupg_dirent_s
+{
+  /* We don't have a d_ino because that can't be used on Windows
+   * anyway.  D_NAME is a pointer into the gnupg_dir_s which has a
+   * static buffer or allocates sufficient space as needed.  This is
+   * only valid after gnupg_readdir. */
+  char *d_name;
+};
+typedef struct gnupg_dirent_s *gnupg_dirent_t;
+
 
 void trap_unaligned (void);
 int  disable_core_dumps (void);
@@ -72,6 +88,14 @@ char *gnupg_mkdtemp (char *template);
 int  gnupg_setenv (const char *name, const char *value, int overwrite);
 int  gnupg_unsetenv (const char *name);
 char *gnupg_getcwd (void);
+gpg_err_code_t gnupg_access (const char *name, int mode);
+#ifdef HAVE_STAT
+int gnupg_stat (const char *name, struct stat *statbuf);
+#endif /*HAVE_STAT*/
+int gnupg_open (const char *name, int flags, unsigned int mode);
+gnupg_dir_t gnupg_opendir (const char *name);
+gnupg_dirent_t gnupg_readdir (gnupg_dir_t gdir);
+int gnupg_closedir (gnupg_dir_t gdir);
 char *gnupg_get_socket_name (int fd);
 int gnupg_fd_valid (int fd);
 
index f7aee09..e2d22f6 100644 (file)
 #include <errno.h>
 #include <signal.h>
 #include <unistd.h>
+#ifdef HAVE_W32_SYSTEM
+# include "windows.h"
+#endif
 
 #include "dotlock.h"
 
-#define PGM "t-dotlock"
+#ifdef HAVE_W32_SYSTEM
+#define DIM(v)              (sizeof(v)/sizeof((v)[0]))
+
+const char *
+w32_strerror (int ec)
+{
+  static char strerr[256];
+
+  if (ec == -1)
+    ec = (int)GetLastError ();
+#ifdef HAVE_W32CE_SYSTEM
+  /* There is only a wchar_t FormatMessage.  It does not make much
+     sense to play the conversion game; we print only the code.  */
+  snprintf (strerr, sizeof strerr, "ec=%d", (int)GetLastError ());
+#else
+  FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, NULL, ec,
+                 MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),
+                 strerr, DIM (strerr)-1, NULL);
+  {
+    /* Strip the CR,LF - we want just the string.  */
+    size_t n = strlen (strerr);
+    if (n > 2 && strerr[n-2] == '\r' && strerr[n-1] == '\n' )
+      strerr[n-2] = 0;
+  }
+#endif
+  return strerr;
+}
+
+static wchar_t *
+cp_to_wchar (const char *string, unsigned int codepage)
+{
+  int n;
+  size_t nbytes;
+  wchar_t *result;
+
+  n = MultiByteToWideChar (codepage, 0, string, -1, NULL, 0);
+  if (n < 0)
+    {
+      return NULL;
+    }
+
+  nbytes = (size_t)(n+1) * sizeof(*result);
+  if (nbytes / sizeof(*result) != (n+1))
+    {
+      return NULL;
+    }
+  result = malloc (nbytes);
+  if (!result)
+    return NULL;
+
+  n = MultiByteToWideChar (codepage, 0, string, -1, result, n);
+  if (n < 0)
+    {
+      free (result);
+      result = NULL;
+    }
+  return result;
+}
+
+wchar_t *
+utf8_to_wchar (const char *string)
+{
+  return cp_to_wchar (string, CP_UTF8);
+}
+
+char *
+stpcpy(char *a,const char *b)
+{
+    while( *b )
+       *a++ = *b++;
+    *a = 0;
+
+    return (char*)a;
+}
+
+static char *
+do_strconcat (const char *s1, va_list arg_ptr)
+{
+  const char *argv[48];
+  size_t argc;
+  size_t needed;
+  char *buffer, *p;
+
+  argc = 0;
+  argv[argc++] = s1;
+  needed = strlen (s1);
+  while (((argv[argc] = va_arg (arg_ptr, const char *))))
+    {
+      needed += strlen (argv[argc]);
+      if (argc >= DIM (argv)-1)
+        {
+          return NULL;
+        }
+      argc++;
+    }
+  needed++;
+  buffer = malloc (needed);
+  if (buffer)
+    {
+      for (p = buffer, argc=0; argv[argc]; argc++)
+        p = stpcpy (p, argv[argc]);
+    }
+  return buffer;
+}
+
+/* Concatenate the string S1 with all the following strings up to a
+   NULL.  Returns a malloced buffer with the new string or NULL on a
+   malloc error or if too many arguments are given.  */
+char *
+strconcat (const char *s1, ...)
+{
+  va_list arg_ptr;
+  char *result;
+
+  if (!s1)
+    result = calloc (1, 1);
+  else
+    {
+      va_start (arg_ptr, s1);
+      result = do_strconcat (s1, arg_ptr);
+      va_end (arg_ptr);
+    }
+  return result;
+}
+#endif /*HAVE_W32_SYSTEM*/
 
 
-static volatile int ctrl_c_pending;
+#include "dotlock.c"
+
+#define PGM "t-dotlock"
 
+#ifndef HAVE_W32_SYSTEM
+static volatile int ctrl_c_pending_flag;
 static void
 control_c_handler (int signo)
 {
   (void)signo;
-  ctrl_c_pending = 1;
+  ctrl_c_pending_flag = 1;
 }
+#endif
+
+
+static int
+ctrl_c_pending (void)
+{
+#if HAVE_W32_SYSTEM
+  static int count;
 
+  return (++count > 9);
+#else
+  return ctrl_c_pending_flag;
+#endif
+}
 
 
 static void
@@ -95,7 +239,7 @@ lock_and_unlock (const char *fname)
     die ("error creating lock file for '%s': %s", fname, strerror (errno));
   inf ("lock created");
 
-  while (!ctrl_c_pending)
+  while (!ctrl_c_pending ())
     {
       if (dotlock_take (h, -1))
         die ("error taking lock");
@@ -119,8 +263,15 @@ main (int argc, char **argv)
   if (argc > 1)
     fname = argv[1];
   else
-    fname = "t-dotlock.tmp";
+    {
+#ifdef HAVE_W32_SYSTEM
+      fname = "t-dotⒶlock.tmp";
+#else
+      fname = "t-dotlock.tmp";
+#endif
+    }
 
+#ifndef HAVE_W32_SYSTEM
   {
     struct sigaction nact;
 
@@ -128,6 +279,7 @@ main (int argc, char **argv)
     nact.sa_flags = 0;
     sigaction (SIGINT, &nact, NULL);
   }
+#endif
 
   dotlock_create (NULL, 0);  /* Initialize (optional).  */
 
@@ -140,6 +292,6 @@ main (int argc, char **argv)
 
 /*
 Local Variables:
-compile-command: "cc -Wall -O2 -D_FILE_OFFSET_BITS=64 -o t-dotlock t-dotlock.c dotlock.c"
+compile-command: "cc -Wall -O2 -D_FILE_OFFSET_BITS=64 -o t-dotlock t-dotlock.c"
 End:
 */
index 9cea2d1..e1fffdc 100644 (file)
@@ -45,6 +45,7 @@ test_executing_true (void)
   char *result;
   size_t len;
 
+  /* Fixme: We should use gpgrt_access here.  */
   if (access (pgmname, X_OK))
     {
       if (access (alt_pgmname, X_OK))
index fd8a7dc..75cdee0 100644 (file)
 # define GPG_ERR_BAD_AUTH         315
 #endif
 
-#if GPG_ERROR_VERSION_NUMBER < 0x011b00 /* 1.27 */
-# define GPG_ERR_WRONG_NAME       313
-#endif
-
-#if GPG_ERROR_VERSION_NUMBER < 0x011a00 /* 1.26 */
-# define GPG_ERR_UNKNOWN_FLAG     309
-# define GPG_ERR_INV_ORDER       310
-# define GPG_ERR_ALREADY_FETCHED  311
-# define GPG_ERR_TRY_LATER        312
-# define GPG_ERR_SYSTEM_BUG      666
-# define GPG_ERR_DNS_UNKNOWN     711
-# define GPG_ERR_DNS_SECTION     712
-# define GPG_ERR_DNS_ADDRESS     713
-# define GPG_ERR_DNS_NO_QUERY    714
-# define GPG_ERR_DNS_NO_ANSWER   715
-# define GPG_ERR_DNS_CLOSED      716
-# define GPG_ERR_DNS_VERIFY      717
-# define GPG_ERR_DNS_TIMEOUT     718
-#endif
-
 #ifndef EXTERN_UNLESS_MAIN_MODULE
 # if !defined (INCLUDED_BY_MAIN_MODULE)
 #  define EXTERN_UNLESS_MAIN_MODULE extern
@@ -162,7 +142,6 @@ ssize_t read_line (FILE *fp,
                    char **addr_of_buffer, size_t *length_of_buffer,
                    size_t *max_length);
 
-
 /*-- b64enc.c and b64dec.c --*/
 struct b64state
 {
@@ -262,6 +241,7 @@ const char *openpgp_is_curve_supported (const char *name,
 const char *standard_homedir (void);
 const char *default_homedir (void);
 void gnupg_set_homedir (const char *newdir);
+void gnupg_maybe_make_homedir (const char *fname, int quiet);
 const char *gnupg_homedir (void);
 int gnupg_default_homedir_p (void);
 const char *gnupg_daemon_rootdir (void);
@@ -306,6 +286,9 @@ char *gnupg_get_help_string (const char *key, int only_current_locale);
 /*-- localename.c --*/
 const char *gnupg_messages_locale_name (void);
 
+/*-- sysutils.c --*/
+FILE *gnupg_fopen (const char *fname, const char *mode);
+
 /*-- miscellaneous.c --*/
 
 /* This function is called at startup to tell libgcrypt to use our own
index ea9d463..59c0456 100644 (file)
@@ -17,7 +17,7 @@ you can redistribute it and/or modify it under the terms of the \
 GNU General Public License as published by the Free Software Foundation; \
 either version 3 of the License, or (at your option) any later version.\0"
 
-#define W32INFO_COMPANYNAME "The GnuPG Project\0"
+#define W32INFO_COMPANYNAME "g10 Code GmbH\0"
 
 #define W32INFO_VI_FILEVERSION    @BUILD_FILEVERSION@
 #define W32INFO_VI_PRODUCTVERSION @BUILD_FILEVERSION@
@@ -29,4 +29,4 @@ built on @BUILD_HOSTNAME@ at @BUILD_TIMESTAMP@\0"
 #define W32INFO_PRODUCTVERSION "@VERSION@\0"
 
 #define W32INFO_LEGALCOPYRIGHT "Copyright \xa9 \
-2019 Free Software Foundation, Inc.\0"
+2020 g10 Code GmbH\0"
index 64cb8c6..2e5c284 100644 (file)
@@ -29,7 +29,7 @@ min_automake_version="1.14"
 m4_define([mym4_package],[gnupg])
 m4_define([mym4_major], [2])
 m4_define([mym4_minor], [2])
-m4_define([mym4_micro], [23])
+m4_define([mym4_micro], [24])
 
 # To start a new development series, i.e a new major or minor number
 # you need to mark an arbitrary commit before the first beta release
@@ -54,16 +54,16 @@ AC_INIT([mym4_package],[mym4_version], [https://bugs.gnupg.org])
 # build-aux/speedo.mk and Makefile.am
 AC_DEFINE_UNQUOTED(GNUPG_SWDB_TAG, "gnupg22", [swdb tag for this branch])
 
-NEED_GPG_ERROR_VERSION=1.25
+NEED_GPG_ERROR_VERSION=1.27
 
 NEED_LIBGCRYPT_API=1
-NEED_LIBGCRYPT_VERSION=1.7.0
+NEED_LIBGCRYPT_VERSION=1.8.0
 
 NEED_LIBASSUAN_API=2
 NEED_LIBASSUAN_VERSION=2.5.0
 
 NEED_KSBA_API=1
-NEED_KSBA_VERSION=1.3.4
+NEED_KSBA_VERSION=1.3.5
 
 NEED_NTBTLS_API=1
 NEED_NTBTLS_VERSION=0.1.0
@@ -1224,7 +1224,7 @@ AC_ARG_WITH(mailprog,
                      [use "NAME -t" for mail transport]),
              ,with_mailprog=yes)
 if test x"$with_mailprog" = xyes ; then
-    AC_PATH_PROG(SENDMAIL,sendmail,,$PATH:/usr/sbin:/usr/libexec:/usr/lib)
+    AC_PATH_PROG(SENDMAIL,sendmail,,"$PATH":/usr/sbin:/usr/libexec:/usr/lib)
 elif test x"$with_mailprog" != xno ; then
     AC_MSG_CHECKING([for a mail transport program])
     AC_SUBST(SENDMAIL,$with_mailprog)
@@ -2008,7 +2008,17 @@ tests/migrations/Makefile
 tests/gpgsm/Makefile
 tests/gpgme/Makefile
 tests/pkits/Makefile
+agent/gpg-agent.w32-manifest
 g10/gpg.w32-manifest
+g10/gpgv.w32-manifest
+sm/gpgsm.w32-manifest
+scd/scdaemon.w32-manifest
+dirmngr/dirmngr.w32-manifest
+tools/gpgconf.w32-manifest
+tools/gpgtar.w32-manifest
+tools/gpg-connect-agent.w32-manifest
+tools/gpg-check-pattern.w32-manifest
+tools/gpg-wks-client.w32-manifest
 ])
 
 
index 208a813..00d3c42 100644 (file)
 
 ## Process this file with automake to produce Makefile.in
 
-EXTRA_DIST = OAUTHORS ONEWS ChangeLog-2011 tls-ca.pem
+EXTRA_DIST = OAUTHORS ONEWS ChangeLog-2011 tls-ca.pem \
+             dirmngr-w32info.rc dirmngr.w32-manifest.in
+
+
 dist_pkgdata_DATA = sks-keyservers.netCA.pem
 
 bin_PROGRAMS = dirmngr dirmngr-client
@@ -86,11 +89,19 @@ else
 ldaplibs =
 endif
 
+if HAVE_W32_SYSTEM
+dirmngr_robjs = $(resource_objs) dirmngr-w32info.o
+dirmngr-w32info.o : dirmngr.w32-manifest
+else
+dirmngr_robjs =
+endif
+
 
 dirmngr_LDADD = $(libcommonpth) \
         $(DNSLIBS) $(LIBASSUAN_LIBS) \
        $(LIBGCRYPT_LIBS) $(KSBA_LIBS) $(NPTH_LIBS) \
-       $(NTBTLS_LIBS) $(LIBGNUTLS_LIBS) $(LIBINTL) $(LIBICONV) $(NETLIBS)
+       $(NTBTLS_LIBS) $(LIBGNUTLS_LIBS) $(LIBINTL) $(LIBICONV) $(NETLIBS) \
+        $(dirmngr_robj)
 if USE_LDAP
 dirmngr_LDADD += $(ldaplibs)
 endif
index 5486997..9ca6069 100644 (file)
@@ -364,8 +364,8 @@ static gpg_error_t
 load_certs_from_dir (const char *dirname, unsigned int trustclass)
 {
   gpg_error_t err;
-  DIR *dir;
-  struct dirent *ep;
+  gnupg_dir_t dir;
+  gnupg_dirent_t ep;
   char *p;
   size_t n;
   estream_t fp;
@@ -373,13 +373,13 @@ load_certs_from_dir (const char *dirname, unsigned int trustclass)
   ksba_cert_t cert;
   char *fname = NULL;
 
-  dir = opendir (dirname);
+  dir = gnupg_opendir (dirname);
   if (!dir)
     {
       return 0; /* We do not consider this a severe error.  */
     }
 
-  while ( (ep=readdir (dir)) )
+  while ( (ep = gnupg_readdir (dir)) )
     {
       p = ep->d_name;
       if (*p == '.' || !*p)
@@ -447,7 +447,7 @@ load_certs_from_dir (const char *dirname, unsigned int trustclass)
     }
 
   xfree (fname);
-  closedir (dir);
+  gnupg_closedir (dir);
   return 0;
 }
 
@@ -685,7 +685,7 @@ load_certs_from_system (void)
   gpg_error_t err = 0;
 
   for (idx=0; idx < DIM (table); idx++)
-    if (!access (table[idx].name, F_OK))
+    if (!gnupg_access (table[idx].name, F_OK))
       {
         /* Take the first available bundle.  */
         err = load_certs_from_file (table[idx].name, CERTTRUST_CLASS_SYSTEM, 0);
@@ -721,6 +721,9 @@ cert_cache_init (strlist_t hkp_cacerts)
     load_certs_from_dir (fname, 0);
   xfree (fname);
 
+  /* Put the special pool certificate into our store.  This is
+   * currently only used with ntbtls.  For GnuTLS http_session_new
+   * unfortunately loads that certificate directly from the file.  */
   fname = make_filename_try (gnupg_datadir (),
                              "sks-keyservers.netCA.pem", NULL);
   if (fname)
index cd35335..eee4b72 100644 (file)
 #ifndef HAVE_W32_SYSTEM
 #include <sys/utsname.h>
 #endif
-#ifdef MKDIR_TAKES_ONE_ARG
-#undef mkdir
-#define mkdir(a,b) mkdir(a)
-#endif
 
 #include "dirmngr.h"
 #include "validate.h"
@@ -206,15 +202,15 @@ get_current_cache (void)
 static int
 create_directory_if_needed (const char *name)
 {
-  DIR *dir;
+  gnupg_dir_t dir;
   char *fname;
 
   fname = make_filename (opt.homedir_cache, name, NULL);
-  dir = opendir (fname);
+  dir = gnupg_opendir (fname);
   if (!dir)
     {
       log_info (_("creating directory '%s'\n"), fname);
-      if (mkdir (fname, S_IRUSR|S_IWUSR|S_IXUSR) )
+      if (gnupg_mkdir (fname, "-rwx"))
         {
           int save_errno = errno;
           log_error (_("error creating directory '%s': %s\n"),
@@ -225,7 +221,7 @@ create_directory_if_needed (const char *name)
         }
     }
   else
-    closedir (dir);
+    gnupg_closedir (dir);
   xfree (fname);
   return 0;
 }
@@ -237,8 +233,8 @@ static int
 cleanup_cache_dir (int force)
 {
   char *dname = make_filename (opt.homedir_cache, DBDIR_D, NULL);
-  DIR *dir;
-  struct dirent *de;
+  gnupg_dir_t dir;
+  gnupg_dirent_t de;
   int problem = 0;
 
   if (!force)
@@ -251,7 +247,7 @@ cleanup_cache_dir (int force)
         }
     }
 
-  dir = opendir (dname);
+  dir = gnupg_opendir (dname);
   if (!dir)
     {
       log_error (_("error reading directory '%s': %s\n"),
@@ -260,7 +256,7 @@ cleanup_cache_dir (int force)
       return -1;
     }
 
-  while ((de = readdir (dir)))
+  while ((de = gnupg_readdir (dir)))
     {
       if (strcmp (de->d_name, "." ) && strcmp (de->d_name, ".."))
         {
@@ -271,7 +267,7 @@ cleanup_cache_dir (int force)
           if (force)
             okay = 1;
           else
-            okay = (!stat (cdbname, &sbuf) && S_ISREG (sbuf.st_mode));
+            okay = (!gnupg_stat (cdbname, &sbuf) && S_ISREG (sbuf.st_mode));
 
           if (okay)
             {
@@ -289,7 +285,7 @@ cleanup_cache_dir (int force)
         }
     }
   xfree (dname);
-  closedir (dir);
+  gnupg_closedir (dir);
   return problem;
 }
 
@@ -1142,7 +1138,7 @@ lock_db_file (crl_cache_t cache, crl_cache_entry_t entry)
       xfree (fname);
       return NULL;
     }
-  fd = open (fname, O_RDONLY | O_BINARY);
+  fd = gnupg_open (fname, O_RDONLY | O_BINARY, 0);
   if (fd == -1)
     {
       log_error (_("error opening cache file '%s': %s\n"),
@@ -2226,7 +2222,7 @@ crl_cache_insert (ctrl_t ctrl, const char *url, ksba_reader_t reader)
       }
   }
 
-  fd_cdb = open (fname, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0644);
+  fd_cdb = gnupg_open (fname, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0644);
   if (fd_cdb == -1)
     {
       err = gpg_error_from_errno (errno);
index 7da3d8b..c8091f6 100644 (file)
@@ -302,7 +302,7 @@ ca_cert_fetch (ctrl_t ctrl, cert_fetch_context_t *context, const char *dn)
       return gpg_error (GPG_ERR_NOT_SUPPORTED);
     }
 #if USE_LDAP
-  return start_default_fetch_ldap (ctrl, context, dn, "cACertificate");
+  return start_cacert_fetch_ldap (ctrl, context, dn);
 #else
   (void)ctrl;
   (void)context;
index cf4a3c0..3822adb 100644 (file)
@@ -69,9 +69,9 @@ gpg_error_t attr_fetch_ldap (ctrl_t ctrl,
                              ksba_reader_t *reader);
 
 
-gpg_error_t start_default_fetch_ldap (ctrl_t ctrl,
-                                      cert_fetch_context_t *context,
-                                      const char *dn, const char *attr);
+gpg_error_t start_cacert_fetch_ldap (ctrl_t ctrl,
+                                     cert_fetch_context_t *context,
+                                     const char *dn);
 gpg_error_t start_cert_fetch_ldap( ctrl_t ctrl,
                                    cert_fetch_context_t *context,
                                    strlist_t patterns,
index 53b405e..0d714d4 100644 (file)
@@ -468,7 +468,7 @@ read_pem_certificate (const char *fname, unsigned char **rbuf, size_t *rbuflen)
 
   init_asctobin ();
 
-  fp = fname? fopen (fname, "r") : stdin;
+  fp = fname? gnupg_fopen (fname, "r") : stdin;
   if (!fp)
     return gpg_error_from_errno (errno);
 
@@ -629,7 +629,7 @@ read_certificate (const char *fname, unsigned char **rbuf, size_t *rbuflen)
         return 0;
     }
 
-  fp = fname? fopen (fname, "rb") : stdin;
+  fp = fname? gnupg_fopen (fname, "rb") : stdin;
   if (!fp)
     return gpg_error_from_errno (errno);
 
diff --git a/dirmngr/dirmngr-w32info.rc b/dirmngr/dirmngr-w32info.rc
new file mode 100644 (file)
index 0000000..c8101b3
--- /dev/null
@@ -0,0 +1,52 @@
+/* dirmngr-w32info.rc                                        -*- c -*-
+ * Copyright (C) 2020 g10 Code GmbH
+ *
+ * This file is free software; as a special exception the author gives
+ * unlimited permission to copy and/or distribute it, with or without
+ * modifications, as long as this notice is preserved.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+#include "afxres.h"
+#include "../common/w32info-rc.h"
+
+1 ICON "../common/gnupg.ico"
+
+1 VERSIONINFO
+  FILEVERSION    W32INFO_VI_FILEVERSION
+  PRODUCTVERSION W32INFO_VI_PRODUCTVERSION
+  FILEFLAGSMASK  0x3fL
+#ifdef _DEBUG
+  FILEFLAGS      0x01L    /* VS_FF_DEBUG (0x1)*/
+#else
+  FILEFLAGS      0x00L
+#endif
+  FILEOS         0x40004L /* VOS_NT (0x40000) | VOS__WINDOWS32 (0x4)  */
+  FILETYPE       0x1L     /* VFT_APP (0x1)  */
+  FILESUBTYPE    0x0L     /* VFT2_UNKNOWN   */
+  BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "040904b0"  /* US English (0409), Unicode (04b0) */
+        BEGIN
+            VALUE "FileDescription", L"GnuPG\x2019s network daemon\0"
+            VALUE "InternalName", "dirmngr\0"
+            VALUE "OriginalFilename", "dirmngr.exe\0"
+            VALUE "ProductName",    W32INFO_PRODUCTNAME
+            VALUE "ProductVersion", W32INFO_PRODUCTVERSION
+            VALUE "CompanyName", W32INFO_COMPANYNAME
+            VALUE "FileVersion", W32INFO_FILEVERSION
+            VALUE "LegalCopyright", W32INFO_LEGALCOPYRIGHT
+            VALUE "Comments",    W32INFO_COMMENTS
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+      VALUE "Translation", 0x409, 0x4b0
+    END
+  END
+
+1 RT_MANIFEST "dirmngr.w32-manifest"
index 3beaab8..e497183 100644 (file)
@@ -100,6 +100,7 @@ enum cmd_and_opt_values {
   aFlush,
   aGPGConfList,
   aGPGConfTest,
+  aGPGConfVersions,
 
   oOptions,
   oDebug,
@@ -174,6 +175,7 @@ static ARGPARSE_OPTS opts[] = {
   ARGPARSE_c (aFlush,    "flush",     N_("flush the cache")),
   ARGPARSE_c (aGPGConfList, "gpgconf-list", "@"),
   ARGPARSE_c (aGPGConfTest, "gpgconf-test", "@"),
+  ARGPARSE_c (aGPGConfVersions, "gpgconf-versions", "@"),
 
   ARGPARSE_group (301, N_("@\nOptions:\n ")),
 
@@ -378,6 +380,8 @@ static ldap_server_t parse_ldapserver_file (const char* filename, int ienoent);
 static fingerprint_list_t parse_ocsp_signer (const char *string);
 static void netactivity_action (void);
 static void handle_connections (assuan_fd_t listen_fd);
+static void gpgconf_versions (void);
+
 
 /* NPth wrapper function definitions. */
 ASSUAN_SYSTEM_NPTH_IMPL;
@@ -943,7 +947,7 @@ main (int argc, char **argv)
   if (configname)
     {
       configlineno = 0;
-      configfp = fopen (configname, "r");
+      configfp = gnupg_fopen (configname, "r");
       if (!configfp)
         {
           if (default_config)
@@ -982,6 +986,7 @@ main (int argc, char **argv)
         case aFetchCRL:
        case aGPGConfList:
        case aGPGConfTest:
+       case aGPGConfVersions:
           cmd = pargs.r_opt;
           break;
 
@@ -1073,7 +1078,7 @@ main (int argc, char **argv)
           log_info (_("Note: '%s' is not considered an option\n"), argv[i]);
     }
 
-  if (!access ("/etc/"DIRMNGR_NAME, F_OK)
+  if (!gnupg_access ("/etc/"DIRMNGR_NAME, F_OK)
       && !strncmp (gnupg_homedir (), "/etc/", 5))
     log_info
       ("NOTE: DirMngr is now a proper part of %s.  The configuration and"
@@ -1272,7 +1277,7 @@ main (int argc, char **argv)
         {
           log_error (_("error binding socket to '%s': %s\n"),
                      serv_addr.sun_path,
-                     gpg_strerror (gpg_error_from_errno (errno)));
+                     gpg_strerror (gpg_error_from_syserror ()));
           assuan_sock_close (fd);
           dirmngr_exit (1);
         }
@@ -1543,6 +1548,9 @@ main (int argc, char **argv)
       es_printf ("resolver-timeout:%lu:%u\n",
                  flags | GC_OPT_FLAG_DEFAULT, 0);
     }
+  else if (cmd == aGPGConfVersions)
+    gpgconf_versions ();
+
   cleanup ();
   return !!rc;
 }
@@ -1832,7 +1840,7 @@ reread_configuration (void)
   if (!opt.config_filename)
     return; /* No config file. */
 
-  fp = fopen (opt.config_filename, "r");
+  fp = gnupg_fopen (opt.config_filename, "r");
   if (!fp)
     {
       log_error (_("option file '%s': %s\n"),
@@ -2036,7 +2044,7 @@ handle_tick (void)
 
   /* Check whether the homedir is still available.  */
   if (!shutdown_pending
-      && stat (gnupg_homedir (), &statbuf) && errno == ENOENT)
+      && gnupg_stat (gnupg_homedir (), &statbuf) && errno == ENOENT)
     {
       shutdown_pending = 1;
       log_info ("homedir has been removed - shutting down\n");
@@ -2347,3 +2355,61 @@ dirmngr_get_current_socket_name (void)
   else
     return dirmngr_socket_name ();
 }
+
+
+
+/* Parse the revision part from the extended version blurb.  */
+static const char *
+get_revision_from_blurb (const char *blurb, int *r_len)
+{
+  const char *s = blurb? blurb : "";
+  int n;
+
+  for (; *s; s++)
+    if (*s == '\n' && s[1] == '(')
+      break;
+  if (s)
+    {
+      s += 2;
+      for (n=0; s[n] && s[n] != ' '; n++)
+        ;
+    }
+  else
+    {
+      s = "?";
+      n = 1;
+    }
+  *r_len = n;
+  return s;
+}
+
+
+/* Print versions of dirmngr and used libraries.  This is used by
+ * "gpgconf --show-versions" so that there is no need to link gpgconf
+ * against all these libraries.  This is an internal API and should
+ * not be relied upon.  */
+static void
+gpgconf_versions (void)
+{
+  const char *s;
+  int n;
+
+  /* Unfortunately Npth has no way to get the version.  */
+
+  s = get_revision_from_blurb (assuan_check_version ("\x01\x01"), &n);
+  es_fprintf (es_stdout, "* Libassuan %s (%.*s)\n\n",
+              assuan_check_version (NULL), n, s);
+
+  es_fprintf (es_stdout, "* KSBA %s \n\n",
+              ksba_check_version (NULL));
+
+#ifdef HTTP_USE_NTBTLS
+  s = get_revision_from_blurb (ntbtls_check_version ("\x01\x01"), &n);
+  es_fprintf (es_stdout, "* NTBTLS %s (%.*s)\n\n",
+              ntbtls_check_version (NULL), n, s);
+#elif HTTP_USE_GNUTLS
+  es_fprintf (es_stdout, "* GNUTLS %s\n\n",
+              gnutls_check_version (NULL));
+#endif
+
+}
diff --git a/dirmngr/dirmngr.w32-manifest.in b/dirmngr/dirmngr.w32-manifest.in
new file mode 100644 (file)
index 0000000..719ca97
--- /dev/null
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+<description>GNU Privacy Guard (Network daemon)</description>
+<assemblyIdentity
+    type="win32"
+    name="GnuPG.dirmngr"
+    version="@BUILD_VERSION@"
+    />
+<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
+  <application>
+    <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/><!-- 10 -->
+    <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/><!-- 8.1 -->
+    <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/><!-- 8 -->
+    <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/><!-- 7 -->
+    <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/><!-- Vista -->
+  </application>
+</compatibility>
+</assembly>
index ed4cdd4..58388b2 100644 (file)
@@ -77,8 +77,10 @@ gnupg_http_tls_verify_cb (void *opaque,
 
   validate_flags = VALIDATE_FLAG_TLS;
 
-  /* If we are using the standard hkps:// pool use the dedicated
-   * root certificate.  */
+  /* If we are using the standard hkps:// pool use the dedicated root
+   * certificate.  Note that this differes from the GnuTLS
+   * implementation which uses this special certificate only if no
+   * other certificates are configured. */
   hostname = ntbtls_get_hostname (tls);
   if (hostname
       && !ascii_strcasecmp (hostname, get_default_keyserver (1)))
index 0af0cc3..5e3f17c 100644 (file)
@@ -579,6 +579,7 @@ http_register_tls_callback (gpg_error_t (*cb)(http_t, http_session_t, int))
 void
 http_register_tls_ca (const char *fname)
 {
+  gpg_err_code_t ec;
   strlist_t sl;
 
   if (!fname)
@@ -590,9 +591,8 @@ http_register_tls_ca (const char *fname)
     {
       /* Warn if we can't access right now, but register it anyway in
          case it becomes accessible later */
-      if (access (fname, F_OK))
-        log_info (_("can't access '%s': %s\n"), fname,
-                  gpg_strerror (gpg_error_from_syserror()));
+      if ((ec = gnupg_access (fname, F_OK)))
+        log_info (_("can't access '%s': %s\n"), fname, gpg_strerror (ec));
       sl = add_to_strlist (&tls_ca_certlist, fname);
       if (*sl->d && !strcmp (sl->d + strlen (sl->d) - 4, ".pem"))
         sl->flags = 1;
@@ -608,6 +608,7 @@ http_register_tls_ca (const char *fname)
 void
 http_register_cfg_ca (const char *fname)
 {
+  gpg_err_code_t ec;
   strlist_t sl;
 
   if (!fname)
@@ -619,9 +620,8 @@ http_register_cfg_ca (const char *fname)
     {
       /* Warn if we can't access right now, but register it anyway in
          case it becomes accessible later */
-      if (access (fname, F_OK))
-        log_info (_("can't access '%s': %s\n"), fname,
-                  gpg_strerror (gpg_error_from_syserror()));
+      if ((ec = gnupg_access (fname, F_OK)))
+        log_info (_("can't access '%s': %s\n"), fname, gpg_strerror (ec));
       sl = add_to_strlist (&cfg_ca_certlist, fname);
       if (*sl->d && !strcmp (sl->d + strlen (sl->d) - 4, ".pem"))
         sl->flags = 1;
@@ -770,10 +770,9 @@ http_session_new (http_session_t *r_session,
                     && !ascii_strcasecmp (intended_hostname,
                                           get_default_keyserver (1)));
 
-    /* If the user has not specified a CA list, and they are looking
-     * for the hkps pool from sks-keyservers.net, then default to
-     * Kristian's certificate authority:  */
-    if (!tls_ca_certlist && is_hkps_pool)
+    /* If we are looking for the hkps pool from sks-keyservers.net,
+     * then forcefully use its dedicated certificate authority.  */
+    if (is_hkps_pool)
       {
         char *pemname = make_filename_try (gnupg_datadir (),
                                            "sks-keyservers.netCA.pem", NULL);
@@ -793,11 +792,12 @@ http_session_new (http_session_t *r_session,
             xfree (pemname);
           }
 
-        add_system_cas = 0;
+        if (is_hkps_pool)
+          add_system_cas = 0;
       }
 
     /* Add configured certificates to the session.  */
-    if ((flags & HTTP_FLAG_TRUST_DEF))
+    if ((flags & HTTP_FLAG_TRUST_DEF) && !is_hkps_pool)
       {
         for (sl = tls_ca_certlist; sl; sl = sl->next)
           {
@@ -808,7 +808,10 @@ http_session_new (http_session_t *r_session,
               log_info ("setting CA from file '%s' failed: %s\n",
                         sl->d, gnutls_strerror (rc));
           }
-        if (!tls_ca_certlist && !is_hkps_pool)
+
+        /* If HKP trust is requested and there are no HKP certificates
+         * configured, also try the standard system certificates.  */
+        if (!tls_ca_certlist)
           add_system_cas = 1;
       }
 
@@ -830,7 +833,7 @@ http_session_new (http_session_t *r_session,
       }
 
     /* Add other configured certificates to the session.  */
-    if ((flags & HTTP_FLAG_TRUST_CFG))
+    if ((flags & HTTP_FLAG_TRUST_CFG) && !is_hkps_pool)
       {
         for (sl = cfg_ca_certlist; sl; sl = sl->next)
           {
index fef752c..14859c7 100644 (file)
@@ -476,7 +476,20 @@ map_host (ctrl_t ctrl, const char *name, const char *srvtag, int force_reselect,
   if (!name || !*name)
     {
       *r_host = xtrystrdup ("localhost");
-      return *r_host? 0 : gpg_error_from_syserror ();
+      if (!*r_host)
+        return gpg_error_from_syserror ();
+      if (r_httphost)
+        {
+          *r_httphost = xtrystrdup (*r_host);
+          if (!*r_httphost)
+            {
+              err = gpg_error_from_syserror ();
+              xfree (*r_host);
+              *r_host = NULL;
+              return err;
+            }
+        }
+      return 0;
     }
 
   /* See whether the host is in our table.  */
@@ -648,6 +661,12 @@ map_host (ctrl_t ctrl, const char *name, const char *srvtag, int force_reselect,
         }
       free_dns_addrinfo (aibuf);
     }
+  else if (r_httphost)
+    {
+      *r_httphost = xtrystrdup (hi->name);
+      if (!*r_httphost)
+        return gpg_error_from_syserror ();
+    }
 
   if (hi->dead)
     {
index cb3c0b7..e016f64 100644 (file)
@@ -463,18 +463,19 @@ make_url (char **url, const char *dn, const char *filter)
 }
 
 
-/* Prepare an LDAP query to return the attribute ATTR for the DN.  All
-   configured default servers are queried until one responds.  This
-   function returns an error code or 0 and a CONTEXT on success. */
+/* Prepare an LDAP query to return the cACertificate attribute for DN.
+ * All configured default servers are queried until one responds.
+ * This function returns an error code or 0 and stored a newly
+ * allocated contect object at CONTEXT on success. */
 gpg_error_t
-start_default_fetch_ldap (ctrl_t ctrl, cert_fetch_context_t *context,
-                          const char *dn, const char *attr)
+start_cacert_fetch_ldap (ctrl_t ctrl, cert_fetch_context_t *r_context,
+                         const char *dn)
 {
   gpg_error_t err;
   struct ldapserver_iter iter;
 
-  *context = xtrycalloc (1, sizeof **context);
-  if (!*context)
+  *r_context = xtrycalloc (1, sizeof **r_context);
+  if (!*r_context)
     return gpg_error_from_errno (errno);
 
   /* FIXME; we might want to look at the Base SN to try matching
@@ -488,30 +489,30 @@ start_default_fetch_ldap (ctrl_t ctrl, cert_fetch_context_t *context,
 
       err = run_ldap_wrapper (ctrl,
                               0,
-                              1,
+                              1,  /* --multi (record format) */
                               opt.ldap_proxy,
                               server->host, server->port,
                               server->user, server->pass,
-                              dn, "objectClass=*", attr, NULL,
-                              &(*context)->reader);
+                              dn, "objectClass=*", "cACertificate", NULL,
+                              &(*r_context)->reader);
       if (!err)
         break; /* Probably found a result. */
     }
 
   if (err)
     {
-      xfree (*context);
-      *context = NULL;
+      xfree (*r_context);
+      *r_context = NULL;
     }
   return err;
 }
 
 
-/* Prepare an LDAP query to return certificates matching PATTERNS using
-   the SERVER.  This function returns an error code or 0 and a CONTEXT
  on success. */
+/* Prepare an LDAP query to return certificates matching PATTERNS
+ * using the SERVER.  This function returns an error code or 0 and
* stores a newly allocated object at R_CONTEXT on success. */
 gpg_error_t
-start_cert_fetch_ldap (ctrl_t ctrl, cert_fetch_context_t *context,
+start_cert_fetch_ldap (ctrl_t ctrl, cert_fetch_context_t *r_context,
                        strlist_t patterns, const ldap_server_t server)
 {
   gpg_error_t err;
@@ -527,7 +528,7 @@ start_cert_fetch_ldap (ctrl_t ctrl, cert_fetch_context_t *context,
   char portbuf[30], timeoutbuf[30];
 
 
-  *context = NULL;
+  *r_context = NULL;
 
   if (opt.ldap_proxy && !(proxy = xtrystrdup (opt.ldap_proxy)))
     {
@@ -639,19 +640,19 @@ start_cert_fetch_ldap (ctrl_t ctrl, cert_fetch_context_t *context,
     }
   argv[argc] = NULL;
 
-  *context = xtrycalloc (1, sizeof **context);
-  if (!*context)
+  *r_context = xtrycalloc (1, sizeof **r_context);
+  if (!*r_context)
     {
       err = gpg_error_from_errno (errno);
       goto leave;
     }
 
-  err = ldap_wrapper (ctrl, &(*context)->reader, (const char**)argv);
+  err = ldap_wrapper (ctrl, &(*r_context)->reader, (const char**)argv);
 
   if (err)
     {
-      xfree (*context);
-      *context = NULL;
+      xfree (*r_context);
+      *r_context = NULL;
     }
 
  leave:
@@ -711,8 +712,7 @@ fetch_next_cert_ldap (cert_fetch_context_t context,
       n = buf32_to_ulong (hdr+1);
       if (*hdr == 'V' && okay)
         {
-#if 0  /* That code is not yet ready.  */
-
+#if 0  /* That code to extra a cert from a CMS object is not yet ready.  */
           if (is_cms)
             {
               /* The certificate needs to be parsed from CMS data. */
@@ -759,7 +759,7 @@ fetch_next_cert_ldap (cert_fetch_context_t context,
                 any = 1;
             }
           else
-#endif
+#endif /* End unfinished code to extract from a CMS object.  */
             {
               *value = xtrymalloc (n);
               if (!*value)
index 780722d..4078633 100644 (file)
@@ -2718,7 +2718,7 @@ cmd_killdirmngr (assuan_context_t ctx, char *line)
 
   ctrl->server_local->stopme = 1;
   assuan_set_flag (ctx, ASSUAN_FORCE_CLOSE, 1);
-  return gpg_error (GPG_ERR_EOF);
+  return 0;
 }
 
 
index edd0a94..a02ba35 100644 (file)
@@ -1103,6 +1103,7 @@ pkd:0:1024:B665B1435F4C2 .... FF26ABB:
            - learncard :: Send by the agent and gpgsm while learing
                           the data of a smartcard.
            - card_busy :: A smartcard is still working
+           - scd_locked :: Waiting for other clients to unlock the scdaemon
 
     When <what> refers to a file path, it may be truncated.
 
index ca13bcf..2b882c3 100644 (file)
@@ -22,7 +22,8 @@ AM_CPPFLAGS =
 include $(top_srcdir)/am/cmacros.am
 
 examples = examples/README examples/scd-event examples/trustlist.txt   \
-          examples/vsnfd.prf examples/debug.prf                        \
+          examples/VS-NfD.prf examples/Automatic.prf                   \
+           examples/debug.prf                                           \
           examples/systemd-user/README                                 \
           examples/systemd-user/dirmngr.service                        \
           examples/systemd-user/dirmngr.socket                         \
@@ -182,8 +183,8 @@ defsincdate: $(gnupg_TEXINFOS)
        if test -e $(top_srcdir)/.git; then \
          (cd $(srcdir) && git log -1 --format='%ct' \
                -- $(gnupg_TEXINFOS) 2>/dev/null) >>defsincdate; \
-        elif test x"$SOURCE_DATE_EPOCH" != x; then   \
-          echo "$SOURCE_DATE_EPOCH" >>defsincdate ; \
+        elif test x"$$SOURCE_DATE_EPOCH" != x; then   \
+          echo "$$SOURCE_DATE_EPOCH" >>defsincdate ; \
        fi
 
 defs.inc : defsincdate Makefile mkdefsinc
diff --git a/doc/examples/Automatic.prf b/doc/examples/Automatic.prf
new file mode 100644 (file)
index 0000000..41f9bea
--- /dev/null
@@ -0,0 +1,15 @@
+# Automatic.prf - Configure options for a more automatic mode  -*- conf -*-
+#
+# The options for each tool are configured in a section ("[TOOL]");
+# see the respective man page for a description of these options and
+# the gpgconf manpage for a description of this file's syntax.
+
+[gpg]
+auto-key-locate local,wkd,dane
+auto-key-retrieve
+trust-model tofu+pgp$\r$\n'
+
+[gpg-agent]
+default-cache-ttl 900
+max-cache-ttl 3600
+min-passphrase-nonalpha 0
similarity index 82%
rename from doc/examples/vsnfd.prf
rename to doc/examples/VS-NfD.prf
index 0c0ddd8..edb9e01 100644 (file)
@@ -1,4 +1,4 @@
-# vsnfd.prf - Configure options for the VS-NfD mode           -*- conf -*-
+# VS-NfD.prf - Configure options for the VS-NfD mode           -*- conf -*-
 #
 # The options for each tool are configured in a section ("[TOOL]");
 # see the respective man page for a description of these options and
@@ -12,7 +12,6 @@ compliance de-vs
 enable-crl-checks
 
 [gpg-agent]
-enable-extended-key-format
 default-cache-ttl 900
 max-cache-ttl 3600
 no-allow-mark-trusted
index 526a758..f611813 100644 (file)
@@ -1138,6 +1138,17 @@ you want to specify a different revocation reason, or to supply
 supplementary revocation text, you should use the interactive
 sub-command @code{revuid} of @option{--edit-key}.
 
+@item --quick-revoke-sig  @var{fpr} @var{signing-fpr} [@var{names}]
+@opindex quick-revoke-sig
+This command revokes the key signatures made by @var{signing-fpr} from
+the key specified by the fingerprint @var{fpr}.  With @var{names}
+given only the signatures on user ids of the key matching any of the
+given names are affected (see @option{--quick-sign-key}).  If a
+revocation already exists a notice is printed instead of creating a
+new revocation; no error is returned in this case.  Note that key
+signature revocations may be superseded by a newer key signature and
+in turn again revoked.
+
 @item --quick-set-primary-uid  @var{user-id} @var{primary-user-id}
 @opindex quick-set-primary-uid
 This command sets or updates the primary user ID flag on an existing
index 9cecc17..8ec771f 100644 (file)
 ## Process this file with automake to produce Makefile.in
 
 EXTRA_DIST = distsigkey.gpg \
-            ChangeLog-2011 gpg-w32info.rc \
-            gpg.w32-manifest.in test.c t-keydb-keyring.kbx \
+            ChangeLog-2011 \
+             gpg-w32info.rc gpg.w32-manifest.in \
+             gpgv-w32info.rc gpgv.w32-manifest.in \
+            test.c t-keydb-keyring.kbx \
             t-keydb-get-keyblock.gpg t-stutter-data.asc \
             all-tests.scm
 
@@ -88,10 +90,13 @@ endif
 
 
 if HAVE_W32_SYSTEM
-resource_objs += gpg-w32info.o
-
+gpg_robjs = $(resource_objs) gpg-w32info.o
+gpgv_robjs = $(resource_objs) gpgv-w32info.o
 gpg-w32info.o : gpg.w32-manifest
-
+gpgv-w32info.o : gpgv.w32-manifest
+else
+gpg_robjs =
+gpgv_robjs =
 endif
 
 common_source =  \
@@ -178,16 +183,16 @@ LDADD =  $(needed_libs) ../common/libgpgrl.a \
          $(ZLIBS) $(LIBINTL) $(CAPLIBS) $(NETLIBS)
 gpg_LDADD = $(LDADD) $(SQLITE3_LIBS) $(LIBGCRYPT_LIBS) $(LIBREADLINE) \
              $(LIBASSUAN_LIBS) $(GPG_ERROR_LIBS) \
-            $(LIBICONV) $(resource_objs) $(extra_sys_libs)
+            $(LIBICONV) $(gpg_robjs) $(extra_sys_libs)
 gpg_LDFLAGS = $(extra_bin_ldflags)
 gpgv_LDADD = $(LDADD) $(LIBGCRYPT_LIBS) \
               $(GPG_ERROR_LIBS) \
-             $(LIBICONV) $(resource_objs) $(extra_sys_libs)
+             $(LIBICONV) $(gpgv_robjs) $(extra_sys_libs)
 gpgv_LDFLAGS = $(extra_bin_ldflags)
 
 gpgcompose_LDADD = $(LDADD) $(SQLITE3_LIBS) $(LIBGCRYPT_LIBS) $(LIBREADLINE) \
              $(LIBASSUAN_LIBS) $(GPG_ERROR_LIBS) \
-            $(LIBICONV) $(resource_objs) $(extra_sys_libs)
+            $(LIBICONV) $(extra_sys_libs)
 gpgcompose_LDFLAGS = $(extra_bin_ldflags)
 
 t_common_ldadd =
index 11340aa..c7f1c29 100644 (file)
@@ -866,8 +866,14 @@ agent_scd_keypairinfo (ctrl_t ctrl, strlist_t *r_list)
 
 /* Send an APDU to the current card.  On success the status word is
  * stored at R_SW.  With HEXAPDU being NULL only a RESET command is
- * send to scd.  With HEXAPDU being the string "undefined" the command
- * "SERIALNO undefined" is send to scd.
+ * send to scd.  HEXAPDU may also be one of these special strings:
+ *
+ *   "undefined"       :: Send the command "SCD SERIALNO undefined"
+ *   "lock"            :: Send the command "SCD LOCK --wait"
+ *   "trylock"         :: Send the command "SCD LOCK"
+ *   "unlock"          :: Send the command "SCD UNLOCK"
+ *   "reset-keep-lock" :: Send the command "SCD RESET --keep-lock"
+ *
  * Used by:
  *  card-util.c
  */
@@ -888,6 +894,26 @@ agent_scd_apdu (const char *hexapdu, unsigned int *r_sw)
                              NULL, NULL, NULL, NULL, NULL, NULL);
 
     }
+  else if (!strcmp (hexapdu, "reset-keep-lock"))
+    {
+      err = assuan_transact (agent_ctx, "SCD RESET --keep-lock",
+                             NULL, NULL, NULL, NULL, NULL, NULL);
+    }
+  else if (!strcmp (hexapdu, "lock"))
+    {
+      err = assuan_transact (agent_ctx, "SCD LOCK --wait",
+                             NULL, NULL, NULL, NULL, NULL, NULL);
+    }
+  else if (!strcmp (hexapdu, "trylock"))
+    {
+      err = assuan_transact (agent_ctx, "SCD LOCK",
+                             NULL, NULL, NULL, NULL, NULL, NULL);
+    }
+  else if (!strcmp (hexapdu, "unlock"))
+    {
+      err = assuan_transact (agent_ctx, "SCD UNLOCK",
+                             NULL, NULL, NULL, NULL, NULL, NULL);
+    }
   else if (!strcmp (hexapdu, "undefined"))
     {
       err = assuan_transact (agent_ctx, "SCD SERIALNO undefined",
index 00b64b3..8a5ab28 100644 (file)
@@ -1834,8 +1834,13 @@ send_apdu (const char *hexapdu, const char *desc, unsigned int ignore)
   if (err)
     tty_printf ("sending card command %s failed: %s\n", desc,
                 gpg_strerror (err));
-  else if (!hexapdu || !strcmp (hexapdu, "undefined"))
-    ;
+  else if (!hexapdu
+           || !strcmp (hexapdu, "undefined")
+           || !strcmp (hexapdu, "reset-keep-lock")
+           || !strcmp (hexapdu, "lock")
+           || !strcmp (hexapdu, "trylock")
+           || !strcmp (hexapdu, "unlock"))
+    ; /* Ignore pseudo APDUs.  */
   else if (ignore == 0xffff)
     ; /* Ignore all status words.  */
   else if (sw != 0x9000)
@@ -1864,6 +1869,7 @@ factory_reset (void)
   char *answer = NULL;
   int termstate = 0;
   int i;
+  int locked = 0;
 
   /*  The code below basically does the same what this
       gpg-connect-agent script does:
@@ -1925,8 +1931,14 @@ factory_reset (void)
         goto leave;
 
       /* We need to select a card application before we can send APDUs
-         to the card without scdaemon doing anything on its own.  */
-      err = send_apdu (NULL, "RESET", 0);
+         to the card without scdaemon doing anything on its own.  We
+         then lock the connection so that other tools (e.g. Kleopatra)
+         don't try a new select.  */
+      err = send_apdu ("lock", "locking connection ", 0);
+      if (err)
+        goto leave;
+      locked = 1;
+      err = send_apdu ("reset-keep-lock", "reset", 0);
       if (err)
         goto leave;
       err = send_apdu ("undefined", "dummy select ", 0);
@@ -1968,7 +1980,7 @@ factory_reset (void)
     goto leave;
 
   /* Finally we reset the card reader once more.  */
-  err = send_apdu (NULL, "RESET", 0);
+  err = send_apdu ("reset-keep-lock", "reset", 0);
 
   /* Then, connect the card again.  */
   if (!err)
@@ -1981,6 +1993,8 @@ factory_reset (void)
     }
 
  leave:
+  if (locked)
+    send_apdu ("unlock", "unlocking connection ", 0);
   xfree (answer);
   agent_release_card_info (&info);
 }
index 42cad2b..01f32af 100644 (file)
@@ -195,7 +195,11 @@ encrypt_simple (const char *filename, int mode, int use_seskey)
       if (rc)
         {
           iobuf_close (inp);
-          log_error (_("error creating passphrase: %s\n"), gpg_strerror (rc));
+          if (gpg_err_code (rc) == GPG_ERR_CIPHER_ALGO
+              || gpg_err_code (rc) == GPG_ERR_DIGEST_ALGO)
+            ; /* Error has already been printed.  */
+          else
+            log_error (_("error creating passphrase: %s\n"), gpg_strerror (rc));
           release_progress_context (pfx);
           return rc;
         }
@@ -373,12 +377,33 @@ gpg_error_t
 setup_symkey (STRING2KEY **symkey_s2k, DEK **symkey_dek)
 {
   int canceled;
+  int defcipher;
+  int s2kdigest;
+
+  defcipher = default_cipher_algo ();
+  if (!gnupg_cipher_is_allowed (opt.compliance, 1, defcipher,
+                                GCRY_CIPHER_MODE_CFB))
+    {
+      log_error (_("cipher algorithm '%s' may not be used in %s mode\n"),
+                openpgp_cipher_algo_name (defcipher),
+                gnupg_compliance_option_string (opt.compliance));
+      return gpg_error (GPG_ERR_CIPHER_ALGO);
+    }
+
+  s2kdigest = S2K_DIGEST_ALGO;
+  if (!gnupg_digest_is_allowed (opt.compliance, 1, s2kdigest))
+    {
+      log_error (_("digest algorithm '%s' may not be used in %s mode\n"),
+                gcry_md_algo_name (s2kdigest),
+                gnupg_compliance_option_string (opt.compliance));
+      return gpg_error (GPG_ERR_DIGEST_ALGO);
+    }
 
   *symkey_s2k = xmalloc_clear (sizeof **symkey_s2k);
   (*symkey_s2k)->mode = opt.s2k_mode;
-  (*symkey_s2k)->hash_algo = S2K_DIGEST_ALGO;
+  (*symkey_s2k)->hash_algo = s2kdigest;
 
-  *symkey_dek = passphrase_to_dek (default_cipher_algo (),
+  *symkey_dek = passphrase_to_dek (defcipher,
                                    *symkey_s2k, 1, 0, NULL, &canceled);
   if (!*symkey_dek || !(*symkey_dek)->keylen)
     {
index 3e5dc27..1baa49f 100644 (file)
@@ -539,7 +539,7 @@ exec_write(struct exec_info **info,const char *program,
       gpg_err_set_errno (EPERM);
     }
   else
-    (*info)->tochild=fopen((*info)->tempfile_in,binary?"wb":"w");
+    (*info)->tochild = gnupg_fopen ((*info)->tempfile_in,binary?"wb":"w");
   if((*info)->tochild==NULL)
     {
       ret = gpg_error_from_syserror ();
index 1dc97a8..a3ada64 100644 (file)
--- a/g10/gpg.c
+++ b/g10/gpg.c
@@ -125,6 +125,7 @@ enum cmd_and_opt_values
     aLSignKey,
     aQuickSignKey,
     aQuickLSignKey,
+    aQuickRevSig,
     aQuickAddUid,
     aQuickAddKey,
     aQuickRevUid,
@@ -489,6 +490,8 @@ static ARGPARSE_OPTS opts[] = {
               N_("quickly sign a key")),
   ARGPARSE_c (aQuickLSignKey, "quick-lsign-key",
               N_("quickly sign a key locally")),
+  ARGPARSE_c (aQuickRevSig,   "quick-revoke-sig" ,
+              N_("quickly revoke a key signature")),
   ARGPARSE_c (aSignKey,  "sign-key"   ,N_("sign a key")),
   ARGPARSE_c (aLSignKey, "lsign-key"  ,N_("sign a key locally")),
   ARGPARSE_c (aEditKey,  "edit-key"   ,N_("sign or edit a key")),
@@ -1334,10 +1337,10 @@ open_info_file (const char *fname, int for_write, int binary)
       do
         {
           if (for_write)
-            fd = open (fname, O_CREAT | O_TRUNC | O_WRONLY | binary,
-                        S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
+            fd = gnupg_open (fname, O_CREAT | O_TRUNC | O_WRONLY | binary,
+                             S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
           else
-            fd = open (fname, O_RDONLY | binary);
+            fd = gnupg_open (fname, O_RDONLY | binary, 0);
         }
       while (fd == -1 && errno == EINTR);
 /*     } */
@@ -1501,7 +1504,7 @@ check_permissions (const char *path, int item)
     }
 
   /* It's okay if the file or directory doesn't exist */
-  if(stat(tmppath,&statbuf)!=0)
+  if (gnupg_stat (tmppath,&statbuf))
     {
       ret=0;
       goto end;
@@ -1512,7 +1515,7 @@ check_permissions (const char *path, int item)
      I'm stopping at one level down. */
   dir=make_dirname(tmppath);
 
-  if(stat(dir,&dirbuf)!=0 || !S_ISDIR(dirbuf.st_mode))
+  if (gnupg_stat (dir,&dirbuf) || !S_ISDIR (dirbuf.st_mode))
     {
       /* Weird error */
       ret=1;
@@ -2185,7 +2188,9 @@ set_compliance_option (enum cmd_and_opt_values option)
     case oDE_VS:
       set_compliance_option (oOpenPGP);
       opt.compliance = CO_DE_VS;
-      /* Fixme: Change other options.  */
+      /* We divert here from the backward compatible rfc4880 algos.  */
+      opt.s2k_digest_algo = DIGEST_ALGO_SHA256;
+      opt.s2k_cipher_algo = CIPHER_ALGO_AES256;
       break;
 
     default:
@@ -2531,7 +2536,7 @@ main (int argc, char **argv)
        }
 
        configlineno = 0;
-       configfp = fopen( configname, "r" );
+       configfp = gnupg_fopen( configname, "r" );
         if (configfp && is_secured_file (fileno (configfp)))
           {
             fclose (configfp);
@@ -2610,6 +2615,7 @@ main (int argc, char **argv)
          case aSign:
          case aQuickSignKey:
          case aQuickLSignKey:
+         case aQuickRevSig:
          case aSignKey:
          case aLSignKey:
          case aStore:
@@ -4021,13 +4027,14 @@ main (int argc, char **argv)
       }
 
     /* Set the random seed file. */
-    if( use_random_seed ) {
-      char *p = make_filename (gnupg_homedir (), "random_seed", NULL );
-       gcry_control (GCRYCTL_SET_RANDOM_SEED_FILE, p);
-        if (!access (p, F_OK))
+    if (use_random_seed)
+      {
+        char *p = make_filename (gnupg_homedir (), "random_seed", NULL );
+        gcry_control (GCRYCTL_SET_RANDOM_SEED_FILE, p);
+        if (!gnupg_access (p, F_OK))
           register_secured_file (p);
        xfree(p);
-    }
+      }
 
     /* If there is no command but the --fingerprint is given, default
        to the --list-keys command.  */
@@ -4381,6 +4388,22 @@ main (int argc, char **argv)
         }
        break;
 
+      case aQuickRevSig:
+        {
+          const char *userid, *siguserid;
+
+          if (argc < 2)
+            wrong_args ("--quick-revoke-sig USER-ID SIG-USER-ID [userids]");
+          userid = *argv++; argc--;
+          siguserid = *argv++; argc--;
+          sl = NULL;
+          for( ; argc; argc--, argv++)
+           append_to_strlist2 (&sl, *argv, utf8_strings);
+          keyedit_quick_revsig (ctrl, userid, siguserid, sl);
+          free_strlist (sl);
+        }
+       break;
+
       case aSignKey:
        if( argc != 1 )
          wrong_args("--sign-key user-id");
index 8c98dc5..24484db 100644 (file)
@@ -8,10 +8,11 @@
     />
 <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
   <application>
-    <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/><!-- Vista -->
-    <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/><!-- 7 -->
-    <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/><!-- 8 -->
+    <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/><!-- 10 -->
     <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/><!-- 8.1 -->
+    <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/><!-- 8 -->
+    <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/><!-- 7 -->
+    <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/><!-- Vista -->
   </application>
 </compatibility>
 </assembly>
diff --git a/g10/gpgv-w32info.rc b/g10/gpgv-w32info.rc
new file mode 100644 (file)
index 0000000..9182fa4
--- /dev/null
@@ -0,0 +1,52 @@
+/* gpgv-w32info.rc                                           -*- c -*-
+ * Copyright (C) 2020 g10 Code GmbH
+ *
+ * This file is free software; as a special exception the author gives
+ * unlimited permission to copy and/or distribute it, with or without
+ * modifications, as long as this notice is preserved.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+#include "afxres.h"
+#include "../common/w32info-rc.h"
+
+1 ICON "../common/gnupg.ico"
+
+1 VERSIONINFO
+  FILEVERSION    W32INFO_VI_FILEVERSION
+  PRODUCTVERSION W32INFO_VI_PRODUCTVERSION
+  FILEFLAGSMASK  0x3fL
+#ifdef _DEBUG
+  FILEFLAGS      0x01L    /* VS_FF_DEBUG (0x1)*/
+#else
+  FILEFLAGS      0x00L
+#endif
+  FILEOS         0x40004L /* VOS_NT (0x40000) | VOS__WINDOWS32 (0x4)  */
+  FILETYPE       0x1L     /* VFT_APP (0x1)  */
+  FILESUBTYPE    0x0L     /* VFT2_UNKNOWN   */
+  BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "040904b0"  /* US English (0409), Unicode (04b0) */
+        BEGIN
+            VALUE "FileDescription", L"GnuPG\x2019s OpenPGP verify tool\0"
+            VALUE "InternalName", "gpgv\0"
+            VALUE "OriginalFilename", "gpgv.exe\0"
+            VALUE "ProductName",    W32INFO_PRODUCTNAME
+            VALUE "ProductVersion", W32INFO_PRODUCTVERSION
+            VALUE "CompanyName", W32INFO_COMPANYNAME
+            VALUE "FileVersion", W32INFO_FILEVERSION
+            VALUE "LegalCopyright", W32INFO_LEGALCOPYRIGHT
+            VALUE "Comments",    W32INFO_COMMENTS
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+      VALUE "Translation", 0x409, 0x4b0
+    END
+  END
+
+1 RT_MANIFEST "gpgv.w32-manifest"
diff --git a/g10/gpgv.w32-manifest.in b/g10/gpgv.w32-manifest.in
new file mode 100644 (file)
index 0000000..b7a2120
--- /dev/null
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+<description>GNU Privacy Guard (OpenPGP verify tool)</description>
+<assemblyIdentity
+    type="win32"
+    name="GnuPG.gpgv"
+    version="@BUILD_VERSION@"
+    />
+<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
+  <application>
+    <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/><!-- 10 -->
+    <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/><!-- 8.1 -->
+    <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/><!-- 8 -->
+    <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/><!-- 7 -->
+    <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/><!-- Vista -->
+  </application>
+</compatibility>
+</assembly>
index 45b3c85..e538fe4 100644 (file)
@@ -29,6 +29,7 @@
 
 #include "gpg.h"
 #include "../common/util.h"
+#include "../common/sysutils.h"
 #include "options.h"
 #include "main.h" /*try_make_homedir ()*/
 #include "packet.h"
@@ -293,6 +294,7 @@ keyblock_cache_clear (struct keydb_handle *hd)
 static gpg_error_t
 maybe_create_keyring_or_box (char *filename, int is_box, int force_create)
 {
+  gpg_err_code_t ec;
   dotlock_t lockhd = NULL;
   IOBUF iobuf;
   int rc;
@@ -303,8 +305,8 @@ maybe_create_keyring_or_box (char *filename, int is_box, int force_create)
   int save_slash;
 
   /* A quick test whether the filename already exists. */
-  if (!access (filename, F_OK))
-    return !access (filename, R_OK)? 0 : gpg_error (GPG_ERR_EACCES);
+  if (!gnupg_access (filename, F_OK))
+    return !gnupg_access (filename, R_OK)? 0 : gpg_error (GPG_ERR_EACCES);
 
   /* If we don't want to create a new file at all, there is no need to
      go any further - bail out right here.  */
@@ -330,7 +332,7 @@ maybe_create_keyring_or_box (char *filename, int is_box, int force_create)
                                            not happen though.  */
   save_slash = *last_slash_in_filename;
   *last_slash_in_filename = 0;
-  if (access(filename, F_OK))
+  if (gnupg_access(filename, F_OK))
     {
       static int tried;
 
@@ -339,9 +341,9 @@ maybe_create_keyring_or_box (char *filename, int is_box, int force_create)
           tried = 1;
           try_make_homedir (filename);
         }
-      if (access (filename, F_OK))
+      if ((ec = gnupg_access (filename, F_OK)))
         {
-          rc = gpg_error_from_syserror ();
+          rc = gpg_error (ec);
           *last_slash_in_filename = save_slash;
           goto leave;
         }
@@ -398,12 +400,12 @@ maybe_create_keyring_or_box (char *filename, int is_box, int force_create)
   if (rc)
     goto leave;
 
-  if (!access (filename, F_OK))
+  if (!gnupg_access (filename, F_OK))
     {
       rc = 0;  /* Okay, we may access the file now.  */
       goto leave;
     }
-  if (!access (bak_fname, F_OK) && !access (tmp_fname, F_OK))
+  if (!gnupg_access (bak_fname, F_OK) && !gnupg_access (tmp_fname, F_OK))
     {
       /* Very likely another process is updating a pubring.gpg and we
          should not create a pubring.kbx.  */
@@ -442,13 +444,13 @@ maybe_create_keyring_or_box (char *filename, int is_box, int force_create)
      that the detection magic will work the next time it is used.  */
   if (is_box)
     {
-      FILE *fp = fopen (filename, "wb");
+      estream_t fp = es_fopen (filename, "wb");
       if (!fp)
         rc = gpg_error_from_syserror ();
       else
         {
           rc = _keybox_write_header_blob (fp, 1);
-          fclose (fp);
+          es_fclose (fp);
         }
       if (rc)
         {
@@ -502,7 +504,7 @@ rt_from_file (const char *filename, int *r_found, int *r_openpgp)
   KeydbResourceType rt = KEYDB_RESOURCE_TYPE_NONE;
 
   *r_found = *r_openpgp = 0;
-  fp = fopen (filename, "rb");
+  fp = gnupg_fopen (filename, "rb");
   if (fp)
     {
       *r_found = 1;
index f61515f..e1a316c 100644 (file)
@@ -128,9 +128,10 @@ struct pubkey_find_info {
 
 
 /* Helper type for preference functions. */
-union pref_hint
+struct pref_hint
 {
-  int digest_length;
+  int digest_length;  /* We want at least this digest length.  */
+  int exact;          /* We need to use exactly this length.   */
 };
 
 
@@ -262,9 +263,9 @@ gpg_error_t find_and_check_key (ctrl_t ctrl,
                                 pk_list_t *pk_list_addr);
 
 int  algo_available( preftype_t preftype, int algo,
-                    const union pref_hint *hint );
+                    const struct pref_hint *hint );
 int  select_algo_from_prefs( PK_LIST pk_list, int preftype,
-                            int request, const union pref_hint *hint);
+                            int request, const struct pref_hint *hint);
 int  select_mdc_from_pklist (PK_LIST pk_list);
 void warn_missing_mdc_from_pklist (PK_LIST pk_list);
 void warn_missing_aes_from_pklist (PK_LIST pk_list);
index a7932ce..ed81c4a 100644 (file)
@@ -2275,7 +2275,7 @@ leave:
  * Returns on success the key database handle at R_KDBHD and the
  * keyblock at R_KEYBLOCK.  */
 static gpg_error_t
-quick_find_keyblock (ctrl_t ctrl, const char *username,
+quick_find_keyblock (ctrl_t ctrl, const char *username, int want_secret,
                      KEYDB_HANDLE *r_kdbhd, kbnode_t *r_keyblock)
 {
   gpg_error_t err;
@@ -2318,7 +2318,7 @@ quick_find_keyblock (ctrl_t ctrl, const char *username,
         err = 0;
       keydb_pop_found_state (kdbhd);
 
-      if (!err)
+      if (!err && want_secret)
         {
           /* We require the secret primary key to set the primary UID.  */
           node = find_kbnode (keyblock, PKT_PUBLIC_KEY);
@@ -2375,7 +2375,7 @@ keyedit_quick_adduid (ctrl_t ctrl, const char *username, const char *newuid)
 #endif
 
   /* Search the key; we don't want the whole getkey stuff here.  */
-  err = quick_find_keyblock (ctrl, username, &kdbhd, &keyblock);
+  err = quick_find_keyblock (ctrl, username, 1, &kdbhd, &keyblock);
   if (err)
     goto leave;
 
@@ -2418,7 +2418,7 @@ keyedit_quick_revuid (ctrl_t ctrl, const char *username, const char *uidtorev)
 #endif
 
   /* Search the key; we don't want the whole getkey stuff here.  */
-  err = quick_find_keyblock (ctrl, username, &kdbhd, &keyblock);
+  err = quick_find_keyblock (ctrl, username, 1, &kdbhd, &keyblock);
   if (err)
     goto leave;
 
@@ -2498,7 +2498,7 @@ keyedit_quick_set_primary (ctrl_t ctrl, const char *username,
   check_trustdb_stale (ctrl);
 #endif
 
-  err = quick_find_keyblock (ctrl, username, &kdbhd, &keyblock);
+  err = quick_find_keyblock (ctrl, username, 1, &kdbhd, &keyblock);
   if (err)
     goto leave;
 
@@ -2771,6 +2771,240 @@ keyedit_quick_sign (ctrl_t ctrl, const char *fpr, strlist_t uids,
 }
 
 
+/* Unattended revocation of a key signatures.  USERNAME specifies the
+ * key; this should best be a fingerprint. SIGTOREV is the user-id of
+ * the key for which the key signature shall be removed.  Only
+ * non-self-signatures can be removed with this functions.  If
+ * AFFECTED_UIDS is not NULL only the key signatures on these user-ids
+ * are revoked. */
+void
+keyedit_quick_revsig (ctrl_t ctrl, const char *username, const char *sigtorev,
+                      strlist_t affected_uids)
+{
+  gpg_error_t err;
+  int no_signing_key = 0;
+  KEYDB_HANDLE kdbhd = NULL;
+  kbnode_t keyblock = NULL;
+  PKT_public_key *primarypk;  /* Points into KEYBLOCK.  */
+  u32 *primarykid;
+  PKT_public_key *pksigtorev = NULL;
+  u32 *pksigtorevkid;
+  kbnode_t node, n;
+  int skip_remaining;
+  int consider_sig;
+  strlist_t sl;
+  struct sign_attrib attrib = { 0 };
+
+#ifdef HAVE_W32_SYSTEM
+  /* See keyedit_menu for why we need this.  */
+  check_trustdb_stale (ctrl);
+#endif
+
+  /* Search the key; we don't want the whole getkey stuff here.  Noet
+   * that we are looking for the public key here.  */
+  err = quick_find_keyblock (ctrl, username, 0, &kdbhd, &keyblock);
+  if (err)
+    goto leave;
+  log_assert (keyblock->pkt->pkttype == PKT_PUBLIC_KEY
+              || keyblock->pkt->pkttype == PKT_SECRET_KEY);
+  primarypk = keyblock->pkt->pkt.public_key;
+  primarykid = pk_keyid (primarypk);
+
+  /* Get the signing key we want to revoke.  This must be one of our
+   * signing keys.  We will compare only the keyid because we don't
+   * assume that we have duplicated keyids on our own secret keys.  If
+   * a there is a duplicated one we will notice this when creating the
+   * revocation.  */
+  pksigtorev = xtrycalloc (1, sizeof *pksigtorev);
+  if (!pksigtorev)
+    {
+      err = gpg_error_from_syserror ();
+      goto leave;
+    }
+  pksigtorev->req_usage = PUBKEY_USAGE_CERT;
+  err = getkey_byname (ctrl, NULL, pksigtorev, sigtorev, 1, NULL);
+  if (err)
+    {
+      no_signing_key = 1;
+      goto leave;
+    }
+  pksigtorevkid = pk_keyid (pksigtorev);
+
+  /* Find the signatures we want to revoke and set a mark.  */
+  skip_remaining = consider_sig = 0;
+  for (node = keyblock; node; node = node->next)
+    {
+      node->flag &= ~NODFLG_MARK_A;
+      if (skip_remaining)
+        ;
+      else if (node->pkt->pkttype == PKT_PUBLIC_SUBKEY)
+        skip_remaining = 1;
+      else if (node->pkt->pkttype == PKT_USER_ID)
+       {
+          PKT_user_id *uid = node->pkt->pkt.user_id;
+
+          consider_sig = !affected_uids;
+          for (sl = affected_uids; !consider_sig && sl; sl = sl->next)
+            {
+              const char *name = sl->d;
+
+              if (uid->attrib_data)
+                ;
+              else if (*name == '='
+                       && strlen (name+1) == uid->len
+                       && !memcmp (uid->name, name + 1, uid->len))
+                { /* Exact match.  */
+                  consider_sig = 1;
+                }
+              else if (ascii_memistr (uid->name, uid->len,
+                                      *name == '*'? name+1:name))
+                { /* Case-insensitive substring match.  */
+                  consider_sig = 1;
+                }
+            }
+       }
+      else if (node->pkt->pkttype == PKT_SIGNATURE)
+       {
+          /* We need to sort the signatures so that we can figure out
+           * whether the key signature has been revoked or the
+           * revocation has been superseded by a new key
+           * signature.  */
+          PKT_signature *sig;
+          unsigned int sigcount = 0;
+          kbnode_t *sigarray;
+
+          /* Allocate an array large enogh for all signatures.  */
+          for (n=node; n && n->pkt->pkttype == PKT_SIGNATURE; n = n->next)
+            sigcount++;
+          sigarray = xtrycalloc (sigcount, sizeof *sigarray);
+          if (!sigarray)
+            {
+              err = gpg_error_from_syserror ();
+              goto leave;
+            }
+
+          /* Now fill the array with signatures we are interested in.
+           * We also move NODE forward to the end.  */
+          sigcount = 0;
+          for (n=node; n && n->pkt->pkttype == PKT_SIGNATURE; node=n, n=n->next)
+            {
+              sig = n->pkt->pkt.signature;
+              if (!keyid_cmp (primarykid, sig->keyid))
+                continue;  /* Ignore self-signatures.  */
+
+              if (keyid_cmp (pksigtorevkid, sig->keyid))
+                continue; /* Ignore non-matching signatures.  */
+
+              n->flag &= ~NODFLG_MARK_B; /* Clear flag used by cmp_signode. */
+              sigarray[sigcount++] = n;
+            }
+
+          if (sigcount)
+            {
+              qsort (sigarray, sigcount, sizeof *sigarray, cmp_signodes);
+
+              /* log_debug ("Sorted signatures:\n"); */
+              /* for (idx=0; idx < sigcount; idx++) */
+              /*   { */
+              /*     sig = sigarray[idx]->pkt->pkt.signature; */
+              /*     log_debug ("%s 0x%02x %s\n", keystr (sig->keyid), */
+              /*                sig->sig_class, datestr_from_sig (sig)); */
+              /*   } */
+              sig = sigarray[sigcount-1]->pkt->pkt.signature;
+              if ((consider_sig || !affected_uids) && IS_UID_REV (sig))
+                {
+                  if (!opt.quiet)
+                    log_info ("sig by %s already revoked at %s\n",
+                              keystr (sig->keyid), datestr_from_sig (sig));
+                }
+              else if ((consider_sig && IS_UID_SIG (sig))
+                       || (!affected_uids && IS_KEY_SIG (sig)))
+                node->flag |= NODFLG_MARK_A;  /* Select signature.  */
+            }
+
+          xfree (sigarray);
+       }
+    }
+
+  /* Check whether any signatures were done by the given key.  We do
+   * not return an error if none were found.  */
+  for (node = keyblock; node; node = node->next)
+    if ((node->flag & NODFLG_MARK_A))
+      break;
+  if (!node)
+    {
+      if (opt.verbose)
+        log_info (_("Not signed by you.\n"));
+      err = 0;
+      goto leave;
+    }
+
+  /* Revoke all marked signatures.  */
+  attrib.reason = get_default_sig_revocation_reason ();
+
+ reloop: /* (we must repeat because we are modifying the list) */
+  for (node = keyblock; node; node = node->next)
+    {
+      kbnode_t unode;
+      PKT_signature *sig;
+      PACKET *pkt;
+
+      if (!(node->flag & NODFLG_MARK_A))
+       continue;
+      node->flag &= ~NODFLG_MARK_A;
+
+      if (IS_KEY_SIG (node->pkt->pkt.signature))
+        unode = NULL;
+      else
+        {
+          unode = find_prev_kbnode (keyblock, node, PKT_USER_ID);
+          log_assert (unode);
+        }
+
+      attrib.non_exportable = !node->pkt->pkt.signature->flags.exportable;
+
+      err = make_keysig_packet (ctrl, &sig, primarypk,
+                                unode? unode->pkt->pkt.user_id : NULL,
+                                NULL, pksigtorev, 0x30, 0, 0, 0,
+                                sign_mk_attrib, &attrib, NULL);
+      if (err)
+        {
+          log_error ("signing failed: %s\n", gpg_strerror (err));
+          goto leave;
+        }
+
+      pkt = xmalloc_clear (sizeof *pkt);
+      pkt->pkttype = PKT_SIGNATURE;
+      pkt->pkt.signature = sig;
+      if (unode)
+        insert_kbnode (unode, new_kbnode (pkt), 0);
+      goto reloop;
+    }
+
+  err = keydb_update_keyblock (ctrl, kdbhd, keyblock);
+  if (err)
+    {
+      log_error (_("update failed: %s\n"), gpg_strerror (err));
+      goto leave;
+    }
+  revalidation_mark (ctrl);
+
+ leave:
+  if (err)
+    {
+      log_error (_("revoking the key signature failed: %s\n"),
+                 gpg_strerror (err));
+      if (no_signing_key)
+        print_further_info ("error getting key used to make the key signature");
+      write_status_error ("keyedit.revoke.sig", err);
+    }
+  release_revocation_reason_info (attrib.reason);
+  free_public_key (pksigtorev);
+  release_kbnode (keyblock);
+  keydb_release (kdbhd);
+}
+
+
 /* Unattended subkey creation function.
  *
  */
@@ -5990,7 +6224,7 @@ core_revuid (ctrl_t ctrl, kbnode_t keyblock, KBNODE node,
           memset (&attrib, 0, sizeof attrib);
           /* should not need to cast away const here; but
              revocation_reason_build_cb needs to take a non-const
-             void* in order to meet the function signtuare for the
+             void* in order to meet the function signature for the
              mksubpkt argument to make_keysig_packet */
           attrib.reason = (struct revocation_reason_info *)reason;
 
index af5e996..1aa95c1 100644 (file)
@@ -33,6 +33,8 @@
 #define NODFLG_SELKEY (1<<9)   /* Indicate the selected key.  */
 #define NODFLG_SELSIG (1<<10)  /* Indicate a selected signature.  */
 
+#define NODFLG_MARK_B (1<<11)   /* Temporary mark in key listing code.  */
+
 /*-- keyedit.c --*/
 void keyedit_menu (ctrl_t ctrl, const char *username, strlist_t locusr,
                   strlist_t commands, int quiet, int seckey_check );
@@ -45,6 +47,8 @@ void keyedit_quick_revuid (ctrl_t ctrl, const char *username,
                            const char *uidtorev);
 void keyedit_quick_sign (ctrl_t ctrl, const char *fpr,
                          strlist_t uids, strlist_t locusr, int local);
+void keyedit_quick_revsig (ctrl_t ctrl, const char *username,
+                           const char *sigtorev, strlist_t affected_uids);
 void keyedit_quick_set_expire (ctrl_t ctrl,
                                const char *fpr, const char *expirestr,
                                char **subkeyfprs);
index 471f52a..d50acf8 100644 (file)
@@ -2147,6 +2147,10 @@ ask_algo (ctrl_t ctrl, int addmode, int *r_subkey_algo, unsigned int *r_usage,
                       && !(sl->flags & GCRY_PK_USAGE_ENCR))
                     sl->flags |= (PUBKEY_ALGO_ECDSA << 8);
                   else if (algoid == GCRY_PK_ECC
+                      && algostr && !strncmp (algostr, "brainpool", 9)
+                      && !(sl->flags & GCRY_PK_USAGE_ENCR))
+                    sl->flags |= (PUBKEY_ALGO_ECDSA << 8);
+                  else if (algoid == GCRY_PK_ECC
                            && algostr && !strcmp (algostr, "ed25519")
                            && !(sl->flags & GCRY_PK_USAGE_ENCR))
                     sl->flags = (PUBKEY_ALGO_EDDSA << 8);
@@ -4039,6 +4043,7 @@ read_parameter_file (ctrl_t ctrl, const char *fname )
     para = NULL;
     maxlen = 1024;
     line = NULL;
+    nline = 0;
     while ( iobuf_read_line (fp, &line, &nline, &maxlen) ) {
        char *keyword, *value;
 
index 5b0f7ba..7deb04d 100644 (file)
@@ -893,6 +893,51 @@ dump_attribs (const PKT_user_id *uid, PKT_public_key *pk)
 }
 
 
+/* Order two signatures.  We first order by keyid and then by creation
+ * time.  This is currently only used in keyedit.c  */
+int
+cmp_signodes (const void *av, const void *bv)
+{
+  const kbnode_t an = *(const kbnode_t *)av;
+  const kbnode_t bn = *(const kbnode_t *)bv;
+  const PKT_signature *a;
+  const PKT_signature *b;
+  int i;
+
+  /* log_assert (an->pkt->pkttype == PKT_SIGNATURE); */
+  /* log_assert (bn->pkt->pkttype == PKT_SIGNATURE); */
+
+  a = an->pkt->pkt.signature;
+  b = bn->pkt->pkt.signature;
+
+  /* Self-signatures are ordered first.  */
+  if ((an->flag & NODFLG_MARK_B) && !(bn->flag & NODFLG_MARK_B))
+    return -1;
+  if (!(an->flag & NODFLG_MARK_B) && (bn->flag & NODFLG_MARK_B))
+    return 1;
+
+  /* then the keyids.  (which are or course the same for self-sigs). */
+  i = keyid_cmp (a->keyid, b->keyid);
+  if (i)
+    return i;
+
+  /* Followed by creation time */
+  if (a->timestamp > b->timestamp)
+    return 1;
+  if (a->timestamp < b->timestamp)
+    return -1;
+
+  /* followed by the class in a way that a rev comes first.  */
+  if (a->sig_class > b->sig_class)
+    return 1;
+  if (a->sig_class < b->sig_class)
+    return -1;
+
+  /* To make the sort stable we compare the entire structure as last resort.  */
+  return memcmp (a, b, sizeof *a);
+}
+
+
 static void
 list_keyblock_print (ctrl_t ctrl, kbnode_t keyblock, int secret, int fpr,
                      struct keylist_context *listctx)
index f424f94..8c31ccc 100644 (file)
@@ -228,7 +228,7 @@ keyring_is_writable (void *token)
 {
   KR_RESOURCE r = token;
 
-  return r? (r->read_only || !access (r->fname, W_OK)) : 0;
+  return r? (r->read_only || !gnupg_access (r->fname, W_OK)) : 0;
 }
 
 
@@ -1371,7 +1371,7 @@ rename_tmp_file (const char *bakfname, const char *tmpfname, const char *fname)
 
     statbuf.st_mode=S_IRUSR | S_IWUSR;
 
-    if (!stat (bakfname, &statbuf) && !chmod (fname, statbuf.st_mode))
+    if (!gnupg_stat (bakfname, &statbuf) && !chmod (fname, statbuf.st_mode))
       ;
     else
       log_error ("WARNING: unable to restore permissions to '%s': %s",
@@ -1606,6 +1606,7 @@ static int
 do_copy (int mode, const char *fname, KBNODE root,
          off_t start_offset, unsigned int n_packets )
 {
+    gpg_err_code_t ec;
     IOBUF fp, newfp;
     int rc=0;
     char *bakfname = NULL;
@@ -1613,8 +1614,8 @@ do_copy (int mode, const char *fname, KBNODE root,
 
     /* Open the source file. Because we do a rename, we have to check the
        permissions of the file */
-    if (access (fname, W_OK))
-      return gpg_error_from_syserror ();
+    if ((ec = gnupg_access (fname, W_OK)))
+      return gpg_error (ec);
 
     fp = iobuf_open (fname);
     if (mode == 1 && !fp && errno == ENOENT) {
index bb046ba..68360e2 100644 (file)
@@ -95,6 +95,7 @@ void print_sha1_keysig_rejected_note (void);
 void print_reported_error (gpg_error_t err, gpg_err_code_t skip_if_ec);
 void print_further_info (const char *format, ...) GPGRT_ATTR_PRINTF(1,2);
 void additional_weak_digest (const char* digestname);
+int  is_weak_digest (digest_algo_t algo);
 
 /*-- armor.c --*/
 char *make_radix64_string( const byte *data, size_t len );
@@ -447,8 +448,9 @@ int gen_desig_revoke (ctrl_t ctrl, const char *uname, strlist_t locusr);
 int revocation_reason_build_cb( PKT_signature *sig, void *opaque );
 struct revocation_reason_info *
                ask_revocation_reason( int key_rev, int cert_rev, int hint );
-struct revocation_reason_info * get_default_uid_revocation_reason(void);
-void release_revocation_reason_info( struct revocation_reason_info *reason );
+struct revocation_reason_info * get_default_uid_revocation_reason (void);
+struct revocation_reason_info * get_default_sig_revocation_reason (void);
+void release_revocation_reason_info (struct revocation_reason_info *reason);
 
 /*-- keylist.c --*/
 void public_key_list (ctrl_t ctrl, strlist_t list,
@@ -458,6 +460,7 @@ void print_subpackets_colon(PKT_signature *sig);
 void reorder_keyblock (KBNODE keyblock);
 void list_keyblock_direct (ctrl_t ctrl, kbnode_t keyblock, int secret,
                            int has_secret, int fpr, int no_validity);
+int  cmp_signodes (const void *av, const void *bv);
 void print_fingerprint (ctrl_t ctrl, estream_t fp,
                         PKT_public_key *pk, int mode);
 void print_revokers (estream_t fp, PKT_public_key *pk);
index 79ff211..762fc79 100644 (file)
@@ -618,6 +618,9 @@ print_pkenc_list (ctrl_t ctrl, struct kidlist_item *list, int failed)
         {
           log_info (_("public key decryption failed: %s\n"),
                     gpg_strerror (list->reason));
+          if (gpg_err_source (list->reason) == GPG_ERR_SOURCE_SCD
+              && gpg_err_code (list->reason) == GPG_ERR_INV_ID)
+            print_further_info ("a reason might be a card with replaced keys");
           write_status_error ("pkdecrypt_failed", list->reason);
         }
     }
index c52c67a..38fb7bd 100644 (file)
@@ -50,10 +50,10 @@ migrate_secring (ctrl_t ctrl)
   char *agent_version = NULL;
 
   secring = make_filename (gnupg_homedir (), "secring" EXTSEP_S "gpg", NULL);
-  if (access (secring, F_OK))
+  if (gnupg_access (secring, F_OK))
     goto leave; /* Does not exist or is not readable.  */
   flagfile = make_filename (gnupg_homedir (), V21_MIGRATION_FNAME, NULL);
-  if (!access (flagfile, F_OK))
+  if (!gnupg_access (flagfile, F_OK))
     goto leave; /* Does exist - fine.  */
 
   log_info ("starting migration from earlier GnuPG versions\n");
@@ -99,8 +99,8 @@ migrate_secring (ctrl_t ctrl)
   log_info ("porting secret keys from '%s' to gpg-agent\n", secring);
   if (!import_old_secring (ctrl, secring))
     {
-      FILE *fp = fopen (flagfile, "w");
-      if (!fp || fclose (fp))
+      estream_t fp = es_fopen (flagfile, "w");
+      if (!fp || es_fclose (fp))
         log_error ("error creating flag file '%s': %s\n",
                    flagfile, gpg_strerror (gpg_error_from_syserror ()));
       else
index 22ed47e..634d303 100644 (file)
@@ -102,7 +102,7 @@ register_secured_file (const char *fname)
   struct secured_file_item *sf;
 
   /* Note that we stop immediately if something goes wrong here. */
-  if (stat (fname, &buf))
+  if (gnupg_stat (fname, &buf))
     log_fatal (_("fstat of '%s' failed in %s: %s\n"), fname,
                "register_secured_file", strerror (errno));
 /*   log_debug ("registering '%s' i=%lu.%lu\n", fname, */
@@ -131,7 +131,7 @@ unregister_secured_file (const char *fname)
   struct stat buf;
   struct secured_file_item *sf, *sfprev;
 
-  if (stat (fname, &buf))
+  if (gnupg_stat (fname, &buf))
     {
       log_error (_("fstat of '%s' failed in %s: %s\n"), fname,
                  "unregister_secured_file", strerror (errno));
@@ -205,7 +205,7 @@ is_secured_filename (const char *fname)
 
   /* Note that we print out a error here and claim that a file is
      secure if something went wrong. */
-  if (stat (fname, &buf))
+  if (gnupg_stat (fname, &buf))
     {
       if (errno == ENOENT || errno == EPERM || errno == EACCES)
         return 0;
@@ -311,12 +311,11 @@ print_cipher_algo_note (cipher_algo_t algo)
 void
 print_digest_algo_note (digest_algo_t algo)
 {
-  const enum gcry_md_algos galgo = map_md_openpgp_to_gcry (algo);
-  const struct weakhash *weak;
-
   if(algo >= 100 && algo <= 110)
     {
       static int warn=0;
+      const enum gcry_md_algos galgo = map_md_openpgp_to_gcry (algo);
+
       if(!warn)
        {
          warn=1;
@@ -325,14 +324,13 @@ print_digest_algo_note (digest_algo_t algo)
                     gcry_md_algo_name (galgo));
        }
     }
-  else
-      for (weak = opt.weak_digests; weak != NULL; weak = weak->next)
-        if (weak->algo == galgo)
-          {
-            es_fflush (es_stdout);
-            log_info (_("WARNING: digest algorithm %s is deprecated\n"),
-                      gcry_md_algo_name (galgo));
-          }
+  else if (is_weak_digest (algo))
+    {
+      const enum gcry_md_algos galgo = map_md_openpgp_to_gcry (algo);
+      es_fflush (es_stdout);
+      log_info (_("WARNING: digest algorithm %s is deprecated\n"),
+                gcry_md_algo_name (galgo));
+    }
 }
 
 
@@ -341,6 +339,10 @@ print_digest_rejected_note (enum gcry_md_algos algo)
 {
   struct weakhash* weak;
   int show = 1;
+
+  if (opt.quiet)
+    return;
+
   for (weak = opt.weak_digests; weak; weak = weak->next)
     if (weak->algo == algo)
       {
@@ -366,7 +368,7 @@ print_sha1_keysig_rejected_note (void)
 {
   static int shown;
 
-  if (shown)
+  if (shown || opt.quiet)
     return;
 
   shown = 1;
@@ -919,6 +921,11 @@ pct_expando(const char *string,struct expando_args *args)
   u32 pk_keyid[2]={0,0},sk_keyid[2]={0,0};
   char *ret=NULL;
 
+  /* The parser below would return NULL for an empty string, thus we
+   * catch it here.  Also catch NULL here. */
+  if (!string || !*string)
+    return xstrdup ("");
+
   if(args->pk)
     keyid_from_pk(args->pk,pk_keyid);
 
@@ -1860,3 +1867,17 @@ additional_weak_digest (const char* digestname)
   weak->next = opt.weak_digests;
   opt.weak_digests = weak;
 }
+
+
+/* Return true if ALGO is in the list of weak digests.  */
+int
+is_weak_digest (digest_algo_t algo)
+{
+  const enum gcry_md_algos galgo = map_md_openpgp_to_gcry (algo);
+  const struct weakhash *weak;
+
+  for (weak = opt.weak_digests; weak; weak = weak->next)
+    if (weak->algo == galgo)
+      return 1;
+  return 0;
+}
index 78f4dbb..d82858f 100644 (file)
@@ -324,7 +324,7 @@ get_matching_datafile (const char *sigfilename)
 
       fname = xstrdup (sigfilename);
       fname[len-(fname[len-1]=='n'?5:4)] = 0 ;
-      if (access (fname, R_OK ))
+      if (gnupg_access (fname, R_OK ))
         {
           /* Not found or other error.  */
           xfree (fname);
@@ -367,36 +367,18 @@ open_sigfile (const char *sigfilename, progress_filter_context_t *pfx)
 }
 
 
+/* Create the directory only if the supplied directory name is the
+   same as the default one.  This way we avoid to create arbitrary
+   directories when a non-default home directory is used.  To cope
+   with HOME, we do compare only the suffix if we see that the default
+   homedir does start with a tilde.  */
 void
 try_make_homedir (const char *fname)
 {
-  const char *defhome = standard_homedir ();
-
-  /* Create the directory only if the supplied directory name is the
-     same as the default one.  This way we avoid to create arbitrary
-     directories when a non-default home directory is used.  To cope
-     with HOME, we do compare only the suffix if we see that the
-     default homedir does start with a tilde.  */
   if ( opt.dry_run || opt.no_homedir_creation )
     return;
 
-  if (
-#ifdef HAVE_W32_SYSTEM
-      ( !compare_filenames (fname, defhome) )
-#else
-      ( *defhome == '~'
-        && (strlen(fname) >= strlen (defhome+1)
-            && !strcmp(fname+strlen(fname)-strlen(defhome+1), defhome+1 ) ))
-      || (*defhome != '~'  && !compare_filenames( fname, defhome ) )
-#endif
-      )
-    {
-      if (gnupg_mkdir (fname, "-rwx"))
-        log_fatal ( _("can't create directory '%s': %s\n"),
-                    fname, strerror(errno) );
-      else if (!opt.quiet )
-        log_info ( _("directory '%s' created\n"), fname );
-    }
+  gnupg_maybe_make_homedir (fname, opt.quiet);
 }
 
 
@@ -409,7 +391,7 @@ get_openpgp_revocdir (const char *home)
   struct stat statbuf;
 
   fname = make_filename (home, GNUPG_OPENPGP_REVOC_DIR, NULL);
-  if (stat (fname, &statbuf) && errno == ENOENT)
+  if (gnupg_stat (fname, &statbuf) && errno == ENOENT)
     {
       if (gnupg_mkdir (fname, "-rwx"))
         log_error (_("can't create directory '%s': %s\n"),
index df80af8..e6837e3 100644 (file)
@@ -409,7 +409,7 @@ passphrase_to_dek (int cipher_algo, STRING2KEY *s2k,
       if (*canceled)
         {
           xfree (pw);
-         write_status( STATUS_MISSING_PASSPHRASE );
+         write_status( STATUS_CANCELED_BY_USER );
           return NULL;
         }
     }
index f9720d3..81ea7a0 100644 (file)
@@ -341,6 +341,11 @@ show_photos (ctrl_t ctrl, const struct user_attribute *attrs, int count,
        command=pct_expando(opt.photo_viewer,&args);
        if(!command)
          goto fail;
+        if (!*command)
+          {
+            xfree (command);
+            goto fail;
+          }
 
        name=xmalloc(16+strlen(EXTSEP_S)+
                     strlen(image_type_to_string(args.imagetype,0))+1);
index 5421649..bfc4f84 100644 (file)
@@ -1369,7 +1369,7 @@ build_pk_list (ctrl_t ctrl, strlist_t rcpts, PK_LIST *ret_pk_list)
    preference list, so I'm including it. -dms */
 
 int
-algo_available( preftype_t preftype, int algo, const union pref_hint *hint)
+algo_available( preftype_t preftype, int algo, const struct pref_hint *hint)
 {
   if( preftype == PREFTYPE_SYM )
     {
@@ -1395,16 +1395,26 @@ algo_available( preftype_t preftype, int algo, const union pref_hint *hint)
     {
       if (hint && hint->digest_length)
        {
-         if (hint->digest_length!=20 || opt.flags.dsa2)
+          unsigned int n = gcry_md_get_algo_dlen (algo);
+
+          if (hint->exact)
+            {
+              /* For example ECDSA requires an exact hash value so
+               * that we do not truncate.  For DSA we allow truncation
+               * and thus exact is not set.  */
+              if (hint->digest_length != n)
+                return 0;
+            }
+         else if (hint->digest_length!=20 || opt.flags.dsa2)
            {
              /* If --enable-dsa2 is set or the hash isn't 160 bits
                 (which implies DSA2), then we'll accept a hash that
                 is larger than we need.  Otherwise we won't accept
                 any hash that isn't exactly the right size. */
-             if (hint->digest_length > gcry_md_get_algo_dlen (algo))
+             if (hint->digest_length > n)
                return 0;
            }
-         else if (hint->digest_length != gcry_md_get_algo_dlen (algo))
+         else if (hint->digest_length != n)
            return 0;
        }
 
@@ -1441,7 +1451,7 @@ algo_available( preftype_t preftype, int algo, const union pref_hint *hint)
  */
 int
 select_algo_from_prefs(PK_LIST pk_list, int preftype,
-                      int request, const union pref_hint *hint)
+                      int request, const struct pref_hint *hint)
 {
   PK_LIST pkr;
   u32 bits[8];
index f9e0a42..3bc8696 100644 (file)
@@ -185,7 +185,7 @@ get_output_file (const byte *embedded_name, int embedded_namelen,
          want to port it again to riscos we should do most of the suff
          in estream.  FIXME: Consider to remove all riscos special
          cases.  */
-      fp = fopen (fname, "wb");
+      fp = gnupg_fopen (fname, "wb");
       if (!fp)
        {
          log_error (_("error creating '%s': %s\n"), fname, gpg_strerror (err));
index 3a08972..035a2e9 100644 (file)
@@ -891,6 +891,16 @@ get_default_uid_revocation_reason(void)
   return reason;
 }
 
+struct revocation_reason_info *
+get_default_sig_revocation_reason(void)
+{
+  struct revocation_reason_info *reason;
+  reason = xmalloc( sizeof *reason );
+  reason->code = 0; /* No specific reason given. */
+  reason->desc = strdup(""); /* no text */
+  return reason;
+}
+
 void
 release_revocation_reason_info( struct revocation_reason_info *reason )
 {
index e71e662..a1dfe38 100644 (file)
@@ -457,16 +457,14 @@ check_signature_end_simple (PKT_public_key *pk, PKT_signature *sig,
 {
   gcry_mpi_t result = NULL;
   int rc = 0;
-  const struct weakhash *weak;
 
   if (!opt.flags.allow_weak_digest_algos)
     {
-      for (weak = opt.weak_digests; weak; weak = weak->next)
-        if (sig->digest_algo == weak->algo)
-          {
-            print_digest_rejected_note(sig->digest_algo);
-            return GPG_ERR_DIGEST_ALGO;
-          }
+      if (is_weak_digest (sig->digest_algo))
+        {
+          print_digest_rejected_note (sig->digest_algo);
+          return GPG_ERR_DIGEST_ALGO;
+        }
     }
 
   /* For key signatures check that the key has a cert usage.  We may
index 4793dd1..18f6d20 100644 (file)
@@ -462,7 +462,12 @@ do_sign (ctrl_t ctrl, PKT_public_key *pksk, PKT_signature *sig,
 
  leave:
   if (err)
-    log_error (_("signing failed: %s\n"), gpg_strerror (err));
+    {
+      log_error (_("signing failed: %s\n"), gpg_strerror (err));
+      if (gpg_err_source (err) == GPG_ERR_SOURCE_SCD
+          && gpg_err_code (err) == GPG_ERR_INV_ID)
+        print_further_info ("a reason might be a card with replaced keys");
+    }
   else
     {
       if (opt.verbose)
@@ -583,7 +588,7 @@ hash_for (PKT_public_key *pk)
     {
       return opt.def_digest_algo;
     }
-  else if (recipient_digest_algo)
+  else if (recipient_digest_algo && !is_weak_digest (recipient_digest_algo))
     {
       return recipient_digest_algo;
     }
@@ -905,7 +910,8 @@ write_signature_packets (ctrl_t ctrl,
  * and ignore the detached mode.  Sign the file with all secret keys
  * which can be taken from LOCUSR, if this is NULL, use the default one
  * If ENCRYPTFLAG is true, use REMUSER (or ask if it is NULL) to encrypt the
- * signed data for these users.
+ * signed data for these users.  If ENCRYPTFLAG is 2 symmetric encryption
+ * is also used.
  * If OUTFILE is not NULL; this file is used for output and the function
  * does not ask for overwrite permission; output is then always
  * uncompressed, non-armored and in binary mode.
@@ -1035,17 +1041,16 @@ sign_file (ctrl_t ctrl, strlist_t filenames, int detached, strlist_t locusr,
               select_algo_from_prefs(pk_list,PREFTYPE_HASH,
                                      opt.def_digest_algo,
                                      NULL)!=opt.def_digest_algo)
-         log_info(_("WARNING: forcing digest algorithm %s (%d)"
-                    " violates recipient preferences\n"),
-                  gcry_md_algo_name (opt.def_digest_algo),
-                  opt.def_digest_algo );
+              log_info(_("WARNING: forcing digest algorithm %s (%d)"
+                         " violates recipient preferences\n"),
+                       gcry_md_algo_name (opt.def_digest_algo),
+                       opt.def_digest_algo );
          }
        else
          {
-           int algo, smartcard=0;
-           union pref_hint hint;
-
-            hint.digest_length = 0;
+           int algo;
+            int conflict = 0;
+           struct pref_hint hint = { 0 };
 
            /* Of course, if the recipient asks for something
               unreasonable (like the wrong hash for a DSA key) then
@@ -1073,32 +1078,44 @@ sign_file (ctrl_t ctrl, strlist_t filenames, int detached, strlist_t locusr,
                                         (sk_rover->pk->pkey[1]));
 
                    if (sk_rover->pk->pubkey_algo == PUBKEY_ALGO_ECDSA)
-                     temp_hashlen = ecdsa_qbits_from_Q (temp_hashlen);
-                   temp_hashlen = (temp_hashlen+7)/8;
+                      {
+                        temp_hashlen = ecdsa_qbits_from_Q (temp_hashlen);
+                        if (!temp_hashlen)
+                          conflict = 1;  /* Better don't use the prefs. */
+                        temp_hashlen = (temp_hashlen+7)/8;
+                        /* Fixup for that funny nistp521 (yes, 521)
+                         * were we need to use a 512 bit hash algo.  */
+                        if (temp_hashlen == 66)
+                          temp_hashlen = 64;
+                      }
+                    else
+                      temp_hashlen = (temp_hashlen+7)/8;
 
                    /* Pick a hash that is large enough for our
-                      largest q */
-
-                   if (hint.digest_length<temp_hashlen)
-                     hint.digest_length=temp_hashlen;
+                      largest q or matches our Q but if tehreare
+                      several of them we run into a conflict and
+                      don't use the preferences.  */
+
+                   if (hint.digest_length < temp_hashlen)
+                      {
+                        if (sk_rover->pk->pubkey_algo == PUBKEY_ALGO_ECDSA)
+                          {
+                            if (hint.exact)
+                              conflict = 1;
+                            hint.exact = 1;
+                          }
+                        hint.digest_length = temp_hashlen;
+                      }
                  }
-                /* FIXME: need to check gpg-agent for this. */
-               /* else if (sk_rover->pk->is_protected */
-                /*          && sk_rover->pk->protect.s2k.mode == 1002) */
-               /*   smartcard = 1;  */
              }
 
-           /* Current smartcards only do 160-bit hashes.  If we have
-              to have a >160-bit hash, then we can't use the
-              recipient prefs as we'd need both =160 and >160 at the
-              same time and recipient prefs currently require a
-              single hash for all signatures.  All this may well have
-              to change as the cards add algorithms. */
-
-           if (!smartcard || (smartcard && hint.digest_length==20))
-             if ( (algo=
-                   select_algo_from_prefs(pk_list,PREFTYPE_HASH,-1,&hint)) > 0)
-               recipient_digest_algo=algo;
+           if (!conflict
+                && (algo = select_algo_from_prefs (pk_list,PREFTYPE_HASH,
+                                                   -1,&hint)) > 0)
+                {
+                  /* Note that we later check that the algo is not weak.  */
+                  recipient_digest_algo = algo;
+                }
          }
       }
 
index 8f75306..9bae2ed 100644 (file)
@@ -681,7 +681,7 @@ tdbio_set_dbname (ctrl_t ctrl, const char *new_dbname,
    * trustdb.gpg.  This check is not required in theory, but it helps
    * in practice avoiding costly operations of preparing and taking
    * the lock.  */
-  if (!stat (fname, &statbuf) && statbuf.st_size > 0)
+  if (!gnupg_stat (fname, &statbuf) && statbuf.st_size > 0)
     {
       /* OK, we have the valid trustdb.gpg already.  */
       return 0;
@@ -711,19 +711,21 @@ tdbio_set_dbname (ctrl_t ctrl, const char *new_dbname,
   log_assert (p);
   save_slash = *p;
   *p = 0;
-  if (access (fname, F_OK))
+  if (gnupg_access (fname, F_OK))
     {
       try_make_homedir (fname);
-      if (access (fname, F_OK))
+      if (gnupg_access (fname, F_OK))
         log_fatal (_("%s: directory does not exist!\n"), fname);
     }
   *p = save_slash;
 
   take_write_lock ();
 
-  if (access (fname, R_OK) || stat (fname, &statbuf) || statbuf.st_size == 0)
+  if (gnupg_access (fname, R_OK)
+      || gnupg_stat (fname, &statbuf)
+      || statbuf.st_size == 0)
     {
-      FILE *fp;
+      estream_t fp;
       TRUSTREC rec;
       int rc;
       mode_t oldmask;
@@ -745,13 +747,13 @@ tdbio_set_dbname (ctrl_t ctrl, const char *new_dbname,
           gpg_err_set_errno (EPERM);
         }
       else
-        fp = fopen (fname, "wb");
+        fp = es_fopen (fname, "wb");
       umask(oldmask);
       if (!fp)
         log_fatal (_("can't create '%s': %s\n"), fname, strerror (errno));
-      fclose (fp);
+      es_fclose (fp);
 
-      db_fd = open (db_name, O_RDWR | MY_O_BINARY);
+      db_fd = gnupg_open (db_name, O_RDWR | MY_O_BINARY, 0);
       if (db_fd == -1)
         log_fatal (_("can't open '%s': %s\n"), db_name, strerror (errno));
 
@@ -811,7 +813,7 @@ open_db ()
                  (int)prevrc, (int)GetLastError ());
   }
 #else /*!HAVE_W32CE_SYSTEM*/
-  db_fd = open (db_name, O_RDWR | MY_O_BINARY );
+  db_fd = gnupg_open (db_name, O_RDWR | MY_O_BINARY, 0);
   if (db_fd == -1 && (errno == EACCES
 #ifdef EROFS
                       || errno == EROFS
@@ -819,7 +821,7 @@ open_db ()
                       )
       ) {
       /* Take care of read-only trustdbs.  */
-      db_fd = open (db_name, O_RDONLY | MY_O_BINARY );
+      db_fd = gnupg_open (db_name, O_RDONLY | MY_O_BINARY, 0);
       if (db_fd != -1 && !opt.quiet)
           log_info (_("Note: trustdb not writable\n"));
   }
index 96666cf..3e68900 100644 (file)
@@ -163,8 +163,8 @@ copy_clearsig_text( IOBUF out, IOBUF inp, gcry_md_hd_t md,
                    int escape_dash, int escape_from)
 {
     unsigned int maxlen;
-    byte *buffer = NULL;    /* malloced buffer */
-    unsigned int bufsize;   /* and size of this buffer */
+    byte *buffer = NULL;      /* malloced buffer */
+    unsigned int bufsize = 0; /* and size of this buffer */
     unsigned int n;
     int truncated = 0;
     int pending_lf = 0;
index 63f941e..9cdcfaa 100644 (file)
@@ -197,7 +197,7 @@ begin_transaction (ctrl_t ctrl, int only_batch)
       /* Check if another process wants to run.  (We just ignore any
        * stat failure.  A waiter might have to wait a bit longer, but
        * otherwise there should be no impact.)  */
-      if (stat (dbs->want_lock_file, &statbuf) == 0
+      if (gnupg_stat (dbs->want_lock_file, &statbuf) == 0
           && statbuf.st_ctime != dbs->want_lock_file_ctime)
         {
           end_transaction (ctrl, 2);
@@ -237,7 +237,7 @@ begin_transaction (ctrl_t ctrl, int only_batch)
       dbs->in_batch_transaction = 1;
       dbs->batch_update_started = gnupg_get_time ();
 
-      if (stat (dbs->want_lock_file, &statbuf) == 0)
+      if (gnupg_stat (dbs->want_lock_file, &statbuf) == 0)
         dbs->want_lock_file_ctime = statbuf.st_ctime;
     }
 
index 835c66b..a0a2675 100644 (file)
@@ -27,6 +27,7 @@
 
 #include "g13.h"
 #include "../common/i18n.h"
+#include "../common/sysutils.h"
 #include "keyblob.h"
 #include "backend.h"
 #include "be-encfs.h"
@@ -116,7 +117,7 @@ be_take_lock_for_create (ctrl_t ctrl, const char *fname, dotlock_t *r_lock)
 
   /* A quick check to see that no container with that name already
      exists.  */
-  if (!access (fname, F_OK))
+  if (!gnupg_access (fname, F_OK))
     {
       err = gpg_error (GPG_ERR_EEXIST);
       goto leave;
@@ -138,7 +139,7 @@ be_take_lock_for_create (ctrl_t ctrl, const char *fname, dotlock_t *r_lock)
     }
 
   /* Check again that the file does not exist.  */
-  err = stat (fname, &sb)? 0 : gpg_error (GPG_ERR_EEXIST);
+  err = gnupg_stat (fname, &sb)? 0 : gpg_error (GPG_ERR_EEXIST);
 
  leave:
   if (!err)
index d773dfa..ac4d130 100644 (file)
@@ -33,6 +33,7 @@
 #include "keyblob.h"
 #include "backend.h"
 #include "g13tuple.h"
+#include "../common/sysutils.h"
 #include "../common/call-gpg.h"
 
 /* Create a new blob with all the session keys and other meta
@@ -250,7 +251,7 @@ g13_create_container (ctrl_t ctrl, const char *filename)
     {
       struct stat sb;
 
-      if (!stat (detachedname, &sb))
+      if (!gnupg_stat (detachedname, &sb))
         {
           err = gpg_error (GPG_ERR_EEXIST);
           goto leave;
index 4ce74ee..e6755d5 100644 (file)
@@ -325,7 +325,7 @@ main ( int argc, char **argv)
   if (configname)
     {
       configlineno = 0;
-      configfp = fopen (configname, "r");
+      configfp = gnupg_fopen (configname, "r");
       if (!configfp)
         {
           if (default_config)
@@ -588,7 +588,7 @@ g13_syshelp_i_know_what_i_am_doing (void)
   char *fname;
 
   fname = make_filename (gnupg_sysconfdir (), yesfile, NULL);
-  if (access (fname, F_OK))
+  if (gnupg_access (fname, F_OK))
     {
       log_info ("*******************************************************\n");
       log_info ("* The G13 support for DM-Crypt is new and not matured.\n");
index 6265b9f..c4cd34b 100644 (file)
--- a/g13/g13.c
+++ b/g13/g13.c
@@ -454,7 +454,7 @@ main ( int argc, char **argv)
   if (configname)
     {
       configlineno = 0;
-      configfp = fopen (configname, "r");
+      configfp = gnupg_fopen (configname, "r");
       if (!configfp)
         {
           if (default_config)
index dc415b1..45b6080 100644 (file)
@@ -76,7 +76,7 @@ g13_mount_container (ctrl_t ctrl, const char *filename, const char *mountpoint)
   else
     {
       /* A quick check to see whether we can the container exists.  */
-      if (access (filename, R_OK))
+      if (gnupg_access (filename, R_OK))
         return gpg_error_from_syserror ();
     }
 
@@ -121,7 +121,7 @@ g13_mount_container (ctrl_t ctrl, const char *filename, const char *mountpoint)
     {
       struct stat sb;
 
-      if (stat (filename, &sb))
+      if (gnupg_stat (filename, &sb))
         {
           err = gpg_error_from_syserror ();
           goto leave;
index 09c4d96..6f7173e 100644 (file)
@@ -41,6 +41,7 @@
 #include "../common/i18n.h"
 #include "g13tuple.h"
 #include "../common/exectool.h"
+#include "../common/sysutils.h"
 #include "keyblob.h"
 
 /* The standard disk block size (logical).  */
@@ -94,7 +95,7 @@ check_blockdev (const char *devname, int expect_busy)
   char **fields = NULL;
   int lno, count;
 
-  if (stat (devname, &sb))
+  if (gnupg_stat (devname, &sb))
     {
       err = gpg_error_from_syserror ();
       log_error ("error stating '%s': %s\n", devname, gpg_strerror (err));
index 0aa20f0..44c52dd 100644 (file)
@@ -28,6 +28,7 @@
 
 #include "g13.h"
 #include "../common/i18n.h"
+#include "../common/sysutils.h"
 #include "suspend.h"
 
 #include "keyblob.h"
@@ -45,7 +46,7 @@ g13_suspend_container (ctrl_t ctrl, const char *filename)
   int needs_syshelp;
 
   /* A quick check to see whether the container exists.  */
-  if (access (filename, R_OK))
+  if (gnupg_access (filename, R_OK))
     return gpg_error_from_syserror ();
 
   /* Decide whether we need to use the g13-syshelp because we can't
@@ -80,7 +81,7 @@ g13_resume_container (ctrl_t ctrl, const char *filename)
   char *mountpoint_buffer = NULL;
 
   /* A quick check to see whether the container exists.  */
-  if (access (filename, R_OK))
+  if (gnupg_access (filename, R_OK))
     return gpg_error_from_syserror ();
 
   /* Decide whether we need to use the g13-syshelp because we can't
index f156122..ec5a43b 100644 (file)
@@ -272,7 +272,7 @@ read_file (const char *fname, size_t *r_length)
     {
       struct stat st;
 
-      fp = fopen (fname, "rb");
+      fp = gnupg_fopen (fname, "rb");
       if (!fp)
         {
           log_error ("can't open '%s': %s\n", fname, strerror (errno));
@@ -418,7 +418,7 @@ import_openpgp (const char *filename, int dryrun)
             }
           else
             {
-              fflush (stdout);
+              es_fflush (es_stdout);
               log_info ("%s: failed to parse OpenPGP keyblock: %s\n",
                         filename, gpg_strerror (err));
             }
@@ -432,17 +432,17 @@ import_openpgp (const char *filename, int dryrun)
               err = _keybox_create_openpgp_blob (&blob, &info, p, nparsed, 0);
               if (err)
                 {
-                  fflush (stdout);
+                  es_fflush (es_stdout);
                   log_error ("%s: failed to create OpenPGP keyblock: %s\n",
                              filename, gpg_strerror (err));
                 }
               else
                 {
-                  err = _keybox_write_blob (blob, stdout);
+                  err = _keybox_write_blob (blob, es_stdout, NULL);
                   _keybox_release_blob (blob);
                   if (err)
                     {
-                      fflush (stdout);
+                      es_fflush (es_stdout);
                       log_error ("%s: failed to write OpenPGP keyblock: %s\n",
                                  filename, gpg_strerror (err));
                     }
index d2b79ba..2751b4b 100644 (file)
@@ -80,7 +80,7 @@ struct keybox_found_s
 struct keybox_handle {
   KB_NAME kb;
   int secret;             /* this is for a secret keybox */
-  FILE *fp;
+  estream_t fp;
   int eof;
   int error;
   int ephemeral;
@@ -169,8 +169,8 @@ void _keybox_destroy_openpgp_info (keybox_openpgp_info_t info);
 
 
 /*-- keybox-file.c --*/
-int _keybox_read_blob (KEYBOXBLOB *r_blob, FILE *fp, int *skipped_deleted);
-int _keybox_write_blob (KEYBOXBLOB blob, FILE *fp);
+int _keybox_read_blob (KEYBOXBLOB *r_blob, estream_t fp, int *skipped_deleted);
+int _keybox_write_blob (KEYBOXBLOB blob, estream_t fp, FILE *outfp);
 
 /*-- keybox-search.c --*/
 gpg_err_code_t _keybox_get_flag_location (const unsigned char *buffer,
index 3bafbaa..3e66b72 100644 (file)
@@ -84,6 +84,7 @@ print_checksum (const byte *buffer, size_t length, size_t unhashed, FILE *fp)
     }
   else
     hashlen = 20;
+
   if (length < 5+unhashed)
     {
       fputs ("[blob too short for a checksum]\n", fp);
@@ -170,6 +171,8 @@ _keybox_dump_blob (KEYBOXBLOB blob, FILE *fp)
   ulong nserial;
   ulong unhashed;
   const byte *p;
+  const byte *pend;
+  int is_fpr32;  /* blob version 2 */
 
   buffer = _keybox_get_blob_image (blob, &length);
 
@@ -207,7 +210,9 @@ _keybox_dump_blob (KEYBOXBLOB blob, FILE *fp)
       fprintf (fp, "[can't dump this blob type]\n");
       return 0;
     }
+  /* Here we have either BLOGTYPE_X509 or BLOBTYPE_OPENPGP */
   fprintf (fp, "Version: %d\n", buffer[5]);
+  is_fpr32 = buffer[5] == 2;
 
   if (length < 40)
     {
@@ -247,7 +252,18 @@ _keybox_dump_blob (KEYBOXBLOB blob, FILE *fp)
       || rawdata_off+rawdata_len > length
       || rawdata_len + 4 > length
       || rawdata_off+rawdata_len + 4 > length)
-    fprintf (fp, "[Error: raw data larger than blob]\n");
+    {
+      fprintf (fp, "[Error: raw data larger than blob]\n");
+      return -1;
+    }
+
+  if (rawdata_off > length
+      || rawdata_len > length
+      || rawdata_off + rawdata_len > length)
+    {
+      fprintf (fp, "[Error: unhashed data larger than blob]\n");
+      return -1;
+    }
   unhashed = length - rawdata_off - rawdata_len;
   fprintf (fp, "Unhashed: %lu\n", unhashed);
 
@@ -260,26 +276,66 @@ _keybox_dump_blob (KEYBOXBLOB blob, FILE *fp)
 
   keyinfolen = get16 (buffer + 18 );
   fprintf (fp, "Key-Info-Length: %lu\n", keyinfolen);
-  /* fixme: check bounds */
   p = buffer + 20;
+  pend = buffer + length;
   for (n=0; n < nkeys; n++, p += keyinfolen)
     {
       ulong kidoff, kflags;
 
+      if (p + keyinfolen >= pend)
+        {
+          fprintf (fp, "[Error: key data larger than blob]\n");
+          return -1;
+        }
+
       fprintf (fp, "Key-Fpr[%lu]: ", n );
-      for (i=0; i < 20; i++ )
-        fprintf (fp, "%02X", p[i]);
-      kidoff = get32 (p + 20);
-      fprintf (fp, "\nKey-Kid-Off[%lu]: %lu\n", n, kidoff );
-      fprintf (fp, "Key-Kid[%lu]: ", n );
-      /* fixme: check bounds */
-      for (i=0; i < 8; i++ )
-        fprintf (fp, "%02X", buffer[kidoff+i] );
-      kflags = get16 (p + 24 );
+      if (is_fpr32)
+        {
+          if (p + 32 + 2 >= pend)
+            {
+              fprintf (fp, "[Error: fingerprint data larger than blob]\n");
+              return -1;
+            }
+          kflags = get16 (p + 32 );
+          for (i=0; i < ((kflags & 0x80)?32:20); i++ )
+            fprintf (fp, "%02X", p[i]);
+        }
+      else
+        {
+          if (p + 20 + 4 >= pend)
+            {
+              fprintf (fp, "[Error: fingerprint data larger than blob]\n");
+              return -1;
+            }
+          for (i=0; i < 20; i++ )
+            fprintf (fp, "%02X", p[i]);
+          kidoff = get32 (p + 20);
+          fprintf (fp, "\nKey-Kid-Off[%lu]: %lu\n", n, kidoff );
+          fprintf (fp, "Key-Kid[%lu]: ", n );
+
+          if (p + kidoff + 8 >= pend)
+            {
+              fprintf (fp, "[Error: fingerprint data larger than blob]\n");
+              return -1;
+            }
+          for (i=0; i < 8; i++ )
+            fprintf (fp, "%02X", buffer[kidoff+i] );
+          if (p + 24 >= pend)
+            {
+              fprintf (fp, "[Error: fingerprint data larger than blob]\n");
+              return -1;
+            }
+          kflags = get16 (p + 24);
+        }
       fprintf( fp, "\nKey-Flags[%lu]: %04lX\n", n, kflags);
     }
 
   /* serial number */
+  if (p + 2 >= pend)
+    {
+      fprintf (fp, "[Error: data larger than blob]\n");
+      return -1;
+    }
   fputs ("Serial-No: ", fp);
   nserial = get16 (p);
   p += 2;
@@ -287,22 +343,37 @@ _keybox_dump_blob (KEYBOXBLOB blob, FILE *fp)
     fputs ("none", fp);
   else
     {
+      if (p + nserial >= pend)
+        {
+          fprintf (fp, "[Error: data larger than blob]\n");
+          return -1;
+        }
       for (; nserial; nserial--, p++)
         fprintf (fp, "%02X", *p);
     }
   putc ('\n', fp);
 
   /* user IDs */
+  if (p + 4 >= pend)
+    {
+      fprintf (fp, "[Error: data larger than blob]\n");
+      return -1;
+    }
   nuids = get16 (p);
   fprintf (fp, "Uid-Count: %lu\n", nuids );
   uidinfolen = get16  (p + 2);
   fprintf (fp, "Uid-Info-Length: %lu\n", uidinfolen);
-  /* fixme: check bounds */
   p += 4;
   for (n=0; n < nuids; n++, p += uidinfolen)
     {
       ulong uidoff, uidlen, uflags;
 
+      if (p + uidinfolen >= pend || uidinfolen < 8)
+        {
+          fprintf (fp, "[Error: data larger than blob]\n");
+          return -1;
+        }
+
       uidoff = get32( p );
       uidlen = get32( p+4 );
       if (type == KEYBOX_BLOBTYPE_X509 && !n)
@@ -323,8 +394,21 @@ _keybox_dump_blob (KEYBOXBLOB blob, FILE *fp)
           fprintf (fp, "Uid-Len[%lu]: %lu\n", n, uidlen );
           fprintf (fp, "Uid[%lu]: \"", n );
         }
+
+      if (uidoff + uidlen > length
+          || uidoff + uidlen < uidoff
+          || uidoff + uidlen < uidlen)
+        {
+          fprintf (fp, "[Error: data larger than blob]\n");
+          return -1;
+        }
       print_string (fp, buffer+uidoff, uidlen, '\"');
       fputs ("\"\n", fp);
+      if (p + 8 + 2 + 1 >= pend)
+        {
+          fprintf (fp, "[Error: data larger than blob]\n");
+          return -1;
+        }
       uflags = get16 (p + 8);
       if (type == KEYBOX_BLOBTYPE_X509 && !n)
         {
@@ -343,11 +427,15 @@ _keybox_dump_blob (KEYBOXBLOB blob, FILE *fp)
         }
     }
 
+  if (p + 2 + 2 >= pend)
+    {
+      fprintf (fp, "[Error: data larger than blob]\n");
+      return -1;
+    }
   nsigs = get16 (p);
   fprintf (fp, "Sig-Count: %lu\n", nsigs );
   siginfolen = get16 (p + 2);
   fprintf (fp, "Sig-Info-Length: %lu\n", siginfolen );
-  /* fixme: check bounds  */
   p += 4;
   {
     int in_range = 0;
@@ -357,6 +445,11 @@ _keybox_dump_blob (KEYBOXBLOB blob, FILE *fp)
       {
         ulong sflags;
 
+        if (p + siginfolen >= pend || siginfolen < 4)
+          {
+            fprintf (fp, "[Error: data larger than blob]\n");
+            return -1;
+          }
         sflags = get32 (p);
         if (!in_range && !sflags)
           {
@@ -390,6 +483,12 @@ _keybox_dump_blob (KEYBOXBLOB blob, FILE *fp)
     if (in_range)
       fprintf (fp, "Sig-Expire[%lu-%lu]: [not checked]\n", first, n-1);
   }
+
+  if (p + 16 >= pend)
+    {
+      fprintf (fp, "[Error: data larger than blob]\n");
+      return -1;
+    }
   fprintf (fp, "Ownertrust: %d\n", p[0] );
   fprintf (fp, "All-Validity: %d\n", p[1] );
   p += 4;
@@ -402,6 +501,12 @@ _keybox_dump_blob (KEYBOXBLOB blob, FILE *fp)
   n = get32 (p );
   p += 4;
   fprintf (fp, "Created-At: %lu\n", n );
+
+  if (p + 4 >= pend)
+    {
+      fprintf (fp, "[Error: data larger than blob]\n");
+      return -1;
+    }
   n = get32 (p );
   fprintf (fp, "Reserved-Space: %lu\n", n );
 
@@ -542,18 +647,18 @@ update_stats (KEYBOXBLOB blob, struct file_stats_s *s)
 
 
 \f
-static FILE *
+static estream_t
 open_file (const char **filename, FILE *outfp)
 {
-  FILE *fp;
+  estream_t fp;
 
   if (!*filename)
     {
       *filename = "-";
-      fp = stdin;
+      fp = es_stdin;
     }
   else
-    fp = fopen (*filename, "rb");
+    fp = es_fopen (*filename, "rb");
   if (!fp)
     {
       int save_errno = errno;
@@ -568,7 +673,7 @@ open_file (const char **filename, FILE *outfp)
 int
 _keybox_dump_file (const char *filename, int stats_only, FILE *outfp)
 {
-  FILE *fp;
+  estream_t fp;
   KEYBOXBLOB blob;
   int rc;
   unsigned long count = 0;
@@ -621,8 +726,8 @@ _keybox_dump_file (const char *filename, int stats_only, FILE *outfp)
   if (rc)
     fprintf (outfp, "# error reading '%s': %s\n", filename, gpg_strerror (rc));
 
-  if (fp != stdin)
-    fclose (fp);
+  if (fp != es_stdin)
+    es_fclose (fp);
 
   if (stats_only)
     {
@@ -682,7 +787,7 @@ cmp_dupitems (const void *arg_a, const void *arg_b)
 int
 _keybox_dump_find_dups (const char *filename, int print_them, FILE *outfp)
 {
-  FILE *fp;
+  estream_t fp;
   KEYBOXBLOB blob;
   int rc;
   unsigned long recno = 0;
@@ -744,8 +849,8 @@ _keybox_dump_find_dups (const char *filename, int print_them, FILE *outfp)
     rc = 0;
   if (rc)
     fprintf (outfp, "error reading '%s': %s\n", filename, gpg_strerror (rc));
-  if (fp != stdin)
-    fclose (fp);
+  if (fp != es_stdin)
+    es_fclose (fp);
 
   qsort (dupitems, dupitems_count, sizeof *dupitems, cmp_dupitems);
 
@@ -775,7 +880,7 @@ int
 _keybox_dump_cut_records (const char *filename, unsigned long from,
                           unsigned long to, FILE *outfp)
 {
-  FILE *fp;
+  estream_t fp;
   KEYBOXBLOB blob;
   int rc;
   unsigned long recno = 0;
@@ -789,7 +894,7 @@ _keybox_dump_cut_records (const char *filename, unsigned long from,
         break; /* Ready.  */
       if (recno >= from)
         {
-          if ((rc = _keybox_write_blob (blob, outfp)))
+          if ((rc = _keybox_write_blob (blob, NULL, outfp)))
             {
               fprintf (stderr, "error writing output: %s\n",
                        gpg_strerror (rc));
@@ -804,7 +909,7 @@ _keybox_dump_cut_records (const char *filename, unsigned long from,
   if (rc)
     fprintf (stderr, "error reading '%s': %s\n", filename, gpg_strerror (rc));
  leave:
-  if (fp != stdin)
-    fclose (fp);
+  if (fp != es_stdin)
+    es_fclose (fp);
   return rc;
 }
index 046e321..c36f5be 100644 (file)
@@ -48,7 +48,7 @@ ftello (FILE *stream)
 /* Read a block at the current position and return it in R_BLOB.
    R_BLOB may be NULL to simply skip the current block.  */
 int
-_keybox_read_blob (KEYBOXBLOB *r_blob, FILE *fp, int *skipped_deleted)
+_keybox_read_blob (KEYBOXBLOB *r_blob, estream_t fp, int *skipped_deleted)
 {
   unsigned char *image;
   size_t imagelen = 0;
@@ -61,19 +61,19 @@ _keybox_read_blob (KEYBOXBLOB *r_blob, FILE *fp, int *skipped_deleted)
  again:
   if (r_blob)
     *r_blob = NULL;
-  off = ftello (fp);
+  off = es_ftello (fp);
   if (off == (off_t)-1)
     return gpg_error_from_syserror ();
 
-  if ((c1 = getc (fp)) == EOF
-      || (c2 = getc (fp)) == EOF
-      || (c3 = getc (fp)) == EOF
-      || (c4 = getc (fp)) == EOF
-      || (type = getc (fp)) == EOF)
+  if ((c1 = es_getc (fp)) == EOF
+      || (c2 = es_getc (fp)) == EOF
+      || (c3 = es_getc (fp)) == EOF
+      || (c4 = es_getc (fp)) == EOF
+      || (type = es_getc (fp)) == EOF)
     {
-      if ( c1 == EOF && !ferror (fp) )
+      if ( c1 == EOF && !es_ferror (fp) )
         return -1; /* eof */
-      if (!ferror (fp))
+      if (!es_ferror (fp))
         return gpg_error (GPG_ERR_TOO_SHORT);
       return gpg_error_from_syserror ();
     }
@@ -85,7 +85,7 @@ _keybox_read_blob (KEYBOXBLOB *r_blob, FILE *fp, int *skipped_deleted)
   if (!type)
     {
       /* Special treatment for empty blobs. */
-      if (fseek (fp, imagelen-5, SEEK_CUR))
+      if (es_fseek (fp, imagelen-5, SEEK_CUR))
         return gpg_error_from_syserror ();
       if (skipped_deleted)
         *skipped_deleted = 1;
@@ -96,7 +96,7 @@ _keybox_read_blob (KEYBOXBLOB *r_blob, FILE *fp, int *skipped_deleted)
     {
       /* Seek forward so that the caller may choose to ignore this
          record.  */
-      if (fseek (fp, imagelen-5, SEEK_CUR))
+      if (es_fseek (fp, imagelen-5, SEEK_CUR))
         return gpg_error_from_syserror ();
       return gpg_error (GPG_ERR_TOO_LARGE);
     }
@@ -104,7 +104,7 @@ _keybox_read_blob (KEYBOXBLOB *r_blob, FILE *fp, int *skipped_deleted)
   if (!r_blob)
     {
       /* This blob shall be skipped.  */
-      if (fseek (fp, imagelen-5, SEEK_CUR))
+      if (es_fseek (fp, imagelen-5, SEEK_CUR))
         return gpg_error_from_syserror ();
       return 0;
     }
@@ -114,7 +114,7 @@ _keybox_read_blob (KEYBOXBLOB *r_blob, FILE *fp, int *skipped_deleted)
     return gpg_error_from_syserror ();
 
   image[0] = c1; image[1] = c2; image[2] = c3; image[3] = c4; image[4] = type;
-  if (fread (image+5, imagelen-5, 1, fp) != 1)
+  if (es_fread (image+5, imagelen-5, 1, fp) != 1)
     {
       gpg_error_t tmperr = gpg_error_from_syserror ();
       xfree (image);
@@ -130,7 +130,7 @@ _keybox_read_blob (KEYBOXBLOB *r_blob, FILE *fp, int *skipped_deleted)
 
 /* Write the block to the current file position */
 int
-_keybox_write_blob (KEYBOXBLOB blob, FILE *fp)
+_keybox_write_blob (KEYBOXBLOB blob, estream_t fp, FILE *outfp)
 {
   const unsigned char *image;
   size_t length;
@@ -140,15 +140,24 @@ _keybox_write_blob (KEYBOXBLOB blob, FILE *fp)
   if (length > IMAGELEN_LIMIT)
     return gpg_error (GPG_ERR_TOO_LARGE);
 
-  if (fwrite (image, length, 1, fp) != 1)
-    return gpg_error_from_syserror ();
+  if (fp)
+    {
+      if (es_fwrite (image, length, 1, fp) != 1)
+        return gpg_error_from_syserror ();
+    }
+  else
+    {
+      if (fwrite (image, length, 1, outfp) != 1)
+        return gpg_error_from_syserror ();
+    }
+
   return 0;
 }
 
 
 /* Write a fresh header type blob. */
 int
-_keybox_write_header_blob (FILE *fp, int for_openpgp)
+_keybox_write_header_blob (estream_t fp, int for_openpgp)
 {
   unsigned char image[32];
   u32 val;
@@ -174,7 +183,8 @@ _keybox_write_header_blob (FILE *fp, int for_openpgp)
   image[20+2] = (val >>  8);
   image[20+3] = (val      );
 
-  if (fwrite (image, 32, 1, fp) != 1)
+  if (es_fwrite (image, 32, 1, fp) != 1)
     return gpg_error_from_syserror ();
+
   return 0;
 }
index e6c3ad2..6cabaea 100644 (file)
@@ -25,6 +25,7 @@
 #include <assert.h>
 
 #include "keybox-defs.h"
+#include "../common/sysutils.h"
 #include "../common/mischelp.h"
 
 static KB_NAME kb_names;
@@ -80,7 +81,7 @@ keybox_is_writable (void *token)
 {
   KB_NAME r = token;
 
-  return r? !access (r->fname, W_OK) : 0;
+  return r? !gnupg_access (r->fname, W_OK) : 0;
 }
 
 
@@ -179,7 +180,7 @@ keybox_release (KEYBOX_HANDLE hd)
   _keybox_release_blob (hd->saved_found.blob);
   if (hd->fp)
     {
-      fclose (hd->fp);
+      es_fclose (hd->fp);
       hd->fp = NULL;
     }
   xfree (hd->word_match.name);
@@ -252,11 +253,11 @@ _keybox_close_file (KEYBOX_HANDLE hd)
       {
         if (roverhd->fp)
           {
-            fclose (roverhd->fp);
+            es_fclose (roverhd->fp);
             roverhd->fp = NULL;
           }
       }
-  assert (!hd->fp);
+  log_assert (!hd->fp);
 }
 
 
index c07fe81..53ed66b 100644 (file)
@@ -782,7 +782,7 @@ static gpg_error_t
 open_file (KEYBOX_HANDLE hd)
 {
 
-  hd->fp = fopen (hd->kb->fname, "rb");
+  hd->fp = es_fopen (hd->kb->fname, "rb");
   if (!hd->fp)
     {
       hd->error = gpg_error_from_syserror ();
@@ -814,11 +814,11 @@ keybox_search_reset (KEYBOX_HANDLE hd)
 
   if (hd->fp)
     {
-      if (fseeko (hd->fp, 0, SEEK_SET))
+      if (es_fseeko (hd->fp, 0, SEEK_SET))
         {
           /* Ooops.  Seek did not work.  Close so that the search will
            * open the file again.  */
-          fclose (hd->fp);
+          es_fclose (hd->fp);
           hd->fp = NULL;
         }
     }
@@ -909,7 +909,7 @@ keybox_search (KEYBOX_HANDLE hd, KEYBOX_SEARCH_DESC *desc, size_t ndesc,
            * returned a blob which also was not the first one.  We now
            * need to skip over that blob and hope that the file has
            * not changed.  */
-          if (fseeko (hd->fp, lastfoundoff, SEEK_SET))
+          if (es_fseeko (hd->fp, lastfoundoff, SEEK_SET))
             {
               rc = gpg_error_from_syserror ();
               log_debug ("%s: seeking to last found offset failed: %s\n",
@@ -1285,7 +1285,7 @@ keybox_offset (KEYBOX_HANDLE hd)
 {
   if (!hd->fp)
     return 0;
-  return ftello (hd->fp);
+  return es_ftello (hd->fp);
 }
 
 gpg_error_t
@@ -1310,7 +1310,7 @@ keybox_seek (KEYBOX_HANDLE hd, off_t offset)
         return err;
     }
 
-  err = fseeko (hd->fp, offset, SEEK_SET);
+  err = es_fseeko (hd->fp, offset, SEEK_SET);
   hd->error = gpg_error_from_errno (err);
 
   return hd->error;
index e25596b..ddda52a 100644 (file)
@@ -71,14 +71,14 @@ fseeko (FILE * stream, off_t newpos, int whence)
 
 static int
 create_tmp_file (const char *template,
-                 char **r_bakfname, char **r_tmpfname, FILE **r_fp)
+                 char **r_bakfname, char **r_tmpfname, estream_t *r_fp)
 {
   gpg_error_t err;
 
   err = keybox_tmp_names (template, 0, r_bakfname, r_tmpfname);
   if (!err)
     {
-      *r_fp = fopen (*r_tmpfname, "wb");
+      *r_fp = es_fopen (*r_tmpfname, "wb");
       if (!*r_fp)
         {
           err = gpg_error_from_syserror ();
@@ -161,8 +161,9 @@ static int
 blob_filecopy (int mode, const char *fname, KEYBOXBLOB blob,
                int secret, int for_openpgp, off_t start_offset)
 {
-  FILE *fp, *newfp;
-  int rc=0;
+  gpg_err_code_t ec;
+  estream_t fp, newfp;
+  int rc = 0;
   char *bakfname = NULL;
   char *tmpfname = NULL;
   char buffer[4096];  /* (Must be at least 32 bytes) */
@@ -170,33 +171,33 @@ blob_filecopy (int mode, const char *fname, KEYBOXBLOB blob,
 
   /* Open the source file. Because we do a rename, we have to check the
      permissions of the file */
-  if (access (fname, W_OK))
-    return gpg_error_from_syserror ();
+  if ((ec = gnupg_access (fname, W_OK)))
+    return gpg_error (ec);
 
-  fp = fopen (fname, "rb");
+  fp = es_fopen (fname, "rb");
   if (mode == FILECOPY_INSERT && !fp && errno == ENOENT)
     {
       /* Insert mode but file does not exist:
          Create a new keybox file. */
-      newfp = fopen (fname, "wb");
+      newfp = es_fopen (fname, "wb");
       if (!newfp )
         return gpg_error_from_syserror ();
 
       rc = _keybox_write_header_blob (newfp, for_openpgp);
       if (rc)
         {
-          fclose (newfp);
+          es_fclose (newfp);
           return rc;
         }
 
-      rc = _keybox_write_blob (blob, newfp);
+      rc = _keybox_write_blob (blob, newfp, NULL);
       if (rc)
         {
-          fclose (newfp);
+          es_fclose (newfp);
           return rc;
         }
 
-      if ( fclose (newfp) )
+      if ( es_fclose (newfp) )
         return gpg_error_from_syserror ();
 
 /*        if (chmod( fname, S_IRUSR | S_IWUSR )) */
@@ -217,7 +218,7 @@ blob_filecopy (int mode, const char *fname, KEYBOXBLOB blob,
   rc = create_tmp_file (fname, &bakfname, &tmpfname, &newfp);
   if (rc)
     {
-      fclose (fp);
+      es_fclose (fp);
       goto leave;
     }
 
@@ -229,7 +230,7 @@ blob_filecopy (int mode, const char *fname, KEYBOXBLOB blob,
       /* Copy everything to the new file.  If this is for OpenPGP, we
          make sure that the openpgp flag is set in the header.  (We
          failsafe the blob type.) */
-      while ( (nread = fread (buffer, 1, DIM(buffer), fp)) > 0 )
+      while ( (nread = es_fread (buffer, 1, DIM(buffer), fp)) > 0 )
         {
           if (first_record && for_openpgp
               && buffer[4] == KEYBOX_BLOBTYPE_HEADER)
@@ -238,19 +239,19 @@ blob_filecopy (int mode, const char *fname, KEYBOXBLOB blob,
               buffer[7] |= 0x02; /* OpenPGP data may be available.  */
             }
 
-          if (fwrite (buffer, nread, 1, newfp) != 1)
+          if (es_fwrite (buffer, nread, 1, newfp) != 1)
             {
               rc = gpg_error_from_syserror ();
-              fclose (fp);
-              fclose (newfp);
+              es_fclose (fp);
+              es_fclose (newfp);
               goto leave;
             }
         }
-      if (ferror (fp))
+      if (es_ferror (fp))
         {
           rc = gpg_error_from_syserror ();
-          fclose (fp);
-          fclose (newfp);
+          es_fclose (fp);
+          es_fclose (newfp);
           goto leave;
         }
     }
@@ -266,24 +267,24 @@ blob_filecopy (int mode, const char *fname, KEYBOXBLOB blob,
           nbytes = DIM(buffer);
           if (current + nbytes > start_offset)
               nbytes = start_offset - current;
-          nread = fread (buffer, 1, nbytes, fp);
+          nread = es_fread (buffer, 1, nbytes, fp);
           if (!nread)
             break;
           current += nread;
 
-          if (fwrite (buffer, nread, 1, newfp) != 1)
+          if (es_fwrite (buffer, nread, 1, newfp) != 1)
             {
               rc = gpg_error_from_syserror ();
-              fclose (fp);
-              fclose (newfp);
+              es_fclose (fp);
+              es_fclose (newfp);
               goto leave;
             }
         }
-      if (ferror (fp))
+      if (es_ferror (fp))
         {
           rc = gpg_error_from_syserror ();
-          fclose (fp);
-          fclose (newfp);
+          es_fclose (fp);
+          es_fclose (newfp);
           goto leave;
         }
 
@@ -291,8 +292,8 @@ blob_filecopy (int mode, const char *fname, KEYBOXBLOB blob,
       rc = _keybox_read_blob (NULL, fp, NULL);
       if (rc)
         {
-          fclose (fp);
-          fclose (newfp);
+          es_fclose (fp);
+          es_fclose (newfp);
           return rc;
         }
     }
@@ -300,11 +301,11 @@ blob_filecopy (int mode, const char *fname, KEYBOXBLOB blob,
   /* Do an insert or update. */
   if ( mode == FILECOPY_INSERT || mode == FILECOPY_UPDATE )
     {
-      rc = _keybox_write_blob (blob, newfp);
+      rc = _keybox_write_blob (blob, newfp, NULL);
       if (rc)
         {
-          fclose (fp);
-          fclose (newfp);
+          es_fclose (fp);
+          es_fclose (newfp);
           return rc;
         }
     }
@@ -312,33 +313,33 @@ blob_filecopy (int mode, const char *fname, KEYBOXBLOB blob,
   /* Copy the rest of the packet for an delete or update. */
   if (mode == FILECOPY_DELETE || mode == FILECOPY_UPDATE)
     {
-      while ( (nread = fread (buffer, 1, DIM(buffer), fp)) > 0 )
+      while ( (nread = es_fread (buffer, 1, DIM(buffer), fp)) > 0 )
         {
-          if (fwrite (buffer, nread, 1, newfp) != 1)
+          if (es_fwrite (buffer, nread, 1, newfp) != 1)
             {
               rc = gpg_error_from_syserror ();
-              fclose (fp);
-              fclose (newfp);
+              es_fclose (fp);
+              es_fclose (newfp);
               goto leave;
             }
         }
-      if (ferror (fp))
+      if (es_ferror (fp))
         {
           rc = gpg_error_from_syserror ();
-          fclose (fp);
-          fclose (newfp);
+          es_fclose (fp);
+          es_fclose (newfp);
           goto leave;
         }
     }
 
   /* Close both files. */
-  if (fclose(fp))
+  if (es_fclose(fp))
     {
       rc = gpg_error_from_syserror ();
-      fclose (newfp);
+      es_fclose (newfp);
       goto leave;
     }
-  if (fclose(newfp))
+  if (es_fclose(newfp))
     {
       rc = gpg_error_from_syserror ();
       goto leave;
@@ -503,7 +504,7 @@ keybox_set_flags (KEYBOX_HANDLE hd, int what, int idx, unsigned int value)
 {
   off_t off;
   const char *fname;
-  FILE *fp;
+  estream_t fp;
   gpg_err_code_t ec;
   size_t flag_pos, flag_size;
   const unsigned char *buffer;
@@ -535,12 +536,12 @@ keybox_set_flags (KEYBOX_HANDLE hd, int what, int idx, unsigned int value)
   off += flag_pos;
 
   _keybox_close_file (hd);
-  fp = fopen (hd->kb->fname, "r+b");
+  fp = es_fopen (hd->kb->fname, "r+b");
   if (!fp)
     return gpg_error_from_syserror ();
 
   ec = 0;
-  if (fseeko (fp, off, SEEK_SET))
+  if (es_fseeko (fp, off, SEEK_SET))
     ec = gpg_err_code_from_syserror ();
   else
     {
@@ -556,7 +557,7 @@ keybox_set_flags (KEYBOX_HANDLE hd, int what, int idx, unsigned int value)
         case 1:
         case 2:
         case 4:
-          if (fwrite (tmp+4-flag_size, flag_size, 1, fp) != 1)
+          if (es_fwrite (tmp+4-flag_size, flag_size, 1, fp) != 1)
             ec = gpg_err_code_from_syserror ();
           break;
         default:
@@ -565,7 +566,7 @@ keybox_set_flags (KEYBOX_HANDLE hd, int what, int idx, unsigned int value)
         }
     }
 
-  if (fclose (fp))
+  if (es_fclose (fp))
     {
       if (!ec)
         ec = gpg_err_code_from_syserror ();
@@ -581,7 +582,7 @@ keybox_delete (KEYBOX_HANDLE hd)
 {
   off_t off;
   const char *fname;
-  FILE *fp;
+  estream_t fp;
   int rc;
 
   if (!hd)
@@ -600,18 +601,18 @@ keybox_delete (KEYBOX_HANDLE hd)
   off += 4;
 
   _keybox_close_file (hd);
-  fp = fopen (hd->kb->fname, "r+b");
+  fp = es_fopen (hd->kb->fname, "r+b");
   if (!fp)
     return gpg_error_from_syserror ();
 
-  if (fseeko (fp, off, SEEK_SET))
+  if (es_fseeko (fp, off, SEEK_SET))
     rc = gpg_error_from_syserror ();
-  else if (putc (0, fp) == EOF)
+  else if (es_fputc (0, fp) == EOF)
     rc = gpg_error_from_syserror ();
   else
     rc = 0;
 
-  if (fclose (fp))
+  if (es_fclose (fp))
     {
       if (!rc)
         rc = gpg_error_from_syserror ();
@@ -626,9 +627,10 @@ keybox_delete (KEYBOX_HANDLE hd)
 int
 keybox_compress (KEYBOX_HANDLE hd)
 {
+  gpg_err_code_t ec;
   int read_rc, rc;
   const char *fname;
-  FILE *fp, *newfp;
+  estream_t fp, newfp;
   char *bakfname = NULL;
   char *tmpfname = NULL;
   int first_blob;
@@ -651,10 +653,10 @@ keybox_compress (KEYBOX_HANDLE hd)
 
   /* Open the source file. Because we do a rename, we have to check the
      permissions of the file */
-  if (access (fname, W_OK))
-    return gpg_error_from_syserror ();
+  if ((ec = gnupg_access (fname, W_OK)))
+    return gpg_error (ec);
 
-  fp = fopen (fname, "rb");
+  fp = es_fopen (fname, "rb");
   if (!fp && errno == ENOENT)
     return 0; /* Ready. File has been deleted right after the access above. */
   if (!fp)
@@ -677,21 +679,21 @@ keybox_compress (KEYBOX_HANDLE hd)
 
           if ( (last_maint + 3*3600) > make_timestamp () )
             {
-              fclose (fp);
+              es_fclose (fp);
               _keybox_release_blob (blob);
               return 0; /* Compress run not yet needed. */
             }
         }
       _keybox_release_blob (blob);
-      fseek (fp, 0, SEEK_SET);
-      clearerr (fp);
+      es_fseek (fp, 0, SEEK_SET);
+      es_clearerr (fp);
     }
 
   /* Create the new file. */
   rc = create_tmp_file (fname, &bakfname, &tmpfname, &newfp);
   if (rc)
     {
-      fclose (fp);
+      es_fclose (fp);
       return rc;;
     }
 
@@ -723,7 +725,7 @@ keybox_compress (KEYBOX_HANDLE hd)
                  stamp and if needed (ie. used by gpg) set the openpgp
                  flag.  */
               _keybox_update_header_blob (blob, hd->for_openpgp);
-              rc = _keybox_write_blob (blob, newfp);
+              rc = _keybox_write_blob (blob, newfp, NULL);
               if (rc)
                 break;
               continue;
@@ -767,7 +769,7 @@ keybox_compress (KEYBOX_HANDLE hd)
             }
         }
 
-      rc = _keybox_write_blob (blob, newfp);
+      rc = _keybox_write_blob (blob, newfp, NULL);
       if (rc)
         break;
     }
@@ -780,9 +782,9 @@ keybox_compress (KEYBOX_HANDLE hd)
     rc = read_rc;
 
   /* Close both files. */
-  if (fclose(fp) && !rc)
+  if (es_fclose(fp) && !rc)
     rc = gpg_error_from_syserror ();
-  if (fclose(newfp) && !rc)
+  if (es_fclose(newfp) && !rc)
     rc = gpg_error_from_syserror ();
 
   /* Rename or remove the temporary file. */
index 4d94157..c5f9b57 100644 (file)
@@ -81,7 +81,7 @@ gpg_error_t keybox_lock (KEYBOX_HANDLE hd, int yes, long timeout);
 /*-- keybox-file.c --*/
 /* Fixme: This function does not belong here: Provide a better
    interface to create a new keybox file.  */
-int _keybox_write_header_blob (FILE *fp, int openpgp_flag);
+int _keybox_write_header_blob (estream_t fp, int openpgp_flag);
 
 /*-- keybox-search.c --*/
 gpg_error_t keybox_get_keyblock (KEYBOX_HANDLE hd, iobuf_t *r_iobuf,
index 70b5d45..a281946 100644 (file)
@@ -30,6 +30,7 @@ common/logging.c
 common/utf8conv.c
 common/dotlock.c
 common/init.c
+common/homedir.c
 
 g10/armor.c
 g10/build-packet.c
index 359d286..6f8339a 100644 (file)
--- a/po/ca.po
+++ b/po/ca.po
@@ -1852,6 +1852,14 @@ msgid "WARNING: '%s' is an empty file\n"
 msgstr "AVÍS: «%s» és un fitxer buit\n"
 
 #, fuzzy, c-format
+msgid "cipher algorithm '%s' may not be used in %s mode\n"
+msgstr "no podeu usar l'algorisme de xifratge «%s» mentre esteu en mode %s\n"
+
+#, fuzzy, c-format
+msgid "digest algorithm '%s' may not be used in %s mode\n"
+msgstr "no podeu usar l'algorisme de resum %s mentre esteu en mode %s\n"
+
+#, fuzzy, c-format
 #| msgid "reading from `%s'\n"
 msgid "reading from '%s'\n"
 msgstr "s'està llegint des de «%s»\n"
@@ -1863,10 +1871,6 @@ msgstr ""
 "forçar el xifrat asimètric %s (%d) viola les preferències del destinatari\n"
 
 #, fuzzy, c-format
-msgid "cipher algorithm '%s' may not be used in %s mode\n"
-msgstr "no podeu usar l'algorisme de xifratge «%s» mentre esteu en mode %s\n"
-
-#, fuzzy, c-format
 msgid "WARNING: key %s is not suitable for encryption in %s mode\n"
 msgstr "AVÍS: %s és una opció desaconsellada.\n"
 
@@ -2162,6 +2166,11 @@ msgstr "signa una clau"
 msgid "quickly sign a key locally"
 msgstr "signa una clau localment"
 
+#, fuzzy
+#| msgid "generate a new key pair"
+msgid "quickly revoke a key signature"
+msgstr "genera un nou parell de claus"
+
 msgid "sign a key"
 msgstr "signa una clau"
 
@@ -2662,10 +2671,6 @@ msgid "%s does not yet work with %s\n"
 msgstr "%s encara no funciona amb %s\n"
 
 #, fuzzy, c-format
-msgid "digest algorithm '%s' may not be used in %s mode\n"
-msgstr "no podeu usar l'algorisme de resum %s mentre esteu en mode %s\n"
-
-#, fuzzy, c-format
 msgid "compression algorithm '%s' may not be used in %s mode\n"
 msgstr "no podeu usar l'algorisme de compressió %s mentre esteu en mode %s\n"
 
@@ -3855,6 +3860,15 @@ msgstr "Usuari inexistent.\n"
 msgid "Nothing to sign.\n"
 msgstr "No hi ha res que signar amb la clau %08lX\n"
 
+#, c-format
+msgid "Not signed by you.\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "checking created signature failed: %s\n"
+msgid "revoking the key signature failed: %s\n"
+msgstr "no s'ha pogut comprovar la signatura creada: %s\n"
+
 #, fuzzy, c-format
 msgid "'%s' is not a valid expiration time\n"
 msgstr "%s no és un joc de caràcters vàlid\n"
@@ -4176,9 +4190,6 @@ msgstr "Esteu segur de que encara voleu revocarla? (s/N) "
 msgid "Create a revocation certificate for this signature? (y/N) "
 msgstr "Voleu crear un certificat de revocació per a aquesta signatura? (s/N) "
 
-msgid "Not signed by you.\n"
-msgstr ""
-
 #, fuzzy, c-format
 msgid "You have signed these user IDs on key %s:\n"
 msgstr "Heu signat els següents ID d'usuari:\n"
index 5a4aef3..10436ee 100644 (file)
--- a/po/cs.po
+++ b/po/cs.po
@@ -1713,6 +1713,14 @@ msgid "WARNING: '%s' is an empty file\n"
 msgstr "VAROVÁNÍ: soubor „%s“ je prázdný\n"
 
 #, c-format
+msgid "cipher algorithm '%s' may not be used in %s mode\n"
+msgstr "šifrovací algoritmus „%s“ se nesmí používat v režimu %s\n"
+
+#, c-format
+msgid "digest algorithm '%s' may not be used in %s mode\n"
+msgstr "hashovací algoritmus „%s“ se nesmí používat v režimu %s\n"
+
+#, c-format
 msgid "reading from '%s'\n"
 msgstr "čte se z „%s“\n"
 
@@ -1723,10 +1731,6 @@ msgstr ""
 "VAROVÁNÍ: vyžádaná symetrická šifra %s (%d) nevyhovuje předvolbám příjemce\n"
 
 #, c-format
-msgid "cipher algorithm '%s' may not be used in %s mode\n"
-msgstr "šifrovací algoritmus „%s“ se nesmí používat v režimu %s\n"
-
-#, c-format
 msgid "WARNING: key %s is not suitable for encryption in %s mode\n"
 msgstr "VAROVÁNÍ: klíč %s není vhodný pro šifrování v režimu %s\n"
 
@@ -1982,6 +1986,11 @@ msgstr "rychle podepsat klíč"
 msgid "quickly sign a key locally"
 msgstr "rychle lokálně podepsat klíč"
 
+#, fuzzy
+#| msgid "quickly revoke a user-id"
+msgid "quickly revoke a key signature"
+msgstr "rychle odvolat identitu uživatele"
+
 msgid "sign a key"
 msgstr "podepsat klíč"
 
@@ -2454,10 +2463,6 @@ msgid "%s does not yet work with %s\n"
 msgstr "%s dosud není funkční s %s\n"
 
 #, c-format
-msgid "digest algorithm '%s' may not be used in %s mode\n"
-msgstr "hashovací algoritmus „%s“ se nesmí používat v režimu %s\n"
-
-#, c-format
 msgid "compression algorithm '%s' may not be used in %s mode\n"
 msgstr "kompresní algoritmus „%s“ se nesmí používat v režimu %s\n"
 
@@ -3554,6 +3559,15 @@ msgid "Nothing to sign.\n"
 msgstr "Nic na podepsání.\n"
 
 #, c-format
+msgid "Not signed by you.\n"
+msgstr "Nepodepsáno vámi.\n"
+
+#, fuzzy, c-format
+#| msgid "checking created signature failed: %s\n"
+msgid "revoking the key signature failed: %s\n"
+msgstr "kontrola vytvořeného podpisu se nepodařila: %s\n"
+
+#, c-format
 msgid "'%s' is not a valid expiration time\n"
 msgstr "„%s“ není platná doba expirace\n"
 
@@ -3844,9 +3858,6 @@ msgstr "Jste si jisti, že jej chcete stále odvolat? (a/N) "
 msgid "Create a revocation certificate for this signature? (y/N) "
 msgstr "Vytvořit pro tento podpis odvolací certifikát? (a/N)"
 
-msgid "Not signed by you.\n"
-msgstr "Nepodepsáno vámi.\n"
-
 #, c-format
 msgid "You have signed these user IDs on key %s:\n"
 msgstr "Podepsal(a) jste následující identifikátory uživatele: %s:\n"
index cce2ec1..95fc716 100644 (file)
--- a/po/da.po
+++ b/po/da.po
@@ -1842,6 +1842,16 @@ msgid "WARNING: '%s' is an empty file\n"
 msgstr "ADVARSEL: »%s« er en tom fil\n"
 
 #, fuzzy, c-format
+#| msgid "you may not use cipher algorithm `%s' while in %s mode\n"
+msgid "cipher algorithm '%s' may not be used in %s mode\n"
+msgstr "du må ikke bruge chifferalgoritmen »%s« i tilstanden %s\n"
+
+#, fuzzy, c-format
+#| msgid "you may not use digest algorithm `%s' while in %s mode\n"
+msgid "digest algorithm '%s' may not be used in %s mode\n"
+msgstr "du må ikke bruge sammendragsalgoritmen »%s« i tilstanden %s\n"
+
+#, fuzzy, c-format
 #| msgid "reading from `%s'\n"
 msgid "reading from '%s'\n"
 msgstr "læser fra »%s«\n"
@@ -1854,11 +1864,6 @@ msgstr ""
 "præferencer\n"
 
 #, fuzzy, c-format
-#| msgid "you may not use cipher algorithm `%s' while in %s mode\n"
-msgid "cipher algorithm '%s' may not be used in %s mode\n"
-msgstr "du må ikke bruge chifferalgoritmen »%s« i tilstanden %s\n"
-
-#, fuzzy, c-format
 #| msgid "WARNING: \"%s\" is an obsolete option - it has no effect\n"
 msgid "WARNING: key %s is not suitable for encryption in %s mode\n"
 msgstr "ADVARSEL: »%s« er en forældet indstilling - den har ingen effekt\n"
@@ -2142,6 +2147,11 @@ msgstr "underskriv en nøgle"
 msgid "quickly sign a key locally"
 msgstr "underskriv en nøgle lokalt"
 
+#, fuzzy
+#| msgid "generate a new key pair"
+msgid "quickly revoke a key signature"
+msgstr "opret et nyt nøglepar"
+
 msgid "sign a key"
 msgstr "underskriv en nøgle"
 
@@ -2643,11 +2653,6 @@ msgid "%s does not yet work with %s\n"
 msgstr "%s virker endnu ikke med %s\n"
 
 #, fuzzy, c-format
-#| msgid "you may not use digest algorithm `%s' while in %s mode\n"
-msgid "digest algorithm '%s' may not be used in %s mode\n"
-msgstr "du må ikke bruge sammendragsalgoritmen »%s« i tilstanden %s\n"
-
-#, fuzzy, c-format
 #| msgid "you may not use compression algorithm `%s' while in %s mode\n"
 msgid "compression algorithm '%s' may not be used in %s mode\n"
 msgstr "du må ikke bruge komprimeringsalgoritmen »%s« i tilstanden %s\n"
@@ -3815,6 +3820,15 @@ msgstr "Ingen sådan bruger-id.\n"
 msgid "Nothing to sign.\n"
 msgstr "Intet at underskrive med nøgle %s\n"
 
+#, c-format
+msgid "Not signed by you.\n"
+msgstr "Ikke underskrevet af dig.\n"
+
+#, fuzzy, c-format
+#| msgid "checking created signature failed: %s\n"
+msgid "revoking the key signature failed: %s\n"
+msgstr "kontrol af oprettet underskrift mislykkedes: %s\n"
+
 #, fuzzy, c-format
 #| msgid "`%s' is not a valid signature expiration\n"
 msgid "'%s' is not a valid expiration time\n"
@@ -4126,9 +4140,6 @@ msgstr "Er du sikker på, at du ønsker at tilbagekalde den? (j/N) "
 msgid "Create a revocation certificate for this signature? (y/N) "
 msgstr "Opret et tilbagekaldscertifikat for denne underskrift? (j/N) "
 
-msgid "Not signed by you.\n"
-msgstr "Ikke underskrevet af dig.\n"
-
 #, c-format
 msgid "You have signed these user IDs on key %s:\n"
 msgstr "Du har underskrevet disse bruger-id'er på nøgle %s:\n"
index e3e0364..9ba1721 100644 (file)
--- a/po/de.po
+++ b/po/de.po
@@ -9,7 +9,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: gnupg-2.1.0\n"
 "Report-Msgid-Bugs-To: translations@gnupg.org\n"
-"PO-Revision-Date: 2020-07-09 11:31+0200\n"
+"PO-Revision-Date: 2020-11-11 14:57+0100\n"
 "Last-Translator: Werner Koch <wk@gnupg.org>\n"
 "Language-Team: German <de@li.org>\n"
 "Language: de\n"
@@ -1721,6 +1721,15 @@ msgid "WARNING: '%s' is an empty file\n"
 msgstr "WARNUNG: '%s' ist eine leere Datei.\n"
 
 #, c-format
+msgid "cipher algorithm '%s' may not be used in %s mode\n"
+msgstr ""
+"Das Verschlüsselungsverfahren %s darf im %s Modus nicht verwendet werden.\n"
+
+#, c-format
+msgid "digest algorithm '%s' may not be used in %s mode\n"
+msgstr "Die Benutzung der Hashmethode %s ist im %s Modus nicht erlaubt.\n"
+
+#, c-format
 msgid "reading from '%s'\n"
 msgstr "Lesen von '%s'\n"
 
@@ -1732,11 +1741,6 @@ msgstr ""
 "%s (%d) verletzt die Empfängervoreinstellungen\n"
 
 #, c-format
-msgid "cipher algorithm '%s' may not be used in %s mode\n"
-msgstr ""
-"Das Verschlüsselungsverfahren %s darf im %s Modus nicht verwendet werden.\n"
-
-#, c-format
 msgid "WARNING: key %s is not suitable for encryption in %s mode\n"
 msgstr ""
 "WARNUNG: Schlüssel %s ist zur Verschlüsselung im %s Modus nicht geeignet.\n"
@@ -1999,6 +2003,9 @@ msgstr "Schlüssel schnell signieren"
 msgid "quickly sign a key locally"
 msgstr "Schlüssel schnell nur für diesen Rechner signieren"
 
+msgid "quickly revoke a key signature"
+msgstr "Schnell eine Schlüsselsignatur widerrufen"
+
 msgid "sign a key"
 msgstr "Schlüssel signieren"
 
@@ -2464,10 +2471,6 @@ msgid "%s does not yet work with %s\n"
 msgstr "%s arbeitet noch nicht mit %s zusammen\n"
 
 #, c-format
-msgid "digest algorithm '%s' may not be used in %s mode\n"
-msgstr "Die Benutzung der Hashmethode %s ist im %s Modus nicht erlaubt.\n"
-
-#, c-format
 msgid "compression algorithm '%s' may not be used in %s mode\n"
 msgstr ""
 "Die Benutzung des Komprimierverfahren %s ist im %s Modus nicht erlaubt.\n"
@@ -3592,6 +3595,14 @@ msgid "Nothing to sign.\n"
 msgstr "Nichts zu beglaubigen\n"
 
 #, c-format
+msgid "Not signed by you.\n"
+msgstr "Nicht von Ihnen signiert.\n"
+
+#, c-format
+msgid "revoking the key signature failed: %s\n"
+msgstr "Fehler beim Widerruf der Schlüsselsignatur: %s\n"
+
+#, c-format
 msgid "'%s' is not a valid expiration time\n"
 msgstr "'%s' ist kein gültiges Ablaufdatum\n"
 
@@ -3892,9 +3903,6 @@ msgstr "Wollen Sie ihn immer noch widerrufen? (j/N) "
 msgid "Create a revocation certificate for this signature? (y/N) "
 msgstr "Ein Widerrufszertifikat für diese Signatur erzeugen (j/N)"
 
-msgid "Not signed by you.\n"
-msgstr "Nicht von Ihnen signiert.\n"
-
 #, c-format
 msgid "You have signed these user IDs on key %s:\n"
 msgstr "Sie haben folgende User-IDs des Schlüssels %s beglaubigt:\n"
index 3b643ca..8cedba8 100644 (file)
--- a/po/el.po
+++ b/po/el.po
@@ -1782,6 +1782,15 @@ msgid "WARNING: '%s' is an empty file\n"
 msgstr "ΠΡΟΕΙΔΟΠΟΙΗΣΗ: `%s' είναι ένα άδειο αρχείο\n"
 
 #, fuzzy, c-format
+msgid "cipher algorithm '%s' may not be used in %s mode\n"
+msgstr "απαγορεύετε η χρήση του κρυπταλγόριθμου \"%s\" στην κατάσταση %s\n"
+
+#, fuzzy, c-format
+msgid "digest algorithm '%s' may not be used in %s mode\n"
+msgstr ""
+"απαγορεύετε η χρήση του αλγόριθμου περίληψης \"%s\" στην κατάσταση %s\n"
+
+#, fuzzy, c-format
 #| msgid "reading from `%s'\n"
 msgid "reading from '%s'\n"
 msgstr "ανάγνωση από `%s'\n"
@@ -1794,10 +1803,6 @@ msgstr ""
 "επιλογές του παραλήπτη\n"
 
 #, fuzzy, c-format
-msgid "cipher algorithm '%s' may not be used in %s mode\n"
-msgstr "απαγορεύετε η χρήση του κρυπταλγόριθμου \"%s\" στην κατάσταση %s\n"
-
-#, fuzzy, c-format
 msgid "WARNING: key %s is not suitable for encryption in %s mode\n"
 msgstr "ΠΡΟΕΙΔΟΠΟΙΗΣΗ: \"%s\" είναι μια μη συνειστώμενη επιλογή\n"
 
@@ -2088,6 +2093,11 @@ msgstr "υπογραφή ενός κλειδιού"
 msgid "quickly sign a key locally"
 msgstr "υπογραφή ενός κλειδιού τοπικά"
 
+#, fuzzy
+#| msgid "generate a new key pair"
+msgid "quickly revoke a key signature"
+msgstr "δημιουργία ενός νέου ζεύγους κλειδιών"
+
 msgid "sign a key"
 msgstr "υπογραφή ενός κλειδιού"
 
@@ -2579,11 +2589,6 @@ msgid "%s does not yet work with %s\n"
 msgstr "το %s ακόμα δε λειτουργεί μαζί με το %s\n"
 
 #, fuzzy, c-format
-msgid "digest algorithm '%s' may not be used in %s mode\n"
-msgstr ""
-"απαγορεύετε η χρήση του αλγόριθμου περίληψης \"%s\" στην κατάσταση %s\n"
-
-#, fuzzy, c-format
 msgid "compression algorithm '%s' may not be used in %s mode\n"
 msgstr ""
 "απαγορεύετε η χρήση του αλγόριθμου συμπίεσης \"%s\" στην κατάσταση %s\n"
@@ -3760,6 +3765,15 @@ msgid "Nothing to sign.\n"
 msgstr "Τίποτα για να υπογραφεί με το κλειδί  %08lX\n"
 
 #, fuzzy, c-format
+msgid "Not signed by you.\n"
+msgstr "   υπογράφθηκε από %08lX στις %s%s\n"
+
+#, fuzzy, c-format
+#| msgid "checking created signature failed: %s\n"
+msgid "revoking the key signature failed: %s\n"
+msgstr "απέτυχε ο έλεγχος της υπογραφής που δημιουργήθηκε: %s\n"
+
+#, fuzzy, c-format
 msgid "'%s' is not a valid expiration time\n"
 msgstr "το %s δεν είναι έγκυρο σετ χαρακτήρων\n"
 
@@ -4076,10 +4090,6 @@ msgstr "Σίγουρα θέλετε να ανακληθεί αυτό το κλε
 msgid "Create a revocation certificate for this signature? (y/N) "
 msgstr "Δημιουργία ενός πιστοποιητικού ανάκλησης για αυτή την υπογραφή; (y/N)"
 
-#, fuzzy
-msgid "Not signed by you.\n"
-msgstr "   υπογράφθηκε από %08lX στις %s%s\n"
-
 #, fuzzy, c-format
 msgid "You have signed these user IDs on key %s:\n"
 msgstr "Έχετε υπογράψει αυτά τα user ID:\n"
index 15aa172..5cfc0bd 100644 (file)
--- a/po/eo.po
+++ b/po/eo.po
@@ -1779,6 +1779,14 @@ msgid "WARNING: '%s' is an empty file\n"
 msgstr "AVERTO: '%s' estas malplena dosiero\n"
 
 #, fuzzy, c-format
+msgid "cipher algorithm '%s' may not be used in %s mode\n"
+msgstr "Tiu komando ne eblas en la reĝimo %s.\n"
+
+#, fuzzy, c-format
+msgid "digest algorithm '%s' may not be used in %s mode\n"
+msgstr "Tiu komando ne eblas en la reĝimo %s.\n"
+
+#, fuzzy, c-format
 #| msgid "reading from `%s'\n"
 msgid "reading from '%s'\n"
 msgstr "legas el '%s'\n"
@@ -1789,10 +1797,6 @@ msgid ""
 msgstr "NOTO: ĉifrad-metodo %d ne trovita en preferoj\n"
 
 #, fuzzy, c-format
-msgid "cipher algorithm '%s' may not be used in %s mode\n"
-msgstr "Tiu komando ne eblas en la reĝimo %s.\n"
-
-#, fuzzy, c-format
 msgid "WARNING: key %s is not suitable for encryption in %s mode\n"
 msgstr "AVERTO: '%s' estas malplena dosiero\n"
 
@@ -2068,6 +2072,11 @@ msgstr "subskribi ŝlosilon"
 msgid "quickly sign a key locally"
 msgstr "subskribi ŝlosilon loke"
 
+#, fuzzy
+#| msgid "generate a new key pair"
+msgid "quickly revoke a key signature"
+msgstr "krei novan ŝlosilparon"
+
 msgid "sign a key"
 msgstr "subskribi ŝlosilon"
 
@@ -2554,10 +2563,6 @@ msgid "%s does not yet work with %s\n"
 msgstr "%s ne havas sencon kun %s!\n"
 
 #, fuzzy, c-format
-msgid "digest algorithm '%s' may not be used in %s mode\n"
-msgstr "Tiu komando ne eblas en la reĝimo %s.\n"
-
-#, fuzzy, c-format
 msgid "compression algorithm '%s' may not be used in %s mode\n"
 msgstr "Tiu komando ne eblas en la reĝimo %s.\n"
 
@@ -3732,6 +3737,15 @@ msgid "Nothing to sign.\n"
 msgstr "Nenio por subskribi per ŝlosilo %08lX\n"
 
 #, fuzzy, c-format
+msgid "Not signed by you.\n"
+msgstr "   subskribita per %08lX je %s%s\n"
+
+#, fuzzy, c-format
+#| msgid "checking created signature failed: %s\n"
+msgid "revoking the key signature failed: %s\n"
+msgstr "kontrolo de kreita subskribo malsukcesis: %s\n"
+
+#, fuzzy, c-format
 msgid "'%s' is not a valid expiration time\n"
 msgstr "%s ne estas valida signaro\n"
 
@@ -4036,10 +4050,6 @@ msgstr "Ĉu vi estas certa, ke vi ankoraŭ volas aldoni ĝin? (j/n) "
 msgid "Create a revocation certificate for this signature? (y/N) "
 msgstr "Ĉu krei revokatestilon por ĉi tiu subskribo? (j/N)"
 
-#, fuzzy
-msgid "Not signed by you.\n"
-msgstr "   subskribita per %08lX je %s%s\n"
-
 #, fuzzy, c-format
 msgid "You have signed these user IDs on key %s:\n"
 msgstr "Vi subskribis la sekvajn uzantidentigilojn:\n"
index 641bc28..12b0db5 100644 (file)
--- a/po/es.po
+++ b/po/es.po
@@ -1720,6 +1720,14 @@ msgid "WARNING: '%s' is an empty file\n"
 msgstr "ATENCIÓN '%s' es un fichero vacío\n"
 
 #, c-format
+msgid "cipher algorithm '%s' may not be used in %s mode\n"
+msgstr "no se puede usar el cifrado '%s' en modo %s\n"
+
+#, c-format
+msgid "digest algorithm '%s' may not be used in %s mode\n"
+msgstr "no puede usar el resumen '%s' en modo %s\n"
+
+#, c-format
 msgid "reading from '%s'\n"
 msgstr "leyendo desde '%s'\n"
 
@@ -1731,10 +1739,6 @@ msgstr ""
 "del destinatario\n"
 
 #, c-format
-msgid "cipher algorithm '%s' may not be used in %s mode\n"
-msgstr "no se puede usar el cifrado '%s' en modo %s\n"
-
-#, c-format
 msgid "WARNING: key %s is not suitable for encryption in %s mode\n"
 msgstr ""
 "ATENCIÓN: la clave %s no es adecuada para la encriptación en modo %s\n"
@@ -1993,6 +1997,11 @@ msgstr "firma una clave en modo rápido"
 msgid "quickly sign a key locally"
 msgstr "firma una clave localmente en modo rápido"
 
+#, fuzzy
+#| msgid "quickly revoke a user-id"
+msgid "quickly revoke a key signature"
+msgstr "revoca una id de usuario en modo rápido"
+
 msgid "sign a key"
 msgstr "firma la clave"
 
@@ -2454,10 +2463,6 @@ msgid "%s does not yet work with %s\n"
 msgstr "%s aún no funciona con %s\n"
 
 #, c-format
-msgid "digest algorithm '%s' may not be used in %s mode\n"
-msgstr "no puede usar el resumen '%s' en modo %s\n"
-
-#, c-format
 msgid "compression algorithm '%s' may not be used in %s mode\n"
 msgstr "no puede usar la compresión '%s' en modo %s\n"
 
@@ -3558,6 +3563,15 @@ msgid "Nothing to sign.\n"
 msgstr "Nada que firmar.\n"
 
 #, c-format
+msgid "Not signed by you.\n"
+msgstr "No está firmado por usted.\n"
+
+#, fuzzy, c-format
+#| msgid "checking created signature failed: %s\n"
+msgid "revoking the key signature failed: %s\n"
+msgstr "la comprobación de la firma creada falló: %s\n"
+
+#, c-format
 msgid "'%s' is not a valid expiration time\n"
 msgstr "'%s' no es una fecha de caducidad válida\n"
 
@@ -3848,9 +3862,6 @@ msgstr "¿De verdad quiere revocarla? (s/N) "
 msgid "Create a revocation certificate for this signature? (y/N) "
 msgstr "¿Crear un certificado de revocación para esta clave? (s/N) "
 
-msgid "Not signed by you.\n"
-msgstr "No está firmado por usted.\n"
-
 #, c-format
 msgid "You have signed these user IDs on key %s:\n"
 msgstr "Ha firmado estos IDs de usuario con la clave %s:\n"
index 64eaf3b..2b5d6de 100644 (file)
--- a/po/et.po
+++ b/po/et.po
@@ -1777,6 +1777,14 @@ msgid "WARNING: '%s' is an empty file\n"
 msgstr "HOIATUS: `%s' on tühi fail\n"
 
 #, fuzzy, c-format
+msgid "cipher algorithm '%s' may not be used in %s mode\n"
+msgstr "šifri algoritm \"%s\" ei ole moodis %s lubatud\n"
+
+#, fuzzy, c-format
+msgid "digest algorithm '%s' may not be used in %s mode\n"
+msgstr "sõnumilühendi algoritm \"%s\" ei ole moodis %s lubatud\n"
+
+#, fuzzy, c-format
 #| msgid "reading from `%s'\n"
 msgid "reading from '%s'\n"
 msgstr "loen failist `%s'\n"
@@ -1788,10 +1796,6 @@ msgstr ""
 "sümmetrilise šifri %s (%d) kasutamine on vastuolus saaja eelistustega\n"
 
 #, fuzzy, c-format
-msgid "cipher algorithm '%s' may not be used in %s mode\n"
-msgstr "šifri algoritm \"%s\" ei ole moodis %s lubatud\n"
-
-#, fuzzy, c-format
 msgid "WARNING: key %s is not suitable for encryption in %s mode\n"
 msgstr "HOIATUS: võtit \"%s\" ei soovitata kasutada.\n"
 
@@ -2080,6 +2084,11 @@ msgstr "allkirjasta võti"
 msgid "quickly sign a key locally"
 msgstr "allkirjasta võti lokaalselt"
 
+#, fuzzy
+#| msgid "generate a new key pair"
+msgid "quickly revoke a key signature"
+msgstr "genereeri uus võtmepaar"
+
 msgid "sign a key"
 msgstr "allkirjasta võti"
 
@@ -2566,10 +2575,6 @@ msgid "%s does not yet work with %s\n"
 msgstr "%s ei tööta veel koos %s-ga\n"
 
 #, fuzzy, c-format
-msgid "digest algorithm '%s' may not be used in %s mode\n"
-msgstr "sõnumilühendi algoritm \"%s\" ei ole moodis %s lubatud\n"
-
-#, fuzzy, c-format
 msgid "compression algorithm '%s' may not be used in %s mode\n"
 msgstr "pakkimise algoritm \"%s\" ei ole moodis %s lubatud\n"
 
@@ -3732,6 +3737,15 @@ msgid "Nothing to sign.\n"
 msgstr "Võtmega %08lX pole midagi allkirjastada\n"
 
 #, fuzzy, c-format
+msgid "Not signed by you.\n"
+msgstr "   allkirjastanud %08lX %s%s\n"
+
+#, fuzzy, c-format
+#| msgid "checking created signature failed: %s\n"
+msgid "revoking the key signature failed: %s\n"
+msgstr "Loodud allkirja ei õnnestu kontrollida: %s\n"
+
+#, fuzzy, c-format
 msgid "'%s' is not a valid expiration time\n"
 msgstr "%s ei ole lubatud kooditabel\n"
 
@@ -4037,10 +4051,6 @@ msgstr "Olete kindel, et soovite seda ikka tühistada? (j/E) "
 msgid "Create a revocation certificate for this signature? (y/N) "
 msgstr "Loon sellele allkirjale tühistamise sertifikaadi? (j/E) "
 
-#, fuzzy
-msgid "Not signed by you.\n"
-msgstr "   allkirjastanud %08lX %s%s\n"
-
 #, fuzzy, c-format
 msgid "You have signed these user IDs on key %s:\n"
 msgstr "Te olete allkirjastanud järgnevad kasutaja IDd:\n"
index 85f1464..507d146 100644 (file)
--- a/po/fi.po
+++ b/po/fi.po
@@ -1796,6 +1796,14 @@ msgid "WARNING: '%s' is an empty file\n"
 msgstr "VAROITUS: \"%s\" on tyhjä tiedosto\n"
 
 #, fuzzy, c-format
+msgid "cipher algorithm '%s' may not be used in %s mode\n"
+msgstr "salausalgoritmia \"%s\" ei voi käyttää %s-tilassa\n"
+
+#, fuzzy, c-format
+msgid "digest algorithm '%s' may not be used in %s mode\n"
+msgstr "tiivistealgoritmia \"%s\" ei voi käyttää %s-tilassa\n"
+
+#, fuzzy, c-format
 #| msgid "reading from `%s'\n"
 msgid "reading from '%s'\n"
 msgstr "luetaan kohteesta \"%s\"\n"
@@ -1806,10 +1814,6 @@ msgid ""
 msgstr "valittu symmetrinen salain %s (%d) ei ole vastaanottajan suosima\n"
 
 #, fuzzy, c-format
-msgid "cipher algorithm '%s' may not be used in %s mode\n"
-msgstr "salausalgoritmia \"%s\" ei voi käyttää %s-tilassa\n"
-
-#, fuzzy, c-format
 msgid "WARNING: key %s is not suitable for encryption in %s mode\n"
 msgstr "VAROITUS: \"%s\" on paheksuttu valitsin\n"
 
@@ -2095,6 +2099,11 @@ msgstr "allekirjoita avain"
 msgid "quickly sign a key locally"
 msgstr "allekirjoita avain paikallisesti"
 
+#, fuzzy
+#| msgid "generate a new key pair"
+msgid "quickly revoke a key signature"
+msgstr "luo uusi avainpari"
+
 msgid "sign a key"
 msgstr "allekirjoita avain"
 
@@ -2582,10 +2591,6 @@ msgid "%s does not yet work with %s\n"
 msgstr "%s ja %s eivät vielä toimi yhdessä\n"
 
 #, fuzzy, c-format
-msgid "digest algorithm '%s' may not be used in %s mode\n"
-msgstr "tiivistealgoritmia \"%s\" ei voi käyttää %s-tilassa\n"
-
-#, fuzzy, c-format
 msgid "compression algorithm '%s' may not be used in %s mode\n"
 msgstr "pakkausalgoritmia \"%s\" ei voi käyttää %s-tilassa\n"
 
@@ -3753,6 +3758,15 @@ msgid "Nothing to sign.\n"
 msgstr "Avaimelle %08lX ei löydy mitään mitä allekirjoittaa\n"
 
 #, fuzzy, c-format
+msgid "Not signed by you.\n"
+msgstr "   %08lX allekirjoitti tämän %s%s\n"
+
+#, fuzzy, c-format
+#| msgid "checking created signature failed: %s\n"
+msgid "revoking the key signature failed: %s\n"
+msgstr "luodun allekirjoituksen tarkistus epäonnistui: %s\n"
+
+#, fuzzy, c-format
 msgid "'%s' is not a valid expiration time\n"
 msgstr "%s ei kelpaa merkistöksi\n"
 
@@ -4059,10 +4073,6 @@ msgstr "Haluatko varmasti mitätöidä sen? (k/E) "
 msgid "Create a revocation certificate for this signature? (y/N) "
 msgstr "Luodaanko tälle alekirjoitukselle mitätöintivarmenne? (k/E) "
 
-#, fuzzy
-msgid "Not signed by you.\n"
-msgstr "   %08lX allekirjoitti tämän %s%s\n"
-
 #, fuzzy, c-format
 msgid "You have signed these user IDs on key %s:\n"
 msgstr "Olet allekirjoittanut seuraavat käyttäjätunnukset:\n"
index 59c4033..8f297c4 100644 (file)
--- a/po/fr.po
+++ b/po/fr.po
@@ -1771,6 +1771,16 @@ msgstr "« %s » est déjà compressé\n"
 msgid "WARNING: '%s' is an empty file\n"
 msgstr "Attention : « %s » est un fichier vide\n"
 
+#, fuzzy, c-format
+#| msgid "you may not use cipher algorithm '%s' while in %s mode\n"
+msgid "cipher algorithm '%s' may not be used in %s mode\n"
+msgstr "impossible d'utiliser l'algorithme de chiffrement « %s » en mode %s.\n"
+
+#, fuzzy, c-format
+#| msgid "you may not use digest algorithm '%s' while in %s mode\n"
+msgid "digest algorithm '%s' may not be used in %s mode\n"
+msgstr "impossible d'utiliser l'algorithme de hachage « %s » en mode %s.\n"
+
 #, c-format
 msgid "reading from '%s'\n"
 msgstr "lecture de « %s »\n"
@@ -1783,11 +1793,6 @@ msgstr ""
 "            désaccord avec les préférences du destinataire\n"
 
 #, fuzzy, c-format
-#| msgid "you may not use cipher algorithm '%s' while in %s mode\n"
-msgid "cipher algorithm '%s' may not be used in %s mode\n"
-msgstr "impossible d'utiliser l'algorithme de chiffrement « %s » en mode %s.\n"
-
-#, fuzzy, c-format
 #| msgid "WARNING: \"%s%s\" is an obsolete option - it has no effect\n"
 msgid "WARNING: key %s is not suitable for encryption in %s mode\n"
 msgstr "Attention : « %s%s » est une option obsolète — non prise en compte\n"
@@ -2065,6 +2070,11 @@ msgstr "signer rapidement une clef"
 msgid "quickly sign a key locally"
 msgstr "signer rapidement une clef localement"
 
+#, fuzzy
+#| msgid "quickly generate a new key pair"
+msgid "quickly revoke a key signature"
+msgstr "générer rapidement une nouvelle paire de clefs"
+
 msgid "sign a key"
 msgstr "signer une clef"
 
@@ -2561,11 +2571,6 @@ msgid "%s does not yet work with %s\n"
 msgstr "%s ne fonctionne pas encore avec %s\n"
 
 #, fuzzy, c-format
-#| msgid "you may not use digest algorithm '%s' while in %s mode\n"
-msgid "digest algorithm '%s' may not be used in %s mode\n"
-msgstr "impossible d'utiliser l'algorithme de hachage « %s » en mode %s.\n"
-
-#, fuzzy, c-format
 #| msgid "you may not use compression algorithm '%s' while in %s mode\n"
 msgid "compression algorithm '%s' may not be used in %s mode\n"
 msgstr "impossible d'utiliser l'algorithme de compression « %s » en mode %s.\n"
@@ -3697,6 +3702,15 @@ msgstr "Pas d’identités correspondantes."
 msgid "Nothing to sign.\n"
 msgstr "Rien à signer.\n"
 
+#, c-format
+msgid "Not signed by you.\n"
+msgstr "Non signée par vous.\n"
+
+#, fuzzy, c-format
+#| msgid "checking created signature failed: %s\n"
+msgid "revoking the key signature failed: %s\n"
+msgstr "échec de vérification de la signature créée : %s\n"
+
 #, fuzzy, c-format
 #| msgid "'%s' is not a valid signature expiration\n"
 msgid "'%s' is not a valid expiration time\n"
@@ -4010,9 +4024,6 @@ msgid "Create a revocation certificate for this signature? (y/N) "
 msgstr ""
 "Faut-il créer un certificat de révocation pour cette signature ? (o/N) "
 
-msgid "Not signed by you.\n"
-msgstr "Non signée par vous.\n"
-
 #, c-format
 msgid "You have signed these user IDs on key %s:\n"
 msgstr "Vous avez signé ces identités sur la clef %s :\n"
index ec5e830..7cf244c 100644 (file)
--- a/po/gl.po
+++ b/po/gl.po
@@ -1787,6 +1787,14 @@ msgid "WARNING: '%s' is an empty file\n"
 msgstr "AVISO: `%s' é un ficheiro baleiro\n"
 
 #, fuzzy, c-format
+msgid "cipher algorithm '%s' may not be used in %s mode\n"
+msgstr "non se pode empregar o algoritmo de cifrado \"%s\" no modo %s\n"
+
+#, fuzzy, c-format
+msgid "digest algorithm '%s' may not be used in %s mode\n"
+msgstr "non se pode empregar o algoritmo de resumo \"%s\" no modo %s\n"
+
+#, fuzzy, c-format
 #| msgid "reading from `%s'\n"
 msgid "reading from '%s'\n"
 msgstr "lendo de `%s'\n"
@@ -1798,10 +1806,6 @@ msgstr ""
 "forza-la cifra simétrica %s (%d) viola as preferencias do destinatario\n"
 
 #, fuzzy, c-format
-msgid "cipher algorithm '%s' may not be used in %s mode\n"
-msgstr "non se pode empregar o algoritmo de cifrado \"%s\" no modo %s\n"
-
-#, fuzzy, c-format
 msgid "WARNING: key %s is not suitable for encryption in %s mode\n"
 msgstr "AVISO: \"%s\" é unha opción a extinguir\n"
 
@@ -2088,6 +2092,11 @@ msgstr "asinar unha chave"
 msgid "quickly sign a key locally"
 msgstr "asinar unha chave localmente"
 
+#, fuzzy
+#| msgid "generate a new key pair"
+msgid "quickly revoke a key signature"
+msgstr "xerar un novo par de chaves"
+
 msgid "sign a key"
 msgstr "asinar unha chave"
 
@@ -2574,10 +2583,6 @@ msgid "%s does not yet work with %s\n"
 msgstr "¡%s aínda non traballa con %s!\n"
 
 #, fuzzy, c-format
-msgid "digest algorithm '%s' may not be used in %s mode\n"
-msgstr "non se pode empregar o algoritmo de resumo \"%s\" no modo %s\n"
-
-#, fuzzy, c-format
 msgid "compression algorithm '%s' may not be used in %s mode\n"
 msgstr "non se pode empregar o algoritmo de compresión \"%s\" no modo %s\n"
 
@@ -3756,6 +3761,15 @@ msgid "Nothing to sign.\n"
 msgstr "Nada que asinar coa chave %08lX\n"
 
 #, fuzzy, c-format
+msgid "Not signed by you.\n"
+msgstr "   asinada por %08lX no %s%s\n"
+
+#, fuzzy, c-format
+#| msgid "checking created signature failed: %s\n"
+msgid "revoking the key signature failed: %s\n"
+msgstr "fallou a comprobación da sinatura creada: %s\n"
+
+#, fuzzy, c-format
 msgid "'%s' is not a valid expiration time\n"
 msgstr "%s non é un xogo de caracteres válido\n"
 
@@ -4070,10 +4084,6 @@ msgstr "¿Está seguro de que quere revocala? (s/N) "
 msgid "Create a revocation certificate for this signature? (y/N) "
 msgstr "¿Crear un certificado de revocación para esta sinatura? (s/N) "
 
-#, fuzzy
-msgid "Not signed by you.\n"
-msgstr "   asinada por %08lX no %s%s\n"
-
 #, fuzzy, c-format
 msgid "You have signed these user IDs on key %s:\n"
 msgstr "Asinou estes IDs de usuario: \n"
index 7b9eef7..ac9d361 100644 (file)
--- a/po/hu.po
+++ b/po/hu.po
@@ -1777,6 +1777,16 @@ msgid "WARNING: '%s' is an empty file\n"
 msgstr "FIGYELEM: A(z) \"%s\" állomány üres.\n"
 
 #, fuzzy, c-format
+msgid "cipher algorithm '%s' may not be used in %s mode\n"
+msgstr ""
+"Lehet, hogy nem használhatja \"%s\" rejtjelező algoritmust %s módban!\n"
+
+#, fuzzy, c-format
+msgid "digest algorithm '%s' may not be used in %s mode\n"
+msgstr ""
+"Lehet, hogy nem használhatja \"%s\" kivonatoló algoritmust %s módban!\n"
+
+#, fuzzy, c-format
 #| msgid "reading from `%s'\n"
 msgid "reading from '%s'\n"
 msgstr "Olvasok a \"%s\" állományból.\n"
@@ -1787,11 +1797,6 @@ msgid ""
 msgstr "A %s (%d) rejtjelező használata sérti a címzett preferenciáit!\n"
 
 #, fuzzy, c-format
-msgid "cipher algorithm '%s' may not be used in %s mode\n"
-msgstr ""
-"Lehet, hogy nem használhatja \"%s\" rejtjelező algoritmust %s módban!\n"
-
-#, fuzzy, c-format
 msgid "WARNING: key %s is not suitable for encryption in %s mode\n"
 msgstr "FIGYELEM: \"%s\" elavult opció!\n"
 
@@ -2077,6 +2082,11 @@ msgstr "kulcs aláírása"
 msgid "quickly sign a key locally"
 msgstr "kulcs aláírása helyileg"
 
+#, fuzzy
+#| msgid "generate a new key pair"
+msgid "quickly revoke a key signature"
+msgstr "új kulcspár létrehozása"
+
 msgid "sign a key"
 msgstr "kulcs aláírása"
 
@@ -2563,11 +2573,6 @@ msgid "%s does not yet work with %s\n"
 msgstr "%s és %s egyelőre nem használható együtt!\n"
 
 #, fuzzy, c-format
-msgid "digest algorithm '%s' may not be used in %s mode\n"
-msgstr ""
-"Lehet, hogy nem használhatja \"%s\" kivonatoló algoritmust %s módban!\n"
-
-#, fuzzy, c-format
 msgid "compression algorithm '%s' may not be used in %s mode\n"
 msgstr "Lehet, hogy nem használhatja \"%s\" tömörítő algoritmust %s módban!\n"
 
@@ -3731,6 +3736,15 @@ msgid "Nothing to sign.\n"
 msgstr "Nincs mit aláírni a %08lX kulccsal!\n"
 
 #, fuzzy, c-format
+msgid "Not signed by you.\n"
+msgstr "   aláírva %08lX által %s%s időpontban.\n"
+
+#, fuzzy, c-format
+#| msgid "checking created signature failed: %s\n"
+msgid "revoking the key signature failed: %s\n"
+msgstr "A létrehozott aláírás ellenőrzése sikertelen: %s.\n"
+
+#, fuzzy, c-format
 msgid "'%s' is not a valid expiration time\n"
 msgstr "%s nem érvényes karakterkiosztás!\n"
 
@@ -4038,10 +4052,6 @@ msgstr "Biztos benne, hogy mégis visszavonja? (i/N) "
 msgid "Create a revocation certificate for this signature? (y/N) "
 msgstr "Csináljunk egy visszavonó igazolást ehhez az aláíráshoz? (i/N) "
 
-#, fuzzy
-msgid "Not signed by you.\n"
-msgstr "   aláírva %08lX által %s%s időpontban.\n"
-
 #, fuzzy, c-format
 msgid "You have signed these user IDs on key %s:\n"
 msgstr "Ön aláírta a következő felhasználóazonosítókat:\n"
index 17f5010..abc8479 100644 (file)
--- a/po/id.po
+++ b/po/id.po
@@ -1783,6 +1783,16 @@ msgid "WARNING: '%s' is an empty file\n"
 msgstr "PERINGATAN: `%s' adalah file kosong\n"
 
 #, fuzzy, c-format
+msgid "cipher algorithm '%s' may not be used in %s mode\n"
+msgstr ""
+"anda tidak boleh menggunakan algoritma cipher \"%s\" saat dalam mode %s.\n"
+
+#, fuzzy, c-format
+msgid "digest algorithm '%s' may not be used in %s mode\n"
+msgstr ""
+"anda tidak boleh menggunakan algoritma digest \"%s\" saat dalam mode %s.\n"
+
+#, fuzzy, c-format
 #| msgid "reading from `%s'\n"
 msgid "reading from '%s'\n"
 msgstr "Membaca dari `%s'\n"
@@ -1793,11 +1803,6 @@ msgid ""
 msgstr "memaksa cipher simetrik %s (%d) melanggar preferensi penerima\n"
 
 #, fuzzy, c-format
-msgid "cipher algorithm '%s' may not be used in %s mode\n"
-msgstr ""
-"anda tidak boleh menggunakan algoritma cipher \"%s\" saat dalam mode %s.\n"
-
-#, fuzzy, c-format
 msgid "WARNING: key %s is not suitable for encryption in %s mode\n"
 msgstr "WARNING: \"%s\" adalah opsi terdepresiasi\n"
 
@@ -2080,6 +2085,11 @@ msgstr "tandai kunci"
 msgid "quickly sign a key locally"
 msgstr "tandai kunci secara lokal"
 
+#, fuzzy
+#| msgid "generate a new key pair"
+msgid "quickly revoke a key signature"
+msgstr "buat sepasang kunci baru"
+
 msgid "sign a key"
 msgstr "tandai kunci"
 
@@ -2566,11 +2576,6 @@ msgid "%s does not yet work with %s\n"
 msgstr "%s belum dapat dipakai dengan %s\n"
 
 #, fuzzy, c-format
-msgid "digest algorithm '%s' may not be used in %s mode\n"
-msgstr ""
-"anda tidak boleh menggunakan algoritma digest \"%s\" saat dalam mode %s.\n"
-
-#, fuzzy, c-format
 msgid "compression algorithm '%s' may not be used in %s mode\n"
 msgstr ""
 "anda tidak boleh menggunakan algoritma kompresi \"%s\" saat dalam mode %s.\n"
@@ -3736,6 +3741,15 @@ msgid "Nothing to sign.\n"
 msgstr "Tidak ada yang ditandai dengan kunci %08lX\n"
 
 #, fuzzy, c-format
+msgid "Not signed by you.\n"
+msgstr "   ditandai oleh %08lX pada %s%s\n"
+
+#, fuzzy, c-format
+#| msgid "checking created signature failed: %s\n"
+msgid "revoking the key signature failed: %s\n"
+msgstr "Gagal memeriksa signature yang dibuat: %s\n"
+
+#, fuzzy, c-format
 msgid "'%s' is not a valid expiration time\n"
 msgstr "%s bukanlah set karakter yang valid\n"
 
@@ -4048,10 +4062,6 @@ msgstr "Anda tetap ingin membatalkannya? (y/n) "
 msgid "Create a revocation certificate for this signature? (y/N) "
 msgstr "Membuat sertifikat pembatalan untuk signature ini? (y/N)"
 
-#, fuzzy
-msgid "Not signed by you.\n"
-msgstr "   ditandai oleh %08lX pada %s%s\n"
-
 #, fuzzy, c-format
 msgid "You have signed these user IDs on key %s:\n"
 msgstr "Anda telah menandai ID user ini:\n"
index 3c5f606..e90b58b 100644 (file)
--- a/po/it.po
+++ b/po/it.po
@@ -1,22 +1,23 @@
 # GnuPG italian translation
 # Copyright (C) 1998, 1999, 2001, 2002 Free Software Foundation, Inc.
 # Marco d'Itri <md@linux.it>, 1998, 1999, 2001, 2002.
-#
 msgid ""
 msgstr ""
-"Project-Id-Version: gnupg 1.1.92\n"
+"Project-Id-Version: GNU gnupg 2.2.23\n"
 "Report-Msgid-Bugs-To: translations@gnupg.org\n"
-"PO-Revision-Date: 2008-05-26 12:02+0200\n"
-"Last-Translator: Marco d'Itri <md@linux.it>\n"
-"Language-Team: Italian <tp@lists.linux.it>\n"
-"Language: it\n"
+"PO-Revision-Date: 2020-10-10 19:54+0200\n"
+"Last-Translator: Denis <student@alice.it>\n"
+"Language-Team: \n"
+"Language: it_IT\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 2.4.1\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "failed to acquire the pinentry lock: %s\n"
-msgstr "inizializzazione del trustdb fallita: %s\n"
+msgstr "impossibile acquisire il blocco pinentry: %s\n"
 
 #. TRANSLATORS: These are labels for buttons etc used in
 #. Pinentries.  An underscore indicates that the next letter
@@ -25,39 +26,36 @@ msgstr "inizializzazione del trustdb fallita: %s\n"
 #. the second vertical bar.  Note that gpg-agent has been set to
 #. utf-8 so that the strings are in the expected encoding.
 msgid "|pinentry-label|_OK"
-msgstr ""
+msgstr "|pinentry-label|_OK"
 
 msgid "|pinentry-label|_Cancel"
-msgstr ""
+msgstr "|pinentry-label|_Cancel"
 
 msgid "|pinentry-label|_Yes"
-msgstr ""
+msgstr "|pinentry-label|_Yes"
 
 msgid "|pinentry-label|_No"
-msgstr ""
+msgstr "|pinentry-label|_No"
 
 msgid "|pinentry-label|PIN:"
-msgstr ""
+msgstr "|pinentry-label|PIN:"
 
 msgid "|pinentry-label|_Save in password manager"
-msgstr ""
+msgstr "|pinentry-label|_Save in gestione password"
 
-#, fuzzy
 msgid "Do you really want to make your passphrase visible on the screen?"
-msgstr "Vuoi davvero cancellare le chiavi selezionate? "
+msgstr "Vuoi davvero rendere la tua passphrase visibile sullo schermo?"
 
 msgid "|pinentry-tt|Make passphrase visible"
-msgstr ""
+msgstr "|pinentry-tt|Rendere visibile la passphrase"
 
-#, fuzzy
-#| msgid "invalid passphrase"
 msgid "|pinentry-tt|Hide passphrase"
-msgstr "passphrase non valida"
+msgstr "|pinentry-tt|Nascondi passphrase"
 
 #. TRANSLATORS: This string is displayed by Pinentry as the label
 #. for the quality bar.
 msgid "Quality:"
-msgstr ""
+msgstr "Qualità:"
 
 #. TRANSLATORS: This string is a tooltip, shown by pinentry when
 #. hovering over the quality bar.  Please use an appropriate
@@ -66,28 +64,30 @@ msgstr ""
 #. translate this entry, a default english text (see source)
 #. will be used.
 msgid "pinentry.qualitybar.tooltip"
-msgstr ""
+msgstr "pinentry.qualitybar.tooltip"
 
 msgid ""
 "Please enter your PIN, so that the secret key can be unlocked for this "
 "session"
 msgstr ""
+"Inserisci il tuo PIN, in modo che la chiave segreta possa essere sbloccata "
+"per questa sessione"
 
-#, fuzzy
 msgid ""
 "Please enter your passphrase, so that the secret key can be unlocked for "
 "this session"
-msgstr "Inserisci la passphrase, cioè una frase segreta \n"
+msgstr ""
+"Inserisci la tua passphrase, in modo che la chiave segreta possa essere "
+"sbloccata per questa sessione"
 
 msgid "PIN:"
-msgstr ""
+msgstr "PIN:"
 
-#, fuzzy
 msgid "Passphrase:"
-msgstr "passphrase errata"
+msgstr "Passphrase:"
 
 msgid "does not match - try again"
-msgstr ""
+msgstr "non corrisponde - riprova"
 
 #. TRANSLATORS: The string is appended to an error message in
 #. the pinentry.  The %s is the actual error message, the
@@ -98,229 +98,217 @@ msgstr ""
 #. two %d give the current and maximum number of tries.
 #, c-format
 msgid "SETERROR %s (try %d of %d)"
-msgstr ""
+msgstr "SETERROR %s (provare %d di %d)"
 
 msgid "Repeat:"
-msgstr ""
+msgstr "Ripeti :"
 
-#, fuzzy
 msgid "PIN too long"
-msgstr "riga troppo lunga\n"
+msgstr "PIN troppo lungo"
 
-#, fuzzy
 msgid "Passphrase too long"
-msgstr "passphrase troppo lunga\n"
+msgstr "Passphrase troppo lunga"
 
-#, fuzzy
 msgid "Invalid characters in PIN"
-msgstr "Carattere non valido nel nome\n"
+msgstr "Caratteri non validi nel PIN"
 
 msgid "PIN too short"
-msgstr ""
+msgstr "PIN troppo corto"
 
-#, fuzzy
 msgid "Bad PIN"
-msgstr "MPI danneggiato"
+msgstr "PIN non valido"
 
-#, fuzzy
 msgid "Bad Passphrase"
-msgstr "passphrase errata"
+msgstr "Passphrase non valido"
 
-#, fuzzy, c-format
+#, c-format
 msgid "ssh keys greater than %d bits are not supported\n"
-msgstr "l'algoritmo di protezione %d%s non è gestito\n"
+msgstr "le chiavi ssh maggiori di %d bit non sono supportate\n"
 
-#, fuzzy, c-format
-#| msgid "can't create `%s': %s\n"
+#, c-format
 msgid "can't create '%s': %s\n"
-msgstr "impossibile creare `%s': %s\n"
+msgstr "impossibile creare '%s': %s\n"
 
-#, fuzzy, c-format
-#| msgid "can't open `%s': %s\n"
+#, c-format
 msgid "can't open '%s': %s\n"
-msgstr "impossibile aprire `%s': %s\n"
+msgstr "impossibile aprire '%s': %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error getting serial number of card: %s\n"
-msgstr "errore nella creazione della passhprase: %s\n"
+msgstr "errore durante il recupero del numero di serie della scheda: %s\n"
 
 #, c-format
 msgid "detected card with S/N: %s\n"
-msgstr ""
+msgstr "scheda rilevata con S/N: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "no authentication key for ssh on card: %s\n"
-msgstr "errore scrivendo il portachiavi segreto `%s': %s\n"
+msgstr "nessuna chiave di autenticazione per ssh sulla scheda: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "no suitable card key found: %s\n"
-msgstr "non è stato trovato un portachiavi segreto scrivibile: %s\n"
+msgstr "nessuna chiave della scheda adatta trovata: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error getting list of cards: %s\n"
-msgstr "errore nella creazione della passhprase: %s\n"
+msgstr "errore durante il recupero dell'elenco delle schede: %s\n"
 
 #, c-format
 msgid ""
 "An ssh process requested the use of key%%0A  %s%%0A  (%s)%%0ADo you want to "
 "allow this?"
 msgstr ""
+"Un processo ssh ha richiesto l'utilizzo della chiave%%0A  %s%%0A  (%s)%%0ASi "
+"desidera consentire questa operazione?"
 
 msgid "Allow"
-msgstr ""
+msgstr "Permettere"
 
 msgid "Deny"
-msgstr ""
+msgstr "Rifiutare"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Please enter the passphrase for the ssh key%%0A  %F%%0A  (%c)"
-msgstr "Inserisci la passphrase, cioè una frase segreta \n"
+msgstr "Immettere la passphrase per la chiave ssh%%0A %F%%0A (%c)"
 
-#, fuzzy
 msgid "Please re-enter this passphrase"
-msgstr "cambia la passphrase"
+msgstr "Inserisci di nuovo questa passphrase"
 
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "Please enter a passphrase to protect the received secret key%%0A   %s%%0A   "
 "%s%%0Awithin gpg-agent's key storage"
-msgstr "Inserisci la passphrase, cioè una frase segreta \n"
+msgstr ""
+"Immettere una passphrase per proteggere la chiave segreta ricevuta%%0A %s"
+"%%0A %s%%0A all'interno dell'archivio chiavi dell'agente gpg"
 
-#, fuzzy, c-format
+#, c-format
 msgid "failed to create stream from socket: %s\n"
-msgstr "%s: creazione della tabella hash fallita: %s\n"
+msgstr "impossibile creare il flusso dal socket: %s\n"
 
 msgid "Please insert the card with serial number"
-msgstr ""
+msgstr "Inserire la scheda con il numero di serie"
 
 msgid "Please remove the current card and insert the one with serial number"
-msgstr ""
+msgstr "Rimuovere la carta corrente e inserire quella con il numero di serie"
 
 msgid "Admin PIN"
-msgstr ""
+msgstr "PIN amministratore"
 
 #. TRANSLATORS: A PUK is the Personal Unblocking Code
 #. used to unblock a PIN.
 msgid "PUK"
-msgstr ""
+msgstr "PUK"
 
 msgid "Reset Code"
-msgstr ""
+msgstr "Resetta codice"
 
 msgid "Push ACK button on card/token."
-msgstr ""
+msgstr "Premere il pulsante ACK sulla scheda/token."
 
 msgid "Use the reader's pinpad for input."
-msgstr ""
+msgstr "Utilizzare il pinpad del lettore per l'input."
 
-#, fuzzy
 msgid "Repeat this Reset Code"
-msgstr "Ripeti la passphrase: "
+msgstr "Ripeti questo codice di reimpostazione"
 
-#, fuzzy
 msgid "Repeat this PUK"
-msgstr "Ripeti la passphrase: "
+msgstr "Ripeti questo PUK"
 
-#, fuzzy
 msgid "Repeat this PIN"
-msgstr "Ripeti la passphrase: "
+msgstr "Ripeti questo PIN"
 
-#, fuzzy
 msgid "Reset Code not correctly repeated; try again"
-msgstr "passphrase non ripetuta correttamente; prova ancora"
+msgstr "Reimpostare il codice non ripetuto correttamente; Riprova"
 
-#, fuzzy
 msgid "PUK not correctly repeated; try again"
-msgstr "passphrase non ripetuta correttamente; prova ancora"
+msgstr "PUK non ripetuto correttamente; Riprova"
 
-#, fuzzy
 msgid "PIN not correctly repeated; try again"
-msgstr "passphrase non ripetuta correttamente; prova ancora"
+msgstr "PIN non ripetuto correttamente; Riprova"
 
 #, c-format
 msgid "Please enter the PIN%s%s%s to unlock the card"
-msgstr ""
+msgstr "Immettere il PIN%s%s%s per sbloccare la scheda"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error creating temporary file: %s\n"
-msgstr "errore nella creazione della passhprase: %s\n"
+msgstr "errore durante la creazione del file temporaneo: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error writing to temporary file: %s\n"
-msgstr "scrittura in `%s'\n"
+msgstr "errore durante la scrittura nel file temporaneo: %s\n"
 
-#, fuzzy
 msgid "Enter new passphrase"
-msgstr "Inserisci la passphrase\n"
+msgstr "Inserisci la nuova passphrase"
 
-#, fuzzy
 msgid "Take this one anyway"
-msgstr "Uso lo stesso questa chiave? "
+msgstr "Prendi questo comunque"
 
 #, c-format
 msgid ""
 "You have not entered a passphrase!%0AAn empty passphrase is not allowed."
 msgstr ""
+"Non è stata immessa una passphrase!%0AUna passphrase vuota non è consentita."
 
 #, c-format
 msgid ""
 "You have not entered a passphrase - this is in general a bad idea!%0APlease "
 "confirm that you do not want to have any protection on your key."
 msgstr ""
+"Non è stata inserita una passphrase- in generale è una cattiva idea!%0ASi "
+"prega di confermare che non si desidera disporre di alcuna protezione sulla "
+"chiave."
 
 msgid "Yes, protection is not needed"
-msgstr ""
+msgstr "Sì, la protezione non è necessaria"
 
-#, fuzzy, c-format
-#| msgid "Name must be at least 5 characters long\n"
+#, c-format
 msgid "A passphrase should be at least %u character long."
 msgid_plural "A passphrase should be at least %u characters long."
-msgstr[0] "Il nome deve essere lungo almeno 5 caratteri\n"
-msgstr[1] "Il nome deve essere lungo almeno 5 caratteri\n"
+msgstr[0] "Una passphrase deve avere almeno lunga %u carattere."
+msgstr[1] "Una passphrase deve avere almeno lunga %u caratteri."
 
 #, c-format
 msgid "A passphrase should contain at least %u digit or%%0Aspecial character."
 msgid_plural ""
 "A passphrase should contain at least %u digits or%%0Aspecial characters."
 msgstr[0] ""
+"Una passphrase deve contenere almeno %u cifra o%%0Acarattere speciale."
 msgstr[1] ""
+"Una passphrase deve contenere almeno %u cifre o%%0Acaratteri speciali."
 
 #, c-format
 msgid "A passphrase may not be a known term or match%%0Acertain pattern."
 msgstr ""
+"Una passphrase non può essere un termine noto o corrispondere%%0Acertain "
+"modello."
 
 msgid "Warning: You have entered an insecure passphrase."
-msgstr ""
+msgstr "Avviso: è stata immessa una passphrase non sicura."
 
-#, fuzzy, c-format
+#, c-format
 msgid "Please enter the passphrase to%0Aprotect your new key"
-msgstr ""
-"Ti serve una passphrase per proteggere la tua chiave segreta.\n"
-"\n"
+msgstr "Immettere la passphrase a%0Aproteggere la nuova chiave"
 
-#, fuzzy
 msgid "Please enter the new passphrase"
-msgstr "cambia la passphrase"
+msgstr "Inserisci la nuova passphrase"
 
-#, fuzzy
 msgid ""
 "@Options:\n"
 " "
 msgstr ""
-"@\n"
-"Opzioni:\n"
+"@Optioni:\n"
 " "
 
 msgid "run in daemon mode (background)"
-msgstr ""
+msgstr "eseguire in modalità daemon (sfondo)"
 
 msgid "run in server mode (foreground)"
-msgstr ""
+msgstr "eseguire in modalità server (in primo piano)"
 
-#, fuzzy
-#| msgid "Key is superseded"
 msgid "run in supervised mode"
-msgstr "Questa chiave è stata sostituita"
+msgstr "eseguire in modalità supervisionata"
 
 msgid "verbose"
 msgstr "prolisso"
@@ -329,208 +317,194 @@ msgid "be somewhat more quiet"
 msgstr "meno prolisso"
 
 msgid "sh-style command output"
-msgstr ""
+msgstr "uscita del comando sh-stile"
 
 msgid "csh-style command output"
-msgstr ""
+msgstr "uscita del comando in csh-stile"
 
-#, fuzzy
 msgid "|FILE|read options from FILE"
-msgstr "|FILE|carica il modulo di estensione FILE"
+msgstr "|FILE|opzioni di lettura da FILE"
 
 msgid "do not detach from the console"
-msgstr ""
+msgstr "non scollegarsi dalla console"
 
-#, fuzzy
 msgid "use a log file for the server"
-msgstr "cerca delle chiavi su un keyserver"
+msgstr "utilizzare un file di registro per il server"
 
 msgid "|PGM|use PGM as the PIN-Entry program"
-msgstr ""
+msgstr "| PGM|utilizzare PGM come programma PIN-Entry"
 
 msgid "|PGM|use PGM as the SCdaemon program"
-msgstr ""
+msgstr "| PGM| utilizzare PGM come programma SCdaemon"
 
-#, fuzzy
 msgid "do not use the SCdaemon"
-msgstr "aggiorna il database della fiducia"
+msgstr "non utilizzare il SCdaemon"
 
-#, fuzzy
-#| msgid "|NAME|set terminal charset to NAME"
 msgid "|NAME|accept some commands via NAME"
-msgstr "|NOME|imposta NOME come set di caratteri del terminale"
+msgstr "|NAME|accettare alcuni comandi tramite NAME"
 
 msgid "ignore requests to change the TTY"
-msgstr ""
+msgstr "ignorare le richieste di modifica del TTY"
 
 msgid "ignore requests to change the X display"
-msgstr ""
+msgstr "ignorare le richieste di modifica della visualizzazione X"
 
 msgid "|N|expire cached PINs after N seconds"
-msgstr ""
+msgstr "|N|scadenza PIN memorizzati nella cache dopo N secondi"
 
 msgid "do not use the PIN cache when signing"
-msgstr ""
+msgstr "non utilizzare la cache PIN durante la firma"
 
-#, fuzzy
 msgid "disallow the use of an external password cache"
-msgstr "errore nella creazione della passhprase: %s\n"
+msgstr "non consentire l'uso di una cache di password esterna"
 
 msgid "disallow clients to mark keys as \"trusted\""
 msgstr ""
+"non consentire ai client di contrassegnare le chiavi come \"attendibili\""
 
-#, fuzzy
 msgid "allow presetting passphrase"
-msgstr "errore nella creazione della passhprase: %s\n"
+msgstr "consentire la preimpostazione della passphrase"
 
 msgid "disallow caller to override the pinentry"
-msgstr ""
+msgstr "non consentire al chiamante di eseguire l'override del pinentry"
 
 msgid "allow passphrase to be prompted through Emacs"
-msgstr ""
+msgstr "consentire la passphrase tramite Emacs"
 
-#, fuzzy
-#| msgid "not supported"
 msgid "enable ssh support"
-msgstr "non gestito"
+msgstr "abilitare il supporto ssh"
 
 msgid "|ALGO|use ALGO to show ssh fingerprints"
-msgstr ""
+msgstr "|ALGO|usa ALGO per mostrare le impronte digitali ssh"
 
-#, fuzzy
-#| msgid "not supported"
 msgid "enable putty support"
-msgstr "non gestito"
+msgstr "abilitare il supporto putty"
 
 #. TRANSLATORS: @EMAIL@ will get replaced by the actual bug
 #. reporting address.  This is so that we can change the
 #. reporting address without breaking the translations.
-#, fuzzy
 msgid "Please report bugs to <@EMAIL@>.\n"
-msgstr "Per favore segnala i bug a <gnupg-bugs@gnu.org>.\n"
+msgstr "Segnalare i bug a <@EMAIL@>.\n"
 
-#, fuzzy
 msgid "Usage: @GPG_AGENT@ [options] (-h for help)"
-msgstr "Uso: gpg [opzioni] [files] (-h per l'aiuto)"
+msgstr "Utilizzo: @GPG_AGENT@ [opzioni] (-h per assistenza)"
 
 msgid ""
 "Syntax: @GPG_AGENT@ [options] [command [args]]\n"
 "Secret key management for @GNUPG@\n"
 msgstr ""
+"Sintassi: @GPG_AGENT@ [opzioni] [comando [args]]\n"
+"Gestione delle chiavi segrete per @GNUPG@\n"
 
 #, c-format
 msgid "invalid debug-level '%s' given\n"
-msgstr ""
+msgstr "'%s' a livello di debug non valido specificato\n"
 
 #, c-format
 msgid "selected digest algorithm is invalid\n"
 msgstr "l'algoritmo di digest selezionato non è valido\n"
 
-#, fuzzy, c-format
-#| msgid "NOTE: no default option file `%s'\n"
+#, c-format
 msgid "Note: no default option file '%s'\n"
-msgstr "NOTA: manca il file `%s' con le opzioni predefinite\n"
+msgstr "Nota: nessun file di opzioni predefinito '%s'\n"
 
-#, fuzzy, c-format
-#| msgid "option file `%s': %s\n"
+#, c-format
 msgid "option file '%s': %s\n"
-msgstr "file con le opzioni `%s': %s\n"
+msgstr "file di opzioni '%s': %s\n"
 
-#, fuzzy, c-format
-#| msgid "reading options from `%s'\n"
+#, c-format
 msgid "reading options from '%s'\n"
-msgstr "lettura delle opzioni da `%s'\n"
+msgstr "opzioni di lettura da '%s'\n"
 
-#, fuzzy, c-format
-#| msgid "WARNING: \"%s\" is a deprecated option\n"
+#, c-format
 msgid "Note: '%s' is not considered an option\n"
-msgstr "ATTENZIONE: \"%s\" è una opzione deprecata\n"
+msgstr "Nota: '%s' non è considerato un'opzione\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "can't create socket: %s\n"
-msgstr "impossibile creare %s: %s\n"
+msgstr "impossibile creare il socket: %s\n"
 
 #, c-format
 msgid "socket name '%s' is too long\n"
-msgstr ""
+msgstr "il nome socket '%s' è troppo lungo\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "a gpg-agent is already running - not starting a new one\n"
-msgstr "gpg-agent non è disponibile in questa sessione\n"
+msgstr "un gpg-agent è già in esecuzione - non iniziare uno nuovo\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error getting nonce for the socket\n"
-msgstr "errore nella creazione della passhprase: %s\n"
+msgstr "errore durante il recupero di un errore per il socket\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error binding socket to '%s': %s\n"
-msgstr "errore leggendo `%s': %s\n"
+msgstr "errore durante l'associazione del socket a '%s': %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "can't set permissions of '%s': %s\n"
-msgstr "ATTENZIONE: i permessi \"%s\" di %s sono insicuri\n"
+msgstr "impossibile impostare le autorizzazioni di '%s': %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "listening on socket '%s'\n"
-msgstr "scrittura della chiave segreta in `%s'\n"
+msgstr "ascolto sul socket '%s'\n"
 
-#, fuzzy, c-format
-#| msgid "can't create directory `%s': %s\n"
+#, c-format
 msgid "can't create directory '%s': %s\n"
-msgstr "impossibile creare la directory `%s': %s\n"
+msgstr "impossibile creare la directory '%s': %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "directory '%s' created\n"
-msgstr "%s: directory creata\n"
+msgstr "directory '%s' creata\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "stat() failed for '%s': %s\n"
-msgstr "trustdb: read fallita (n=%d): %s\n"
+msgstr "stat() non riuscito per '%s': %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "can't use '%s' as home directory\n"
-msgstr "%s: impossibile creare la directory: %s\n"
+msgstr "impossibile utilizzare '%s' come home directory\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error reading nonce on fd %d: %s\n"
-msgstr "errore leggendo `%s': %s\n"
+msgstr "errore durante la lettura del nonce su fd %d: %s\n"
 
 #, c-format
 msgid "handler 0x%lx for fd %d started\n"
-msgstr ""
+msgstr "gestore 0x%lx per fd %d avviato\n"
 
 #, c-format
 msgid "handler 0x%lx for fd %d terminated\n"
-msgstr ""
+msgstr "gestore 0x%lx per fd %d terminato\n"
 
 #, c-format
 msgid "ssh handler 0x%lx for fd %d started\n"
-msgstr ""
+msgstr "gestore ssh 0x%lx per fd %d avviato\n"
 
 #, c-format
 msgid "ssh handler 0x%lx for fd %d terminated\n"
-msgstr ""
+msgstr "gestore ssh 0x%lx per fd %d terminato\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "npth_pselect failed: %s - waiting 1s\n"
-msgstr "aggiornamento della chiave segreta fallito: %s\n"
+msgstr "npth_pselect non riuscito: %s - 1s in attesa\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "%s %s stopped\n"
-msgstr "%s: saltata: %s\n"
+msgstr "%s %s arrestato\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "no gpg-agent running in this session\n"
-msgstr "gpg-agent non è disponibile in questa sessione\n"
+msgstr "nessun gpg-agent in esecuzione in questa sessione\n"
 
-#, fuzzy
 msgid "Usage: gpg-preset-passphrase [options] KEYGRIP (-h for help)\n"
-msgstr "Uso: gpg [opzioni] [files] (-h per l'aiuto)"
+msgstr "Uso: gpg [opzioni] [files] (-h per l'aiuto)\n"
 
 msgid ""
 "Syntax: gpg-preset-passphrase [options] KEYGRIP\n"
 "Password cache maintenance\n"
 msgstr ""
+"Sintassi: gpg-preset-passphrase [opzioni] KEYGRIP\n"
+"Manutenzione della cache delle password\n"
 
 msgid ""
 "@Commands:\n"
@@ -548,73 +522,77 @@ msgstr ""
 "Opzioni:\n"
 " "
 
-#, fuzzy
 msgid "Usage: gpg-protect-tool [options] (-h for help)\n"
-msgstr "Uso: gpg [opzioni] [files] (-h per l'aiuto)"
+msgstr "Utilizzo: gpg-protect-tool [opzioni] (-h per assistenza)\n"
 
 msgid ""
 "Syntax: gpg-protect-tool [options] [args]\n"
 "Secret key maintenance tool\n"
 msgstr ""
+"Sintassi: gpg-protect-tool [opzioni] [args]\n"
+"Strumento di manutenzione della chiave segreta\n"
 
-#, fuzzy
 msgid "Please enter the passphrase to unprotect the PKCS#12 object."
-msgstr "Inserisci la passphrase, cioè una frase segreta \n"
+msgstr ""
+"Immettere la passphrase per rimuovere la protezione dell'oggetto PKCS.12."
 
-#, fuzzy
 msgid "Please enter the passphrase to protect the new PKCS#12 object."
-msgstr "Inserisci la passphrase, cioè una frase segreta \n"
+msgstr "Immettere la passphrase per proteggere il nuovo oggetto PKCS.12."
 
 msgid ""
 "Please enter the passphrase to protect the imported object within the GnuPG "
 "system."
 msgstr ""
+"Immettere la passphrase per proteggere l'oggetto importato all'interno del "
+"sistema GnuPG."
 
-#, fuzzy
 msgid ""
 "Please enter the passphrase or the PIN\n"
 "needed to complete this operation."
-msgstr "Inserisci la passphrase, cioè una frase segreta \n"
+msgstr ""
+"Inserisci la passphrase o il PIN\n"
+"necessario per completare questa operazione."
 
-#, fuzzy, c-format
+#, c-format
 msgid "cancelled\n"
-msgstr "Cancella"
+msgstr "annullato\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error while asking for the passphrase: %s\n"
-msgstr "errore nella creazione della passhprase: %s\n"
+msgstr "errore durante la richiesta della passphrase: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error opening '%s': %s\n"
-msgstr "errore leggendo `%s': %s\n"
+msgstr "errore durante l'apertura di '%s': %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "file '%s', line %d: %s\n"
-msgstr "chiave `%s' non trovata: %s\n"
+msgstr "file '%s', riga %d: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "statement \"%s\" ignored in '%s', line %d\n"
-msgstr "errore di lettura: %s\n"
+msgstr "istruzione \"%s\" ignorata in '%s', riga %d\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "system trustlist '%s' not available\n"
-msgstr "parti della chiave segreta non sono disponibili\n"
+msgstr "elenco di attendibilità del sistema '%s' non disponibile\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "bad fingerprint in '%s', line %d\n"
-msgstr "errore di lettura: %s\n"
+msgstr "impronta digitale non valido in '%s', riga %d\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "invalid keyflag in '%s', line %d\n"
-msgstr "errore: impronta digitale non valida\n"
+msgstr "keyflag non valido in '%s', riga %d\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error reading '%s', line %d: %s\n"
-msgstr "errore leggendo `%s': %s\n"
+msgstr "errore durante la lettura di '%s', riga %d: %s\n"
 
 #, c-format
 msgid "error reading list of trusted root certificates\n"
 msgstr ""
+"errore durante la lettura dell'elenco dei certificati radice attendibili\n"
 
 #. TRANSLATORS: This prompt is shown by the Pinentry
 #. and has one special property: A "%%0A" is used by
@@ -629,13 +607,14 @@ msgid ""
 "Do you ultimately trust%%0A  \"%s\"%%0Ato correctly certify user "
 "certificates?"
 msgstr ""
+"Alla fine ti fidi di %% 0A \"% s\" %%0Aper certificare correttamente i "
+"certificati utente?"
 
-#, fuzzy
 msgid "Yes"
-msgstr "si|sì"
+msgstr "Sì"
 
 msgid "No"
-msgstr ""
+msgstr "No"
 
 #. TRANSLATORS: This prompt is shown by the Pinentry and has
 #. one special property: A "%%0A" is used by Pinentry to
@@ -650,59 +629,67 @@ msgid ""
 "Please verify that the certificate identified as:%%0A  \"%s\"%%0Ahas the "
 "fingerprint:%%0A  %s"
 msgstr ""
+"Verificare che il certificato identificato come:%%0A \"%s\"%%0Al'impronta "
+"digitale:%%0A  %s"
 
 #. TRANSLATORS: "Correct" is the label of a button and intended
 #. to be hit if the fingerprint matches the one of the CA.  The
 #. other button is "the default "Cancel" of the Pinentry.
 msgid "Correct"
-msgstr ""
+msgstr "Corretto"
 
 msgid "Wrong"
-msgstr ""
+msgstr "Sbagliato"
 
 #, c-format
 msgid "Note: This passphrase has never been changed.%0APlease change it now."
 msgstr ""
+"Nota: questa passphrase non è mai stata modificata.%0ASi prega di cambiarlo "
+"ora."
 
 #, c-format
 msgid ""
 "This passphrase has not been changed%%0Asince %.4s-%.2s-%.2s.  Please change "
 "it now."
 msgstr ""
+"Questa passphrase non è stata modificata%%0Ada %.4s-%.2s-%.2s.  Si prega di "
+"cambiarlo ora."
 
-#, fuzzy
 msgid "Change passphrase"
-msgstr "cambia la passphrase"
+msgstr "Modifica passphrase"
 
 msgid "I'll change it later"
-msgstr ""
+msgstr "Lo cambierò più tardi"
 
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "Do you really want to delete the key identified by keygrip%%0A  %s%%0A  %%C"
 "%%0A?"
-msgstr "Vuoi davvero cancellare le chiavi selezionate? "
+msgstr ""
+"Si desidera eliminare la chiave identificata da keygrip%%0A %s%%0A %%C%%0A?"
 
-#, fuzzy
 msgid "Delete key"
-msgstr "abilita una chiave"
+msgstr "Elimina chiave"
 
 msgid ""
 "Warning: This key is also listed for use with SSH!\n"
 "Deleting the key might remove your ability to access remote machines."
 msgstr ""
+"Attenzione: questa chiave è elencata anche per l'uso con SSH!\n"
+"L'eliminazione della chiave potrebbe rimuovere la possibilità di accedere ai "
+"computer remoti."
 
 #, c-format
 msgid "DSA requires the hash length to be a multiple of 8 bits\n"
-msgstr ""
+msgstr "DSA richiede che la lunghezza dell'hash sia un multiplo di 8 bit\n"
 
 #, c-format
 msgid "%s key uses an unsafe (%u bit) hash\n"
-msgstr ""
+msgstr "La chiave %s utilizza un hash unsafe (%u bit)\n"
 
 #, c-format
 msgid "a %zu bit hash is not valid for a %u bit %s key\n"
-msgstr ""
+msgstr "un hash di bit %zu non è valido per una chiave %u bit %s\n"
 
 #, c-format
 msgid "checking created signature failed: %s\n"
@@ -712,89 +699,85 @@ msgstr "controllo della firma creata fallito: %s\n"
 msgid "secret key parts are not available\n"
 msgstr "parti della chiave segreta non sono disponibili\n"
 
-#, fuzzy, c-format
-#| msgid "protection algorithm %d%s is not supported\n"
+#, c-format
 msgid "public key algorithm %d (%s) is not supported\n"
-msgstr "l'algoritmo di protezione %d%s non è gestito\n"
+msgstr "l'algoritmo a chiave pubblica %d (%s) non è supportato\n"
 
-#, fuzzy, c-format
-#| msgid "protection algorithm %d%s is not supported\n"
+#, c-format
 msgid "protection algorithm %d (%s) is not supported\n"
-msgstr "l'algoritmo di protezione %d%s non è gestito\n"
+msgstr "algoritmo di protezione %d (%s) non supportato\n"
 
-#, fuzzy, c-format
-#| msgid "protection algorithm %d%s is not supported\n"
+#, c-format
 msgid "protection hash algorithm %d (%s) is not supported\n"
-msgstr "l'algoritmo di protezione %d%s non è gestito\n"
+msgstr "algoritmo hash di protezione %d (%s) non supportato\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error creating a pipe: %s\n"
-msgstr "errore nella creazione della passhprase: %s\n"
+msgstr "errore durante la creazione di una pipe: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error creating a stream for a pipe: %s\n"
-msgstr "errore nella creazione della passhprase: %s\n"
+msgstr "errore durante la creazione di un flusso per una pipe: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error forking process: %s\n"
-msgstr "errore leggendo `%s': %s\n"
+msgstr "errore durante il processo di forking: %s\n"
 
 #, c-format
 msgid "waiting for process %d to terminate failed: %s\n"
-msgstr ""
+msgstr "in attesa della terminazione del processo %d non riuscita: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error running '%s': probably not installed\n"
-msgstr "errore leggendo `%s': %s\n"
+msgstr "errore durante l'esecuzione di '%s': probabilmente non installato\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error running '%s': exit status %d\n"
-msgstr "errore leggendo `%s': %s\n"
+msgstr "errore durante l'esecuzione di '%s': stato di uscita %d\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error running '%s': terminated\n"
-msgstr "errore leggendo `%s': %s\n"
+msgstr "errore durante l'esecuzione di '%s': terminato\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "waiting for processes to terminate failed: %s\n"
-msgstr "aggiornamento fallito: %s\n"
+msgstr "attesa della terminazione dei processi non riuscita: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error getting exit code of process %d: %s\n"
-msgstr "errore scrivendo il portachiavi segreto `%s': %s\n"
+msgstr "errore durante l'osando di fine del processo %d: %s\n"
 
-#, fuzzy, c-format
-#| msgid "can't connect to `%s': %s\n"
+#, c-format
 msgid "can't connect to '%s': %s\n"
-msgstr "impossibile connettersi a `%s': %s\n"
+msgstr "impossibile connettersi a '%s': %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "problem setting the gpg-agent options\n"
-msgstr "problema con l'agent: ha restituito 0x%lx\n"
+msgstr "problema durante l'impostazione delle opzioni gpg-agent\n"
 
 #, c-format
 msgid "can't disable core dumps: %s\n"
 msgstr "impossibile disabilitare i core dump: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Warning: unsafe ownership on %s \"%s\"\n"
-msgstr "ATTENZIONE: il proprietario \"%s\" di %s è insicuro\n"
+msgstr "Avviso: proprietà non sicura su %s \"%s\"\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Warning: unsafe permissions on %s \"%s\"\n"
-msgstr "ATTENZIONE: i permessi \"%s\" di %s sono insicuri\n"
+msgstr "Avviso: autorizzazioni non sicure su %s \"%s\"\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "waiting for file '%s' to become accessible ...\n"
-msgstr "aggiornamento fallito: %s\n"
+msgstr "in attesa che il file '%s' diventi accessibile …\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "renaming '%s' to '%s' failed: %s\n"
-msgstr "creazione dell'armatura fallita: %s\n"
+msgstr "ridenominazione di '%s' in '%s' non riuscita: %s\n"
 
 #. TRANSLATORS: See doc/TRANSLATE about this string.
 msgid "yes"
-msgstr "si|sì"
+msgstr "sì"
 
 msgid "yY"
 msgstr "sS"
@@ -808,356 +791,318 @@ msgstr "nN"
 
 #. TRANSLATORS: See doc/TRANSLATE about this string.
 msgid "quit"
-msgstr "quit"
+msgstr "esci"
 
 msgid "qQ"
 msgstr "qQ"
 
 #. TRANSLATORS: See doc/TRANSLATE about this string.
 msgid "okay|okay"
-msgstr ""
+msgstr "okay|okay"
 
 #. TRANSLATORS: See doc/TRANSLATE about this string.
 msgid "cancel|cancel"
-msgstr ""
+msgstr "cancella|cancella"
 
 msgid "oO"
-msgstr ""
+msgstr "oO"
 
-#, fuzzy
 msgid "cC"
-msgstr "c"
+msgstr "cC"
 
 #, c-format
 msgid "out of core in secure memory while allocating %lu bytes"
 msgstr ""
+"fuori dal nucleo nella memoria sicura durante l'allocazione di %lu byte"
 
 #, c-format
 msgid "out of core while allocating %lu bytes"
-msgstr ""
+msgstr "fuori dal core durante l'allocazione di %lu byte"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error allocating enough memory: %s\n"
-msgstr "errore creando il portachiavi `%s': %s\n"
+msgstr "errore durante l'allocazione di memoria sufficiente: %s\n"
 
 #, c-format
 msgid "%s:%u: obsolete option \"%s\" - it has no effect\n"
-msgstr ""
+msgstr "%s:%u: opzione obsoleta \"%s\" - non ha effetto\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "WARNING: \"%s%s\" is an obsolete option - it has no effect\n"
-msgstr "ATTENZIONE: \"%s\" è una opzione deprecata\n"
+msgstr "AVVISO: \"%s%s\" è un'opzione obsoleta - non ha alcun effetto\n"
 
 #, c-format
 msgid "unknown debug flag '%s' ignored\n"
-msgstr ""
+msgstr "flag di debug sconosciuto '%s' ignorato\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "waiting for the %s to come up ... (%ds)\n"
-msgstr "aggiornamento fallito: %s\n"
+msgstr "in attesa che venga in corso il %s... (%ds)\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "connection to %s established\n"
-msgstr "impossibile fare questo in modo batch\n"
+msgstr "connessione a %s stabilita\n"
 
 #, c-format
 msgid "no running gpg-agent - starting '%s'\n"
-msgstr ""
+msgstr "nessun gpg-agent in esecuzione - avvio '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "connection to agent is in restricted mode\n"
-msgstr "impossibile fare questo in modo batch\n"
+msgstr "connessione all'agente è in modalità limitata\n"
 
 #, c-format
 msgid "no running Dirmngr - starting '%s'\n"
-msgstr ""
+msgstr "nessun Dirmngr in esecuzione - avvio di '%s'\n"
 
 #. TRANSLATORS: Copy the prefix between the vertical bars
 #. verbatim.  It will not be printed.
 msgid "|audit-log-result|Good"
-msgstr ""
+msgstr "-audit-log-result|Buono"
 
 msgid "|audit-log-result|Bad"
-msgstr ""
+msgstr "-audit-log-result|Cattivo"
 
 msgid "|audit-log-result|Not supported"
-msgstr ""
+msgstr "-audit-log-result|Non supportato"
 
-#, fuzzy
 msgid "|audit-log-result|No certificate"
-msgstr "certificato danneggiato"
+msgstr "-audit-log-result|Nessun certificato"
 
-#, fuzzy
 msgid "|audit-log-result|Not enabled"
-msgstr "certificato danneggiato"
+msgstr "|-audit-log-result|Non abilitato"
 
 msgid "|audit-log-result|Error"
-msgstr ""
+msgstr "-audit-log-result|Errore"
 
-#, fuzzy
 msgid "|audit-log-result|Not used"
-msgstr "certificato danneggiato"
+msgstr "|audit-log-result| Non utilizzato"
 
-#, fuzzy
 msgid "|audit-log-result|Okay"
-msgstr "certificato danneggiato"
+msgstr "|audit-log-result|ok"
 
-#, fuzzy
 msgid "|audit-log-result|Skipped"
-msgstr "certificato danneggiato"
+msgstr "|audit-log-result|Saltato"
 
-#, fuzzy
 msgid "|audit-log-result|Some"
-msgstr "certificato danneggiato"
+msgstr "|audit-log-result|alcuni"
 
-#, fuzzy
 msgid "Certificate chain available"
-msgstr "certificato danneggiato"
+msgstr "Catena di certificati disponibile"
 
-#, fuzzy
 msgid "root certificate missing"
-msgstr "certificato danneggiato"
+msgstr "certificato radice mancante"
 
 msgid "Data encryption succeeded"
-msgstr ""
+msgstr "Crittografia dei dati riuscita"
 
-#, fuzzy
 msgid "Data available"
-msgstr "Chiave disponibile presso: "
+msgstr "Dati disponibili"
 
-#, fuzzy
 msgid "Session key created"
-msgstr "%s: portachiavi creato\n"
+msgstr "Chiave di sessione creata"
 
-#, fuzzy, c-format
+#, c-format
 msgid "algorithm: %s"
-msgstr "armatura: %s\n"
+msgstr "algoritmo: %s"
 
-#, fuzzy, c-format
+#, c-format
 msgid "unsupported algorithm: %s"
-msgstr ""
-"\n"
-"Algoritmi gestiti:\n"
+msgstr "algoritmo non supportato: %s"
 
-#, fuzzy
 msgid "seems to be not encrypted"
-msgstr "non cifrato"
+msgstr "sembra non essere criptato"
 
 msgid "Number of recipients"
-msgstr ""
+msgstr "Numero di destinatari"
 
 #, c-format
 msgid "Recipient %d"
-msgstr ""
+msgstr "Destinatario %d"
 
 msgid "Data signing succeeded"
-msgstr ""
+msgstr "Firma dei dati riuscita"
 
-#, fuzzy, c-format
+#, c-format
 msgid "data hash algorithm: %s"
-msgstr "algoritmo di hash non valido `%s'\n"
+msgstr "algoritmo hash dati: %s"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Signer %d"
-msgstr "Firma scaduta il %s\n"
+msgstr "Firmatario %d"
 
-#, fuzzy, c-format
+#, c-format
 msgid "attr hash algorithm: %s"
-msgstr "algoritmo di hash non valido `%s'\n"
+msgstr "algoritmo hash attr: %s"
 
 msgid "Data decryption succeeded"
-msgstr ""
+msgstr "Decrittografia dei dati riuscita"
 
-#, fuzzy
 msgid "Encryption algorithm supported"
-msgstr "l'algoritmo di protezione %d%s non è gestito\n"
+msgstr "Algoritmo di crittografia supportato"
 
-#, fuzzy
 msgid "Data verification succeeded"
-msgstr "verifica della firma soppressa\n"
+msgstr "Verifica dei dati riuscita"
 
-#, fuzzy
 msgid "Signature available"
-msgstr "Firma scaduta il %s\n"
+msgstr "Firma disponibile"
 
-#, fuzzy
 msgid "Parsing data succeeded"
-msgstr "Firma valida da \""
+msgstr "Analisi dei dati riuscita"
 
-#, fuzzy, c-format
+#, c-format
 msgid "bad data hash algorithm: %s"
-msgstr "algoritmo di hash non valido `%s'\n"
+msgstr "algoritmo hash dei dati non valido: %s"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Signature %d"
-msgstr "Firma scaduta il %s\n"
+msgstr "Firma %d"
 
-#, fuzzy
 msgid "Certificate chain valid"
-msgstr "Questa chiave è scaduta!"
+msgstr "Catena di certificati valida"
 
-#, fuzzy
 msgid "Root certificate trustworthy"
-msgstr "certificato danneggiato"
+msgstr "Certificato radice attendibile"
 
-#, fuzzy
 msgid "no CRL found for certificate"
-msgstr "certificato danneggiato"
+msgstr "nessun CRL trovato per il certificato"
 
-#, fuzzy
 msgid "the available CRL is too old"
-msgstr "Chiave disponibile presso: "
+msgstr "il CRL disponibile è troppo vecchio"
 
-#, fuzzy
 msgid "CRL/OCSP check of certificates"
-msgstr "certificato danneggiato"
+msgstr "Controllo CRL/OCSP dei certificati"
 
-#, fuzzy
 msgid "Included certificates"
-msgstr "certificato danneggiato"
+msgstr "Certificati inclusi"
 
 msgid "No audit log entries."
-msgstr ""
+msgstr "Nessuna voce del log di controllo."
 
-#, fuzzy
 msgid "Unknown operation"
-msgstr "versione sconosciuta"
+msgstr "Operazione sconosciuta"
 
 msgid "Gpg-Agent usable"
-msgstr ""
+msgstr "Gpg-Agente utilizzabile"
 
 msgid "Dirmngr usable"
-msgstr ""
+msgstr "Dirmngr utilizzabile"
 
-#, fuzzy, c-format
+#, c-format
 msgid "No help available for '%s'."
-msgstr "Non è disponibile un aiuto per `%s'"
+msgstr "Nessuna Guida disponibile per '%s'."
 
-#, fuzzy
 msgid "ignoring garbage line"
-msgstr "errore nella riga della coda\n"
+msgstr "ignorando la linea spazzatura"
 
-#, fuzzy
 msgid "[none]"
-msgstr "sconosciuto"
+msgstr "[nessuno]"
 
-#, fuzzy, c-format
+#, c-format
 msgid "invalid radix64 character %02x skipped\n"
-msgstr "Carattere radix64 non valido %02x saltato\n"
+msgstr "carattere radix64 non valido %02x ignorato\n"
 
-#, fuzzy
 msgid "argument not expected"
-msgstr "scrittura della chiave segreta in `%s'\n"
+msgstr "argomento non previsto"
 
-#, fuzzy
 msgid "read error"
-msgstr "errore durante la lettura del file"
+msgstr "errore di lettura"
 
-#, fuzzy
 msgid "keyword too long"
-msgstr "riga troppo lunga\n"
+msgstr "parola chiave troppo lunga"
 
-#, fuzzy
 msgid "missing argument"
-msgstr "argomento non valido"
+msgstr "argomento mancante"
 
-#, fuzzy
-#| msgid "invalid armor"
 msgid "invalid argument"
-msgstr "armatura non valida"
+msgstr "argomento non valido"
 
-#, fuzzy
 msgid "invalid command"
-msgstr "comandi in conflitto\n"
+msgstr "comando non valido"
 
-#, fuzzy
 msgid "invalid alias definition"
-msgstr "opzioni di importazione non valide\n"
+msgstr "definizione di alias non valida"
 
-# ??? (Md)
-#, fuzzy
 msgid "out of core"
-msgstr "non esaminato"
+msgstr "fuori dal nucleo"
 
-#, fuzzy
 msgid "invalid option"
-msgstr "opzioni di importazione non valide\n"
+msgstr "opzione non valida"
 
 #, c-format
 msgid "missing argument for option \"%.50s\"\n"
-msgstr ""
+msgstr "argomento mancante per l'opzione \"%.50s\"\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "invalid argument for option \"%.50s\"\n"
-msgstr "opzioni di importazione non valide\n"
+msgstr "argomento non valido per l'opzione \"%.50s\"\n"
 
 #, c-format
 msgid "option \"%.50s\" does not expect an argument\n"
-msgstr ""
+msgstr "l'opzione \"%.50s\" non prevede un argomento\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "invalid command \"%.50s\"\n"
-msgstr "Comando non valido  (prova \"help\")\n"
+msgstr "comando non valido \"%.50s\"\n"
 
 #, c-format
 msgid "option \"%.50s\" is ambiguous\n"
-msgstr ""
+msgstr "l'opzione \"%.50s\" è ambigua\n"
 
 #, c-format
 msgid "command \"%.50s\" is ambiguous\n"
-msgstr ""
+msgstr "il comando \"%.50s\" è ambiguo\n"
 
-# ??? (Md)
-#, fuzzy, c-format
+#, c-format
 msgid "out of core\n"
-msgstr "non esaminato"
+msgstr "fuori dal nucleo\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "invalid option \"%.50s\"\n"
-msgstr "opzioni di importazione non valide\n"
+msgstr "opzione non valida \"%.50s\"\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "conversion from '%s' to '%s' not available\n"
-msgstr "creazione dell'armatura fallita: %s\n"
+msgstr "conversione da '%s' a '%s' non disponibile\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "iconv_open failed: %s\n"
-msgstr "impossibile aprire il file: %s\n"
+msgstr "iconv_open non riuscito: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "conversion from '%s' to '%s' failed: %s\n"
-msgstr "creazione dell'armatura fallita: %s\n"
+msgstr "conversione da '%s' a '%s' non riuscita: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "failed to create temporary file '%s': %s\n"
-msgstr "impossibile creare la directory `%s': %s\n"
+msgstr "impossibile creare il file temporaneo '%s': %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error writing to '%s': %s\n"
-msgstr "errore scrivendo il portachiavi `%s': %s\n"
+msgstr "errore durante la scrittura in '%s': %s\n"
 
 #, c-format
 msgid "removing stale lockfile (created by %d)\n"
-msgstr ""
+msgstr "rimozione del file di blocco non più utilizzato (creato da %d)\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "waiting for lock (held by %d%s) %s...\n"
-msgstr "scrittura della chiave segreta in `%s'\n"
+msgstr "in attesa di blocco (in attesa di %d%s) %s...\n"
 
 msgid "(deadlock?) "
-msgstr ""
+msgstr "(deadlock?) "
 
-#, fuzzy, c-format
+#, c-format
 msgid "lock '%s' not made: %s\n"
-msgstr "chiave pubblica %08lX non trovata: %s\n"
+msgstr "blocco '%s' non effettuato: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "waiting for lock %s...\n"
-msgstr "scrittura della chiave segreta in `%s'\n"
+msgstr "attesa del blocco %s...\n"
 
 #, c-format
 msgid "%s is too old (need %s, have %s)\n"
-msgstr ""
+msgstr "%s è troppo vecchio (è necessario %s, con %s)\n"
 
 #, c-format
 msgid "armor: %s\n"
@@ -1175,25 +1120,25 @@ msgstr "header dell'armatura: "
 msgid "invalid clearsig header\n"
 msgstr "header della firma in chiaro non valido\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "unknown armor header: "
-msgstr "header dell'armatura: "
+msgstr "intestazione armatura sconosciuta: "
 
 #, c-format
 msgid "nested clear text signatures\n"
 msgstr "firme in chiaro annidate\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "unexpected armor: "
-msgstr "armatura inaspettata:"
+msgstr "armatura inaspettata: "
 
 #, c-format
 msgid "invalid dash escaped line: "
 msgstr "riga protetta con il trattino non valida: "
 
-#, fuzzy, c-format
+#, c-format
 msgid "invalid radix64 character %02X skipped\n"
-msgstr "Carattere radix64 non valido %02x saltato\n"
+msgstr "carattere radix64 non valido %02x ignorato\n"
 
 #, c-format
 msgid "premature eof (no CRC)\n"
@@ -1207,13 +1152,13 @@ msgstr "eof prematura (nel CRC)\n"
 msgid "malformed CRC\n"
 msgstr "CRC malformato\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "CRC error; %06lX - %06lX\n"
-msgstr "errore nel CRC; %06lx - %06lx\n"
+msgstr "Errore CRC; %06lX - %06lX\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "premature eof (in trailer)\n"
-msgstr "eof prematura (nella coda)\n"
+msgstr "eof prematuro (nel rimorchio)\n"
 
 #, c-format
 msgid "error in trailer line\n"
@@ -1221,7 +1166,7 @@ msgstr "errore nella riga della coda\n"
 
 #, c-format
 msgid "no valid OpenPGP data found.\n"
-msgstr "Non sono stati trovati dati OpenPGP validi.\n"
+msgstr "non sono stati trovati dati OpenPGP validi.\n"
 
 #, c-format
 msgid "invalid armor: line longer than %d characters\n"
@@ -1234,10 +1179,9 @@ msgstr ""
 "carattere quoted printable nell'armatura - probabilmente è stato usato\n"
 "un MTA buggato\n"
 
-#, fuzzy, c-format
-#| msgid "not human readable"
+#, c-format
 msgid "[ not human readable (%zu bytes: %s%s) ]"
-msgstr "non leggibile"
+msgstr "[ non leggibile (%zu byte: %s%s) ]"
 
 #, c-format
 msgid ""
@@ -1251,26 +1195,22 @@ msgstr ""
 msgid "a user notation name must contain the '@' character\n"
 msgstr "il valore di una nota dell'utente deve contenere il carattere '@'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "a notation name must not contain more than one '@' character\n"
-msgstr "il valore di una nota dell'utente deve contenere il carattere '@'\n"
+msgstr "il nome di una notazione non deve contenere più di un carattere '@'\n"
 
 #, c-format
 msgid "a notation value must not use any control characters\n"
 msgstr "il valore di una nota non deve usare caratteri di controllo\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "a notation name may not contain an '=' character\n"
-msgstr "il valore di una nota dell'utente deve contenere il carattere '@'\n"
+msgstr "il valore di una nota dell'utente deve contenere il carattere '='\n"
 
-#, fuzzy, c-format
-#| msgid ""
-#| "a notation name must have only printable characters or spaces, and end "
-#| "with an '='\n"
+#, c-format
 msgid "a notation name must have only printable characters or spaces\n"
 msgstr ""
-"il nome di una nota deve essere formato solo da caratteri stampabili o\n"
-"spazi e terminare con un '='\n"
+"un nome di notazione deve contenere solo caratteri o spazi stampabili\n"
 
 #, c-format
 msgid "WARNING: invalid notation data found\n"
@@ -1278,207 +1218,194 @@ msgstr "ATTENZIONE: trovati dati di una nota non validi\n"
 
 #, c-format
 msgid "failed to proxy %s inquiry to client\n"
-msgstr ""
+msgstr "impossibile proxy %s richiesta al client\n"
 
 msgid "Enter passphrase: "
 msgstr "Inserisci la passphrase: "
 
-#, fuzzy, c-format
-#| msgid "error creating keyring `%s': %s\n"
+#, c-format
 msgid "error getting version from '%s': %s\n"
-msgstr "errore creando il portachiavi `%s': %s\n"
+msgstr "errore durante il recupero della versione da '%s': %s\n"
 
 #, c-format
 msgid "server '%s' is older than us (%s < %s)"
-msgstr ""
+msgstr "il server '%s' è precedente a noi (%s < %s)"
 
-#, fuzzy, c-format
-#| msgid "WARNING: %s overrides %s\n"
+#, c-format
 msgid "WARNING: %s\n"
-msgstr "ATTENZIONE: %s ha la precedenza su %s\n"
+msgstr "AVVISO: %s\n"
 
 #, c-format
 msgid "Note: Outdated servers may lack important security fixes.\n"
 msgstr ""
+"Nota: i server obsoleti potrebbero non avere correzioni di sicurezza "
+"importanti.\n"
 
-#, fuzzy, c-format
-#| msgid "Please use the command \"toggle\" first.\n"
+#, c-format
 msgid "Note: Use the command \"%s\" to restart them.\n"
-msgstr "Per favore usa prima il comando \"toggle\".\n"
+msgstr "Nota: utilizzare il comando \"%s\" per riavviarli.\n"
 
-#, fuzzy, c-format
-#| msgid "%s does not yet work with %s\n"
+#, c-format
 msgid "%s is not compliant with %s mode\n"
-msgstr "%s non funziona ancora con %s\n"
+msgstr "%s non è conforme alla modalità %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "no dirmngr running in this session\n"
-msgstr "gpg-agent non è disponibile in questa sessione\n"
+msgstr "nessun dirmngr in esecuzione in questa sessione\n"
 
-#, fuzzy, c-format
-#| msgid "you may not use %s while in %s mode\n"
+#, c-format
 msgid "keyserver option \"%s\" may not be used in %s mode\n"
-msgstr "non è possibile usare %s in modalità %s\n"
+msgstr "l'opzione keyserver \"%s\" non può essere utilizzata in modalità %s\n"
 
 msgid "WKD uses a cached result"
-msgstr ""
+msgstr "WKD utilizza un risultato memorizzato nella cache"
 
 msgid "Tor is not running"
-msgstr ""
+msgstr "Tor non è in esecuzione"
 
-#, fuzzy
 msgid "Tor is not properly configured"
-msgstr "errore: impronta digitale non valida\n"
+msgstr "Tor non è configurato correttamente"
 
-#, fuzzy
 msgid "DNS is not properly configured"
-msgstr "errore: impronta digitale non valida\n"
+msgstr "DNS non è configurato correttamente"
 
 msgid "unacceptable HTTP redirect from server"
-msgstr ""
+msgstr "reindirizzamento HTTP inaccettabile dal server"
 
 msgid "unacceptable HTTP redirect from server was cleaned up"
-msgstr ""
+msgstr "il reindirizzamento HTTP dal server è stato pulito"
 
-#, fuzzy
-#| msgid "generate a revocation certificate"
 msgid "server uses an invalid certificate"
-msgstr "genera un certificato di revoca"
+msgstr "server utilizza un certificato non valido"
 
-#, fuzzy, c-format
-#| msgid "armor: %s\n"
+#, c-format
 msgid "Note: %s\n"
-msgstr "armatura: %s\n"
+msgstr "Nota: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "OpenPGP card not available: %s\n"
-msgstr "la chiave segreta non è disponibile"
+msgstr "Scheda OpenPGP non disponibile: %s\n"
 
 #, c-format
 msgid "OpenPGP card no. %s detected\n"
-msgstr ""
+msgstr "Scheda OpenPGP n. %s rilevata\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "can't do this in batch mode\n"
-msgstr "impossibile fare questo in modo batch\n"
+msgstr "impossibile eseguire questa operazione in modalità batch\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "This command is only available for version 2 cards\n"
-msgstr "Questo comando non è permesso in modalità %s.\n"
+msgstr "Questo comando è disponibile solo per le schede della versione 2\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Reset Code not or not anymore available\n"
-msgstr "parti della chiave segreta non sono disponibili\n"
+msgstr "Reimposta codice non più disponibile o meno\n"
 
 msgid "Your selection? "
 msgstr "Cosa scegli? "
 
 msgid "[not set]"
-msgstr ""
+msgstr "[non impostato]"
 
 msgid "Mr."
-msgstr ""
+msgstr "Sig."
 
 msgid "Ms."
-msgstr ""
+msgstr "Sig.ra."
 
-# ??? (Md)
-#, fuzzy
 msgid "not forced"
-msgstr "non esaminato"
+msgstr "non forzato"
 
 msgid "forced"
-msgstr ""
+msgstr "costretto"
 
 msgid "Error: Only plain ASCII is currently allowed.\n"
-msgstr ""
+msgstr "Errore: al momento è consentito solo ASCII semplice.\n"
 
 msgid "Error: The \"<\" character may not be used.\n"
-msgstr ""
+msgstr "Errore: il carattere \"<\" non può essere utilizzato.\n"
 
 msgid "Error: Double spaces are not allowed.\n"
-msgstr ""
+msgstr "Errore: gli spazi doppi non sono consentiti.\n"
 
 msgid "Cardholder's surname: "
-msgstr ""
+msgstr "Cognome del titolare della carta: "
 
 msgid "Cardholder's given name: "
-msgstr ""
+msgstr "Nome del titolare della carta: "
 
 #, c-format
 msgid "Error: Combined name too long (limit is %d characters).\n"
-msgstr ""
+msgstr "Errore: nome combinato troppo lungo (limite è di %d caratteri).\n"
 
-#, fuzzy
 msgid "URL to retrieve public key: "
-msgstr "non c'è una chiave pubblica corrispondente: %s\n"
+msgstr "URL per recuperare la chiave pubblica: "
 
-#, fuzzy, c-format
-#| msgid "error reading `%s': %s\n"
+#, c-format
 msgid "error reading '%s': %s\n"
-msgstr "errore leggendo `%s': %s\n"
+msgstr "errore durante la lettura di '%s': %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error writing '%s': %s\n"
-msgstr "errore scrivendo il portachiavi `%s': %s\n"
+msgstr "errore durante la scrittura di '%s': %s\n"
 
 msgid "Login data (account name): "
-msgstr ""
+msgstr "Dati di accesso (nome account): "
 
 msgid "Private DO data: "
-msgstr ""
+msgstr "Dati DO privati: "
 
-#, fuzzy
 msgid "Language preferences: "
-msgstr "preferenze aggiornate"
+msgstr "Preferenze lingua: "
 
-#, fuzzy
 msgid "Error: invalid length of preference string.\n"
-msgstr "carattere non valido nella stringa delle preferenze\n"
+msgstr "Errore: lunghezza della stringa di preferenza non valida.\n"
 
-#, fuzzy
 msgid "Error: invalid characters in preference string.\n"
-msgstr "carattere non valido nella stringa delle preferenze\n"
+msgstr "Errore: caratteri non validi nella stringa di preferenza.\n"
 
 msgid "Salutation (M = Mr., F = Ms., or space): "
-msgstr ""
+msgstr "Salutazione (M - Mr., F - Ms., o spazio): "
 
-#, fuzzy
 msgid "Error: invalid response.\n"
-msgstr "errore: impronta digitale non valida\n"
+msgstr "|FPR|Risposta OCSP firmata da FPR\n"
 
-#, fuzzy
 msgid "CA fingerprint: "
-msgstr "mostra le impronte digitali"
+msgstr "Impronta digitale CA: "
 
-#, fuzzy
 msgid "Error: invalid formatted fingerprint.\n"
-msgstr "errore: impronta digitale non valida\n"
+msgstr "Errore: impronta digitale formattata non valida.\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key operation not possible: %s\n"
-msgstr "Generazione della chiave fallita: %s\n"
+msgstr "operazione chiave non possibile: %s\n"
 
-#, fuzzy
 msgid "not an OpenPGP card"
-msgstr "Non sono stati trovati dati OpenPGP validi.\n"
+msgstr "non una scheda OpenPGP"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error getting current key info: %s\n"
-msgstr "errore scrivendo il portachiavi segreto `%s': %s\n"
+msgstr ""
+"errore durante il recupero delle informazioni sulla chiave corrente: %s\n"
 
 msgid "Replace existing key? (y/N) "
-msgstr ""
+msgstr "Sostituire la chiave esistente? (y/N) "
 
 msgid ""
 "Note: There is no guarantee that the card supports the requested size.\n"
 "      If the key generation does not succeed, please check the\n"
 "      documentation of your card to see what sizes are allowed.\n"
 msgstr ""
+"Nota: non vi è alcuna garanzia che la carta supporti la dimensione "
+"richiesta.\n"
+"      Se la generazione della chiave non riesce,\n"
+"      documentazione della carta per vedere quali dimensioni sono "
+"consentite.\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "What keysize do you want? (%u) "
-msgstr "Di che dimensioni vuoi la chiave? (1024) "
+msgstr "Che chiave vuoi? (%u) "
 
 #, c-format
 msgid "rounded up to %u bits\n"
@@ -1486,32 +1413,30 @@ msgstr "arrotondate a %u bit\n"
 
 #, c-format
 msgid "%s keysizes must be in the range %u-%u\n"
-msgstr ""
+msgstr "%s keysizes deve essere compreso nell'intervallo %u-%u\n"
 
 msgid "Changing card key attribute for: "
-msgstr ""
+msgstr "Modifica dell'attributo chiave della scheda per: "
 
-#, fuzzy
 msgid "Signature key\n"
-msgstr "Firma scaduta il %s\n"
+msgstr "Chiave di firma\n"
 
-#, fuzzy
 msgid "Encryption key\n"
-msgstr "   (%d) RSA (cifra solo)\n"
+msgstr "Chiave di crittografia\n"
 
 msgid "Authentication key\n"
-msgstr ""
+msgstr "Chiave di autenticazione\n"
 
 msgid "Please select what kind of key you want:\n"
 msgstr "Per favore scegli che tipo di chiave vuoi:\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "   (%d) RSA\n"
-msgstr "   (%d) RSA (firma solo)\n"
+msgstr "   (%d) RSA\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "   (%d) ECC\n"
-msgstr "   (%d) DSA e ElGamal (default)\n"
+msgstr "   (%d) ECC\n"
 
 msgid "Invalid selection.\n"
 msgstr "Scelta non valida.\n"
@@ -1519,33 +1444,37 @@ msgstr "Scelta non valida.\n"
 #, c-format
 msgid "The card will now be re-configured to generate a key of %u bits\n"
 msgstr ""
+"La scheda verrà ora configurata nuovamente per generare una chiave di %u "
+"bit\n"
 
 #, c-format
 msgid "The card will now be re-configured to generate a key of type: %s\n"
 msgstr ""
+"La scheda verrà ora configurata nuovamente per generare una chiave di tipo: "
+"%s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error changing key attribute for key %d: %s\n"
-msgstr "errore leggendo `%s': %s\n"
+msgstr ""
+"errore durante la modifica dell'attributo chiave per la chiave %d: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error getting card info: %s\n"
-msgstr "errore scrivendo il portachiavi segreto `%s': %s\n"
+msgstr "errore durante il recupero delle informazioni sulla scheda: %s\n"
 
-#, fuzzy, c-format
-#| msgid "This command is not allowed while in %s mode.\n"
+#, c-format
 msgid "This command is not supported by this card\n"
-msgstr "Questo comando non è permesso in modalità %s.\n"
+msgstr "Questo comando non è supportato da questa scheda\n"
 
 msgid "Make off-card backup of encryption key? (Y/n) "
-msgstr ""
+msgstr "Eseguire il backup off-card della chiave di crittografia? (Y/n) "
 
-#, fuzzy, c-format
+#, c-format
 msgid "Note: keys are already stored on the card!\n"
-msgstr "saltata: chiave pubblica già presente\n"
+msgstr "Nota: le chiavi sono già memorizzate sulla scheda!\n"
 
 msgid "Replace existing keys? (y/N) "
-msgstr ""
+msgstr "Sostituire le chiavi esistenti? (y/N) "
 
 #, c-format
 msgid ""
@@ -1553,126 +1482,112 @@ msgid ""
 "   PIN = '%s'     Admin PIN = '%s'\n"
 "You should change them using the command --change-pin\n"
 msgstr ""
+"Si prega di notare che le impostazioni di fabbrica dei PIN sono\n"
+"   PIN : '%s'     PIN di amministrazione = '%s'\n"
+"È necessario modificarli utilizzando il comando --change-pin\n"
 
-#, fuzzy
 msgid "Please select the type of key to generate:\n"
-msgstr "Per favore scegli che tipo di chiave vuoi:\n"
+msgstr "Selezionare il tipo di chiave da generare:\n"
 
-#, fuzzy
 msgid "   (1) Signature key\n"
-msgstr "Firma scaduta il %s\n"
+msgstr "   (1) Chiave di firma\n"
 
-#, fuzzy
 msgid "   (2) Encryption key\n"
-msgstr "   (%d) RSA (cifra solo)\n"
+msgstr "   (2) Chiave di crittografia\n"
 
 msgid "   (3) Authentication key\n"
-msgstr ""
+msgstr "   (3) Chiave di autenticazione\n"
 
-#, fuzzy
 msgid "Please select where to store the key:\n"
-msgstr "Per favore scegli il motivo della revoca:\n"
+msgstr "Si prega di selezionare dove memorizzare la chiave:\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "KEYTOCARD failed: %s\n"
-msgstr "aggiornamento fallito: %s\n"
+msgstr "KEYTOCARD non riuscito: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Note: This command destroys all keys stored on the card!\n"
-msgstr "saltata: chiave pubblica già presente\n"
+msgstr ""
+"Nota: Questo comando distrugge tutti i tasti memorizzati sulla scheda!\n"
 
-#, fuzzy
 msgid "Continue? (y/N) "
-msgstr "Firmo davvero? "
+msgstr "Continuare? (Y/n) "
 
 msgid "Really do a factory reset? (enter \"yes\") "
-msgstr ""
+msgstr "Fare davvero un reset di fabbrica? (immettere \"sì\") "
 
-#, fuzzy, c-format
+#, c-format
 msgid "error for setup KDF: %s\n"
-msgstr "errore leggendo `%s': %s\n"
+msgstr "errore per l'installazione KDF: %s\n"
 
 msgid "quit this menu"
 msgstr "abbandona questo menù"
 
-#, fuzzy
 msgid "show admin commands"
-msgstr "comandi in conflitto\n"
+msgstr "mostra comandi di amministrazione"
 
 msgid "show this help"
 msgstr "mostra questo aiuto"
 
-#, fuzzy
 msgid "list all available data"
-msgstr "Chiave disponibile presso: "
+msgstr "elencare tutti i dati disponibili"
 
 msgid "change card holder's name"
-msgstr ""
+msgstr "cambiare il nome del titolare della carta"
 
 msgid "change URL to retrieve key"
-msgstr ""
+msgstr "modificare l'URL per recuperare la chiave"
 
 msgid "fetch the key specified in the card URL"
-msgstr ""
+msgstr "recuperare la chiave specificata nell'URL della scheda"
 
-#, fuzzy
 msgid "change the login name"
-msgstr "cambia la data di scadenza"
+msgstr "modificare il nome di accesso"
 
-#, fuzzy
 msgid "change the language preferences"
-msgstr "cambia il valore di fiducia"
+msgstr "modificare le preferenze della lingua"
 
 msgid "change card holder's salutation"
-msgstr ""
+msgstr "cambiare il saluto del titolare della carta"
 
-#, fuzzy
 msgid "change a CA fingerprint"
-msgstr "mostra le impronte digitali"
+msgstr "modificare un'impronta digitale CA"
 
 msgid "toggle the signature force PIN flag"
-msgstr ""
+msgstr "attivare/disattivare il flag PIN di forza della firma"
 
-#, fuzzy
 msgid "generate new keys"
-msgstr "genera una nuova coppia di chiavi"
+msgstr "genera nuove chiavi"
 
 msgid "menu to change or unblock the PIN"
-msgstr ""
+msgstr "per modificare o sbloccare il PIN"
 
 msgid "verify the PIN and list all data"
-msgstr ""
+msgstr "verificare il PIN ed elencare tutti i dati"
 
 msgid "unblock the PIN using a Reset Code"
-msgstr ""
+msgstr "sbloccare il PIN utilizzando un codice di ripristino"
 
 msgid "destroy all keys and data"
-msgstr ""
+msgstr "distruggere tutte le chiavi e i dati"
 
-#, fuzzy
-#| msgid "|NAME|use NAME as default recipient"
 msgid "setup KDF for PIN authentication"
-msgstr "|NOME|usa NOME come destinatario predefinito"
+msgstr "configurazione KDF per l'autenticazione PIN"
 
-#, fuzzy
-#| msgid "change the ownertrust"
 msgid "change the key attribute"
-msgstr "cambia il valore di fiducia"
+msgstr "modificare l'attributo chiave"
 
 msgid "gpg/card> "
-msgstr ""
+msgstr "gpg/card> "
 
-#, fuzzy
 msgid "Admin-only command\n"
-msgstr "comandi in conflitto\n"
+msgstr "Comando solo amministratore\n"
 
-#, fuzzy
 msgid "Admin commands are allowed\n"
-msgstr "comandi in conflitto\n"
+msgstr "I comandi di amministrazione sono consentiti\n"
 
-#, fuzzy
 msgid "Admin commands are not allowed\n"
-msgstr "scrittura della chiave segreta in `%s'\n"
+msgstr "I comandi di amministrazione non sono consentiti\n"
 
 msgid "Invalid command  (try \"help\")\n"
 msgstr "Comando non valido  (prova \"help\")\n"
@@ -1681,62 +1596,62 @@ msgstr "Comando non valido  (prova \"help\")\n"
 msgid "--output doesn't work for this command\n"
 msgstr "--output non funziona con questo comando\n"
 
-#, fuzzy, c-format
-#| msgid "can't open `%s'\n"
+#, c-format
 msgid "can't open '%s'\n"
-msgstr "impossibile aprire `%s'\n"
+msgstr "impossibile aprire '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key \"%s\" not found: %s\n"
-msgstr "chiave `%s' non trovata: %s\n"
+msgstr "chiave \"%s\" non trovata: %s\n"
 
 #, c-format
 msgid "error reading keyblock: %s\n"
 msgstr "errore leggendo il keyblock: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key \"%s\" not found\n"
-msgstr "chiave `%s' non trovata: %s\n"
+msgstr "chiave \"%s\" non trovata\n"
 
 #, c-format
 msgid "(unless you specify the key by fingerprint)\n"
 msgstr "(a meno che la chiave sia specificata con il fingerprint)\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "can't do this in batch mode without \"--yes\"\n"
-msgstr "impossibile fare questo in modo batch senza \"--yes\"\n"
+msgstr "non può farlo in modalità batch senza \"--yes\"\n"
 
 msgid "Note: The public primary key and all its subkeys will be deleted.\n"
 msgstr ""
+"Nota: la chiave primaria pubblica e tutte le relative sottochiavi verranno "
+"eliminate.\n"
 
 msgid "Note: Only the shown public subkey will be deleted.\n"
-msgstr ""
+msgstr "Nota: verrà eliminata solo la sottochiave pubblica visualizzata.\n"
 
 msgid "Note: Only the secret part of the shown primary key will be deleted.\n"
 msgstr ""
+"Nota: verrà eliminata solo la parte segreta della chiave primaria "
+"visualizzata.\n"
 
 msgid "Note: Only the secret part of the shown subkey will be deleted.\n"
 msgstr ""
+"Nota: verrà eliminata solo la parte segreta della sottochiave visualizzata.\n"
 
-#, fuzzy
 msgid "Delete this key from the keyring? (y/N) "
-msgstr "Vuoi cancellare questa chiave dal portachiavi? "
+msgstr "Eliminare questa chiave dal keyring? (y/N) "
 
-#, fuzzy
 msgid "This is a secret key! - really delete? (y/N) "
-msgstr "È una chiave segreta! - Vuoi cancellarla davvero? "
+msgstr "Questa è una chiave segreta! - davvero cancellare? (y/N) "
 
-#, fuzzy, c-format
+#, c-format
 msgid "deleting secret %s failed: %s\n"
-msgstr "cancellazione del keyblock fallita: %s\n"
+msgstr "eliminazione del segreto %s non riuscita: %s\n"
 
 msgid "key"
 msgstr "key"
 
-#, fuzzy
-#| msgid "Pubkey: "
 msgid "subkey"
-msgstr "A chiave pubblica: "
+msgstr "sottochiave"
 
 #, c-format
 msgid "update failed: %s\n"
@@ -1771,43 +1686,45 @@ msgstr ""
 msgid "using cipher %s\n"
 msgstr "uso il cifrario %s\n"
 
-#, fuzzy, c-format
-#| msgid "`%s' already compressed\n"
+#, c-format
 msgid "'%s' already compressed\n"
-msgstr "`%s' è già compresso\n"
+msgstr "'%s' già compresso\n"
 
-#, fuzzy, c-format
-#| msgid "WARNING: `%s' is an empty file\n"
+#, c-format
 msgid "WARNING: '%s' is an empty file\n"
-msgstr "ATTENZIONE: `%s' è un file vuoto\n"
+msgstr "AVVISO: '%s' è un file vuoto\n"
 
-#, fuzzy, c-format
-#| msgid "reading from `%s'\n"
+#, c-format
+msgid "cipher algorithm '%s' may not be used in %s mode\n"
+msgstr ""
+"l'algoritmo di crittografia '%s' non può essere utilizzato in modalità %s\n"
+
+#, c-format
+msgid "digest algorithm '%s' may not be used in %s mode\n"
+msgstr "l'algoritmo digest '%s' non può essere utilizzato in modalità %s\n"
+
+#, c-format
 msgid "reading from '%s'\n"
-msgstr "lettura da `%s'\n"
+msgstr "lettura da '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "WARNING: forcing symmetric cipher %s (%d) violates recipient preferences\n"
 msgstr ""
-"forzare il cifrario simmetrico %s (%d) viola le preferenze\n"
-"del destinatario\n"
+"AVVISO: l'imposizione della crittografia simmetrica %s (%d) viola le "
+"preferenze del destinatario\n"
 
-#, fuzzy, c-format
-msgid "cipher algorithm '%s' may not be used in %s mode\n"
-msgstr "non è possibile usare l'algoritmo di cifratura \"%s\" in modalità %s\n"
-
-#, fuzzy, c-format
+#, c-format
 msgid "WARNING: key %s is not suitable for encryption in %s mode\n"
-msgstr "ATTENZIONE: \"%s\" è una opzione deprecata\n"
+msgstr "AVVISO: la chiave %s non è adatta per la crittografia in modalità %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "WARNING: forcing compression algorithm %s (%d) violates recipient "
 "preferences\n"
 msgstr ""
-"forzare l'algoritmo di compressione %s (%d) viola le preferenze\n"
-"del destinatario\n"
+"AVVISO: l'algoritmo di compressione %s (%d) viola le preferenze dei "
+"destinatari\n"
 
 #, c-format
 msgid "forcing symmetric cipher %s (%d) violates recipient preferences\n"
@@ -1819,10 +1736,9 @@ msgstr ""
 msgid "%s/%s encrypted for: \"%s\"\n"
 msgstr "%s/%s cifrato per: \"%s\"\n"
 
-#, fuzzy, c-format
-#| msgid "you may not use %s while in %s mode\n"
+#, c-format
 msgid "option '%s' may not be used in %s mode\n"
-msgstr "non è possibile usare %s in modalità %s\n"
+msgstr "l'opzione '%s' non può essere utilizzata in modalità %s\n"
 
 #, c-format
 msgid "%s encrypted data\n"
@@ -1854,19 +1770,19 @@ msgstr ""
 "le chiamate a programmi esterni sono disattivate a causa dei permessi non\n"
 "sicuri del file delle opzioni\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "this platform requires temporary files when calling external programs\n"
 msgstr ""
 "questa piattaforma richiede file temporanei quando si chiamano programmi "
 "esterni\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "unable to execute program '%s': %s\n"
-msgstr "impossibile eseguire %s \"%s\": %s\n"
+msgstr "impossibile eseguire il programma '%s': %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "unable to execute shell '%s': %s\n"
-msgstr "impossibile eseguire %s \"%s\": %s\n"
+msgstr "impossibile eseguire la shell '%s': %s\n"
 
 #, c-format
 msgid "system error while calling external program: %s\n"
@@ -1884,131 +1800,115 @@ msgstr "impossibile eseguire il programma esterno\n"
 msgid "unable to read external program response: %s\n"
 msgstr "impossibile leggere la risposta del programma esterno: %s\n"
 
-#, fuzzy, c-format
-#| msgid "WARNING: unable to remove tempfile (%s) `%s': %s\n"
+#, c-format
 msgid "WARNING: unable to remove tempfile (%s) '%s': %s\n"
-msgstr "ATTENZIONE: impossibile cancellare il file temporaneo (%s) `%s': %s\n"
+msgstr "AVVISO: impossibile rimuovere il file temporaneo (%s) '%s': %s\n"
 
-#, fuzzy, c-format
-#| msgid "WARNING: unable to remove temp directory `%s': %s\n"
+#, c-format
 msgid "WARNING: unable to remove temp directory '%s': %s\n"
-msgstr "ATTENZIONE: impossibile rimuovere la directory temporanea `%s': %s\n"
+msgstr "AVVISO: impossibile rimuovere la directory temporanea '%s': %s\n"
 
-#, fuzzy
 msgid "export signatures that are marked as local-only"
-msgstr ""
-"\n"
-"La firma sarà marcata come irrevocabile.\n"
+msgstr "esportare firme contrassegnate come solo locali"
 
 msgid "export attribute user IDs (generally photo IDs)"
-msgstr ""
+msgstr "esportare gli ID utente degli attributi (in genere gli ID foto)"
 
-#, fuzzy
 msgid "export revocation keys marked as \"sensitive\""
-msgstr "non sono state trovate chiavi di revoca per `%s'\n"
+msgstr "esportare le chiavi di revoca contrassegnate come \"sensibili\""
 
-#, fuzzy
 msgid "remove unusable parts from key during export"
-msgstr "chiave segreta inutilizzabile"
+msgstr "rimuovere parti inutilizzabili dalla chiave durante l'esportazione"
 
 msgid "remove as much as possible from key during export"
-msgstr ""
+msgstr "rimuovere il più possibile dalla chiave durante l'esportazione"
 
 msgid "use the GnuPG key backup format"
-msgstr ""
+msgstr "utilizzare il formato di backup della chiave GnuPG"
 
-#, fuzzy
-#| msgid "%s: skipped: %s\n"
 msgid " - skipped"
-msgstr "%s: saltata: %s\n"
+msgstr " - saltato"
 
-#, fuzzy, c-format
-#| msgid "writing to `%s'\n"
+#, c-format
 msgid "writing to '%s'\n"
-msgstr "scrittura in `%s'\n"
+msgstr "scrittura in '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: key material on-card - skipped\n"
-msgstr "chiave %08lX: firma della subchiave nel posto sbagliato - saltata\n"
+msgstr "chiave %s: materiale della chiave su scheda - ignorato\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "exporting secret keys not allowed\n"
-msgstr "scrittura della chiave segreta in `%s'\n"
+msgstr "esportazione di chiavi segrete non consentita\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: PGP 2.x style key - skipped\n"
-msgstr "chiave %08lX: chiave in stile PGP 2.x - saltata\n"
+msgstr "chiave %s: chiave di stile PGP 2.x - ignorata\n"
 
 #, c-format
 msgid "WARNING: nothing exported\n"
 msgstr "ATTENZIONE: non è stato esportato nulla\n"
 
-#, fuzzy, c-format
-#| msgid "error creating `%s': %s\n"
+#, c-format
 msgid "error creating '%s': %s\n"
-msgstr "errore creando `%s': %s\n"
+msgstr "errore durante la creazione di '%s': %s\n"
 
-#, fuzzy
 msgid "[User ID not found]"
-msgstr "[User ID non trovato]"
+msgstr "[ID utente non trovato]"
 
-#, fuzzy, c-format
+#, c-format
 msgid "automatically retrieved '%s' via %s\n"
-msgstr "errore creando `%s': %s\n"
+msgstr "recuperato automaticamente '%s' tramite %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error retrieving '%s' via %s: %s\n"
-msgstr "errore creando `%s': %s\n"
+msgstr "errore durante il recupero di '%s' tramite %s: %s\n"
 
-#, fuzzy
 msgid "No fingerprint"
-msgstr "mostra le impronte digitali"
+msgstr "Nessuna impronta digitale"
 
 #, c-format
 msgid "checking for a fresh copy of an expired key via %s\n"
 msgstr ""
+"verifica della presenza di una nuova copia di una chiave scaduta tramite %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "secret key \"%s\" not found: %s\n"
-msgstr "chiave segreta `%s' non trovata: %s\n"
+msgstr "chiave segreta \"%s\" non trovata: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "(check argument of option '%s')\n"
-msgstr "opzioni di importazione non valide\n"
+msgstr "(controllare l'argomento dell'opzione '%s')\n"
 
-#, fuzzy, c-format
-#| msgid "|NAME|use NAME as default secret key"
+#, c-format
 msgid "Warning: not using '%s' as default key: %s\n"
-msgstr "|NOME|usa NOME come chiave segreta predefinita"
+msgstr "Avviso: impossibile utilizzare '%s' come chiave predefinita: %s\n"
 
-#, fuzzy, c-format
-#| msgid "|NAME|use NAME as default secret key"
+#, c-format
 msgid "using \"%s\" as default secret key for signing\n"
-msgstr "|NOME|usa NOME come chiave segreta predefinita"
+msgstr "utilizzo di \"%s\" come chiave segreta predefinita per la firma\n"
 
 #, c-format
 msgid "all values passed to '%s' ignored\n"
-msgstr ""
+msgstr "tutti i valori passati a '%s' ignorati\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
-msgstr "Chiave %08lX non valida resa valida da --allow-non-selfsigned-uid\n"
+msgstr "Chiave non valida %s resa valida da --allow-non-selfsigned-uid\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "using subkey %s instead of primary key %s\n"
-msgstr "uso la chiave secondaria %08lX invece della chiave primaria %08lX\n"
+msgstr "utilizzando la sottochiave %s anziché la chiave primaria %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "valid values for option '%s':\n"
-msgstr "opzioni di importazione non valide\n"
+msgstr "valori validi per l'opzione '%s':\n"
 
-#, fuzzy
 msgid "make a signature"
-msgstr "fai una firma separata"
+msgstr "fare una firma"
 
-#, fuzzy
 msgid "make a clear text signature"
-msgstr "|[file]|fai una firma mantenendo il testo in chiaro"
+msgstr "creare una firma di testo non crittografato"
 
 msgid "make a detached signature"
 msgstr "fai una firma separata"
@@ -2031,9 +1931,8 @@ msgstr "elenca le chiavi"
 msgid "list keys and signatures"
 msgstr "elenca le chiavi e le firme"
 
-#, fuzzy
 msgid "list and check key signatures"
-msgstr "controlla le firme delle chiavi"
+msgstr "elencare e controllare le firme delle chiavi"
 
 msgid "list keys and fingerprints"
 msgstr "elenca le chiavi e le impronte digitali"
@@ -2044,28 +1943,20 @@ msgstr "elenca le chiavi segrete"
 msgid "generate a new key pair"
 msgstr "genera una nuova coppia di chiavi"
 
-#, fuzzy
-#| msgid "generate a new key pair"
 msgid "quickly generate a new key pair"
-msgstr "genera una nuova coppia di chiavi"
+msgstr "generare rapidamente una nuova coppia di chiavi"
 
-#, fuzzy
-#| msgid "generate a new key pair"
 msgid "quickly add a new user-id"
-msgstr "genera una nuova coppia di chiavi"
+msgstr "aggiungere rapidamente un nuovo id utente"
 
-#, fuzzy
-#| msgid "generate a new key pair"
 msgid "quickly revoke a user-id"
-msgstr "genera una nuova coppia di chiavi"
+msgstr "revocare rapidamente un id utente"
 
-#, fuzzy
-#| msgid "generate a new key pair"
 msgid "quickly set a new expiration date"
-msgstr "genera una nuova coppia di chiavi"
+msgstr "impostare rapidamente una nuova data di scadenza"
 
 msgid "full featured key pair generation"
-msgstr ""
+msgstr "generazione completa della coppia di chiavi in primo piano"
 
 msgid "generate a revocation certificate"
 msgstr "genera un certificato di revoca"
@@ -2076,15 +1967,16 @@ msgstr "rimuove le chiavi dal portachiavi pubblico"
 msgid "remove keys from the secret keyring"
 msgstr "rimuove le chiavi dal portachiavi privato"
 
-#, fuzzy
-#| msgid "sign a key"
 msgid "quickly sign a key"
-msgstr "firma una chiave"
+msgstr "firmare rapidamente un tasto"
 
-#, fuzzy
-#| msgid "sign a key locally"
 msgid "quickly sign a key locally"
-msgstr "firma una chiave localmente"
+msgstr "firmare rapidamente una chiave localmente"
+
+#, fuzzy
+#| msgid "quickly revoke a user-id"
+msgid "quickly revoke a key signature"
+msgstr "revocare rapidamente un id utente"
 
 msgid "sign a key"
 msgstr "firma una chiave"
@@ -2095,7 +1987,6 @@ msgstr "firma una chiave localmente"
 msgid "sign or edit a key"
 msgstr "firma o modifica una chiave"
 
-#, fuzzy
 msgid "change a passphrase"
 msgstr "cambia la passphrase"
 
@@ -2118,48 +2009,43 @@ msgid "import/merge keys"
 msgstr "importa/aggiungi delle chiavi"
 
 msgid "print the card status"
-msgstr ""
+msgstr "stampare lo stato della scheda"
 
 msgid "change data on a card"
-msgstr ""
+msgstr "modificare i dati su una scheda"
 
 msgid "change a card's PIN"
-msgstr ""
+msgstr "modificare il PIN di una carta"
 
 msgid "update the trust database"
 msgstr "aggiorna il database della fiducia"
 
-#, fuzzy
 msgid "print message digests"
-msgstr "|algo [files]|stampa tutti i message digests"
+msgstr "stampare digest dei messaggi"
 
 msgid "run in server mode"
-msgstr ""
+msgstr "eseguire in modalità server"
 
 msgid "|VALUE|set the TOFU policy for a key"
-msgstr ""
+msgstr "|VALORE|impostare il criterio TOFU per una chiave"
 
 msgid "create ascii armored output"
 msgstr "crea un output ascii con armatura"
 
-#, fuzzy
 msgid "|USER-ID|encrypt for USER-ID"
-msgstr "|NOME|cifra per NOME"
+msgstr "|USER-ID|encrypt per USER-ID"
 
-#, fuzzy
 msgid "|USER-ID|use USER-ID to sign or decrypt"
-msgstr "usa questo user-id per firmare o decifrare"
+msgstr "|USER-ID|utilizzare USER-ID per firmare o decrittografare"
 
-#, fuzzy
 msgid "|N|set compress level to N (0 disables)"
-msgstr "|N|imposta il livello di compressione (0 disab.)"
+msgstr "|N|Impostare il livello di compressione su N (0 disabilita)"
 
 msgid "use canonical text mode"
 msgstr "usa il modo testo canonico"
 
-#, fuzzy
 msgid "|FILE|write output to FILE"
-msgstr "|FILE|carica il modulo di estensione FILE"
+msgstr "|FILE|scrittura dell'output in FILE"
 
 msgid "do not make any changes"
 msgstr "non fa cambiamenti"
@@ -2168,7 +2054,7 @@ msgid "prompt before overwriting"
 msgstr "chiede prima di sovrascrivere"
 
 msgid "use strict OpenPGP behavior"
-msgstr ""
+msgstr "utilizzare un comportamento OpenPGP rigoroso"
 
 msgid ""
 "@\n"
@@ -2177,16 +2063,6 @@ msgstr ""
 "@\n"
 "(Vedi la man page per una lista completa di tutti i comandi e opzioni)\n"
 
-#, fuzzy
-#| msgid ""
-#| "@\n"
-#| "Examples:\n"
-#| "\n"
-#| " -se -r Bob [file]          sign and encrypt for user Bob\n"
-#| " --clear-sign [file]         make a clear text signature\n"
-#| " --detach-sign [file]       make a detached signature\n"
-#| " --list-keys [names]        show keys\n"
-#| " --fingerprint [names]      show fingerprints\n"
 msgid ""
 "@\n"
 "Examples:\n"
@@ -2200,30 +2076,23 @@ msgstr ""
 "@\n"
 "Esempi:\n"
 "\n"
-" -se -r Bob [file]          firma e cifra per l'utente Bob\n"
-" --clear-sign [file]         fai una firma mantenendo il testo in chiaro\n"
-" --detach-sign [file]       fai una firma separata\n"
-" --list-keys [nomi]         mostra le chiavi\n"
+"-se -r Bob [file]           firma e crittografa per l'utente Bob\n"
+" --cancella-segno [file]        fare una firma di testo non crittografato\n"
+" --detach-sign [file]       crea una firma disconnessa\n"
+" --list-keys [nomi]       mostra le chiavi\n"
 " --fingerprint [nomi]       mostra le impronte digitali\n"
 
-#, fuzzy
-#| msgid "Usage: gpg [options] [files] (-h for help)"
 msgid "Usage: @GPG@ [options] [files] (-h for help)"
-msgstr "Uso: gpg [opzioni] [files] (-h per l'aiuto)"
+msgstr "Utilizzo: @GPG@ [opzioni] [file] (-h per assistenza)"
 
-#, fuzzy
-#| msgid ""
-#| "Syntax: gpg [options] [files]\n"
-#| "sign, check, encrypt or decrypt\n"
-#| "default operation depends on the input data\n"
 msgid ""
 "Syntax: @GPG@ [options] [files]\n"
 "Sign, check, encrypt or decrypt\n"
 "Default operation depends on the input data\n"
 msgstr ""
-"Sintassi: gpg [opzioni] [files]\n"
-"firma, controlla, cifra o decifra\n"
-"l'operazione predefinita dipende dai dati di input\n"
+"Sintassi: @GPG@ [opzioni] [files]\n"
+"Firmare, controllare, crittografare o decrittografare\n"
+"Il funzionamento predefinito dipende dai dati di input\n"
 
 msgid ""
 "\n"
@@ -2244,163 +2113,168 @@ msgstr "Hash: "
 msgid "Compression: "
 msgstr "Compressione: "
 
-#, fuzzy, c-format
+#, c-format
 msgid "usage: %s [options] %s\n"
-msgstr "uso: gpg [opzioni] "
+msgstr "utilizzo: %s [opzioni] %s\n"
 
 #, c-format
 msgid "conflicting commands\n"
 msgstr "comandi in conflitto\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "no = sign found in group definition '%s'\n"
-msgstr "non è stato trovato il segno = nella definizione del gruppo \"%s\"\n"
+msgstr "nessun segno = trovato nella definizione di gruppo '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "WARNING: unsafe ownership on homedir '%s'\n"
-msgstr "ATTENZIONE: il proprietario \"%s\" di %s è insicuro\n"
+msgstr "AVVISO: proprietà non sicura su homedir '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "WARNING: unsafe ownership on configuration file '%s'\n"
-msgstr "ATTENZIONE: il proprietario \"%s\" di %s è insicuro\n"
+msgstr "AVVISO: proprietà non sicura nel file di configurazione '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "WARNING: unsafe ownership on extension '%s'\n"
-msgstr "ATTENZIONE: il proprietario \"%s\" di %s è insicuro\n"
+msgstr "AVVISO: proprietà non sicura nell'estensione '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "WARNING: unsafe permissions on homedir '%s'\n"
-msgstr "ATTENZIONE: i permessi \"%s\" di %s sono insicuri\n"
+msgstr "AVVISO: proprietà non sicura su homedir '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "WARNING: unsafe permissions on configuration file '%s'\n"
-msgstr "ATTENZIONE: i permessi \"%s\" di %s sono insicuri\n"
+msgstr "AVVISO: autorizzazioni non sicure per il file di configurazione '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "WARNING: unsafe permissions on extension '%s'\n"
-msgstr "ATTENZIONE: i permessi \"%s\" di %s sono insicuri\n"
+msgstr "AVVISO: autorizzazioni non sicure per l'estensione '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "WARNING: unsafe enclosing directory ownership on homedir '%s'\n"
-msgstr "ATTENZIONE: il proprietario \"%s\" di %s è insicuro\n"
+msgstr "AVVISO: proprietà non sicura su homedir '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "WARNING: unsafe enclosing directory ownership on configuration file '%s'\n"
-msgstr "ATTENZIONE: il proprietario \"%s\" di %s è insicuro\n"
+msgstr ""
+"AVVISO: proprietà della directory di inclusione non sicura nel file di "
+"configurazione '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "WARNING: unsafe enclosing directory ownership on extension '%s'\n"
-msgstr "ATTENZIONE: il proprietario \"%s\" di %s è insicuro\n"
+msgstr ""
+"AVVISO: proprietà della directory di inclusione non sicura nell'estensione "
+"'%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "WARNING: unsafe enclosing directory permissions on homedir '%s'\n"
-msgstr "ATTENZIONE: i permessi \"%s\" di %s sono insicuri\n"
+msgstr ""
+"AVVISO: autorizzazioni della directory di inclusione non sicure nella "
+"directory homedir '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "WARNING: unsafe enclosing directory permissions on configuration file '%s'\n"
-msgstr "ATTENZIONE: i permessi \"%s\" di %s sono insicuri\n"
+msgstr ""
+"AVVISO: autorizzazioni della directory di inclusione non sicure nella "
+"directory homedir '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "WARNING: unsafe enclosing directory permissions on extension '%s'\n"
-msgstr "ATTENZIONE: i permessi \"%s\" di %s sono insicuri\n"
+msgstr ""
+"AVVISO: autorizzazioni della directory di inclusione non sicure per "
+"l'estensione '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "unknown configuration item '%s'\n"
-msgstr "elemento della configurazione sconosciuto \"%s\"\n"
+msgstr "elemento di configurazione sconosciuto '%s'\n"
 
 msgid "display photo IDs during key listings"
-msgstr ""
+msgstr "visualizzare gli ID foto durante le elenchi dei tasti"
 
-#, fuzzy
 msgid "show key usage information during key listings"
-msgstr "Manca la firma corrispondente nel portachiavi segreto\n"
+msgstr ""
+"mostra le informazioni sull'utilizzo delle chiavi durante le inserzioni "
+"chiave"
 
 msgid "show policy URLs during signature listings"
-msgstr ""
+msgstr "mostra URL dei criteri durante gli elenchi delle firme"
 
-#, fuzzy
 msgid "show all notations during signature listings"
-msgstr "Manca la firma corrispondente nel portachiavi segreto\n"
+msgstr "mostra tutte le notazioni durante gli elenchi delle firme"
 
 msgid "show IETF standard notations during signature listings"
-msgstr ""
+msgstr "mostra notazioni standard IETF durante gli elenchi delle firme"
 
 msgid "show user-supplied notations during signature listings"
 msgstr ""
+"mostra le notazioni fornite dall'utente durante gli elenchi delle firme"
 
-#, fuzzy
 msgid "show preferred keyserver URLs during signature listings"
-msgstr "l'URL della politica di firma indicato non è valido\n"
+msgstr "mostra gli URL preferiti del keyserver durante gli elenchi delle firme"
 
 msgid "show user ID validity during key listings"
-msgstr ""
+msgstr "mostra validità ID utente durante le inserzioni chiave"
 
 msgid "show revoked and expired user IDs in key listings"
-msgstr ""
+msgstr "mostra ID utente revocati e scaduti negli elenchi di chiavi"
 
 msgid "show revoked and expired subkeys in key listings"
-msgstr ""
+msgstr "mostra sottochiavi revocate e scadute negli elenchi di chiavi"
 
-#, fuzzy
 msgid "show the keyring name in key listings"
-msgstr "mostra in quali portachiavi sono contenute le chiavi elencate"
+msgstr "mostrare il nome del keyring negli elenchi delle chiavi"
 
-#, fuzzy
 msgid "show expiration dates during signature listings"
-msgstr "Manca la firma corrispondente nel portachiavi segreto\n"
+msgstr "mostra date di scadenza durante le inserzioni delle firme"
 
-#, fuzzy, c-format
+#, c-format
 msgid "unknown TOFU policy '%s'\n"
-msgstr "destinatario predefinito `%s' sconosciuto\n"
+msgstr "criterio TOFU sconosciuto '%s'\n"
 
 #, c-format
 msgid "(use \"help\" to list choices)\n"
-msgstr ""
+msgstr "(utilizzare \"help\" per elencare le scelte)\n"
 
-#, fuzzy, c-format
-#| msgid "NOTE: old default options file `%s' ignored\n"
+#, c-format
 msgid "Note: old default options file '%s' ignored\n"
-msgstr ""
-"NOTA: il vecchio file `%s' con le opzioni predefinite è stato ignorato\n"
+msgstr "Nota: il vecchio file di opzioni predefinito '%s' è stato ignorato\n"
 
-#, fuzzy, c-format
-#| msgid "NOTE: %s is not for normal use!\n"
+#, c-format
 msgid "Note: %s is not for normal use!\n"
-msgstr "NOTA: %s normalmente non deve essere usato!\n"
+msgstr "Nota: %s non è per uso normale!\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "'%s' is not a valid signature expiration\n"
-msgstr "%s non è un set di caratteri valido\n"
+msgstr "'%s' non è una scadenza di firma valida\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "\"%s\" is not a proper mail address\n"
-msgstr "L'indirizzo di email non è valido\n"
+msgstr "\"%s\" non è un indirizzo di posta elettronica corretto\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "invalid pinentry mode '%s'\n"
-msgstr "algoritmo di hash non valido `%s'\n"
+msgstr "modalità pinentry non valida '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "invalid request origin '%s'\n"
-msgstr "opzioni di importazione non valide\n"
+msgstr "origine richiesta non valida '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "'%s' is not a valid character set\n"
-msgstr "%s non è un set di caratteri valido\n"
+msgstr "'%s' non è un set di caratteri valido\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "could not parse keyserver URL\n"
-msgstr "impossibile fare il parsing dell'URI del keyserver\n"
+msgstr "impossibile analizzare l'URL del server dei chiavi\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "%s:%d: invalid keyserver options\n"
-msgstr "%s:%d: opzioni di esportazione non valide\n"
+msgstr "%s:%d: opzioni keyserver non valide\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "invalid keyserver options\n"
-msgstr "opzioni di esportazione non valide\n"
+msgstr "opzioni keyserver non valide\n"
 
 #, c-format
 msgid "%s:%d: invalid import options\n"
@@ -2410,9 +2284,9 @@ msgstr "%s:%d: opzioni di importazione non valide\n"
 msgid "invalid import options\n"
 msgstr "opzioni di importazione non valide\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "invalid filter option: %s\n"
-msgstr "opzioni di importazione non valide\n"
+msgstr "opzione di filtro non valida: %s\n"
 
 #, c-format
 msgid "%s:%d: invalid export options\n"
@@ -2422,70 +2296,67 @@ msgstr "%s:%d: opzioni di esportazione non valide\n"
 msgid "invalid export options\n"
 msgstr "opzioni di esportazione non valide\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "%s:%d: invalid list options\n"
-msgstr "%s:%d: opzioni di importazione non valide\n"
+msgstr "%s:%d: opzioni di elenco non valide\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "invalid list options\n"
-msgstr "opzioni di importazione non valide\n"
+msgstr "opzioni di elenco non valide\n"
 
 msgid "display photo IDs during signature verification"
-msgstr ""
+msgstr "visualizzare gli ID foto durante la verifica della firma"
 
 msgid "show policy URLs during signature verification"
-msgstr ""
+msgstr "mostra URL dei criteri durante la verifica della firma"
 
-#, fuzzy
 msgid "show all notations during signature verification"
-msgstr "%s non è un set di caratteri valido\n"
+msgstr "mostra tutte le notazioni durante la verifica della firma"
 
 msgid "show IETF standard notations during signature verification"
-msgstr ""
+msgstr "mostra notazioni standard IETF durante la verifica della firma"
 
 msgid "show user-supplied notations during signature verification"
 msgstr ""
+"mostra le notazioni fornite dall'utente durante la verifica della firma"
 
-#, fuzzy
 msgid "show preferred keyserver URLs during signature verification"
-msgstr "l'URL della politica di firma indicato non è valido\n"
+msgstr "mostra gli URL preferiti del keyserver durante la verifica della firma"
 
-#, fuzzy
 msgid "show user ID validity during signature verification"
-msgstr "%s non è un set di caratteri valido\n"
+msgstr "mostra validità DELL'ID utente durante la verifica della firma"
 
 msgid "show revoked and expired user IDs in signature verification"
-msgstr ""
+msgstr "mostra ID utente revocati e scaduti nella verifica della firma"
 
-#, fuzzy
 msgid "show only the primary user ID in signature verification"
-msgstr "%s non è un set di caratteri valido\n"
+msgstr "mostra solo l'ID utente primario nella verifica della firma"
 
 msgid "validate signatures with PKA data"
-msgstr ""
+msgstr "convalidare le firme con i dati PKA"
 
 msgid "elevate the trust of signatures with valid PKA data"
-msgstr ""
+msgstr "elevare la fiducia delle firme con dati PKA validi"
 
-#, fuzzy, c-format
+#, c-format
 msgid "%s:%d: invalid verify options\n"
-msgstr "%s:%d: opzioni di esportazione non valide\n"
+msgstr "%s:%d: opzioni di verifica non valide\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "invalid verify options\n"
-msgstr "opzioni di esportazione non valide\n"
+msgstr "opzioni di verifica non valide\n"
 
 #, c-format
 msgid "unable to set exec-path to %s\n"
 msgstr "impossibile impostare exec-path a %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "%s:%d: invalid auto-key-locate list\n"
-msgstr "%s:%d: opzioni di esportazione non valide\n"
+msgstr "%s:%d: elenco di individuazione automatica della chiave non valido\n"
 
 #, c-format
 msgid "invalid auto-key-locate list\n"
-msgstr ""
+msgstr "elenco di individuazione automatica delle chiavi non valido\n"
 
 #, c-format
 msgid "WARNING: program may create a core file!\n"
@@ -2505,19 +2376,19 @@ msgstr "Non ha senso usare %s con %s!\n"
 
 #, c-format
 msgid "WARNING: running with faked system time: "
-msgstr ""
+msgstr "AVVISO: in esecuzione con l'ora di sistema falso: "
 
-#, fuzzy, c-format
+#, c-format
 msgid "will not run with insecure memory due to %s\n"
-msgstr "scrittura della chiave segreta in `%s'\n"
+msgstr "non verrà eseguito con memoria non protetta a causa di %s\n"
 
 #, c-format
 msgid "selected cipher algorithm is invalid\n"
 msgstr "l'algoritmo di cifratura selezionato non è valido\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "selected compression algorithm is invalid\n"
-msgstr "l'algoritmo di cifratura selezionato non è valido\n"
+msgstr "algoritmo di compressione selezionato non valido\n"
 
 #, c-format
 msgid "selected certification digest algorithm is invalid\n"
@@ -2531,9 +2402,9 @@ msgstr "completes-needed deve essere maggiore di 0\n"
 msgid "marginals-needed must be greater than 1\n"
 msgstr "marginals-needed deve essere maggiore di 1\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "max-cert-depth must be in the range from 1 to 255\n"
-msgstr "max-cert-depth deve essere tra 1 e 255\n"
+msgstr "max-cert-depth deve essere compreso tra 1 e 255\n"
 
 #, c-format
 msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n"
@@ -2543,10 +2414,9 @@ msgstr "default-cert-level non valido; deve essere 0, 1, 2 o 3\n"
 msgid "invalid min-cert-level; must be 1, 2, or 3\n"
 msgstr "min-cert-level non valido; deve essere 1, 2 o 3\n"
 
-#, fuzzy, c-format
-#| msgid "NOTE: simple S2K mode (0) is strongly discouraged\n"
+#, c-format
 msgid "Note: simple S2K mode (0) is strongly discouraged\n"
-msgstr "NOTA: l'uso del modo S2K semplice (0) è fortemente scoraggiato\n"
+msgstr "Nota: la modalità S2K semplice (0) è fortemente sconsigliata\n"
 
 #, c-format
 msgid "invalid S2K mode; must be 0, 1 or 3\n"
@@ -2572,14 +2442,10 @@ msgstr "preferenze personali di compressione non valide\n"
 msgid "%s does not yet work with %s\n"
 msgstr "%s non funziona ancora con %s\n"
 
-#, fuzzy, c-format
-msgid "digest algorithm '%s' may not be used in %s mode\n"
-msgstr "non è possibile usare l'algoritmo di digest \"%s\" in modalità %s\n"
-
-#, fuzzy, c-format
+#, c-format
 msgid "compression algorithm '%s' may not be used in %s mode\n"
 msgstr ""
-"non è possibile usare l'algoritmo di compressione \"%s\" in modalità %s\n"
+"l'algoritmo di compressione '%s' non può essere utilizzato in modalità %s\n"
 
 #, c-format
 msgid "failed to initialize the TrustDB: %s\n"
@@ -2591,25 +2457,27 @@ msgstr ""
 "ATTENZIONE: sono stati indicati dei destinatari (-r) senza usare la\n"
 "crittografia a chiave pubblica\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "symmetric encryption of '%s' failed: %s\n"
-msgstr "decifratura fallita: %s\n"
+msgstr "crittografia simmetrica di '%s' non riuscita: %s\n"
 
 #, c-format
 msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n"
-msgstr ""
+msgstr "non è possibile utilizzare --symmetric --encrypt con --s2k-mode 0\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "you cannot use --symmetric --encrypt in %s mode\n"
-msgstr "non è possibile usare %s in modalità %s\n"
+msgstr "non è possibile utilizzare --symmetric --encrypt in modalità %s\n"
 
 #, c-format
 msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n"
 msgstr ""
+"non è possibile utilizzare --symmetric --sign --encrypt con --s2k-mode 0\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "you cannot use --symmetric --sign --encrypt in %s mode\n"
-msgstr "non è possibile usare %s in modalità %s\n"
+msgstr ""
+"non è possibile utilizzare --symmetric --sign --encrypt in modalità %s\n"
 
 #, c-format
 msgid "keyserver send failed: %s\n"
@@ -2623,10 +2491,9 @@ msgstr "ricezione dal keyserver fallita: %s\n"
 msgid "key export failed: %s\n"
 msgstr "esportazione della chiave fallita: %s\n"
 
-#, fuzzy, c-format
-#| msgid "key export failed: %s\n"
+#, c-format
 msgid "export as ssh key failed: %s\n"
-msgstr "esportazione della chiave fallita: %s\n"
+msgstr "esportazione come chiave ssh non riuscita: %s\n"
 
 #, c-format
 msgid "keyserver search failed: %s\n"
@@ -2644,22 +2511,24 @@ msgstr "rimozione dell'armatura fallita: %s\n"
 msgid "enarmoring failed: %s\n"
 msgstr "creazione dell'armatura fallita: %s\n"
 
-#, fuzzy, c-format
-#| msgid "invalid hash algorithm `%s'\n"
+#, c-format
 msgid "invalid hash algorithm '%s'\n"
-msgstr "algoritmo di hash non valido `%s'\n"
+msgstr "algoritmo hash non valido '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error parsing key specification '%s': %s\n"
-msgstr "errore nella creazione della passhprase: %s\n"
+msgstr "errore durante l'analisi della specifica della chiave '%s': %s\n"
 
 #, c-format
 msgid "'%s' does not appear to be a valid key ID, fingerprint or keygrip\n"
 msgstr ""
+"'%s' non sembra essere un ID chiave, un'impronta digitale o un keygrip "
+"valido\n"
 
 #, c-format
 msgid "WARNING: no command supplied.  Trying to guess what you mean ...\n"
 msgstr ""
+"AVVISO: nessun comando fornito.  Cercando di indovinare cosa vuoi dire ...\n"
 
 #, c-format
 msgid "Go ahead and type your message ...\n"
@@ -2673,13 +2542,12 @@ msgstr "l'URL della politica di certificazione indicato non è valido\n"
 msgid "the given signature policy URL is invalid\n"
 msgstr "l'URL della politica di firma indicato non è valido\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "the given preferred keyserver URL is invalid\n"
-msgstr "l'URL della politica di firma indicato non è valido\n"
+msgstr "l'URL del keyserver preferito specificato non è valido\n"
 
-#, fuzzy
 msgid "|FILE|take the keys from the keyring FILE"
-msgstr "prende le chiavi da questo portachiavi"
+msgstr "| FILE: prendere le chiavi dal file di tasti"
 
 msgid "make timestamp conflicts only a warning"
 msgstr "segnala i conflitti di data solo con un avvertimento"
@@ -2688,84 +2556,77 @@ msgid "|FD|write status info to this FD"
 msgstr "|FD|scrivi le informazioni di stato sul FD"
 
 msgid "|ALGO|reject signatures made with ALGO"
-msgstr ""
+msgstr "|ALGO|rifiuta le firme fatte con ALGO"
 
 msgid "Usage: gpgv [options] [files] (-h for help)"
 msgstr "Uso: gpgv [opzioni] [file] (-h per l'aiuto)"
 
-#, fuzzy
 msgid ""
 "Syntax: gpgv [options] [files]\n"
 "Check signatures against known trusted keys\n"
 msgstr ""
-"Sintassi: gpg [opzioni] [file]\n"
-"Controlla le firme con le chiavi affidabili note\n"
+"Sintassi: gpgv [opzioni] [file]\n"
+"Controllare le firme rispetto alle chiavi attendibili note\n"
 
 msgid "No help available"
 msgstr "Non è disponibile un aiuto"
 
-#, fuzzy, c-format
-#| msgid "No help available for `%s'"
+#, c-format
 msgid "No help available for '%s'"
-msgstr "Non è disponibile un aiuto per `%s'"
+msgstr "Nessuna Guida disponibile per '%s'."
 
 msgid "import signatures that are marked as local-only"
-msgstr ""
+msgstr "importare firme contrassegnate come solo locali"
 
 msgid "repair damage from the pks keyserver during import"
-msgstr ""
+msgstr "riparare i danni dal keyserver pks durante l'importazione"
 
-#, fuzzy
 msgid "do not clear the ownertrust values during import"
-msgstr "aggiorna il database della fiducia"
+msgstr "non cancellare i valori ownertrust durante l'importazione"
 
-#, fuzzy
 msgid "do not update the trustdb after import"
-msgstr "aggiorna il database della fiducia"
+msgstr "non aggiornare il trustdb dopo l'importazione"
 
-#, fuzzy
 msgid "show key during import"
-msgstr "mostra le impronte digitali"
+msgstr "mostra chiave durante l'importazione"
 
 msgid "only accept updates to existing keys"
-msgstr ""
+msgstr "accettare solo gli aggiornamenti alle chiavi esistenti"
 
-#, fuzzy
 msgid "remove unusable parts from key after import"
-msgstr "chiave segreta inutilizzabile"
+msgstr "rimuovere le parti inutilizzabili dalla chiave dopo l'importazione"
 
 msgid "remove as much as possible from key after import"
-msgstr ""
+msgstr "rimuovere il più possibile dalla chiave dopo l'importazione"
 
 msgid "ignore key-signatures which are not self-signatures"
-msgstr ""
+msgstr "ignorare le firme chiave che non sono auto-firme"
 
 msgid "run import filters and export key immediately"
 msgstr ""
+"eseguire immediatamente i filtri di importazione e la chiave di esportazione"
 
 msgid "assume the GnuPG key backup format"
-msgstr ""
+msgstr "assumere il formato di backup della chiave GnuPG"
 
-#, fuzzy
 msgid "repair keys on import"
-msgstr "mostra le impronte digitali"
+msgstr "ripristinare le chiavi all'importazione"
 
 #, c-format
 msgid "skipping block of type %d\n"
 msgstr "salto un blocco di tipo %d\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "%lu keys processed so far\n"
-msgstr "Per ora sono state esaminate %lu chiavi\n"
+msgstr "%lu chiavi elaborate finora\n"
 
 #, c-format
 msgid "Total number processed: %lu\n"
 msgstr "Numero totale esaminato: %lu\n"
 
-#, fuzzy, c-format
-#| msgid "      skipped new keys: %lu\n"
+#, c-format
 msgid "    skipped PGP-2 keys: %lu\n"
-msgstr "  nuove chiavi saltate: %lu\n"
+msgstr "    Chiavi PGP-2 ignorate: %lu\n"
 
 #, c-format
 msgid "      skipped new keys: %lu\n"
@@ -2797,7 +2658,7 @@ msgstr "           nuove firme: %lu\n"
 
 #, c-format
 msgid "   new key revocations: %lu\n"
-msgstr "nuove revoche di chiavi: %lu\n"
+msgstr "  nuove revoche di chiavi: %lu\n"
 
 #, c-format
 msgid "      secret keys read: %lu\n"
@@ -2805,162 +2666,165 @@ msgstr "  chiavi segrete lette: %lu\n"
 
 #, c-format
 msgid "  secret keys imported: %lu\n"
-msgstr "chiavi segrete importate: %lu\n"
+msgstr "  chiavi segrete importate: %lu\n"
 
 #, c-format
 msgid " secret keys unchanged: %lu\n"
-msgstr "chiavi segrete non cambiate: %lu\n"
+msgstr " chiavi segrete non cambiate: %lu\n"
 
 #, c-format
 msgid "          not imported: %lu\n"
 msgstr "             importate: %lu\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "    signatures cleaned: %lu\n"
-msgstr "           nuove firme: %lu\n"
+msgstr "    firme pulite: %lu\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "      user IDs cleaned: %lu\n"
-msgstr "  chiavi segrete lette: %lu\n"
+msgstr "    ID utente puliti: %lu\n"
 
 #, c-format
 msgid ""
 "WARNING: key %s contains preferences for unavailable\n"
 "algorithms on these user IDs:\n"
 msgstr ""
+"AVVISO: la chiave %s contiene le preferenze per\n"
+"algoritmi su questi ID utente:\n"
 
 #, c-format
 msgid "         \"%s\": preference for cipher algorithm %s\n"
-msgstr ""
+msgstr "         \"%s\": preferenza per l'algoritmo di crittografia %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "         \"%s\": preference for digest algorithm %s\n"
-msgstr "Firma %s, algoritmo di digest %s\n"
+msgstr "        \"%s\": preferenza per l'algoritmo digest %s\n"
 
 #, c-format
 msgid "         \"%s\": preference for compression algorithm %s\n"
-msgstr ""
+msgstr "          \"%s\": preferenza per l'algoritmo di compressione %s\n"
 
 #, c-format
 msgid "it is strongly suggested that you update your preferences and\n"
-msgstr ""
+msgstr "si consiglia vivamente di aggiornare le preferenze e\n"
 
 #, c-format
 msgid "re-distribute this key to avoid potential algorithm mismatch problems\n"
 msgstr ""
+"ri-distribuire questa chiave per evitare potenziali problemi di mancata "
+"corrispondenza dell'algoritmo\n"
 
 #, c-format
 msgid "you can update your preferences with: gpg --edit-key %s updpref save\n"
 msgstr ""
+"è possibile aggiornare le preferenze con: gpg --edit-key %s updpref save\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: no user ID\n"
-msgstr "chiave %08lX: nessun user ID\n"
+msgstr "chiave %s: nessun ID utente\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: %s\n"
-msgstr "saltata `%s': %s\n"
+msgstr "chiave %s: %s\n"
 
 msgid "rejected by import screener"
-msgstr ""
+msgstr "rifiutato dallo screener di importazione"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: PKS subkey corruption repaired\n"
-msgstr "chiave %08lX: riparati i danni di HKP alla subchiave\n"
+msgstr "chiave %s: danneggiamento della sottochiave PKS riparato\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: accepted non self-signed user ID \"%s\"\n"
-msgstr "chiave %08lX: accettato l'user ID non autofirmato '%s'\n"
+msgstr "chiave %s: accettato ID utente non autofirmato \"%s\"\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: no valid user IDs\n"
-msgstr "chiave %08lX: nessun user ID valido\n"
+msgstr "chiave %s: nessun ID utente valido\n"
 
 #, c-format
 msgid "this may be caused by a missing self-signature\n"
 msgstr "questo può essere causato da una autofirma mancante\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: public key not found: %s\n"
-msgstr "chiave %08lX: chiave pubblica non trovata: %s\n"
+msgstr "chiave %s: chiave pubblica non trovata: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: new key - skipped\n"
-msgstr "chiave %08lX: nuova chiave - saltata\n"
+msgstr "chiave %s: nuova chiave - ignorata\n"
 
 #, c-format
 msgid "no writable keyring found: %s\n"
 msgstr "non è stato trovato un portachiavi scrivibile: %s\n"
 
-#, fuzzy, c-format
-#| msgid "error writing keyring `%s': %s\n"
+#, c-format
 msgid "error writing keyring '%s': %s\n"
-msgstr "errore scrivendo il portachiavi `%s': %s\n"
+msgstr "errore durante la scrittura della chiave '%s': %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: public key \"%s\" imported\n"
-msgstr "chiave %08lX: importata la chiave pubblica \"%s\"\n"
+msgstr "chiave %s: chiave pubblica \"%s\" importata\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: doesn't match our copy\n"
-msgstr "chiave %08lX: non corrisponde alla nostra copia\n"
+msgstr "chiave %s: non corrisponde alla nostra copia\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: \"%s\" 1 new user ID\n"
-msgstr "chiave %08lX: \"%s\" 1 nuovo user ID\n"
+msgstr "chiave %s: \"%s\" 1 nuovo ID utente\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: \"%s\" %d new user IDs\n"
-msgstr "chiave %08lX: \"%s\" %d nuovi user ID\n"
+msgstr "chiave %s: \"%s\" %d nuovi ID utente\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: \"%s\" 1 new signature\n"
-msgstr "chiave %08lX: \"%s\" una nuova firma\n"
+msgstr "chiave %s: \"%s\" 1 nuova firma\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: \"%s\" %d new signatures\n"
-msgstr "chiave %08lX: \"%s\" %d nuove firme\n"
+msgstr "chiave %s: \"%s\" %d nuove firme\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: \"%s\" 1 new subkey\n"
-msgstr "chiave %08lX: \"%s\" una nuova subchiave\n"
+msgstr "chiave %s: \"%s\" 1 nuova sottochiave\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: \"%s\" %d new subkeys\n"
-msgstr "chiave %08lX: \"%s\" %d nuove subchiavi\n"
+msgstr "chiave %s: \"%s\" %d nuove sottochiavi\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: \"%s\" %d signature cleaned\n"
-msgstr "chiave %08lX: \"%s\" %d nuove firme\n"
+msgstr "chiave %s: \"%s\" %d firma pulita\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: \"%s\" %d signatures cleaned\n"
-msgstr "chiave %08lX: \"%s\" %d nuove firme\n"
+msgstr "chiave %s: \"%s\" %d firme pulite\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: \"%s\" %d user ID cleaned\n"
-msgstr "chiave %08lX: \"%s\" %d nuovi user ID\n"
+msgstr "chiave %s: \"%s\" %d ID utente pulito\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: \"%s\" %d user IDs cleaned\n"
-msgstr "chiave %08lX: \"%s\" %d nuovi user ID\n"
+msgstr "chiave %s: \"%s\" %d ID utente puliti\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: \"%s\" not changed\n"
-msgstr "chiave %08lX: \"%s\" non cambiata\n"
+msgstr "chiave %s: \"%s\" non modificata\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: secret key imported\n"
-msgstr "chiave %08lX: chiave segreta importata\n"
+msgstr "chiave %s: chiave segreta importata\n"
 
-#, fuzzy, c-format
-#| msgid "skipped: secret key already present\n"
+#, c-format
 msgid "key %s: secret key already exists\n"
-msgstr "saltata: chiave pubblica già presente\n"
+msgstr "chiave %s: chiave segreta già esistente\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: error sending to agent: %s\n"
-msgstr "errore leggendo `%s': %s\n"
+msgstr "chiave %s: errore durante l'invio all'agente: %s\n"
 
 #. TRANSLATORS: For a smartcard, each private key on host has a
 #. * reference (stub) to a smartcard and actual private key data
@@ -2972,19 +2836,19 @@ msgstr "errore leggendo `%s': %s\n"
 #. * again.
 #, c-format
 msgid "To migrate '%s', with each smartcard, run: %s\n"
-msgstr ""
+msgstr "Per eseguire la migrazione di '%s', con ogni smart card: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "secret key %s: %s\n"
-msgstr "chiave segreta `%s' non trovata: %s\n"
+msgstr "chiave segreta %s: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "importing secret keys not allowed\n"
-msgstr "scrittura della chiave segreta in `%s'\n"
+msgstr "importazione di chiavi segrete non consentita\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: secret key with invalid cipher %d - skipped\n"
-msgstr "chiave %08lX: chiave segreta con cifrario %d non valido - saltata\n"
+msgstr "chiave %s: chiave segreta con crittografia non valida %d - ignorata\n"
 
 msgid "No reason specified"
 msgstr "Nessuna ragione specificata"
@@ -3009,203 +2873,205 @@ msgstr "ragione della revoca: "
 msgid "revocation comment: "
 msgstr "commento alla revoca: "
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: no public key - can't apply revocation certificate\n"
 msgstr ""
-"chiave %08lX: manca la chiave pubblica - impossibile applicare il\n"
-"certificato di revoca\n"
+"chiave %s: nessuna chiave pubblica - impossibile applicare il certificato di "
+"revoca\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: can't locate original keyblock: %s\n"
-msgstr "chiave %08lX: impossibile individuare il keyblock originale: %s\n"
+msgstr "chiave %s: impossibile individuare il blocco di chiave originale: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: can't read original keyblock: %s\n"
-msgstr "chiave %08lX: impossibile leggere il keyblock originale: %s\n"
+msgstr "chiave %s: impossibile leggere il keyblock originale: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: invalid revocation certificate: %s - rejected\n"
-msgstr "chiave %08lX: certificato di revoca non valido: %s - rifiutato\n"
+msgstr "chiave %s: certificato di revoca non valido: %s - rifiutato\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: \"%s\" revocation certificate imported\n"
-msgstr "chiave %08lX: \"%s\" certificato di revoca importato\n"
+msgstr "chiave %s: certificato di revoca \"%s\" importato\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: no user ID for signature\n"
-msgstr "chiave %08lX: nessun user ID per la firma\n"
+msgstr "chiave %s: nessun ID utente per la firma\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n"
 msgstr ""
-"chiave %08lX: algoritmo a chiave pubblica non gestito sull'user ID \"%s\"\n"
+"chiave %s: algoritmo a chiave pubblica non supportato sull'ID utente \"%s\"\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: invalid self-signature on user ID \"%s\"\n"
-msgstr "chiave %08lX: autofirma non valida sull'user ID \"%s\"\n"
+msgstr "chiave %s: autode firma non valida sull'ID utente \"%s\"\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: unsupported public key algorithm\n"
-msgstr "chiave %08lX: algoritmo a chiave pubblica non gestito\n"
+msgstr "chiave %s: algoritmo a chiave pubblica non supportato\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: invalid direct key signature\n"
-msgstr "chiave %08lX: aggiunta una firma alla chiave diretta\n"
+msgstr "chiave %s: firma diretta della chiave non valida\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: no subkey for key binding\n"
-msgstr "chiave %08lX: non ci sono subchiavi per il legame con la chiave\n"
+msgstr "chiave %s: nessuna sottochiave per l'associazione della chiave\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: invalid subkey binding\n"
-msgstr "chiave %08lX: legame con la subchiave non valido:\n"
+msgstr "chiave %s: associazione di sottochiavi non valida\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: removed multiple subkey binding\n"
-msgstr "chiave %08lX: rimossi i legami con subochiavi multiple\n"
+msgstr "chiave %s: rimossa l'associazione di più sottochiavi\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: no subkey for key revocation\n"
-msgstr "chiave %08lX: non ci sono subchiavi per la revoca della chiave\n"
+msgstr "chiave %s: nessuna sottochiave per la revoca della chiave\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: invalid subkey revocation\n"
-msgstr "chiave %08lX: revoca della subchiave non valida\n"
+msgstr "chiave %s: revoca della sottochiave non valida\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: removed multiple subkey revocation\n"
-msgstr "chiave %08lX: rimosse le revoche di subchiavi multiple\n"
+msgstr "chiave %s: rimossa la revoca di più sottochiavi\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: skipped user ID \"%s\"\n"
-msgstr "chiave %08lX: saltato l'user ID '"
+msgstr "chiave %s: ID utente ignorato \"%s\"\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: skipped subkey\n"
-msgstr "chiave %08lX: saltata la subchiave\n"
+msgstr "chiave %s: sottochiave ignorata\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: non exportable signature (class 0x%02X) - skipped\n"
-msgstr "chiave %08lX: firma non esportabile (classe %02x) - saltata\n"
+msgstr "chiave %s: firma non esportabile (classe 0x%02X) - ignorata\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: revocation certificate at wrong place - skipped\n"
-msgstr "chiave %08lX: certificato di revoca nel posto sbagliato - saltata\n"
+msgstr "chiave %s: certificato di revoca nella posizione errata - ignorato\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: invalid revocation certificate: %s - skipped\n"
-msgstr "chiave %08lX: certificato di revoca non valido: %s - saltata\n"
+msgstr "chiave %s: certificato di revoca non valido: %s - ignorato\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: subkey signature in wrong place - skipped\n"
-msgstr "chiave %08lX: firma della subchiave nel posto sbagliato - saltata\n"
+msgstr "chiave %s: firma della sottochiave nella posizione errata - ignorata\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: unexpected signature class (0x%02X) - skipped\n"
-msgstr "chiave %08lX: classe della firma inaspettata (0x%02x) - saltata\n"
+msgstr "chiave %s: classe di firma imprevista (0x%02X) - ignorata\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: duplicated user ID detected - merged\n"
-msgstr "chiave %08lX: trovato un user ID duplicato - unito\n"
+msgstr "chiave %s: rilevato ID utente duplicato - unito\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "WARNING: key %s may be revoked: fetching revocation key %s\n"
 msgstr ""
-"ATTENZIONE: la chiave %08lX può essere stata revocata: scarico la chiave\n"
-"di revoca %08lX.\n"
+"AVVISO: la chiave %s può essere revocata: recupero della chiave di revoca "
+"%s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "WARNING: key %s may be revoked: revocation key %s not present.\n"
 msgstr ""
-"ATTENZIONE: la chiave %08lX può essere stata revocata: la chiave di\n"
-"revoca %08lX non è presente.\n"
+"AVVISO: la chiave %s può essere revocata: chiave di revoca %s non presente.\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: \"%s\" revocation certificate added\n"
-msgstr "chiave %08lX: certificato di revoca \"%s\" aggiunto\n"
+msgstr "chiave %s: certificato di revoca \"%s\" aggiunto\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: direct key signature added\n"
-msgstr "chiave %08lX: aggiunta una firma alla chiave diretta\n"
+msgstr "chiave %s: aggiunta firma chiave diretta\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error allocating memory: %s\n"
-msgstr "errore creando il portachiavi `%s': %s\n"
+msgstr "errore durante l'allocazione della memoria: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "can't check signature with unsupported public-key algorithm (%d): %s.\n"
-msgstr "chiave %08lX: algoritmo a chiave pubblica non gestito\n"
+msgstr ""
+"impossibile controllare la firma con algoritmo a chiave pubblica non "
+"supportato (%d): %s.\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "can't check signature with unsupported message-digest algorithm %d: %s.\n"
-msgstr "Firma %s, algoritmo di digest %s\n"
+msgstr ""
+"impossibile controllare la firma con l'algoritmo digest del messaggio non "
+"supportato %d: %s.\n"
 
-#, fuzzy
 msgid " (reordered signatures follow)"
-msgstr "Firma valida da \""
+msgstr " (seguono le firme riordinate)"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s:\n"
-msgstr "saltata `%s': %s\n"
+msgstr "chiave %s:\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "%d duplicate signature removed\n"
 msgid_plural "%d duplicate signatures removed\n"
-msgstr[0] "L'user ID \"%s\" è stato revocato."
-msgstr[1] "L'user ID \"%s\" è stato revocato."
+msgstr[0] ""
+"%d firma duplicata rimossa\n"
+"\n"
+msgstr[1] "%d firme duplicate rimosse\n"
 
-#, fuzzy, c-format
-#| msgid "1 signature not checked due to a missing key\n"
+#, c-format
 msgid "%d signature not checked due to a missing key\n"
 msgid_plural "%d signatures not checked due to missing keys\n"
-msgstr[0] "una firma non controllata per mancanza della chiave\n"
-msgstr[1] "una firma non controllata per mancanza della chiave\n"
+msgstr[0] "%d firma non controllata a causa di una chiave mancante\n"
+msgstr[1] "%d firme non controllate a causa di chiavi mancanti\n"
 
-#, fuzzy, c-format
-#| msgid "%d bad signatures\n"
+#, c-format
 msgid "%d bad signature\n"
 msgid_plural "%d bad signatures\n"
-msgstr[0] "%d firme non corrette\n"
-msgstr[1] "%d firme non corrette\n"
+msgstr[0] "%d firma non valida\n"
+msgstr[1] "%d firme non valide\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "%d signature reordered\n"
 msgid_plural "%d signatures reordered\n"
-msgstr[0] "Firma valida da \""
-msgstr[1] "Firma valida da \""
+msgstr[0] "Firma %d riordinata\n"
+msgstr[1] "Firme %d riordinata\n"
 
 #, c-format
 msgid ""
 "Warning: errors found and only checked self-signatures, run '%s' to check "
 "all signatures.\n"
 msgstr ""
+"Avviso: errori rilevati e controllati solo auto-firme, eseguire '%s' per "
+"controllare tutte le firme.\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error creating keybox '%s': %s\n"
-msgstr "errore creando il portachiavi `%s': %s\n"
+msgstr "errore durante la creazione della casella della chiave '%s': %s\n"
 
-#, fuzzy, c-format
-#| msgid "error creating keyring `%s': %s\n"
+#, c-format
 msgid "error creating keyring '%s': %s\n"
-msgstr "errore creando il portachiavi `%s': %s\n"
+msgstr "errore durante la creazione della chiave '%s': %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "keybox '%s' created\n"
-msgstr "portachiavi `%s' creato\n"
+msgstr "keybox '%s' creato\n"
 
-#, fuzzy, c-format
-#| msgid "keyring `%s' created\n"
+#, c-format
 msgid "keyring '%s' created\n"
-msgstr "portachiavi `%s' creato\n"
+msgstr "chiave '%s' creata\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "keyblock resource '%s': %s\n"
-msgstr "errore creando `%s': %s\n"
+msgstr "risorsa keyblock '%s': %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error opening key DB: %s\n"
-msgstr "errore leggendo `%s': %s\n"
+msgstr "errore durante l'apertura della chiave DB: %s\n"
 
 #, c-format
 msgid "failed to rebuild keyring cache: %s\n"
@@ -3217,38 +3083,41 @@ msgstr "[revoca]"
 msgid "[self-signature]"
 msgstr "[autofirma]"
 
-#, fuzzy
 msgid ""
 "Please decide how far you trust this user to correctly verify other users' "
 "keys\n"
 "(by looking at passports, checking fingerprints from different sources, "
 "etc.)\n"
 msgstr ""
-"Per favore decidi quanto hai fiducia che questo utente firmi correttamente\n"
-"le chiavi di altri utenti (guardando il loro passaporto, controllando le\n"
-"impronte digitali da diverse fonti...)?\n"
-"\n"
+"Si prega di decidere fino a che punto si considera attendibile questo utente "
+"per verificare correttamente le chiavi di altri utenti\n"
+"(guardando i passaporti, controllando le impronte digitali da fonti diverse, "
+"ecc.)\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "  %d = I trust marginally\n"
-msgstr " %d = Mi fido marginalmente\n"
+msgstr "  %d - Mi fido marginalmente\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "  %d = I trust fully\n"
-msgstr " %d = Mi fido completamente\n"
+msgstr "  %d - Mi fido completamente\n"
 
 msgid ""
 "Please enter the depth of this trust signature.\n"
 "A depth greater than 1 allows the key you are signing to make\n"
 "trust signatures on your behalf.\n"
 msgstr ""
+"Immettere la profondità di questa firma di attendibilità.\n"
+"Una profondità maggiore di 1 consente alla chiave che si sta firmando di\n"
+"firme di attendibilità per vostro conto.\n"
 
 msgid "Please enter a domain to restrict this signature, or enter for none.\n"
 msgstr ""
+"Inserisci un dominio per limitare questa firma o inserisci per nessuno.\n"
 
 #, c-format
 msgid "Skipping user ID \"%s\", which is not a text ID.\n"
-msgstr ""
+msgstr "Ignorare l'ID utente \"%s\", che non è un ID di testo.\n"
 
 #, c-format
 msgid "User ID \"%s\" is revoked."
@@ -3268,13 +3137,12 @@ msgstr "L'user ID \"%s\" è scaduto."
 msgid "User ID \"%s\" is not self-signed."
 msgstr "L'user ID \"%s\" non è autofirmato."
 
-#, fuzzy, c-format
+#, c-format
 msgid "User ID \"%s\" is signable.  "
-msgstr "L'user ID \"%s\" non è autofirmato."
+msgstr "L'ID utente \"%s\" è firmabile.  "
 
-#, fuzzy
 msgid "Sign it? (y/N) "
-msgstr "Firmo davvero? "
+msgstr "Firmarlo? (y/N) "
 
 #, c-format
 msgid ""
@@ -3309,20 +3177,20 @@ msgstr ""
 msgid "Do you want to promote it to a full exportable signature? (y/N) "
 msgstr "Vuoi trasformarla in una firma completa esportabile? (s/N) "
 
-#, fuzzy, c-format
+#, c-format
 msgid "\"%s\" was already locally signed by key %s\n"
-msgstr "\"%s\" era già stato firmato localmente dalla chiave %08lX\n"
+msgstr "\"%s\" era già firmato localmente dalla chiave %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "\"%s\" was already signed by key %s\n"
-msgstr "\"%s\" era già stato firmato dalla chiave %08lX\n"
+msgstr "\"%s\" è già stato firmato dalla chiave %s\n"
 
 msgid "Do you want to sign it again anyway? (y/N) "
 msgstr "Sei ancora sicuro di volerla firmare di nuovo? (s/N) "
 
-#, fuzzy, c-format
+#, c-format
 msgid "Nothing to sign with key %s\n"
-msgstr "Niente da firmare con la chiave %08lX\n"
+msgstr "Niente da firmare con la chiave %s\n"
 
 msgid "This key has expired!"
 msgstr "Questa chiave è scaduta!"
@@ -3359,69 +3227,43 @@ msgstr "   (2) L'ho controllata superficialmente.%s\n"
 msgid "   (3) I have done very careful checking.%s\n"
 msgstr "   (3) L'ho controllata molto attentamente.%s\n"
 
-#, fuzzy
 msgid "Your selection? (enter '?' for more information): "
-msgstr "Cosa scegli? (inserisci '?' per ulteriori informazioni): "
+msgstr "La tua scelta? (inserire '?' per ulteriori informazioni): "
 
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "Are you sure that you want to sign this key with your\n"
 "key \"%s\" (%s)\n"
 msgstr ""
-"Sei davvero sicuro di volere firmare questa chiave\n"
-"con la tua chiave: \""
+"Sei sicuro di voler firmare questa chiave con il tuo\n"
+"chiave \"%s\" (%s)\n"
 
-#, fuzzy
 msgid "This will be a self-signature.\n"
-msgstr ""
-"\n"
-"Questa sarà una autofirma.\n"
+msgstr "Questa sarà un'auto-firma.\n"
 
-#, fuzzy
 msgid "WARNING: the signature will not be marked as non-exportable.\n"
-msgstr ""
-"\n"
-"ATTENZIONE: la firma non sarà marcata come non esportabile.\n"
+msgstr "AVVISO: la firma non verrà contrassegnata come non esportabile.\n"
 
-#, fuzzy
 msgid "WARNING: the signature will not be marked as non-revocable.\n"
-msgstr ""
-"\n"
-"ATTENZIONE: la firma sarà marcata come irrevocabile.\n"
+msgstr "AVVISO: la firma non verrà contrassegnata come non revocabile.\n"
 
-#, fuzzy
 msgid "The signature will be marked as non-exportable.\n"
-msgstr ""
-"\n"
-"La firma sarà marcata come non esportabile.\n"
+msgstr "La firma verrà contrassegnata come non esportabile.\n"
 
-#, fuzzy
 msgid "The signature will be marked as non-revocable.\n"
-msgstr ""
-"\n"
-"La firma sarà marcata come irrevocabile.\n"
+msgstr "La firma verrà contrassegnata come non revocabile.\n"
 
-#, fuzzy
 msgid "I have not checked this key at all.\n"
-msgstr ""
-"\n"
-"Non ho controllato per niente questa chiave.\n"
+msgstr "Non ho controllato questa chiave a tutti.\n"
 
-#, fuzzy
 msgid "I have checked this key casually.\n"
-msgstr ""
-"\n"
-"Ho controllato questa chiave superficialmente.\n"
+msgstr "Ho controllato questa chiave casualmente.\n"
 
-#, fuzzy
 msgid "I have checked this key very carefully.\n"
-msgstr ""
-"\n"
-"Ho controllato questa chiave molto attentamente.\n"
+msgstr "Ho controllato questa chiave con molta attenzione.\n"
 
-#, fuzzy
 msgid "Really sign? (y/N) "
-msgstr "Firmo davvero? "
+msgstr "Davvero firmare? (y/N) "
 
 #, c-format
 msgid "signing failed: %s\n"
@@ -3429,22 +3271,21 @@ msgstr "firma fallita: %s\n"
 
 msgid "Key has only stub or on-card key items - no passphrase to change.\n"
 msgstr ""
+"Key ha solo elementi chiave stub o on-card - nessuna passphrase da "
+"modificare.\n"
 
-#, fuzzy, c-format
-#| msgid "error creating passphrase: %s\n"
+#, c-format
 msgid "key %s: error changing passphrase: %s\n"
-msgstr "errore nella creazione della passhprase: %s\n"
+msgstr "chiave %s: errore durante la modifica della passphrase: %s\n"
 
 msgid "save and quit"
 msgstr "salva ed esci"
 
-#, fuzzy
 msgid "show key fingerprint"
-msgstr "mostra le impronte digitali"
+msgstr "mostra impronta digitale chiave"
 
-#, fuzzy
 msgid "show the keygrip"
-msgstr "Annotazione della firma: "
+msgstr "mostrare il keygrip"
 
 msgid "list key and user IDs"
 msgstr "elenca le chiavi e gli user ID"
@@ -3452,27 +3293,25 @@ msgstr "elenca le chiavi e gli user ID"
 msgid "select user ID N"
 msgstr "scegli l'user ID N"
 
-#, fuzzy
 msgid "select subkey N"
-msgstr "scegli l'user ID N"
+msgstr "selezionare la sottochiave N"
 
-#, fuzzy
 msgid "check signatures"
-msgstr "revoca firme"
+msgstr "controllare le firme"
 
 msgid "sign selected user IDs [* see below for related commands]"
 msgstr ""
+"firmare gli ID utente selezionati [* vedere di seguito per i comandi "
+"correlati]"
 
-#, fuzzy
 msgid "sign selected user IDs locally"
-msgstr "firma la chiave localmente"
+msgstr "firmare gli ID utente selezionati localmente"
 
-#, fuzzy
 msgid "sign selected user IDs with a trust signature"
-msgstr "Suggerimento: seleziona gli user ID da firmare\n"
+msgstr "firmare gli ID utente selezionati con una firma di trust"
 
 msgid "sign selected user IDs with a non-revocable signature"
-msgstr ""
+msgstr "firmare gli ID utente selezionati con una firma non-revocabile"
 
 msgid "add a user ID"
 msgstr "aggiungi un user ID"
@@ -3480,41 +3319,36 @@ msgstr "aggiungi un user ID"
 msgid "add a photo ID"
 msgstr "aggiungi un ID fotografico"
 
-#, fuzzy
 msgid "delete selected user IDs"
-msgstr "cancella un user ID"
+msgstr "eliminare gli ID utente selezionati"
 
-#, fuzzy
 msgid "add a subkey"
-msgstr "addkey"
+msgstr "aggiungere una sottochiave"
 
 msgid "add a key to a smartcard"
-msgstr ""
+msgstr "aggiungere una chiave a una smart card"
 
 msgid "move a key to a smartcard"
-msgstr ""
+msgstr "spostare un tasto in una smart card"
 
 msgid "move a backup key to a smartcard"
-msgstr ""
+msgstr "spostare una chiave di backup in una smart card"
 
-#, fuzzy
 msgid "delete selected subkeys"
-msgstr "cancella una chiave secondaria"
+msgstr "eliminare le sottochiavi selezionate"
 
 msgid "add a revocation key"
 msgstr "aggiungi una chiave di revoca"
 
-#, fuzzy
 msgid "delete signatures from the selected user IDs"
-msgstr "Aggiorno davvero le preferenze per gli user ID selezionati? "
+msgstr "eliminare le firme dagli ID utente selezionati"
 
-#, fuzzy
 msgid "change the expiration date for the key or selected subkeys"
-msgstr "Non è possibile cambiare la data di scadenza di una chiave v3\n"
+msgstr ""
+"modificare la data di scadenza della chiave o delle sottochiavi selezionate"
 
-#, fuzzy
 msgid "flag the selected user ID as primary"
-msgstr "imposta l'user ID come primario"
+msgstr "contrassegnare l'ID utente selezionato come primario"
 
 msgid "list preferences (expert)"
 msgstr "elenca le preferenze (per esperti)"
@@ -3522,17 +3356,16 @@ msgstr "elenca le preferenze (per esperti)"
 msgid "list preferences (verbose)"
 msgstr "elenca le preferenze (prolisso)"
 
-#, fuzzy
 msgid "set preference list for the selected user IDs"
-msgstr "Aggiorno davvero le preferenze per gli user ID selezionati? "
+msgstr "impostare l'elenco delle preferenze per gli ID utente selezionati"
 
-#, fuzzy
 msgid "set the preferred keyserver URL for the selected user IDs"
-msgstr "impossibile fare il parsing dell'URI del keyserver\n"
+msgstr ""
+"impostare l'URL del server delle chiavi preferito per gli ID utente "
+"selezionati"
 
-#, fuzzy
 msgid "set a notation for the selected user IDs"
-msgstr "Aggiorno davvero le preferenze per gli user ID selezionati? "
+msgstr "impostare una notazione per gli ID utente selezionati"
 
 msgid "change the passphrase"
 msgstr "cambia la passphrase"
@@ -3540,43 +3373,39 @@ msgstr "cambia la passphrase"
 msgid "change the ownertrust"
 msgstr "cambia il valore di fiducia"
 
-#, fuzzy
 msgid "revoke signatures on the selected user IDs"
-msgstr "Revoco davvero tutti gli user ID selezionati? "
+msgstr "revocare le firme sugli ID utente selezionati"
 
-#, fuzzy
 msgid "revoke selected user IDs"
-msgstr "revoca un user ID"
+msgstr "revocare gli ID utente selezionati"
 
-#, fuzzy
 msgid "revoke key or selected subkeys"
-msgstr "revoca una chiave secondaria"
+msgstr "revoca della chiave o delle sottochiavi selezionate"
 
-#, fuzzy
 msgid "enable key"
-msgstr "abilita una chiave"
+msgstr "chiave di abilitazione"
 
-#, fuzzy
 msgid "disable key"
-msgstr "disabilita una chiave"
+msgstr "tasto di disattivazione"
 
-#, fuzzy
 msgid "show selected photo IDs"
-msgstr "mostra l'ID fotografico"
+msgstr "mostra GLI ID foto selezionati"
 
 msgid "compact unusable user IDs and remove unusable signatures from key"
 msgstr ""
+"compattare id utente inutilizzabili e rimuovere le firme inutilizzabili "
+"dalla chiave"
 
 msgid "compact unusable user IDs and remove all signatures from key"
 msgstr ""
+"compattare gli ID utente inutilizzabili e rimuovere tutte le firme dalla "
+"chiave"
 
 msgid "Secret key is available.\n"
 msgstr "È disponibile una chiave segreta.\n"
 
-#, fuzzy
-#| msgid "Secret key is available.\n"
 msgid "Secret subkeys are available.\n"
-msgstr "È disponibile una chiave segreta.\n"
+msgstr "Sono disponibili sottochiavi segrete.\n"
 
 msgid "Need the secret key to do this.\n"
 msgstr "Per fare questo serve la chiave segreta.\n"
@@ -3587,24 +3416,27 @@ msgid ""
 "  a 't' for trust signatures (tsign), an 'nr' for non-revocable signatures\n"
 "  (nrsign), or any combination thereof (ltsign, tnrsign, etc.).\n"
 msgstr ""
+"Il comando 'sign' può essere preceduto da una 'l' per le firme locali "
+"(lsign),\n"
+"  una 't' per le firme di trust (tsign), un 'nr' per le firme non "
+"revocabili\n"
+"  (nrsign), o qualsiasi altra combinazione (ltsign, tnrsign, ecc.).\n"
 
 msgid "Key is revoked."
 msgstr "La chiave è stata revocata."
 
-#, fuzzy
 msgid "Really sign all text user IDs? (y/N) "
-msgstr "Firmo davvero tutti gli user ID? "
+msgstr "Firmare davvero tutti gli ID utente di testo? (y/N) "
 
-#, fuzzy
 msgid "Really sign all user IDs? (y/N) "
-msgstr "Firmo davvero tutti gli user ID? "
+msgstr "Firmare davvero tutti gli ID utente? (y/N) "
 
 msgid "Hint: Select the user IDs to sign\n"
 msgstr "Suggerimento: seleziona gli user ID da firmare\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Unknown signature type '%s'\n"
-msgstr "classe della firma sconosciuta"
+msgstr "Tipo di firma sconosciuto '%s'\n"
 
 #, c-format
 msgid "This command is not allowed while in %s mode.\n"
@@ -3615,147 +3447,137 @@ msgstr "Devi selezionare almeno un user ID.\n"
 
 #, c-format
 msgid "(Use the '%s' command.)\n"
-msgstr ""
+msgstr "(Utilizzare il comando '%s'.)\n"
 
 msgid "You can't delete the last user ID!\n"
 msgstr "Non puoi cancellare l'ultimo user ID!\n"
 
-#, fuzzy
 msgid "Really remove all selected user IDs? (y/N) "
-msgstr "Tolgo davvero tutti gli user ID selezionati? "
+msgstr "Rimuovere davvero tutti gli ID utente selezionati? (y/N) "
 
-#, fuzzy
 msgid "Really remove this user ID? (y/N) "
-msgstr "Tolgo davvero questo user ID? "
+msgstr "Rimuovere davvero questo ID utente? (y/N) "
 
 #. TRANSLATORS: Please take care: This is about
 #. moving the key and not about removing it.
-#, fuzzy
 msgid "Really move the primary key? (y/N) "
-msgstr "Tolgo davvero questo user ID? "
+msgstr "Spostare davvero la chiave primaria? (y/N) "
 
-#, fuzzy
 msgid "You must select exactly one key.\n"
-msgstr "Devi selezionare almeno una chiave.\n"
+msgstr "È necessario selezionare esattamente una chiave.\n"
 
 msgid "Command expects a filename argument\n"
-msgstr ""
+msgstr "Il comando prevede un argomento filename\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Can't open '%s': %s\n"
-msgstr "impossibile aprire `%s': %s\n"
+msgstr "Impossibile aprire '%s': %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Error reading backup key from '%s': %s\n"
-msgstr "errore creando il portachiavi `%s': %s\n"
+msgstr "Errore durante la lettura della chiave di backup da '%s': %s\n"
 
 msgid "You must select at least one key.\n"
 msgstr "Devi selezionare almeno una chiave.\n"
 
-#, fuzzy
 msgid "Do you really want to delete the selected keys? (y/N) "
-msgstr "Vuoi davvero cancellare le chiavi selezionate? "
+msgstr "Vuoi davvero eliminare le chiavi selezionate? (y/N) "
 
-#, fuzzy
 msgid "Do you really want to delete this key? (y/N) "
-msgstr "Vuoi davvero cancellare questa chiave? "
+msgstr "Vuoi davvero eliminare questa chiave? (y/N) "
 
-#, fuzzy
 msgid "Really revoke all selected user IDs? (y/N) "
-msgstr "Revoco davvero tutti gli user ID selezionati? "
+msgstr "Revocare davvero tutti gli ID utente selezionati? (y/N) "
 
-#, fuzzy
 msgid "Really revoke this user ID? (y/N) "
-msgstr "Revoco davvero questo user ID? "
+msgstr "Revocare davvero questo ID utente? (y/N) "
 
-#, fuzzy
 msgid "Do you really want to revoke the entire key? (y/N) "
-msgstr "Vuoi davvero revocare questa chiave? "
+msgstr "Vuoi davvero revocare l'intera chiave? (y/N) "
 
-#, fuzzy
 msgid "Do you really want to revoke the selected subkeys? (y/N) "
-msgstr "Vuoi davvero revocare le chiavi selezionate? "
+msgstr "Si desidera davvero revocare le sottochiavi selezionate? (y/N) "
 
-#, fuzzy
 msgid "Do you really want to revoke this subkey? (y/N) "
-msgstr "Vuoi davvero revocare questa chiave? "
+msgstr "Si desidera davvero revocare questa sottochiave? (y/N) "
 
 msgid "Owner trust may not be set while using a user provided trust database\n"
 msgstr ""
+"L'attendibilità del proprietario potrebbe non essere impostata durante "
+"l'utilizzo di un database di trust fornito dall'utente\n"
 
-#, fuzzy
 msgid "Set preference list to:\n"
-msgstr "imposta la lista di preferenze"
+msgstr "Impostare l'elenco delle preferenze su:\n"
 
-#, fuzzy
 msgid "Really update the preferences for the selected user IDs? (y/N) "
-msgstr "Aggiorno davvero le preferenze per gli user ID selezionati? "
+msgstr "Aggiornare davvero le preferenze per gli ID utente selezionati? (y/N) "
 
-#, fuzzy
 msgid "Really update the preferences? (y/N) "
-msgstr "Aggiorno davvero le preferenze? "
+msgstr "Aggiornare davvero le preferenze? (y/N) "
 
-#, fuzzy
 msgid "Save changes? (y/N) "
-msgstr "Salvo i cambiamenti? "
+msgstr "Salvare le modifiche? (y/N) "
 
-#, fuzzy
 msgid "Quit without saving? (y/N) "
-msgstr "Esco senza salvare? "
+msgstr "Uscire senza salvare? (y/N) "
 
 #, c-format
 msgid "Key not changed so no update needed.\n"
 msgstr "La chiave non è cambiata quindi non sono necessari aggiornamenti.\n"
 
-#, fuzzy, c-format
-#| msgid "You can't delete the last user ID!\n"
+#, c-format
 msgid "cannot revoke the last valid user ID.\n"
-msgstr "Non puoi cancellare l'ultimo user ID!\n"
+msgstr "non può revocare l'ultimo ID utente valido.\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "revoking the user ID failed: %s\n"
-msgstr "controllo della firma creata fallito: %s\n"
+msgstr "revoca dell'ID utente non riuscita: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "setting the primary user ID failed: %s\n"
-msgstr "controllo della firma creata fallito: %s\n"
+msgstr "impostazione dell'ID utente primario non riuscita: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "\"%s\" is not a fingerprint\n"
-msgstr "errore: impronta digitale non valida\n"
+msgstr "\"%s\" non è un'impronta digitale\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "\"%s\" is not the primary fingerprint\n"
-msgstr "inizializzazione del trustdb fallita: %s\n"
+msgstr "\"%s\" non è l'impronta digitale primaria\n"
 
-#, fuzzy, c-format
-#| msgid "invalid value\n"
+#, c-format
 msgid "Invalid user ID '%s': %s\n"
-msgstr "valore non valido\n"
+msgstr "ID utente '%s' non valido: %s\n"
 
-#, fuzzy
-#| msgid "No such user ID.\n"
 msgid "No matching user IDs."
-msgstr "User ID inesistente.\n"
+msgstr "Nessun ID utente corrispondente."
 
-#, fuzzy
 msgid "Nothing to sign.\n"
-msgstr "Niente da firmare con la chiave %08lX\n"
+msgstr "Niente da firmare.\n"
+
+#, c-format
+msgid "Not signed by you.\n"
+msgstr "Non firmato da te.\n"
 
 #, fuzzy, c-format
+#| msgid "checking created signature failed: %s\n"
+msgid "revoking the key signature failed: %s\n"
+msgstr "controllo della firma creata fallito: %s\n"
+
+#, c-format
 msgid "'%s' is not a valid expiration time\n"
-msgstr "%s non è un set di caratteri valido\n"
+msgstr "'%s' non è un'ora di scadenza valida\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "\"%s\" is not a proper fingerprint\n"
-msgstr "errore: impronta digitale non valida\n"
+msgstr "\"%s\" non è un'impronta digitale corretta\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "subkey \"%s\" not found\n"
-msgstr "chiave `%s' non trovata: %s\n"
+msgstr "sottochiave \"%s\" non trovata\n"
 
 msgid "AEAD: "
-msgstr ""
+msgstr "AEAD: "
 
 msgid "Digest: "
 msgstr "Digest: "
@@ -3764,60 +3586,58 @@ msgid "Features: "
 msgstr "Caratteristiche: "
 
 msgid "Keyserver no-modify"
-msgstr ""
+msgstr "Keyserver no-modify"
 
 msgid "Preferred keyserver: "
-msgstr ""
+msgstr "Server delle chiavi preferito: "
 
-#, fuzzy
 msgid "Notations: "
-msgstr "Nota: "
+msgstr "Notazioni: "
 
 msgid "There are no preferences on a PGP 2.x-style user ID.\n"
 msgstr "Non esistono preferense su un user ID in stile PGP 2.x\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "The following key was revoked on %s by %s key %s\n"
-msgstr "Questa chiave può essere revocata dalla chiave %s "
+msgstr "La seguente chiave è stata revocata su %s dalla chiave %s %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "This key may be revoked by %s key %s"
-msgstr "Questa chiave può essere revocata dalla chiave %s "
+msgstr "Questa chiave può essere revocata dalla chiave %s %s"
 
-#, fuzzy
 msgid "(sensitive)"
-msgstr " (sensibile)"
+msgstr "(sensibile)"
 
-#, fuzzy, c-format
+#, c-format
 msgid "created: %s"
-msgstr "impossibile creare %s: %s\n"
+msgstr "creato: %s"
 
-#, fuzzy, c-format
+#, c-format
 msgid "revoked: %s"
-msgstr "[revocata]"
+msgstr "revocato: %s"
 
-#, fuzzy, c-format
+#, c-format
 msgid "expired: %s"
-msgstr "[scadenza: %s]"
+msgstr "scaduto: %s"
 
-#, fuzzy, c-format
+#, c-format
 msgid "expires: %s"
-msgstr "[scadenza: %s]"
+msgstr "scadenza: %s"
 
-#, fuzzy, c-format
+#, c-format
 msgid "usage: %s"
-msgstr " fiducia: %c/%c"
+msgstr "utilizzo: %s"
 
 msgid "card-no: "
-msgstr ""
+msgstr "scheda-no: "
 
-#, fuzzy, c-format
+#, c-format
 msgid "trust: %s"
-msgstr " fiducia: %c/%c"
+msgstr "attendibilità: %s"
 
 #, c-format
 msgid "validity: %s"
-msgstr ""
+msgstr "validità: %s"
 
 msgid "This key has been disabled"
 msgstr "Questa chiave è stata disabilitata"
@@ -3830,13 +3650,11 @@ msgstr ""
 "corretta\n"
 "finchè non eseguirai di nuovo il programma.\n"
 
-#, fuzzy
 msgid "revoked"
-msgstr "[revocata]"
+msgstr "revocato"
 
-#, fuzzy
 msgid "expired"
-msgstr "expire"
+msgstr "scaduto"
 
 #, c-format
 msgid ""
@@ -3849,12 +3667,11 @@ msgstr ""
 
 #, c-format
 msgid "WARNING: Your encryption subkey expires soon.\n"
-msgstr ""
+msgstr "AVVISO: la sottochiave di crittografia scade a breve.\n"
 
-#, fuzzy, c-format
-#| msgid "You can't change the expiration date of a v3 key\n"
+#, c-format
 msgid "You may want to change its expiration date too.\n"
-msgstr "Non è possibile cambiare la data di scadenza di una chiave v3\n"
+msgstr "Si consiglia di modificare la data di scadenza troppo.\n"
 
 msgid ""
 "WARNING: This is a PGP2-style key.  Adding a photo ID may cause some "
@@ -3872,7 +3689,7 @@ msgstr ""
 "Non è possibile aggiungere un ID fotografico a una chiave in stile PGP2.\n"
 
 msgid "Such a user ID already exists on this key!\n"
-msgstr ""
+msgstr "Tale ID utente esiste già in questa chiave!\n"
 
 msgid "Delete this good signature? (y/N/q)"
 msgstr "Cancellare questa firma corretta? (s/N/q)"
@@ -3886,37 +3703,35 @@ msgstr "Cancellare questa firma sconosciuta? (s/N/q)"
 msgid "Really delete this self-signature? (y/N)"
 msgstr "Cancellare davvero questa autofirma? (s/N)"
 
-#, fuzzy, c-format
-#| msgid "Deleted %d signature.\n"
+#, c-format
 msgid "Deleted %d signature.\n"
 msgid_plural "Deleted %d signatures.\n"
-msgstr[0] "Cancellata %d firma.\n"
-msgstr[1] "Cancellata %d firma.\n"
+msgstr[0] "Firma %d eliminata.\n"
+msgstr[1] "Firme %d eliminate.\n"
 
 msgid "Nothing deleted.\n"
 msgstr "Non è stato cancellato nulla.\n"
 
-#, fuzzy
 msgid "invalid"
-msgstr "armatura non valida"
+msgstr "non valido"
 
-#, fuzzy, c-format
+#, c-format
 msgid "User ID \"%s\" compacted: %s\n"
-msgstr "L'user ID \"%s\" è stato revocato."
+msgstr "ID utente \"%s\" compattato: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "User ID \"%s\": %d signature removed\n"
 msgid_plural "User ID \"%s\": %d signatures removed\n"
-msgstr[0] "L'user ID \"%s\" è stato revocato."
-msgstr[1] "L'user ID \"%s\" è stato revocato."
+msgstr[0] "ID utente \"%s\": firma %d rimossa\n"
+msgstr[1] "ID utente \"%s\": firme %d rimosse\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "User ID \"%s\": already minimized\n"
-msgstr "l'user ID \"%s\" è già stato revocato\n"
+msgstr "ID utente \"%s\": già ridotto a icona\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "User ID \"%s\": already clean\n"
-msgstr "l'user ID \"%s\" è già stato revocato\n"
+msgstr "ID utente \"%s\": già pulito\n"
 
 msgid ""
 "WARNING: This is a PGP 2.x-style key.  Adding a designated revoker may "
@@ -3945,32 +3760,28 @@ msgid "you cannot appoint a key as its own designated revoker\n"
 msgstr ""
 "impossibile nominare una chiave come revocatore designato di sè stessa\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "this key has already been designated as a revoker\n"
-msgstr ""
-"ATTENZIONE: questa chiave è stata revocata dal suo revocatore designato!\n"
+msgstr "questa chiave è già stata designata come revocatore\n"
 
 msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n"
 msgstr ""
 "ATTENZIONE: la nomina di una chiave a revocatrice designata non può essere\n"
 "annullata.\n"
 
-#, fuzzy
 msgid ""
 "Are you sure you want to appoint this key as a designated revoker? (y/N) "
 msgstr ""
-"Sei sicuro di volere nominare questa chiave revocatrice designata? (s/N):"
+"Sei sicuro di voler nominare questa chiave come revocatore designato? (y/N) "
 
-#, fuzzy
 msgid ""
 "Are you sure you want to change the expiration time for multiple subkeys? (y/"
 "N) "
 msgstr ""
-"Sei sicuro di volere nominare questa chiave revocatrice designata? (s/N):"
+"Si è sicuri di voler modificare l'ora di scadenza per più sottochiavi? (y/N) "
 
-#, fuzzy
 msgid "Changing expiration time for a subkey.\n"
-msgstr "Cambio la data di scadenza per una chiave secondaria.\n"
+msgstr "Modifica dell'ora di scadenza per una sottochiave.\n"
 
 msgid "Changing expiration time for the primary key.\n"
 msgstr "Cambio la data di scadenza per la chiave primaria.\n"
@@ -3979,74 +3790,65 @@ msgstr "Cambio la data di scadenza per la chiave primaria.\n"
 msgid "You can't change the expiration date of a v3 key\n"
 msgstr "Non è possibile cambiare la data di scadenza di una chiave v3\n"
 
-#, fuzzy
 msgid "Changing usage of a subkey.\n"
-msgstr "Cambio la data di scadenza per una chiave secondaria.\n"
+msgstr "Modifica dell'utilizzo di una sottochiave.\n"
 
-#, fuzzy
-#| msgid "Changing expiration time for the primary key.\n"
 msgid "Changing usage of the primary key.\n"
-msgstr "Cambio la data di scadenza per la chiave primaria.\n"
+msgstr "Modifica dell'utilizzo della chiave primaria.\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "signing subkey %s is already cross-certified\n"
-msgstr ""
-"ATTENZIONE: la sottochiave per firme %08lX non ha una certificature "
-"incrociata\n"
+msgstr "la sottochiave di firma %s è già certificata incrociata\n"
 
 #, c-format
 msgid "subkey %s does not sign and so does not need to be cross-certified\n"
-msgstr ""
+msgstr "la sottochiave %s non firma e pertanto non deve essere certificata\n"
 
 msgid "Please select exactly one user ID.\n"
 msgstr "Devi selezionare esattamente un user ID.\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "skipping v3 self-signature on user ID \"%s\"\n"
-msgstr "salto una autofirma v3 sull'user ID \"%s\"\n"
+msgstr "ignorare l'autode firma v3 sull'ID utente \"%s\"\n"
 
 msgid "Enter your preferred keyserver URL: "
-msgstr ""
+msgstr "Immettere l'URL del server di chiavi preferito: "
 
-#, fuzzy
 msgid "Are you sure you want to replace it? (y/N) "
-msgstr "Sei sicuro di volerla usare? (s/N) "
+msgstr "Sei sicuro di volerlo sostituire? (y/N) "
 
-#, fuzzy
 msgid "Are you sure you want to delete it? (y/N) "
-msgstr "Sei sicuro di volerla usare? (s/N) "
+msgstr "Sei sicuro di volerlo eliminare? (y/N) "
 
-#, fuzzy
 msgid "Enter the notation: "
-msgstr "Annotazione della firma: "
+msgstr "Immettere la notazione: "
 
-#, fuzzy
 msgid "Proceed? (y/N) "
-msgstr "Sovrascrivo (s/N)? "
+msgstr "Procedere? (y/N) "
 
 #, c-format
 msgid "No user ID with index %d\n"
 msgstr "Nessun user ID con l'indice %d\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "No user ID with hash %s\n"
-msgstr "Nessun user ID con l'indice %d\n"
+msgstr "Nessun ID utente con hash %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "No subkey with key ID '%s'.\n"
-msgstr "Nessun user ID con l'indice %d\n"
+msgstr "Nessuna sottochiave con ID di chiave '%s'.\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "No subkey with index %d\n"
-msgstr "Nessun user ID con l'indice %d\n"
+msgstr "Nessuna sottochiave con indice %d\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "user ID: \"%s\"\n"
-msgstr "user ID: \""
+msgstr "ID utente: \"%s\"\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "signed by your key %s on %s%s%s\n"
-msgstr "   firmata da %08lX il %s%s%s\n"
+msgstr "firmato dalla chiave %s su %s%s%s\n"
 
 msgid " (non-exportable)"
 msgstr " (non esportabile)"
@@ -4061,21 +3863,16 @@ msgstr "Sei ancora sicuro di volerlo aggiungere? (s/N) "
 msgid "Create a revocation certificate for this signature? (y/N) "
 msgstr "Creare un certificato di revoca per questa firma? (s/N) "
 
-#, fuzzy
-msgid "Not signed by you.\n"
-msgstr "   firmata da %08lX il %s%s\n"
-
-#, fuzzy, c-format
+#, c-format
 msgid "You have signed these user IDs on key %s:\n"
-msgstr "Non puoi cancellare l'ultimo user ID!\n"
+msgstr "Sono stati firmati questi ID utente sulla chiave %s:\n"
 
-#, fuzzy
 msgid " (non-revocable)"
-msgstr " (non esportabile)"
+msgstr " (non revocabile)"
 
-#, fuzzy, c-format
+#, c-format
 msgid "revoked by your key %s on %s\n"
-msgstr "   revocata da %08lX il %s\n"
+msgstr "revocato dalla chiave %s su %s\n"
 
 msgid "You are about to revoke these signatures:\n"
 msgstr "Stai per revocare queste firme:\n"
@@ -4089,7 +3886,7 @@ msgstr "manca la chiave segreta\n"
 
 #, c-format
 msgid "tried to revoke a non-user ID: %s\n"
-msgstr ""
+msgstr "tentativo di revocare un ID non utente: %s\n"
 
 #, c-format
 msgid "user ID \"%s\" is already revoked\n"
@@ -4100,47 +3897,47 @@ msgid "WARNING: a user ID signature is dated %d seconds in the future\n"
 msgstr ""
 "ATTENZIONE: una firma dell'user ID ha la data di %d secondi nel futuro\n"
 
-#, fuzzy, c-format
-#| msgid "You can't delete the last user ID!\n"
+#, c-format
 msgid "Cannot revoke the last valid user ID.\n"
-msgstr "Non puoi cancellare l'ultimo user ID!\n"
+msgstr "Impossibile revocare l'ultimo ID utente valido.\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Key %s is already revoked.\n"
-msgstr "l'user ID \"%s\" è già stato revocato\n"
+msgstr "La chiave %s è già stata revocata.\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Subkey %s is already revoked.\n"
-msgstr "l'user ID \"%s\" è già stato revocato\n"
+msgstr "La sottochiave %s è già stata revocata.\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Displaying %s photo ID of size %ld for key %s (uid %d)\n"
 msgstr ""
-"Mostro %s ID fotografici di dimensioni %ld per la chaive 0x%08lX (uid %d)\n"
+"Visualizzazione dell'ID foto %s della dimensione %ld per la chiave %s (uid "
+"%d)\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "invalid value for option '%s'\n"
-msgstr "opzioni di importazione non valide\n"
+msgstr "valore non valido per l'opzione '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "preference '%s' duplicated\n"
-msgstr "la preferenza %c%lu è doppia\n"
+msgstr "preferenza '%s' duplicata\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "too many cipher preferences\n"
-msgstr "ci sono troppe preferenze `%c'\n"
+msgstr "troppe preferenze di cifratura\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "too many digest preferences\n"
-msgstr "ci sono troppe preferenze `%c'\n"
+msgstr "troppe preferenze di digest\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "too many compression preferences\n"
-msgstr "ci sono troppe preferenze `%c'\n"
+msgstr "troppe preferenze di compressione\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "invalid item '%s' in preference string\n"
-msgstr "carattere non valido nella stringa delle preferenze\n"
+msgstr "elemento '%s' non valido nella stringa delle preferenze\n"
 
 #, c-format
 msgid "writing direct signature\n"
@@ -4166,20 +3963,20 @@ msgstr "dimensioni della chiave arrotondate a %u bit\n"
 msgid ""
 "WARNING: some OpenPGP programs can't handle a DSA key with this digest size\n"
 msgstr ""
+"AVVISO: alcuni programmi OpenPGP non sono in grado di gestire una chiave DSA "
+"con questa dimensione del digest\n"
 
-#, fuzzy
 msgid "Sign"
-msgstr "sign"
+msgstr "Firma"
 
 msgid "Certify"
-msgstr ""
+msgstr "Certifica"
 
-#, fuzzy
 msgid "Encrypt"
-msgstr "cifra dati"
+msgstr "Crittografa"
 
 msgid "Authenticate"
-msgstr ""
+msgstr "Autentica"
 
 #. TRANSLATORS: Please use only plain ASCII characters for the
 #. * translation.  If this is not possible use single digits.  The
@@ -4192,38 +3989,38 @@ msgstr ""
 #. *   q = Finish
 #.
 msgid "SsEeAaQq"
-msgstr ""
+msgstr "SsEeAaQq"
 
 #, c-format
 msgid "Possible actions for a %s key: "
-msgstr ""
+msgstr "Azioni possibili per una chiave %s: "
 
 msgid "Current allowed actions: "
-msgstr ""
+msgstr "Azioni correnti consentite: "
 
 #, c-format
 msgid "   (%c) Toggle the sign capability\n"
-msgstr ""
+msgstr "   (%c) Attivare o disattivare la funzionalità di firma\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "   (%c) Toggle the encrypt capability\n"
-msgstr "   (%d) ElGamal (cifra solo)\n"
+msgstr "   (%c) Attivare/disattivare la funzionalità di crittografia\n"
 
 #, c-format
 msgid "   (%c) Toggle the authenticate capability\n"
-msgstr ""
+msgstr "   (%c) Attivare/disattivare la funzionalità di autenticazione\n"
 
 #, c-format
 msgid "   (%c) Finished\n"
-msgstr ""
+msgstr "   (%c) Finito\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "   (%d) RSA and RSA (default)\n"
-msgstr "   (%d) DSA e ElGamal (default)\n"
+msgstr "   (%d) RSA e RSA (impostazione predefinita)\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "   (%d) DSA and Elgamal\n"
-msgstr "   (%d) DSA e ElGamal (default)\n"
+msgstr "   (%d) DSA ed Elgamal\n"
 
 #, c-format
 msgid "   (%d) DSA (sign only)\n"
@@ -4233,7 +4030,7 @@ msgstr "   (%d) DSA (firma solo)\n"
 msgid "   (%d) RSA (sign only)\n"
 msgstr "   (%d) RSA (firma solo)\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "   (%d) Elgamal (encrypt only)\n"
 msgstr "   (%d) ElGamal (cifra solo)\n"
 
@@ -4241,84 +4038,76 @@ msgstr "   (%d) ElGamal (cifra solo)\n"
 msgid "   (%d) RSA (encrypt only)\n"
 msgstr "   (%d) RSA (cifra solo)\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "   (%d) DSA (set your own capabilities)\n"
-msgstr "   (%d) RSA (cifra solo)\n"
+msgstr "   (%d) DSA (impostare le proprie capacità)\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "   (%d) RSA (set your own capabilities)\n"
-msgstr "   (%d) RSA (cifra solo)\n"
+msgstr "   (%d) RSA (imposta le tue funzionalità)\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "   (%d) ECC and ECC\n"
-msgstr "   (%d) DSA e ElGamal (default)\n"
+msgstr "   (%d) ECC ed ECC\n"
 
-#, fuzzy, c-format
-#| msgid "   (%d) DSA (sign only)\n"
+#, c-format
 msgid "  (%d) ECC (sign only)\n"
 msgstr "   (%d) DSA (firma solo)\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "  (%d) ECC (set your own capabilities)\n"
-msgstr "   (%d) RSA (cifra solo)\n"
+msgstr "  (%d) ECC (imposta le tue capacità)\n"
 
-#, fuzzy, c-format
-#| msgid "   (%d) RSA (encrypt only)\n"
+#, c-format
 msgid "  (%d) ECC (encrypt only)\n"
-msgstr "   (%d) RSA (cifra solo)\n"
+msgstr "  (%d) ECC (solo crittografia)\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "  (%d) Existing key\n"
-msgstr "   (%d) RSA (cifra solo)\n"
+msgstr "  (%d) Chiave esistente\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "  (%d) Existing key from card\n"
-msgstr "   (%d) RSA (cifra solo)\n"
+msgstr "   (%d) Chiave esistente dalla scheda\n"
 
-#, fuzzy
 msgid "Enter the keygrip: "
-msgstr "Annotazione della firma: "
+msgstr "Immettere il keygrip: "
 
 msgid "Not a valid keygrip (expecting 40 hex digits)\n"
-msgstr ""
+msgstr "Keygrip non valido (previsto 40 cifre esadecimali)\n"
 
-#, fuzzy
 msgid "No key with this keygrip\n"
-msgstr "Nessun user ID con l'indice %d\n"
+msgstr "Nessuna chiave con questa chiave\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error reading the card: %s\n"
-msgstr "%s: errore durante la lettura del record libero: %s\n"
+msgstr "errore durante la lettura della scheda: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Serial number of the card: %s\n"
-msgstr "errore nella creazione della passhprase: %s\n"
+msgstr "Numero di serie della scheda: %s\n"
 
-#, fuzzy
 msgid "Available keys:\n"
-msgstr "disabilita una chiave"
+msgstr "Chiavi disponibili:\n"
 
-#, fuzzy, c-format
-#| msgid "rounded up to %u bits\n"
+#, c-format
 msgid "rounded to %u bits\n"
-msgstr "arrotondate a %u bit\n"
+msgstr "arrotondato a %u bit\n"
 
 #, c-format
 msgid "%s keys may be between %u and %u bits long.\n"
-msgstr ""
+msgstr "Le chiavi %s possono essere lunghe tra %u e %u bit.\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "What keysize do you want for the subkey? (%u) "
-msgstr "Di che dimensioni vuoi la chiave? (1024) "
+msgstr "Quale dimensione della chiave si desidera per la sottochiave? (%u) "
 
 #, c-format
 msgid "Requested keysize is %u bits\n"
 msgstr "La dimensione richiesta della chiave è %u bit\n"
 
-#, fuzzy
-#| msgid "Please select what kind of key you want:\n"
 msgid "Please select which elliptic curve you want:\n"
-msgstr "Per favore scegli che tipo di chiave vuoi:\n"
+msgstr "Selezionare la curva ellittica desiderata:\n"
 
 msgid ""
 "Please specify how long the key should be valid.\n"
@@ -4353,28 +4142,26 @@ msgstr ""
 msgid "Key is valid for? (0) "
 msgstr "Chiave valida per? (0) "
 
-#, fuzzy, c-format
+#, c-format
 msgid "Signature is valid for? (%s) "
-msgstr "Firma valida per? (0) "
+msgstr "La firma è valida per? (%s) "
 
 msgid "invalid value\n"
 msgstr "valore non valido\n"
 
-#, fuzzy
 msgid "Key does not expire at all\n"
-msgstr "%s non ha scadenza\n"
+msgstr "La chiave non scade affatto\n"
 
-#, fuzzy
 msgid "Signature does not expire at all\n"
-msgstr "%s non ha scadenza\n"
+msgstr "La firma non scade affatto\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Key expires at %s\n"
-msgstr "%s scadrà il %s\n"
+msgstr "La chiave scade alle %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Signature expires at %s\n"
-msgstr "Questa firma scadrà il %s\n"
+msgstr "La firma scade alle %s\n"
 
 msgid ""
 "Your system can't display dates beyond 2038.\n"
@@ -4383,21 +4170,22 @@ msgstr ""
 "Il tuo sistema non può mostrare date oltre il 2038.\n"
 "Comunque, sarà gestita correttamente fino al 2106.\n"
 
-#, fuzzy
 msgid "Is this correct? (y/N) "
-msgstr "È giusto (s/n)? "
+msgstr "È corretto? (y/N) "
 
 msgid ""
 "\n"
 "GnuPG needs to construct a user ID to identify your key.\n"
 "\n"
 msgstr ""
+"\n"
+"GnuPG deve costruire un ID utente per identificare la chiave.\n"
+"\n"
 
 #. TRANSLATORS: This string is in general not anymore used
 #. but you should keep your existing translation.  In case
 #. the new string is not translated this old string will
 #. be used.
-#, fuzzy
 msgid ""
 "\n"
 "You need a user ID to identify your key; the software constructs the user "
@@ -4407,9 +4195,9 @@ msgid ""
 "\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"
+"È necessario un ID utente per identificare la chiave; il software costruisce "
+"l'ID utente\n"
+"dal campo Nome reale, commento e indirizzo e-mail in questo modulo:\n"
 "    \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n"
 "\n"
 
@@ -4421,7 +4209,7 @@ msgstr "Carattere non valido nel nome\n"
 
 #, c-format
 msgid "The characters '%s' and '%s' may not appear in name\n"
-msgstr ""
+msgstr "I caratteri '%s' e '%s' non possono essere visualizzati nel nome\n"
 
 msgid "Name may not start with a digit\n"
 msgstr "Il nome non può iniziare con una cifra\n"
@@ -4441,10 +4229,9 @@ msgstr "Commento: "
 msgid "Invalid character in comment\n"
 msgstr "Carattere non valido nel commento\n"
 
-#, fuzzy, c-format
-#| msgid "You are using the `%s' character set.\n"
+#, c-format
 msgid "You are using the '%s' character set.\n"
-msgstr "Stai usando il set di caratteri `%s'.\n"
+msgstr "Si sta utilizzando il set di caratteri '%s'.\n"
 
 #, c-format
 msgid ""
@@ -4479,13 +4266,9 @@ msgstr "Modifica (N)ome, (C)ommento, (E)mail oppure (Q)uit? "
 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? "
 
-#, fuzzy
-#| msgid "Change (N)ame, (C)omment, (E)mail or (Q)uit? "
 msgid "Change (N)ame, (E)mail, or (Q)uit? "
 msgstr "Modifica (N)ome, (C)ommento, (E)mail oppure (Q)uit? "
 
-#, fuzzy
-#| msgid "Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? "
 msgid "Change (N)ame, (E)mail, or (O)kay/(Q)uit? "
 msgstr "Modifica (N)ome, (C)ommento, (E)mail oppure (O)kay/(Q)uit? "
 
@@ -4513,63 +4296,64 @@ msgid ""
 "    \"%s\"\n"
 "\n"
 msgstr ""
+"In cerca di creare una chiave per:\n"
+"    \"%s\"\n"
+"\n"
 
 msgid "Continue? (Y/n) "
-msgstr ""
+msgstr "Continuare? (Y/n) "
 
-#, fuzzy, c-format
+#, c-format
 msgid "A key for \"%s\" already exists\n"
-msgstr "`%s' è già compresso\n"
+msgstr "Esiste già una chiave per \"%s\"\n"
 
-#, fuzzy
 msgid "Create anyway? (y/N) "
-msgstr "Uso lo stesso questa chiave? "
+msgstr "Creare comunque? (y/N) "
 
-#, fuzzy, c-format
+#, c-format
 msgid "creating anyway\n"
-msgstr "genera una nuova coppia di chiavi"
+msgstr "creazione comunque\n"
 
 #, c-format
 msgid "Note: Use \"%s %s\" for a full featured key generation dialog.\n"
 msgstr ""
+"Nota: utilizzare \"%s %s\" per una finestra di dialogo di generazione di "
+"chiavi in primo piano.\n"
 
 #, c-format
 msgid "Key generation canceled.\n"
 msgstr "Generazione della chiave annullata.\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "can't create backup file '%s': %s\n"
-msgstr "impossibile creare `%s': %s\n"
+msgstr "impossibile creare il file di backup '%s': %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Note: backup of card key saved to '%s'\n"
-msgstr "NOTA: chiave %08lX scaduta il %s\n"
+msgstr "Nota: backup della chiave della scheda salvata in '%s'\n"
 
-#, fuzzy, c-format
-#| msgid "writing public key to `%s'\n"
+#, c-format
 msgid "writing public key to '%s'\n"
-msgstr "scrittura della chiave pubblica in `%s'\n"
+msgstr "scrittura di chiave pubblica in '%s'\n"
 
 #, c-format
 msgid "no writable public keyring found: %s\n"
 msgstr "non è stato trovato un portachiavi pubblico scrivibile: %s\n"
 
-#, fuzzy, c-format
-#| msgid "error writing public keyring `%s': %s\n"
+#, c-format
 msgid "error writing public keyring '%s': %s\n"
-msgstr "errore scrivendo il portachiavi pubblico `%s': %s\n"
+msgstr "errore durante la scrittura della chiave pubblica '%s': %s\n"
 
 msgid "public and secret key created and signed.\n"
 msgstr "chiavi pubbliche e segrete create e firmate.\n"
 
-#, fuzzy
 msgid ""
 "Note that this key cannot be used for encryption.  You may want to use\n"
 "the command \"--edit-key\" to generate a subkey for this purpose.\n"
 msgstr ""
-"Nota che questa chiave non può essere usata per cifrare. Forse vorrai usare\n"
-"il comando \"--edit-key\" per generare una chiave secondaria per questo "
-"scopo.\n"
+"Si noti che questa chiave non può essere utilizzata per la crittografia.  Si "
+"consiglia di utilizzare\n"
+"il comando \"--edit-key\" per generare una sottochiave a questo scopo.\n"
 
 #, c-format
 msgid ""
@@ -4585,22 +4369,21 @@ msgstr ""
 "la chiave è stata creata %lu secondi nel futuro (salto nel tempo o problema\n"
 "con l'orologio)\n"
 
-#, fuzzy, c-format
-#| msgid "NOTE: creating subkeys for v3 keys is not OpenPGP compliant\n"
+#, c-format
 msgid "Note: creating subkeys for v3 keys is not OpenPGP compliant\n"
-msgstr "NB: la creazione di subchiavi per chiavi v3 non rispetta OpenPGP.\n"
+msgstr ""
+"Nota: la creazione di sottochiavi per le chiavi v3 non è conforme a OpenPGP\n"
 
 #, c-format
 msgid "Secret parts of primary key are not available.\n"
 msgstr "Parti della chiave segreta non sono disponibili.\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Secret parts of primary key are stored on-card.\n"
-msgstr "Parti della chiave segreta non sono disponibili.\n"
+msgstr "Le parti segrete della chiave primaria vengono archiviate su scheda.\n"
 
-#, fuzzy
 msgid "Really create? (y/N) "
-msgstr "Crea davvero? "
+msgstr "Davvero creare? (y/N) "
 
 msgid "never     "
 msgstr "mai       "
@@ -4612,7 +4395,7 @@ msgid "Signature policy: "
 msgstr "Politica di firma: "
 
 msgid "Critical preferred keyserver: "
-msgstr ""
+msgstr "Server chiave preferito critico: "
 
 msgid "Critical signature notation: "
 msgstr "Annotazione critica della firma: "
@@ -4620,25 +4403,25 @@ msgstr "Annotazione critica della firma: "
 msgid "Signature notation: "
 msgstr "Annotazione della firma: "
 
-#, fuzzy, c-format
-#| msgid "%d bad signatures\n"
+#, c-format
 msgid "%d good signature\n"
 msgid_plural "%d good signatures\n"
-msgstr[0] "%d firme non corrette\n"
-msgstr[1] "%d firme non corrette\n"
+msgstr[0] "%d buona firma\n"
+msgstr[1] "%d buone firme\n"
 
-#, fuzzy, c-format
-#| msgid "1 signature not checked due to an error\n"
+#, c-format
 msgid "%d signature not checked due to an error\n"
 msgid_plural "%d signatures not checked due to errors\n"
-msgstr[0] "una firma non controllata a causa di un errore\n"
-msgstr[1] "una firma non controllata a causa di un errore\n"
+msgstr[0] "Firma %d non controllata a causa di un errore\n"
+msgstr[1] ""
+"Firme %d non controllate a causa di errori\n"
+"\n"
 
 #, c-format
 msgid "Warning: %lu key skipped due to its large size\n"
 msgid_plural "Warning: %lu keys skipped due to their large sizes\n"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Avviso: chiave %lu ignorata a causa delle dimensioni grandi\n"
+msgstr[1] "Avviso: chiavi %lu ignorate a causa delle dimensioni grandi\n"
 
 msgid "Keyring"
 msgstr "Portachiavi"
@@ -4657,125 +4440,122 @@ msgstr " Impronta digitale della chiave primaria:"
 msgid "      Subkey fingerprint:"
 msgstr "     Impronta digitale della subchiave:"
 
-#, fuzzy
 msgid "      Key fingerprint ="
-msgstr "     Impronta digitale ="
+msgstr "     Impronta digitale della chiave ="
 
 msgid "      Card serial no. ="
-msgstr ""
+msgstr "      Numero seriale della scheda ="
 
-#, fuzzy, c-format
+#, c-format
 msgid "caching keyring '%s'\n"
-msgstr "controllo il portachiavi `%s'\n"
+msgstr "chiave di memorizzazione nella cache '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "%lu keys cached so far (%lu signature)\n"
 msgid_plural "%lu keys cached so far (%lu signatures)\n"
-msgstr[0] "Sono state controllate %lu chiavi (%lu firme)\n"
+msgstr[0] "E' stata controllata %lu chiave (%lu firma)\n"
 msgstr[1] "Sono state controllate %lu chiavi (%lu firme)\n"
 
 #, c-format
 msgid "%lu key cached"
 msgid_plural "%lu keys cached"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Chiave %lu memorizzata nella cache"
+msgstr[1] "Chiavi %lu memorizzata nella cache"
 
-#, fuzzy, c-format
-#| msgid "1 bad signature\n"
+#, c-format
 msgid " (%lu signature)\n"
 msgid_plural " (%lu signatures)\n"
-msgstr[0] "una firma non corretta\n"
-msgstr[1] "una firma non corretta\n"
+msgstr[0] " (firma %lu)\n"
+msgstr[1] " (firme %lu)\n"
 
 #, c-format
 msgid "%s: keyring created\n"
 msgstr "%s: portachiavi creato\n"
 
 msgid "override proxy options set for dirmngr"
-msgstr ""
+msgstr "ignorare le opzioni proxy impostate per dirmngr"
 
 msgid "include revoked keys in search results"
-msgstr ""
+msgstr "includere chiavi revocate nei risultati della ricerca"
 
 msgid "include subkeys when searching by key ID"
-msgstr ""
+msgstr "includere le sottochiavi durante la ricerca in base all'ID chiave"
 
 msgid "override timeout options set for dirmngr"
-msgstr ""
+msgstr "opzioni di timeout di override impostate per dirmngr"
 
 msgid "automatically retrieve keys when verifying signatures"
-msgstr ""
+msgstr "recuperare automaticamente le chiavi durante la verifica delle firme"
 
-#, fuzzy
 msgid "honor the preferred keyserver URL set on the key"
-msgstr "l'URL della politica di firma indicato non è valido\n"
+msgstr "rispettare l'URL del keyserver preferito impostato sulla chiave"
 
 msgid "honor the PKA record set on a key when retrieving keys"
 msgstr ""
+"rispettare il record PKA impostato su una chiave durante il recupero delle "
+"chiavi"
 
-#, fuzzy
 msgid "disabled"
-msgstr "disable"
+msgstr "disabilitato"
 
 msgid "Enter number(s), N)ext, or Q)uit > "
-msgstr ""
+msgstr "Immettere numeri, N)ext o Q)uit > "
 
-#, fuzzy, c-format
+#, c-format
 msgid "invalid keyserver protocol (us %d!=handler %d)\n"
-msgstr "opzioni di esportazione non valide\n"
+msgstr "protocollo keyserver non valido (noi %d!=intestazione %d!)\n"
 
 #, c-format
 msgid "\"%s\" not a key ID: skipping\n"
-msgstr ""
+msgstr "\"%s\" non è un ID chiave:\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "refreshing %d key from %s\n"
 msgid_plural "refreshing %d keys from %s\n"
-msgstr[0] "richiedo la chiave %08lX a %s\n"
-msgstr[1] "richiedo la chiave %08lX a %s\n"
+msgstr[0] "aggiornamento della chiave %d da %s\n"
+msgstr[1] ""
+"aggiornamento della chiavi %d da %s\n"
+"\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "WARNING: unable to refresh key %s via %s: %s\n"
-msgstr "ATTENZIONE: impossibile cancellare il file temporaneo (%s) `%s': %s\n"
+msgstr "AVVISO: impossibile aggiornare la chiave %s tramite %s: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key \"%s\" not found on keyserver\n"
-msgstr "chiave `%s' non trovata: %s\n"
+msgstr "chiave \"%s\" non trovata nel keyserver\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key not found on keyserver\n"
-msgstr "chiave `%s' non trovata: %s\n"
+msgstr "chiave non trovata nel keyserver\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "requesting key %s from %s server %s\n"
-msgstr "richiedo la chiave %08lX a %s\n"
+msgstr "richiesta della chiave %s dal server %s %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "requesting key %s from %s\n"
-msgstr "richiedo la chiave %08lX a %s\n"
+msgstr "richiesta della chiave %s da %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "no keyserver known\n"
-msgstr "opzioni di esportazione non valide\n"
+msgstr "nessun keyserver noto\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "skipped \"%s\": %s\n"
-msgstr "saltata `%s': %s\n"
+msgstr "\"%s\" ignorato: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "sending key %s to %s\n"
-msgstr ""
-"\"\n"
-"firmata con la tua chiave %08lX il %s\n"
-"\n"
+msgstr "invio della chiave %s a %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "requesting key from '%s'\n"
-msgstr "richiedo la chiave %08lX a %s\n"
+msgstr "richiesta di chiave da '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "WARNING: unable to fetch URI %s: %s\n"
-msgstr "ATTENZIONE: impossibile cancellare il file temporaneo (%s) `%s': %s\n"
+msgstr "AVVISO: impossibile recuperare l'URI %s: %s\n"
 
 #, c-format
 msgid "weird size for an encrypted session key (%d)\n"
@@ -4785,29 +4565,31 @@ msgstr "la chiave di sessione cifrata ha dimensioni strane (%d)\n"
 msgid "%s encrypted session key\n"
 msgstr "chiave di sessione cifrata con %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "passphrase generated with unknown digest algorithm %d\n"
-msgstr "cifrato con l'algoritmo sconosciuto %d\n"
+msgstr "passphrase generata con algoritmo digest sconosciuto %d\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "public key is %s\n"
-msgstr "la chiave pubblica è %08lX\n"
+msgstr "la chiave pubblica è %s\n"
 
 #, c-format
 msgid "public key encrypted data: good DEK\n"
 msgstr "dati cifrati con la chiave pubblica: DEK corretto\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "encrypted with %u-bit %s key, ID %s, created %s\n"
-msgstr "cifrato con la chiave %2$s di %1$u bit, ID %3$08lX, creata il %4$s\n"
+msgstr "crittografata con la chiave %u bit %s, ID %s, creata %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "      \"%s\"\n"
-msgstr "                alias \""
+msgstr "      \"%s\"\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "encrypted with %s key, ID %s\n"
-msgstr "Cifrato con la chiave %s con ID %08lX\n"
+msgstr ""
+"crittografata con chiave %s, ID %s\n"
+"\n"
 
 #, c-format
 msgid "public key decryption failed: %s\n"
@@ -4815,7 +4597,7 @@ msgstr "decifratura della chiave pubblica fallita: %s\n"
 
 #, c-format
 msgid "WARNING: multiple plaintexts seen\n"
-msgstr ""
+msgstr "AVVISO: più testo in chiaro visti\n"
 
 #, c-format
 msgid "encrypted with %lu passphrases\n"
@@ -4842,15 +4624,17 @@ msgid ""
 "likely that this message is legitimate.  This is because back\n"
 "then integrity protection was not widely used.\n"
 msgstr ""
+"Suggerimento: Se questo messaggio è stato creato prima dell'anno 2003,\n"
+"probabile che questo messaggio sia legittimo.  Questo perché indietro\n"
+"quindi la protezione dell'integrità non è stata ampiamente utilizzata.\n"
 
 #, c-format
 msgid "Use the option '%s' to decrypt anyway.\n"
-msgstr ""
+msgstr "Utilizzare comunque l'opzione '%s' per decrittografare.\n"
 
-#, fuzzy, c-format
-#| msgid "decryption failed: %s\n"
+#, c-format
 msgid "decryption forced to fail!\n"
-msgstr "decifratura fallita: %s\n"
+msgstr "decrittazione costretto a fallire!\n"
 
 #, c-format
 msgid "decryption okay\n"
@@ -4864,10 +4648,9 @@ msgstr "ATTENZIONE: il messaggio cifrato è stato manipolato!\n"
 msgid "decryption failed: %s\n"
 msgstr "decifratura fallita: %s\n"
 
-#, fuzzy, c-format
-#| msgid "NOTE: sender requested \"for-your-eyes-only\"\n"
+#, c-format
 msgid "Note: sender requested \"for-your-eyes-only\"\n"
-msgstr "NOTA: il mittente ha richiesto \"solo-per-i-tuoi-occhi\"\n"
+msgstr "Nota: mittente richiesto \"solo per i tuoi occhi\"\n"
 
 #, c-format
 msgid "original file name='%.*s'\n"
@@ -4877,45 +4660,45 @@ msgstr "nome del file originale='%.*s'\n"
 msgid "standalone revocation - use \"gpg --import\" to apply\n"
 msgstr "revoca solitaria - usa \"gpg --import\" per applicarla\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "no signature found\n"
-msgstr "Firma valida da \""
+msgstr "nessuna firma trovata\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "BAD signature from \"%s\""
-msgstr "Firma NON corretta da \""
+msgstr "Firma BAD da \"%s\""
 
-#, fuzzy, c-format
+#, c-format
 msgid "Expired signature from \"%s\""
-msgstr "Firma scaduta da \""
+msgstr "Firma scaduta da \"%s\""
 
-#, fuzzy, c-format
+#, c-format
 msgid "Good signature from \"%s\""
-msgstr "Firma valida da \""
+msgstr "Firma valida da \"%s\""
 
 #, c-format
 msgid "signature verification suppressed\n"
 msgstr "verifica della firma soppressa\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "can't handle this ambiguous signature data\n"
-msgstr "impossibile gestire queste firme multiple\n"
+msgstr "impossibile gestire questi dati di firma ambigui\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Signature made %s\n"
-msgstr "Firma scaduta il %s\n"
+msgstr "Firma effettuata %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "               using %s key %s\n"
-msgstr "                alias \""
+msgstr "               utilizzando la chiave %s %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Signature made %s using %s key ID %s\n"
-msgstr "Firma fatta %.*s usando %s con ID %08lX\n"
+msgstr "Firma effettuata %s utilizzando l'ID chiave %s %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "               issuer \"%s\"\n"
-msgstr "                alias \""
+msgstr "               autorità emittente \"%s\"\n"
 
 #, c-format
 msgid "Key available at: "
@@ -4923,19 +4706,18 @@ msgstr "Chiave disponibile presso: "
 
 #, c-format
 msgid "Note: Use '%s' to make use of this info\n"
-msgstr ""
+msgstr "Nota: utilizzare '%s' per utilizzare queste informazioni\n"
 
 msgid "[uncertain]"
 msgstr "[incerta]"
 
-#, fuzzy, c-format
+#, c-format
 msgid "                aka \"%s\""
-msgstr "                alias \""
+msgstr "                 aka \"%s\""
 
-#, fuzzy, c-format
-#| msgid "WARNING: This key is not certified with a trusted signature!\n"
+#, c-format
 msgid "WARNING: This key is not suitable for signing in %s mode\n"
-msgstr "ATTENZIONE: questa chiave non è certificata con una firma fidata!\n"
+msgstr "AVVISO: questa chiave non è adatta per l'accesso in modalità %s\n"
 
 #, c-format
 msgid "Signature expired %s\n"
@@ -4945,10 +4727,9 @@ msgstr "Firma scaduta il %s\n"
 msgid "Signature expires %s\n"
 msgstr "Questa firma scadrà il %s\n"
 
-#, fuzzy, c-format
-#| msgid "%s signature, digest algorithm %s\n"
+#, c-format
 msgid "%s signature, digest algorithm %s%s%s\n"
-msgstr "Firma %s, algoritmo di digest %s\n"
+msgstr "Firma %s, algoritmo digest %s%s%s\n"
 
 msgid "binary"
 msgstr "binario"
@@ -4959,14 +4740,13 @@ msgstr "modo testo"
 msgid "unknown"
 msgstr "sconosciuto"
 
-#, fuzzy
-#| msgid "unknown pubkey algorithm"
 msgid ", key algorithm "
-msgstr "algoritmo della chiave pubblica sconosciuto"
+msgstr ", algoritmo a chiave "
 
 #, c-format
 msgid "WARNING: not a detached signature; file '%s' was NOT verified!\n"
 msgstr ""
+"AVVISO: non è una firma disconnessa; il file '%s' NON è stato verificato!\n"
 
 #, c-format
 msgid "Can't check signature: %s\n"
@@ -4989,57 +4769,55 @@ msgstr "firma solitaria di classe 0x%02x\n"
 msgid "old style (PGP 2.x) signature\n"
 msgstr "firma vecchio stile (PGP 2.x)\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "fstat of '%s' failed in %s: %s\n"
-msgstr "impossibile aprire il file: %s\n"
+msgstr "fstat di '%s' non riuscito in %s: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "fstat(%d) failed in %s: %s\n"
-msgstr "trustdb: read fallita (n=%d): %s\n"
+msgstr "fstat(%d) non riuscito in %s: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "WARNING: using experimental public key algorithm %s\n"
-msgstr "impossibile gestire l'algoritmo a chiave pubblica %d\n"
+msgstr "AVVISO: utilizzo dell'algoritmo a chiave pubblica sperimentale %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "WARNING: Elgamal sign+encrypt keys are deprecated\n"
-msgstr ""
-"forzare l'algoritmo di digest %s (%d) viola le preferenze del destinatario\n"
+msgstr "AVVISO: le chiavi Elgamal sign-encrypt sono deprecate\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "WARNING: using experimental cipher algorithm %s\n"
-msgstr "algoritmo di cifratura non implementato"
+msgstr "AVVISO: utilizzo dell'algoritmo di crittografia sperimentale %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "WARNING: using experimental digest algorithm %s\n"
-msgstr "Firma %s, algoritmo di digest %s\n"
+msgstr "AVVISO: utilizzo dell'algoritmo digest sperimentale %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "WARNING: digest algorithm %s is deprecated\n"
-msgstr ""
-"forzare l'algoritmo di digest %s (%d) viola le preferenze del destinatario\n"
+msgstr "AVVISO: l'algoritmo digest %s è deprecato\n"
 
-#, fuzzy, c-format
-#| msgid "%s signature, digest algorithm %s\n"
+#, c-format
 msgid "Note: signatures using the %s algorithm are rejected\n"
-msgstr "Firma %s, algoritmo di digest %s\n"
+msgstr "Nota: le firme che utilizzano l'algoritmo %s vengono rifiutate\n"
 
-#, fuzzy, c-format
-#| msgid "%s signature, digest algorithm %s\n"
+#, c-format
 msgid "Note: third-party key signatures using the %s algorithm are rejected\n"
-msgstr "Firma %s, algoritmo di digest %s\n"
+msgstr ""
+"Nota: le firme di chiave di terze parti che utilizzano l'algoritmo %s "
+"vengono rifiutate\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "(reported error: %s)\n"
-msgstr "errore di lettura: %s\n"
+msgstr "(errore segnalato: %s)\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "(reported error: %s <%s>)\n"
-msgstr "errore di lettura: %s\n"
+msgstr "(errore segnalato: %s <%s>)\n"
 
 #, c-format
 msgid "(further info: "
-msgstr ""
+msgstr "(ulteriori informazioni: "
 
 #, c-format
 msgid "%s:%d: deprecated option \"%s\"\n"
@@ -5053,55 +4831,55 @@ msgstr "ATTENZIONE: \"%s\" è una opzione deprecata\n"
 msgid "please use \"%s%s\" instead\n"
 msgstr "usa al suo posto \"%s%s\"\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "WARNING: \"%s\" is a deprecated command - do not use it\n"
-msgstr "ATTENZIONE: \"%s\" è una opzione deprecata\n"
+msgstr "AVVISO: \"%s\" è un comando deprecato - non utilizzarlo\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "%s:%u: \"%s\" is obsolete in this file - it only has effect in %s\n"
-msgstr "ATTENZIONE: \"%s\" è una opzione deprecata\n"
+msgstr "%s:%u: \"%s\" è obsoleto in questo file - ha effetto solo in %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "WARNING: \"%s%s\" is an obsolete option - it has no effect except on %s\n"
-msgstr "ATTENZIONE: \"%s\" è una opzione deprecata\n"
+msgstr ""
+"AVVISO: \"%s%s\" è un'opzione obsoleta- non ha alcun effetto ad eccezione di "
+"%s\n"
 
 msgid "Uncompressed"
 msgstr "Non compresso"
 
 #. TRANSLATORS: See doc/TRANSLATE about this string.
-#, fuzzy
 msgid "uncompressed|none"
-msgstr "Non compresso"
+msgstr "non compresso|nessuno"
 
 #, c-format
 msgid "this message may not be usable by %s\n"
 msgstr "questo messaggio può non essere utilizzabile da %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "ambiguous option '%s'\n"
-msgstr "lettura delle opzioni da `%s'\n"
+msgstr "opzione ambigua '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "unknown option '%s'\n"
-msgstr "destinatario predefinito `%s' sconosciuto\n"
+msgstr "opzione sconosciuta '%s'\n"
 
 #, c-format
 msgid "ECDSA public key is expected to be in SEC encoding multiple of 8 bits\n"
 msgstr ""
+"La chiave pubblica ECDSA dovrebbe essere in codifica SEC multipla di 8 bit\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "unknown weak digest '%s'\n"
-msgstr "classe della firma sconosciuta"
+msgstr "digest debole sconosciuto '%s'\n"
 
-#, fuzzy, c-format
-#| msgid "File `%s' exists. "
+#, c-format
 msgid "File '%s' exists. "
-msgstr "Il file `%s' esiste. "
+msgstr "Il file '%s' esiste. "
 
-#, fuzzy
 msgid "Overwrite? (y/N) "
-msgstr "Sovrascrivo (s/N)? "
+msgstr "Sovrascrivere? (y/N) "
 
 #, c-format
 msgid "%s: unknown suffix\n"
@@ -5114,10 +4892,9 @@ msgstr "Inserire il nuovo nome del file"
 msgid "writing to stdout\n"
 msgstr "scrivo su stdout\n"
 
-#, fuzzy, c-format
-#| msgid "assuming signed data in `%s'\n"
+#, c-format
 msgid "assuming signed data in '%s'\n"
-msgstr "suppongo che i dati firmati siano in `%s'\n"
+msgstr "presupponendo i dati firmati in '%s'\n"
 
 #, c-format
 msgid "can't handle public key algorithm %d\n"
@@ -5129,18 +4906,17 @@ msgstr ""
 "ATTENZIONE: la chiave di sessione cifrata simmetricamente è potenzialmente\n"
 "non sicura\n"
 
-#, fuzzy, c-format
-#| msgid "Critical signature notation: "
+#, c-format
 msgid "Unknown critical signature notation: "
-msgstr "Annotazione critica della firma: "
+msgstr "Notazione della firma critica sconosciuta: "
 
 #, c-format
 msgid "subpacket of type %d has critical bit set\n"
 msgstr "il sottopacchetto di tipo %d ha un bit critico impostato\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "problem with the agent: %s\n"
-msgstr "problema con l'agent: ha restituito 0x%lx\n"
+msgstr "problema con l'agente: %s\n"
 
 msgid "Enter passphrase\n"
 msgstr "Inserisci la passphrase\n"
@@ -5149,42 +4925,43 @@ msgstr "Inserisci la passphrase\n"
 msgid "cancelled by user\n"
 msgstr "interrotto dall'utente\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid " (main key ID %s)"
-msgstr " (key ID principale %08lX)"
+msgstr " (ID chiave principale %s)"
 
-#, fuzzy
 msgid "Please enter the passphrase to unlock the OpenPGP secret key:"
-msgstr "Inserisci la passphrase, cioè una frase segreta \n"
+msgstr "Immettere la passphrase per sbloccare la chiave segreta OpenPGP:"
 
-#, fuzzy
 msgid "Please enter the passphrase to import the OpenPGP secret key:"
-msgstr "Inserisci la passphrase, cioè una frase segreta \n"
+msgstr "Immettere la passphrase per importare la chiave segreta OpenPGP:"
 
-#, fuzzy
 msgid "Please enter the passphrase to export the OpenPGP secret subkey:"
-msgstr "Inserisci la passphrase, cioè una frase segreta \n"
+msgstr "Immettere la passphrase per esportare la sottochiave segreta OpenPGP:"
 
-#, fuzzy
 msgid "Please enter the passphrase to export the OpenPGP secret key:"
-msgstr "Inserisci la passphrase, cioè una frase segreta \n"
+msgstr "Immettere la passphrase per esportare la chiave segreta OpenPGP:"
 
-#, fuzzy
 msgid "Do you really want to permanently delete the OpenPGP secret subkey key:"
-msgstr "Vuoi davvero cancellare le chiavi selezionate? "
+msgstr ""
+"Si desidera eliminare definitivamente la chiave della sottochiave segreta "
+"OpenPGP:"
 
-#, fuzzy
 msgid "Do you really want to permanently delete the OpenPGP secret key:"
-msgstr "Vuoi davvero cancellare le chiavi selezionate? "
+msgstr "Si desidera eliminare definitivamente la chiave segreta OpenPGP:"
 
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "%s\n"
 "\"%.*s\"\n"
 "%u-bit %s key, ID %s,\n"
 "created %s%s.\n"
 "%s"
-msgstr "chiave %2$s di %1$u bit, ID %3$08lX, creata il %4$s"
+msgstr ""
+"%s\n"
+"\"%.*s\"\n"
+"%u-bit chiave %s, ID %s,\n"
+"creato %s%s.\n"
+"%s"
 
 msgid ""
 "\n"
@@ -5205,21 +4982,20 @@ msgstr ""
 msgid "Enter JPEG filename for photo ID: "
 msgstr "Inserisci il nome del file JPEG per l'ID fotografico: "
 
-#, fuzzy, c-format
+#, c-format
 msgid "unable to open JPEG file '%s': %s\n"
-msgstr "impossibile aprire il file: %s\n"
+msgstr "impossibile aprire il file JPEG '%s': %s\n"
 
 #, c-format
 msgid "This JPEG is really large (%d bytes) !\n"
-msgstr ""
+msgstr "Questo JPEG è davvero grande (%d byte) !\n"
 
-#, fuzzy
 msgid "Are you sure you want to use it? (y/N) "
-msgstr "Sei sicuro di volerla usare? (s/N) "
+msgstr "Sei sicuro di volerlo usare? (y/N) "
 
-#, fuzzy, c-format
+#, c-format
 msgid "'%s' is not a JPEG file\n"
-msgstr "\"%s\": non è un file JPEG\n"
+msgstr "'%s' non è un file JPEG\n"
 
 msgid "Is this photo correct (y/N/q)? "
 msgstr "Questa foto è giusta? (s/N/q) "
@@ -5241,74 +5017,71 @@ msgstr "impossibile mostrare l'ID fotografico\n"
 msgid "iImMqQsS"
 msgstr "iImMqQsS"
 
-#, fuzzy
 msgid "No trust value assigned to:\n"
-msgstr ""
-"Nessun valore di fiducia assegnato a:\n"
-"%4u%c/%08lX %s \""
+msgstr "Nessun valore di attendibilità assegnato a:\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "  aka \"%s\"\n"
-msgstr "                alias \""
+msgstr "  aka \"%s\"\n"
 
-#, fuzzy
 msgid ""
 "How much do you trust that this key actually belongs to the named user?\n"
-msgstr "Questa chiave probabilmente appartiene al proprietario\n"
+msgstr ""
+"Quanto si considera attendibile che questa chiave appartenga effettivamente "
+"all'utente denominato?\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "  %d = I don't know or won't say\n"
-msgstr " %d = Non lo so\n"
+msgstr "  %d = Non so o non dirò\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "  %d = I do NOT trust\n"
-msgstr " %d = NON mi fido\n"
+msgstr "  %d = Non mi fido\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "  %d = I trust ultimately\n"
-msgstr " %d = Mi fido definitivamente\n"
+msgstr "  %d = Mi fido in ultima analisi\n"
 
-#, fuzzy
 msgid "  m = back to the main menu\n"
-msgstr " m = torna al menù principale\n"
+msgstr "  m = torna al menu principale\n"
 
-#, fuzzy
 msgid "  s = skip this key\n"
-msgstr " s = salta questa chiave\n"
+msgstr "  s = salta questa chiave\n"
 
-#, fuzzy
 msgid "  q = quit\n"
-msgstr " q = abbandona\n"
+msgstr "  q = uscire\n"
 
 #, c-format
 msgid ""
 "The minimum trust level for this key is: %s\n"
 "\n"
 msgstr ""
+"Il livello di attendibilità minimo per questa chiave è: %s\n"
+"\n"
 
 msgid "Your decision? "
 msgstr "Cosa hai deciso? "
 
-#, fuzzy
 msgid "Do you really want to set this key to ultimate trust? (y/N) "
-msgstr "Vuoi davvero assegnare fiducia definitiva a questa chiave? "
+msgstr "Vuoi davvero impostare questa chiave per la massima fiducia? (y/N) "
 
 msgid "Certificates leading to an ultimately trusted key:\n"
 msgstr "Certificati che portano a chiavi definitivamente affidabili:\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "%s: There is no assurance this key belongs to the named user\n"
 msgstr ""
-"%08lX: Non ci sono indicazioni che la chiave appartenga al proprietario\n"
+"%s: non esiste alcuna garanzia che questa chiave appartenga all'utente "
+"denominato\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "%s: There is limited assurance this key belongs to the named user\n"
 msgstr ""
-"%08lX: Non ci sono indicazioni che la chiave appartenga al proprietario\n"
+"%s: garanzia limitata che questa chiave appartenga all'utente denominato\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "This key probably belongs to the named user\n"
-msgstr "Questa chiave probabilmente appartiene al proprietario\n"
+msgstr "Questa chiave probabilmente appartiene all'utente denominato\n"
 
 #, c-format
 msgid "This key belongs to us\n"
@@ -5317,32 +5090,30 @@ msgstr "Questa chiave ci appartiene\n"
 #, c-format
 msgid "%s: This key is bad!  It has been marked as untrusted!\n"
 msgstr ""
+"%s: questa chiave non è valido!  È stato contrassegnato come non "
+"attendibile!\n"
 
-#, fuzzy
 msgid ""
 "This key is bad!  It has been marked as untrusted!  If you\n"
 "*really* know what you are doing, you may answer the next\n"
 "question with yes.\n"
 msgstr ""
-"NON è sicuro che la chiave appartenga alla persona indicata.\n"
-"nell'user ID. Se sai *davvero* cosa stai facendo, puoi\n"
-"rispondere sì alla prossima domanda.\n"
-"\n"
+"Questa chiave è cattiva!  È stato contrassegnato come non attendibile!  Se "
+"si\n"
+"\"davvero, sai quello che stai facendo, potresti rispondere al prossimo\n"
+"domanda con sì.\n"
 
-#, fuzzy
 msgid ""
 "It is NOT certain that the key belongs to the person named\n"
 "in the user ID.  If you *really* know what you are doing,\n"
 "you may answer the next question with yes.\n"
 msgstr ""
-"NON è sicuro che la chiave appartenga alla persona indicata.\n"
-"nell'user ID. Se sai *davvero* cosa stai facendo, puoi\n"
-"rispondere sì alla prossima domanda.\n"
-"\n"
+"NON è certo che la chiave appartenga alla persona denominata\n"
+"nell'ID utente.  Se sai davvero quello che stai facendo,\n"
+"si può rispondere alla prossima domanda con sì.\n"
 
-#, fuzzy
 msgid "Use this key anyway? (y/N) "
-msgstr "Uso lo stesso questa chiave? "
+msgstr "Utilizzare comunque questa chiave? (y/N) "
 
 #, c-format
 msgid "WARNING: Using untrusted key!\n"
@@ -5363,9 +5134,9 @@ msgstr ""
 msgid "WARNING: This key has been revoked by its owner!\n"
 msgstr "ATTENZIONE: questa chiave è stata revocata dal suo proprietario!\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "         This could mean that the signature is forged.\n"
-msgstr "         Questo può significare che la firma è stata falsificata.\n"
+msgstr "         Questo potrebbe significare che la firma è contraffatta.\n"
 
 #, c-format
 msgid "WARNING: This subkey has been revoked by its owner!\n"
@@ -5377,19 +5148,19 @@ msgstr "Nota: questa chiave è stata disabilitata.\n"
 
 #, c-format
 msgid "Note: Verified signer's address is '%s'\n"
-msgstr ""
+msgstr "Nota: l'indirizzo del firmatario verificato è '%s'\n"
 
 #, c-format
 msgid "Note: Signer's address '%s' does not match DNS entry\n"
-msgstr ""
+msgstr "Nota: l'indirizzo del firmatario '%s' non corrisponde alla voce DNS\n"
 
 #, c-format
 msgid "trustlevel adjusted to FULL due to valid PKA info\n"
-msgstr ""
+msgstr "trustlevel adattato a FULL a causa di informazioni PKA valide\n"
 
 #, c-format
 msgid "trustlevel adjusted to NEVER due to bad PKA info\n"
-msgstr ""
+msgstr "trustlevel modificato MAI a causa di informazioni PKA non valido\n"
 
 #, c-format
 msgid "Note: This key has expired!\n"
@@ -5435,24 +5206,26 @@ msgstr "%s: saltata: chiave pubblica disabilitata\n"
 msgid "%s: skipped: public key already present\n"
 msgstr "%s: saltata: chiave pubblica già presente\n"
 
-#, fuzzy, c-format
-#| msgid "can't connect to `%s': %s\n"
+#, c-format
 msgid "can't encrypt to '%s'\n"
-msgstr "impossibile connettersi a `%s': %s\n"
+msgstr "impossibile crittografare in '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "option '%s' given, but no valid default keys given\n"
-msgstr "algoritmo di hash non valido `%s'\n"
+msgstr ""
+"l'opzione '%s' specificata, ma non sono state fornite chiavi predefinite "
+"valide\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "option '%s' given, but option '%s' not given\n"
-msgstr "algoritmo di hash non valido `%s'\n"
+msgstr ""
+"l'opzione '%s' specificata, ma l'opzione '%s' non è stata specificata\n"
 
 msgid "You did not specify a user ID. (you may use \"-r\")\n"
 msgstr "Non hai specificato un user ID. (puoi usare \"-r\")\n"
 
 msgid "Current recipients:\n"
-msgstr ""
+msgstr "Destinatari correnti:\n"
 
 msgid ""
 "\n"
@@ -5475,21 +5248,21 @@ msgstr "La chiave pubblica è disabilitata.\n"
 msgid "skipped: public key already set\n"
 msgstr "saltata: chiave pubblica già impostata\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "unknown default recipient \"%s\"\n"
-msgstr "destinatario predefinito `%s' sconosciuto\n"
+msgstr "destinatario predefinito sconosciuto \"%s\"\n"
 
 #, c-format
 msgid "no valid addressees\n"
 msgstr "nessun indirizzo valido\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Note: key %s has no %s feature\n"
-msgstr "chiave %08lX: nessun user ID\n"
+msgstr "Nota: la chiave %s non ha funzionalità %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Note: key %s has no preference for %s\n"
-msgstr "chiave %08lX: nessun user ID\n"
+msgstr "Nota: la chiave %s non ha preferenze per %s\n"
 
 #, c-format
 msgid "data not saved; use option \"--output\" to save it\n"
@@ -5510,22 +5283,21 @@ msgstr "viene letto stdin...\n"
 msgid "no signed data\n"
 msgstr "non ci sono dati firmati\n"
 
-#, fuzzy, c-format
-#| msgid "can't open signed data `%s'\n"
+#, c-format
 msgid "can't open signed data '%s'\n"
-msgstr "impossibile aprire i dati firmati `%s'\n"
+msgstr "impossibile aprire i dati firmati '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "can't open signed data fd=%d: %s\n"
-msgstr "impossibile aprire i dati firmati `%s'\n"
+msgstr "impossibile aprire i dati firmati fd=%d: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s is not suitable for decryption in %s mode\n"
-msgstr "chiave %08lX: nessun user ID\n"
+msgstr "la chiave %s non è adatta per la decrittografia in modalità %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "anonymous recipient; trying secret key %s ...\n"
-msgstr "destinatario anonimo; provo la chiave segreta %08lX ...\n"
+msgstr "destinatario anonimo; tentativo di chiave segreta %s...\n"
 
 #, c-format
 msgid "okay, we are the anonymous recipient.\n"
@@ -5539,27 +5311,27 @@ msgstr "la vecchia codifica del DEK non è gestita\n"
 msgid "cipher algorithm %d%s is unknown or disabled\n"
 msgstr "l'algoritmo di cifratura %d%s è sconosciuto o disattivato\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "WARNING: cipher algorithm %s not found in recipient preferences\n"
 msgstr ""
-"NOTA: l'algoritmo di cifratura %d non è stato trovato tra le preferenze\n"
+"AVVISO: algoritmo di crittografia %s non trovato nelle preferenze del "
+"destinatario\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Note: secret key %s expired at %s\n"
-msgstr "NOTA: chiave %08lX scaduta il %s\n"
+msgstr "Nota: chiave segreta %s scaduta alle %s\n"
 
-#, fuzzy, c-format
-#| msgid "NOTE: key has been revoked"
+#, c-format
 msgid "Note: key has been revoked"
-msgstr "NOTA: la chiave è stata revocata"
+msgstr "Nota: la chiave è stata revocata"
 
 #, c-format
 msgid "build_packet failed: %s\n"
 msgstr "build_packet fallito: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s has no user IDs\n"
-msgstr "chiave %08lX: nessun user ID\n"
+msgstr "la chiave %s non ha ID utente\n"
 
 msgid "To be revoked by:\n"
 msgstr "Revocabile da:\n"
@@ -5567,14 +5339,11 @@ msgstr "Revocabile da:\n"
 msgid "(This is a sensitive revocation key)\n"
 msgstr "(Questa è una chiave di revoca sensibile)\n"
 
-#, fuzzy
-#| msgid "Secret key is available.\n"
 msgid "Secret key is not available.\n"
-msgstr "È disponibile una chiave segreta.\n"
+msgstr "La chiave segreta non è disponibile.\n"
 
-#, fuzzy
 msgid "Create a designated revocation certificate for this key? (y/N) "
-msgstr "Creare un certificato di revoca per questa chiave? "
+msgstr "Creare un certificato di revoca designato per questa chiave? (y/N) "
 
 msgid "ASCII armored output forced.\n"
 msgstr "Forzato l'output con armatura ASCII.\n"
@@ -5586,19 +5355,22 @@ msgstr "make_keysig_packet fallito: %s\n"
 msgid "Revocation certificate created.\n"
 msgstr "Certificato di revoca creato.\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "no revocation keys found for \"%s\"\n"
-msgstr "non sono state trovate chiavi di revoca per `%s'\n"
+msgstr "nessuna chiave di revoca trovata per \"%s\"\n"
 
-#, fuzzy
 msgid "This is a revocation certificate for the OpenPGP key:"
-msgstr "Creare un certificato di revoca per questa chiave? "
+msgstr "Questo è un certificato di revoca per la chiave OpenPGP:"
 
 msgid ""
 "A revocation certificate is a kind of \"kill switch\" to publicly\n"
 "declare that a key shall not anymore be used.  It is not possible\n"
 "to retract such a revocation certificate once it has been published."
 msgstr ""
+"Un certificato di revoca è una sorta di \"interruttore di emergenza\" per\n"
+"dichiarare pubblicamente che una certa chiave non deve essere più usata.\n"
+"Non è possibile ritirare un certificato di revoca una volta che è stato\n"
+"pubblicato."
 
 msgid ""
 "Use it to revoke this key in case of a compromise or loss of\n"
@@ -5607,37 +5379,43 @@ msgid ""
 "a reason for the revocation.  For details see the description of\n"
 "of the gpg command \"--generate-revocation\" in the GnuPG manual."
 msgstr ""
+"Utilizzare per revocare questa chiave in caso di compromissione o perdita "
+"di\n"
+"la chiave segreta.  Tuttavia, se la chiave segreta è ancora accessibile,\n"
+"è meglio generare un nuovo certificato di revoca e dare\n"
+"un motivo per la revoca.  Per i dettagli, vedere la descrizione di\n"
+"del comando gpg \"--generate-revocation\" nel manuale GnuPG."
 
 msgid ""
 "To avoid an accidental use of this file, a colon has been inserted\n"
 "before the 5 dashes below.  Remove this colon with a text editor\n"
 "before importing and publishing this revocation certificate."
 msgstr ""
+"Per evitare un uso accidentale di questo file, sono stati aggiunti due\n"
+"punti prima dei 5 trattini in basso. Rimuovere tali due punti con un\n"
+"editor di testo prima di importare e pubblicare il certificato di revoca."
 
-#, fuzzy, c-format
-#| msgid "Revocation certificate created.\n"
+#, c-format
 msgid "revocation certificate stored as '%s.rev'\n"
-msgstr "Certificato di revoca creato.\n"
+msgstr "certificato di revoca archiviato come '%s.rev'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "secret key \"%s\" not found\n"
-msgstr "chiave segreta `%s' non trovata: %s\n"
+msgstr "chiave segreta \"%s\" non trovata\n"
 
 #. TRANSLATORS: The %s prints a key specification which
 #. for example has been given at the command line.  Several lines
 #. lines with secret key infos are printed after this message.
 #, c-format
 msgid "'%s' matches multiple secret keys:\n"
-msgstr ""
+msgstr "'%s' corrisponde a più chiavi segrete:\n"
 
-#, fuzzy, c-format
-#| msgid "error creating keyring `%s': %s\n"
+#, c-format
 msgid "error searching the keyring: %s\n"
-msgstr "errore creando il portachiavi `%s': %s\n"
+msgstr "errore durante la ricerca del portachiave: %s\n"
 
-#, fuzzy
 msgid "Create a revocation certificate for this key? (y/N) "
-msgstr "Creare un certificato di revoca per questa chiave? "
+msgstr "Creare un certificato di revoca per questa chiave? (y/N) "
 
 msgid ""
 "Revocation certificate created.\n"
@@ -5678,9 +5456,8 @@ msgstr "Motivo della revoca: %s\n"
 msgid "(No description given)\n"
 msgstr "(Non è stata data una descrizione)\n"
 
-#, fuzzy
 msgid "Is this okay? (y/N) "
-msgstr "Va bene così? "
+msgstr "Va bene così? (y/N) "
 
 #, c-format
 msgid "weak key created - retrying\n"
@@ -5689,112 +5466,107 @@ msgstr "creata una chiave debole - riprovo\n"
 #, c-format
 msgid "cannot avoid weak key for symmetric cipher; tried %d times!\n"
 msgstr ""
-"Impossibile evitare una chiave debole per il cifrario simmetrico;\n"
-"ho provato %d volte!\n"
+"impossibile evitare una chiave debole per il cifrario simmetrico; ho provato "
+"%d volte!\n"
 
 #, c-format
 msgid "%s key %s uses an unsafe (%zu bit) hash\n"
-msgstr ""
+msgstr "La chiave %s %s utilizza un hash non sicuro (%zu bit)\n"
 
 #, c-format
 msgid "%s key %s requires a %zu bit or larger hash (hash is %s)\n"
 msgstr ""
+"La chiave %s %s richiede un bit %zu o un hash superiore (l'hash è %s)\n"
 
 #, c-format
 msgid "WARNING: signature digest conflict in message\n"
 msgstr "ATTENZIONE: conflitto del digest delle firme nel messaggio\n"
 
-#, fuzzy, c-format
-#| msgid "you may not use %s while in %s mode\n"
+#, c-format
 msgid "key %s may not be used for signing in %s mode\n"
-msgstr "non è possibile usare %s in modalità %s\n"
+msgstr "impossibile utilizzare la chiave %s per l'accesso in modalità %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "WARNING: signing subkey %s is not cross-certified\n"
-msgstr ""
-"ATTENZIONE: la sottochiave per firme %08lX non ha una certificature "
-"incrociata\n"
+msgstr "AVVISO: la sottochiave di firma %s non è certificata incrociata\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "please see %s for more information\n"
-msgstr " i = mostrami ulteriori informazioni\n"
+msgstr "per ulteriori informazioni, vedere %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "WARNING: signing subkey %s has an invalid cross-certification\n"
 msgstr ""
-"ATTENZIONE: la sottochiave per firme %08lX ha una certificature incrociata\n"
-"non valida\n"
+"AVVISO: la firma della sottochiave %s ha una certificazione incrociata non "
+"valida\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "public key %s is %lu second newer than the signature\n"
 msgid_plural "public key %s is %lu seconds newer than the signature\n"
-msgstr[0] "la chiave pubblica %08lX è più recente della firma di %lu secondo\n"
-msgstr[1] "la chiave pubblica %08lX è più recente della firma di %lu secondo\n"
+msgstr[0] "la chiave pubblica %s è %lu seconda più recente della firma\n"
+msgstr[1] "le chiavi pubbliche %s sono %lu seconda più recente della firma\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "public key %s is %lu day newer than the signature\n"
 msgid_plural "public key %s is %lu days newer than the signature\n"
-msgstr[0] "la chiave pubblica %08lX è più recente della firma di %lu secondo\n"
-msgstr[1] "la chiave pubblica %08lX è più recente della firma di %lu secondo\n"
+msgstr[0] "la chiave pubblica %s è %lu più recente della firma\n"
+msgstr[1] "le chiavi pubbliche %s sono %lu più recente della firma\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "key %s was created %lu second in the future (time warp or clock problem)\n"
 msgid_plural ""
 "key %s was created %lu seconds in the future (time warp or clock problem)\n"
 msgstr[0] ""
-"la chiave è stata creata %lu secondo nel futuro (salto nel tempo o problema\n"
-"con l'orologio)\n"
+"la chiave %s è stata creata %lu secondo in futuro (problema di curvatura "
+"dell'ora o orologio)\n"
 msgstr[1] ""
-"la chiave è stata creata %lu secondo nel futuro (salto nel tempo o problema\n"
-"con l'orologio)\n"
+"le chiavi %s sono stata create %lu secondo in futuro (problema di curvatura "
+"dell'ora o orologio)\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s was created %lu day in the future (time warp or clock problem)\n"
 msgid_plural ""
 "key %s was created %lu days in the future (time warp or clock problem)\n"
 msgstr[0] ""
-"la chiave è stata creata %lu secondo nel futuro (salto nel tempo o problema\n"
-"con l'orologio)\n"
+"la chiave %s è stata creata %lu giorno in futuro (problema di curvatura "
+"dell'ora o orologio)\n"
 msgstr[1] ""
-"la chiave è stata creata %lu secondo nel futuro (salto nel tempo o problema\n"
-"con l'orologio)\n"
+"le chiavi %s sono state create %lu giorni in futuro (problema di curvatura "
+"dell'ora o orologio)\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Note: signature key %s expired %s\n"
-msgstr "NOTA: chiave per firmare %08lX scaduta il %s\n"
+msgstr "Nota: chiave di firma %s scaduta %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Note: signature key %s has been revoked\n"
-msgstr "NOTA: la chiave è stata revocata"
+msgstr "Nota: la chiave di firma %s è stata revocata\n"
 
-#, fuzzy, c-format
-#| msgid "standalone signature of class 0x%02x\n"
+#, c-format
 msgid "bad key signature from key %s: %s (0x%02x, 0x%x)\n"
-msgstr "firma solitaria di classe 0x%02x\n"
+msgstr "firma chiave non valida dalla chiave %s: %s (0x%02x, 0x%x)\n"
 
-#, fuzzy, c-format
-#| msgid "standalone signature of class 0x%02x\n"
+#, c-format
 msgid "bad data signature from key %s: %s (0x%02x, 0x%x)\n"
-msgstr "firma solitaria di classe 0x%02x\n"
+msgstr "firma dati non valida dalla chiave %s: %s (0x%02x, 0x%x)\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "assuming bad signature from key %s due to an unknown critical bit\n"
 msgstr ""
-"si suppone una firma non valida della chiave %08lX a causa di un\n"
-"bit critico sconosciuto\n"
+"presupponendo una firma non valida dalla chiave %s a causa di un bit critico "
+"sconosciuto\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: no subkey for subkey revocation signature\n"
 msgstr ""
-"chiave %08lX: non c'è una subchiave per il pacchetto di revoca della "
-"subchiave\n"
+"chiave %s: nessuna sottochiave per la firma di revoca della sottochiave\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: no subkey for subkey binding signature\n"
 msgstr ""
-"chiave %08lX: non c'è una subchiave per la firma di collegamento della "
-"subchiave\n"
+"chiave %s: nessuna sottochiave per la firma di associazione della "
+"sottochiave\n"
 
 #, c-format
 msgid "WARNING: unable to %%-expand notation (too large).  Using unexpanded.\n"
@@ -5802,32 +5574,30 @@ msgstr ""
 "ATTENZIONE: impossibile espandere i %% nell'URL (troppo lunga). Usata "
 "inespansa.\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "WARNING: unable to %%-expand policy URL (too large).  Using unexpanded.\n"
 msgstr ""
-"ATTENZIONE: Impossibile espandere i %% nell'URL della policy (troppo "
-"lunga).\n"
-"Usata inespansa.\n"
+"AVVISO: impossibile espandere l'URL del criterio %%(troppo grande).  "
+"Utilizzo nonexpanded.\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "WARNING: unable to %%-expand preferred keyserver URL (too large).  Using "
 "unexpanded.\n"
 msgstr ""
-"ATTENZIONE: Impossibile espandere i %% nell'URL della policy (troppo "
-"lunga).\n"
-"Usata inespansa.\n"
+"AVVISO: impossibile espandere %%l'URL del keyserver preferito (troppo "
+"grande).  Utilizzo nonexpanded.\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "%s/%s signature from: \"%s\"\n"
-msgstr "Firma %s da: \"%s\"\n"
+msgstr "Firma %s/%s da: \"%s\"\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "WARNING: forcing digest algorithm %s (%d) violates recipient preferences\n"
 msgstr ""
-"forzare l'algoritmo di digest %s (%d) viola le preferenze del destinatario\n"
+"AVVISO: l'algoritmo digest %s (%d) viola le preferenze dei destinatari\n"
 
 #, c-format
 msgid "signing:"
@@ -5843,19 +5613,18 @@ msgstr ""
 "la chiave non è indicata come insicura - impossibile usarla con il RNG "
 "finto!\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "skipped \"%s\": duplicated\n"
-msgstr "saltata `%s': doppia\n"
+msgstr "\"%s\" ignorato: duplicato\n"
 
 #, c-format
 msgid "skipped: secret key already present\n"
 msgstr "saltata: chiave pubblica già presente\n"
 
-#, fuzzy
 msgid "this is a PGP generated Elgamal key which is not secure for signatures!"
 msgstr ""
-"saltata %s: questa è una chiave ElGamal generata da PGP che NON è sicura per "
-"le firme!\n"
+"si tratta di una chiave Elgamal generata da PGP che non è sicura per le "
+"firme!"
 
 #, c-format
 msgid "trust record %lu, type %d: write failed: %s\n"
@@ -5869,44 +5638,41 @@ msgstr ""
 "# Lista dei valori della fiducia assegnati, creata il %s\n"
 "# (Usa \"gpg --import-ownertrust\" per ripristinarli)\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error in '%s': %s\n"
-msgstr "errore leggendo `%s': %s\n"
+msgstr "errore in '%s': %s\n"
 
-#, fuzzy
 msgid "line too long"
-msgstr "riga troppo lunga\n"
+msgstr "linea troppo lunga"
 
 msgid "colon missing"
-msgstr ""
+msgstr "due punti mancanti"
 
-#, fuzzy
 msgid "invalid fingerprint"
-msgstr "errore: impronta digitale non valida\n"
+msgstr "impronta digitale non valida"
 
-#, fuzzy
 msgid "ownertrust value missing"
-msgstr "importa i valori di fiducia"
+msgstr "cambia il valore di fiducia"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error finding trust record in '%s': %s\n"
-msgstr "errore cercando il record della fiducia: %s\n"
+msgstr "errore durante la ricerca del record di attendibilità in '%s': %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "read error in '%s': %s\n"
-msgstr "errore di lettura: %s\n"
+msgstr "errore di lettura in '%s': %s\n"
 
 #, c-format
 msgid "trustdb: sync failed: %s\n"
 msgstr "trustdb: sync fallita: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "can't create lock for '%s'\n"
-msgstr "impossibile creare `%s': %s\n"
+msgstr "impossibile creare il blocco per '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "can't lock '%s'\n"
-msgstr "impossibile aprire `%s'\n"
+msgstr "impossibile bloccare '%s'\n"
 
 #, c-format
 msgid "trustdb rec %lu: lseek failed: %s\n"
@@ -5924,9 +5690,9 @@ msgstr "transazione del trustdb troppo grande\n"
 msgid "%s: directory does not exist!\n"
 msgstr "%s: la directory non esiste!\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "can't access '%s': %s\n"
-msgstr "impossibile chiudere `%s': %s\n"
+msgstr "impossibile accedere a '%s': %s\n"
 
 #, c-format
 msgid "%s: failed to create version record: %s"
@@ -5940,10 +5706,9 @@ msgstr "%s: è stato creato un trustdb non valido\n"
 msgid "%s: trustdb created\n"
 msgstr "%s: creato il trustdb\n"
 
-#, fuzzy, c-format
-#| msgid "NOTE: trustdb not writable\n"
+#, c-format
 msgid "Note: trustdb not writable\n"
-msgstr "NOTA: il trustdb non è scrivibile\n"
+msgstr "Nota: trustdb non scrivibile\n"
 
 #, c-format
 msgid "%s: invalid trustdb\n"
@@ -6001,9 +5766,9 @@ msgstr "%s: azzeramento di un record fallito: %s\n"
 msgid "%s: failed to append a record: %s\n"
 msgstr "%s: accodatura a un record fallita: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Error: The trustdb is corrupted.\n"
-msgstr "%s: creato il trustdb\n"
+msgstr "Errore: trustdb danneggiato.\n"
 
 #, c-format
 msgid "can't handle text lines longer than %d characters\n"
@@ -6013,276 +5778,277 @@ msgstr "impossibile gestire linee di testo più lunghe di %d caratteri\n"
 msgid "input line longer than %d characters\n"
 msgstr "linea di input più lunga di %d caratteri\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error beginning transaction on TOFU database: %s\n"
-msgstr "errore leggendo `%s': %s\n"
+msgstr "errore durante l'avvio della transazione nel database TOFU: %s\n"
 
 #, c-format
 msgid "error committing transaction on TOFU database: %s\n"
-msgstr ""
+msgstr "errore durante il commit della transazione nel database TOFU: %s\n"
 
 #, c-format
 msgid "error rolling back transaction on TOFU database: %s\n"
-msgstr ""
+msgstr "errore durante il rollback della transazione nel database TOFU: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "unsupported TOFU database version: %s\n"
-msgstr ""
-"\n"
-"Algoritmi gestiti:\n"
+msgstr "versione del database TOFU non supportata: %s\n"
 
 #, c-format
 msgid "TOFU DB error"
-msgstr ""
+msgstr "Errore DB TOFU"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error reading TOFU database: %s\n"
-msgstr "errore leggendo `%s': %s\n"
+msgstr "errore durante la lettura del database TOFU: %s\n"
 
-#, fuzzy, c-format
-#| msgid "error writing secret keyring `%s': %s\n"
+#, c-format
 msgid "error determining TOFU database's version: %s\n"
-msgstr "errore scrivendo il portachiavi segreto `%s': %s\n"
+msgstr ""
+"errore durante la determinazione della versione del database TOFU: %s\n"
 
-#, fuzzy, c-format
-#| msgid "%s: error writing dir record: %s\n"
+#, c-format
 msgid "error initializing TOFU database: %s\n"
-msgstr "%s: errore durante la scrittura del dir record: %s\n"
+msgstr "errore durante l'inizializzazione del database TOFU: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error opening TOFU database '%s': %s\n"
-msgstr "errore leggendo `%s': %s\n"
+msgstr "errore durante l'apertura del database TOFU '%s': %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error updating TOFU database: %s\n"
-msgstr "errore leggendo `%s': %s\n"
+msgstr "errore durante l'aggiornamento del database TOFU: %s\n"
 
 #, c-format
 msgid ""
 "This is the first time the email address \"%s\" is being used with key %s."
 msgstr ""
+"Questa è la prima volta che l'indirizzo di posta elettronica \"%s\" viene "
+"utilizzato con la chiave %s."
 
 #, c-format
 msgid "The email address \"%s\" is associated with %d key!"
 msgid_plural "The email address \"%s\" is associated with %d keys!"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "L'indirizzo di posta elettronica \"%s\" è associato alla chiave %d!"
+msgstr[1] "L'indirizzo di posta elettronica \"%s\" è associato alla chiavi %d!"
 
 msgid "  Since this binding's policy was 'auto', it has been changed to 'ask'."
 msgstr ""
+"  poiché la politica di questo legame era \"automatica\", è stata modificata "
+"in \"chiedere\"."
 
 #, c-format
 msgid ""
 "Please indicate whether this email address should be associated with key %s "
 "or whether you think someone is impersonating \"%s\"."
 msgstr ""
+"Indicare se questo indirizzo di posta elettronica deve essere associato alla "
+"chiave %s o se si ritiene che qualcuno sia \"%s\"."
 
-#, fuzzy, c-format
+#, c-format
 msgid "error gathering other user IDs: %s\n"
-msgstr "errore nella creazione della passhprase: %s\n"
+msgstr "errore durante la raccolta di altri ID utente: %s\n"
 
-#, fuzzy
-#| msgid "list key and user IDs"
 msgid "This key's user IDs:\n"
-msgstr "elenca le chiavi e gli user ID"
+msgstr "ID utente di questa chiave:\n"
 
-#, fuzzy, c-format
-#| msgid "Policy: "
+#, c-format
 msgid "policy: %s"
-msgstr "Policy: "
+msgstr "criterio: %s"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error gathering signature stats: %s\n"
-msgstr "errore nella creazione della passhprase: %s\n"
+msgstr "errore durante la raccolta delle statistiche di firma: %s\n"
 
 #, c-format
 msgid "The email address \"%s\" is associated with %d key:\n"
 msgid_plural "The email address \"%s\" is associated with %d keys:\n"
 msgstr[0] ""
+"L'indirizzo di posta elettronica \"%s\" è associato alla chiave %d!\n"
 msgstr[1] ""
+"L'indirizzo di posta elettronica \"%s\" è associato alle chiavi %d!\n"
 
 #, c-format
 msgid "Statistics for keys with the email address \"%s\":\n"
-msgstr ""
+msgstr "Statistiche per le chiavi con indirizzo di posta elettronica \"%s\":\n"
 
-#, fuzzy
-#| msgid "list keys"
 msgid "this key"
-msgstr "elenca le chiavi"
+msgstr "questa chiave"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Verified %d message."
 msgid_plural "Verified %d messages."
-msgstr[0] "|algo [files]|stampa tutti i message digests"
-msgstr[1] "|algo [files]|stampa tutti i message digests"
+msgstr[0] "Messaggio %d verificato."
+msgstr[1] "Messaggi %d verificati."
 
-#, fuzzy, c-format
-#| msgid "encrypted with %lu passphrases\n"
+#, c-format
 msgid "Encrypted %d message."
 msgid_plural "Encrypted %d messages."
-msgstr[0] "cifratto con %lu passphrase\n"
-msgstr[1] "cifratto con %lu passphrase\n"
+msgstr[0] "Messaggio %d crittografato."
+msgstr[1] "Messaggi %d crittografati."
 
-#, fuzzy, c-format
+#, c-format
 msgid "Verified %d message in the future."
 msgid_plural "Verified %d messages in the future."
-msgstr[0] "|algo [files]|stampa tutti i message digests"
-msgstr[1] "|algo [files]|stampa tutti i message digests"
+msgstr[0] "Messaggio %d verificato in futuro."
+msgstr[1] "Messaggi %d verificati in futuro."
 
-#, fuzzy, c-format
+#, c-format
 msgid "Encrypted %d message in the future."
 msgid_plural "Encrypted %d messages in the future."
-msgstr[0] "|algo [files]|stampa tutti i message digests"
-msgstr[1] "|algo [files]|stampa tutti i message digests"
+msgstr[0] "Messaggio %d crittografato in futuro."
+msgstr[1] "Messaggi %d crittografati in futuro."
 
 #, c-format
 msgid "Messages verified over the past %d day: %d."
 msgid_plural "Messages verified over the past %d days: %d."
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Messaggi verificati nell'ultimo %d giorno: %d."
+msgstr[1] "Messaggi verificati negli ultimi %d giorni: %d."
 
 #, c-format
 msgid "Messages encrypted over the past %d day: %d."
 msgid_plural "Messages encrypted over the past %d days: %d."
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Messaggi crittografati nell'ultimo %d giorno: %d."
+msgstr[1] "Messaggi crittografati negli ultimi %d giorni: %d."
 
 #, c-format
 msgid "Messages verified over the past %d month: %d."
 msgid_plural "Messages verified over the past %d months: %d."
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Messaggi verificati nell'ultimo %d mese: %d."
+msgstr[1] "Messaggi verificati nell'ultimo %d mesi: %d."
 
 #, c-format
 msgid "Messages encrypted over the past %d month: %d."
 msgid_plural "Messages encrypted over the past %d months: %d."
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Messaggi crittografati nell'ultimo %d mese: %d."
+msgstr[1] "Messaggi crittografati negli ultimi %d mesi: %d."
 
 #, c-format
 msgid "Messages verified over the past %d year: %d."
 msgid_plural "Messages verified over the past %d years: %d."
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Messaggi verificati nell'ultimo %d anno: %d."
+msgstr[1] "Messaggi verificati negli ultimi %d anni: %d."
 
 #, c-format
 msgid "Messages encrypted over the past %d year: %d."
 msgid_plural "Messages encrypted over the past %d years: %d."
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Messaggi crittografati nell'ulltimo %d anno: %d."
+msgstr[1] "Messaggi crittografati negli ultimi %d anni: %d."
 
 #, c-format
 msgid "Messages verified in the past: %d."
-msgstr ""
+msgstr "Messaggi verificati in passato: %d."
 
-#, fuzzy, c-format
+#, c-format
 msgid "Messages encrypted in the past: %d."
-msgstr "|algo [files]|stampa tutti i message digests"
+msgstr "Messaggi crittografati in passato: %d."
 
 #. TRANSLATORS: Please translate the text found in the source
 #. * file below.  We don't directly internationalize that text so
 #. * that we can tweak it without breaking translations.
 msgid "TOFU detected a binding conflict"
-msgstr ""
+msgstr "TOFU ha rilevato un conflitto di binding"
 
 #. TRANSLATORS: Two letters (normally the lower and upper case
 #. * version of the hotkey) for each of the five choices.  If
 #. * there is only one choice in your language, repeat it.
 msgid "gGaAuUrRbB"
-msgstr ""
+msgstr "gGaAuUrRbB"
 
 msgid "(G)ood, (A)ccept once, (U)nknown, (R)eject once, (B)ad? "
-msgstr ""
+msgstr "(G)ood, (A)ccept una volta, (U)nknown, (R)espellere una volta, (B)ad? "
 
 msgid "Defaulting to unknown.\n"
-msgstr ""
+msgstr "Impostazione predefinita sconosciuta.\n"
 
 #, c-format
 msgid "TOFU db corruption detected.\n"
-msgstr ""
+msgstr "Rilevato danneggiamento del database TOFU.\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error changing TOFU policy: %s\n"
-msgstr "errore nella creazione della passhprase: %s\n"
+msgstr "errore durante la modifica del criterio TOFU: %s\n"
 
 #, c-format
 msgid "%lld~year"
 msgid_plural "%lld~years"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%lld~anno"
+msgstr[1] "%lld~anni"
 
 #, c-format
 msgid "%lld~month"
 msgid_plural "%lld~months"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%lld~mese"
+msgstr[1] "%lld‪‪~mesi"
 
 #, c-format
 msgid "%lld~week"
 msgid_plural "%lld~weeks"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%lld~settimana"
+msgstr[1] "%lld‪‪~settimane"
 
 #, c-format
 msgid "%lld~day"
 msgid_plural "%lld~days"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%lld~giorno"
+msgstr[1] "%lld~giorni"
 
 #, c-format
 msgid "%lld~hour"
 msgid_plural "%lld~hours"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%lld~ora"
+msgstr[1] "%lld~ore"
 
 #, c-format
 msgid "%lld~minute"
 msgid_plural "%lld~minutes"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%lld~minuto"
+msgstr[1] "%lld~minuti"
 
 #, c-format
 msgid "%lld~second"
 msgid_plural "%lld~seconds"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%lld~secondo"
+msgstr[1] "%lld~secondi"
 
 #, c-format
 msgid "%s: Verified 0~signatures and encrypted 0~messages."
-msgstr ""
+msgstr "%s: verificata 0: firme e 0 messaggi crittografati."
 
-#, fuzzy, c-format
-#| msgid "Deleted %d signatures.\n"
+#, c-format
 msgid "%s: Verified 0 signatures."
-msgstr "Cancellate %d firme.\n"
+msgstr "%s: firme 0 verificate."
 
-#, fuzzy
-#| msgid "encrypted with %lu passphrases\n"
 msgid "Encrypted 0 messages."
-msgstr "cifratto con %lu passphrase\n"
+msgstr "Messaggi crittografati 0."
 
-#, fuzzy, c-format
-#| msgid "Policy: "
+#, c-format
 msgid "(policy: %s)"
-msgstr "Policy: "
+msgstr "(criterio: %s)"
 
 #, c-format
 msgid ""
 "Warning: we have yet to see a message signed using this key and user id!\n"
 msgstr ""
+"Attenzione: dobbiamo ancora vedere un messaggio firmato utilizzando questa "
+"chiave e ID utente!\n"
 
 #, c-format
 msgid ""
 "Warning: we've only seen one message signed using this key and user id!\n"
 msgstr ""
+"Attenzione: abbiamo visto solo un messaggio firmato utilizzando questa "
+"chiave e ID utente!\n"
 
 #, c-format
 msgid "Warning: you have yet to encrypt a message to this key!\n"
 msgstr ""
+"Attenzione: non è ancora necessario crittografare un messaggio a questa "
+"chiave!\n"
 
 #, c-format
 msgid "Warning: you have only encrypted one message to this key!\n"
-msgstr ""
+msgstr "Attenzione: hai crittografato solo un messaggio per questa chiave!\n"
 
 #, c-format
 msgid ""
@@ -6298,37 +6064,48 @@ msgid_plural ""
 "  %s\n"
 "to mark it as being bad.\n"
 msgstr[0] ""
+"Attenzione: se pensi di aver visto più firme da questa chiave e id utente, "
+"allora questa chiave potrebbe essere un falso!  Esaminare attentamente "
+"l'indirizzo e-mail per piccole variazioni.  Se la chiave è sospetta, "
+"utilizzare\n"
+"  %s\n"
+"per contrassegnarlo come cattivo.\n"
 msgstr[1] ""
+"Attenzione: se pensi di aver visto più firme da questa chiave e id utente, "
+"allora questa chiave potrebbe essere un falso!  Esaminare attentamente "
+"l'indirizzo e-mail per piccole variazioni.  Se la chiave è sospetta, "
+"utilizzare\n"
+"  %s\n"
+"per contrassegnarlo come cattivo.\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error opening TOFU database: %s\n"
-msgstr "errore leggendo `%s': %s\n"
+msgstr "errore durante l'apertura del database TOFU: %s\n"
 
 #, c-format
 msgid "WARNING: Encrypting to %s, which has no non-revoked user ids\n"
-msgstr ""
+msgstr "AVVISO: crittografia a %s, che non dispone di ID utente non revocati\n"
 
-#, fuzzy, c-format
-#| msgid "`%s' is not a valid long keyID\n"
+#, c-format
 msgid "'%s' is not a valid long keyID\n"
-msgstr "`%s' non è un key ID lungo valido\n"
+msgstr "'%s' non è un keyID lungo valido\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: accepted as trusted key\n"
-msgstr "chiave %08lX: accettata come chiave affidabile\n"
+msgstr "chiave %s: accettata come chiave attendibile\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s occurs more than once in the trustdb\n"
-msgstr "chiave %08lX: appare nel trustdb più di una volta\n"
+msgstr "chiave %s si verifica più di una volta nel trustdb\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s: no public key for trusted key - skipped\n"
 msgstr ""
-"chiave %08lX: manca la chiave pubblica della chiave fidata - ignorata\n"
+"chiave %s: nessuna chiave pubblica per la chiave attendibile - ignorata\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key %s marked as ultimately trusted\n"
-msgstr "chiavi marcate definitivamente affidabili.\n"
+msgstr "chiave %s contrassegnata come considerata attendibile\n"
 
 #, c-format
 msgid "trust record %lu, req type %d: read failed: %s\n"
@@ -6341,18 +6118,21 @@ msgstr "il trust record %lu non è del tipo richiesto %d\n"
 #, c-format
 msgid "You may try to re-create the trustdb using the commands:\n"
 msgstr ""
+"È possibile provare a creare nuovamente il trustdb utilizzando i comandi:\n"
 
 #, c-format
 msgid "If that does not work, please consult the manual\n"
-msgstr ""
+msgstr "Se ciò non funziona, consultare il manuale\n"
 
 #, c-format
 msgid "unable to use unknown trust model (%d) - assuming %s trust model\n"
 msgstr ""
+"impossibile utilizzare il modello di trust sconosciuto (%d) - presupponendo "
+"il modello di trust %s\n"
 
 #, c-format
 msgid "using %s trust model\n"
-msgstr ""
+msgstr "utilizzo del modello di trust %s\n"
 
 #, c-format
 msgid "no need for a trustdb check\n"
@@ -6362,17 +6142,18 @@ msgstr "non è necessario un controllo del trustdb\n"
 msgid "next trustdb check due at %s\n"
 msgstr "il prossimo controllo del trustdb sarà fatto il %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "no need for a trustdb check with '%s' trust model\n"
-msgstr "non è necessario un controllo del trustdb\n"
+msgstr "non è necessario un controllo trustdb con il modello di trust '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "no need for a trustdb update with '%s' trust model\n"
-msgstr "non è necessario un controllo del trustdb\n"
+msgstr ""
+"non è necessario un aggiornamento trustdb con il modello di trust '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "public key %s not found: %s\n"
-msgstr "chiave pubblica %08lX non trovata: %s\n"
+msgstr "chiave pubblica %s non trovata: %s\n"
 
 #, c-format
 msgid "please do a --check-trustdb\n"
@@ -6382,51 +6163,53 @@ msgstr "per favore usa --check-trustdb\n"
 msgid "checking the trustdb\n"
 msgstr "controllo il trustdb\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "%d key processed"
 msgid_plural "%d keys processed"
-msgstr[0] "Per ora sono state esaminate %lu chiavi\n"
-msgstr[1] "Per ora sono state esaminate %lu chiavi\n"
+msgstr[0] "Chiave %d elaborata"
+msgstr[1] "Chiavi %d elaborate"
 
-#, fuzzy, c-format
-#| msgid "%d keys processed (%d validity counts cleared)\n"
+#, c-format
 msgid " (%d validity count cleared)\n"
 msgid_plural " (%d validity counts cleared)\n"
-msgstr[0] "%d chiavi processate (%d conteggi di validità azzerati)\n"
-msgstr[1] "%d chiavi processate (%d conteggi di validità azzerati)\n"
+msgstr[0] " (%d conteggio di validità cancellato)\n"
+msgstr[1] " (%d conteggi di validità cancellati)\n"
 
 #, c-format
 msgid "no ultimately trusted keys found\n"
 msgstr "non è stata trovata alcuna chiave definitivamente affidabile\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "public key of ultimately trusted key %s not found\n"
-msgstr "chiave pubblica definitivamente affidabile %08lX non trovata\n"
+msgstr "chiave pubblica della chiave attendibile %s non trovata\n"
 
 #, c-format
 msgid ""
 "depth: %d  valid: %3d  signed: %3d  trust: %d-, %dq, %dn, %dm, %df, %du\n"
 msgstr ""
+"profondità: %d  valido: %3d  firmato: %3d  trust: %d-, %dq, %dn, %dm, %df, "
+"%du\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "unable to update trustdb version record: write failed: %s\n"
-msgstr "trust record %lu, req type %d: write fallita: %s\n"
+msgstr ""
+"impossibile aggiornare il record della versione trustdb: scrittura non "
+"riuscita: %s\n"
 
 msgid "undefined"
-msgstr ""
+msgstr "non definito"
 
-#, fuzzy
 msgid "never"
-msgstr "mai       "
+msgstr "mai"
 
 msgid "marginal"
-msgstr ""
+msgstr "marginale"
 
 msgid "full"
-msgstr ""
+msgstr "intero"
 
 msgid "ultimate"
-msgstr ""
+msgstr "definitivo"
 
 #. TRANSLATORS: these strings are similar to those in
 #. trust_value_to_string(), but are a fixed length.  This is needed to
@@ -6437,35 +6220,31 @@ msgstr ""
 #. essentially a comment and need not be translated.  Either key and
 #. uid are both NULL, or neither are NULL.
 msgid "10 translator see trust.c:uid_trust_string_fixed"
-msgstr ""
+msgstr "10 traduttore vedere trust.c:uid_trust_string_fixed"
 
-#, fuzzy
 msgid "[ revoked]"
-msgstr "[revocata]"
+msgstr "[ revocato]"
 
-#, fuzzy
 msgid "[ expired]"
-msgstr "[scaduta]"
+msgstr "[ scaduto]"
 
-#, fuzzy
 msgid "[ unknown]"
-msgstr "sconosciuto"
+msgstr "[ sconosciuto]"
 
 msgid "[  undef ]"
-msgstr ""
+msgstr "[  undef ]"
 
-#, fuzzy
 msgid "[  never ]"
-msgstr "mai       "
+msgstr "[  mai ]"
 
 msgid "[marginal]"
-msgstr ""
+msgstr "[marginale]"
 
 msgid "[  full  ]"
-msgstr ""
+msgstr "[  completo  ]"
 
 msgid "[ultimate]"
-msgstr ""
+msgstr "[ultimo]"
 
 #, c-format
 msgid ""
@@ -6481,594 +6260,587 @@ msgstr ""
 msgid "input line %u too long or missing LF\n"
 msgstr "linea di input %u troppo lunga o LF mancante\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "can't open fd %d: %s\n"
-msgstr "impossibile aprire `%s': %s\n"
+msgstr "impossibile aprire fd %d: %s\n"
 
 msgid "set debugging flags"
-msgstr ""
+msgstr "impostare i flag di debug"
 
 msgid "enable full debugging"
-msgstr ""
+msgstr "abilitare il debug completo"
 
-#, fuzzy
 msgid "Usage: kbxutil [options] [files] (-h for help)"
-msgstr "Uso: gpg [opzioni] [files] (-h per l'aiuto)"
+msgstr "Utilizzo: kbxutil [opzioni] [file] (-h per assistenza)"
 
-#, fuzzy
 msgid ""
 "Syntax: kbxutil [options] [files]\n"
 "List, export, import Keybox data\n"
-msgstr "Uso: gpg [opzioni] [files] (-h per l'aiuto)"
+msgstr ""
+"Sintassi: kbxutil [opzioni] [files]\n"
+"Elencare, esportare, importare i dati di Keybox\n"
 
 #. TRANSLATORS: Put a \x1f right before a colon.  This can be
 #. * used by pinentry to nicely align the names and values.  Keep
 #. * the %s at the start and end of the string.
 #, c-format
 msgid "%sNumber\1f: %s%%0AHolder\1f: %s%s"
-msgstr ""
+msgstr "%sNumero: %s%%0ATitolare: %s%s"
 
 #. TRANSLATORS: This is the number of remaining attempts to
 #. * enter a PIN.  Use %%0A (double-percent,0A) for a linefeed.
 #, c-format
 msgid "Remaining attempts: %d"
-msgstr ""
+msgstr "Tentativi rimanenti: %d"
 
 msgid "||Please enter the PIN for the key to create qualified signatures."
-msgstr ""
+msgstr "||Immettere il PIN per la chiave per creare firme qualificate."
 
-#, fuzzy
 msgid "||Please enter the PIN for the standard keys."
-msgstr "cambia la passphrase"
+msgstr "||Si prega di inserire il PIN per le chiavi standard."
 
 #, c-format
 msgid "RSA modulus missing or not of size %d bits\n"
-msgstr ""
+msgstr "Modulo RSA mancante o non di dimensione %d bit\n"
 
 #, c-format
 msgid "RSA public exponent missing or larger than %d bits\n"
-msgstr ""
+msgstr "Esponente pubblico RSA mancante o superiore a %d bit\n"
 
 #, c-format
 msgid "PIN callback returned error: %s\n"
-msgstr ""
+msgstr "Errore di richiamata PIN: %s\n"
 
 #, c-format
 msgid "the NullPIN has not yet been changed\n"
-msgstr ""
+msgstr "il NullPIN non è ancora stato modificato\n"
 
-#, fuzzy
 msgid "|N|Please enter a new PIN for the standard keys."
-msgstr "cambia la passphrase"
+msgstr "|N|Immettere un nuovo PIN per le chiavi standard."
 
-#, fuzzy
 msgid "|NP|Please enter a new PIN Unblocking Code (PUK) for the standard keys."
-msgstr "Per favore scegli il motivo della revoca:\n"
+msgstr ""
+"|N|Inserisci un nuovo codice di sblocco del PIN (PUK) per i tasti standard."
 
-#, fuzzy
 msgid "|P|Please enter the PIN Unblocking Code (PUK) for the standard keys."
-msgstr "Per favore scegli il motivo della revoca:\n"
+msgstr "|P|Inserisci il codice di sblocco del PIN (PUK) per i tasti standard."
 
 msgid "|N|Please enter a new PIN for the key to create qualified signatures."
-msgstr ""
+msgstr "|N|Immettere un nuovo PIN per la chiave per creare firme qualificate."
 
 msgid ""
 "|NP|Please enter a new PIN Unblocking Code (PUK) for the key to create "
 "qualified signatures."
 msgstr ""
+"|NP|Inserisci un nuovo codice di sblocco PIN (PUK) per la chiave per creare "
+"firme qualificate."
 
 msgid ""
 "|P|Please enter the PIN Unblocking Code (PUK) for the key to create "
 "qualified signatures."
 msgstr ""
+"|P|Inserisci il codice di sblocco del PIN (PUK) per la chiave per creare "
+"firme qualificate."
 
-#, fuzzy, c-format
+#, c-format
 msgid "error getting new PIN: %s\n"
-msgstr "errore nella creazione della passhprase: %s\n"
+msgstr "errore durante il recupero del nuovo PIN: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "failed to store the fingerprint: %s\n"
-msgstr "inizializzazione del trustdb fallita: %s\n"
+msgstr "impossibile memorizzare l'impronta digitale: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "failed to store the creation date: %s\n"
-msgstr "rebuild della cache del portachiavi fallito: %s\n"
+msgstr "impossibile memorizzare la data di creazione: %s\n"
 
 #, c-format
 msgid "error retrieving CHV status from card\n"
-msgstr ""
+msgstr "errore durante il recupero dello stato CHV dalla scheda\n"
 
 #, c-format
 msgid "response does not contain the RSA modulus\n"
-msgstr ""
+msgstr "risposta non contiene il modulo RSA\n"
 
 #, c-format
 msgid "response does not contain the RSA public exponent\n"
-msgstr ""
+msgstr "risposta non contiene l'esponente pubblico RSA\n"
 
-#, fuzzy, c-format
-#| msgid "remove keys from the public keyring"
+#, c-format
 msgid "response does not contain the EC public key\n"
-msgstr "rimuove le chiavi dal portachiavi pubblico"
+msgstr "risposta non contiene la chiave pubblica CE\n"
 
 #, c-format
 msgid "response does not contain the public key data\n"
-msgstr ""
+msgstr "risposta non contiene i dati della chiave pubblica\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "reading public key failed: %s\n"
-msgstr "cancellazione del keyblock fallita: %s\n"
+msgstr "lettura della chiave pubblica non riuscita: %s\n"
 
 #. TRANSLATORS: Put a \x1f right before a colon.  This can be
 #. * used by pinentry to nicely align the names and values.  Keep
 #. * the %s at the start and end of the string.
 #, c-format
 msgid "%sNumber\1f: %s%%0AHolder\1f: %s%%0ACounter\1f: %lu%s"
-msgstr ""
+msgstr "%sNumero: %s%%0AHolder: %s%%0ACounter: %lu%s"
 
 #, c-format
 msgid "using default PIN as %s\n"
-msgstr ""
+msgstr "utilizzando il PIN predefinito come %s\n"
 
 #, c-format
 msgid "failed to use default PIN as %s: %s - disabling further default use\n"
 msgstr ""
+"impossibile utilizzare il PIN predefinito come %s: %s - disabilitazione "
+"dell'ulteriore utilizzo predefinito\n"
 
-#, fuzzy
 msgid "||Please unlock the card"
-msgstr "cambia la passphrase"
+msgstr "||Si prega di sbloccare la carta"
 
 #, c-format
 msgid "PIN for CHV%d is too short; minimum length is %d\n"
-msgstr ""
+msgstr "Il PIN per CHV%d è troppo breve; la lunghezza minima è %d\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "verify CHV%d failed: %s\n"
-msgstr "invio al keyserver fallito: %s\n"
+msgstr "verifica CHV%d non riuscita: %s\n"
 
 #, c-format
 msgid "card is permanently locked!\n"
-msgstr ""
+msgstr "carta è bloccata in modo permanente!\n"
 
 #, c-format
 msgid "%d Admin PIN attempt remaining before card is permanently locked\n"
 msgid_plural ""
 "%d Admin PIN attempts remaining before card is permanently locked\n"
 msgstr[0] ""
+"%d tentativo di PIN di amministrazione rimanente prima che la scheda venga "
+"bloccata in modo permanente\n"
 msgstr[1] ""
+"%d tentativi di PIN di amministrazione rimanenti prima che la schede vengano "
+"bloccate in modo permanente\n"
 
 #. TRANSLATORS: Do not translate the "|A|" prefix but keep it at
 #. the start of the string.  Use %0A (single percent) for a linefeed.
-#, fuzzy
 msgid "|A|Please enter the Admin PIN"
-msgstr "cambia la passphrase"
+msgstr "|A|Inserisci il PIN di amministratore"
 
 #, c-format
 msgid "access to admin commands is not configured\n"
-msgstr ""
+msgstr "l'accesso ai comandi di amministrazione non è configurato\n"
 
-#, fuzzy
 msgid "||Please enter the PIN"
-msgstr "cambia la passphrase"
+msgstr "||Inserisci il PIN"
 
-#, fuzzy
 msgid "||Please enter the Reset Code for the card"
-msgstr "Per favore scegli il motivo della revoca:\n"
+msgstr "||Inserisci il Codice reset per la carta"
 
 #, c-format
 msgid "Reset Code is too short; minimum length is %d\n"
-msgstr ""
+msgstr "Il codice di reimpostazione è troppo breve; la lunghezza minima è %d\n"
 
 #. TRANSLATORS: Do not translate the "|*|" prefixes but
 #. keep it at the start of the string.  We need this elsewhere
 #. to get some infos on the string.
 msgid "|RN|New Reset Code"
-msgstr ""
+msgstr "|RN|Nuovo codice di ripristino"
 
 msgid "|AN|New Admin PIN"
-msgstr ""
+msgstr "|AN|Nuovo PIN di amministrazione"
 
 msgid "|N|New PIN"
-msgstr ""
+msgstr "|N|Nuovo PIN"
 
-#, fuzzy
 msgid "||Please enter the Admin PIN and New Admin PIN"
-msgstr "cambia la passphrase"
+msgstr "||Inserisci il PIN di amministratore e il nuovo PIN di amministrazione"
 
-#, fuzzy
 msgid "||Please enter the PIN and New PIN"
-msgstr "cambia la passphrase"
+msgstr "||Inserisci il PIN e il nuovo PIN"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error reading application data\n"
-msgstr "errore leggendo il keyblock: %s\n"
+msgstr "errore durante la lettura dei dati dell'applicazione\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error reading fingerprint DO\n"
-msgstr "%s: errore durante la lettura del record libero: %s\n"
+msgstr "errore durante la lettura dell'impronta digitale DO\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key already exists\n"
-msgstr "`%s' è già compresso\n"
+msgstr "chiave già esistente\n"
 
 #, c-format
 msgid "existing key will be replaced\n"
-msgstr ""
+msgstr "chiave esistente verrà sostituita\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "generating new key\n"
-msgstr "genera una nuova coppia di chiavi"
+msgstr "generazione di una nuova chiave\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "writing new key\n"
-msgstr "genera una nuova coppia di chiavi"
+msgstr "genera una nuova coppia di chiavi\n"
 
 #, c-format
 msgid "creation timestamp missing\n"
-msgstr ""
+msgstr "timestamp di creazione mancante\n"
 
 #, c-format
 msgid "RSA prime %s missing or not of size %d bits\n"
-msgstr ""
+msgstr "RSA primo %s mancante o non di dimensione %d bit\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "failed to store the key: %s\n"
-msgstr "inizializzazione del trustdb fallita: %s\n"
+msgstr "impossibile archiviare la chiave: %s\n"
 
-#, fuzzy, c-format
-#| msgid "unsupported URI"
+#, c-format
 msgid "unsupported curve\n"
-msgstr "URI non gestito"
+msgstr "curva non supportata\n"
 
 #, c-format
 msgid "please wait while key is being generated ...\n"
-msgstr ""
+msgstr "si prega di attendere mentre la chiave viene generata …\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "generating key failed\n"
-msgstr "cancellazione del keyblock fallita: %s\n"
+msgstr "generazione della chiave non riuscita\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "key generation completed (%d second)\n"
 msgid_plural "key generation completed (%d seconds)\n"
-msgstr[0] "Generazione della chiave fallita: %s\n"
-msgstr[1] "Generazione della chiave fallita: %s\n"
+msgstr[0] "generazione della chiave completata (%d secondo)\n"
+msgstr[1] ""
+"generazione della chiavi completate (%d secondi)\n"
+"\n"
+"\n"
 
 #, c-format
 msgid "invalid structure of OpenPGP card (DO 0x93)\n"
-msgstr ""
+msgstr "struttura non valida della scheda OpenPGP (DO 0x93)\n"
 
 #, c-format
 msgid "fingerprint on card does not match requested one\n"
-msgstr ""
+msgstr "impronta digitale sulla carta non corrisponde a quello richiesto\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "card does not support digest algorithm %s\n"
-msgstr "Firma %s, algoritmo di digest %s\n"
+msgstr "scheda non supporta l'algoritmo digest %s\n"
 
 #, c-format
 msgid "signatures created so far: %lu\n"
-msgstr ""
+msgstr "firme create finora: %lu\n"
 
 #, c-format
 msgid ""
 "verification of Admin PIN is currently prohibited through this command\n"
 msgstr ""
+"la verifica del PIN di amministrazione è attualmente vietata tramite questo "
+"comando\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "can't access %s - invalid OpenPGP card?\n"
-msgstr "Non sono stati trovati dati OpenPGP validi.\n"
+msgstr "impossibile accedere a %s - scheda OpenPGP non valida?\n"
 
-#, fuzzy
 msgid "||Please enter your PIN at the reader's pinpad"
-msgstr "cambia la passphrase"
+msgstr "||Inserisci il tuo PIN sul pinpad del lettore"
 
 #. TRANSLATORS: Do not translate the "|*|" prefixes but
 #. keep it at the start of the string.  We need this elsewhere
 #. to get some infos on the string.
 msgid "|N|Initial New PIN"
-msgstr ""
+msgstr "|N|Nuovo PIN iniziale"
 
 msgid "run in multi server mode (foreground)"
-msgstr ""
+msgstr "eseguire in modalità multi server (in primo piano)"
 
 msgid "|LEVEL|set the debugging level to LEVEL"
-msgstr ""
+msgstr "|LEVEL| impostare il livello di debug su LEVEL"
 
-#, fuzzy
 msgid "|FILE|write a log to FILE"
-msgstr "|FILE|carica il modulo di estensione FILE"
+msgstr "|FILE|scrittura di un registro in FILE"
 
 msgid "|N|connect to reader at port N"
-msgstr ""
+msgstr "|N|connessione al lettore alla porta N"
 
-#, fuzzy
 msgid "|NAME|use NAME as ct-API driver"
-msgstr "|NOME|usa NOME come destinatario predefinito"
+msgstr "|NAME|utilizzare NAME come driver ct-API"
 
-#, fuzzy
 msgid "|NAME|use NAME as PC/SC driver"
-msgstr "|NOME|usa NOME come destinatario predefinito"
+msgstr "|NAME|utilizzare NAME come driver PC/SC"
 
-#, fuzzy
 msgid "do not use the internal CCID driver"
-msgstr "non usa per niente il terminale"
+msgstr "non utilizzare il driver CCID interno"
 
 msgid "|N|disconnect the card after N seconds of inactivity"
-msgstr ""
+msgstr "|N|scollegare la scheda dopo N secondi di inattività"
 
 msgid "do not use a reader's pinpad"
-msgstr ""
+msgstr "non utilizzare il pinpad di un lettore"
 
-#, fuzzy
 msgid "deny the use of admin card commands"
-msgstr "comandi in conflitto\n"
+msgstr "negare l'uso dei comandi della scheda di amministrazione"
 
 msgid "use variable length input for pinpad"
-msgstr ""
+msgstr "utilizzare l'input a lunghezza variabile per il pinpad"
 
-#, fuzzy
 msgid "Usage: @SCDAEMON@ [options] (-h for help)"
-msgstr "Uso: gpg [opzioni] [files] (-h per l'aiuto)"
+msgstr "Utilizzo: @SCDAEMON@ [opzioni] (-h per assistenza)"
 
 msgid ""
 "Syntax: scdaemon [options] [command [args]]\n"
 "Smartcard daemon for @GNUPG@\n"
 msgstr ""
+"Sintassi: scdaemon [opzioni] [comando [args]]\n"
+"Daemon smartcard per @GNUPG@\n"
 
 #, c-format
 msgid "please use the option '--daemon' to run the program in the background\n"
 msgstr ""
+"si prega di utilizzare l'opzione '--daemon' per eseguire il programma in "
+"background\n"
 
 #, c-format
 msgid "handler for fd %d started\n"
-msgstr ""
+msgstr "gestore per fd %d avviato\n"
 
 #, c-format
 msgid "handler for fd %d terminated\n"
-msgstr ""
+msgstr "gestore per fd %d terminato\n"
 
 #, c-format
 msgid "validation model requested by certificate: %s"
-msgstr ""
+msgstr "modello di convalida richiesto dal certificato: %s"
 
 msgid "chain"
-msgstr ""
+msgstr "catena"
 
-#, fuzzy
 msgid "shell"
-msgstr "help"
+msgstr "shell"
 
-#, fuzzy, c-format
+#, c-format
 msgid "critical certificate extension %s is not supported"
-msgstr "la versione %d del protocollo di gpg-agent non è gestita\n"
+msgstr "la versione %s del protocollo di gpg-agent non è gestita"
 
 #, c-format
 msgid "issuer certificate is not marked as a CA"
-msgstr ""
+msgstr "certificato dell'autorità emittente non è contrassegnato come CA"
 
 msgid "critical marked policy without configured policies"
-msgstr ""
+msgstr "criteri contrassegnati critici senza criteri configurati"
 
-#, fuzzy, c-format
+#, c-format
 msgid "failed to open '%s': %s\n"
-msgstr "impossibile aprire `%s': %s\n"
+msgstr "impossibile aprire '%s': %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Note: non-critical certificate policy not allowed"
-msgstr "scrittura della chiave segreta in `%s'\n"
+msgstr "Nota: i criteri di certificato non critici non sono consentiti"
 
-#, fuzzy, c-format
+#, c-format
 msgid "certificate policy not allowed"
-msgstr "scrittura della chiave segreta in `%s'\n"
+msgstr "criteri certificato non consentiti"
 
-#, fuzzy, c-format
+#, c-format
 msgid "failed to get the fingerprint\n"
-msgstr "inizializzazione del trustdb fallita: %s\n"
+msgstr "non è riuscito a ottenere l'impronta digitale\n"
 
 #, c-format
 msgid "looking up issuer at external location\n"
-msgstr ""
+msgstr "ricerca dell'emittente in una posizione esterna\n"
 
 #, c-format
 msgid "number of issuers matching: %d\n"
-msgstr ""
+msgstr "numero di emittenti corrispondenti: %d\n"
 
-#, fuzzy, c-format
-#| msgid "%s: can't access: %s\n"
+#, c-format
 msgid "can't get authorityInfoAccess: %s\n"
-msgstr "%s: impossibile acedere a: %s\n"
+msgstr "impossibile ottenere authorityInfoAccess: %s\n"
 
 #, c-format
 msgid "looking up issuer from the Dirmngr cache\n"
-msgstr ""
+msgstr "ricerca dell'autorità emittente dalla cache di Dirmngr\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "number of matching certificates: %d\n"
-msgstr "errore nella creazione della passhprase: %s\n"
+msgstr "numero di certificati corrispondenti: %d\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "dirmngr cache-only key lookup failed: %s\n"
-msgstr "cancellazione del keyblock fallita: %s\n"
+msgstr "ricerca chiave solo cache dirmngr non riuscita: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "failed to allocate keyDB handle\n"
-msgstr "inizializzazione del trustdb fallita: %s\n"
+msgstr "impossibile allocare l'handle keyDB\n"
 
-#, fuzzy
 msgid "certificate has been revoked"
-msgstr "NOTA: la chiave è stata revocata"
+msgstr "certificato è stato revocato"
 
 msgid "the status of the certificate is unknown"
-msgstr ""
+msgstr "lo stato del certificato è sconosciuto"
 
 #, c-format
 msgid "please make sure that the \"dirmngr\" is properly installed\n"
-msgstr ""
+msgstr "assicurarsi che il \"dirmngr\" sia installato correttamente\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "checking the CRL failed: %s"
-msgstr "controllo della firma creata fallito: %s\n"
+msgstr "controllo del CRL non riuscito: %s"
 
 #, c-format
 msgid "certificate with invalid validity: %s"
-msgstr ""
+msgstr "certificato con validità non valida: %s"
 
 #, c-format
 msgid "certificate not yet valid"
-msgstr ""
+msgstr "certificato non ancora valido"
 
-#, fuzzy
 msgid "root certificate not yet valid"
-msgstr "scrittura della chiave segreta in `%s'\n"
+msgstr "certificato radice non ancora valido"
 
 msgid "intermediate certificate not yet valid"
-msgstr ""
+msgstr "certificato intermedio non ancora valido"
 
-#, fuzzy, c-format
+#, c-format
 msgid "certificate has expired"
-msgstr "Questa chiave è scaduta!"
+msgstr "certificato è scaduto"
 
-#, fuzzy
 msgid "root certificate has expired"
-msgstr "Questa chiave è scaduta!"
+msgstr "certificato radice scaduto"
 
-#, fuzzy
 msgid "intermediate certificate has expired"
-msgstr "Questa chiave è scaduta!"
+msgstr "certificato intermedio scaduto"
 
 #, c-format
 msgid "required certificate attributes missing: %s%s%s"
-msgstr ""
+msgstr "attributi obbligatori del certificato mancanti: %s%s%s"
 
-#, fuzzy
 msgid "certificate with invalid validity"
-msgstr "Questa chiave è scaduta!"
+msgstr "certificato con validità non valida"
 
 msgid "signature not created during lifetime of certificate"
-msgstr ""
+msgstr "firma non creata durante la durata del certificato"
 
 msgid "certificate not created during lifetime of issuer"
-msgstr ""
+msgstr "certificato non creato durante la durata dell'emittente"
 
 msgid "intermediate certificate not created during lifetime of issuer"
 msgstr ""
+"certificato intermedio non creato durante la durata dell'autorità emittente"
 
-#, fuzzy, c-format
+#, c-format
 msgid "  (  signature created at "
-msgstr "           nuove firme: %lu\n"
+msgstr " (  firma creata alle "
 
-#, fuzzy, c-format
+#, c-format
 msgid "  (certificate created at "
-msgstr "Certificato di revoca creato.\n"
+msgstr "  (certificato creato alle "
 
-#, fuzzy, c-format
+#, c-format
 msgid "  (certificate valid from "
-msgstr "certificato danneggiato"
+msgstr "  (certificato valido da "
 
 #, c-format
 msgid "  (     issuer valid from "
-msgstr ""
+msgstr "  (     emittente valido da "
 
-#, fuzzy, c-format
+#, c-format
 msgid "fingerprint=%s\n"
-msgstr "mostra le impronte digitali"
+msgstr "impronta digitale=%s\n"
 
 #, c-format
 msgid "root certificate has now been marked as trusted\n"
-msgstr ""
+msgstr "certificato radice è stato contrassegnato come attendibile\n"
 
 #, c-format
 msgid "interactive marking as trusted not enabled in gpg-agent\n"
-msgstr ""
+msgstr "contrassegno interattivo come attendibile non abilitato in gpg-agent\n"
 
 #, c-format
 msgid "interactive marking as trusted disabled for this session\n"
 msgstr ""
+"contrassegno interattivo come attendibile disabilitato per questa sessione\n"
 
 msgid "WARNING: creation time of signature not known - assuming current time"
 msgstr ""
+"AVVISO: ora di creazione della firma non nota - presupponendo l'ora corrente"
 
-#, fuzzy
 msgid "no issuer found in certificate"
-msgstr "genera un certificato di revoca"
+msgstr "nessuna autorità emittente trovata nel certificato"
 
 msgid "self-signed certificate has a BAD signature"
-msgstr ""
+msgstr "certificato autofirmato ha una firma BAD"
 
 #, c-format
 msgid "root certificate is not marked trusted"
-msgstr ""
+msgstr "certificato radice non contrassegnato come attendibile"
 
-#, fuzzy, c-format
+#, c-format
 msgid "checking the trust list failed: %s\n"
-msgstr "controllo della firma creata fallito: %s\n"
+msgstr "controllo dell'elenco di attendibilità non riuscito: %s\n"
 
 #, c-format
 msgid "certificate chain too long\n"
-msgstr ""
+msgstr "catena di certificati troppo lunga\n"
 
 #, c-format
 msgid "issuer certificate not found"
-msgstr ""
+msgstr "certificato dell'autorità emittente non trovato"
 
-#, fuzzy, c-format
+#, c-format
 msgid "certificate has a BAD signature"
-msgstr "verifica una firma"
+msgstr "certificato ha una firma BAD"
 
 msgid "found another possible matching CA certificate - trying again"
-msgstr ""
+msgstr "trovato un altro possibile certificato CA corrispondente - riprovare"
 
 #, c-format
 msgid "certificate chain longer than allowed by CA (%d)"
-msgstr ""
+msgstr "catena di certificati più lunga di quella consentita dalla CA (%d)"
 
-#, fuzzy, c-format
+#, c-format
 msgid "certificate is good\n"
-msgstr "la preferenza %c%lu è doppia\n"
+msgstr "certificato è buono\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "intermediate certificate is good\n"
-msgstr "Certificato di revoca creato.\n"
+msgstr "certificato intermedio è buono\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "root certificate is good\n"
-msgstr "certificato danneggiato"
+msgstr "certificato radice è buono\n"
 
 msgid "switching to chain model"
-msgstr ""
+msgstr "passaggio al modello a catena"
 
 #, c-format
 msgid "validation model used: %s"
-msgstr ""
+msgstr "modello di convalida utilizzato: %s"
 
 #, c-format
 msgid "a %u bit hash is not valid for a %u bit %s key\n"
-msgstr ""
+msgstr "un hash di bit %u non è valido per una chiave %u bit %s\n"
 
 #, c-format
 msgid "(this is the MD2 algorithm)\n"
-msgstr ""
+msgstr "(questo è l'algoritmo MD2)\n"
 
-#, fuzzy
 msgid "none"
-msgstr "no"
+msgstr "nessuno"
 
-#, fuzzy
 msgid "[Error - invalid encoding]"
-msgstr "errore: impronta digitale non valida\n"
+msgstr "[Errore - codifica non valida]"
 
 msgid "[Error - out of core]"
-msgstr ""
+msgstr "[Errore - fuori dal nucleo]"
 
 msgid "[Error - No name]"
-msgstr ""
+msgstr "[Errore - Nessun nome]"
 
-#, fuzzy
 msgid "[Error - invalid DN]"
-msgstr "errore: impronta digitale non valida\n"
+msgstr "[Errore - DN non valido]"
 
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "Please enter the passphrase to unlock the secret key for the X.509 "
 "certificate:\n"
@@ -7076,312 +6848,313 @@ msgid ""
 "S/N %s, ID 0x%08lX,\n"
 "created %s, expires %s.\n"
 msgstr ""
-"Ti serve una passphrase per sbloccare la chiave segreta dell'utente:\n"
-"\"%.*s\"\n"
-"%u-bit %s key, ID %08lX, created %s%s\n"
+"Immettere la passphrase per sbloccare la chiave segreta per il certificato "
+"X.509:\n"
+"\"%s\"\n"
+"S/N %s, ID 0x%08lX,\n"
+"creato %s, scade %s.\n"
 
 #, c-format
 msgid "no key usage specified - assuming all usages\n"
 msgstr ""
+"nessun utilizzo chiave specificato - supponendo che tutti gli utilizzi\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error getting key usage information: %s\n"
-msgstr "errore scrivendo il portachiavi segreto `%s': %s\n"
+msgstr ""
+"errore durante il recupero delle informazioni sull'utilizzo della chiave: "
+"%s\n"
 
 #, c-format
 msgid "certificate should not have been used for certification\n"
 msgstr ""
+"certificato non avrebbe dovuto essere utilizzato per la certificazione\n"
 
 #, c-format
 msgid "certificate should not have been used for OCSP response signing\n"
 msgstr ""
+"certificato non deve essere stato utilizzato per la firma della risposta "
+"OCSP\n"
 
 #, c-format
 msgid "certificate should not have been used for encryption\n"
-msgstr ""
+msgstr "certificato non avrebbe dovuto essere utilizzato per la crittografia\n"
 
 #, c-format
 msgid "certificate should not have been used for signing\n"
-msgstr ""
+msgstr "certificato non avrebbe dovuto essere utilizzato per la firma\n"
 
 #, c-format
 msgid "certificate is not usable for encryption\n"
-msgstr ""
+msgstr "certificato non è utilizzabile per la crittografia\n"
 
 #, c-format
 msgid "certificate is not usable for signing\n"
-msgstr ""
+msgstr "certificato non è utilizzabile per la firma\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "line %d: invalid algorithm\n"
-msgstr "algoritmo di hash non valido `%s'\n"
+msgstr "riga %d: algoritmo non valido\n"
 
 #, c-format
 msgid "line %d: invalid key length %u (valid are %d to %d)\n"
-msgstr ""
+msgstr "riga %d: lunghezza chiave non valida %u (valida da %d a %d)\n"
 
 #, c-format
 msgid "line %d: no subject name given\n"
-msgstr ""
+msgstr "riga %d: nessun nome soggetto specificato\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "line %d: invalid subject name label '%.*s'\n"
-msgstr "algoritmo di hash non valido `%s'\n"
+msgstr ""
+"riga %d: etichetta del nome soggetto non valida '%.*s'\n"
+"\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "line %d: invalid subject name '%s' at pos %d\n"
-msgstr "algoritmo di hash non valido `%s'\n"
+msgstr "riga %d: nome soggetto '%s' non valido in pos %d\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "line %d: not a valid email address\n"
-msgstr "L'indirizzo di email non è valido\n"
+msgstr "riga %d: indirizzo di posta elettronica non valido\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "line %d: invalid serial number\n"
-msgstr "algoritmo di hash non valido `%s'\n"
+msgstr "riga %d: numero di serie non valido\n"
 
 #, c-format
 msgid "line %d: invalid issuer name label '%.*s'\n"
 msgstr ""
+"riga %d: etichetta del nome dell'autorità emittente non valida '%.*s'\n"
 
 #, c-format
 msgid "line %d: invalid issuer name '%s' at pos %d\n"
-msgstr ""
+msgstr "riga %d: nome autorità emittente '%s' non valido in pos %d\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "line %d: invalid date given\n"
-msgstr "algoritmo di hash non valido `%s'\n"
+msgstr "riga %d: data specificata non valida\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "line %d: error getting signing key by keygrip '%s': %s\n"
-msgstr "errore creando il portachiavi `%s': %s\n"
+msgstr ""
+"riga %d: errore durante l'osando di firmare la chiave da keygrip '%s': %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "line %d: invalid hash algorithm given\n"
-msgstr "algoritmo di hash non valido `%s'\n"
+msgstr "riga %d: algoritmo hash non valido specificato\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "line %d: invalid authority-key-id\n"
-msgstr "algoritmo di hash non valido `%s'\n"
+msgstr "riga %d: authority-key-id non valido\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "line %d: invalid subject-key-id\n"
-msgstr "chiave %08lX: legame con la subchiave non valido:\n"
+msgstr "riga %d: id-chiave-soggetto non valido\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "line %d: invalid extension syntax\n"
-msgstr "algoritmo di hash non valido `%s'\n"
+msgstr "riga %d: sintassi di estensione non valida\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "line %d: error reading key '%s' from card: %s\n"
-msgstr "errore creando il portachiavi `%s': %s\n"
+msgstr ""
+"riga %d: errore durante la lettura della chiave '%s' dalla scheda: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "line %d: error getting key by keygrip '%s': %s\n"
-msgstr "errore creando il portachiavi `%s': %s\n"
+msgstr ""
+"riga %d: errore durante il recupero della chiave da parte della chiave '%s': "
+"%s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "line %d: key generation failed: %s <%s>\n"
-msgstr "Generazione della chiave fallita: %s\n"
+msgstr "riga %d: generazione chiave non riuscita: %s <%s>\n"
 
 msgid ""
 "To complete this certificate request please enter the passphrase for the key "
 "you just created once more.\n"
 msgstr ""
+"Per completare questa richiesta di certificato, inserire la passphrase per "
+"la chiave appena creata ancora una volta.\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "   (%d) Existing key\n"
-msgstr "   (%d) RSA (cifra solo)\n"
+msgstr "  (%d) Chiave esistente\n"
 
 #, c-format
 msgid "   (%d) Existing key from card\n"
-msgstr ""
+msgstr "   (%d) Chiave esistente dalla scheda\n"
 
 #, c-format
 msgid "Possible actions for a %s key:\n"
-msgstr ""
+msgstr "Azioni possibili per una chiave %s: \n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "   (%d) sign, encrypt\n"
-msgstr "   (%d) RSA (firma e cifra)\n"
+msgstr "    (%d) segno, cifra\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "   (%d) sign\n"
-msgstr "   (%d) DSA (firma solo)\n"
+msgstr "   (%d) segno\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "   (%d) encrypt\n"
-msgstr "   (%d) RSA (cifra solo)\n"
+msgstr "   (%d) crittografa\n"
 
 msgid "Enter the X.509 subject name: "
-msgstr ""
+msgstr "Immettere il nome soggetto X.509: "
 
-#, fuzzy
 msgid "No subject name given\n"
-msgstr "(Non è stata data una descrizione)\n"
+msgstr "Nessun nome soggetto dato\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Invalid subject name label '%.*s'\n"
-msgstr "algoritmo di hash non valido `%s'\n"
+msgstr "Etichetta del nome del soggetto non valida '%.*s'.\n"
 
 #. TRANSLATORS: The 22 in the second string is the
 #. length of the first string up to the "%s".  Please
 #. adjust it do the length of your translation.  The
 #. second string is merely passed to atoi so you can
 #. drop everything after the number.
-#, fuzzy, c-format
+#, c-format
 msgid "Invalid subject name '%s'\n"
-msgstr "algoritmo di hash non valido `%s'\n"
+msgstr "Nome soggetto '%s' non valido\n"
 
 msgid "22 translator: see certreg-ui.c:gpgsm_gencertreq_tty"
-msgstr ""
+msgstr "22 traduttore: vedere certreg-ui.c:gpgsm_gencertreq_tty"
 
-#, fuzzy
 msgid "Enter email addresses"
-msgstr "Indirizzo di Email: "
+msgstr "Immettere gli indirizzi di posta elettronica"
 
-#, fuzzy
 msgid " (end with an empty line):\n"
-msgstr ""
-"\n"
-"Inserisci l'user ID. Termina con una riga vuota: "
+msgstr " (terminare con una riga vuota):\n"
 
-#, fuzzy
 msgid "Enter DNS names"
-msgstr "Inserire il nuovo nome del file"
+msgstr "Immettere i nomi DNS"
 
-#, fuzzy
 msgid " (optional; end with an empty line):\n"
-msgstr "Inserisci una descrizione opzionale; terminala con una riga vuota:\n"
+msgstr " (opzionale; terminare con una riga vuota):\n"
 
 msgid "Enter URIs"
-msgstr ""
+msgstr "Immettere gli URI"
 
-#, fuzzy
 msgid "Create self-signed certificate? (y/N) "
-msgstr "Creare un certificato di revoca per questa chiave? "
+msgstr "Creare un certificato autofirmato? (y/N) "
 
 msgid "These parameters are used:\n"
-msgstr ""
+msgstr "Vengono utilizzati i seguenti parametri:\n"
 
 msgid "Now creating self-signed certificate.  "
-msgstr ""
+msgstr "Creazione di un certificato autofirmato.  "
 
-#, fuzzy
-#| msgid "Revocation certificate created.\n"
 msgid "Now creating certificate request.  "
-msgstr "Certificato di revoca creato.\n"
+msgstr "Creazione della richiesta di certificato.  "
 
 msgid "This may take a while ...\n"
-msgstr ""
+msgstr "Questo potrebbe richiedere un po' ...\n"
 
 msgid "Ready.\n"
-msgstr ""
+msgstr "Pronto.\n"
 
 msgid "Ready.  You should now send this request to your CA.\n"
-msgstr ""
+msgstr "Pronto.  È ora necessario inviare questa richiesta alla CA.\n"
 
 #, c-format
 msgid "resource problem: out of core\n"
-msgstr ""
+msgstr "problema delle risorse: fuori dal nucleo\n"
 
 #, c-format
 msgid "(this is the RC2 algorithm)\n"
-msgstr ""
+msgstr "(questo è l'algoritmo RC2)\n"
 
 #, c-format
 msgid "(this does not seem to be an encrypted message)\n"
-msgstr ""
+msgstr "(questo non sembra essere un messaggio crittografato)\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "certificate '%s' not found: %s\n"
-msgstr "chiave `%s' non trovata: %s\n"
+msgstr "certificato '%s' non trovato: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error locking keybox: %s\n"
-msgstr "errore leggendo il keyblock: %s\n"
+msgstr "errore durante il blocco della keybox: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "duplicated certificate '%s' deleted\n"
-msgstr "Certificato di revoca creato.\n"
+msgstr "certificato duplicato '%s' eliminato\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "certificate '%s' deleted\n"
-msgstr "la preferenza %c%lu è doppia\n"
+msgstr "certificato '%s' eliminato\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "deleting certificate \"%s\" failed: %s\n"
-msgstr "cancellazione del keyblock fallita: %s\n"
+msgstr "eliminazione del certificato \"%s\" non riuscita: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "no valid recipients given\n"
-msgstr "(Non è stata data una descrizione)\n"
+msgstr "nessun destinatario valido dato\n"
 
-#, fuzzy
 msgid "list external keys"
-msgstr "elenca le chiavi segrete"
+msgstr "elencare le chiavi esterne"
 
-#, fuzzy
 msgid "list certificate chain"
-msgstr "certificato danneggiato"
+msgstr "catena di certificati valida"
 
-#, fuzzy
 msgid "import certificates"
-msgstr "certificato danneggiato"
+msgstr "importa certificati"
 
-#, fuzzy
 msgid "export certificates"
-msgstr "certificato danneggiato"
+msgstr "esporta certificati"
 
 msgid "register a smartcard"
-msgstr ""
+msgstr "registrare una smart card"
 
 msgid "pass a command to the dirmngr"
-msgstr ""
+msgstr "passare un comando al dirmngr"
 
 msgid "invoke gpg-protect-tool"
-msgstr ""
+msgstr "richiamare gpg-protect-tool"
 
-#, fuzzy
 msgid "create base-64 encoded output"
-msgstr "crea un output ascii con armatura"
+msgstr "creare output codificato in base 64"
 
 msgid "assume input is in PEM format"
-msgstr ""
+msgstr "presupporre che l'input sia in formato PEM"
 
 msgid "assume input is in base-64 format"
-msgstr ""
+msgstr "presupporre che l'input sia in formato base 64"
 
 msgid "assume input is in binary format"
-msgstr ""
+msgstr "presupporre che l'input sia in formato binario"
 
 msgid "never consult a CRL"
-msgstr ""
+msgstr "non consultare mai una CRL"
 
 msgid "check validity using OCSP"
-msgstr ""
+msgstr "verificare la validità utilizzando OCSP"
 
 msgid "|N|number of certificates to include"
-msgstr ""
+msgstr "|N|numero di certificati da includere"
 
 msgid "|FILE|take policy information from FILE"
-msgstr ""
+msgstr "|FILE|prendere le informazioni sui criteri da FILE"
 
 msgid "do not check certificate policies"
-msgstr ""
+msgstr "non controllare le politiche dei certificati"
 
 msgid "fetch missing issuer certificates"
-msgstr ""
+msgstr "recupera i certificati degli emittenti mancanti"
 
 msgid "don't use the terminal at all"
 msgstr "non usa per niente il terminale"
 
 msgid "|FILE|write a server mode log to FILE"
-msgstr ""
+msgstr "|FILE|scrittura di un registro in modalità server in FILE"
 
-#, fuzzy
 msgid "|FILE|write an audit log to FILE"
-msgstr "|FILE|carica il modulo di estensione FILE"
+msgstr "|FILE|scrittura di un registro di controllo in FILE"
 
 msgid "batch mode: never ask"
 msgstr "modo batch: non fa domande"
@@ -7392,133 +7165,128 @@ msgstr "risponde \"sì\" a quasi tutte le domande"
 msgid "assume no on most questions"
 msgstr "risponde \"no\" a quasi tutte le domande"
 
-#, fuzzy
 msgid "|FILE|add keyring to the list of keyrings"
-msgstr "aggiungi questo portachiavi alla lista"
+msgstr "|FILE|aggiungere il tasto all'elenco dei keyring"
 
-#, fuzzy
 msgid "|USER-ID|use USER-ID as default secret key"
-msgstr "|NOME|usa NOME come chiave segreta predefinita"
+msgstr "|USER-ID|utilizzare USER-ID come chiave segreta predefinita"
 
-#, fuzzy
 msgid "|SPEC|use this keyserver to lookup keys"
-msgstr "|HOST|cerca le chiavi in questo keyserver"
+msgstr "|SPEC|utilizzare questo keyserver per cercare le chiavi"
 
 msgid "|NAME|use cipher algorithm NAME"
-msgstr "|NOME|usa l'algoritmo di cifratura NOME"
+msgstr "|NAME|usa l'algoritmo di cifratura NAME"
 
 msgid "|NAME|use message digest algorithm NAME"
-msgstr "|NOME|usa l'algoritmo di message digest NOME"
+msgstr "|NAME|usa l'algoritmo di message digest NAME"
 
-#, fuzzy
-#| msgid "Usage: gpg [options] [files] (-h for help)"
 msgid "Usage: @GPGSM@ [options] [files] (-h for help)"
-msgstr "Uso: gpg [opzioni] [files] (-h per l'aiuto)"
+msgstr "Utilizzo: @GPGSM@ [opzioni] [file] (-h per assistenza)"
 
-#, fuzzy
 msgid ""
 "Syntax: @GPGSM@ [options] [files]\n"
 "Sign, check, encrypt or decrypt using the S/MIME protocol\n"
 "Default operation depends on the input data\n"
 msgstr ""
-"Sintassi: gpg [opzioni] [files]\n"
-"firma, controlla, cifra o decifra\n"
-"l'operazione predefinita dipende dai dati di input\n"
+"Sintassi: @GPGSM@ [opzioni] [files]\n"
+"Firmare, controllare, crittografare o decrittografare utilizzando il "
+"protocollo S/MIME\n"
+"Il funzionamento predefinito dipende dai dati di input\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Note: won't be able to encrypt to '%s': %s\n"
-msgstr "impossibile connettersi a `%s': %s\n"
+msgstr "Nota: impossibile eseguire la crittografia in '%s': %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "unknown validation model '%s'\n"
-msgstr "destinatario predefinito `%s' sconosciuto\n"
+msgstr "modello di convalida sconosciuto '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "%s:%u: no hostname given\n"
-msgstr "(Non è stata data una descrizione)\n"
+msgstr "%s: %u: nessun nome host specificato\n"
 
 #, c-format
 msgid "%s:%u: password given without user\n"
-msgstr ""
+msgstr "%s:%u: password fornita senza utente\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "%s:%u: skipping this line\n"
-msgstr " s = salta questa chiave\n"
+msgstr "%s:%u: ignorare questa riga\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "could not parse keyserver\n"
-msgstr "impossibile fare il parsing dell'URI del keyserver\n"
+msgstr "impossibile analizzare il keyserver\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "importing common certificates '%s'\n"
-msgstr "scrittura in `%s'\n"
+msgstr "importazione di certificati comuni '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "can't sign using '%s': %s\n"
-msgstr "impossibile chiudere `%s': %s\n"
+msgstr "impossibile firmare utilizzando '%s': %s\n"
 
 #, c-format
 msgid "invalid command (there is no implicit command)\n"
-msgstr ""
+msgstr "comando non valido (non esiste alcun comando implicito)\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "total number processed: %lu\n"
-msgstr "Numero totale esaminato: %lu\n"
+msgstr "numero totale elaborato: %lu\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error storing certificate\n"
-msgstr "genera un certificato di revoca"
+msgstr "errore durante l'archiviazione del certificato\n"
 
 #, c-format
 msgid "basic certificate checks failed - not imported\n"
-msgstr ""
+msgstr "controlli certificati di base non riusciti - non importati\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error getting stored flags: %s\n"
-msgstr "errore nella creazione della passhprase: %s\n"
+msgstr "errore durante il recupero dei flag memorizzati: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error importing certificate: %s\n"
-msgstr "errore nella creazione della passhprase: %s\n"
+msgstr "errore durante l'importazione del certificato: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error reading input: %s\n"
-msgstr "errore leggendo `%s': %s\n"
+msgstr "errore durante la lettura dell'input: %s\n"
 
 #, c-format
 msgid "problem looking for existing certificate: %s\n"
-msgstr ""
+msgstr "problema durante la ricerca del certificato esistente: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error finding writable keyDB: %s\n"
-msgstr "errore nella creazione della passhprase: %s\n"
+msgstr "errore durante la ricerca della chiave scrivibile keyDB: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error storing certificate: %s\n"
-msgstr "errore nella creazione della passhprase: %s\n"
+msgstr "errore durante l'archiviazione del certificato: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "problem re-searching certificate: %s\n"
-msgstr "rev? problema controllando la revoca: %s\n"
+msgstr "problema durante la ri-ricerca del certificato: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error storing flags: %s\n"
-msgstr "errore leggendo `%s': %s\n"
+msgstr "errore durante l'archiviazione dei flag: %s\n"
 
 msgid "Error - "
-msgstr ""
+msgstr "Errore - "
 
 #, c-format
 msgid "GPG_TTY has not been set - using maybe bogus default\n"
-msgstr ""
+msgstr "GPG_TTY non è stato impostato - utilizzando forse falso default\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "invalid formatted fingerprint in '%s', line %d\n"
-msgstr "errore: impronta digitale non valida\n"
+msgstr "impronta digitale formattata non valida in '%s', riga %d\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "invalid country code in '%s', line %d\n"
-msgstr "errore: impronta digitale non valida\n"
+msgstr "codice paese non valido in '%s', riga %d\n"
 
 #, c-format
 msgid ""
@@ -7529,12 +7297,20 @@ msgid ""
 "\n"
 "%s%sAre you really sure that you want to do this?"
 msgstr ""
+"Si sta per creare una firma utilizzando il certificato:\n"
+"\"%s\"\n"
+"In questo modo verrà creata una firma qualificata per legge equiparata a una "
+"firma scritta a mano.\n"
+"\n"
+"%s%sSono davvero sicuri di voler eseguire questa operazione?"
 
 #, c-format
 msgid ""
 "Note, that this software is not officially approved to create or verify such "
 "signatures.\n"
 msgstr ""
+"Si noti che questo software non è ufficialmente approvato per creare o "
+"verificare tali firme.\n"
 
 #, c-format
 msgid ""
@@ -7542,607 +7318,621 @@ msgid ""
 "\"%s\"\n"
 "Note, that this certificate will NOT create a qualified signature!"
 msgstr ""
+"Si sta per creare una firma utilizzando il certificato:\n"
+"\"%s\"\n"
+"Si noti che questo certificato NON creerà una firma qualificata!"
 
-#, fuzzy, c-format
+#, c-format
 msgid "hash algorithm %d (%s) for signer %d not supported; using %s\n"
-msgstr "l'algoritmo di protezione %d%s non è gestito\n"
+msgstr ""
+"algoritmo hash %d (%s) per firmatario %d non supportato; utilizzando %s\n"
 
 #, c-format
 msgid "hash algorithm used for signer %d: %s (%s)\n"
-msgstr ""
+msgstr "algoritmo hash utilizzato per firmatario %d: %s (%s)\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "checking for qualified certificate failed: %s\n"
-msgstr "controllo della firma creata fallito: %s\n"
+msgstr "controllo del certificato qualificato non riuscito: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Signature made "
-msgstr "Firma scaduta il %s\n"
+msgstr "Firma fatta "
 
 #, c-format
 msgid "[date not given]"
-msgstr ""
+msgstr "[data non specificata]"
 
-#, fuzzy, c-format
+#, c-format
 msgid "algorithm:"
-msgstr "armatura: %s\n"
+msgstr "algoritmo:"
 
 #, c-format
 msgid ""
 "invalid signature: message digest attribute does not match computed one\n"
 msgstr ""
+"firma non valida: l'attributo digest del messaggio non corrisponde a uno "
+"calcolato\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Good signature from"
-msgstr "Firma valida da \""
+msgstr "Buona firma da"
 
-#, fuzzy, c-format
+#, c-format
 msgid "                aka"
-msgstr "                alias \""
+msgstr "                 aka"
 
-#, fuzzy, c-format
+#, c-format
 msgid "This is a qualified signature\n"
-msgstr ""
-"\n"
-"Questa sarà una autofirma.\n"
+msgstr "Questa è una firma qualificata\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "can't initialize certificate cache lock: %s\n"
-msgstr "controllo della firma creata fallito: %s\n"
+msgstr "impossibile inizializzare il blocco della cache dei certificati: %s\n"
 
 #, c-format
 msgid "can't acquire read lock on the certificate cache: %s\n"
 msgstr ""
+"impossibile acquisire il blocco di lettura sulla cache dei certificati: %s\n"
 
 #, c-format
 msgid "can't acquire write lock on the certificate cache: %s\n"
 msgstr ""
+"impossibile acquisire il blocco in scrittura sulla cache dei certificati: "
+"%s\n"
 
 #, c-format
 msgid "can't release lock on the certificate cache: %s\n"
-msgstr ""
+msgstr "impossibile rilasciare il blocco sulla cache dei certificati: %s\n"
 
 #, c-format
 msgid "dropping %u certificates from the cache\n"
-msgstr ""
+msgstr "eliminazione di %u certificati dalla cache\n"
 
-#, fuzzy, c-format
-#| msgid "can't create `%s': %s\n"
+#, c-format
 msgid "can't parse certificate '%s': %s\n"
-msgstr "impossibile creare `%s': %s\n"
+msgstr "impossibile analizzare il certificato '%s': %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "certificate '%s' already cached\n"
-msgstr "la preferenza %c%lu è doppia\n"
+msgstr "certificato '%s' già memorizzato nella cache\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "trusted certificate '%s' loaded\n"
-msgstr "Certificato di revoca creato.\n"
+msgstr "certificato attendibile '%s' caricato\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "certificate '%s' loaded\n"
-msgstr "la preferenza %c%lu è doppia\n"
+msgstr "certificato '%s' caricato\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "  SHA1 fingerprint = %s\n"
-msgstr "mostra le impronte digitali"
+msgstr "  impronta digitale SHA1 - %s\n"
 
 msgid "   issuer ="
-msgstr ""
+msgstr "   emittente ="
 
 msgid "  subject ="
-msgstr ""
+msgstr "  oggetto ="
 
-#, fuzzy, c-format
+#, c-format
 msgid "error loading certificate '%s': %s\n"
-msgstr "errore nella creazione della passhprase: %s\n"
+msgstr "errore durante il caricamento del certificato '%s': %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "permanently loaded certificates: %u\n"
-msgstr "certificato danneggiato"
+msgstr "certificati caricati in modo permanente: %u\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "    runtime cached certificates: %u\n"
-msgstr "errore nella creazione della passhprase: %s\n"
+msgstr "   certificati runtime memorizzati nella cache: %u\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "           trusted certificates: %u (%u,%u,%u,%u)\n"
-msgstr "errore nella creazione della passhprase: %s\n"
+msgstr "           certificati attendibili: %u (%u,%u,%u,%u)\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "certificate already cached\n"
-msgstr "Certificato di revoca creato.\n"
+msgstr "certificato già memorizzato nella cache\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "certificate cached\n"
-msgstr "la preferenza %c%lu è doppia\n"
+msgstr "certificato memorizzato nella cache\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error caching certificate: %s\n"
-msgstr "errore nella creazione della passhprase: %s\n"
+msgstr "errore durante la memorizzazione nella cache del certificato: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "invalid SHA1 fingerprint string '%s'\n"
-msgstr "errore: impronta digitale non valida\n"
+msgstr "stringa di impronta digitale SHA1 non valida '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error fetching certificate by S/N: %s\n"
-msgstr "errore nella creazione della passhprase: %s\n"
+msgstr "errore durante il recupero del certificato da parte di S/N: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error fetching certificate by subject: %s\n"
-msgstr "errore nella creazione della passhprase: %s\n"
+msgstr "errore durante il recupero del certificato per oggetto: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "no issuer found in certificate\n"
-msgstr "genera un certificato di revoca"
+msgstr "nessuna autorità emittente trovata nel certificato\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error getting authorityKeyIdentifier: %s\n"
-msgstr "errore nella creazione della passhprase: %s\n"
+msgstr "errore durante il recupero di authorityKeyIdentifier: %s\n"
 
-#, fuzzy, c-format
-#| msgid "can't create directory `%s': %s\n"
+#, c-format
 msgid "creating directory '%s'\n"
-msgstr "impossibile creare la directory `%s': %s\n"
+msgstr "creazione della directory '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error creating directory '%s': %s\n"
-msgstr "errore creando il portachiavi `%s': %s\n"
+msgstr "errore durante la creazione della directory '%s': %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "ignoring database dir '%s'\n"
-msgstr "errore nella riga della coda\n"
+msgstr "ignorare il dir del database '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error reading directory '%s': %s\n"
-msgstr "errore leggendo `%s': %s\n"
+msgstr "errore durante la lettura della directory '%s': %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "removing cache file '%s'\n"
-msgstr "cancellazione del keyblock fallita: %s\n"
+msgstr "rimozione del file di cache '%s'\n"
 
-#, fuzzy, c-format
-#| msgid "enarmoring failed: %s\n"
+#, c-format
 msgid "not removing file '%s'\n"
-msgstr "creazione dell'armatura fallita: %s\n"
+msgstr "non rimuove il file '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error closing cache file: %s\n"
-msgstr "errore leggendo `%s': %s\n"
+msgstr "errore durante la chiusura del file della cache: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "failed to open cache dir file '%s': %s\n"
-msgstr "impossibile aprire `%s': %s\n"
+msgstr "impossibile aprire il file dir della cache '%s': %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error creating new cache dir file '%s': %s\n"
-msgstr "errore nella creazione della passhprase: %s\n"
+msgstr ""
+"errore durante la creazione del nuovo file di dir della cache '%s': %s\n"
 
-#, fuzzy, c-format
-#| msgid "error writing secret keyring `%s': %s\n"
+#, c-format
 msgid "error writing new cache dir file '%s': %s\n"
-msgstr "errore scrivendo il portachiavi segreto `%s': %s\n"
+msgstr ""
+"errore durante la scrittura del nuovo file di dir della cache '%s': %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error closing new cache dir file '%s': %s\n"
-msgstr "errore leggendo `%s': %s\n"
+msgstr ""
+"errore durante la chiusura del nuovo file di dir della cache '%s': %s\n"
 
-#, fuzzy, c-format
-#| msgid "new configuration file `%s' created\n"
+#, c-format
 msgid "new cache dir file '%s' created\n"
-msgstr "creato un nuovo file di configurazione `%s'\n"
+msgstr "nuovo file dir della cache '%s' creato\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "failed to re-open cache dir file '%s': %s\n"
-msgstr "impossibile creare la directory `%s': %s\n"
+msgstr "impossibile riass desiderare il file di dir della cache '%s': %s\n"
 
 #, c-format
 msgid "first record of '%s' is not the version\n"
-msgstr ""
+msgstr "il primo record di '%s' non è la versione\n"
 
 #, c-format
 msgid "old version of cache directory - cleaning up\n"
-msgstr ""
+msgstr "vecchia versione della directory della cache - pulizia\n"
 
 #, c-format
 msgid "old version of cache directory - giving up\n"
-msgstr ""
+msgstr "vecchia versione della directory della cache - rinuncia\n"
 
 #, c-format
 msgid "extra field detected in crl record of '%s' line %u\n"
-msgstr ""
+msgstr "campo aggiuntivo rilevato nel record crl '%s' della riga %u\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "invalid line detected in '%s' line %u\n"
-msgstr "errore: impronta digitale non valida\n"
+msgstr "riga non valida rilevata nella riga '%s' %u\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "duplicate entry detected in '%s' line %u\n"
-msgstr "Certificato di revoca creato.\n"
+msgstr "voce duplicata rilevata '%s' nella riga %u\n"
 
 #, c-format
 msgid "unsupported record type in '%s' line %u skipped\n"
-msgstr ""
+msgstr "tipo di record non supportato nella riga '%s' %u ignorato\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "invalid issuer hash in '%s' line %u\n"
-msgstr "errore: impronta digitale non valida\n"
+msgstr "hash dell'autorità emittente non valido '%s' nella riga %u\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "no issuer DN in '%s' line %u\n"
-msgstr "errore di lettura: %s\n"
+msgstr "nessun DN emittente '%s' nella riga %u\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "invalid timestamp in '%s' line %u\n"
-msgstr "errore: impronta digitale non valida\n"
+msgstr "timestamp non valido '%s' nella riga %u\n"
 
-#, fuzzy, c-format
-#| msgid "WARNING: invalid size of random_seed file - not used\n"
+#, c-format
 msgid "WARNING: invalid cache file hash in '%s' line %u\n"
-msgstr ""
-"ATTENZIONE: le dimensioni del file random_seed non sono valide - non usato\n"
+msgstr "AVVISO: hash del file di cache non valido %s' nella riga %u\n"
 
 #, c-format
 msgid "detected errors in cache dir file\n"
-msgstr ""
+msgstr "errori rilevati nel file dir della cache\n"
 
 #, c-format
 msgid "please check the reason and manually delete that file\n"
-msgstr ""
+msgstr "si prega di controllare il motivo ed eliminare manualmente quel file\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "failed to create temporary cache dir file '%s': %s\n"
-msgstr "impossibile creare la directory `%s': %s\n"
+msgstr "impossibile creare il file dir della cache temporanea '%s': %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error closing '%s': %s\n"
-msgstr "errore leggendo `%s': %s\n"
+msgstr "errore durante la chiusura di '%s': %s\n"
 
-#, fuzzy, c-format
-#| msgid "error reading `%s': %s\n"
+#, c-format
 msgid "error renaming '%s' to '%s': %s\n"
-msgstr "errore leggendo `%s': %s\n"
+msgstr "errore durante la ridenominazione di '%s' in '%s': %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "can't hash '%s': %s\n"
-msgstr "impossibile chiudere `%s': %s\n"
+msgstr "impossibile eseguire l'hashing '%s': %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error setting up MD5 hash context: %s\n"
-msgstr "errore leggendo `%s': %s\n"
+msgstr "errore durante l'impostazione del contesto hash MD5: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error hashing '%s': %s\n"
-msgstr "errore leggendo `%s': %s\n"
+msgstr "errore durante l'hashing di '%s': %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "invalid formatted checksum for '%s'\n"
-msgstr "errore: impronta digitale non valida\n"
+msgstr "checksum formattato non valido per '%s'\n"
 
 #, c-format
 msgid "too many open cache files; can't open anymore\n"
-msgstr ""
+msgstr "troppi file della cache aperti; non può più aprire\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "opening cache file '%s'\n"
-msgstr "firma fallita: %s\n"
+msgstr "apertura del file di cache '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error opening cache file '%s': %s\n"
-msgstr "errore leggendo `%s': %s\n"
+msgstr "errore durante l'apertura del file di cache '%s': %s\n"
 
 #, c-format
 msgid "error initializing cache file '%s' for reading: %s\n"
 msgstr ""
+"errore durante l'inizializzazione del file di cache '%s' per la lettura: %s\n"
 
 #, c-format
 msgid "calling unlock_db_file on a closed file\n"
-msgstr ""
+msgstr "chiamata unlock_db_file su un file chiuso\n"
 
 #, c-format
 msgid "calling unlock_db_file on an unlocked file\n"
-msgstr ""
+msgstr "chiamata unlock_db_file su un file sbloccato\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "failed to create a new cache object: %s\n"
-msgstr "%s: creazione della tabella hash fallita: %s\n"
+msgstr "impossibile creare un nuovo oggetto cache: %s\n"
 
-#, fuzzy, c-format
-#| msgid "No help available for `%s'"
+#, c-format
 msgid "no CRL available for issuer id %s\n"
-msgstr "Non è disponibile un aiuto per `%s'"
+msgstr "nessun CRL disponibile per l'ID emittente %s\n"
 
 #, c-format
 msgid "cached CRL for issuer id %s too old; update required\n"
 msgstr ""
+"CRL memorizzato nella cache per l'ID emittente %s troppo vecchio; "
+"aggiornamento richiesto\n"
 
 #, c-format
 msgid ""
 "force-crl-refresh active and %d minutes passed for issuer id %s; update "
 "required\n"
 msgstr ""
+"force-crl-refresh attivo e %d minuti per l'ID autorità emittente %s; "
+"aggiornamento richiesto\n"
 
 #, c-format
 msgid "force-crl-refresh active for issuer id %s; update required\n"
 msgstr ""
+"force-crl-refresh attivo per l'ID autorità emittente %s; aggiornamento "
+"richiesto\n"
 
 #, c-format
 msgid "available CRL for issuer ID %s can't be used\n"
-msgstr ""
+msgstr "impossibile utilizzare il CRL disponibile per l'ID emittente %s\n"
 
 #, c-format
 msgid "cached CRL for issuer id %s tampered; we need to update\n"
 msgstr ""
+"CRL memorizzato nella cache per l'ID emittente %s manomesso; abbiamo bisogno "
+"di aggiornare\n"
 
 #, c-format
 msgid "WARNING: invalid cache record length for S/N "
-msgstr ""
+msgstr "AVVISO: lunghezza del record della cache non valida per S/N "
 
-#, fuzzy, c-format
+#, c-format
 msgid "problem reading cache record for S/N %s: %s\n"
-msgstr "errore creando il portachiavi `%s': %s\n"
+msgstr "problema durante la lettura del record della cache per S/N %s: %s\n"
 
 #, c-format
 msgid "S/N %s is not valid; reason=%02X  date=%.15s\n"
-msgstr ""
+msgstr "S/N %s non valido. motivo: %02X data%15s\n"
 
 #, c-format
 msgid "S/N %s is valid, it is not listed in the CRL\n"
-msgstr ""
+msgstr "S/N %s è valido, non è elencato nel CRL\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error getting data from cache file: %s\n"
-msgstr "errore nella creazione della passhprase: %s\n"
+msgstr "errore durante il recupero dei dati dal file di cache: %s\n"
 
-#, fuzzy, c-format
-#| msgid "invalid response from agent\n"
+#, c-format
 msgid "got an invalid S-expression from libksba\n"
-msgstr "risposta non valida dall'agent\n"
+msgstr "ha ottenuto un'espressione S non valida da libksba\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "converting S-expression failed: %s\n"
-msgstr "impossibile aprire il file: %s\n"
+msgstr "conversione dell'espressione S non riuscita: %s\n"
 
-#, fuzzy, c-format
-#| msgid "invalid hash algorithm `%s'\n"
+#, c-format
 msgid "unknown hash algorithm '%s'\n"
-msgstr "algoritmo di hash non valido `%s'\n"
+msgstr "algoritmo hash sconosciuto '%s'\n"
 
 #, c-format
 msgid "gcry_md_open for algorithm %d failed: %s\n"
-msgstr ""
+msgstr "gcry_md_open per l'algoritmo %d non riuscito: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "creating S-expression failed: %s\n"
-msgstr "cancellazione del keyblock fallita: %s\n"
+msgstr "creazione dell'espressione S non riuscita: %s\n"
 
-#, fuzzy, c-format
-#| msgid "build_packet failed: %s\n"
+#, c-format
 msgid "ksba_crl_parse failed: %s\n"
-msgstr "build_packet fallito: %s\n"
+msgstr "ksba_crl_parse non riuscito: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error getting update times of CRL: %s\n"
-msgstr "errore nella creazione della passhprase: %s\n"
+msgstr "errore durante l'aggiornamento del CRL: %s\n"
 
 #, c-format
 msgid "update times of this CRL: this=%s next=%s\n"
-msgstr ""
+msgstr "orari di aggiornamento di questo CRL: this:%s next-%s\n"
 
 #, c-format
 msgid "nextUpdate not given; assuming a validity period of one day\n"
 msgstr ""
+"nextUpdate non specificato; assumendo un periodo di validità di un giorno\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error getting CRL item: %s\n"
-msgstr "errore nella creazione della passhprase: %s\n"
+msgstr "errore durante il recupero dell'elemento CRL: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error inserting item into temporary cache file: %s\n"
-msgstr "scrittura in `%s'\n"
+msgstr ""
+"errore durante l'inserimento dell'elemento nel file di cache temporaneo: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "no CRL issuer found in CRL: %s\n"
-msgstr "genera un certificato di revoca"
+msgstr "nessuna autorità emittente CRL trovata nel CRL: %s\n"
 
 #, c-format
 msgid "locating CRL issuer certificate by authorityKeyIdentifier\n"
 msgstr ""
+"individuazione del certificato dell'autorità emittente CRL da parte di "
+"authorityKeyIdentifier\n"
 
-#, fuzzy, c-format
-#| msgid "signature verification suppressed\n"
+#, c-format
 msgid "CRL signature verification failed: %s\n"
-msgstr "verifica della firma soppressa\n"
+msgstr "Verifica della firma CRL non riuscita: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error checking validity of CRL issuer certificate: %s\n"
-msgstr "controllo della firma creata fallito: %s\n"
+msgstr ""
+"errore durante il controllo della validità del certificato dell'autorità "
+"emittente CRL: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "ksba_crl_new failed: %s\n"
-msgstr "cancellazione del keyblock fallita: %s\n"
+msgstr "ksba_crl_new non riuscito: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "ksba_crl_set_reader failed: %s\n"
-msgstr "aggiornamento fallito: %s\n"
+msgstr "ksba_crl_set_reader non riuscito: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "removed stale temporary cache file '%s'\n"
-msgstr "impossibile creare la directory `%s': %s\n"
+msgstr "rimosso il file di cache temporanea non più obsoleto '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "problem removing stale temporary cache file '%s': %s\n"
-msgstr "impossibile creare la directory `%s': %s\n"
+msgstr ""
+"problema durante la rimozione del file di cache temporanea non più obsoleto "
+"'%s': %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error creating temporary cache file '%s': %s\n"
-msgstr "errore nella creazione della passhprase: %s\n"
+msgstr "errore durante la creazione del file di cache temporanea '%s': %s\n"
 
-#, fuzzy, c-format
-#| msgid "update secret failed: %s\n"
+#, c-format
 msgid "crl_parse_insert failed: %s\n"
-msgstr "aggiornamento della chiave segreta fallito: %s\n"
+msgstr "crl_parse_insert non riuscito: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error finishing temporary cache file '%s': %s\n"
-msgstr "scrittura in `%s'\n"
+msgstr ""
+"errore durante il completamento del file di cache temporanea '%s': %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error closing temporary cache file '%s': %s\n"
-msgstr "errore nella creazione della passhprase: %s\n"
+msgstr "errore durante la chiusura del file della cache temporanea '%s': %s\n"
 
 #, c-format
 msgid "WARNING: new CRL still too old; it expired on %s - loading anyway\n"
 msgstr ""
+"AVVISO: nuovo CRL ancora troppo vecchio; è scaduto su %s - il caricamento è "
+"stato completato comunque\n"
 
 #, c-format
 msgid "new CRL still too old; it expired on %s\n"
-msgstr ""
+msgstr "nuovo CRL ancora troppo vecchio; è scaduto su %s\n"
 
 #, c-format
 msgid "unknown critical CRL extension %s\n"
-msgstr ""
+msgstr "estensione CRL critica sconosciuta %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error reading CRL extensions: %s\n"
-msgstr "errore leggendo `%s': %s\n"
+msgstr "errore durante la lettura delle estensioni CRL: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "creating cache file '%s'\n"
-msgstr "errore nella creazione della passhprase: %s\n"
+msgstr "creazione del file di cache '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "problem renaming '%s' to '%s': %s\n"
-msgstr "creazione dell'armatura fallita: %s\n"
+msgstr "problema durante la ridenominazione di '%s' in '%s': %s\n"
 
 #, c-format
 msgid ""
 "updating the DIR file failed - cache entry will get lost with the next "
 "program start\n"
 msgstr ""
+"aggiornamento del file DIR non riuscito - la voce della cache andrà persa "
+"con il successivo avvio del programma\n"
 
 #, c-format
 msgid "Begin CRL dump (retrieved via %s)\n"
-msgstr ""
+msgstr "Inizio dump CRL (recuperato tramite %s)\n"
 
 msgid ""
 " ERROR: The CRL will not be used because it was still too old after an "
 "update!\n"
 msgstr ""
+" ERRORE: il CRL non verrà utilizzato perché era ancora troppo vecchio dopo "
+"un aggiornamento!\n"
 
 msgid ""
 " ERROR: The CRL will not be used due to an unknown critical extension!\n"
 msgstr ""
+" ERRORE: il CRL non verrà utilizzato a causa di un'estensione critica "
+"sconosciuta!\n"
 
 msgid " ERROR: The CRL will not be used\n"
-msgstr ""
+msgstr " ERRORE: il CRL non verrà utilizzato\n"
 
 msgid " ERROR: This cached CRL may have been tampered with!\n"
 msgstr ""
+" ERRORE: questo CRL memorizzato nella cache potrebbe essere stato "
+"manomesso!\n"
 
-#, fuzzy, c-format
-#| msgid "WARNING: invalid size of random_seed file - not used\n"
+#, c-format
 msgid " WARNING: invalid cache record length\n"
-msgstr ""
-"ATTENZIONE: le dimensioni del file random_seed non sono valide - non usato\n"
+msgstr " AVVISO: lunghezza del record della cache non valida\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "problem reading cache record: %s\n"
-msgstr "%s: errore durante la lettura del record libero: %s\n"
+msgstr "problema durante la lettura del record della cache: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "problem reading cache key: %s\n"
-msgstr "rev? problema controllando la revoca: %s\n"
+msgstr "problema durante la lettura della chiave della cache: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error reading cache entry from db: %s\n"
-msgstr "errore leggendo `%s': %s\n"
+msgstr "errore durante la lettura della voce della cache dal database: %s\n"
 
 msgid "End CRL dump\n"
-msgstr ""
+msgstr "Fine dump CRL\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "crl_fetch via DP failed: %s\n"
-msgstr "aggiornamento fallito: %s\n"
+msgstr "crl_fetch tramite DP non riuscito: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "crl_cache_insert via DP failed: %s\n"
-msgstr "controllo della firma creata fallito: %s\n"
+msgstr "crl_cache_insert tramite DP non riuscito: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "crl_cache_insert via issuer failed: %s\n"
-msgstr "cancellazione del keyblock fallita: %s\n"
+msgstr "crl_cache_insert tramite autorità emittente non riuscita: %s\n"
 
 #, c-format
 msgid "reader to file mapping table full - waiting\n"
-msgstr ""
+msgstr "lettore alla tabella di mapping file piena - in attesa\n"
 
 #, c-format
 msgid "CRL access not possible due to disabled %s\n"
-msgstr ""
+msgstr "Accesso CRL non possibile a causa della disabilitata di %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error retrieving '%s': %s\n"
-msgstr "errore creando `%s': %s\n"
+msgstr "errore durante il recupero di '%s': %s\n"
 
-#, fuzzy, c-format
-#| msgid "%s: error writing dir record: %s\n"
+#, c-format
 msgid "error initializing reader object: %s\n"
-msgstr "%s: errore durante la scrittura del dir record: %s\n"
+msgstr "errore durante l'inizializzazione dell'oggetto lettore: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "CRL access not possible due to Tor mode\n"
-msgstr "chiave `%s' non trovata: %s\n"
+msgstr "Accesso CRL non possibile a causa della modalità Tor\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "certificate search not possible due to disabled %s\n"
-msgstr "chiave `%s' non trovata: %s\n"
+msgstr ""
+"ricerca del certificato non possibile a causa della disabilitata di %s\n"
 
 msgid "use OCSP instead of CRLs"
-msgstr ""
+msgstr "utilizzare OCSP anziché CRL"
 
 msgid "check whether a dirmngr is running"
-msgstr ""
+msgstr "controllare se un dirmngr è in esecuzione"
 
-#, fuzzy
 msgid "add a certificate to the cache"
-msgstr "Certificato di revoca creato.\n"
+msgstr "aggiungere un certificato alla cache"
 
-#, fuzzy
 msgid "validate a certificate"
-msgstr "certificato danneggiato"
+msgstr "convalidare un certificato"
 
-#, fuzzy
 msgid "lookup a certificate"
-msgstr "certificato danneggiato"
+msgstr "ricerca di un certificato"
 
-#, fuzzy
 msgid "lookup only locally stored certificates"
-msgstr "certificato danneggiato"
+msgstr "ricerca solo di certificati archiviati localmente"
 
 msgid "expect an URL for --lookup"
-msgstr ""
+msgstr "previsto un URL per --lookup"
 
 msgid "load a CRL into the dirmngr"
-msgstr ""
+msgstr "caricare un CRL nel dirmngr"
 
 msgid "special mode for use by Squid"
-msgstr ""
+msgstr "modalità speciale per l'uso da parte di Squid"
 
-#, fuzzy
 msgid "expect certificates in PEM format"
-msgstr "certificato danneggiato"
+msgstr "prevedere certificati in formato PEM"
 
-#, fuzzy
-#| msgid "Enter the user ID of the designated revoker: "
 msgid "force the use of the default OCSP responder"
-msgstr "Inserisci l'user ID del revocatore designato: "
+msgstr "forzare l'uso del risponditore OCSP predefinito"
 
-#, fuzzy
-#| msgid "Usage: gpg [options] [files] (-h for help)"
 msgid "Usage: dirmngr-client [options] [certfile|pattern] (-h for help)\n"
-msgstr "Uso: gpg [opzioni] [files] (-h per l'aiuto)"
+msgstr ""
+"Utilizzo: dirmngr-client [opzioni] [certfile-pattern] (-h per assistenza)\n"
 
 msgid ""
 "Syntax: dirmngr-client [options] [certfile|pattern]\n"
@@ -8150,993 +7940,954 @@ msgid ""
 "The process returns 0 if the certificate is valid, 1 if it is\n"
 "not valid and other error codes for general failures\n"
 msgstr ""
+"Sintassi: dirmngr-client [opzioni] [certfile-pattern]\n"
+"Testare un certificato X.509 rispetto a un CRL o eseguire un controllo OCSP\n"
+"Il processo restituisce 0 se il certificato è valido, 1 se è\n"
+"non validi e altri codici di errore per gli errori generali\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error reading certificate from stdin: %s\n"
-msgstr "errore nella creazione della passhprase: %s\n"
+msgstr "errore durante la lettura del certificato da stdin: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error reading certificate from '%s': %s\n"
-msgstr "errore leggendo `%s': %s\n"
+msgstr "errore durante la lettura del certificato da '%s': %s\n"
 
 #, c-format
 msgid "certificate too large to make any sense\n"
-msgstr ""
+msgstr "certificato troppo grande per avere un senso\n"
 
-#, fuzzy, c-format
-#| msgid "can't connect to `%s': %s\n"
+#, c-format
 msgid "can't connect to the dirmngr: %s\n"
-msgstr "impossibile connettersi a `%s': %s\n"
+msgstr "impossibile connettersi al dirmngr: %s\n"
 
-#, fuzzy, c-format
-#| msgid "update failed: %s\n"
+#, c-format
 msgid "lookup failed: %s\n"
-msgstr "aggiornamento fallito: %s\n"
+msgstr "ricerca non riuscita: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "loading CRL '%s' failed: %s\n"
-msgstr "creazione dell'armatura fallita: %s\n"
+msgstr "caricamento CRL '%s' non riuscito: %s\n"
 
 #, c-format
 msgid "a dirmngr daemon is up and running\n"
-msgstr ""
+msgstr "un daemon dirmngr è in funzione\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "validation of certificate failed: %s\n"
-msgstr "cancellazione del keyblock fallita: %s\n"
+msgstr "convalida del certificato non riuscita: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "certificate is valid\n"
-msgstr "la preferenza %c%lu è doppia\n"
+msgstr "catena di certificati valida\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "certificate has been revoked\n"
-msgstr "NOTA: la chiave è stata revocata"
+msgstr "certificato è stato revocato\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "certificate check failed: %s\n"
-msgstr "cancellazione del keyblock fallita: %s\n"
+msgstr "controllo del certificato non riuscito: %s\n"
 
-#, fuzzy, c-format
-#| msgid "can't stat `%s': %s\n"
+#, c-format
 msgid "got status: '%s'\n"
-msgstr "impossibile eseguire stat su `%s': %s\n"
+msgstr "stato ottenuto: '%s'\n"
 
-#, fuzzy, c-format
-#| msgid "error writing secret keyring `%s': %s\n"
+#, c-format
 msgid "error writing base64 encoding: %s\n"
-msgstr "errore scrivendo il portachiavi segreto `%s': %s\n"
+msgstr "errore durante la scrittura della codifica base64: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "unsupported inquiry '%s'\n"
-msgstr ""
-"\n"
-"Algoritmi gestiti:\n"
+msgstr "richiesta '%s' non supportata\n"
 
 #, c-format
 msgid "absolute file name expected\n"
-msgstr ""
+msgstr "previsto nome file assoluto\n"
 
 #, c-format
 msgid "looking up '%s'\n"
-msgstr ""
+msgstr "ricerca di '%s'\n"
 
 msgid "list the contents of the CRL cache"
-msgstr ""
+msgstr "elencare il contenuto della cache CRL"
 
-#, fuzzy
 msgid "|FILE|load CRL from FILE into cache"
-msgstr "|FILE|carica il modulo di estensione FILE"
+msgstr "|FILE|carica CRL da FILE nella cache"
 
 msgid "|URL|fetch a CRL from URL"
-msgstr ""
+msgstr "|URL|recupero di un CRL dall'URL"
 
 msgid "shutdown the dirmngr"
-msgstr ""
+msgstr "arrestare il dirmngr"
 
 msgid "flush the cache"
-msgstr ""
+msgstr "svuotare la cache"
 
 msgid "|FILE|write server mode logs to FILE"
-msgstr ""
+msgstr "|FILE|scrittura dei registri in modalità server in FILE"
 
-#, fuzzy
 msgid "run without asking a user"
-msgstr "Esco senza salvare? "
+msgstr "eseguire senza chiedere a un utente"
 
 msgid "force loading of outdated CRLs"
-msgstr ""
+msgstr "forzare il caricamento di CRL obsoleti"
 
 msgid "allow sending OCSP requests"
-msgstr ""
+msgstr "consentire l'invio di richieste OCSP"
 
 msgid "allow online software version check"
-msgstr ""
+msgstr "consentire il controllo della versione del software online"
 
 msgid "inhibit the use of HTTP"
-msgstr ""
+msgstr "inibire l'uso di HTTP"
 
 msgid "inhibit the use of LDAP"
-msgstr ""
+msgstr "inibire l'uso di LDAP"
 
 msgid "ignore HTTP CRL distribution points"
-msgstr ""
+msgstr "ignorare i punti di distribuzione CRL HTTP"
 
 msgid "ignore LDAP CRL distribution points"
-msgstr ""
+msgstr "ignorare i punti di distribuzione CRL LDAP"
 
 msgid "ignore certificate contained OCSP service URLs"
-msgstr ""
+msgstr "ignorare gli URL del servizio OCSP contenuti nel certificato"
 
 msgid "|URL|redirect all HTTP requests to URL"
-msgstr ""
+msgstr "|URL|reindirizza tutte le richieste HTTP all'URL"
 
 msgid "|HOST|use HOST for LDAP queries"
-msgstr ""
+msgstr "|HOST|utilizzare HOST per le query LDAP"
 
 msgid "do not use fallback hosts with --ldap-proxy"
-msgstr ""
+msgstr "non utilizzare host di fallback con --ldap-proxy"
 
-#, fuzzy
 msgid "|FILE|read LDAP server list from FILE"
-msgstr "|FILE|carica il modulo di estensione FILE"
+msgstr "|FILE|lettura dell'elenco dei server LDAP da FILE"
 
 msgid "add new servers discovered in CRL distribution points to serverlist"
 msgstr ""
+"aggiungere nuovi server individuati nei punti di distribuzione CRL "
+"all'elenco dei server"
 
 msgid "|N|set LDAP timeout to N seconds"
-msgstr ""
+msgstr "|N|imposta il timeout LDAP su N secondi"
 
-#, fuzzy
 msgid "|URL|use OCSP responder at URL"
-msgstr "impossibile fare il parsing dell'URI del keyserver\n"
+msgstr "|URL|utilizzare risponditore OCSP all'URL"
 
 msgid "|FPR|OCSP response signed by FPR"
-msgstr ""
+msgstr "|FPR|Risposta OCSP firmata da FPR"
 
 msgid "|N|do not return more than N items in one query"
-msgstr ""
+msgstr "|N|Non restituire più di N elementi in una query"
 
 msgid "|FILE|use the CA certificates in FILE for HKP over TLS"
-msgstr ""
+msgstr "|FILE|utilizzare i certificati CA in FILE per HKP su TLS"
 
 msgid "route all network traffic via Tor"
-msgstr ""
+msgstr "instradare tutto il traffico di rete tramite Tor"
 
-#, fuzzy
-#| msgid ""
-#| "@\n"
-#| "(See the man page for a complete listing of all commands and options)\n"
 msgid ""
 "@\n"
 "(See the \"info\" manual for a complete listing of all commands and "
 "options)\n"
 msgstr ""
 "@\n"
-"(Vedi la man page per una lista completa di tutti i comandi e opzioni)\n"
+"(Vedere il manuale \"info\" per un elenco completo di tutti i comandi e le "
+"opzioni)\n"
 
-#, fuzzy
 msgid "Usage: @DIRMNGR@ [options] (-h for help)"
-msgstr "Uso: gpg [opzioni] [files] (-h per l'aiuto)"
+msgstr "Utilizzo: @DIRMNGR@ [opzioni] (-h per assistenza)"
 
 msgid ""
 "Syntax: @DIRMNGR@ [options] [command [args]]\n"
 "Keyserver, CRL, and OCSP access for @GNUPG@\n"
 msgstr ""
+"Sintassi: @DIRMNGR@ [opzioni] [comando [args]]\n"
+"Accesso keyserver, CRL e OCSP per @GNUPG@\n"
 
 #, c-format
 msgid "valid debug levels are: %s\n"
-msgstr ""
+msgstr "i livelli di debug validi sono: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "usage: %s [options] "
-msgstr "uso: gpg [opzioni] "
+msgstr "utilizzo: %s [opzioni] "
 
-#, fuzzy, c-format
-#| msgid "%s not allowed with %s!\n"
+#, c-format
 msgid "colons are not allowed in the socket name\n"
-msgstr "Non è permesso usare %s con %s!\n"
+msgstr "due punti non sono consentiti nel nome del socket\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "fetching CRL from '%s' failed: %s\n"
-msgstr "creazione dell'armatura fallita: %s\n"
+msgstr "recupero CRL da '%s' non riuscito: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "processing CRL from '%s' failed: %s\n"
-msgstr "creazione dell'armatura fallita: %s\n"
+msgstr "elaborazione CRL da '%s' non riuscita: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "%s:%u: line too long - skipped\n"
-msgstr "riga troppo lunga\n"
+msgstr "%s:%u: riga troppo lunga - ignorata\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "%s:%u: invalid fingerprint detected\n"
-msgstr "errore: impronta digitale non valida\n"
+msgstr "%s:%u: rilevata impronta digitale non valida\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "%s:%u: read error: %s\n"
-msgstr "errore di lettura: %s\n"
+msgstr "%s: %u: errore di lettura: %s\n"
 
 #, c-format
 msgid "%s:%u: garbage at end of line ignored\n"
-msgstr ""
+msgstr "%s: %u: Garbage alla fine della riga ignorato\n"
 
 #, c-format
 msgid "SIGHUP received - re-reading configuration and flushing caches\n"
 msgstr ""
+"SIGHUP ricevuto - rilezione delle cache di configurazione e svuotamento\n"
 
 #, c-format
 msgid "SIGUSR2 received - no action defined\n"
-msgstr ""
+msgstr "SIGUSR2 ricevuto - nessuna azione definita\n"
 
 #, c-format
 msgid "SIGTERM received - shutting down ...\n"
-msgstr ""
+msgstr "SIGTERM ricevuto - arresto …\n"
 
 #, c-format
 msgid "SIGTERM received - still %d active connections\n"
-msgstr ""
+msgstr "SIGTERM ricevuto - connessioni ancora %d attive\n"
 
-# ??? (Md)
-#, fuzzy, c-format
+#, c-format
 msgid "shutdown forced\n"
-msgstr "non esaminato"
+msgstr "arresto forzato\n"
 
 #, c-format
 msgid "SIGINT received - immediate shutdown\n"
-msgstr ""
+msgstr "SIGINT ricevuto - arresto immediato\n"
 
 #, c-format
 msgid "signal %d received - no action defined\n"
-msgstr ""
+msgstr "segnale %d ricevuto - nessuna azione definita\n"
 
 msgid "return all values in a record oriented format"
-msgstr ""
+msgstr "restituire tutti i valori in un formato orientato ai record"
 
 msgid "|NAME|ignore host part and connect through NAME"
-msgstr ""
+msgstr "|NOME|Ignorare la parte host e connettersi tramite NOME"
 
-#, fuzzy
-#| msgid "|NAME|set terminal charset to NAME"
 msgid "|NAME|connect to host NAME"
-msgstr "|NOME|imposta NOME come set di caratteri del terminale"
+msgstr "Nome:connessione all'host NOME"
 
 msgid "|N|connect to port N"
-msgstr ""
+msgstr "|N|Connessione alla porta N"
 
-#, fuzzy
-#| msgid "|NAME|use NAME as default recipient"
 msgid "|NAME|use user NAME for authentication"
-msgstr "|NOME|usa NOME come destinatario predefinito"
+msgstr "Nome:utilizzare nome utente per l'autenticazione"
 
 msgid "|PASS|use password PASS for authentication"
-msgstr ""
+msgstr "|PASS|utilizzare la password PASS per l'autenticazione"
 
 msgid "take password from $DIRMNGR_LDAP_PASS"
-msgstr ""
+msgstr "prendere la password da $DIRMNGR_LDAP_PASS"
 
 msgid "|STRING|query DN STRING"
-msgstr ""
+msgstr "|STRINGA|stringa DN query"
 
 msgid "|STRING|use STRING as filter expression"
-msgstr ""
+msgstr "| STRINGA: utilizzare STRING come espressione di filtro"
 
 msgid "|STRING|return the attribute STRING"
-msgstr ""
+msgstr "| STRINGA: restituisce l'attributo STRING"
 
-#, fuzzy
-#| msgid "Usage: gpg [options] [files] (-h for help)"
 msgid "Usage: dirmngr_ldap [options] [URL] (-h for help)\n"
-msgstr "Uso: gpg [opzioni] [files] (-h per l'aiuto)"
+msgstr "Utilizzo: dirmngr_ldap [opzioni] [URL] (-h per assistenza)\n"
 
 msgid ""
 "Syntax: dirmngr_ldap [options] [URL]\n"
 "Internal LDAP helper for Dirmngr\n"
 "Interface and options may change without notice\n"
 msgstr ""
+"Sintassi: dirmngr_ldap [opzioni] [URL]\n"
+"Helper LDAP interno per Dirmngr\n"
+"L'interfaccia e le opzioni possono cambiare senza preavviso\n"
 
-#, fuzzy, c-format
-#| msgid "invalid import options\n"
+#, c-format
 msgid "invalid port number %d\n"
-msgstr "opzioni di importazione non valide\n"
+msgstr "numero di porta non valido %d\n"
 
 #, c-format
 msgid "scanning result for attribute '%s'\n"
-msgstr ""
+msgstr "risultato dell'analisi per l'attributo '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error writing to stdout: %s\n"
-msgstr "errore scrivendo il portachiavi `%s': %s\n"
+msgstr "errore durante la scrittura in stdout: %s\n"
 
 #, c-format
 msgid "          available attribute '%s'\n"
-msgstr ""
+msgstr "           attributo disponibile '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "attribute '%s' not found\n"
-msgstr "chiave `%s' non trovata: %s\n"
+msgstr "attributo '%s' non trovato\n"
 
 #, c-format
 msgid "found attribute '%s'\n"
-msgstr ""
+msgstr "trovato attributo '%s'\n"
 
-#, fuzzy, c-format
-#| msgid "reading from `%s'\n"
+#, c-format
 msgid "processing url '%s'\n"
-msgstr "lettura da `%s'\n"
+msgstr "elaborazione url '%s'\n"
 
-#, fuzzy, c-format
-#| msgid "          w/o user IDs: %lu\n"
+#, c-format
 msgid "          user '%s'\n"
-msgstr "         senza user ID: %lu\n"
+msgstr "         utente '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "          pass '%s'\n"
-msgstr "                alias \""
+msgstr "         passare '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "          host '%s'\n"
-msgstr "                alias \""
+msgstr "         host '%s'\n"
 
-#, fuzzy, c-format
-#| msgid "          not imported: %lu\n"
+#, c-format
 msgid "          port %d\n"
-msgstr "             importate: %lu\n"
+msgstr "         porta %d\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "            DN '%s'\n"
-msgstr "                alias \""
+msgstr "          DN '%s'\n"
 
 #, c-format
 msgid "        filter '%s'\n"
-msgstr ""
+msgstr "        filtro '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "          attr '%s'\n"
-msgstr "                alias \""
+msgstr "          attr '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "no host name in '%s'\n"
-msgstr "(Non è stata data una descrizione)\n"
+msgstr "nessun nome host in '%s'\n"
 
 #, c-format
 msgid "no attribute given for query '%s'\n"
-msgstr ""
+msgstr "nessun attributo specificato per la query '%s'\n"
 
-#, fuzzy, c-format
-#| msgid "WARNING: using insecure memory!\n"
+#, c-format
 msgid "WARNING: using first attribute only\n"
-msgstr "ATTENZIONE: si sta usando memoria insicura!\n"
+msgstr "AVVISO: utilizzo solo del primo attributo\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "LDAP init to '%s:%d' failed: %s\n"
-msgstr "creazione dell'armatura fallita: %s\n"
+msgstr "Impossibile eseguire LDAP in '%s:%d': %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "binding to '%s:%d' failed: %s\n"
-msgstr "creazione dell'armatura fallita: %s\n"
+msgstr "binding a '%s:%d' non riuscito: %s\n"
 
-#, fuzzy, c-format
-#| msgid "dearmoring failed: %s\n"
+#, c-format
 msgid "searching '%s' failed: %s\n"
-msgstr "rimozione dell'armatura fallita: %s\n"
+msgstr "ricerca '%s' non riuscita: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "'%s' is not an LDAP URL\n"
-msgstr "\"%s\": non è un file JPEG\n"
+msgstr "'%s' non è un URL LDAP\n"
 
 #, c-format
 msgid "'%s' is an invalid LDAP URL\n"
-msgstr ""
+msgstr "'%s' è un URL LDAP non valido\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error accessing '%s': http status %u\n"
-msgstr "errore leggendo `%s': %s\n"
+msgstr "errore durante l'accesso a '%s': stato http %u\n"
 
 #, c-format
 msgid "URL '%s' redirected to '%s' (%u)\n"
-msgstr ""
+msgstr "URL '%s' reindirizzato a '%s' (%u)\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "too many redirections\n"
-msgstr "ci sono troppe preferenze `%c'\n"
+msgstr "troppi reindirizzamenti\n"
 
-#, fuzzy, c-format
-#| msgid "writing to `%s'\n"
+#, c-format
 msgid "redirection changed to '%s'\n"
-msgstr "scrittura in `%s'\n"
+msgstr "reindirizzamento modificato in '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error printing log line: %s\n"
-msgstr "errore scrivendo il portachiavi `%s': %s\n"
+msgstr "errore durante la stampa della riga di registro: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error reading log from ldap wrapper %d: %s\n"
-msgstr "errore leggendo `%s': %s\n"
+msgstr "errore durante la lettura del registro dal wrapper ldap %d: %s\n"
 
 #, c-format
 msgid "ldap wrapper %d ready"
-msgstr ""
+msgstr "wrapper ldap %d pronto"
 
 #, c-format
 msgid "ldap wrapper %d ready: timeout\n"
-msgstr ""
+msgstr "wrapper ldap %d pronto: timeout\n"
 
 #, c-format
 msgid "ldap wrapper %d ready: exitcode=%d\n"
-msgstr ""
+msgstr "wrapper ldap %d pronto: exitcode:%d\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "waiting for ldap wrapper %d failed: %s\n"
-msgstr "aggiornamento fallito: %s\n"
+msgstr "in attesa del wrapper ldap %d non riuscito: %s\n"
 
 #, c-format
 msgid "ldap wrapper %d stalled - killing\n"
-msgstr ""
+msgstr "wrapper ldap %d bloccato - killing\n"
 
 #, c-format
 msgid "invalid char 0x%02x in host name - not added\n"
-msgstr ""
+msgstr "char non valido 0x%02x nel nome host - non aggiunto\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "adding '%s:%d' to the ldap server list\n"
-msgstr "cerco \"%s\" sul server HKP %s\n"
+msgstr "aggiunta di '%s:%d' all'elenco dei server ldap\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "malloc failed: %s\n"
-msgstr "cancellazione del keyblock fallita: %s\n"
+msgstr "malloc non riuscito: %s\n"
 
 #, c-format
 msgid "start_cert_fetch: invalid pattern '%s'\n"
-msgstr ""
+msgstr "start_cert_fetch: modello '%s' non valido\n"
 
 #, c-format
 msgid "ldap_search hit the size limit of the server\n"
-msgstr ""
+msgstr "ldap_search raggiunto il limite di dimensioni del server\n"
 
-#, fuzzy, c-format
-#| msgid "%s: invalid file version %d\n"
+#, c-format
 msgid "invalid canonical S-expression found\n"
-msgstr "%s: versione %d del file non valida\n"
+msgstr "trovata espressione S canonica non valida\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "gcry_md_open failed: %s\n"
-msgstr "impossibile aprire il file: %s\n"
+msgstr "gcry_md_open non riuscito: %s\n"
 
-#, fuzzy, c-format
-#| msgid "update secret failed: %s\n"
+#, c-format
 msgid "oops: ksba_cert_hash failed: %s\n"
-msgstr "aggiornamento della chiave segreta fallito: %s\n"
+msgstr "oops: ksba_cert_hash non riuscito: %s\n"
 
 #, c-format
 msgid "bad URL encoding detected\n"
-msgstr ""
+msgstr "rilevata codifica URL non valida\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error reading from responder: %s\n"
-msgstr "errore leggendo `%s': %s\n"
+msgstr "errore durante la lettura dal risponditore: %s\n"
 
 #, c-format
 msgid "response from server too large; limit is %d bytes\n"
-msgstr ""
+msgstr "risposta dal server troppo grande; limite è %d byte\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "OCSP request not possible due to Tor mode\n"
-msgstr "chiave `%s' non trovata: %s\n"
+msgstr "Richiesta OCSP non possibile a causa della modalità Tor\n"
 
 #, c-format
 msgid "OCSP request not possible due to disabled HTTP\n"
-msgstr ""
+msgstr "Richiesta OCSP non possibile a causa di HTTP disabilitato\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error setting OCSP target: %s\n"
-msgstr "errore leggendo `%s': %s\n"
+msgstr "errore durante l'impostazione della destinazione OCSP: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error building OCSP request: %s\n"
-msgstr "errore leggendo `%s': %s\n"
+msgstr "errore durante la creazione della richiesta OCSP: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error connecting to '%s': %s\n"
-msgstr "errore scrivendo il portachiavi `%s': %s\n"
+msgstr "errore durante la connessione a '%s': %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error reading HTTP response for '%s': %s\n"
-msgstr "errore leggendo `%s': %s\n"
+msgstr "errore durante la lettura della risposta HTTP per '%s': %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error parsing OCSP response for '%s': %s\n"
-msgstr "errore leggendo `%s': %s\n"
+msgstr "errore durante l'analisi della risposta OCSP per '%s': %s\n"
 
 #, c-format
 msgid "OCSP responder at '%s' status: %s\n"
-msgstr ""
+msgstr "Risponditore OCSP allo stato '%s': %s\n"
 
 #, c-format
 msgid "failed to establish a hashing context for OCSP: %s\n"
-msgstr ""
+msgstr "impossibile stabilire un contesto di hashing per OCSP: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "hashing the OCSP response for '%s' failed: %s\n"
-msgstr "controllo della firma creata fallito: %s\n"
+msgstr "hash della risposta OCSP per '%s' non riuscito: %s\n"
 
 #, c-format
 msgid "not signed by a default OCSP signer's certificate"
-msgstr ""
+msgstr "non firmato da un certificato del firmatario OCSP predefinito"
 
-#, fuzzy, c-format
+#, c-format
 msgid "allocating list item failed: %s\n"
-msgstr "cancellazione del keyblock fallita: %s\n"
+msgstr "allocazione della voce di elenco non riuscita: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error getting responder ID: %s\n"
-msgstr "errore nella creazione della passhprase: %s\n"
+msgstr "errore durante il recupero dell'ID risponditore: %s\n"
 
 #, c-format
 msgid "no suitable certificate found to verify the OCSP response\n"
 msgstr ""
+"non è stato trovato alcun certificato adatto per verificare la risposta "
+"OCSP\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "issuer certificate not found: %s\n"
-msgstr "chiave `%s' non trovata: %s\n"
+msgstr "certificato dell'autorità emittente non trovato: %s\n"
 
 #, c-format
 msgid "caller did not return the target certificate\n"
-msgstr ""
+msgstr "chiamante non ha restituito il certificato di destinazione\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "caller did not return the issuing certificate\n"
-msgstr "genera un certificato di revoca"
+msgstr "chiamante non ha restituito il certificato di emissione\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "failed to allocate OCSP context: %s\n"
-msgstr "inizializzazione del trustdb fallita: %s\n"
+msgstr "impossibile allocare il contesto OCSP: %s\n"
 
 #, c-format
 msgid "no default OCSP responder defined\n"
-msgstr ""
+msgstr "nessun risponditore OCSP predefinito definito\n"
 
-#, fuzzy, c-format
-#| msgid "no default secret keyring: %s\n"
+#, c-format
 msgid "no default OCSP signer defined\n"
-msgstr "nessun portachiavi segreto predefinito: %s\n"
+msgstr "nessun firmatario OCSP predefinito definito\n"
 
 #, c-format
 msgid "using default OCSP responder '%s'\n"
-msgstr ""
+msgstr "utilizzando il risponditore OCSP predefinito '%s'\n"
 
-#, fuzzy, c-format
-#| msgid "using cipher %s\n"
+#, c-format
 msgid "using OCSP responder '%s'\n"
-msgstr "uso il cifrario %s\n"
+msgstr "utilizzo del risponditore OCSP '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error getting OCSP status for target certificate: %s\n"
-msgstr "errore nella creazione della passhprase: %s\n"
+msgstr ""
+"errore durante il recupero dello stato OCSP per il certificato di "
+"destinazione: %s\n"
 
 #, c-format
 msgid "certificate status is: %s  (this=%s  next=%s)\n"
-msgstr ""
+msgstr "lo stato del certificato è: %s  (questo: %s  successivo= %s)\n"
 
 msgid "good"
-msgstr ""
+msgstr "buono"
 
-#, fuzzy, c-format
+#, c-format
 msgid "certificate has been revoked at: %s due to: %s\n"
-msgstr "NOTA: la chiave è stata revocata"
+msgstr "il certificato è stato revocato alle: %s a causa di: %s\n"
 
 #, c-format
 msgid "OCSP responder returned a status in the future\n"
-msgstr ""
+msgstr "Il risponditore OCSP ha restituito uno stato in futuro\n"
 
 #, c-format
 msgid "OCSP responder returned a non-current status\n"
-msgstr ""
+msgstr "Il risponditore OCSP ha restituito uno stato non corrente\n"
 
 #, c-format
 msgid "OCSP responder returned an too old status\n"
-msgstr ""
+msgstr "Il risponditore OCSP ha restituito uno stato troppo vecchio\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "assuan_inquire(%s) failed: %s\n"
-msgstr "firma fallita: %s\n"
+msgstr "assuan_inquire(%s) non riuscito: %s\n"
 
 msgid "ldapserver missing"
-msgstr ""
+msgstr "ldapserver mancante"
 
 msgid "serialno missing in cert ID"
-msgstr ""
+msgstr "serialno mancante nell'ID certificato"
 
-#, fuzzy, c-format
+#, c-format
 msgid "assuan_inquire failed: %s\n"
-msgstr "firma fallita: %s\n"
+msgstr "assuan_inquire non riuscito: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "fetch_cert_by_url failed: %s\n"
-msgstr "cancellazione del keyblock fallita: %s\n"
+msgstr "fetch_cert_by_url non riuscito: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error sending data: %s\n"
-msgstr "errore leggendo `%s': %s\n"
+msgstr "errore durante l'invio dei dati: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "start_cert_fetch failed: %s\n"
-msgstr "cancellazione del keyblock fallita: %s\n"
+msgstr "start_cert_fetch non riuscito: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "fetch_next_cert failed: %s\n"
-msgstr "cancellazione del keyblock fallita: %s\n"
+msgstr "fetch_next_cert non riuscito: %s\n"
 
 #, c-format
 msgid "max_replies %d exceeded\n"
-msgstr ""
+msgstr "max_replies %d superato\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "can't allocate control structure: %s\n"
-msgstr "impossibile creare `%s': %s\n"
+msgstr "impossibile allocare la struttura di controllo: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "failed to allocate assuan context: %s\n"
-msgstr "%s: creazione della tabella hash fallita: %s\n"
+msgstr "impossibile allocare il contesto assuan: %s\n"
 
-#, fuzzy, c-format
-#| msgid "failed to initialize the TrustDB: %s\n"
+#, c-format
 msgid "failed to initialize the server: %s\n"
-msgstr "inizializzazione del trustdb fallita: %s\n"
+msgstr "impossibile inizializzare il server: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "failed to the register commands with Assuan: %s\n"
-msgstr "rebuild della cache del portachiavi fallito: %s\n"
+msgstr "impossibile eseguire i comandi di registro con Assuan: %s\n"
 
 #, c-format
 msgid "Assuan accept problem: %s\n"
-msgstr ""
+msgstr "Problema di accettazione assuan: %s\n"
 
-#, fuzzy, c-format
-#| msgid "signing failed: %s\n"
+#, c-format
 msgid "Assuan processing failed: %s\n"
-msgstr "firma fallita: %s\n"
+msgstr "Elaborazione Assuan non riuscita: %s\n"
 
 #, c-format
 msgid "accepting root CA not marked as a CA"
-msgstr ""
+msgstr "accettazione della CA principale non contrassegnata come CA"
 
-#, fuzzy, c-format
-#| msgid "checking the trustdb\n"
+#, c-format
 msgid "CRL checking too deeply nested\n"
-msgstr "controllo il trustdb\n"
+msgstr "Controllo CRL troppo profondo\n"
 
 msgid "not checking CRL for"
-msgstr ""
+msgstr "non controlla CRL per"
 
-#, fuzzy
 msgid "checking CRL for"
-msgstr "controllo della firma creata fallito: %s\n"
+msgstr "controllo CRL per"
 
-#, fuzzy, c-format
+#, c-format
 msgid "selfsigned certificate has a BAD signature"
-msgstr "verifica una firma"
+msgstr "certificato autofirmato ha una firma BAD"
 
-#, fuzzy, c-format
+#, c-format
 msgid "checking trustworthiness of root certificate failed: %s\n"
-msgstr "controllo della firma creata fallito: %s\n"
+msgstr "controllo dell'affidabilità del certificato radice non riuscito: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "certificate chain is good\n"
-msgstr "la preferenza %c%lu è doppia\n"
+msgstr "catena di certificati è buono\n"
 
 #, c-format
 msgid "certificate should not have been used for CRL signing\n"
-msgstr ""
+msgstr "certificato non deve essere stato utilizzato per la firma CRL\n"
 
-#, fuzzy
 msgid "quiet"
-msgstr "quit"
+msgstr "tranquilla"
 
 msgid "print data out hex encoded"
-msgstr ""
+msgstr "stampare i dati esendo codificati"
 
 msgid "decode received data lines"
-msgstr ""
+msgstr "decodificare le righe di dati ricevute"
 
 msgid "connect to the dirmngr"
-msgstr ""
+msgstr "collegare al dirmngr"
 
 msgid "|NAME|connect to Assuan socket NAME"
-msgstr ""
+msgstr "|NAME|connessione al socket Assuan NOME"
 
 msgid "|ADDR|connect to Assuan server at ADDR"
-msgstr ""
+msgstr "|ADDR|connessione al server Assuan presso ADDR"
 
 msgid "run the Assuan server given on the command line"
-msgstr ""
+msgstr "eseguire il server Assuan specificato sulla riga di comando"
 
 msgid "do not use extended connect mode"
-msgstr ""
+msgstr "non utilizzare la modalità di connessione estesa"
 
-#, fuzzy
 msgid "|FILE|run commands from FILE on startup"
-msgstr "|FILE|carica il modulo di estensione FILE"
+msgstr "|FILE|esegui comandi da FILE all'avvio"
 
 msgid "run /subst on startup"
-msgstr ""
+msgstr "eseguire /subst all'avvio"
 
-#, fuzzy
 msgid "Usage: @GPG@-connect-agent [options] (-h for help)"
-msgstr "Uso: gpg [opzioni] [files] (-h per l'aiuto)"
+msgstr "Utilizzo: @GPG@-connect-agent [opzioni] (-h per assistenza)"
 
 msgid ""
 "Syntax: @GPG@-connect-agent [options]\n"
 "Connect to a running agent and send commands\n"
 msgstr ""
+"Sintassi: @GPG@-connect-agent [opzioni]\n"
+"Connettersi a un agente in esecuzione e inviare comandi\n"
 
 #, c-format
 msgid "option \"%s\" requires a program and optional arguments\n"
-msgstr ""
+msgstr "l'opzione \"%s\" richiede un programma e argomenti facoltativi\n"
 
 #, c-format
 msgid "option \"%s\" ignored due to \"%s\"\n"
-msgstr ""
+msgstr "opzione \"%s\" ignorata a causa di \"%s\"\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "receiving line failed: %s\n"
-msgstr "cancellazione del keyblock fallita: %s\n"
+msgstr "linea di ricezione non riuscita: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "line too long - skipped\n"
-msgstr "riga troppo lunga\n"
+msgstr "linea troppo lunga - saltata\n"
 
 #, c-format
 msgid "line shortened due to embedded Nul character\n"
-msgstr ""
+msgstr "linea accorciata a causa del carattere Nul incorporato\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "unknown command '%s'\n"
-msgstr "destinatario predefinito `%s' sconosciuto\n"
+msgstr "comando sconosciuto '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "sending line failed: %s\n"
-msgstr "firma fallita: %s\n"
+msgstr "riga di invio non riuscita: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error sending standard options: %s\n"
-msgstr "errore leggendo `%s': %s\n"
+msgstr "errore durante l'invio delle opzioni standard: %s\n"
 
 msgid "Options controlling the diagnostic output"
-msgstr ""
+msgstr "Opzioni che controllano l'output diagnostico"
 
 msgid "Options controlling the configuration"
-msgstr ""
+msgstr "Opzioni che controllano la configurazione"
 
 msgid "Options useful for debugging"
-msgstr ""
+msgstr "Opzioni utili per il debug"
 
 msgid "Options controlling the security"
-msgstr ""
+msgstr "Opzioni che controllano la sicurezza"
 
 msgid "|N|expire SSH keys after N seconds"
-msgstr ""
+msgstr "|N|Chiavi SSH di N-scadenza dopo N secondi"
 
 msgid "|N|set maximum PIN cache lifetime to N seconds"
-msgstr ""
+msgstr "|N|imposta la durata massima della cache del PIN su N secondi"
 
 msgid "|N|set maximum SSH key lifetime to N seconds"
-msgstr ""
+msgstr "|N|set durata massima del tasto SSH su N secondi"
 
 msgid "Options enforcing a passphrase policy"
-msgstr ""
+msgstr "Opzioni che applicano un criterio di passphrase"
 
 msgid "do not allow bypassing the passphrase policy"
-msgstr ""
+msgstr "non consentire l'esclusione dei criteri di passphrase"
 
 msgid "|N|set minimal required length for new passphrases to N"
-msgstr ""
+msgstr "|N|Lunghezza minima richiesta per le nuove passphrase su N"
 
 msgid "|N|require at least N non-alpha characters for a new passphrase"
-msgstr ""
+msgstr "|N|Per una nuova passphrase è necessario almeno N caratteri non alfa"
 
 msgid "|FILE|check new passphrases against pattern in FILE"
-msgstr ""
+msgstr "|FILE||controlla le nuove passphrase rispetto al modello in FILE"
 
-#, fuzzy
 msgid "|N|expire the passphrase after N days"
-msgstr "|N|usa il modo N per la passphrase"
+msgstr "| La passphrase dopo N giorni"
 
-#, fuzzy
 msgid "do not allow the reuse of old passphrases"
-msgstr "errore nella creazione della passhprase: %s\n"
+msgstr "non consentono il riutilizzo di vecchie passphrase"
 
 msgid "|N|set the Pinentry timeout to N seconds"
-msgstr ""
+msgstr "|N|Il timeout di Pinentry è impostato su N secondi"
 
 msgid "|NAME|use NAME as default secret key"
-msgstr "|NOME|usa NOME come chiave segreta predefinita"
+msgstr "|NAME|usa NAME come chiave segreta predefinita"
 
-#, fuzzy
 msgid "|NAME|encrypt to user ID NAME as well"
-msgstr "|NOME|cifra per NOME"
+msgstr "Anche nome-crittografare all'ID utente NOME"
 
 msgid "|SPEC|set up email aliases"
-msgstr ""
+msgstr "|SPEC|configurare gli alias di posta elettronica"
 
 msgid "Configuration for Keyservers"
-msgstr ""
+msgstr "Configurazione per Keyservers"
 
-#, fuzzy
 msgid "|URL|use keyserver at URL"
-msgstr "impossibile fare il parsing dell'URI del keyserver\n"
+msgstr "| URL: utilizzare keyserver all'URL"
 
 msgid "allow PKA lookups (DNS requests)"
-msgstr ""
+msgstr "consentire ricerche PKA (richieste DNS)"
 
 msgid "|MECHANISMS|use MECHANISMS to locate keys by mail address"
 msgstr ""
+"|MECHANISMS|utilizzare MECHANISMS per individuare le chiavi in base "
+"all'indirizzo di posta elettronica"
 
-#, fuzzy
-#| msgid "import keys from a keyserver"
 msgid "import missing key from a signature"
-msgstr "importa le chiavi da un keyserver"
+msgstr "importare la chiave mancante da una firma"
 
-#, fuzzy
 msgid "include the public key in signatures"
-msgstr "controlla le firme delle chiavi"
+msgstr "includere la chiave pubblica nelle firme"
 
 msgid "disable all access to the dirmngr"
-msgstr ""
+msgstr "disabilitare tutti gli accessi al dirmngr"
 
-#, fuzzy
 msgid "|NAME|use encoding NAME for PKCS#12 passphrases"
-msgstr "|NOME|usa l'alg. di cifratura NOME per le passphrase"
+msgstr "Nome: utilizzare il nome di codifica per le passphrase PKCS-12"
 
 msgid "do not check CRLs for root certificates"
-msgstr ""
+msgstr "non controllare i certificati radice nei CRL"
 
 msgid "Options controlling the format of the output"
-msgstr ""
+msgstr "Opzioni che controllano il formato dell'output"
 
 msgid "Options controlling the interactivity and enforcement"
-msgstr ""
+msgstr "Opzioni che controllano l'interattività e l'applicazione"
 
 msgid "Options controlling the use of Tor"
-msgstr ""
+msgstr "Opzioni che controllano l'uso di Tor"
 
 msgid "Configuration for HTTP servers"
-msgstr ""
+msgstr "Configurazione per i server HTTP"
 
 msgid "use system's HTTP proxy setting"
-msgstr ""
+msgstr "utilizzare l'impostazione proxy HTTP del sistema"
 
 msgid "Configuration of LDAP servers to use"
-msgstr ""
+msgstr "Configurazione dei server LDAP da utilizzare"
 
 msgid "LDAP server list"
-msgstr ""
+msgstr "Elenco server LDAP"
 
 msgid "Configuration for OCSP"
-msgstr ""
+msgstr "Configurazione per OCSP"
 
 msgid "OpenPGP"
-msgstr ""
+msgstr "OpenPGP"
 
 msgid "Private Keys"
-msgstr ""
+msgstr "Chiavi private"
 
 msgid "Smartcards"
-msgstr ""
+msgstr "Smartcard"
 
 msgid "S/MIME"
-msgstr ""
+msgstr "S/MIME"
 
-#, fuzzy
-#| msgid "network error"
 msgid "Network"
-msgstr "errore di rete"
+msgstr "Rete"
 
-#, fuzzy
 msgid "Passphrase Entry"
-msgstr "passphrase errata"
+msgstr "Voce passphrase"
 
-#, fuzzy
 msgid "Component not suitable for launching"
-msgstr "chiave pubblica non trovata"
+msgstr "Componente non adatto per il lancio"
 
 #, c-format
 msgid "Configuration file of component %s is broken\n"
-msgstr ""
+msgstr "Il file di configurazione del componente %s è interrotto\n"
 
-#, fuzzy, c-format
-#| msgid "Please use the command \"toggle\" first.\n"
+#, c-format
 msgid "Note: Use the command \"%s%s\" to get details.\n"
-msgstr "Per favore usa prima il comando \"toggle\".\n"
+msgstr "Nota: utilizzare il comando \"%s%s\" per ottenere i dettagli.\n"
 
 #, c-format
 msgid "External verification of component %s failed"
-msgstr ""
+msgstr "Verifica esterna del componente %s non riuscita"
 
 msgid "Note that group specifications are ignored\n"
-msgstr ""
+msgstr "Si noti che le specifiche del gruppo vengono ignorate\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error closing '%s'\n"
-msgstr "errore leggendo `%s': %s\n"
+msgstr "errore durante la chiusura di '%s'\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error parsing '%s'\n"
-msgstr "errore leggendo `%s': %s\n"
+msgstr "errore durante l'analisi di '%s'\n"
 
 msgid "list all components"
-msgstr ""
+msgstr "elencare tutti i componenti"
 
 msgid "check all programs"
-msgstr ""
+msgstr "controllare tutti i programmi"
 
 msgid "|COMPONENT|list options"
-msgstr ""
+msgstr "|COMPONENT|opzioni di elenco"
 
 msgid "|COMPONENT|change options"
-msgstr ""
+msgstr "|COMPONENT|modifica delle opzioni"
 
 msgid "|COMPONENT|check options"
-msgstr ""
+msgstr "|COMPONENT|Opzioni di controllo"
 
 msgid "apply global default values"
-msgstr ""
+msgstr "applicare valori predefiniti globali"
 
 msgid "|FILE|update configuration files using FILE"
-msgstr ""
+msgstr "|FILE|aggiornare i file di configurazione utilizzando FILE"
 
 msgid "get the configuration directories for @GPGCONF@"
-msgstr ""
+msgstr "ottenere le directory di configurazione per @GPGCONF @"
 
-#, fuzzy
 msgid "list global configuration file"
-msgstr "elemento della configurazione sconosciuto \"%s\"\n"
+msgstr "file di configurazione globale dell'elenco"
 
-#, fuzzy
 msgid "check global configuration file"
-msgstr "elemento della configurazione sconosciuto \"%s\"\n"
+msgstr "controllare il file di configurazione globale"
 
-#, fuzzy
-#| msgid "update the trust database"
 msgid "query the software version database"
-msgstr "aggiorna il database della fiducia"
+msgstr "interrogare il database delle versioni software"
 
 msgid "reload all or a given component"
-msgstr ""
+msgstr "ricaricare tutto o un determinato componente"
 
 msgid "launch a given component"
-msgstr ""
+msgstr "lanciare un determinato componente"
 
 msgid "kill a given component"
-msgstr ""
+msgstr "uccidere un determinato componente"
 
 msgid "use as output file"
 msgstr "usa come file di output"
 
 msgid "activate changes at runtime, if possible"
-msgstr ""
+msgstr "attivare le modifiche in fase di esecuzione, se possibile"
 
-#, fuzzy
 msgid "Usage: @GPGCONF@ [options] (-h for help)"
-msgstr "Uso: gpg [opzioni] [files] (-h per l'aiuto)"
+msgstr "Utilizzo: @GPGCONF@ [opzioni] (-h per assistenza)"
 
 msgid ""
 "Syntax: @GPGCONF@ [options]\n"
 "Manage configuration options for tools of the @GNUPG@ system\n"
 msgstr ""
+"Sintassi: @GPGCONF@ [opzioni]\n"
+"Gestire le opzioni di configurazione per gli strumenti del @GNUPG@ sistema\n"
 
 msgid "Need one component argument"
-msgstr ""
+msgstr "È necessario un argomento componente"
 
-#, fuzzy
 msgid "Component not found"
-msgstr "chiave pubblica non trovata"
+msgstr "Componente non trovato"
 
-#, fuzzy
 msgid "No argument allowed"
-msgstr "scrittura della chiave segreta in `%s'\n"
+msgstr "Nessun argomento consentito"
 
-#, fuzzy
 msgid ""
 "@\n"
 "Commands:\n"
@@ -9145,2032 +8896,143 @@ msgstr ""
 "@Comandi:\n"
 " "
 
-#, fuzzy
 msgid "decryption modus"
-msgstr "decifratura corretta\n"
+msgstr "modus di decrittazione"
 
-#, fuzzy
 msgid "encryption modus"
-msgstr "decifratura corretta\n"
+msgstr "modus di crittografia"
 
 msgid "tool class (confucius)"
-msgstr ""
+msgstr "classe di utensili (confucio)"
 
-#, fuzzy
 msgid "program filename"
-msgstr "--store [nomefile]"
+msgstr "nome file del programma"
 
 msgid "secret key file (required)"
-msgstr ""
+msgstr "file di chiave segreta (obbligatorio)"
 
 msgid "input file name (default stdin)"
-msgstr ""
+msgstr "nome del file di input (stdin predefinito)"
 
-#, fuzzy
 msgid "Usage: symcryptrun [options] (-h for help)"
-msgstr "Uso: gpg [opzioni] [files] (-h per l'aiuto)"
+msgstr "Utilizzo: symcryptrun [opzioni] (-h per assistenza)"
 
 msgid ""
 "Syntax: symcryptrun --class CLASS --program PROGRAM --keyfile KEYFILE "
 "[options...] COMMAND [inputfile]\n"
 "Call a simple symmetric encryption tool\n"
 msgstr ""
+"Sintassi: symcryptrun --class CLASS --program PROGRAM --keyfile KEYFILE "
+"[opzioni...] COMANDO [file di input]\n"
+"Chiamare un semplice strumento di crittografia simmetrica\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "%s on %s aborted with status %i\n"
-msgstr "Non è permesso usare %s con %s!\n"
+msgstr "%s su %s interrotto con stato %i\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "%s on %s failed with status %i\n"
-msgstr "impossibile aprire il file: %s\n"
+msgstr "%s su %s non riuscito con stato %i\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "can't create temporary directory '%s': %s\n"
-msgstr "impossibile creare la directory `%s': %s\n"
+msgstr "impossibile creare la directory temporanea '%s': %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "could not open %s for writing: %s\n"
-msgstr "impossibile aprire `%s': %s\n"
+msgstr "impossibile aprire %s per la scrittura: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error writing to %s: %s\n"
-msgstr "errore scrivendo il portachiavi `%s': %s\n"
+msgstr "errore durante la scrittura in %s: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error reading from %s: %s\n"
-msgstr "errore leggendo `%s': %s\n"
+msgstr "errore durante la lettura da %s: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "error closing %s: %s\n"
-msgstr "errore leggendo `%s': %s\n"
+msgstr "errore durante la chiusura di %s: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "no --program option provided\n"
-msgstr "l'esecuzione remota dei programmi non è gestita\n"
+msgstr "no --opzione di programma fornita\n"
 
 #, c-format
 msgid "only --decrypt and --encrypt are supported\n"
-msgstr ""
+msgstr "solo --decrypt e --encrypt sono supportati\n"
 
 #, c-format
 msgid "no --keyfile option provided\n"
-msgstr ""
+msgstr "nessuna opzione --keyfile fornita\n"
 
 #, c-format
 msgid "cannot allocate args vector\n"
-msgstr ""
+msgstr "impossibile allocare il vettore args\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "could not create pipe: %s\n"
-msgstr "impossibile creare %s: %s\n"
+msgstr "impossibile creare la pipe: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "could not create pty: %s\n"
-msgstr "impossibile creare %s: %s\n"
+msgstr "impossibile creare pty: %s\n"
 
 #, c-format
 msgid "could not fork: %s\n"
-msgstr ""
+msgstr "non poteva dividere: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "execv failed: %s\n"
-msgstr "aggiornamento fallito: %s\n"
+msgstr "execv non riuscito: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "select failed: %s\n"
-msgstr "cancellazione del keyblock fallita: %s\n"
+msgstr "selezione non riuscita: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "read failed: %s\n"
-msgstr "aggiornamento fallito: %s\n"
+msgstr "lettura non riuscita: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "pty read failed: %s\n"
-msgstr "aggiornamento fallito: %s\n"
+msgstr "lettura pty non riuscita: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "waitpid failed: %s\n"
-msgstr "aggiornamento fallito: %s\n"
+msgstr "waitpid non riuscito: %s\n"
 
 #, c-format
 msgid "child aborted with status %i\n"
-msgstr ""
+msgstr "figlio interrotto con stato %i\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "cannot allocate infile string: %s\n"
-msgstr "impossibile creare `%s': %s\n"
+msgstr "impossibile allocare la stringa nel file: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "cannot allocate outfile string: %s\n"
-msgstr "impossibile creare `%s': %s\n"
+msgstr "non può allocare la stringa del file di uscita: %s\n"
 
 #, c-format
 msgid "either %s or %s must be given\n"
-msgstr ""
+msgstr "e' necessario specificare %s o %s\n"
 
 #, c-format
 msgid "no class provided\n"
-msgstr ""
+msgstr "nessuna classe fornita\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "class %s is not supported\n"
-msgstr "l'algoritmo di protezione %d%s non è gestito\n"
+msgstr "la classe %s non è supportata\n"
 
-#, fuzzy
 msgid "Usage: gpg-check-pattern [options] patternfile (-h for help)\n"
-msgstr "Uso: gpg [opzioni] [files] (-h per l'aiuto)"
+msgstr ""
+"Utilizzo: gpg-check-pattern [opzioni] patternfile (-h per assistenza)\n"
 
 msgid ""
 "Syntax: gpg-check-pattern [options] patternfile\n"
 "Check a passphrase given on stdin against the patternfile\n"
 msgstr ""
-
-#, fuzzy
-#~ msgid " using certificate ID 0x%08lX\n"
-#~ msgstr "errore nella creazione della passhprase: %s\n"
-
-#, fuzzy
-#~| msgid "you may not use %s while in %s mode\n"
-#~ msgid ""
-#~ "keyserver option \"honor-keyserver-url\" may not be used in Tor mode\n"
-#~ msgstr "non è possibile usare %s in modalità %s\n"
-
-#, fuzzy
-#~ msgid "male"
-#~ msgstr "abilita"
-
-#, fuzzy
-#~ msgid "female"
-#~ msgstr "abilita"
-
-#, fuzzy
-#~ msgid "unspecified"
-#~ msgstr "Nessuna ragione specificata"
-
-#, fuzzy
-#~ msgid "error creating 'ultimately_trusted_keys' TOFU table: %s\n"
-#~ msgstr "errore nella creazione della passhprase: %s\n"
-
-#, fuzzy
-#~ msgid "error creating 'encryptions' TOFU table: %s\n"
-#~ msgstr "errore leggendo `%s': %s\n"
-
-#, fuzzy
-#~ msgid "resetting keydb: %s\n"
-#~ msgstr "errore scrivendo il portachiavi `%s': %s\n"
-
-#, fuzzy
-#~ msgid "error setting TOFU binding's policy to %s\n"
-#~ msgstr "errore leggendo `%s': %s\n"
-
-#, fuzzy
-#~ msgid "%s: Verified %ld~signature in the past %s."
-#~ msgid_plural "%s: Verified %ld~signatures in the past %s."
-#~ msgstr[0] "|algo [files]|stampa tutti i message digests"
-#~ msgstr[1] "|algo [files]|stampa tutti i message digests"
-
-#, fuzzy
-#~ msgid "Encrypted %ld~message in the past %s."
-#~ msgid_plural "Encrypted %ld~messages in the past %s."
-#~ msgstr[0] "|algo [files]|stampa tutti i message digests"
-#~ msgstr[1] "|algo [files]|stampa tutti i message digests"
-
-#, fuzzy
-#~| msgid "error writing public keyring `%s': %s\n"
-#~ msgid "error setting policy for key %s, user id \"%s\": %s"
-#~ msgstr "errore scrivendo il portachiavi pubblico `%s': %s\n"
-
-#, fuzzy
-#~ msgid "error looking up: %s\n"
-#~ msgstr "errore leggendo `%s': %s\n"
-
-#, fuzzy
-#~| msgid "error creating keyring `%s': %s\n"
-#~ msgid "Warning: %s appears in the keyring %d times\n"
-#~ msgstr "errore creando il portachiavi `%s': %s\n"
-
-#, fuzzy
-#~ msgid "error retrieving '%s': http status %u\n"
-#~ msgstr "errore leggendo `%s': %s\n"
-
-#, fuzzy
-#~ msgid "npth_select failed: %s - waiting 1s\n"
-#~ msgstr "aggiornamento della chiave segreta fallito: %s\n"
-
-#, fuzzy
-#~ msgid "reading from ldap wrapper %d failed: %s\n"
-#~ msgstr "cancellazione del keyblock fallita: %s\n"
-
-#, fuzzy
-#~ msgid "What keysize do you want for the Signature key? (%u) "
-#~ msgstr "Di che dimensioni vuoi la chiave? (1024) "
-
-#, fuzzy
-#~ msgid "What keysize do you want for the Encryption key? (%u) "
-#~ msgstr "Di che dimensioni vuoi la chiave? (1024) "
-
-#, fuzzy
-#~ msgid "What keysize do you want for the Authentication key? (%u) "
-#~ msgstr "Di che dimensioni vuoi la chiave? (1024) "
-
-#, fuzzy
-#~ msgid "listen() failed: %s\n"
-#~ msgstr "aggiornamento fallito: %s\n"
-
-#, fuzzy
-#~| msgid "new configuration file `%s' created\n"
-#~ msgid "new configuration file '%s' created\n"
-#~ msgstr "creato un nuovo file di configurazione `%s'\n"
-
-#, fuzzy
-#~| msgid "WARNING: options in `%s' are not yet active during this run\n"
-#~ msgid "WARNING: options in '%s' are not yet active during this run\n"
-#~ msgstr ""
-#~ "ATTENZIONE: le opzioni in `%s' non sono ancora attive durante questa\n"
-#~ "esecuzione del programma\n"
-
-#, fuzzy
-#~| msgid "Key generation failed: %s\n"
-#~ msgid "User ID revocation failed: %s\n"
-#~ msgstr "Generazione della chiave fallita: %s\n"
-
-#, fuzzy
-#~ msgid "|A|Please enter the Admin PIN%%0A[remaining attempts: %d]"
-#~ msgstr "cambia la passphrase"
-
-#~ msgid "DSA requires the use of a 160 bit hash algorithm\n"
-#~ msgstr "DSA richiede l'uso di un algoritmo di hashing con almeno 160 bit\n"
-
-#~ msgid "--store [filename]"
-#~ msgstr "--store [nomefile]"
-
-#~ msgid "--symmetric [filename]"
-#~ msgstr "--symmetric [nomefile]"
-
-#~ msgid "--encrypt [filename]"
-#~ msgstr "--encrypt [nomefile]"
-
-#, fuzzy
-#~ msgid "--symmetric --encrypt [filename]"
-#~ msgstr "--sign --encrypt [nomefile]"
-
-#~ msgid "--sign [filename]"
-#~ msgstr "--sign [nomefile]"
-
-#~ msgid "--sign --encrypt [filename]"
-#~ msgstr "--sign --encrypt [nomefile]"
-
-#, fuzzy
-#~ msgid "--symmetric --sign --encrypt [filename]"
-#~ msgstr "--sign --encrypt [nomefile]"
-
-#~ msgid "--sign --symmetric [filename]"
-#~ msgstr "--sign --symmetric [nomefile]"
-
-#~ msgid "--clear-sign [filename]"
-#~ msgstr "--clear-sign [nomefile]"
-
-#~ msgid "--decrypt [filename]"
-#~ msgstr "--decrypt [nomefile]"
-
-#~ msgid "--sign-key user-id"
-#~ msgstr "--sign-key user-id"
-
-#~ msgid "--lsign-key user-id"
-#~ msgstr "--lsign-key user-id"
-
-#~ msgid "--edit-key user-id [commands]"
-#~ msgstr "--edit-key user-id [comandi]"
-
-#, fuzzy
-#~ msgid "--passwd <user-id>"
-#~ msgstr "--sign-key user-id"
-
-#~ msgid "[filename]"
-#~ msgstr "[nomefile]"
-
-#, fuzzy
-#~ msgid "shadowing the key failed: %s\n"
-#~ msgstr "cancellazione del keyblock fallita: %s\n"
-
-#, fuzzy
-#~ msgid "available TOFU policies:\n"
-#~ msgstr "disabilita una chiave"
-
-#, fuzzy
-#~ msgid "%ld message signed"
-#~ msgid_plural "%ld messages signed"
-#~ msgstr[0] "|algo [files]|stampa tutti i message digests"
-#~ msgstr[1] "|algo [files]|stampa tutti i message digests"
-
-#~ msgid "communication problem with gpg-agent\n"
-#~ msgstr "problema di comunicazione con gpg-agent\n"
-
-#, fuzzy
-#~ msgid "canceled by user\n"
-#~ msgstr "interrotto dall'utente\n"
-
-#, fuzzy
-#~ msgid "problem with the agent\n"
-#~ msgstr "problema con l'agent: ha restituito 0x%lx\n"
-
-#, fuzzy
-#~ msgid "problem with the agent (unexpected response \"%s\")\n"
-#~ msgstr "problema con l'agent: ha restituito 0x%lx\n"
-
-#, fuzzy
-#~ msgid "unknown TOFU DB format '%s'\n"
-#~ msgstr "destinatario predefinito `%s' sconosciuto\n"
-
-#, fuzzy
-#~ msgid ""
-#~ "Please enter the passphrase to unlock the secret key for the OpenPGP "
-#~ "certificate:\n"
-#~ "\"%.*s\"\n"
-#~ "%u-bit %s key, ID %s,\n"
-#~ "created %s%s.\n"
-#~ msgstr ""
-#~ "Ti serve una passphrase per sbloccare la chiave segreta dell'utente:\n"
-#~ "\"%.*s\"\n"
-#~ "%u-bit %s key, ID %08lX, created %s%s\n"
-
-#, fuzzy
-#~ msgid ""
-#~ "You need a passphrase to unlock the secret key for\n"
-#~ "user: \"%s\"\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Ti serve una passphrase per sbloccare la chiave segreta\n"
-#~ "dell'utente: \""
-
-#, fuzzy
-#~ msgid "%u-bit %s key, ID %s, created %s"
-#~ msgstr "chiave %2$s di %1$u bit, ID %3$08lX, creata il %4$s"
-
-#, fuzzy
-#~| msgid "can't create directory `%s': %s\n"
-#~ msgid "can't access directory '%s': %s\n"
-#~ msgstr "impossibile creare la directory `%s': %s\n"
-
-#~ msgid "you found a bug ... (%s:%d)\n"
-#~ msgstr "hai trovato un bug... (%s:%d)\n"
-
-#, fuzzy
-#~| msgid "%d user IDs without valid self-signatures detected\n"
-#~ msgid "%d user ID without valid self-signature detected\n"
-#~ msgid_plural "%d user IDs without valid self-signatures detected\n"
-#~ msgstr[0] "Trovati %d user ID senza autofirme valide\n"
-#~ msgstr[1] "Trovati %d user ID senza autofirme valide\n"
-
-#~ msgid "moving a key signature to the correct place\n"
-#~ msgstr "spostamento della firma di una chiave nel posto corretto\n"
-
-#~ msgid "%d signatures not checked due to missing keys\n"
-#~ msgstr "%d firme non controllate per mancanza delle chiavi\n"
-
-#~ msgid "%d signatures not checked due to errors\n"
-#~ msgstr "%d firme non controllate a causa di errori\n"
-
-#~ msgid "1 user ID without valid self-signature detected\n"
-#~ msgstr "Trovato un user ID senza autofirma valida\n"
-
-#, fuzzy
-#~ msgid "User ID \"%s\": %d signatures removed\n"
-#~ msgstr "L'user ID \"%s\" è stato revocato."
-
-#~ msgid ""
-#~ "You need a Passphrase to protect your secret key.\n"
-#~ "\n"
-#~ msgstr ""
-#~ "Ti serve una passphrase per proteggere la tua chiave segreta.\n"
-#~ "\n"
-
-#, fuzzy
-#~ msgid ""
-#~ "Please enter a passphrase to protect the off-card backup of the new "
-#~ "encryption key."
-#~ msgstr "Inserisci la passphrase, cioè una frase segreta \n"
-
-#~ msgid "passphrase not correctly repeated; try again"
-#~ msgstr "passphrase non ripetuta correttamente; prova ancora"
-
-#~ msgid "%s.\n"
-#~ msgstr "%s.\n"
-
-#~ 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 \"--edit-key\".\n"
-#~ "\n"
-#~ msgstr ""
-#~ "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"
-
-#, fuzzy
-#~ msgid "storing key onto card failed: %s\n"
-#~ msgstr "cancellazione del keyblock fallita: %s\n"
-
-#, fuzzy
-#~| msgid "1 bad signature\n"
-#~ msgid "1 good signature\n"
-#~ msgstr "una firma non corretta\n"
-
-#, fuzzy
-#~ msgid "%lu keys cached (%lu signatures)\n"
-#~ msgstr "Sono state controllate %lu chiavi (%lu firme)\n"
-
-#, fuzzy
-#~ msgid "refreshing 1 key from %s\n"
-#~ msgstr "richiedo la chiave %08lX a %s\n"
-
-#, fuzzy
-#~ msgid "sending key %s to %s server %s\n"
-#~ msgstr "cerco \"%s\" sul server HKP %s\n"
-
-#, fuzzy
-#~ msgid "public key %s is %lu seconds newer than the signature\n"
-#~ msgstr "la chiave pubblica %08lX è più recente della firma di %lu secondi\n"
-
-#, fuzzy
-#~ msgid ""
-#~ "key %s was created %lu seconds in the future (time warp or clock "
-#~ "problem)\n"
-#~ msgstr ""
-#~ "la chiave è stata creata %lu secondi nel futuro (salto nel tempo o "
-#~ "problema\n"
-#~ "con l'orologio)\n"
-
-#, fuzzy
-#~| msgid "can't open the keyring"
-#~ msgid "Failed to open the keyring DB.\n"
-#~ msgstr "impossibile aprire il portachiavi"
-
-#, fuzzy
-#~ msgid "Failed to parse '%s'.\n"
-#~ msgstr "impossibile aprire `%s': %s\n"
-
-#, fuzzy
-#~ msgid "error looking up secret key \"%s\": %s\n"
-#~ msgstr "errore leggendo il keyblock segreto `%s': %s\n"
-
-#, fuzzy
-#~ msgid "Please select at most one subkey.\n"
-#~ msgstr "Seleziona al massimo una chiave secondaria.\n"
-
-#, fuzzy
-#~ msgid "malformed %s environment variable\n"
-#~ msgstr "variabile di ambiente GPG_AGENT_INFO malformata\n"
-
-#, fuzzy
-#~ msgid "dirmngr protocol version %d is not supported\n"
-#~ msgstr "la versione %d del protocollo di gpg-agent non è gestita\n"
-
-#, fuzzy
-#~ msgid "toggle between the secret and public key listings"
-#~ msgstr "cambia tra visualizzare la chiave segreta e la chiave pubblica"
-
-#, fuzzy
-#~ msgid "Passphrase"
-#~ msgstr "passphrase errata"
-
-#, fuzzy
-#~ msgid "WARNING: keyserver option '%s' is not used on this platform\n"
-#~ msgstr ""
-#~ "ATTENZIONE: le opzioni in `%s' non sono ancora attive durante questa\n"
-#~ "esecuzione del programma\n"
-
-#~ msgid "gpg-agent is not available in this session\n"
-#~ msgstr "gpg-agent non è disponibile in questa sessione\n"
-
-#, fuzzy
-#~ msgid "use a standard location for the socket"
-#~ msgstr "Aggiorno davvero le preferenze per gli user ID selezionati? "
-
-#, fuzzy
-#~ msgid "Usage: gpg-agent [options] (-h for help)"
-#~ msgstr "Uso: gpg [opzioni] [files] (-h per l'aiuto)"
-
-#~ msgid "malformed GPG_AGENT_INFO environment variable\n"
-#~ msgstr "variabile di ambiente GPG_AGENT_INFO malformata\n"
-
-#~ msgid "gpg-agent protocol version %d is not supported\n"
-#~ msgstr "la versione %d del protocollo di gpg-agent non è gestita\n"
-
-#, fuzzy
-#~ msgid "can't fdopen pipe for reading: %s\n"
-#~ msgstr "impossibile aprire il file: %s\n"
-
-#, fuzzy
-#~ msgid "error creating socket: %s\n"
-#~ msgstr "errore creando `%s': %s\n"
-
-#, fuzzy
-#~ msgid "host not found"
-#~ msgstr "[User ID non trovato]"
-
-#, fuzzy
-#~ msgid "unknown key protection algorithm\n"
-#~ msgstr "algoritmo di protezione sconosciuto\n"
-
-#, fuzzy
-#~ msgid "secret parts of key are not available\n"
-#~ msgstr "Parti della chiave segreta non sono disponibili.\n"
-
-#, fuzzy
-#~ msgid "secret key already stored on a card\n"
-#~ msgstr "saltata: chiave pubblica già presente\n"
-
-#, fuzzy
-#~ msgid "error writing key to card: %s\n"
-#~ msgstr "errore scrivendo il portachiavi `%s': %s\n"
-
-#~ msgid ""
-#~ "you can only encrypt to RSA keys of 2048 bits or less in --pgp2 mode\n"
-#~ msgstr ""
-#~ "in modalità --pgp2 puoi cifrare solo per chiavi RSA non più lunghe di "
-#~ "2048 bit\n"
-
-#~ msgid ""
-#~ "unable to use the IDEA cipher for all of the keys you are encrypting to.\n"
-#~ msgstr ""
-#~ "impossibile usare il cifrario IDEA con tutti i tipi di chiavi per cui\n"
-#~ "stai cifrando.\n"
-
-#, fuzzy
-#~ msgid "remove the passphrase from exported subkeys"
-#~ msgstr "revoca una chiave secondaria"
-
-#, fuzzy
-#~ msgid "key %s: not protected - skipped\n"
-#~ msgstr "chiave %08lX: non protetta - saltata\n"
-
-#, fuzzy
-#~ msgid "failed to unprotect the subkey: %s\n"
-#~ msgstr "inizializzazione del trustdb fallita: %s\n"
-
-#, fuzzy
-#~ msgid "WARNING: secret key %s does not have a simple SK checksum\n"
-#~ msgstr ""
-#~ "ATTENZIONE: la chiave segreta %08lX non ha un checksum SK semplice\n"
-
-#~ msgid "too many entries in pk cache - disabled\n"
-#~ msgstr "troppe voci nella pk cache - disabilitata\n"
-
-#, fuzzy
-#~ msgid "no secret subkey for public subkey %s - ignoring\n"
-#~ msgstr ""
-#~ "manca una subchiave segreta per la subchiave pubblica %08lX - ignorata\n"
-
-#, fuzzy
-#~ msgid "key %s: secret key without public key - skipped\n"
-#~ msgstr "chiave %08lX: chiave segreta senza chiave pubblica - saltata\n"
-
-#~ msgid "usage: gpg [options] "
-#~ msgstr "uso: gpg [opzioni] "
-
-#~ msgid ""
-#~ "you can only make detached or clear signatures while in --pgp2 mode\n"
-#~ msgstr "nella modalità --pgp2 puoi fare solo firme in chiaro o separate\n"
-
-#~ msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n"
-#~ msgstr ""
-#~ "nella modalità --pgp2 non puoi firmare e cifrare contemporaneamente\n"
-
-#~ msgid ""
-#~ "you must use files (and not a pipe) when working with --pgp2 enabled.\n"
-#~ msgstr ""
-#~ "devi usare dei file (e non una pipe) quando lavori con --pgp2 attivo.\n"
-
-#~ msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n"
-#~ msgstr ""
-#~ "nella modalità --pgp2 è richiesto il cifrario IDEA per cifrare un "
-#~ "messaggio\n"
-
-#, fuzzy
-#~ msgid "create a public key when importing a secret key"
-#~ msgstr "la chiave pubblica non corrisponde alla chiave segreta!\n"
-
-#, fuzzy
-#~ msgid "key %s: already in secret keyring\n"
-#~ msgstr "chiave %08lX: già nel portachiavi segreto\n"
-
-#, fuzzy
-#~ msgid "key %s: secret key not found: %s\n"
-#~ msgstr "chiave %08lX: chiave segreta non trovata: %s\n"
-
-#, fuzzy
-#~ msgid "NOTE: a key's S/N does not match the card's one\n"
-#~ msgstr "la chiave pubblica non corrisponde alla chiave segreta!\n"
-
-#, fuzzy
-#~ msgid "NOTE: primary key is online and stored on card\n"
-#~ msgstr "saltata: chiave pubblica già presente\n"
-
-#, fuzzy
-#~ msgid "NOTE: secondary key is online and stored on card\n"
-#~ msgstr "saltata: chiave pubblica già presente\n"
-
-#~ msgid ""
-#~ "You may not make an OpenPGP signature on a PGP 2.x key while in --pgp2 "
-#~ "mode.\n"
-#~ msgstr ""
-#~ "In modalità -pgp2 non è possibile fare firme OpenPGP su chiavi in stile "
-#~ "PGP 2.x.\n"
-
-#~ msgid "This would make the key unusable in PGP 2.x.\n"
-#~ msgstr "Questo renderebbe la chiave non utilizzabile da PGP 2.x.\n"
-
-#~ msgid "This key is not protected.\n"
-#~ msgstr "Questa chiave non è protetta.\n"
-
-#~ msgid "Key is protected.\n"
-#~ msgstr "La chiave è protetta.\n"
-
-#~ msgid "Can't edit this key: %s\n"
-#~ msgstr "Impossibile modificare questa chiave: %s\n"
-
-#~ msgid ""
-#~ "Enter the new passphrase for this secret key.\n"
-#~ "\n"
-#~ msgstr ""
-#~ "Inserisci la nuova passphrase per questa chiave segreta.\n"
-#~ "\n"
-
-#~ 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"
-
-#, fuzzy
-#~ msgid "Do you really want to do this? (y/N) "
-#~ msgstr "Vuoi veramente farlo?"
-
-#~ msgid "Please remove selections from the secret keys.\n"
-#~ msgstr "Togli le selezioni dalle chiavi segrete.\n"
-
-#~ msgid "No corresponding signature in secret ring\n"
-#~ msgstr "Manca la firma corrispondente nel portachiavi segreto\n"
-
-#, fuzzy
-#~ msgid "writing secret key stub to `%s'\n"
-#~ msgstr "scrittura della chiave segreta in `%s'\n"
-
-#~ msgid "writing secret key to `%s'\n"
-#~ msgstr "scrittura della chiave segreta in `%s'\n"
-
-#~ msgid "no writable secret keyring found: %s\n"
-#~ msgstr "non è stato trovato un portachiavi segreto scrivibile: %s\n"
-
-#~ msgid "WARNING: 2 files with confidential information exists.\n"
-#~ msgstr "ATTENZIONE: esistono due file con informazioni confidenziali.\n"
-
-#~ msgid "%s is the unchanged one\n"
-#~ msgstr "%s è quello non modificato\n"
-
-#~ msgid "%s is the new one\n"
-#~ msgstr "%s è quello nuovo\n"
-
-#~ msgid "Please fix this possible security flaw\n"
-#~ msgstr "Per favore risolvete questo possibile problema di sicurezza\n"
-
-#, fuzzy
-#~ msgid "searching for names from %s server %s\n"
-#~ msgstr "cerco \"%s\" sul server HKP %s\n"
-
-#, fuzzy
-#~ msgid "searching for names from %s\n"
-#~ msgstr "cerco \"%s\" sul server HKP %s\n"
-
-#, fuzzy
-#~ msgid "searching for \"%s\" from %s server %s\n"
-#~ msgstr "cerco \"%s\" sul server HKP %s\n"
-
-#, fuzzy
-#~ msgid "searching for \"%s\" from %s\n"
-#~ msgstr "cerco \"%s\" sul server HKP %s\n"
-
-#, fuzzy
-#~ msgid "keyserver timed out\n"
-#~ msgstr "errore del keyserver"
-
-#, fuzzy
-#~ msgid "keyserver internal error\n"
-#~ msgstr "errore del keyserver"
-
-#, fuzzy
-#~ msgid "keyserver communications error: %s\n"
-#~ msgstr "ricezione dal keyserver fallita: %s\n"
-
-#, fuzzy
-#~ msgid "WARNING: unable to parse URI %s\n"
-#~ msgstr ""
-#~ "ATTENZIONE: impossibile cancellare il file temporaneo (%s) `%s': %s\n"
-
-#~ msgid "invalid root packet detected in proc_tree()\n"
-#~ msgstr "individuato un pacchetto radice non valido in proc_tree()\n"
-
-#~ msgid "the IDEA cipher plugin is not present\n"
-#~ msgstr "il plugin per il cifrario IDEA non è presente\n"
-
-#~ msgid "no corresponding public key: %s\n"
-#~ msgstr "non c'è una chiave pubblica corrispondente: %s\n"
-
-#~ msgid "public key does not match secret key!\n"
-#~ msgstr "la chiave pubblica non corrisponde alla chiave segreta!\n"
-
-#~ msgid "unknown protection algorithm\n"
-#~ msgstr "algoritmo di protezione sconosciuto\n"
-
-#~ msgid "NOTE: This key is not protected!\n"
-#~ msgstr "NOTA: Questa chiave non è protetta!\n"
-
-#, fuzzy
-#~ msgid "protection digest %d is not supported\n"
-#~ msgstr "l'algoritmo di protezione %d%s non è gestito\n"
-
-#~ msgid "Invalid passphrase; please try again"
-#~ msgstr "Passphrase non valida; riprova"
-
-#~ msgid "%s ...\n"
-#~ msgstr "%s ...\n"
-
-#~ msgid "WARNING: Weak key detected - please change passphrase again.\n"
-#~ msgstr ""
-#~ "ATTENZIONE: Individuata una chiave debole - per favore cambia ancora la\n"
-#~ "passphrase.\n"
-
-#~ msgid ""
-#~ "generating the deprecated 16-bit checksum for secret key protection\n"
-#~ msgstr ""
-#~ "genero il checksum a 16 bit deprecato per la protezione della chiave "
-#~ "segreta\n"
-
-#~ msgid ""
-#~ "you can only detach-sign with PGP 2.x style keys while in --pgp2 mode\n"
-#~ msgstr ""
-#~ "nella modalità --pgp2 puoi fare firme separate solo con chiavi in stile "
-#~ "PGP 2.x\n"
-
-#~ msgid ""
-#~ "you can only clearsign with PGP 2.x style keys while in --pgp2 mode\n"
-#~ msgstr ""
-#~ "In modalità -pgp2 puoi firmare in chiaro solo con chiavi in stile PGP 2."
-#~ "x\n"
-
-#, fuzzy
-#~ msgid "Usage: scdaemon [options] (-h for help)"
-#~ msgstr "Uso: gpg [opzioni] [files] (-h per l'aiuto)"
-
-#, fuzzy
-#~ msgid "Usage: gpgsm [options] [files] (-h for help)"
-#~ msgstr "Uso: gpg [opzioni] [files] (-h per l'aiuto)"
-
-#, fuzzy
-#~ msgid "usage: gpgconf [options] "
-#~ msgstr "uso: gpg [opzioni] "
-
-#, fuzzy
-#~ msgid "failed to allocated keyDB handle\n"
-#~ msgstr "inizializzazione del trustdb fallita: %s\n"
-
-#~ msgid "Command> "
-#~ msgstr "Comando> "
-
-#~ msgid "the trustdb is corrupted; please run \"gpg --fix-trustdb\".\n"
-#~ msgstr "Il trustdb è danneggiato; eseguire \"gpg --fix-trust-db\".\n"
-
-#~ msgid "Please report bugs to <gnupg-bugs@gnu.org>.\n"
-#~ msgstr "Per favore segnala i bug a <gnupg-bugs@gnu.org>.\n"
-
-#, fuzzy
-#~ msgid "Please report bugs to "
-#~ msgstr "Per favore segnala i bug a <gnupg-bugs@gnu.org>.\n"
-
-#, fuzzy
-#~ msgid "DSA keypair will have %u bits.\n"
-#~ msgstr "La coppia DSA avrà 1024 bit.\n"
-
-#~ msgid "Repeat passphrase\n"
-#~ msgstr "Ripeti la passphrase\n"
-
-#, fuzzy
-#~ msgid "read options from file"
-#~ msgstr "lettura delle opzioni da `%s'\n"
-
-#~ msgid "|[file]|make a signature"
-#~ msgstr "|[file]|fai una firma"
-
-#, fuzzy
-#~ msgid "|[FILE]|make a signature"
-#~ msgstr "|[file]|fai una firma"
-
-#, fuzzy
-#~ msgid "|[FILE]|make a clear text signature"
-#~ msgstr "|[file]|fai una firma mantenendo il testo in chiaro"
-
-#~ msgid "use the default key as default recipient"
-#~ msgstr "usa la chiave predefinita come destinatario predefinito"
-
-#~ msgid "force v3 signatures"
-#~ msgstr "forza l'uso di firme v3"
-
-#~ msgid "always use a MDC for encryption"
-#~ msgstr "usa sempre un MDC per cifrare"
-
-#~ msgid "add this secret keyring to the list"
-#~ msgstr "aggiungi questo portachiavi segreto alla lista"
-
-#~ msgid "|FILE|load extension module FILE"
-#~ msgstr "|FILE|carica il modulo di estensione FILE"
-
-#~ msgid "|N|use compress algorithm N"
-#~ msgstr "|N|usa l'algoritmo di compressione N"
-
-#, fuzzy
-#~ msgid "remove key from the public keyring"
-#~ msgstr "rimuove le chiavi dal portachiavi pubblico"
-
-#~ 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."
-#~ msgstr ""
-#~ "E compito tuo assegnare un valore; questo valore non sarà mai esportato "
-#~ "a\n"
-#~ "terzi. Ci serve per implementare il web-of-trust; non ha nulla a che "
-#~ "fare\n"
-#~ "con il web-of-certificates (creato implicitamente)."
-
-#~ msgid ""
-#~ "To build the Web-of-Trust, GnuPG needs to know which keys are\n"
-#~ "ultimately trusted - those are usually the keys for which you have\n"
-#~ "access to the secret key.  Answer \"yes\" to set this key to\n"
-#~ "ultimately trusted\n"
-#~ msgstr ""
-#~ "Per costruire il Web-Of-Trust, GnuPG ha bisogno di sapere quali chiavi "
-#~ "sono\n"
-#~ "definitivamente affidabili - di solito quelle per cui hai accesso alla "
-#~ "chiave\n"
-#~ "segreta.\n"
-#~ "Rispondi \"sì\" per impostare questa chiave come definitivamente "
-#~ "affidabile\n"
-
-#~ msgid "If you want to use this untrusted key anyway, answer \"yes\"."
-#~ msgstr "Se vuoi usare comunque questa chiave non fidata, rispondi \"si\"."
-
-#~ msgid ""
-#~ "Enter the user ID of the addressee to whom you want to send the message."
-#~ msgstr ""
-#~ "Inserisci l'user ID del destinatario a cui vuoi mandare il messaggio."
-
-#~ msgid ""
-#~ "In general it is not a good idea to use the same key for signing and\n"
-#~ "encryption.  This algorithm should only be used in certain domains.\n"
-#~ "Please consult your security expert first."
-#~ msgstr ""
-#~ "In generale non è una buona idea usare la stessa chiave per le firme e "
-#~ "la\n"
-#~ "cifratura. Questo algoritmo dovrebbe solo essere usato in determinati "
-#~ "campi.\n"
-#~ "Per favore consulta prima il tuo esperto di sicurezza."
-
-#~ msgid "Enter the size of the key"
-#~ msgstr "Inserisci le dimensioni della chiave"
-
-#~ msgid "Answer \"yes\" or \"no\""
-#~ msgstr "Rispondi \"si\" o \"no\""
-
-#~ msgid ""
-#~ "Enter the required value as shown in the prompt.\n"
-#~ "It is possible to enter a ISO date (YYYY-MM-DD) but you won't\n"
-#~ "get a good error response - instead the system tries to interpret\n"
-#~ "the given value as an interval."
-#~ msgstr ""
-#~ "Inserisci il valore richiesto come indicato dal prompt.\n"
-#~ "È possibile inserire una data in formato ISO (YYYY-MM-DD) ma non avrai "
-#~ "un\n"
-#~ "messaggio di errore corretto: il sistema cerca di interpretare il valore\n"
-#~ "dato come un intervallo."
-
-#~ msgid "Enter the name of the key holder"
-#~ msgstr "Inserisci il nome del proprietario della chiave"
-
-#~ msgid "please enter an optional but highly suggested email address"
-#~ msgstr "Inserisci un indirizzo di email opzionale (ma fortemente suggerito)"
-
-#~ msgid "Please enter an optional comment"
-#~ msgstr "Inserisci un commento opzionale"
-
-#~ msgid ""
-#~ "N  to change the name.\n"
-#~ "C  to change the comment.\n"
-#~ "E  to change the email address.\n"
-#~ "O  to continue with key generation.\n"
-#~ "Q  to to quit the key generation."
-#~ msgstr ""
-#~ "N  per cambiare il nome.\n"
-#~ "C  per cambiare il commento.\n"
-#~ "E  per cambiare l'indirizzo di email.\n"
-#~ "O  per continuare con la generazione della chiave.\n"
-#~ "Q  per abbandonare il processo di generazione della chiave."
-
-#~ msgid ""
-#~ "Answer \"yes\" (or just \"y\") if it is okay to generate the sub key."
-#~ msgstr "Rispondi \"si\" (o \"y\") se va bene generare la subchiave."
-
-#~ msgid ""
-#~ "When you sign a user ID on a key, you should first verify that the key\n"
-#~ "belongs to the person named in the user ID.  It is useful for others to\n"
-#~ "know how carefully you verified this.\n"
-#~ "\n"
-#~ "\"0\" means you make no particular claim as to how carefully you verified "
-#~ "the\n"
-#~ "    key.\n"
-#~ "\n"
-#~ "\"1\" means you believe the key is owned by the person who claims to own "
-#~ "it\n"
-#~ "    but you could not, or did not verify the key at all.  This is useful "
-#~ "for\n"
-#~ "    a \"persona\" verification, where you sign the key of a pseudonymous "
-#~ "user.\n"
-#~ "\n"
-#~ "\"2\" means you did casual verification of the key.  For example, this "
-#~ "could\n"
-#~ "    mean that you verified the key fingerprint and checked the user ID on "
-#~ "the\n"
-#~ "    key against a photo ID.\n"
-#~ "\n"
-#~ "\"3\" means you did extensive verification of the key.  For example, this "
-#~ "could\n"
-#~ "    mean that you verified the key fingerprint with the owner of the key "
-#~ "in\n"
-#~ "    person, and that you checked, by means of a hard to forge document "
-#~ "with a\n"
-#~ "    photo ID (such as a passport) that the name of the key owner matches "
-#~ "the\n"
-#~ "    name in the user ID on the key, and finally that you verified (by "
-#~ "exchange\n"
-#~ "    of email) that the email address on the key belongs to the key "
-#~ "owner.\n"
-#~ "\n"
-#~ "Note that the examples given above for levels 2 and 3 are *only* "
-#~ "examples.\n"
-#~ "In the end, it is up to you to decide just what \"casual\" and \"extensive"
-#~ "\"\n"
-#~ "mean to you when you sign other keys.\n"
-#~ "\n"
-#~ "If you don't know what the right answer is, answer \"0\"."
-#~ msgstr ""
-#~ "Quando firmi l'user ID di una chiave dovresti prima verificare che "
-#~ "questa\n"
-#~ "appartiene alla persona indicata nell'user ID. È utile agli altri sapere\n"
-#~ "con quanta attenzione lo hai verificato.\n"
-#~ "\n"
-#~ "\"0\" significa che non fai particolari affermazioni sull'attenzione con "
-#~ "cui\n"
-#~ "    hai ferificato la chiave.\n"
-#~ "\n"
-#~ "\"1\" significa che credi che la chiave sia posseduta dalla persona che "
-#~ "dice di\n"
-#~ "    possederla, ma non hai o non hai potuto verificare per niente la "
-#~ "chiave.\n"
-#~ "\n"
-#~ "\"2\" significa che hai fatto una verifica superficiale della chiave. Per "
-#~ "esempio\n"
-#~ "    potrebbe significare che hai verificato l'impronta digitale e "
-#~ "confrontato\n"
-#~ "    l'user ID della chiave con un documento di identità con fotografia.\n"
-#~ "\n"
-#~ "\"3\" significa che hai fatto una verifica approfondita della chiave. Per "
-#~ "esempio\n"
-#~ "    potrebbe significare che hai verificato di persona l'impronta "
-#~ "digitale con\n"
-#~ "    il possessore della chiave e hai controllato, per esempio per mezzo "
-#~ "di\n"
-#~ "    un documento di identità con fotografia difficile da falsificare "
-#~ "(come\n"
-#~ "    un passaporto), che il nome del proprietario della chiave corrisponde "
-#~ "a\n"
-#~ "    quello nell'user ID della chiave, e per finire che hai verificato\n"
-#~ "    (scambiando dei messaggi) che l'indirizzo di email sulla chiave "
-#~ "appartiene\n"
-#~ "    al proprietario.\n"
-#~ "\n"
-#~ "Nota che gli esempi indicati per i livelli 2 e 3 sono *solo* esempi. Alla "
-#~ "fine\n"
-#~ "sta a te decidere cosa significano \"superficiale\" e \"approfondita\" "
-#~ "quando\n"
-#~ "firmi chiavi di altri.\n"
-#~ "\n"
-#~ "Se non sai cosa rispondere, rispondi \"0\"."
-
-#, fuzzy
-#~ msgid "Answer \"yes\" if you want to sign ALL the user IDs"
-#~ msgstr "Rispondi \"si\" se vuoi firmare TUTTI gli user ID"
-
-#~ msgid ""
-#~ "Answer \"yes\" if you really want to delete this user ID.\n"
-#~ "All certificates are then also lost!"
-#~ msgstr ""
-#~ "Rispondi \"si\" se vuoi davvero cancellare questo user ID.\n"
-#~ "Tutti i certificati saranno persi!"
-
-#~ msgid "Answer \"yes\" if it is okay to delete the subkey"
-#~ msgstr "Rispondi \"si\" se va bene cancellare la subchiave"
-
-#~ msgid ""
-#~ "This is a valid signature on the key; you normally don't want\n"
-#~ "to delete this signature because it may be important to establish a\n"
-#~ "trust connection to the key or another key certified by this key."
-#~ msgstr ""
-#~ "Questa è una firma valida per la chiave. Normalmente non vorresti "
-#~ "cancellare\n"
-#~ "questa firma perchè può essere importante per stabilire una connessione "
-#~ "di\n"
-#~ "fiducia alla chiave o a un'altra chiave certificata da questa chiave."
-
-#~ msgid ""
-#~ "This signature can't be checked because you don't have the\n"
-#~ "corresponding key.  You should postpone its deletion until you\n"
-#~ "know which key was used because this signing key might establish\n"
-#~ "a trust connection through another already certified key."
-#~ msgstr ""
-#~ "Questa firma non può essere verificata perchè non hai la chiave "
-#~ "corrispondente.\n"
-#~ "Dovresti rimandare la sua cancellazione finchè non saprai quale chiave è "
-#~ "stata\n"
-#~ "usata perchè questa chiave potrebbe stabilire una connessione di fiducia\n"
-#~ "attraverso una chiave già certificata."
-
-#~ msgid ""
-#~ "The signature is not valid.  It does make sense to remove it from\n"
-#~ "your keyring."
-#~ msgstr "La firma non è valida. Ha senso rimuoverla dal tuo portachiavi."
-
-#~ msgid ""
-#~ "This is a signature which binds the user ID to the key. It is\n"
-#~ "usually not a good idea to remove such a signature.  Actually\n"
-#~ "GnuPG might not be able to use this key anymore.  So do this\n"
-#~ "only if this self-signature is for some reason not valid and\n"
-#~ "a second one is available."
-#~ msgstr ""
-#~ "Questa è una firma che collega l'user id alla chiave. Solitamente non è "
-#~ "una\n"
-#~ "buona idea rimuovere questo tipo di firma. In realtà GnuPG potrebbe non "
-#~ "essere\n"
-#~ "più in grado di usare questa chiave. Quindi fallo solo se questa "
-#~ "autofirma non\n"
-#~ "è valida per qualche ragione e ne è disponibile un'altra."
-
-#~ msgid ""
-#~ "Change the preferences of all user IDs (or just of the selected ones)\n"
-#~ "to the current list of preferences.  The timestamp of all affected\n"
-#~ "self-signatures will be advanced by one second.\n"
-#~ msgstr ""
-#~ "Cambia le preferenze di tutti gli user ID (o solo di quelli selezionati) "
-#~ "con\n"
-#~ "la lista di preferenze corrente. L'orario di tutte le autofirme "
-#~ "coinvolte\n"
-#~ "sarà aumentato di un secondo.\n"
-
-#~ msgid "Please enter the passphrase; this is a secret sentence \n"
-#~ msgstr "Inserisci la passphrase, cioè una frase segreta \n"
-
-#~ msgid ""
-#~ "Please repeat the last passphrase, so you are sure what you typed in."
-#~ msgstr "Ripeti l'ultima passphrase per essere sicuro di cosa hai scritto."
-
-#~ msgid "Give the name of the file to which the signature applies"
-#~ msgstr "Inserisci il nome del file a cui si riferisce la firma."
-
-#~ msgid "Answer \"yes\" if it is okay to overwrite the file"
-#~ msgstr "Rispondi \"si\" se va bene sovrascrivere il file."
-
-#~ msgid ""
-#~ "Please enter a new filename. If you just hit RETURN the default\n"
-#~ "file (which is shown in brackets) will be used."
-#~ msgstr ""
-#~ "Inserisci il nuovo nome del file. Se premi INVIO sarà usato il nome\n"
-#~ "predefinito (quello indicato tra parentesi)."
-
-#~ msgid ""
-#~ "You should specify a reason for the certification.  Depending on the\n"
-#~ "context you have the ability to choose from this list:\n"
-#~ "  \"Key has been compromised\"\n"
-#~ "      Use this if you have a reason to believe that unauthorized persons\n"
-#~ "      got access to your secret key.\n"
-#~ "  \"Key is superseded\"\n"
-#~ "      Use this if you have replaced this key with a newer one.\n"
-#~ "  \"Key is no longer used\"\n"
-#~ "      Use this if you have retired this key.\n"
-#~ "  \"User ID is no longer valid\"\n"
-#~ "      Use this to state that the user ID should not longer be used;\n"
-#~ "      this is normally used to mark an email address invalid.\n"
-#~ msgstr ""
-#~ "Dovresti specificare un motivo per questa certificazione. A seconda del\n"
-#~ "contesto hai la possibilità di scegliere tra questa lista:\n"
-#~ "  \"Key has been compromised\"\n"
-#~ "      Usa questo se hai un motivo per credere che una persona non "
-#~ "autorizzata\n"
-#~ "      abbia avuto accesso alla tua chiave segreta.\n"
-#~ "  \"Key is superseded\"\n"
-#~ "      Usa questo se hai sostituito questa chiave con una più recente.\n"
-#~ "  \"Key is no longer used\"\n"
-#~ "      Usa questo se hai mandato in pensione questa chiave.\n"
-#~ "  \"User ID is no longer valid\"\n"
-#~ "      Usa questo per affermare che l'user ID non dovrebbe più essere "
-#~ "usato;\n"
-#~ "      solitamente è usato per indicare un indirizzo di email non valido.\n"
-
-#~ msgid ""
-#~ "If you like, you can enter a text describing why you issue this\n"
-#~ "revocation certificate.  Please keep this text concise.\n"
-#~ "An empty line ends the text.\n"
-#~ msgstr ""
-#~ "Se vuoi, puoi digitare un testo che descrive perché hai emesso\n"
-#~ "questo certificato di revoca. Per favore sii conciso.\n"
-#~ "Una riga vuota termina il testo.\n"
-
-#~ msgid "can't put notation data into v3 (PGP 2.x style) signatures\n"
-#~ msgstr "impossibile inserire notation data nelle firme v3 (stile PGP 2.x)\n"
-
-#~ msgid "can't put notation data into v3 (PGP 2.x style) key signatures\n"
-#~ msgstr ""
-#~ "impossibile inserire notation data nelle firme di chiavi v3 (stile PGP 2."
-#~ "x)\n"
-
-#~ msgid "can't put a policy URL into v3 (PGP 2.x style) signatures\n"
-#~ msgstr ""
-#~ "impossibile inserire l'URL di una policy nelle firme v3 (stile PGP 2.x)\n"
-
-#~ msgid "can't put a policy URL into v3 key (PGP 2.x style) signatures\n"
-#~ msgstr ""
-#~ "impossibile inserire l'URL di una policy nelle firme di chiavi v3 (stile\n"
-#~ "PGP 2.x)\n"
-
-#, fuzzy
-#~ msgid "shelll"
-#~ msgstr "help"
-
-#, fuzzy
-#~ msgid ""
-#~ "please see http://www.gnupg.org/download/iconv.html for more information\n"
-#~ msgstr "visitare http://www.gnupg.org/faq.html per ulteriori informazioni\n"
-
-#, fuzzy
-#~ msgid "key generation is not available from the commandline\n"
-#~ msgstr "gpg-agent non è disponibile in questa sessione\n"
-
-#, fuzzy
-#~ msgid "please use the script \"%s\" to generate a new key\n"
-#~ msgstr "Per favore scegli che tipo di chiave vuoi:\n"
-
-#, fuzzy
-#~ msgid "cipher extension `%s' not loaded due to unsafe permissions\n"
-#~ msgstr ""
-#~ "l'estensione crittografica \"%s\" non è stata caricata a causa dei\n"
-#~ "permessi insicuri.\n"
-
-#, fuzzy
-#~ msgid ".\n"
-#~ msgstr "%s.\n"
-
-#~ msgid "problem with the agent - disabling agent use\n"
-#~ msgstr "problema con l'agent - uso dell'agent disattivato\n"
-
-#, fuzzy
-#~ msgid "can't query passphrase in batch mode\n"
-#~ msgstr "impossibile chiedere la password in modo batch\n"
-
-#~ msgid "Repeat passphrase: "
-#~ msgstr "Ripeti la passphrase: "
-
-#~ msgid "-k[v][v][v][c] [user-id] [keyring]"
-#~ msgstr "-k[v][v][v][c] [user-id] [portachiavi]"
-
-#, fuzzy
-#~ msgid "can't gen prime with pbits=%u qbits=%u\n"
-#~ msgstr "impossibile generare un numero primo di meno di %d bit\n"
-
-#~ msgid "can't generate a prime with less than %d bits\n"
-#~ msgstr "impossibile generare un numero primo di meno di %d bit\n"
-
-#~ msgid "no entropy gathering module detected\n"
-#~ msgstr "non è stato trovato il modulo per raccogliere l'entropia\n"
-
-#, fuzzy
-#~ msgid "can't lock `%s': %s\n"
-#~ msgstr "impossibile aprire `%s'\n"
-
-#~ msgid "`%s' is not a regular file - ignored\n"
-#~ msgstr "`%s' non è un file regolare - ignorato\n"
-
-#~ msgid "note: random_seed file is empty\n"
-#~ msgstr "nota: il file random_seed è vuoto\n"
-
-#~ msgid "can't read `%s': %s\n"
-#~ msgstr "impossibile leggere `%s': %s\n"
-
-#~ msgid "note: random_seed file not updated\n"
-#~ msgstr "nota: il file random_seed non è stato aggiornato\n"
-
-#~ msgid "can't write `%s': %s\n"
-#~ msgstr "impossibile scrivere su `%s': %s\n"
-
-#~ msgid "can't close `%s': %s\n"
-#~ msgstr "impossibile chiudere `%s': %s\n"
-
-#~ msgid "WARNING: using insecure random number generator!!\n"
-#~ msgstr ""
-#~ "ATTENZIONE: si sta usando un generatore di numeri casuali non sicuro!!\n"
-
-#~ msgid ""
-#~ "The random number generator is only a kludge to let\n"
-#~ "it run - 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"
-#~ "funzionare il programma - non è assolutamente un RNG forte!\n"
-#~ "\n"
-#~ "NON USARE ALCUN DATO GENERATO DA QUESTO PROGRAMMA!\n"
-#~ "\n"
-
-#~ msgid ""
-#~ "Please wait, entropy is being gathered. Do some work if it would\n"
-#~ "keep you from getting bored, because it will improve the quality\n"
-#~ "of the entropy.\n"
-#~ msgstr ""
-#~ "Attendi, sto raccogliendo entropia. Se può evitare di annoiarti lavora un "
-#~ "po',\n"
-#~ "visto che questo migliorerà la qualità dell'entropia.\n"
-
-#~ 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 altri %d byte)\n"
-
-#, fuzzy
-#~ msgid "card reader not available\n"
-#~ msgstr "la chiave segreta non è disponibile"
-
-#, fuzzy
-#~ msgid "NOTE: %s is not available in this version\n"
-#~ msgstr "gpg-agent non è disponibile in questa sessione\n"
-
-#, fuzzy
-#~ msgid "         algorithms on these user IDs:\n"
-#~ msgstr "Non puoi cancellare l'ultimo user ID!\n"
-
-#~ msgid "general error"
-#~ msgstr "errore generale"
-
-#~ msgid "unknown packet type"
-#~ msgstr "pacchetto di tipo sconosciuto"
-
-#~ msgid "unknown digest algorithm"
-#~ msgstr "algoritmo del digest sconosciuto"
-
-#~ msgid "bad public key"
-#~ msgstr "chiave pubblica errata"
-
-#~ msgid "bad secret key"
-#~ msgstr "chiave segreta errata"
-
-#~ msgid "bad signature"
-#~ msgstr "firma errata"
-
-#~ msgid "checksum error"
-#~ msgstr "codice di controllo errato"
-
-#~ msgid "unknown cipher algorithm"
-#~ msgstr "algoritmo di cifratura sconosciuto"
-
-#~ msgid "invalid packet"
-#~ msgstr "pacchetto non valido"
-
-#~ msgid "no such user id"
-#~ msgstr "l'user id non esiste"
-
-#~ msgid "secret key not available"
-#~ msgstr "la chiave segreta non è disponibile"
-
-#~ msgid "wrong secret key used"
-#~ msgstr "è stata usata la chiave segreta sbagliata"
-
-#~ msgid "bad key"
-#~ msgstr "chiave sbagliata"
-
-#~ msgid "file write error"
-#~ msgstr "errore durante la scrittura del file"
-
-#~ msgid "unknown compress algorithm"
-#~ msgstr "algoritmo di compressione sconosciuto"
-
-#~ msgid "file open error"
-#~ msgstr "errore durante l'apertura del file"
-
-#~ msgid "file create error"
-#~ msgstr "errore durante la creazione del file"
-
-#~ msgid "unimplemented pubkey algorithm"
-#~ msgstr "algoritmo della chiave pubblica non implementato"
-
-#~ msgid "unimplemented cipher algorithm"
-#~ msgstr "algoritmo di cifratura non implementato"
-
-#~ msgid "unknown signature class"
-#~ msgstr "classe della firma sconosciuta"
-
-#~ msgid "trust database error"
-#~ msgstr "errore nel database della fiducia"
-
-#~ msgid "resource limit"
-#~ msgstr "limite della risorsa"
-
-#~ msgid "invalid keyring"
-#~ msgstr "portachiavi non valido"
-
-#~ msgid "malformed user id"
-#~ msgstr "user id malformato"
-
-#~ msgid "file close error"
-#~ msgstr "errore durante la chiusura del file"
-
-#~ msgid "file rename error"
-#~ msgstr "errore durante la rinominazione del file"
-
-#~ msgid "file delete error"
-#~ msgstr "errore durante la cancellazione del file"
-
-#~ msgid "unexpected data"
-#~ msgstr "dati inattesi"
-
-#~ msgid "timestamp conflict"
-#~ msgstr "date in conflitto"
-
-#~ msgid "unusable pubkey algorithm"
-#~ msgstr "algoritmo della chiave pubblica non utilizzabile"
-
-#~ msgid "file exists"
-#~ msgstr "il file esiste"
-
-#~ msgid "weak key"
-#~ msgstr "chiave debole"
-
-#~ msgid "bad URI"
-#~ msgstr "URI non valida"
-
-# ??? (Md)
-#~ msgid "not processed"
-#~ msgstr "non esaminato"
-
-#~ msgid "unusable public key"
-#~ msgstr "chiave pubblica inutilizzabile"
-
-#~ msgid "unusable secret key"
-#~ msgstr "chiave segreta inutilizzabile"
-
-#~ msgid "keyserver error"
-#~ msgstr "errore del keyserver"
-
-#, fuzzy
-#~ msgid "no card"
-#~ msgstr "non cifrato"
-
-#, fuzzy
-#~ msgid "no data"
-#~ msgstr "non ci sono dati firmati\n"
-
-#~ msgid "... this is a bug (%s:%d:%s)\n"
-#~ msgstr "... questo è un bug (%s:%d:%s)\n"
-
-#~ msgid "operation is not possible without initialized secure memory\n"
-#~ msgstr "l'operazione non è possibile senza memoria sicura inizializzata\n"
-
-#~ msgid "(you may have used the wrong program for this task)\n"
-#~ msgstr "(potresti avere usato il programma sbagliato per questa funzione)\n"
-
-#~ msgid ""
-#~ "please see http://www.gnupg.org/why-not-idea.html for more information\n"
-#~ msgstr ""
-#~ "per ulteriori informazioni si veda http://www.gnupg.org/it/why-not-idea."
-#~ "html\n"
-
-#, fuzzy
-#~ msgid "all export-clean-* options from above"
-#~ msgstr "leggi le opzioni dal file"
-
-#, fuzzy
-#~ msgid "all import-clean-* options from above"
-#~ msgstr "leggi le opzioni dal file"
-
-#, fuzzy
-#~ msgid "expired: %s)"
-#~ msgstr "[scadenza: %s]"
-
-#, fuzzy
-#~ msgid "key %s: expired signature from key %s - skipped\n"
-#~ msgstr "chiave %08lX: classe della firma inaspettata (0x%02x) - saltata\n"
-
-#, fuzzy
-#~ msgid "Unable to clean `%s'\n"
-#~ msgstr "impossibile eseguire %s \"%s\": %s\n"
-
-#, fuzzy
-#~ msgid "No user IDs are removable.\n"
-#~ msgstr "l'user ID \"%s\" è già stato revocato\n"
-
-#~ msgid "bad passphrase or unknown cipher algorithm (%d)\n"
-#~ msgstr "passphrase errata o algoritmo di cifratura sconosciuto (%d)\n"
-
-#~ msgid "can't set client pid for the agent\n"
-#~ msgstr "impossibile impostare il pid del client dell'agent\n"
-
-#~ msgid "can't get server read FD for the agent\n"
-#~ msgstr "impossibile ottenere il FD di lettura dell'agent\n"
-
-#~ msgid "can't get server write FD for the agent\n"
-#~ msgstr "impossibile ottenere il FD di scrittura dell'agent\n"
-
-#~ msgid "select secondary key N"
-#~ msgstr "scegli la chiave secondaria N"
-
-#~ msgid "list signatures"
-#~ msgstr "elenca le firme"
-
-#~ msgid "sign the key"
-#~ msgstr "firma la chiave"
-
-#~ msgid "add a secondary key"
-#~ msgstr "aggiungi una chiave secondaria"
-
-#~ msgid "delete signatures"
-#~ msgstr "cancella le firme"
-
-#~ msgid "change the expire date"
-#~ msgstr "cambia la data di scadenza"
-
-#~ msgid "set preference list"
-#~ msgstr "imposta la lista di preferenze"
-
-#~ msgid "updated preferences"
-#~ msgstr "preferenze aggiornate"
-
-#~ msgid "No secondary key with index %d\n"
-#~ msgstr "Nessuna chiave secondaria con l'indice %d\n"
-
-#~ msgid "--nrsign-key user-id"
-#~ msgstr "--nrsign-key user-id"
-
-#~ msgid "--nrlsign-key user-id"
-#~ msgstr "--nrlsign-key user-id"
-
-#~ msgid "sign the key non-revocably"
-#~ msgstr "firma la chiave irrevocabilmente"
-
-#~ msgid "sign the key locally and non-revocably"
-#~ msgstr "firma la chiave localmente e irrevocabilmente"
-
-#~ msgid "q"
-#~ msgstr "q"
-
-#~ msgid "list"
-#~ msgstr "list"
-
-#~ msgid "l"
-#~ msgstr "l"
-
-#~ msgid "debug"
-#~ msgstr "debug"
-
-#, fuzzy
-#~ msgid "name"
-#~ msgstr "abilita"
-
-#, fuzzy
-#~ msgid "login"
-#~ msgstr "lsign"
-
-#, fuzzy
-#~ msgid "cafpr"
-#~ msgstr "fpr"
-
-#, fuzzy
-#~ msgid "forcesig"
-#~ msgstr "revsig"
-
-#, fuzzy
-#~ msgid "generate"
-#~ msgstr "errore generale"
-
-#~ msgid "passwd"
-#~ msgstr "passwd"
-
-#~ msgid "save"
-#~ msgstr "save"
-
-#~ msgid "fpr"
-#~ msgstr "fpr"
-
-#~ msgid "uid"
-#~ msgstr "uid"
-
-#~ msgid "check"
-#~ msgstr "check"
-
-#~ msgid "c"
-#~ msgstr "c"
-
-#~ msgid "sign"
-#~ msgstr "sign"
-
-#~ msgid "s"
-#~ msgstr "s"
-
-#, fuzzy
-#~ msgid "tsign"
-#~ msgstr "sign"
-
-#~ msgid "lsign"
-#~ msgstr "lsign"
-
-#~ msgid "nrsign"
-#~ msgstr "nrsign"
-
-#~ msgid "nrlsign"
-#~ msgstr "nrlsign"
-
-#~ msgid "adduid"
-#~ msgstr "adduid"
-
-#~ msgid "addphoto"
-#~ msgstr "addphoto"
-
-#~ msgid "deluid"
-#~ msgstr "deluid"
-
-#~ msgid "delphoto"
-#~ msgstr "delphoto"
-
-#, fuzzy
-#~ msgid "addcardkey"
-#~ msgstr "addkey"
-
-#~ msgid "delkey"
-#~ msgstr "delkey"
-
-#~ msgid "addrevoker"
-#~ msgstr "addrevoker"
-
-#~ msgid "delsig"
-#~ msgstr "delsign"
-
-#~ msgid "expire"
-#~ msgstr "expire"
-
-#~ msgid "primary"
-#~ msgstr "primary"
-
-#~ msgid "toggle"
-#~ msgstr "toggle"
-
-#~ msgid "t"
-#~ msgstr "t"
-
-#~ msgid "pref"
-#~ msgstr "pref"
-
-#~ msgid "showpref"
-#~ msgstr "showpref"
-
-#~ msgid "setpref"
-#~ msgstr "setpref"
-
-#~ msgid "updpref"
-#~ msgstr "updpref"
-
-#, fuzzy
-#~ msgid "keyserver"
-#~ msgstr "errore del keyserver"
-
-#~ msgid "trust"
-#~ msgstr "trust"
-
-#~ msgid "revsig"
-#~ msgstr "revsig"
-
-#~ msgid "revuid"
-#~ msgstr "revuid"
-
-#~ msgid "revkey"
-#~ msgstr "revkey"
-
-#~ msgid "disable"
-#~ msgstr "disable"
-
-#~ msgid "enable"
-#~ msgstr "abilita"
-
-#~ msgid "showphoto"
-#~ msgstr "showphoto"
-
-#~ msgid "digest algorithm `%s' is read-only in this release\n"
-#~ msgstr "in questa versione l'algoritmo digest `%s' è in sola lettura\n"
-
-#~ msgid ""
-#~ "About to generate a new %s keypair.\n"
-#~ "              minimum keysize is  768 bits\n"
-#~ "              default keysize is 1024 bits\n"
-#~ "    highest suggested keysize is 2048 bits\n"
-#~ msgstr ""
-#~ "Sto per generare una nuova coppia di chiavi %s.\n"
-#~ "               la dimensione minima è  768 bit\n"
-#~ "          la dimensione predefinita è 1024 bit\n"
-#~ "  la dimensione massima consigliata è 2048 bit\n"
-
-#~ msgid "DSA only allows keysizes from 512 to 1024\n"
-#~ msgstr "DSA permette solo chiavi di dimensioni tra 512 e 1024\n"
-
-#~ msgid "keysize too small; 1024 is smallest value allowed for RSA.\n"
-#~ msgstr ""
-#~ "la chiave è troppo corta; 1024 è il minimo valore permesso per RSA.\n"
-
-#~ msgid "keysize too small; 768 is smallest value allowed.\n"
-#~ msgstr "la chiave è troppo corta; 768 è il minimo valore permesso.\n"
-
-#~ msgid "keysize too large; %d is largest value allowed.\n"
-#~ msgstr "la chiave è troppo lunga; %d è il massimo valore permesso.\n"
-
-#~ 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"
-
-#, fuzzy
-#~ msgid "Are you sure that you want this keysize? (y/N) "
-#~ msgstr "Sei sicuro di volere una chiave di queste dimensioni? "
-
-#~ 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 "Experimental algorithms should not be used!\n"
-#~ msgstr "Gli algoritmi sperimentali non dovrebbero essere usati!\n"
-
-#~ msgid ""
-#~ "this cipher algorithm is deprecated; please use a more standard one!\n"
-#~ msgstr ""
-#~ "questo algoritmo di cifratura è deprecato; usane uno più standard!\n"
-
-#~ msgid "sorry, can't do this in batch mode\n"
-#~ msgstr "mi dispiace, non è possibile fare questo in modo batch\n"
-
-#, fuzzy
-#~ msgid "can't open file `%s': %s\n"
-#~ msgstr "impossibile aprire il file: %s\n"
-
-#~ msgid "key %08lX: key has been revoked!\n"
-#~ msgstr "chiave %08lX: la chiave è stata revocata!\n"
-
-#~ msgid "key %08lX: subkey has been revoked!\n"
-#~ msgstr "chiave %08lX: la subchiave è stata revocata!\n"
-
-#~ msgid "%08lX: key has expired\n"
-#~ msgstr "%08lX: la chiave è scaduta\n"
-
-#~ msgid "%08lX: We do NOT trust this key\n"
-#~ msgstr "%08lX: NON ci fidiamo di questa chiave!\n"
-
-#, fuzzy
-#~ msgid "   (%d) RSA (auth only)\n"
-#~ msgstr "   (%d) RSA (firma solo)\n"
-
-#, fuzzy
-#~ msgid "   (%d) RSA (sign and auth)\n"
-#~ msgstr "   (%d) RSA (firma e cifra)\n"
-
-#, fuzzy
-#~ msgid "   (%d) RSA (encrypt and auth)\n"
-#~ msgstr "   (%d) RSA (cifra solo)\n"
-
-#, fuzzy
-#~ msgid "  (%d) RSA (sign, encrypt and auth)\n"
-#~ msgstr "   (%d) RSA (firma e cifra)\n"
-
-#~ msgid "%s: can't open: %s\n"
-#~ msgstr "%s: impossibile aprire: %s\n"
-
-#~ msgid "%s: WARNING: empty file\n"
-#~ msgstr "%s: ATTENZIONE: file vuoto\n"
-
-#, fuzzy
-#~ msgid "   (%d) I trust marginally\n"
-#~ msgstr " %d = Mi fido marginalmente\n"
-
-#, fuzzy
-#~ msgid "   (%d) I trust fully\n"
-#~ msgstr " %d = Mi fido completamente\n"
-
-#, fuzzy
-#~ msgid "expires"
-#~ msgstr "expire"
-
-#, fuzzy
-#~ msgid ""
-#~ "\"\n"
-#~ "locally signed with your key %s at %s\n"
-#~ msgstr ""
-#~ "\"\n"
-#~ "firmata localmente con la tua chiave %08lX il %s\n"
-#~ "\n"
-
-#~ msgid "%s: can't create lock\n"
-#~ msgstr "%s: impossibile creare il lock\n"
-
-#~ msgid "%s: can't make lock\n"
-#~ msgstr "%s: impossibile creare il lock\n"
-
-#~ msgid "%s: can't create: %s\n"
-#~ msgstr "%s: impossibile creare: %s\n"
-
-#~ msgid "If you want to use this revoked key anyway, answer \"yes\"."
-#~ msgstr "Se vuoi usare comunque questa chiave revocata, rispondi \"si\"."
-
-#~ msgid "Unable to open photo \"%s\": %s\n"
-#~ msgstr "Impossibile aprire la foto \"%s\": %s\n"
-
-#~ msgid "error: missing colon\n"
-#~ msgstr "errore: mancano due punti\n"
-
-#~ msgid "error: no ownertrust value\n"
-#~ msgstr "errore: non c'è il valore della fiducia\n"
-
-#~ msgid " (main key ID %08lX)"
-#~ msgstr " (key ID principale %08lX)"
-
-#~ msgid "rev! subkey has been revoked: %s\n"
-#~ msgstr "rev! la subchiave è stata revocata: %s\n"
-
-#~ msgid "rev- faked revocation found\n"
-#~ msgstr "rev- trovata una revoca falsificata\n"
-
-#, fuzzy
-#~ msgid " [expired: %s]"
-#~ msgstr "[scadenza: %s]"
-
-#~ msgid " [expires: %s]"
-#~ msgstr "[scadenza: %s]"
-
-#, fuzzy
-#~ msgid " [revoked: %s]"
-#~ msgstr "[revocata]"
-
-#~ msgid ""
-#~ "WARNING: digest `%s' is not part of OpenPGP.  Use at your own risk!\n"
-#~ msgstr ""
-#~ "ATTENZIONE: il digest `%s' non fa parte di OpenPGP.\n"
-#~ "Da usare a proprio rischio!\n"
-
-#~ msgid "|[files]|encrypt files"
-#~ msgstr "|[file]|cifra i file"
-
-#~ msgid "store only"
-#~ msgstr "immagazzina soltanto"
-
-#~ msgid "|[files]|decrypt files"
-#~ msgstr "|[file]|decifra i file"
-
-#~ msgid "sign a key non-revocably"
-#~ msgstr "firma una chiave irrevocabilmente"
-
-#~ msgid "sign a key locally and non-revocably"
-#~ msgstr "firma una chiave localmente e irrevocabilmente"
-
-#~ msgid "list only the sequence of packets"
-#~ msgstr "elenca solo la sequenza dei pacchetti"
-
-#~ msgid "export the ownertrust values"
-#~ msgstr "esporta i valori di fiducia"
-
-#~ msgid "unattended trust database update"
-#~ msgstr "aggiornamento non presidiato del database della fiducia"
-
-#~ msgid "fix a corrupted trust database"
-#~ msgstr "ripara un database della fiducia rovinato"
-
-#~ msgid "De-Armor a file or stdin"
-#~ msgstr "rimuovi l'armatura a un file o a stdin"
-
-#~ msgid "En-Armor a file or stdin"
-#~ msgstr "crea l'armatura a un file o a stdin"
-
-#~ msgid "do not force v3 signatures"
-#~ msgstr "non forza l'uso di firme v3"
-
-#~ msgid "force v4 key signatures"
-#~ msgstr "forza l'uso di firme v4"
-
-#~ msgid "do not force v4 key signatures"
-#~ msgstr "non forza l'uso di firme v4"
-
-#~ msgid "never use a MDC for encryption"
-#~ msgstr "non usa mai un MDC per cifrare"
-
-#~ msgid "use the gpg-agent"
-#~ msgstr "usa gpg-agent"
-
-#~ msgid "|[file]|write status info to file"
-#~ msgstr "|[file]|scrivi le informazioni di stato nel file"
-
-#~ msgid "|KEYID|ultimately trust this key"
-#~ msgstr "|KEYID|assegna fiducia definitiva a questa chiave"
-
-#~ msgid "emulate the mode described in RFC1991"
-#~ msgstr "emula il modo descritto in RFC 1991"
-
-#~ msgid "set all packet, cipher and digest options to OpenPGP behavior"
-#~ msgstr ""
-#~ "imposta tutte le opzioni di pacchetto,\n"
-#~ "cifrario e digest per OpenPGP"
-
-#~ msgid "set all packet, cipher and digest options to PGP 2.x behavior"
-#~ msgstr ""
-#~ "imposta tutte le opzioni di pacchetto, cifrario e digest per PGP 2.x"
-
-#~ msgid "|NAME|use message digest algorithm NAME for passphrases"
-#~ msgstr "|NOME|usa l'algoritmo di message digest NOME per le passphrase"
-
-#~ msgid "throw keyid field of encrypted packets"
-#~ msgstr "elimina il campo keyid dei pacchetti cifrati"
-
-#~ msgid "Show Photo IDs"
-#~ msgstr "Mostra le fotografie"
-
-#~ msgid "Don't show Photo IDs"
-#~ msgstr "Non mostra le fotografie"
-
-#~ msgid "Set command line to view Photo IDs"
-#~ msgstr "Imposta la riga di comando per vedere le fotografie"
-
-#~ msgid "compress algorithm `%s' is read-only in this release\n"
-#~ msgstr ""
-#~ "in questa versione l'algoritmo di compressione `%s' è in sola lettura\n"
-
-#~ msgid "compress algorithm must be in range %d..%d\n"
-#~ msgstr "l'algoritmo di compressione deve essere tra %d e %d\n"
-
-#~ msgid ""
-#~ "%08lX: It is not sure that this key really belongs to the owner\n"
-#~ "but it is accepted anyway\n"
-#~ msgstr ""
-#~ "%08lX: Non è sicuro che questa chiave appartenga veramente al "
-#~ "proprietario\n"
-#~ "ma è accettata comunque\n"
-
-#~ msgid "preference %c%lu is not valid\n"
-#~ msgstr "la preferenza %c%lu non è valida\n"
-
-#~ msgid "key %08lX: not a rfc2440 key - skipped\n"
-#~ msgstr "chiave %08lX: chiave non rfc2440 - saltata\n"
-
-#~ msgid ""
-#~ "NOTE: Elgamal primary key detected - this may take some time to import\n"
-#~ msgstr ""
-#~ "NOTA: trovata una chiave primaria Elgamal - importarla può essere lungo\n"
-
-#~ msgid " (default)"
-#~ msgstr " (predefinito)"
-
-#~ msgid "%s%c %4u%c/%08lX  created: %s expires: %s"
-#~ msgstr "%s%c %4u%c/%08lX  creata: %s scade: %s"
-
-#~ msgid "can't get key from keyserver: %s\n"
-#~ msgstr "impossibile scaricare la chiave dal keyserver: %s\n"
-
-#~ msgid "success sending to `%s' (status=%u)\n"
-#~ msgstr "inviata con successo a `%s' (status=%u)\n"
-
-#~ msgid "failed sending to `%s': status=%u\n"
-#~ msgstr "invio a `%s' fallito: status=%u\n"
-
-#~ msgid "this keyserver does not support --search-keys\n"
-#~ msgstr "questo keyserver non gestisce --search-keys\n"
-
-#~ msgid "can't search keyserver: %s\n"
-#~ msgstr "impossibile cercare sul keyserver: %s\n"
-
-#~ msgid ""
-#~ "key %08lX: this is a PGP generated ElGamal key which is NOT secure for "
-#~ "signatures!\n"
-#~ msgstr ""
-#~ "chiave %08lX: questa è una chiave ElGamal generata da PGP che NON è "
-#~ "sicura per le firme!\n"
-
-#~ msgid ""
-#~ "key %08lX has been created %lu second in future (time warp or clock "
-#~ "problem)\n"
-#~ msgstr ""
-#~ "la chiave %08lX è stata creata %lu secondo nel futuro (salto nel tempo\n"
-#~ "o problema con l'orologio)\n"
-
-#~ msgid ""
-#~ "key %08lX has been created %lu seconds in future (time warp or clock "
-#~ "problem)\n"
-#~ msgstr ""
-#~ "la chiave %08lX è stata creata %lu secondi nel futuro (salto nel tempo\n"
-#~ "o problema con l'orologio)\n"
-
-#~ msgid "key %08lX marked as ultimately trusted\n"
-#~ msgstr "chiavi %08lX marcate come definitivamente affidabile\n"
-
-#~ msgid "signature from Elgamal signing key %08lX to %08lX skipped\n"
-#~ msgstr "ignorata la firma dalla chiave per firme Elgamal %08lX a %08lX\n"
-
-#~ msgid "signature from %08lX to Elgamal signing key %08lX skipped\n"
-#~ msgstr "ignorata la firma da %08lX alla chiave per firme Elgamal %08lX\n"
-
-#~ msgid "checking at depth %d signed=%d ot(-/q/n/m/f/u)=%d/%d/%d/%d/%d/%d\n"
-#~ msgstr ""
-#~ "controllo al livello %d firmato=%d ot(-/q/n/m/f/u)=%d/%d/%d/%d/%d/%d\n"
-
-#~ msgid ""
-#~ "Select the algorithm to use.\n"
-#~ "\n"
-#~ "DSA (aka DSS) is the digital signature algorithm which can only be used\n"
-#~ "for signatures.  This is the suggested algorithm because verification of\n"
-#~ "DSA signatures are much faster than those of ElGamal.\n"
-#~ "\n"
-#~ "ElGamal is an algorithm which can be used for signatures and encryption.\n"
-#~ "OpenPGP distinguishs between two flavors of this algorithms: an encrypt "
-#~ "only\n"
-#~ "and a sign+encrypt; actually it is the same, but some parameters must be\n"
-#~ "selected in a special way to create a safe key for signatures: this "
-#~ "program\n"
-#~ "does this but other OpenPGP implementations are not required to "
-#~ "understand\n"
-#~ "the signature+encryption flavor.\n"
-#~ "\n"
-#~ "The first (primary) key must always be a key which is capable of "
-#~ "signing;\n"
-#~ "this is the reason why the encryption only ElGamal key is not available "
-#~ "in\n"
-#~ "this menu."
-#~ msgstr ""
-#~ "Seleziona l'algoritmo da usare.\n"
-#~ "\n"
-#~ "DSA (alias DSS) è un algoritmo usabile solo per firmare. E l'algoritmo\n"
-#~ "suggerito perché verificare firme DSA è molto più veloce di quelle "
-#~ "ElGamal.\n"
-#~ "\n"
-#~ "ElGamal è un algoritmo usabile per firmare e cifrare.\n"
-#~ "OpenPGP distingue tra due versioni di questo algoritmo: una solo per "
-#~ "firmare\n"
-#~ "e una per firmare e cifrare. In realtà è sempre lo stesso, ma per creare\n"
-#~ "firme sicure per la cifratura occorre scegliere in un modo particolare "
-#~ "alcuni\n"
-#~ "parametri: questo programma lo fa ma non è richiesto che altre "
-#~ "implementazioni\n"
-#~ "di OpenPGP capiscano la versione per firmare e cifrare.\n"
-#~ "\n"
-#~ "La prima chiave (primaria) deve sempre essere una chiave in grado di "
-#~ "firmare;\n"
-#~ "questo è il motivo per cui le chiavi ElGamal solo per cifrare non sono\n"
-#~ "disponibili in questo menù."
-
-#~ msgid ""
-#~ "Although these keys are defined in RFC2440 they are not suggested\n"
-#~ "because they are not supported by all programs and signatures created\n"
-#~ "with them are quite large and very slow to verify."
-#~ msgstr ""
-#~ "Anche se queste chiavi sono definite da RFC2400 non sono suggerite perché "
-#~ "non\n"
-#~ "sono gestite da tutti i programmi e le firme create sono grandi e lunghe "
-#~ "da\n"
-#~ "verificare."
-
-#~ msgid "%lu keys so far checked (%lu signatures)\n"
-#~ msgstr "Per ora sono state controllate %lu chiavi (%lu firme)\n"
-
-#~ msgid "key incomplete\n"
-#~ msgstr "chiave incompleta\n"
-
-#~ msgid "key %08lX incomplete\n"
-#~ msgstr "chiave %08lX incompleta\n"
+"Sintassi: gpg-check-pattern [opzioni] patternfile\n"
+"Controllare una passphrase data su stdin rispetto al patternfile\n"
index 64ffa5e..b268dd9 100644 (file)
--- a/po/ja.po
+++ b/po/ja.po
@@ -8,9 +8,9 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: gnupg 2.2.20\n"
+"Project-Id-Version: gnupg 2.2.23\n"
 "Report-Msgid-Bugs-To: translations@gnupg.org\n"
-"PO-Revision-Date: 2020-07-07 09:37+0900\n"
+"PO-Revision-Date: 2020-11-12 12:59+0900\n"
 "Last-Translator: NIIBE Yutaka <gniibe@fsij.org>\n"
 "Language-Team: none\n"
 "Language: ja\n"
@@ -1670,6 +1670,14 @@ msgid "WARNING: '%s' is an empty file\n"
 msgstr "*警告*: '%s'は空のファイルです\n"
 
 #, c-format
+msgid "cipher algorithm '%s' may not be used in %s mode\n"
+msgstr "暗号アルゴリズム'%s'を%sモードで使うことはできません\n"
+
+#, c-format
+msgid "digest algorithm '%s' may not be used in %s mode\n"
+msgstr "ダイジェスト・アルゴリズム'%s'を%sモードで使うことはできません\n"
+
+#, c-format
 msgid "reading from '%s'\n"
 msgstr "'%s'から読み込み\n"
 
@@ -1680,10 +1688,6 @@ msgstr ""
 "*警告*: 共通鍵暗号方式 %s (%d) の強制が、受取人の優先指定をそむきます\n"
 
 #, c-format
-msgid "cipher algorithm '%s' may not be used in %s mode\n"
-msgstr "暗号アルゴリズム'%s'を%sモードで使うことはできません\n"
-
-#, c-format
 msgid "WARNING: key %s is not suitable for encryption in %s mode\n"
 msgstr "*警告*: 鍵%sは、%sモードでは、暗号化に適しません\n"
 
@@ -1930,10 +1934,13 @@ msgid "remove keys from the secret keyring"
 msgstr "秘密鍵リングから鍵を削除"
 
 msgid "quickly sign a key"
-msgstr "鍵にすばやく署名"
+msgstr "すばやく鍵に署名"
 
 msgid "quickly sign a key locally"
-msgstr "鍵へすばやくローカルに署名"
+msgstr "すばやく鍵へローカルに署名"
+
+msgid "quickly revoke a key signature"
+msgstr "すばやく鍵への署名を失効"
 
 msgid "sign a key"
 msgstr "鍵に署名"
@@ -2388,10 +2395,6 @@ msgid "%s does not yet work with %s\n"
 msgstr "%sは%sではまだ機能しません\n"
 
 #, c-format
-msgid "digest algorithm '%s' may not be used in %s mode\n"
-msgstr "ダイジェスト・アルゴリズム'%s'を%sモードで使うことはできません\n"
-
-#, c-format
 msgid "compression algorithm '%s' may not be used in %s mode\n"
 msgstr "圧縮アルゴリズム'%s'を%sモードで使うことはできません\n"
 
@@ -3464,6 +3467,14 @@ msgid "Nothing to sign.\n"
 msgstr "署名するものがありません。\n"
 
 #, c-format
+msgid "Not signed by you.\n"
+msgstr "あなたによって署名されていません。\n"
+
+#, c-format
+msgid "revoking the key signature failed: %s\n"
+msgstr "鍵の署名の失効に失敗しました: %s\n"
+
+#, c-format
 msgid "'%s' is not a valid expiration time\n"
 msgstr "'%s'は、有効な有効期限ではありません\n"
 
@@ -3750,9 +3761,6 @@ msgstr "それでも本当に失効したいですか? (y/N) "
 msgid "Create a revocation certificate for this signature? (y/N) "
 msgstr "この署名に対する失効証明書を作成しますか? (y/N) "
 
-msgid "Not signed by you.\n"
-msgstr "あなたによって署名されていません。\n"
-
 #, c-format
 msgid "You have signed these user IDs on key %s:\n"
 msgstr "これらのユーザIDに鍵%sで署名しました:\n"
index 7ffe3e8..6f80570 100644 (file)
--- a/po/nb.po
+++ b/po/nb.po
@@ -1703,6 +1703,14 @@ msgid "WARNING: '%s' is an empty file\n"
 msgstr "ADVARSEL: «%s» er en tom fil\n"
 
 #, c-format
+msgid "cipher algorithm '%s' may not be used in %s mode\n"
+msgstr "du kan ikke bruke algoritme «%s» i %s-modus\n"
+
+#, c-format
+msgid "digest algorithm '%s' may not be used in %s mode\n"
+msgstr "du kan ikke bruke algoritme «%s» i %s-modus\n"
+
+#, c-format
 msgid "reading from '%s'\n"
 msgstr "leser fra «%s»\n"
 
@@ -1714,10 +1722,6 @@ msgstr ""
 "mottakers oppsett\n"
 
 #, c-format
-msgid "cipher algorithm '%s' may not be used in %s mode\n"
-msgstr "du kan ikke bruke algoritme «%s» i %s-modus\n"
-
-#, c-format
 msgid "WARNING: key %s is not suitable for encryption in %s mode\n"
 msgstr "ADVARSEL: nøkkel %s egner seg ikke for kryptering i %s-modus\n"
 
@@ -1972,6 +1976,11 @@ msgstr "hurtigsigner nøkkel"
 msgid "quickly sign a key locally"
 msgstr "hurtigsigner nøkkel lokalt"
 
+#, fuzzy
+#| msgid "quickly revoke a user-id"
+msgid "quickly revoke a key signature"
+msgstr "opphev bruker-ID raskt"
+
 msgid "sign a key"
 msgstr "signer nøkkel"
 
@@ -2424,10 +2433,6 @@ msgid "%s does not yet work with %s\n"
 msgstr "%s virker ikke enda med %s\n"
 
 #, c-format
-msgid "digest algorithm '%s' may not be used in %s mode\n"
-msgstr "du kan ikke bruke algoritme «%s» i %s-modus\n"
-
-#, c-format
 msgid "compression algorithm '%s' may not be used in %s mode\n"
 msgstr "du kan ikke bruke komprimeringsalgoritme «%s» i %s-modus\n"
 
@@ -3530,6 +3535,15 @@ msgid "Nothing to sign.\n"
 msgstr "Ingenting å signere.\n"
 
 #, c-format
+msgid "Not signed by you.\n"
+msgstr "Ikke signert av deg.\n"
+
+#, fuzzy, c-format
+#| msgid "checking created signature failed: %s\n"
+msgid "revoking the key signature failed: %s\n"
+msgstr "kontroll av opprettet signatur mislyktes: %s\n"
+
+#, c-format
 msgid "'%s' is not a valid expiration time\n"
 msgstr "«%s» er en ugyldig utløpstid\n"
 
@@ -3825,9 +3839,6 @@ msgstr "Er du sikker på at du vil oppheve den? (j/N) "
 msgid "Create a revocation certificate for this signature? (y/N) "
 msgstr "Vil du lage et opphevelsessertifikat for denne signaturen? (j/N) "
 
-msgid "Not signed by you.\n"
-msgstr "Ikke signert av deg.\n"
-
 #, c-format
 msgid "You have signed these user IDs on key %s:\n"
 msgstr "Du har signert disse bruker-id-ene med nøkkelen %s:\n"
index c8c482e..b43e72f 100644 (file)
--- a/po/pl.po
+++ b/po/pl.po
@@ -1672,6 +1672,14 @@ msgid "WARNING: '%s' is an empty file\n"
 msgstr "OSTRZEŻENIE: plik ,,%s'' jest pusty\n"
 
 #, c-format
+msgid "cipher algorithm '%s' may not be used in %s mode\n"
+msgstr "szyfr ,,%s'' nie może być używany w trybie %s\n"
+
+#, c-format
+msgid "digest algorithm '%s' may not be used in %s mode\n"
+msgstr "algorytm skrótu ,,%s'' nie może być używany w trybie %s\n"
+
+#, c-format
 msgid "reading from '%s'\n"
 msgstr "odczyt z ,,%s''\n"
 
@@ -1683,10 +1691,6 @@ msgstr ""
 "adresata\n"
 
 #, c-format
-msgid "cipher algorithm '%s' may not be used in %s mode\n"
-msgstr "szyfr ,,%s'' nie może być używany w trybie %s\n"
-
-#, c-format
 msgid "WARNING: key %s is not suitable for encryption in %s mode\n"
 msgstr "OSTRZEŻENIE: klucz %s nie nadaje się do szyfrowania w trybie %s\n"
 
@@ -1942,6 +1946,11 @@ msgstr "szybkie złożenie podpisu na kluczu"
 msgid "quickly sign a key locally"
 msgstr "szybkie złożenie prywatnego podpisu na kluczu"
 
+#, fuzzy
+#| msgid "quickly revoke a user-id"
+msgid "quickly revoke a key signature"
+msgstr "szybkie unieważnienie identyfikatora użytkownika"
+
 msgid "sign a key"
 msgstr "złożenie podpisu na kluczu"
 
@@ -2419,10 +2428,6 @@ msgid "%s does not yet work with %s\n"
 msgstr "%s jeszcze nie działa z %s!\n"
 
 #, c-format
-msgid "digest algorithm '%s' may not be used in %s mode\n"
-msgstr "algorytm skrótu ,,%s'' nie może być używany w trybie %s\n"
-
-#, c-format
 msgid "compression algorithm '%s' may not be used in %s mode\n"
 msgstr "algorytm kompresji ,,%s'' nie może być używany w trybie %s\n"
 
@@ -3544,6 +3549,15 @@ msgid "Nothing to sign.\n"
 msgstr "Nie ma nic do podpisania.\n"
 
 #, c-format
+msgid "Not signed by you.\n"
+msgstr "Nie podpisane przez ciebie.\n"
+
+#, fuzzy, c-format
+#| msgid "checking created signature failed: %s\n"
+msgid "revoking the key signature failed: %s\n"
+msgstr "sprawdzenie złożonego podpisu nie powiodło się: %s\n"
+
+#, c-format
 msgid "'%s' is not a valid expiration time\n"
 msgstr ",,%s'' nie jest poprawnym czasem wygaśnięcia\n"
 
@@ -3836,9 +3850,6 @@ msgstr "Czy dalej chcesz go unieważnić? (t/N) "
 msgid "Create a revocation certificate for this signature? (y/N) "
 msgstr "Stworzyć certyfikat unieważnienia tego podpisu? (t/N) "
 
-msgid "Not signed by you.\n"
-msgstr "Nie podpisane przez ciebie.\n"
-
 #, c-format
 msgid "You have signed these user IDs on key %s:\n"
 msgstr "Te identyfikatory na kluczu %s są podpisane przez Ciebie:\n"
index 9afcdda..e0d7402 100644 (file)
--- a/po/pt.po
+++ b/po/pt.po
@@ -1782,6 +1782,14 @@ msgid "WARNING: '%s' is an empty file\n"
 msgstr "AVISO: `%s' é um ficheiro vazio\n"
 
 #, fuzzy, c-format
+msgid "cipher algorithm '%s' may not be used in %s mode\n"
+msgstr "não pode utilizar %s enquanto estiver no modo %s\n"
+
+#, fuzzy, c-format
+msgid "digest algorithm '%s' may not be used in %s mode\n"
+msgstr "não pode utilizar %s enquanto estiver no modo %s\n"
+
+#, fuzzy, c-format
 #| msgid "reading from `%s'\n"
 msgid "reading from '%s'\n"
 msgstr "lendo de `%s'\n"
@@ -1793,10 +1801,6 @@ msgstr ""
 "ao forçar a cifra simétrica %s (%d) viola as preferências do destinatário\n"
 
 #, fuzzy, c-format
-msgid "cipher algorithm '%s' may not be used in %s mode\n"
-msgstr "não pode utilizar %s enquanto estiver no modo %s\n"
-
-#, fuzzy, c-format
 msgid "WARNING: key %s is not suitable for encryption in %s mode\n"
 msgstr "AVISO: \"%s\" é uma opção depreciada\n"
 
@@ -2076,6 +2080,11 @@ msgstr "assinar uma chave"
 msgid "quickly sign a key locally"
 msgstr "assinar uma chave localmente"
 
+#, fuzzy
+#| msgid "generate a new key pair"
+msgid "quickly revoke a key signature"
+msgstr "gerar um novo par de chaves"
+
 msgid "sign a key"
 msgstr "assinar uma chave"
 
@@ -2566,10 +2575,6 @@ msgid "%s does not yet work with %s\n"
 msgstr "%s não faz sentido com %s!\n"
 
 #, fuzzy, c-format
-msgid "digest algorithm '%s' may not be used in %s mode\n"
-msgstr "não pode utilizar %s enquanto estiver no modo %s\n"
-
-#, fuzzy, c-format
 msgid "compression algorithm '%s' may not be used in %s mode\n"
 msgstr "não pode utilizar %s enquanto estiver no modo %s\n"
 
@@ -3740,6 +3745,15 @@ msgid "Nothing to sign.\n"
 msgstr "Nada para assinar com a chave %08lX\n"
 
 #, fuzzy, c-format
+msgid "Not signed by you.\n"
+msgstr "   assinado por %08lX em %s%s\n"
+
+#, fuzzy, c-format
+#| msgid "checking created signature failed: %s\n"
+msgid "revoking the key signature failed: %s\n"
+msgstr "verificação da assinatura criada falhou: %s\n"
+
+#, fuzzy, c-format
 msgid "'%s' is not a valid expiration time\n"
 msgstr "%s não é um conjunto de caracteres válido\n"
 
@@ -4043,10 +4057,6 @@ msgstr "Tem a certeza de que quer revogá-la de qualquer forma? (s/N) "
 msgid "Create a revocation certificate for this signature? (y/N) "
 msgstr "Gerar um certificado de revogação para esta assinatura? (s/N)"
 
-#, fuzzy
-msgid "Not signed by you.\n"
-msgstr "   assinado por %08lX em %s%s\n"
-
 #, fuzzy, c-format
 msgid "You have signed these user IDs on key %s:\n"
 msgstr "Assinou estes identificadores de utilizadores:\n"
index edb6f11..c46e819 100644 (file)
--- a/po/ro.po
+++ b/po/ro.po
@@ -1800,6 +1800,16 @@ msgid "WARNING: '%s' is an empty file\n"
 msgstr "AVERTISMENT: `%s' este un fişier gol\n"
 
 #, fuzzy, c-format
+#| msgid "you may not use cipher algorithm `%s' while in %s mode\n"
+msgid "cipher algorithm '%s' may not be used in %s mode\n"
+msgstr "nu puteţi folosi algoritmul de cifrare `%s' câtă vreme în modul %s\n"
+
+#, fuzzy, c-format
+#| msgid "you may not use digest algorithm `%s' while in %s mode\n"
+msgid "digest algorithm '%s' may not be used in %s mode\n"
+msgstr "nu puteţi folosi algorimul de rezumat `%s' câtă vreme în modul %s\n"
+
+#, fuzzy, c-format
 #| msgid "reading from `%s'\n"
 msgid "reading from '%s'\n"
 msgstr "citesc din `%s'\n"
@@ -1812,11 +1822,6 @@ msgstr ""
 "destinatarului\n"
 
 #, fuzzy, c-format
-#| msgid "you may not use cipher algorithm `%s' while in %s mode\n"
-msgid "cipher algorithm '%s' may not be used in %s mode\n"
-msgstr "nu puteţi folosi algoritmul de cifrare `%s' câtă vreme în modul %s\n"
-
-#, fuzzy, c-format
 msgid "WARNING: key %s is not suitable for encryption in %s mode\n"
 msgstr "AVERTISMENT: \"%s\" este o opţiune învechită\n"
 
@@ -2100,6 +2105,11 @@ msgstr "semnează o cheie"
 msgid "quickly sign a key locally"
 msgstr "semnează o cheie local"
 
+#, fuzzy
+#| msgid "generate a new key pair"
+msgid "quickly revoke a key signature"
+msgstr "generează o nouă perechi de chei"
+
 msgid "sign a key"
 msgstr "semnează o cheie"
 
@@ -2624,11 +2634,6 @@ msgid "%s does not yet work with %s\n"
 msgstr "%s nu merge încă cu %s!\n"
 
 #, fuzzy, c-format
-#| msgid "you may not use digest algorithm `%s' while in %s mode\n"
-msgid "digest algorithm '%s' may not be used in %s mode\n"
-msgstr "nu puteţi folosi algorimul de rezumat `%s' câtă vreme în modul %s\n"
-
-#, fuzzy, c-format
 #| msgid "you may not use compression algorithm `%s' while in %s mode\n"
 msgid "compression algorithm '%s' may not be used in %s mode\n"
 msgstr "nu puteţi folosi algoritmul de compresie `%s' câtă vreme în modul %s\n"
@@ -3780,6 +3785,15 @@ msgstr "Nu există acest ID utilizator.\n"
 msgid "Nothing to sign.\n"
 msgstr "Nimic de semnat cu cheia %s\n"
 
+#, c-format
+msgid "Not signed by you.\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "checking created signature failed: %s\n"
+msgid "revoking the key signature failed: %s\n"
+msgstr "verificarea semnăturii create a eşuat: %s\n"
+
 #, fuzzy, c-format
 #| msgid "`%s' is not a valid signature expiration\n"
 msgid "'%s' is not a valid expiration time\n"
@@ -4094,9 +4108,6 @@ msgstr "Sunteţi încă sigur(ă) că doriţi să o revocaţi? (d/N) "
 msgid "Create a revocation certificate for this signature? (y/N) "
 msgstr "Creaţi un certificat de revocare pentru această semnătură? (d/N) "
 
-msgid "Not signed by you.\n"
-msgstr ""
-
 #, c-format
 msgid "You have signed these user IDs on key %s:\n"
 msgstr "Aţi semnat aceste ID-uri utilizator pe cheia %s:\n"
index 4601bf6..d522a21 100644 (file)
--- a/po/ru.po
+++ b/po/ru.po
@@ -1682,6 +1682,14 @@ msgid "WARNING: '%s' is an empty file\n"
 msgstr "Внимание: файл '%s' пуст\n"
 
 #, c-format
+msgid "cipher algorithm '%s' may not be used in %s mode\n"
+msgstr "алгоритм шифрования '%s' нельзя использовать в режиме %s\n"
+
+#, c-format
+msgid "digest algorithm '%s' may not be used in %s mode\n"
+msgstr "хеш-функцию '%s' нельзя использовать в режиме %s\n"
+
+#, c-format
 msgid "reading from '%s'\n"
 msgstr "чтение из '%s'\n"
 
@@ -1693,10 +1701,6 @@ msgstr ""
 "          нарушает предпочтения получателя\n"
 
 #, c-format
-msgid "cipher algorithm '%s' may not be used in %s mode\n"
-msgstr "алгоритм шифрования '%s' нельзя использовать в режиме %s\n"
-
-#, c-format
 msgid "WARNING: key %s is not suitable for encryption in %s mode\n"
 msgstr "Внимание: ключ %s не подходит для шифрования в режиме %s\n"
 
@@ -1955,6 +1959,11 @@ msgstr "быстро подписать ключ"
 msgid "quickly sign a key locally"
 msgstr "быстро подписать ключ локально"
 
+#, fuzzy
+#| msgid "quickly revoke a user-id"
+msgid "quickly revoke a key signature"
+msgstr "быстро отозвать идентификатор пользователя"
+
 msgid "sign a key"
 msgstr "подписать ключ"
 
@@ -2423,10 +2432,6 @@ msgid "%s does not yet work with %s\n"
 msgstr "%s пока не работает совместно с %s!\n"
 
 #, c-format
-msgid "digest algorithm '%s' may not be used in %s mode\n"
-msgstr "хеш-функцию '%s' нельзя использовать в режиме %s\n"
-
-#, c-format
 msgid "compression algorithm '%s' may not be used in %s mode\n"
 msgstr "алгоритм сжатия '%s' нельзя использовать в режиме %s\n"
 
@@ -3535,6 +3540,15 @@ msgid "Nothing to sign.\n"
 msgstr "Подписывать нечего.\n"
 
 #, c-format
+msgid "Not signed by you.\n"
+msgstr "Вами не подписано.\n"
+
+#, fuzzy, c-format
+#| msgid "checking created signature failed: %s\n"
+msgid "revoking the key signature failed: %s\n"
+msgstr "сбой проверки созданной подписи: %s\n"
+
+#, c-format
 msgid "'%s' is not a valid expiration time\n"
 msgstr "'%s' - не допустимый срок действия\n"
 
@@ -3831,9 +3845,6 @@ msgstr "Вы уверены, что хотите отозвать? (y/N) "
 msgid "Create a revocation certificate for this signature? (y/N) "
 msgstr "Создать сертификат отзыва для данной подписи? (y/N) "
 
-msgid "Not signed by you.\n"
-msgstr "Вами не подписано.\n"
-
 #, c-format
 msgid "You have signed these user IDs on key %s:\n"
 msgstr "Вы подписали эти идентификаторы пользователей на ключе %s:\n"
index b71e5d0..a1e12cd 100644 (file)
--- a/po/sk.po
+++ b/po/sk.po
@@ -1785,6 +1785,14 @@ msgid "WARNING: '%s' is an empty file\n"
 msgstr "VAROVANIE: súbor `%s' je prázdny\n"
 
 #, fuzzy, c-format
+msgid "cipher algorithm '%s' may not be used in %s mode\n"
+msgstr "nemôžete použiť šifrovací algoritmus \"%s\" v móde %s\n"
+
+#, fuzzy, c-format
+msgid "digest algorithm '%s' may not be used in %s mode\n"
+msgstr "nemôžete použiť hashovací algoritmus \"%s\" v móde %s\n"
+
+#, fuzzy, c-format
 #| msgid "reading from `%s'\n"
 msgid "reading from '%s'\n"
 msgstr "čítam z `%s'\n"
@@ -1795,10 +1803,6 @@ msgid ""
 msgstr "vyžiadaná symetrická šifra %s (%d) nevyhovuje predvoľbám príjemcu\n"
 
 #, fuzzy, c-format
-msgid "cipher algorithm '%s' may not be used in %s mode\n"
-msgstr "nemôžete použiť šifrovací algoritmus \"%s\" v móde %s\n"
-
-#, fuzzy, c-format
 msgid "WARNING: key %s is not suitable for encryption in %s mode\n"
 msgstr "VAROVÁNÍ: použitie parametra \"%s\" sa neodporúča\n"
 
@@ -2086,6 +2090,11 @@ msgstr "podpísať kľúč"
 msgid "quickly sign a key locally"
 msgstr "podpísať kľúč lokálne"
 
+#, fuzzy
+#| msgid "generate a new key pair"
+msgid "quickly revoke a key signature"
+msgstr "vytvoriť nový pár kľúčov"
+
 msgid "sign a key"
 msgstr "podpísať kľúč"
 
@@ -2580,10 +2589,6 @@ msgid "%s does not yet work with %s\n"
 msgstr "%s ešte nepracuje s %s\n"
 
 #, fuzzy, c-format
-msgid "digest algorithm '%s' may not be used in %s mode\n"
-msgstr "nemôžete použiť hashovací algoritmus \"%s\" v móde %s\n"
-
-#, fuzzy, c-format
 msgid "compression algorithm '%s' may not be used in %s mode\n"
 msgstr "nemôžete použiť kompresný algoritmus \"%s\" v móde %s\n"
 
@@ -3757,6 +3762,15 @@ msgid "Nothing to sign.\n"
 msgstr "Nič na podpísanie kľúčom %08lX\n"
 
 #, fuzzy, c-format
+msgid "Not signed by you.\n"
+msgstr "   podpísané %08lX v %s%s\n"
+
+#, fuzzy, c-format
+#| msgid "checking created signature failed: %s\n"
+msgid "revoking the key signature failed: %s\n"
+msgstr "kontrola vytvoreného podpisu sa nepodarila: %s\n"
+
+#, fuzzy, c-format
 msgid "'%s' is not a valid expiration time\n"
 msgstr "%s nie je platná znaková sada\n"
 
@@ -4060,10 +4074,6 @@ msgstr "Ste si istý, že ho chcete stále revokovať? (a/N) "
 msgid "Create a revocation certificate for this signature? (y/N) "
 msgstr "Vytvoriť pre tento podpis revokačný certifikát? (a/N)"
 
-#, fuzzy
-msgid "Not signed by you.\n"
-msgstr "   podpísané %08lX v %s%s\n"
-
 #, fuzzy, c-format
 msgid "You have signed these user IDs on key %s:\n"
 msgstr "Podpísali ste nasledujúce identifikátory užívateľa:\n"
index 7e20e3e..68dbe8a 100644 (file)
--- a/po/sv.po
+++ b/po/sv.po
@@ -1878,6 +1878,17 @@ msgid "WARNING: '%s' is an empty file\n"
 msgstr "VARNING: \"%s\" är en tom fil\n"
 
 #, fuzzy, c-format
+#| msgid "you may not use cipher algorithm `%s' while in %s mode\n"
+msgid "cipher algorithm '%s' may not be used in %s mode\n"
+msgstr "du får inte använda chifferalgoritmen \"%s\" när du är i %s-läget\n"
+
+#, fuzzy, c-format
+#| msgid "you may not use digest algorithm `%s' while in %s mode\n"
+msgid "digest algorithm '%s' may not be used in %s mode\n"
+msgstr ""
+"du får inte använda sammandragsalgoritmen \"%s\" när du är i %s-läget\n"
+
+#, fuzzy, c-format
 #| msgid "reading from `%s'\n"
 msgid "reading from '%s'\n"
 msgstr "läser från \"%s\"\n"
@@ -1890,11 +1901,6 @@ msgstr ""
 "mottagarinställningarna\n"
 
 #, fuzzy, c-format
-#| msgid "you may not use cipher algorithm `%s' while in %s mode\n"
-msgid "cipher algorithm '%s' may not be used in %s mode\n"
-msgstr "du får inte använda chifferalgoritmen \"%s\" när du är i %s-läget\n"
-
-#, fuzzy, c-format
 #| msgid "WARNING: \"%s\" is an obsolete option - it has no effect\n"
 msgid "WARNING: key %s is not suitable for encryption in %s mode\n"
 msgstr "VARNING: \"%s\" är en föråldrad flagga - den har ingen effekt\n"
@@ -2181,6 +2187,11 @@ msgstr "signera en nyckel"
 msgid "quickly sign a key locally"
 msgstr "signera en nyckel lokalt"
 
+#, fuzzy
+#| msgid "generate a new key pair"
+msgid "quickly revoke a key signature"
+msgstr "generera ett nytt nyckelpar"
+
 msgid "sign a key"
 msgstr "signera en nyckel"
 
@@ -2701,12 +2712,6 @@ msgid "%s does not yet work with %s\n"
 msgstr "%s fungerar ännu inte med  %s\n"
 
 #, fuzzy, c-format
-#| msgid "you may not use digest algorithm `%s' while in %s mode\n"
-msgid "digest algorithm '%s' may not be used in %s mode\n"
-msgstr ""
-"du får inte använda sammandragsalgoritmen \"%s\" när du är i %s-läget\n"
-
-#, fuzzy, c-format
 #| msgid "you may not use compression algorithm `%s' while in %s mode\n"
 msgid "compression algorithm '%s' may not be used in %s mode\n"
 msgstr ""
@@ -3881,6 +3886,15 @@ msgstr "Ingen sådan användaridentitet.\n"
 msgid "Nothing to sign.\n"
 msgstr "Det finns inget att signera med nyckeln %s\n"
 
+#, c-format
+msgid "Not signed by you.\n"
+msgstr "Inte signerad av dig.\n"
+
+#, fuzzy, c-format
+#| msgid "checking created signature failed: %s\n"
+msgid "revoking the key signature failed: %s\n"
+msgstr "kontroll av den skapade signaturen misslyckades: %s\n"
+
 #, fuzzy, c-format
 #| msgid "`%s' is not a valid signature expiration\n"
 msgid "'%s' is not a valid expiration time\n"
@@ -4195,9 +4209,6 @@ msgstr "Är du säker på att du fortfarande vill spärra den? (j/N)"
 msgid "Create a revocation certificate for this signature? (y/N) "
 msgstr "Vill du skapa ett spärrcertifikat för denna signatur? (j/N)"
 
-msgid "Not signed by you.\n"
-msgstr "Inte signerad av dig.\n"
-
 #, c-format
 msgid "You have signed these user IDs on key %s:\n"
 msgstr "Du har signerat följande användaridentiteter med nyckeln %s:\n"
index ce56448..651d671 100644 (file)
--- a/po/tr.po
+++ b/po/tr.po
@@ -1825,6 +1825,16 @@ msgid "WARNING: '%s' is an empty file\n"
 msgstr "UYARI: \"%s\" dosyası boş\n"
 
 #, fuzzy, c-format
+#| msgid "you may not use cipher algorithm `%s' while in %s mode\n"
+msgid "cipher algorithm '%s' may not be used in %s mode\n"
+msgstr "%2$s kipindeyken '%1$s' şifreleme algoritması kullanılamaz\n"
+
+#, fuzzy, c-format
+#| msgid "you may not use digest algorithm `%s' while in %s mode\n"
+msgid "digest algorithm '%s' may not be used in %s mode\n"
+msgstr "%2$s kipindeyken '%1$s' özet algoritması kullanılamaz\n"
+
+#, fuzzy, c-format
 #| msgid "reading from `%s'\n"
 msgid "reading from '%s'\n"
 msgstr "`%s'den okunuyor\n"
@@ -1837,11 +1847,6 @@ msgstr ""
 "zorlanıyor\n"
 
 #, fuzzy, c-format
-#| msgid "you may not use cipher algorithm `%s' while in %s mode\n"
-msgid "cipher algorithm '%s' may not be used in %s mode\n"
-msgstr "%2$s kipindeyken '%1$s' şifreleme algoritması kullanılamaz\n"
-
-#, fuzzy, c-format
 #| msgid "WARNING: \"%s\" is an obsolete option - it has no effect\n"
 msgid "WARNING: key %s is not suitable for encryption in %s mode\n"
 msgstr "UYARI: \"%s\" seçeneği eskidi - artık etkisiz\n"
@@ -2125,6 +2130,11 @@ msgstr "bir anahtarı imzalar"
 msgid "quickly sign a key locally"
 msgstr "bir anahtarı yerel olarak imzalar"
 
+#, fuzzy
+#| msgid "generate a new key pair"
+msgid "quickly revoke a key signature"
+msgstr "yeni bir anahtar çifti üretir"
+
 msgid "sign a key"
 msgstr "bir anahtarı imzalar"
 
@@ -2634,11 +2644,6 @@ msgid "%s does not yet work with %s\n"
 msgstr "%s, %s ile henüz çalışmıyor\n"
 
 #, fuzzy, c-format
-#| msgid "you may not use digest algorithm `%s' while in %s mode\n"
-msgid "digest algorithm '%s' may not be used in %s mode\n"
-msgstr "%2$s kipindeyken '%1$s' özet algoritması kullanılamaz\n"
-
-#, fuzzy, c-format
 #| msgid "you may not use compression algorithm `%s' while in %s mode\n"
 msgid "compression algorithm '%s' may not be used in %s mode\n"
 msgstr "%2$s kipindeyken '%1$s' sıkıştırma algoritması kullanılamaz\n"
@@ -3824,6 +3829,15 @@ msgstr "Böyle bir kullanıcı kimliği yok.\n"
 msgid "Nothing to sign.\n"
 msgstr "%s anahtarı ile imzalanacak hiçbir şey yok\n"
 
+#, c-format
+msgid "Not signed by you.\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "checking created signature failed: %s\n"
+msgid "revoking the key signature failed: %s\n"
+msgstr "oluşturulan imzanın denetimi başarısız: %s\n"
+
 #, fuzzy, c-format
 #| msgid "`%s' is not a valid signature expiration\n"
 msgid "'%s' is not a valid expiration time\n"
@@ -4147,9 +4161,6 @@ msgstr ""
 "Bu imza için bir yürürlükten kaldırma sertifikası oluşturulsun mu? (e/H veya "
 "y/N) "
 
-msgid "Not signed by you.\n"
-msgstr ""
-
 #, c-format
 msgid "You have signed these user IDs on key %s:\n"
 msgstr "Bu kullanıcı kimliklerini %s anahtarı üzerinde imzalamışsınız:\n"
index f542ec1..c2ff82a 100644 (file)
--- a/po/uk.po
+++ b/po/uk.po
@@ -1704,6 +1704,16 @@ msgid "WARNING: '%s' is an empty file\n"
 msgstr "УВАГА: файл «%s» є порожнім\n"
 
 #, c-format
+msgid "cipher algorithm '%s' may not be used in %s mode\n"
+msgstr "алгоритм шифрування «%s» не можна використовувати у режимі %s\n"
+
+#, c-format
+msgid "digest algorithm '%s' may not be used in %s mode\n"
+msgstr ""
+"алгоритм створення контрольних сум «%s» не можна використовувати у режимі "
+"%s\n"
+
+#, c-format
 msgid "reading from '%s'\n"
 msgstr "читання з «%s»\n"
 
@@ -1715,10 +1725,6 @@ msgstr ""
 "параметрам отримувача\n"
 
 #, c-format
-msgid "cipher algorithm '%s' may not be used in %s mode\n"
-msgstr "алгоритм шифрування «%s» не можна використовувати у режимі %s\n"
-
-#, c-format
 msgid "WARNING: key %s is not suitable for encryption in %s mode\n"
 msgstr "УВАГА: ключ %s не можна використовувати для шифрування у режимі %s\n"
 
@@ -1980,6 +1986,11 @@ msgstr "швидко підписати ключ"
 msgid "quickly sign a key locally"
 msgstr "швидко підписати ключ локально"
 
+#, fuzzy
+#| msgid "quickly revoke a user-id"
+msgid "quickly revoke a key signature"
+msgstr "швидке відкликання ідентифікатора користувача"
+
 msgid "sign a key"
 msgstr "підписати ключ"
 
@@ -2459,12 +2470,6 @@ msgid "%s does not yet work with %s\n"
 msgstr "%s ще не може працювати разом з %s\n"
 
 #, c-format
-msgid "digest algorithm '%s' may not be used in %s mode\n"
-msgstr ""
-"алгоритм створення контрольних сум «%s» не можна використовувати у режимі "
-"%s\n"
-
-#, c-format
 msgid "compression algorithm '%s' may not be used in %s mode\n"
 msgstr "алгоритм стискання «%s» не можна використовувати у режимі %s\n"
 
@@ -3584,6 +3589,15 @@ msgid "Nothing to sign.\n"
 msgstr "Нічого підписувати.\n"
 
 #, c-format
+msgid "Not signed by you.\n"
+msgstr "Не підписано вами.\n"
+
+#, fuzzy, c-format
+#| msgid "checking created signature failed: %s\n"
+msgid "revoking the key signature failed: %s\n"
+msgstr "невдала спроба перевірити створений підпис: %s\n"
+
+#, c-format
 msgid "'%s' is not a valid expiration time\n"
 msgstr "«%s» не є коректним записом завершення строку дії\n"
 
@@ -3884,9 +3898,6 @@ msgstr "Ви справді бажаєте відкликати його? (y/N 
 msgid "Create a revocation certificate for this signature? (y/N) "
 msgstr "Створити сертифікат відкликання для цього підпису? (y/N або т/Н) "
 
-msgid "Not signed by you.\n"
-msgstr "Не підписано вами.\n"
-
 #, c-format
 msgid "You have signed these user IDs on key %s:\n"
 msgstr "Вами підписано ці ідентифікатори користувачів у ключі %s:\n"
index fde65c1..f3fcc60 100644 (file)
@@ -1679,6 +1679,14 @@ msgid "WARNING: '%s' is an empty file\n"
 msgstr "警告:‘%s’是一个空文件\n"
 
 #, c-format
+msgid "cipher algorithm '%s' may not be used in %s mode\n"
+msgstr "密文算法 ‘%s’ 可能不能被用于 %s 模式\n"
+
+#, c-format
+msgid "digest algorithm '%s' may not be used in %s mode\n"
+msgstr "摘要算法‘%s’不能在 %s 模式下使用\n"
+
+#, c-format
 msgid "reading from '%s'\n"
 msgstr "正在从‘%s’读取\n"
 
@@ -1688,10 +1696,6 @@ msgid ""
 msgstr "警告: 强制对称密文 %s (%d) 与接收者的偏好设置冲突\n"
 
 #, c-format
-msgid "cipher algorithm '%s' may not be used in %s mode\n"
-msgstr "密文算法 ‘%s’ 可能不能被用于 %s 模式\n"
-
-#, c-format
 msgid "WARNING: key %s is not suitable for encryption in %s mode\n"
 msgstr "警告: 密钥 %s 在 %s 模式下不适用于加密\n"
 
@@ -1941,6 +1945,11 @@ msgstr "快速签名一个密钥"
 msgid "quickly sign a key locally"
 msgstr "快速本地签名一个密钥"
 
+#, fuzzy
+#| msgid "quickly revoke a user-id"
+msgid "quickly revoke a key signature"
+msgstr "快速吊销一个用户标识"
+
 msgid "sign a key"
 msgstr "签名一个密钥"
 
@@ -2392,10 +2401,6 @@ msgid "%s does not yet work with %s\n"
 msgstr "%s 尚不能和 %s 并用\n"
 
 #, c-format
-msgid "digest algorithm '%s' may not be used in %s mode\n"
-msgstr "摘要算法‘%s’不能在 %s 模式下使用\n"
-
-#, c-format
 msgid "compression algorithm '%s' may not be used in %s mode\n"
 msgstr "压缩算法‘%s’不能在 %s 模式下使用\n"
 
@@ -3464,6 +3469,15 @@ msgid "Nothing to sign.\n"
 msgstr "没有可被签名的东西。\n"
 
 #, c-format
+msgid "Not signed by you.\n"
+msgstr "并非由您签名。\n"
+
+#, fuzzy, c-format
+#| msgid "checking created signature failed: %s\n"
+msgid "revoking the key signature failed: %s\n"
+msgstr "检查已建立的签名时发生错误: %s\n"
+
+#, c-format
 msgid "'%s' is not a valid expiration time\n"
 msgstr "‘%s’不是一个有效的过期时间\n"
 
@@ -3746,9 +3760,6 @@ msgstr "您确定您仍然想要吊销它吗?(y/N) "
 msgid "Create a revocation certificate for this signature? (y/N) "
 msgstr "要为这份签名生成一份吊销证书吗?(y/N) "
 
-msgid "Not signed by you.\n"
-msgstr "并非由您签名。\n"
-
 #, c-format
 msgid "You have signed these user IDs on key %s:\n"
 msgstr "您已经签名来密钥 %s 上的这些用户标识:\n"
index 049d3d3..8d8cf1a 100644 (file)
@@ -1716,6 +1716,16 @@ msgstr "'%s' 已經被壓縮了\n"
 msgid "WARNING: '%s' is an empty file\n"
 msgstr "警告: '%s' 是個空檔案\n"
 
+#, fuzzy, c-format
+#| msgid "you may not use cipher algorithm '%s' while in %s mode\n"
+msgid "cipher algorithm '%s' may not be used in %s mode\n"
+msgstr "你不該將 '%s' 編密演算法用於 %s 模式\n"
+
+#, fuzzy, c-format
+#| msgid "you may not use digest algorithm '%s' while in %s mode\n"
+msgid "digest algorithm '%s' may not be used in %s mode\n"
+msgstr "你不該將 '%s' 摘要演算法用於 %s 模式\n"
+
 #, c-format
 msgid "reading from '%s'\n"
 msgstr "正在從 '%s' 讀取\n"
@@ -1726,11 +1736,6 @@ msgid ""
 msgstr "警告: 強迫使用 %s (%d) 對稱式編密法會違反收件者偏好設定\n"
 
 #, fuzzy, c-format
-#| msgid "you may not use cipher algorithm '%s' while in %s mode\n"
-msgid "cipher algorithm '%s' may not be used in %s mode\n"
-msgstr "你不該將 '%s' 編密演算法用於 %s 模式\n"
-
-#, fuzzy, c-format
 #| msgid "WARNING: \"%s%s\" is an obsolete option - it has no effect\n"
 msgid "WARNING: key %s is not suitable for encryption in %s mode\n"
 msgstr "警告: \"%s%s\" 是已廢棄的選項 - 沒有效果\n"
@@ -1990,6 +1995,11 @@ msgstr "快速簽署金鑰"
 msgid "quickly sign a key locally"
 msgstr "快速在本機簽署金鑰"
 
+#, fuzzy
+#| msgid "quickly generate a new key pair"
+msgid "quickly revoke a key signature"
+msgstr "快速產生新的金鑰對"
+
 msgid "sign a key"
 msgstr "簽署金鑰"
 
@@ -2455,11 +2465,6 @@ msgid "%s does not yet work with %s\n"
 msgstr "%s 還沒辦法跟 %s 一起運作\n"
 
 #, fuzzy, c-format
-#| msgid "you may not use digest algorithm '%s' while in %s mode\n"
-msgid "digest algorithm '%s' may not be used in %s mode\n"
-msgstr "你不該將 '%s' 摘要演算法用於 %s 模式\n"
-
-#, fuzzy, c-format
 #| msgid "you may not use compression algorithm '%s' while in %s mode\n"
 msgid "compression algorithm '%s' may not be used in %s mode\n"
 msgstr "你不該將 '%s' 壓縮演算法用於 %s 模式\n"
@@ -3559,6 +3564,15 @@ msgstr "沒有相符的使用者 ID."
 msgid "Nothing to sign.\n"
 msgstr "沒有東西可以簽署.\n"
 
+#, c-format
+msgid "Not signed by you.\n"
+msgstr "並非由你所簽署.\n"
+
+#, fuzzy, c-format
+#| msgid "checking created signature failed: %s\n"
+msgid "revoking the key signature failed: %s\n"
+msgstr "檢查已建立的簽章時出錯: %s\n"
+
 #, fuzzy, c-format
 #| msgid "'%s' is not a valid signature expiration\n"
 msgid "'%s' is not a valid expiration time\n"
@@ -3862,9 +3876,6 @@ msgstr "你確定仍然想要撤銷它嗎? (y/N) "
 msgid "Create a revocation certificate for this signature? (y/N) "
 msgstr "要為這份簽章建立一份撤銷憑證嗎? (y/N) "
 
-msgid "Not signed by you.\n"
-msgstr "並非由你所簽署.\n"
-
 #, c-format
 msgid "You have signed these user IDs on key %s:\n"
 msgstr "你已經簽署了金鑰 %s 上的這些使用者 ID:\n"
index cbd1f9f..32be6ab 100644 (file)
@@ -17,7 +17,7 @@
 
 ## Process this file with automake to produce Makefile.in
 
-EXTRA_DIST = ChangeLog-2011 scdaemon-w32info.rc
+EXTRA_DIST = ChangeLog-2011 scdaemon-w32info.rc scdaemon.w32-manifest.in
 
 libexec_PROGRAMS = scdaemon
 
@@ -26,7 +26,7 @@ AM_CPPFLAGS = $(LIBUSB_CPPFLAGS)
 include $(top_srcdir)/am/cmacros.am
 
 if HAVE_W32_SYSTEM
-resource_objs += scdaemon-w32info.o
+scdaemon_robjs = $(resource_objs) scdaemon-w32info.o
 endif
 
 AM_CFLAGS =  $(LIBGCRYPT_CFLAGS) \
@@ -48,4 +48,4 @@ scdaemon_SOURCES = \
 scdaemon_LDADD = $(libcommonpth) \
        $(LIBGCRYPT_LIBS) $(KSBA_LIBS) $(LIBASSUAN_LIBS) $(NPTH_LIBS) \
        $(LIBUSB_LIBS) $(GPG_ERROR_LIBS) \
-        $(LIBINTL) $(DL_LIBS) $(NETLIBS) $(LIBICONV) $(resource_objs)
+        $(LIBINTL) $(DL_LIBS) $(NETLIBS) $(LIBICONV) $(scdaemon_robjs)
index dfd9451..f53194b 100644 (file)
@@ -67,7 +67,7 @@
 #include "ccid-driver.h"
 
 struct dev_list {
-  struct ccid_dev_table *ccid_table;
+  void *table;
   const char *portstr;
   int idx;
   int idx_max;
@@ -502,6 +502,13 @@ host_sw_string (long err)
     case SW_HOST_NO_PINPAD: return "no pinpad";
     case SW_HOST_ALREADY_CONNECTED: return "already connected";
     case SW_HOST_CANCELLED: return "cancelled";
+    case SW_HOST_USB_OTHER:    return "USB general error";
+    case SW_HOST_USB_IO:       return "USB I/O error";
+    case SW_HOST_USB_ACCESS:   return "USB permission denied";
+    case SW_HOST_USB_NO_DEVICE:return "USB no device";
+    case SW_HOST_USB_BUSY:     return "USB busy";
+    case SW_HOST_USB_TIMEOUT:  return "USB timeout";
+    case SW_HOST_USB_OVERFLOW: return "USB overflow";
     default: return "unknown host status error";
     }
 }
@@ -675,7 +682,7 @@ pcsc_get_status (int slot, unsigned int *status, int on_wire)
     reader_table[slot].pcsc.current_state =
       (rdrstates[0].event_state & ~PCSC_STATE_CHANGED);
 
-  if (DBG_CARD_IO)
+  if (DBG_READER)
     log_debug
       ("pcsc_get_status_change: %s%s%s%s%s%s%s%s%s%s\n",
        (rdrstates[0].event_state & PCSC_STATE_IGNORE)? " ignore":"",
@@ -1527,7 +1534,7 @@ open_ccid_reader (struct dev_list *dl)
     return -1;
   slotp = reader_table + slot;
 
-  err = ccid_open_reader (dl->portstr, dl->idx, dl->ccid_table,
+  err = ccid_open_reader (dl->portstr, dl->idx, dl->table,
                           &slotp->ccid.handle, &slotp->rdrname);
   if (!err)
     {
@@ -1886,14 +1893,14 @@ apdu_dev_list_start (const char *portstr, struct dev_list **l_p)
 #ifdef HAVE_LIBUSB
   if (opt.disable_ccid)
     {
-      dl->ccid_table = NULL;
+      dl->table = NULL;
       dl->idx_max = 1;
     }
   else
     {
       gpg_error_t err;
 
-      err = ccid_dev_scan (&dl->idx_max, &dl->ccid_table);
+      err = ccid_dev_scan (&dl->idx_max, &dl->table);
       if (err)
         return err;
 
@@ -1915,7 +1922,7 @@ apdu_dev_list_start (const char *portstr, struct dev_list **l_p)
         }
     }
 #else
-  dl->ccid_table = NULL;
+  dl->table = NULL;
   dl->idx_max = 1;
 #endif /* HAVE_LIBUSB */
 
@@ -1927,8 +1934,8 @@ void
 apdu_dev_list_finish (struct dev_list *dl)
 {
 #ifdef HAVE_LIBUSB
-  if (dl->ccid_table)
-    ccid_dev_scan_finish (dl->ccid_table, dl->idx_max);
+  if (dl->table)
+    ccid_dev_scan_finish (dl->table, dl->idx_max);
 #endif
   xfree (dl);
   npth_mutex_unlock (&reader_table_lock);
@@ -2044,7 +2051,7 @@ apdu_open_reader (struct dev_list *dl, int app_empty)
   int slot;
 
 #ifdef HAVE_LIBUSB
-  if (dl->ccid_table)
+  if (dl->table)
     { /* CCID readers.  */
       int readerno;
 
@@ -2081,7 +2088,7 @@ apdu_open_reader (struct dev_list *dl, int app_empty)
 
       while (dl->idx < dl->idx_max)
         {
-          unsigned int bai = ccid_get_BAI (dl->idx, dl->ccid_table);
+          unsigned int bai = ccid_get_BAI (dl->idx, dl->table);
 
           if (DBG_READER)
             log_debug ("apdu_open_reader: BAI=%x\n", bai);
index 1392aab..1cd04c2 100644 (file)
@@ -72,7 +72,15 @@ enum {
   SW_HOST_ABORTED       = 0x1000d,
   SW_HOST_NO_PINPAD     = 0x1000e,
   SW_HOST_ALREADY_CONNECTED = 0x1000f,
-  SW_HOST_CANCELLED     = 0x10010
+  SW_HOST_CANCELLED     = 0x10010,
+  SW_HOST_DEVICE_ACCESS = 0x10011,
+  SW_HOST_USB_OTHER     = 0x10020,
+  SW_HOST_USB_IO        = 0x10021,
+  SW_HOST_USB_ACCESS    = 0x10023,
+  SW_HOST_USB_NO_DEVICE = 0x10024,
+  SW_HOST_USB_BUSY      = 0x10026,
+  SW_HOST_USB_TIMEOUT   = 0x10027,
+  SW_HOST_USB_OVERFLOW  = 0x10028
 };
 
 struct dev_list;
index ccc360f..6245a53 100644 (file)
@@ -1,6 +1,7 @@
 /* app-openpgp.c - The OpenPGP card application.
- * Copyright (C) 2003, 2004, 2005, 2007, 2008,
- *               2009, 2013, 2014, 2015 Free Software Foundation, Inc.
+ * Copyright (C) 2003-2005, 2007-2009,
+ *               2013-2015 Free Software Foundation, Inc.
+ * Copyright (C) 2003-2005, 2007-2009, 2013-2015, 2020 g10 Code GmbH
  *
  * This file is part of GnuPG.
  *
 #include <assert.h>
 #include <time.h>
 
-#if GNUPG_MAJOR_VERSION == 1
-/* This is used with GnuPG version < 1.9.  The code has been source
-   copied from the current GnuPG >= 1.9  and is maintained over
-   there. */
-#include "options.h"
-#include "errors.h"
-#include "memory.h"
-#include "cardglue.h"
-#else /* GNUPG_MAJOR_VERSION != 1 */
 #include "scdaemon.h"
-#endif /* GNUPG_MAJOR_VERSION != 1 */
 
 #include "../common/util.h"
 #include "../common/i18n.h"
@@ -176,6 +167,7 @@ struct app_local_s {
                            is usually only required for cross checks
                            because the length of an S-expression is
                            implicitly available.  */
+    unsigned char keygrip_str[41]; /* The keygrip, null terminated */
   } pk[3];
 
   unsigned char status_indicator; /* The card status indicator.  */
@@ -1291,7 +1283,6 @@ get_remaining_tries (app_t app, int adminpw)
    the according hex representation to FPR.  Caller must have provide
    a buffer at FPR of least 41 bytes.  Returns 0 on success or an
    error code. */
-#if GNUPG_MAJOR_VERSION > 1
 static gpg_error_t
 retrieve_fpr_from_card (app_t app, int keyno, char *fpr)
 {
@@ -1310,7 +1301,6 @@ retrieve_fpr_from_card (app_t app, int keyno, char *fpr)
   xfree (relptr);
   return err;
 }
-#endif /*GNUPG_MAJOR_VERSION > 1*/
 
 
 /* Retrieve the public key material for the RSA key, whose fingerprint
@@ -1319,7 +1309,6 @@ retrieve_fpr_from_card (app_t app, int keyno, char *fpr)
    public exponent at E and ELEN.  Returns zero on success, an error
    code on failure.  Caller must release the allocated buffers at M
    and E if the function returns success.  */
-#if GNUPG_MAJOR_VERSION > 1
 static gpg_error_t
 retrieve_key_material (FILE *fp, const char *hexkeyid,
                        const unsigned char **m, size_t *mlen,
@@ -1424,7 +1413,6 @@ retrieve_key_material (FILE *fp, const char *hexkeyid,
   xfree (line);
   return err;
 }
-#endif /*GNUPG_MAJOR_VERSION > 1*/
 
 
 static gpg_error_t
@@ -1638,6 +1626,24 @@ ecc_read_pubkey (app_t app, ctrl_t ctrl, u32 created_at, int keyno,
 }
 
 
+/* Compute the keygrip form the local info and store it there.  */
+static gpg_error_t
+store_keygrip (app_t app, int keyno)
+{
+  gpg_error_t err;
+  unsigned char grip[20];
+
+  err = keygrip_from_canon_sexp (app->app_local->pk[keyno].key,
+                                 app->app_local->pk[keyno].keylen,
+                                 grip);
+  if (err)
+    return err;
+
+  bin2hex (grip, 20, app->app_local->pk[keyno].keygrip_str);
+  return 0;
+}
+
+
 /* Parse tag-length-value data for public key in BUFFER of BUFLEN
    length.  Key of KEYNO in APP is updated with an S-expression of
    public key.  When CTRL is not NULL, fingerprint is computed with
@@ -1689,6 +1695,8 @@ read_public_key (app_t app, ctrl_t ctrl, u32 created_at, int keyno,
       app->app_local->pk[keyno].key = keybuf;
       /* Decrement for trailing '\0' */
       app->app_local->pk[keyno].keylen = len - 1;
+
+      err = store_keygrip (app, keyno);
     }
 
   return err;
@@ -1705,7 +1713,6 @@ read_public_key (app_t app, ctrl_t ctrl, u32 created_at, int keyno,
    consuming to send it just for the fun of it. However, given that we
    use the same code in gpg 1.4, we can't use the gcry S-expression
    here but need to open encode it. */
-#if GNUPG_MAJOR_VERSION > 1
 static gpg_error_t
 get_public_key (app_t app, int keyno)
 {
@@ -1756,6 +1763,12 @@ get_public_key (app_t app, int keyno)
                                      2, le_value, &buffer, &buflen);
       if (err)
         {
+          /* Yubikey returns wrong code.  Fix it up.  */
+          /*
+           * NOTE: It's not correct to blindly change the error code,
+           * however, for our experiences, it is only Yubikey...
+           */
+          err = gpg_error (GPG_ERR_NO_OBJ);
           log_error (_("reading public key failed: %s\n"), gpg_strerror (err));
           goto leave;
         }
@@ -1836,17 +1849,18 @@ get_public_key (app_t app, int keyno)
       app->app_local->pk[keyno].key = (unsigned char*)keybuf;
       /* Decrement for trailing '\0' */
       app->app_local->pk[keyno].keylen = len - 1;
+
+      err = store_keygrip (app, keyno);
     }
 
  leave:
   /* Set a flag to indicate that we tried to read the key.  */
-  app->app_local->pk[keyno].read_done = 1;
+  if (!err)
+    app->app_local->pk[keyno].read_done = 1;
 
   xfree (buffer);
   return err;
 }
-#endif /* GNUPG_MAJOR_VERSION > 1 */
-
 
 
 /* Send the KEYPAIRINFO back. KEY needs to be in the range [1,3].
@@ -1856,11 +1870,6 @@ send_keypair_info (app_t app, ctrl_t ctrl, int key)
 {
   int keyno = key - 1;
   gpg_error_t err = 0;
-  /* Note that GnuPG 1.x does not need this and it would be too time
-     consuming to send it just for the fun of it. */
-#if GNUPG_MAJOR_VERSION > 1
-  unsigned char grip[20];
-  char gripstr[41];
   char idbuf[50];
   const char *usage;
 
@@ -1872,14 +1881,6 @@ send_keypair_info (app_t app, ctrl_t ctrl, int key)
   if (!app->app_local->pk[keyno].key)
     goto leave; /* No such key - ignore. */
 
-  err = keygrip_from_canon_sexp (app->app_local->pk[keyno].key,
-                                 app->app_local->pk[keyno].keylen,
-                                 grip);
-  if (err)
-    goto leave;
-
-  bin2hex (grip, 20, gripstr);
-
   switch (keyno)
     {
     case 0: usage = "sc"; break;
@@ -1890,14 +1891,12 @@ send_keypair_info (app_t app, ctrl_t ctrl, int key)
 
   sprintf (idbuf, "OPENPGP.%d", keyno+1);
   send_status_info (ctrl, "KEYPAIRINFO",
-                    gripstr, 40,
+                    app->app_local->pk[keyno].keygrip_str, 40,
                     idbuf, strlen (idbuf),
                     usage, strlen (usage),
                     NULL, (size_t)0);
 
  leave:
-#endif /* GNUPG_MAJOR_VERSION > 1 */
-
   return err;
 }
 
@@ -1906,38 +1905,73 @@ send_keypair_info (app_t app, ctrl_t ctrl, int key)
 static gpg_error_t
 do_learn_status (app_t app, ctrl_t ctrl, unsigned int flags)
 {
+  gpg_error_t err = 0;
+
   (void)flags;
 
-  do_getattr (app, ctrl, "EXTCAP");
-  do_getattr (app, ctrl, "MANUFACTURER");
-  do_getattr (app, ctrl, "DISP-NAME");
-  do_getattr (app, ctrl, "DISP-LANG");
-  do_getattr (app, ctrl, "DISP-SEX");
-  do_getattr (app, ctrl, "PUBKEY-URL");
-  do_getattr (app, ctrl, "LOGIN-DATA");
-  do_getattr (app, ctrl, "KEY-FPR");
-  if (app->card_version > 0x0100)
-    do_getattr (app, ctrl, "KEY-TIME");
-  do_getattr (app, ctrl, "CA-FPR");
-  do_getattr (app, ctrl, "CHV-STATUS");
-  do_getattr (app, ctrl, "SIG-COUNTER");
-  if (app->app_local->extcap.kdf_do)
-    do_getattr (app, ctrl, "KDF");
-  if (app->app_local->extcap.private_dos)
-    {
-      do_getattr (app, ctrl, "PRIVATE-DO-1");
-      do_getattr (app, ctrl, "PRIVATE-DO-2");
-      if (app->did_chv2)
-        do_getattr (app, ctrl, "PRIVATE-DO-3");
-      if (app->did_chv3)
-        do_getattr (app, ctrl, "PRIVATE-DO-4");
-    }
-  send_keypair_info (app, ctrl, 1);
-  send_keypair_info (app, ctrl, 2);
-  send_keypair_info (app, ctrl, 3);
+  err = do_getattr (app, ctrl, "EXTCAP");
+  if (!err)
+    err = do_getattr (app, ctrl, "MANUFACTURER");
+  if (!err)
+    err = do_getattr (app, ctrl, "DISP-NAME");
+  if (!err)
+    err = do_getattr (app, ctrl, "DISP-LANG");
+  if (!err)
+    err = do_getattr (app, ctrl, "DISP-SEX");
+  if (!err)
+    err = do_getattr (app, ctrl, "PUBKEY-URL");
+  if (!err)
+    err = do_getattr (app, ctrl, "LOGIN-DATA");
+  if (!err)
+    err = do_getattr (app, ctrl, "KEY-FPR");
+  if (!err && app->card_version > 0x0100)
+    err = do_getattr (app, ctrl, "KEY-TIME");
+  if (!err)
+    err = do_getattr (app, ctrl, "CA-FPR");
+  if (!err)
+    err = do_getattr (app, ctrl, "CHV-STATUS");
+  if (!err)
+    err = do_getattr (app, ctrl, "SIG-COUNTER");
+  if (!err && app->app_local->extcap.kdf_do)
+    {
+      err = do_getattr (app, ctrl, "KDF");
+      if (gpg_err_code (err) == GPG_ERR_NO_OBJ)
+        err = 0;
+    }
+  if (!err && app->app_local->extcap.private_dos)
+    {
+      if (!err)
+        err = do_getattr (app, ctrl, "PRIVATE-DO-1");
+      if (gpg_err_code (err) == GPG_ERR_NO_OBJ)
+        err = 0;
+      if (!err)
+        err = do_getattr (app, ctrl, "PRIVATE-DO-2");
+      if (gpg_err_code (err) == GPG_ERR_NO_OBJ)
+        err = 0;
+      if (!err && app->did_chv2)
+        err = do_getattr (app, ctrl, "PRIVATE-DO-3");
+      if (gpg_err_code (err) == GPG_ERR_NO_OBJ)
+        err = 0;
+      if (!err && app->did_chv3)
+        err = do_getattr (app, ctrl, "PRIVATE-DO-4");
+      if (gpg_err_code (err) == GPG_ERR_NO_OBJ)
+        err = 0;
+    }
+  if (!err)
+    err = send_keypair_info (app, ctrl, 1);
+  if (gpg_err_code (err) == GPG_ERR_NO_OBJ)
+    err = 0;
+  if (!err)
+    err = send_keypair_info (app, ctrl, 2);
+  if (gpg_err_code (err) == GPG_ERR_NO_OBJ)
+    err = 0;
+  if (!err)
+    err = send_keypair_info (app, ctrl, 3);
+  if (gpg_err_code (err) == GPG_ERR_NO_OBJ)
+    err = 0;
   /* Note: We do not send the Cardholder Certificate, because that is
      relatively long and for OpenPGP applications not really needed.  */
-  return 0;
+  return err;
 }
 
 
@@ -1950,7 +1984,6 @@ static gpg_error_t
 do_readkey (app_t app, int advanced, const char *keyid,
             unsigned char **pk, size_t *pklen)
 {
-#if GNUPG_MAJOR_VERSION > 1
   gpg_error_t err;
   int keyno;
   unsigned char *buf;
@@ -2008,9 +2041,6 @@ do_readkey (app_t app, int advanced, const char *keyid,
     }
 
   return 0;
-#else
-  return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
-#endif
 }
 
 /* Read the standard certificate of an OpenPGP v2 card.  It is
@@ -2021,7 +2051,6 @@ static gpg_error_t
 do_readcert (app_t app, const char *certid,
              unsigned char **cert, size_t *certlen)
 {
-#if GNUPG_MAJOR_VERSION > 1
   gpg_error_t err;
   unsigned char *buffer;
   size_t buflen;
@@ -2050,9 +2079,6 @@ do_readcert (app_t app, const char *certid,
     }
   xfree (relptr);
   return err;
-#else
-  return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
-#endif
 }
 
 
@@ -2372,26 +2398,30 @@ verify_chv2 (app_t app,
       if (rc)
         return rc;
       app->did_chv2 = 1;
+
+      if (!app->did_chv1 && !app->force_chv1 && pinvalue)
+        {
+          /* For convenience we verify CHV1 here too.  We do this only if
+             the card is not configured to require a verification before
+             each CHV1 controlled operation (force_chv1) and if we are not
+             using the pinpad (PINVALUE == NULL). */
+          rc = iso7816_verify (app->slot, 0x81, pinvalue, pinlen);
+          if (gpg_err_code (rc) == GPG_ERR_BAD_PIN)
+            rc = gpg_error (GPG_ERR_PIN_NOT_SYNCED);
+          if (rc)
+            {
+              log_error (_("verify CHV%d failed: %s\n"), 1, gpg_strerror (rc));
+              flush_cache_after_error (app);
+            }
+          else
+            app->did_chv1 = 1;
+        }
     }
   else
-    rc = 0;
-
-  if (!app->did_chv1 && !app->force_chv1 && pinvalue)
     {
-      /* For convenience we verify CHV1 here too.  We do this only if
-         the card is not configured to require a verification before
-         each CHV1 controlled operation (force_chv1) and if we are not
-         using the pinpad (PINVALUE == NULL). */
-      rc = iso7816_verify (app->slot, 0x81, pinvalue, pinlen);
-      if (gpg_err_code (rc) == GPG_ERR_BAD_PIN)
-        rc = gpg_error (GPG_ERR_PIN_NOT_SYNCED);
+      rc = verify_a_chv (app, pincb, pincb_arg, 1, 0, &pinvalue, &pinlen);
       if (rc)
-        {
-          log_error (_("verify CHV%d failed: %s\n"), 1, gpg_strerror (rc));
-          flush_cache_after_error (app);
-        }
-      else
-        app->did_chv1 = 1;
+        return rc;
     }
 
   xfree (pinvalue);
@@ -2449,13 +2479,11 @@ verify_chv3 (app_t app,
 {
   int rc = 0;
 
-#if GNUPG_MAJOR_VERSION != 1
   if (!opt.allow_admin)
     {
       log_info (_("access to admin commands is not configured\n"));
       return gpg_error (GPG_ERR_EACCES);
     }
-#endif
 
   if (!app->did_chv3)
     {
@@ -2644,7 +2672,7 @@ do_writecert (app_t app, ctrl_t ctrl,
               const unsigned char *certdata, size_t certdatalen)
 {
   (void)ctrl;
-#if GNUPG_MAJOR_VERSION > 1
+
   if (strcmp (certidstr, "OPENPGP.3"))
     return gpg_error (GPG_ERR_INV_ID);
   if (!certdata || !certdatalen)
@@ -2654,9 +2682,6 @@ do_writecert (app_t app, ctrl_t ctrl,
   if (certdatalen > app->app_local->extcap.max_certlen_3)
     return gpg_error (GPG_ERR_TOO_LARGE);
   return do_setattr (app, "CERT-3", pincb, pincb_arg, certdata, certdatalen);
-#else
-  return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
-#endif
 }
 
 
@@ -3232,11 +3257,11 @@ build_ecc_privkey_template (app_t app, int keyno,
                             const unsigned char *ecc_q, size_t ecc_q_len,
                             unsigned char **result, size_t *resultlen)
 {
-  unsigned char privkey[2+2];
+  unsigned char privkey[2*(1+3)];
   size_t privkey_len;
-  unsigned char exthdr[2+2+1];
+  unsigned char exthdr[2+2+3];
   size_t exthdr_len;
-  unsigned char suffix[2+1];
+  unsigned char suffix[2+3];
   size_t suffix_len;
   unsigned char *tp;
   size_t datalen;
@@ -4345,6 +4370,89 @@ check_against_given_fingerprint (app_t app, const char *fpr, int key)
 }
 
 
+/* Check KEYIDSTR, if it's valid.
+   When KEYNO is 0, it means it's for PIN check.
+   Otherwise, KEYNO corresponds to the slot (signing, decipher and auth).
+   KEYIDSTR is either:
+    (1) Serial number
+    (2) Serial number "/" fingerprint
+    (3) Serial number "[CHV3]"
+    (4) keygrip
+
+   When KEYNO is 0 and KEYIDSTR is for a keygrip, the keygrip should
+   be to be compared is the first one (keygrip for signing).
+   When KEYNO is 1, KEYIDSTR is for a keygrip, and R_USE_AUTH is not
+   NULL, OpenPGP.1 is first tested and then OpenPGP.3.  In the latter
+   case 1 is stored at R_USE_AUTH
+ */
+static int
+check_keyidstr (app_t app, const char *keyidstr, int keyno, int *r_use_auth)
+{
+  int rc;
+  const char *s;
+  int n;
+  const char *fpr = NULL;
+
+  if (r_use_auth)
+    *r_use_auth = 0;
+
+  if (strlen (keyidstr) < 32)
+    return gpg_error (GPG_ERR_INV_ID);
+  else
+    {
+      char *serial;
+
+      for (s=keyidstr, n=0; hexdigitp (s); s++, n++)
+        ;
+
+      /* Check if it's a keygrip */
+      if (n == 40)
+        {
+          const unsigned char *keygrip_str;
+
+          keygrip_str = app->app_local->pk[keyno?keyno-1:0].keygrip_str;
+          if (!strncmp (keygrip_str, keyidstr, 40))
+            return 0;
+          else if (keyno == 1 && r_use_auth
+                   && !strncmp (app->app_local->pk[2].keygrip_str,
+                                keyidstr, 40))
+            {
+              *r_use_auth = 1;
+              return 0;
+            }
+          else
+            return gpg_error (GPG_ERR_INV_ID);
+        }
+
+      if (n != 32 || strncmp (keyidstr, "D27600012401", 12))
+        return gpg_error (GPG_ERR_INV_ID);
+      else if (!*s)
+        ; /* no fingerprint given: we allow this for now. */
+      else if (*s == '/')
+        fpr = s + 1;
+
+      serial = app_get_serialno (app);
+      if (strncmp (serial, keyidstr, 32))
+        {
+          xfree (serial);
+          return gpg_error (GPG_ERR_WRONG_CARD);
+        }
+
+      xfree (serial);
+    }
+
+  /* If a fingerprint has been specified check it against the one on
+     the card.  This is allows for a meaningful error message in case
+     the key on the card has been replaced but the shadow information
+     known to gpg was not updated.  If there is no fingerprint, gpg
+     will detect a bogus signature anyway due to the
+     verify-after-signing feature. */
+  rc = (fpr&&keyno)? check_against_given_fingerprint (app, fpr, keyno) : 0;
+
+  return rc;
+}
+
+
 /* Compute a digital signature on INDATA which is expected to be the
    raw message digest. For this application the KEYIDSTR consists of
    the serialnumber and the fingerprint delimited by a slash.
@@ -4389,10 +4497,6 @@ do_sign (app_t app, const char *keyidstr, int hashalgo,
   int rc;
   unsigned char data[19+64];
   size_t datalen;
-  unsigned char tmp_sn[20]; /* Actually 16 bytes but also for the fpr. */
-  const char *s;
-  int n;
-  const char *fpr = NULL;
   unsigned long sigcount;
   int use_auth = 0;
   int exmode, le_value;
@@ -4437,40 +4541,13 @@ do_sign (app_t app, const char *keyidstr, int hashalgo,
     ;
   else if (!strcmp (keyidstr, "OPENPGP.3"))
     use_auth = 1;
-  else if (strlen (keyidstr) < 32 || strncmp (keyidstr, "D27600012401", 12))
-    return gpg_error (GPG_ERR_INV_ID);
   else
     {
-      for (s=keyidstr, n=0; hexdigitp (s); s++, n++)
-        ;
-      if (n != 32)
-        return gpg_error (GPG_ERR_INV_ID);
-      else if (!*s)
-        ; /* no fingerprint given: we allow this for now. */
-      else if (*s == '/')
-        fpr = s + 1;
-      else
-        return gpg_error (GPG_ERR_INV_ID);
-
-      for (s=keyidstr, n=0; n < 16; s += 2, n++)
-        tmp_sn[n] = xtoi_2 (s);
-
-      if (app->serialnolen != 16)
-        return gpg_error (GPG_ERR_INV_CARD);
-      if (memcmp (app->serialno, tmp_sn, 16))
-        return gpg_error (GPG_ERR_WRONG_CARD);
+      rc = check_keyidstr (app, keyidstr, 1, &use_auth);
+      if (rc)
+        return rc;
     }
 
-  /* If a fingerprint has been specified check it against the one on
-     the card.  This is allows for a meaningful error message in case
-     the key on the card has been replaced but the shadow information
-     known to gpg was not updated.  If there is no fingerprint, gpg
-     will detect a bogus signature anyway due to the
-     verify-after-signing feature. */
-  rc = fpr? check_against_given_fingerprint (app, fpr, 1) : 0;
-  if (rc)
-    return rc;
-
   /* Concatenate prefix and digest.  */
 #define X(a,b,d) \
   if (hashalgo == GCRY_MD_ ## a && (d) )                      \
@@ -4585,10 +4662,6 @@ do_auth (app_t app, const char *keyidstr,
          unsigned char **outdata, size_t *outdatalen )
 {
   int rc;
-  unsigned char tmp_sn[20]; /* Actually 16 but we use it also for the fpr. */
-  const char *s;
-  int n;
-  const char *fpr = NULL;
 
   if (!keyidstr || !*keyidstr)
     return gpg_error (GPG_ERR_INV_VALUE);
@@ -4614,42 +4687,15 @@ do_auth (app_t app, const char *keyidstr,
     }
 
   /* Check whether an OpenPGP card of any version has been requested. */
-  if (!strcmp (keyidstr, "OPENPGP.3"))
+  if (!ascii_strcasecmp (keyidstr, "OPENPGP.3"))
     ;
-  else if (strlen (keyidstr) < 32 || strncmp (keyidstr, "D27600012401", 12))
-    return gpg_error (GPG_ERR_INV_ID);
   else
     {
-      for (s=keyidstr, n=0; hexdigitp (s); s++, n++)
-        ;
-      if (n != 32)
-        return gpg_error (GPG_ERR_INV_ID);
-      else if (!*s)
-        ; /* no fingerprint given: we allow this for now. */
-      else if (*s == '/')
-        fpr = s + 1;
-      else
-        return gpg_error (GPG_ERR_INV_ID);
-
-      for (s=keyidstr, n=0; n < 16; s += 2, n++)
-        tmp_sn[n] = xtoi_2 (s);
-
-      if (app->serialnolen != 16)
-        return gpg_error (GPG_ERR_INV_CARD);
-      if (memcmp (app->serialno, tmp_sn, 16))
-        return gpg_error (GPG_ERR_WRONG_CARD);
+      rc = check_keyidstr (app, keyidstr, 3, NULL);
+      if (rc)
+        return rc;
     }
 
-  /* If a fingerprint has been specified check it against the one on
-     the card.  This is allows for a meaningful error message in case
-     the key on the card has been replaced but the shadow information
-     known to gpg was not updated.  If there is no fingerprint, gpg
-     will detect a bogus signature anyway due to the
-     verify-after-signing feature. */
-  rc = fpr? check_against_given_fingerprint (app, fpr, 3) : 0;
-  if (rc)
-    return rc;
-
   rc = verify_chv2 (app, pincb, pincb_arg);
   if (!rc)
     {
@@ -4684,10 +4730,7 @@ do_decipher (app_t app, const char *keyidstr,
              unsigned int *r_info)
 {
   int rc;
-  unsigned char tmp_sn[20]; /* actually 16 but we use it also for the fpr. */
-  const char *s;
   int n;
-  const char *fpr = NULL;
   int exmode, le_value;
   unsigned char *fixbuf = NULL;
   int padind = 0;
@@ -4697,41 +4740,15 @@ do_decipher (app_t app, const char *keyidstr,
     return gpg_error (GPG_ERR_INV_VALUE);
 
   /* Check whether an OpenPGP card of any version has been requested. */
-  if (!strcmp (keyidstr, "OPENPGP.2"))
+  if (!ascii_strcasecmp (keyidstr, "OPENPGP.2"))
     ;
-  else if (strlen (keyidstr) < 32 || strncmp (keyidstr, "D27600012401", 12))
-    return gpg_error (GPG_ERR_INV_ID);
   else
     {
-      for (s=keyidstr, n=0; hexdigitp (s); s++, n++)
-        ;
-      if (n != 32)
-        return gpg_error (GPG_ERR_INV_ID);
-      else if (!*s)
-        ; /* no fingerprint given: we allow this for now. */
-      else if (*s == '/')
-        fpr = s + 1;
-      else
-        return gpg_error (GPG_ERR_INV_ID);
-
-      for (s=keyidstr, n=0; n < 16; s += 2, n++)
-        tmp_sn[n] = xtoi_2 (s);
-
-      if (app->serialnolen != 16)
-        return gpg_error (GPG_ERR_INV_CARD);
-      if (memcmp (app->serialno, tmp_sn, 16))
-        return gpg_error (GPG_ERR_WRONG_CARD);
+      rc = check_keyidstr (app, keyidstr, 2, NULL);
+      if (rc)
+        return rc;
     }
 
-  /* If a fingerprint has been specified check it against the one on
-     the card.  This is allows for a meaningful error message in case
-     the key on the card has been replaced but the shadow information
-     known to gpg was not updated.  If there is no fingerprint, the
-     decryption won't produce the right plaintext anyway. */
-  rc = fpr? check_against_given_fingerprint (app, fpr, 2) : 0;
-  if (rc)
-    return rc;
-
   rc = verify_chv2 (app, pincb, pincb_arg);
   if (rc)
     return rc;
@@ -4945,38 +4962,19 @@ do_check_pin (app_t app, const char *keyidstr,
               gpg_error_t (*pincb)(void*, const char *, char **),
               void *pincb_arg)
 {
-  unsigned char tmp_sn[20];
-  const char *s;
-  int n;
+  int rc;
   int admin_pin = 0;
 
   if (!keyidstr || !*keyidstr)
     return gpg_error (GPG_ERR_INV_VALUE);
 
-  /* Check whether an OpenPGP card of any version has been requested. */
-  if (strlen (keyidstr) < 32 || strncmp (keyidstr, "D27600012401", 12))
-    return gpg_error (GPG_ERR_INV_ID);
+  rc = check_keyidstr (app, keyidstr, 0, NULL);
+  if (rc)
+    return rc;
 
-  for (s=keyidstr, n=0; hexdigitp (s); s++, n++)
-    ;
-  if (n != 32)
-    return gpg_error (GPG_ERR_INV_ID);
-  else if (!*s)
-    ; /* No fingerprint given: we allow this for now. */
-  else if (*s == '/')
-    ; /* We ignore a fingerprint. */
-  else if (!strcmp (s, "[CHV3]") )
+  if ((strlen (keyidstr) >= 32+6 && !strcmp (keyidstr+32, "[CHV3]"))
+      || (strlen (keyidstr) >= 40+6 && !strcmp (keyidstr+40, "[CHV3]")))
     admin_pin = 1;
-  else
-    return gpg_error (GPG_ERR_INV_ID);
-
-  for (s=keyidstr, n=0; n < 16; s += 2, n++)
-    tmp_sn[n] = xtoi_2 (s);
-
-  if (app->serialnolen != 16)
-    return gpg_error (GPG_ERR_INV_CARD);
-  if (memcmp (app->serialno, tmp_sn, 16))
-    return gpg_error (GPG_ERR_WRONG_CARD);
 
   /* Yes, there is a race conditions: The user might pull the card
      right here and we won't notice that.  However this is not a
index bb33a56..957345e 100644 (file)
--- a/scd/app.c
+++ b/scd/app.c
@@ -973,18 +973,18 @@ report_change (int slot, int old_status, int cur_status)
   char *homestr, *envstr;
   char *fname;
   char templ[50];
-  FILE *fp;
+  estream_t fp;
 
   snprintf (templ, sizeof templ, "reader_%d.status", slot);
   fname = make_filename (gnupg_homedir (), templ, NULL );
-  fp = fopen (fname, "w");
+  fp = es_fopen (fname, "w");
   if (fp)
     {
-      fprintf (fp, "%s\n",
+      es_fprintf (fp, "%s\n",
                (cur_status & 1)? "USABLE":
                (cur_status & 4)? "ACTIVE":
                (cur_status & 2)? "PRESENT": "NOCARD");
-      fclose (fp);
+      es_fclose (fp);
     }
   xfree (fname);
 
index 466efaa..e255ace 100644 (file)
 /* Max length of buffer with out CCID message header of 10-byte
    Sending: 547 for RSA-4096 key import
         APDU size = 540 (24+4+256+256)
-        commnd + lc + le = 4 + 3 + 0
+        command + lc + le = 4 + 3 + 0
    Sending: write data object of cardholder certificate
         APDU size = 2048
-        commnd + lc + le = 4 + 3 + 0
+        command + lc + le = 4 + 3 + 0
    Receiving: 2048 for cardholder certificate
 */
 #define CCID_MAX_BUF (2048+7+10)
 
 /* CCID command timeout.  */
 #define CCID_CMD_TIMEOUT (5*1000)
-/* OpenPGPcard v2.1 requires huge timeout for key generation.  */
-#define CCID_CMD_TIMEOUT_LONGER (60*1000)
 
 /* Depending on how this source is used we either define our error
    output to go to stderr or to the GnuPG based logging functions.  We
@@ -285,6 +283,24 @@ static int send_escape_cmd (ccid_driver_t handle, const unsigned char *data,
                             size_t datalen, unsigned char *result,
                             size_t resultmax, size_t *resultlen);
 
+
+static int
+map_libusb_error (int usberr)
+{
+  switch (usberr)
+    {
+    case 0:                     return 0;
+    case LIBUSB_ERROR_IO:       return CCID_DRIVER_ERR_USB_IO;
+    case LIBUSB_ERROR_ACCESS:   return CCID_DRIVER_ERR_USB_ACCESS;
+    case LIBUSB_ERROR_NO_DEVICE:return CCID_DRIVER_ERR_USB_NO_DEVICE;
+    case LIBUSB_ERROR_BUSY:     return CCID_DRIVER_ERR_USB_BUSY;
+    case LIBUSB_ERROR_TIMEOUT:  return CCID_DRIVER_ERR_USB_TIMEOUT;
+    case LIBUSB_ERROR_OVERFLOW: return CCID_DRIVER_ERR_USB_OVERFLOW;
+    }
+  return CCID_DRIVER_ERR_USB_OTHER;
+}
+
+
 /* Convert a little endian stored 4 byte value into an unsigned
    integer. */
 static unsigned int
@@ -960,7 +976,7 @@ get_escaped_usb_string (libusb_device_handle *idev, int idx,
   rc = libusb_control_transfer (idev, LIBUSB_ENDPOINT_IN,
                                 LIBUSB_REQUEST_GET_DESCRIPTOR,
                                 (LIBUSB_DT_STRING << 8), 0,
-                                (char*)buf, sizeof buf, 1000 /* ms timeout */);
+                                buf, sizeof buf, 1000 /* ms timeout */);
 #ifdef USE_NPTH
   npth_protect ();
 #endif
@@ -975,7 +991,7 @@ get_escaped_usb_string (libusb_device_handle *idev, int idx,
   rc = libusb_control_transfer (idev, LIBUSB_ENDPOINT_IN,
                                 LIBUSB_REQUEST_GET_DESCRIPTOR,
                                 (LIBUSB_DT_STRING << 8) + idx, langid,
-                                (char*)buf, sizeof buf, 1000 /* ms timeout */);
+                                buf, sizeof buf, 1000 /* ms timeout */);
 #ifdef USE_NPTH
   npth_protect ();
 #endif
@@ -1250,9 +1266,10 @@ ccid_get_reader_list (void)
 static int
 ccid_vendor_specific_init (ccid_driver_t handle)
 {
+  int r = 0;
+
   if (handle->id_vendor == VENDOR_VEGA && handle->id_product == VEGA_ALPHA)
     {
-      int r;
       /*
        * Vega alpha has a feature to show retry counter on the pinpad
        * display.  But it assumes that the card returns the value of
@@ -1264,11 +1281,33 @@ ccid_vendor_specific_init (ccid_driver_t handle)
       const unsigned char cmd[] = { '\xb5', '\x01', '\x00', '\x03', '\x00' };
 
       r = send_escape_cmd (handle, cmd, sizeof (cmd), NULL, 0, NULL);
-      if (r != 0 && r != CCID_DRIVER_ERR_CARD_INACTIVE
-          && r != CCID_DRIVER_ERR_NO_CARD)
-        return r;
     }
+  else if (handle->id_vendor == VENDOR_SCM && handle->id_product == SCM_SPR532)
+    {
+      /*
+       * It seems that SEQ may be out of sync between host and the card reader,
+       * and SET_INTERFACE doesn't reset it.  Make sure it works at the init.
+       */
+      abort_cmd (handle, 0);
+    }
+
+  if (r != 0 && r != CCID_DRIVER_ERR_CARD_INACTIVE
+      && r != CCID_DRIVER_ERR_NO_CARD)
+    return r;
+  else
+    return 0;
+}
 
+
+static int
+ccid_vendor_specific_setup (ccid_driver_t handle)
+{
+  if (handle->id_vendor == VENDOR_SCM && handle->id_product == SCM_SPR532)
+    {
+      DEBUGOUT ("sending escape sequence to switch to a case 1 APDU\n");
+      send_escape_cmd (handle, (const unsigned char*)"\x80\x02\x00", 3,
+                       NULL, 0, NULL);
+    }
   return 0;
 }
 
@@ -1290,7 +1329,7 @@ static libusb_device **ccid_usb_dev_list;
 static struct ccid_dev_table ccid_dev_table[MAX_DEVICE];
 
 gpg_error_t
-ccid_dev_scan (int *idx_max_p, struct ccid_dev_table **t_p)
+ccid_dev_scan (int *idx_max_p, void **t_p)
 {
   ssize_t n;
   libusb_device *dev;
@@ -1417,9 +1456,10 @@ ccid_dev_scan (int *idx_max_p, struct ccid_dev_table **t_p)
 }
 
 void
-ccid_dev_scan_finish (struct ccid_dev_table *tbl, int max)
+ccid_dev_scan_finish (void *tbl0, int max)
 {
   int i;
+  struct ccid_dev_table *tbl = tbl0;
 
   for (i = 0; i < max; i++)
     {
@@ -1438,12 +1478,13 @@ ccid_dev_scan_finish (struct ccid_dev_table *tbl, int max)
 }
 
 unsigned int
-ccid_get_BAI (int idx, struct ccid_dev_table *tbl)
+ccid_get_BAI (int idx, void *tbl0)
 {
   int n;
   int bus, addr, intf;
   unsigned int bai;
   libusb_device *dev;
+  struct ccid_dev_table *tbl = tbl0;
 
   n = tbl[idx].n;
   dev = ccid_usb_dev_list[n];
@@ -1468,7 +1509,8 @@ intr_cb (struct libusb_transfer *transfer)
 {
   ccid_driver_t handle = transfer->user_data;
 
-  DEBUGOUT_1 ("CCID: interrupt callback %d\n", transfer->status);
+  DEBUGOUT_2 ("CCID: interrupt callback %d (%d)\n",
+              transfer->status, transfer->actual_length);
 
   if (transfer->status == LIBUSB_TRANSFER_TIMED_OUT)
     {
@@ -1484,13 +1526,50 @@ intr_cb (struct libusb_transfer *transfer)
     }
   else if (transfer->status == LIBUSB_TRANSFER_COMPLETED)
     {
-      if (transfer->actual_length == 2
-          && transfer->buffer[0] == 0x50
-          && (transfer->buffer[1] & 1) == 0)
+      size_t len = transfer->actual_length;
+      unsigned char *p = transfer->buffer;
+      int card_removed = 0;
+
+      while (len)
+        {
+          if (*p == RDR_to_PC_NotifySlotChange)
+            {
+              if (len < 2)
+                break;
+
+              DEBUGOUT_1 ("CCID: NotifySlotChange: %02x\n", p[1]);
+
+              if ((p[1] & 1))
+                card_removed = 0;
+              else
+                card_removed = 1;
+
+              p += 2;
+              len -= 2;
+            }
+          else if (*p == RDR_to_PC_HardwareError)
+            {
+              if (len < 4)
+                break;
+
+              DEBUGOUT_1 ("CCID: hardware error detected: %02x\n", p[3]);
+              p += 4;
+              len -= 4;
+            }
+          else
+            {
+              DEBUGOUT_1 ("CCID: unknown intr: %02x\n", p[0]);
+              break;
+            }
+        }
+
+      if (card_removed)
         {
           DEBUGOUT ("CCID: card removed\n");
           handle->powered_off = 1;
+#if defined(GNUPG_MAJOR_VERSION)
           scd_kick_the_loop ();
+#endif
         }
       else
         {
@@ -1505,7 +1584,9 @@ intr_cb (struct libusb_transfer *transfer)
     device_removed:
       DEBUGOUT ("CCID: device removed\n");
       handle->powered_off = 1;
+#if defined(GNUPG_MAJOR_VERSION)
       scd_kick_the_loop ();
+#endif
     }
 }
 
@@ -1515,6 +1596,7 @@ ccid_setup_intr  (ccid_driver_t handle)
   struct libusb_transfer *transfer;
   int err;
 
+  libusb_clear_halt (handle->idev, handle->ep_intr);
   transfer = libusb_alloc_transfer (0);
   handle->transfer = transfer;
   libusb_fill_interrupt_transfer (transfer, handle->idev, handle->ep_intr,
@@ -1547,7 +1629,7 @@ ccid_usb_thread (void *arg)
 
 static int
 ccid_open_usb_reader (const char *spec_reader_name,
-                      int idx, struct ccid_dev_table *ccid_table,
+                      int idx, void *ccid_table0,
                       ccid_driver_t *handle, char **rdrname_p)
 {
   libusb_device *dev;
@@ -1559,6 +1641,7 @@ ccid_open_usb_reader (const char *spec_reader_name,
   int n;
   int bus, addr;
   unsigned int bai;
+  struct ccid_dev_table *ccid_table = ccid_table0;
 
   n = ccid_table[idx].n;
   ifc_no = ccid_table[idx].interface_number;
@@ -1575,7 +1658,7 @@ ccid_open_usb_reader (const char *spec_reader_name,
       DEBUGOUT_1 ("usb_open failed: %s\n", libusb_error_name (rc));
       free (*handle);
       *handle = NULL;
-      return rc;
+      return map_libusb_error (rc);
     }
 
   if (ccid_usb_thread_is_alive++ == 0)
@@ -1610,6 +1693,7 @@ ccid_open_usb_reader (const char *spec_reader_name,
   if (rc)
     {
       DEBUGOUT ("get_device_descripor failed\n");
+      rc = map_libusb_error (rc);
       goto leave;
     }
 
@@ -1649,19 +1733,17 @@ ccid_open_usb_reader (const char *spec_reader_name,
   if (rc)
     {
       DEBUGOUT_1 ("usb_claim_interface failed: %d\n", rc);
-      rc = CCID_DRIVER_ERR_CARD_IO_ERROR;
+      rc = map_libusb_error (rc);
       goto leave;
     }
 
-  if (set_no != 0)
+  /* Submit SET_INTERFACE control transfer which can reset the device.  */
+  rc = libusb_set_interface_alt_setting (idev, ifc_no, set_no);
+  if (rc)
     {
-      rc = libusb_set_interface_alt_setting (idev, ifc_no, set_no);
-      if (rc)
-        {
-          DEBUGOUT_1 ("usb_set_interface_alt_setting failed: %d\n", rc);
-          rc = CCID_DRIVER_ERR_CARD_IO_ERROR;
-          goto leave;
-        }
+      DEBUGOUT_1 ("usb_set_interface_alt_setting failed: %d\n", rc);
+      rc = map_libusb_error (rc);
+      goto leave;
     }
 
   rc = ccid_vendor_specific_init (*handle);
@@ -1671,6 +1753,7 @@ ccid_open_usb_reader (const char *spec_reader_name,
     {
       --ccid_usb_thread_is_alive;
       free (rid);
+      libusb_release_interface (idev, ifc_no);
       libusb_close (idev);
       free (*handle);
       *handle = NULL;
@@ -1690,9 +1773,11 @@ ccid_open_usb_reader (const char *spec_reader_name,
    pointer to be used as handle in HANDLE.  Returns 0 on success. */
 int
 ccid_open_reader (const char *spec_reader_name, int idx,
-                  struct ccid_dev_table *ccid_table,
+                  void *ccid_table0,
                   ccid_driver_t *handle, char **rdrname_p)
 {
+  struct ccid_dev_table *ccid_table = ccid_table0;
+
   *handle = calloc (1, sizeof **handle);
   if (!*handle)
     {
@@ -1714,7 +1799,25 @@ ccid_require_get_status (ccid_driver_t handle)
      detect removal of a card and can detect removal of a reader.
   */
   if (handle->ep_intr >= 0)
-    return 0;
+    {
+      if (handle->id_vendor != VENDOR_SCM)
+        return 0;
+
+      /*
+       * For card reader with interrupt transfer support, ideally,
+       * removal is detected by intr_cb, but some card reader
+       * (e.g. SPR532) has a possible case of missing report to
+       * intr_cb, and another case of valid report to intr_cb.
+       *
+       * For such a reader, the removal should be able to be detected
+       * by PC_to_RDR_GetSlotStatus, too.  Thus, calls to
+       * ccid_slot_status should go on wire even if "on_wire" is not
+       * requested.
+       *
+       */
+      if (handle->transfer == NULL)
+        return 0;
+    }
 
   /* Libusb actually detects the removal of USB device in use.
      However, there is no good API to handle the removal (yet),
@@ -1733,31 +1836,37 @@ ccid_require_get_status (ccid_driver_t handle)
   return 1;
 }
 
-
-static void
-do_close_reader (ccid_driver_t handle)
+static int
+send_power_off (ccid_driver_t handle)
 {
   int rc;
   unsigned char msg[100];
   size_t msglen;
   unsigned char seqno;
 
-  if (!handle->powered_off)
-    {
-      msg[0] = PC_to_RDR_IccPowerOff;
-      msg[5] = 0; /* slot */
-      msg[6] = seqno = handle->seqno++;
-      msg[7] = 0; /* RFU */
-      msg[8] = 0; /* RFU */
-      msg[9] = 0; /* RFU */
-      set_msg_len (msg, 0);
-      msglen = 10;
+  msg[0] = PC_to_RDR_IccPowerOff;
+  msg[5] = 0; /* slot */
+  msg[6] = seqno = handle->seqno++;
+  msg[7] = 0; /* RFU */
+  msg[8] = 0; /* RFU */
+  msg[9] = 0; /* RFU */
+  set_msg_len (msg, 0);
+  msglen = 10;
 
-      rc = bulk_out (handle, msg, msglen, 0);
-      if (!rc)
-        bulk_in (handle, msg, sizeof msg, &msglen, RDR_to_PC_SlotStatus,
-                 seqno, 2000, 0);
-    }
+  rc = bulk_out (handle, msg, msglen, 0);
+  if (!rc)
+    bulk_in (handle, msg, sizeof msg, &msglen, RDR_to_PC_SlotStatus,
+             seqno, 2000, 0);
+  return rc;
+}
+
+static void
+do_close_reader (ccid_driver_t handle)
+{
+  int rc;
+
+  if (!handle->powered_off)
+    send_power_off (handle);
 
   if (handle->transfer)
     {
@@ -1909,7 +2018,7 @@ bulk_out (ccid_driver_t handle, unsigned char *msg, size_t msglen,
   npth_unprotect ();
 #endif
   rc = libusb_bulk_transfer (handle->idev, handle->ep_bulk_out,
-                             (char*)msg, msglen, &transferred,
+                             msg, msglen, &transferred,
                              5000 /* ms timeout */);
 #ifdef USE_NPTH
   npth_protect ();
@@ -1965,12 +2074,9 @@ bulk_in (ccid_driver_t handle, unsigned char *buffer, size_t length,
     {
       DEBUGOUT_1 ("usb_bulk_read error: %s\n", libusb_error_name (rc));
       if (rc == LIBUSB_ERROR_NO_DEVICE)
-        {
-          handle->enodev_seen = 1;
-          return CCID_DRIVER_ERR_NO_READER;
-        }
+        handle->enodev_seen = 1;
 
-      return CCID_DRIVER_ERR_CARD_IO_ERROR;
+      return map_libusb_error (rc);
     }
   if (msglen < 0)
     return CCID_DRIVER_ERR_INV_VALUE;  /* Faulty libusb.  */
@@ -2072,17 +2178,16 @@ bulk_in (ccid_driver_t handle, unsigned char *buffer, size_t length,
       /*
        * Communication failure by device side.
        * Possibly, it was forcibly suspended and resumed.
-       *
-       * Only detect this kind of failure when interrupt transfer is
-       * not supported.  For card reader with interrupt transfer
-       * support removal is detected by intr_cb.
        */
       if (handle->ep_intr < 0)
         {
           DEBUGOUT ("CCID: card inactive/removed\n");
           handle->powered_off = 1;
-          scd_kick_the_loop ();
         }
+
+#if defined(GNUPG_MAJOR_VERSION)
+      scd_kick_the_loop ();
+#endif
     }
 
   return rc;
@@ -2095,7 +2200,7 @@ static int
 abort_cmd (ccid_driver_t handle, int seqno)
 {
   int rc;
-  char dummybuf[8];
+  unsigned char dummybuf[8];
   unsigned char msg[100];
   int msglen;
 
@@ -2121,7 +2226,7 @@ abort_cmd (ccid_driver_t handle, int seqno)
   if (rc)
     {
       DEBUGOUT_1 ("usb_control_msg error: %s\n", libusb_error_name (rc));
-      return CCID_DRIVER_ERR_CARD_IO_ERROR;
+      return map_libusb_error (rc);
     }
 
   /* Now send the abort command to the bulk out pipe using the same
@@ -2146,7 +2251,7 @@ abort_cmd (ccid_driver_t handle, int seqno)
       npth_unprotect ();
 #endif
       rc = libusb_bulk_transfer (handle->idev, handle->ep_bulk_out,
-                                 (char*)msg, msglen, &transferred,
+                                 msg, msglen, &transferred,
                                  5000 /* ms timeout */);
 #ifdef USE_NPTH
       npth_protect ();
@@ -2158,13 +2263,13 @@ abort_cmd (ccid_driver_t handle, int seqno)
                     libusb_error_name (rc));
 
       if (rc)
-        return rc;
+        return map_libusb_error (rc);
 
 #ifdef USE_NPTH
       npth_unprotect ();
 #endif
       rc = libusb_bulk_transfer (handle->idev, handle->ep_bulk_in,
-                                 (char*)msg, sizeof msg, &msglen,
+                                 msg, sizeof msg, &msglen,
                                  5000 /*ms timeout*/);
 #ifdef USE_NPTH
       npth_protect ();
@@ -2173,7 +2278,7 @@ abort_cmd (ccid_driver_t handle, int seqno)
         {
           DEBUGOUT_1 ("usb_bulk_read error in abort_cmd: %s\n",
                       libusb_error_name (rc));
-          return CCID_DRIVER_ERR_CARD_IO_ERROR;
+          return map_libusb_error (rc);
         }
 
       if (msglen < 10)
@@ -2285,7 +2390,7 @@ ccid_poll (ccid_driver_t handle)
   int i, j;
 
   rc = libusb_interrupt_transfer (handle->idev, handle->ep_intr,
-                                  (char*)msg, sizeof msg, &msglen,
+                                  msg, sizeof msg, &msglen,
                                   0 /* ms timeout */ );
   if (rc == LIBUSB_ERROR_TIMEOUT)
     return 0;
@@ -2348,7 +2453,7 @@ ccid_slot_status (ccid_driver_t handle, int *statusbits, int on_wire)
     {
       /* Setup interrupt transfer at the initial call of slot_status
          with ON_WIRE == 0 */
-      if (handle->transfer == NULL && handle->ep_intr >= 0)
+      if (handle->transfer == NULL)
         ccid_setup_intr (handle);
 
       *statusbits = 0;
@@ -2372,7 +2477,8 @@ ccid_slot_status (ccid_driver_t handle, int *statusbits, int on_wire)
      status and debugging enabled. */
   rc = bulk_in (handle, msg, sizeof msg, &msglen, RDR_to_PC_SlotStatus,
                 seqno, retries? 1000 : 200, 1);
-  if (rc == CCID_DRIVER_ERR_CARD_IO_ERROR && retries < 3)
+  if ((rc == CCID_DRIVER_ERR_CARD_IO_ERROR || rc == CCID_DRIVER_ERR_USB_TIMEOUT)
+      && retries < 3)
     {
       if (!retries)
         {
@@ -2618,6 +2724,21 @@ ccid_get_atr (ccid_driver_t handle,
                             NULL, 0, NULL))
         goto again;
     }
+  else if (statusbits == 0 && CCID_COMMAND_FAILED (msg))
+    {
+      /* Card was active already, and something went wrong with
+         PC_to_RDR_IccPowerOn command.  It may be baud-rate mismatch
+         between the card and the reader.  To recover from this state,
+         send PC_to_RDR_IccPowerOff command to reset the card and try
+         again.
+       */
+      rc = send_power_off (handle);
+      if (rc)
+        return rc;
+
+      statusbits = 1;
+      goto again;
+    }
   else if (CCID_COMMAND_FAILED (msg))
     return CCID_DRIVER_ERR_CARD_IO_ERROR;
 
@@ -2802,6 +2923,7 @@ ccid_get_atr (ccid_driver_t handle,
       DEBUGOUT_1 ("IFSD has been set to %d\n", tpdu[3]);
     }
 
+  ccid_vendor_specific_setup (handle);
   return 0;
 }
 
@@ -3101,7 +3223,7 @@ ccid_transceive (ccid_driver_t handle,
           msg[0] = PC_to_RDR_XfrBlock;
           msg[5] = 0; /* slot */
           msg[6] = seqno = handle->seqno++;
-          msg[7] = wait_more; /* bBWI */
+          msg[7] = (wait_more ? wait_more : 1); /* bBWI */
           msg[8] = 0; /* RFU */
           msg[9] = 0; /* RFU */
           set_msg_len (msg, tpdulen);
@@ -3127,7 +3249,7 @@ ccid_transceive (ccid_driver_t handle,
       msg = recv_buffer;
       rc = bulk_in (handle, msg, sizeof recv_buffer, &msglen,
                     via_escape? RDR_to_PC_Escape : RDR_to_PC_DataBlock, seqno,
-                    wait_more? CCID_CMD_TIMEOUT_LONGER: CCID_CMD_TIMEOUT, 0);
+                    (wait_more ? wait_more : 1) * CCID_CMD_TIMEOUT, 0);
       if (rc)
         return rc;
 
@@ -3157,6 +3279,7 @@ ccid_transceive (ccid_driver_t handle,
                     (!(msg[pcboff] & 0x80) && (msg[pcboff] & 0x20)?
                      " [more]":""));
 
+      wait_more = 0;
       if (!(tpdu[1] & 0x80))
         { /* This is an I-block. */
           retries = 0;
@@ -3302,9 +3425,7 @@ ccid_transceive (ccid_driver_t handle,
               /* Wait time extension request. */
               unsigned char bwi = tpdu[3];
 
-              /* Check if it's unsual value which can't be expressed in ATR.  */
-              if (bwi > 15)
-                wait_more = 1;
+             wait_more = bwi;
 
               msg = send_buffer;
               tpdu = msg + hdrlen;
@@ -3463,15 +3584,6 @@ ccid_transceive_secure (ccid_driver_t handle,
     return CCID_DRIVER_ERR_NOT_SUPPORTED;
 
   msg = send_buffer;
-  if (handle->id_vendor == VENDOR_SCM)
-    {
-      DEBUGOUT ("sending escape sequence to switch to a case 1 APDU\n");
-      rc = send_escape_cmd (handle, (const unsigned char*)"\x80\x02\x00", 3,
-                            NULL, 0, NULL);
-      if (rc)
-        return rc;
-    }
-
   msg[0] = cherry_mode? 0x89 : PC_to_RDR_Secure;
   msg[5] = 0; /* slot */
   msg[6] = seqno = handle->seqno++;
@@ -3698,7 +3810,7 @@ print_error (int err)
 
   switch (err)
     {
-    case 0: p = "success";
+    case 0: p = "success"; break;
     case CCID_DRIVER_ERR_OUT_OF_CORE: p = "out of core"; break;
     case CCID_DRIVER_ERR_INV_VALUE: p = "invalid value"; break;
     case CCID_DRIVER_ERR_NO_DRIVER: p = "no driver"; break;
@@ -3747,7 +3859,7 @@ print_result (int rc, const unsigned char *data, size_t length)
 int
 main (int argc, char **argv)
 {
-  int rc;
+  gpg_error_t err;
   ccid_driver_t ccid;
   int slotstat;
   unsigned char result[512];
@@ -3756,6 +3868,8 @@ main (int argc, char **argv)
   int verify_123456 = 0;
   int did_verify = 0;
   int no_poll = 0;
+  int idx_max;
+  struct ccid_dev_table *ccid_table;
 
   if (argc)
     {
@@ -3799,27 +3913,36 @@ main (int argc, char **argv)
         break;
     }
 
-  rc = ccid_open_reader (&ccid, argc? *argv:NULL, NULL);
-  if (rc)
+  err = ccid_dev_scan (&idx_max, &ccid_table);
+  if (err)
+    return 1;
+
+  if (idx_max == 0)
+    return 1;
+
+  err = ccid_open_reader (argc? *argv:NULL, 0, ccid_table, &ccid, NULL);
+  if (err)
     return 1;
 
+  ccid_dev_scan_finish (ccid_table, idx_max);
+
   if (!no_poll)
     ccid_poll (ccid);
   fputs ("getting ATR ...\n", stderr);
-  rc = ccid_get_atr (ccid, NULL, 0, NULL);
-  if (rc)
+  err = ccid_get_atr (ccid, NULL, 0, NULL);
+  if (err)
     {
-      print_error (rc);
+      print_error (err);
       return 1;
     }
 
   if (!no_poll)
     ccid_poll (ccid);
   fputs ("getting slot status ...\n", stderr);
-  rc = ccid_slot_status (ccid, &slotstat, 1);
-  if (rc)
+  err = ccid_slot_status (ccid, &slotstat, 1);
+  if (err)
     {
-      print_error (rc);
+      print_error (err);
       return 1;
     }
 
@@ -3830,10 +3953,10 @@ main (int argc, char **argv)
   {
     static unsigned char apdu[] = {
       0, 0xA4, 4, 0, 6, 0xD2, 0x76, 0x00, 0x01, 0x24, 0x01};
-    rc = ccid_transceive (ccid,
-                          apdu, sizeof apdu,
-                          result, sizeof result, &resultlen);
-    print_result (rc, result, resultlen);
+    err = ccid_transceive (ccid,
+                           apdu, sizeof apdu,
+                           result, sizeof result, &resultlen);
+    print_result (err, result, resultlen);
   }
 
 
@@ -3843,9 +3966,9 @@ main (int argc, char **argv)
   fputs ("getting OpenPGP DO 0x65 ....\n", stderr);
   {
     static unsigned char apdu[] = { 0, 0xCA, 0, 0x65, 254 };
-    rc = ccid_transceive (ccid, apdu, sizeof apdu,
-                          result, sizeof result, &resultlen);
-    print_result (rc, result, resultlen);
+    err = ccid_transceive (ccid, apdu, sizeof apdu,
+                           result, sizeof result, &resultlen);
+    print_result (err, result, resultlen);
   }
 
   if (!no_pinpad)
@@ -3855,22 +3978,18 @@ main (int argc, char **argv)
   if (!no_pinpad)
     {
       static unsigned char apdu[] = { 0, 0x20, 0, 0x81 };
+      pininfo_t pininfo = { 0, 0, 0 };
 
-
-      if (ccid_transceive_secure (ccid,
-                                  apdu, sizeof apdu,
-                                  1, 0, 0, 0,
+      if (ccid_transceive_secure (ccid, apdu, sizeof apdu, &pininfo,
                                   NULL, 0, NULL))
         fputs ("can't verify using a PIN-Pad reader\n", stderr);
       else
         {
-          fputs ("verifying CHV1 using the PINPad ....\n", stderr);
+           fputs ("verifying CHV1 using the PINPad ....\n", stderr);
 
-          rc = ccid_transceive_secure (ccid,
-                                       apdu, sizeof apdu,
-                                       1, 0, 0, 0,
-                                       result, sizeof result, &resultlen);
-          print_result (rc, result, resultlen);
+          err = ccid_transceive_secure (ccid, apdu, sizeof apdu, &pininfo,
+                                        result, sizeof result, &resultlen);
+          print_result (err, result, resultlen);
           did_verify = 1;
         }
     }
@@ -3881,20 +4000,20 @@ main (int argc, char **argv)
       {
         static unsigned char apdu[] = {0, 0x20, 0, 0x81,
                                        6, '1','2','3','4','5','6'};
-        rc = ccid_transceive (ccid, apdu, sizeof apdu,
-                              result, sizeof result, &resultlen);
-        print_result (rc, result, resultlen);
+        err = ccid_transceive (ccid, apdu, sizeof apdu,
+                               result, sizeof result, &resultlen);
+        print_result (err, result, resultlen);
       }
     }
 
-  if (!rc)
+  if (!err)
     {
       fputs ("getting OpenPGP DO 0x5E ....\n", stderr);
       {
         static unsigned char apdu[] = { 0, 0xCA, 0, 0x5E, 254 };
-        rc = ccid_transceive (ccid, apdu, sizeof apdu,
-                              result, sizeof result, &resultlen);
-        print_result (rc, result, resultlen);
+        err = ccid_transceive (ccid, apdu, sizeof apdu,
+                               result, sizeof result, &resultlen);
+        print_result (err, result, resultlen);
       }
     }
 
@@ -3905,7 +4024,7 @@ main (int argc, char **argv)
 
 /*
  * Local Variables:
- *  compile-command: "gcc -DTEST -Wall -I/usr/local/include -lusb -g ccid-driver.c"
+ *  compile-command: "gcc -DTEST -DGPGRT_ENABLE_ES_MACROS -DHAVE_NPTH -DUSE_NPTH -Wall -I/usr/include/libusb-1.0 -I/usr/local/include -lusb-1.0 -g ccid-driver.c -lnpth -lgpg-error"
  * End:
  */
 #endif /*TEST*/
index 32b9475..dc17c27 100644 (file)
@@ -108,6 +108,13 @@ enum {
 #define CCID_DRIVER_ERR_NO_READER      0x1000c
 #define CCID_DRIVER_ERR_ABORTED        0x1000d
 #define CCID_DRIVER_ERR_NO_PINPAD      0x1000e
+#define CCID_DRIVER_ERR_USB_OTHER      0x10020
+#define CCID_DRIVER_ERR_USB_IO         0x10021
+#define CCID_DRIVER_ERR_USB_ACCESS     0x10023
+#define CCID_DRIVER_ERR_USB_NO_DEVICE  0x10024
+#define CCID_DRIVER_ERR_USB_BUSY       0x10026
+#define CCID_DRIVER_ERR_USB_TIMEOUT    0x10027
+#define CCID_DRIVER_ERR_USB_OVERFLOW   0x10028
 
 struct ccid_driver_s;
 typedef struct ccid_driver_s *ccid_driver_t;
@@ -117,12 +124,12 @@ struct ccid_dev_table;
 int ccid_set_debug_level (int level);
 char *ccid_get_reader_list (void);
 
-gpg_error_t ccid_dev_scan (int *idx_max, struct ccid_dev_table **t_p);
-void ccid_dev_scan_finish (struct ccid_dev_table *tbl, int max);
-unsigned int ccid_get_BAI (int, struct ccid_dev_table *tbl);
+gpg_error_t ccid_dev_scan (int *idx_max, void **t_p);
+void ccid_dev_scan_finish (void *tbl0, int max);
+unsigned int ccid_get_BAI (int, void *tbl0);
 int ccid_compare_BAI (ccid_driver_t handle, unsigned int);
 int ccid_open_reader (const char *spec_reader_name,
-                      int idx, struct ccid_dev_table *ccid_table,
+                      int idx, void *ccid_table0,
                       ccid_driver_t *handle, char **rdrname_p);
 int ccid_set_progress_cb (ccid_driver_t handle,
                           void (*cb)(void *, const char *, int, int, int),
index 1dfa652..769113f 100644 (file)
@@ -138,9 +138,10 @@ hex_to_buffer (const char *string, size_t *r_length)
 
 /* Reset the card and free the application context.  With SEND_RESET
    set to true actually send a RESET to the reader; this is the normal
-   way of calling the function.  */
+   way of calling the function.  If KEEP_LOCK is set and the session
+   is locked that lock wil not be released.  */
 static void
-do_reset (ctrl_t ctrl, int send_reset)
+do_reset (ctrl_t ctrl, int send_reset, int keep_lock)
 {
   app_t app = ctrl->app_ctx;
 
@@ -148,7 +149,7 @@ do_reset (ctrl_t ctrl, int send_reset)
     app_reset (app, ctrl, IS_LOCKED (ctrl)? 0: send_reset);
 
   /* If we hold a lock, unlock now. */
-  if (locked_session && ctrl->server_local == locked_session)
+  if (!keep_lock && locked_session && ctrl->server_local == locked_session)
     {
       locked_session = NULL;
       log_info ("implicitly unlocking due to RESET\n");
@@ -160,9 +161,7 @@ reset_notify (assuan_context_t ctx, char *line)
 {
   ctrl_t ctrl = assuan_get_pointer (ctx);
 
-  (void) line;
-
-  do_reset (ctrl, 1);
+  do_reset (ctrl, 1, has_option (line, "--keep-lock"));
   return 0;
 }
 
@@ -291,6 +290,8 @@ cmd_serialno (assuan_context_t ctx, char *line)
   else
     demand = NULL;
 
+  line = skip_options (line);
+
   /* Clear the remove flag so that the open_card is able to reread it.  */
   if (ctrl->server_local->card_removed)
     ctrl->server_local->card_removed = 0;
@@ -1262,7 +1263,7 @@ static const char hlp_checkpin[] =
   "   entry system, only the regular CHV will get blocked and not the\n"
   "   dangerous CHV3.  IDSTR is the usual card's serial number in hex\n"
   "   notation; an optional fingerprint part will get ignored.  There\n"
-  "   is however a special mode if the IDSTR is sffixed with the\n"
+  "   is however a special mode if the IDSTR is suffixed with the\n"
   "   literal string \"[CHV3]\": In this case the Admin PIN is checked\n"
   "   if and only if the retry counter is still at 3.\n"
   "\n"
@@ -1340,9 +1341,10 @@ cmd_lock (assuan_context_t ctx, char *line)
       npth_sleep (1); /* Better implement an event mechanism. However,
                          for card operations this should be
                          sufficient. */
-      /* FIXME: Need to check that the connection is still alive.
-         This can be done by issuing status messages. */
-      goto retry;
+      /* Send a progress so that we can detect a connection loss.  */
+      rc = send_status_printf (ctrl, "PROGRESS", "scd_locked . 0 0");
+      if (!rc)
+        goto retry;
     }
 #endif /*USE_NPTH*/
 
@@ -1814,7 +1816,7 @@ scd_command_handler (ctrl_t ctrl, int fd)
     }
 
   /* Cleanup.  We don't send an explicit reset to the card.  */
-  do_reset (ctrl, 0);
+  do_reset (ctrl, 0, 0);
 
   /* Release the server object.  */
   if (session_list == ctrl->server_local)
index 092a119..2070670 100644 (file)
@@ -97,6 +97,13 @@ map_sw (int sw)
     case SW_HOST_ABORTED:        ec = GPG_ERR_INV_RESPONSE; break;
     case SW_HOST_NO_PINPAD:      ec = GPG_ERR_NOT_SUPPORTED; break;
     case SW_HOST_CANCELLED:      ec = GPG_ERR_CANCELED; break;
+    case SW_HOST_USB_OTHER:      ec = GPG_ERR_EIO; break;
+    case SW_HOST_USB_IO:         ec = GPG_ERR_EIO; break;
+    case SW_HOST_USB_ACCESS:     ec = GPG_ERR_EACCES; break;
+    case SW_HOST_USB_NO_DEVICE:  ec = GPG_ERR_ENODEV; break;
+    case SW_HOST_USB_BUSY:       ec = GPG_ERR_EBUSY; break;
+    case SW_HOST_USB_TIMEOUT:    ec = GPG_ERR_TIMEOUT; break;
+    case SW_HOST_USB_OVERFLOW:   ec = GPG_ERR_EOVERFLOW; break;
 
     default:
       if ((sw & 0x010000))
index aa0eba4..c1dae54 100644 (file)
@@ -48,3 +48,5 @@
       VALUE "Translation", 0x409, 0x4b0
     END
   END
+
+1 RT_MANIFEST "scdaemon.w32-manifest"
index ab3e1d9..c1a3f43 100644 (file)
@@ -524,7 +524,7 @@ main (int argc, char **argv )
   if (configname)
     {
       configlineno = 0;
-      configfp = fopen (configname, "r");
+      configfp = gnupg_fopen (configname, "r");
       if (!configfp)
         {
           if (default_config)
diff --git a/scd/scdaemon.w32-manifest.in b/scd/scdaemon.w32-manifest.in
new file mode 100644 (file)
index 0000000..22dabb6
--- /dev/null
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+<description>GNU Privacy Guard (Scmartcard daemon)</description>
+<assemblyIdentity
+    type="win32"
+    name="GnuPG.scdaemon"
+    version="@BUILD_VERSION@"
+    />
+<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
+  <application>
+    <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/><!-- 10 -->
+    <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/><!-- 8.1 -->
+    <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/><!-- 8 -->
+    <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/><!-- 7 -->
+    <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/><!-- Vista -->
+  </application>
+</compatibility>
+</assembly>
index 475924a..0bc7640 100644 (file)
@@ -17,7 +17,7 @@
 
 ## Process this file with automake to produce Makefile.in
 
-EXTRA_DIST = ChangeLog-2011 gpgsm-w32info.rc
+EXTRA_DIST = ChangeLog-2011 gpgsm-w32info.rc gpgsm.w32-manifest.in
 
 bin_PROGRAMS = gpgsm
 
@@ -27,7 +27,10 @@ AM_CPPFLAGS = -DKEYBOX_WITH_X509=1
 include $(top_srcdir)/am/cmacros.am
 
 if HAVE_W32_SYSTEM
-resource_objs += gpgsm-w32info.o
+gpgsm_robjs = $(resource_objs) gpgsm-w32info.o
+gpgsm-w32info.o : gpgsm.w32-manifest
+else
+gpgsm_robjs =
 endif
 
 gpgsm_SOURCES = \
@@ -62,7 +65,7 @@ common_libs = ../kbx/libkeybox509.a $(libcommon)
 gpgsm_LDADD = $(common_libs) ../common/libgpgrl.a \
               $(LIBGCRYPT_LIBS) $(KSBA_LIBS) $(LIBASSUAN_LIBS) \
               $(GPG_ERROR_LIBS) $(LIBREADLINE) $(LIBINTL) \
-             $(LIBICONV) $(resource_objs) $(extra_sys_libs) $(NETLIBS)
+             $(LIBICONV) $(gpgsm_robjs) $(extra_sys_libs) $(NETLIBS)
 gpgsm_LDFLAGS = $(extra_bin_ldflags)
 
 # Make sure that all libs are build before we use them.  This is
index 5f83202..d2a1800 100644 (file)
@@ -308,7 +308,7 @@ check_cert_policy (ksba_cert_t cert, int listmode, estream_t fplist)
 {
   gpg_error_t err;
   char *policies;
-  FILE *fp;
+  estream_t fp;
   int any_critical;
 
   err = ksba_cert_get_cert_policies (cert, &policies);
@@ -340,7 +340,7 @@ check_cert_policy (ksba_cert_t cert, int listmode, estream_t fplist)
       return 0;
     }
 
-  fp = fopen (opt.policy_file, "r");
+  fp = es_fopen (opt.policy_file, "r");
   if (!fp)
     {
       if (opt.verbose || errno != ENOENT)
@@ -369,14 +369,14 @@ check_cert_policy (ksba_cert_t cert, int listmode, estream_t fplist)
       /* read line */
       do
         {
-          if (!fgets (line, DIM(line)-1, fp) )
+          if (!es_fgets (line, DIM(line)-1, fp) )
             {
-              gpg_error_t tmperr = gpg_error (gpg_err_code_from_errno (errno));
+              gpg_error_t tmperr = gpg_error_from_syserror ();
 
               xfree (policies);
-              if (feof (fp))
+              if (es_feof (fp))
                 {
-                  fclose (fp);
+                  es_fclose (fp);
                   /* With no critical policies this is only a warning */
                   if (!any_critical)
                     {
@@ -388,16 +388,16 @@ check_cert_policy (ksba_cert_t cert, int listmode, estream_t fplist)
                            _("certificate policy not allowed"));
                   return gpg_error (GPG_ERR_NO_POLICY_MATCH);
                 }
-              fclose (fp);
+              es_fclose (fp);
               return tmperr;
             }
 
           if (!*line || line[strlen(line)-1] != '\n')
             {
               /* eat until end of line */
-              while ( (c=getc (fp)) != EOF && c != '\n')
+              while ((c = es_getc (fp)) != EOF && c != '\n')
                 ;
-              fclose (fp);
+              es_fclose (fp);
               xfree (policies);
               return gpg_error (*line? GPG_ERR_LINE_TOO_LONG
                                      : GPG_ERR_INCOMPLETE_LINE);
@@ -417,7 +417,7 @@ check_cert_policy (ksba_cert_t cert, int listmode, estream_t fplist)
       p = strpbrk (allowed, " :\n");
       if (!*p || p == allowed)
         {
-          fclose (fp);
+          es_fclose (fp);
           xfree (policies);
           return gpg_error (GPG_ERR_CONFIGURATION);
         }
@@ -430,7 +430,7 @@ check_cert_policy (ksba_cert_t cert, int listmode, estream_t fplist)
           if (p[strlen (allowed)] != ':')
             continue; /* The length does not match. */
           /* Yep - it does match so return okay. */
-          fclose (fp);
+          es_fclose (fp);
           xfree (policies);
           return 0;
         }
index d813b0d..537afdb 100644 (file)
@@ -48,3 +48,5 @@
       VALUE "Translation", 0x409, 0x4b0
     END
   END
+
+1 RT_MANIFEST "gpgsm.w32-manifest"
index 5c13e2f..3218261 100644 (file)
@@ -1037,7 +1037,7 @@ main ( int argc, char **argv)
  next_pass:
   if (configname) {
     configlineno = 0;
-    configfp = fopen (configname, "r");
+    configfp = gnupg_fopen (configname, "r");
     if (!configfp)
       {
         if (default_config)
@@ -1707,7 +1707,7 @@ main ( int argc, char **argv)
 
           filelist[0] = make_filename (gnupg_datadir (),"com-certs.pem", NULL);
           filelist[1] = NULL;
-          if (!access (filelist[0], F_OK))
+          if (!gnupg_access (filelist[0], F_OK))
             {
               log_info (_("importing common certificates '%s'\n"),
                         filelist[0]);
@@ -2213,7 +2213,7 @@ open_read (const char *filename)
   fd = check_special_filename (filename, 0, 0);
   if (fd != -1)
     return fd;
-  fd = open (filename, O_RDONLY | O_BINARY);
+  fd = gnupg_open (filename, O_RDONLY | O_BINARY, 0);
   if (fd == -1)
     {
       log_error (_("can't open '%s': %s\n"), filename, strerror (errno));
diff --git a/sm/gpgsm.w32-manifest.in b/sm/gpgsm.w32-manifest.in
new file mode 100644 (file)
index 0000000..3055788
--- /dev/null
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+<description>GNU Privacy Guard (X409/CMS tool)</description>
+<assemblyIdentity
+    type="win32"
+    name="GnuPG.gpgsm"
+    version="@BUILD_VERSION@"
+    />
+<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
+  <application>
+    <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/><!-- 10 -->
+    <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/><!-- 8.1 -->
+    <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/><!-- 8 -->
+    <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/><!-- 7 -->
+    <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/><!-- Vista -->
+  </application>
+</compatibility>
+</assembly>
index d85679a..8c0537a 100644 (file)
@@ -75,33 +75,10 @@ static void unlock_all (KEYDB_HANDLE hd);
 static void
 try_make_homedir (const char *fname)
 {
-  const char *defhome = standard_homedir ();
-
-  /* Create the directory only if the supplied directory name is the
-     same as the default one.  This way we avoid to create arbitrary
-     directories when a non-default home directory is used.  To cope
-     with HOME, we do compare only the suffix if we see that the
-     default homedir does start with a tilde.  */
   if ( opt.dry_run || opt.no_homedir_creation )
     return;
 
-  if (
-#ifdef HAVE_W32_SYSTEM
-      ( !compare_filenames (fname, defhome) )
-#else
-      ( *defhome == '~'
-        && (strlen(fname) >= strlen (defhome+1)
-            && !strcmp(fname+strlen(fname)-strlen(defhome+1), defhome+1 ) ))
-      || (*defhome != '~'  && !compare_filenames( fname, defhome ) )
-#endif
-      )
-    {
-      if (gnupg_mkdir (fname, "-rwx"))
-        log_info (_("can't create directory '%s': %s\n"),
-                  fname, strerror(errno) );
-      else if (!opt.quiet )
-        log_info (_("directory '%s' created\n"), fname);
-    }
+  gnupg_maybe_make_homedir (fname, opt.quiet);
 }
 
 
@@ -113,8 +90,9 @@ try_make_homedir (const char *fname)
 static gpg_error_t
 maybe_create_keybox (char *filename, int force, int *r_created)
 {
+  gpg_err_code_t ec;
   dotlock_t lockhd = NULL;
-  FILE *fp;
+  estream_t fp;
   int rc;
   mode_t oldmask;
   char *last_slash_in_filename;
@@ -124,8 +102,8 @@ maybe_create_keybox (char *filename, int force, int *r_created)
     *r_created = 0;
 
   /* A quick test whether the filename already exists. */
-  if (!access (filename, F_OK))
-    return !access (filename, R_OK)? 0 : gpg_error (GPG_ERR_EACCES);
+  if (!gnupg_access (filename, F_OK))
+    return !gnupg_access (filename, R_OK)? 0 : gpg_error (GPG_ERR_EACCES);
 
   /* If we don't want to create a new file at all, there is no need to
      go any further - bail out right here.  */
@@ -151,7 +129,7 @@ maybe_create_keybox (char *filename, int force, int *r_created)
                                            not happen though.  */
   save_slash = *last_slash_in_filename;
   *last_slash_in_filename = 0;
-  if (access(filename, F_OK))
+  if (gnupg_access(filename, F_OK))
     {
       static int tried;
 
@@ -160,9 +138,9 @@ maybe_create_keybox (char *filename, int force, int *r_created)
           tried = 1;
           try_make_homedir (filename);
         }
-      if (access (filename, F_OK))
+      if ((ec = gnupg_access (filename, F_OK)))
         {
-          rc = gpg_error_from_syserror ();
+          rc = gpg_error (ec);
           *last_slash_in_filename = save_slash;
           goto leave;
         }
@@ -205,7 +183,7 @@ maybe_create_keybox (char *filename, int force, int *r_created)
 
   /* The file does not yet exist, create it now. */
   oldmask = umask (077);
-  fp = fopen (filename, "wb");
+  fp = es_fopen (filename, "wb");
   if (!fp)
     {
       rc = gpg_error_from_syserror ();
@@ -222,7 +200,7 @@ maybe_create_keybox (char *filename, int force, int *r_created)
   rc = _keybox_write_header_blob (fp, 0);
   if (rc)
     {
-      fclose (fp);
+      es_fclose (fp);
       log_error (_("error creating keybox '%s': %s\n"),
                  filename, gpg_strerror (rc));
       goto leave;
@@ -233,7 +211,7 @@ maybe_create_keybox (char *filename, int force, int *r_created)
   if (r_created)
     *r_created = 1;
 
-  fclose (fp);
+  es_fclose (fp);
   rc = 0;
 
  leave:
@@ -300,14 +278,15 @@ keydb_add_resource (ctrl_t ctrl, const char *url, int force, int *auto_created)
   /* see whether we can determine the filetype */
   if (rt == KEYDB_RESOURCE_TYPE_NONE)
     {
-      FILE *fp = fopen( filename, "rb" );
+      estream_t fp;
 
+      fp = es_fopen( filename, "rb" );
       if (fp)
         {
           u32 magic;
 
           /* FIXME: check for the keybox magic */
-          if (fread (&magic, 4, 1, fp) == 1 )
+          if (es_fread (&magic, 4, 1, fp) == 1 )
             {
               if (magic == 0x13579ace || magic == 0xce9a5713)
                 ; /* GDBM magic - no more support */
@@ -316,7 +295,8 @@ keydb_add_resource (ctrl_t ctrl, const char *url, int force, int *auto_created)
             }
           else /* maybe empty: assume keybox */
             rt = KEYDB_RESOURCE_TYPE_KEYBOX;
-          fclose (fp);
+
+          es_fclose (fp);
         }
       else /* no file yet: create keybox */
         rt = KEYDB_RESOURCE_TYPE_KEYBOX;
index f066892..7087e44 100644 (file)
@@ -2565,7 +2565,7 @@ main (int argc, char **argv)
   gcry_control (GCRYCTL_DISABLE_SECMEM, NULL);
   gcry_control (GCRYCTL_INITIALIZATION_FINISHED, NULL);
 
-  fp = fopen (argv[1], "rb");
+  fp = gnupg_fopen (argv[1], "rb");
   if (!fp)
     {
       fprintf (stderr, "can't open '%s': %s\n", argv[1], strerror (errno));
index 564e779..b433717 100644 (file)
@@ -35,7 +35,7 @@
    NULL indicates that this module has been initialized and if the
    LISTFP is also NULL, no list of qualified signatures exists. */
 static char *listname;
-static FILE *listfp;
+static estream_t listfp;
 
 
 /* Read the trustlist and return entry by entry.  KEY must point to a
@@ -59,7 +59,7 @@ read_list (char *key, char *country, int *lnr)
   if (!listname)
     {
       listname = make_filename (gnupg_datadir (), "qualified.txt", NULL);
-      listfp = fopen (listname, "r");
+      listfp = es_fopen (listname, "r");
       if (!listfp && errno != ENOENT)
         {
           err = gpg_error_from_syserror ();
@@ -73,9 +73,9 @@ read_list (char *key, char *country, int *lnr)
 
   do
     {
-      if (!fgets (line, DIM(line)-1, listfp) )
+      if (!es_fgets (line, DIM(line)-1, listfp) )
         {
-          if (feof (listfp))
+          if (es_feof (listfp))
             return gpg_error (GPG_ERR_EOF);
           return gpg_error_from_syserror ();
         }
@@ -83,7 +83,7 @@ read_list (char *key, char *country, int *lnr)
       if (!*line || line[strlen(line)-1] != '\n')
         {
           /* Eat until end of line. */
-          while ( (c=getc (listfp)) != EOF && c != '\n')
+          while ((c = es_getc (listfp)) != EOF && c != '\n')
             ;
           return gpg_error (*line? GPG_ERR_LINE_TOO_LONG
                                  : GPG_ERR_INCOMPLETE_LINE);
@@ -163,8 +163,8 @@ gpgsm_is_in_qualified_list (ctrl_t ctrl, ksba_cert_t cert, char *country)
   if (listfp)
     {
       /* W32ce has no rewind, thus we use the equivalent code.  */
-      fseek (listfp, 0, SEEK_SET);
-      clearerr (listfp);
+      es_fseek (listfp, 0, SEEK_SET);
+      es_clearerr (listfp);
     }
   while (!(err = read_list (key, mycountry, &lnr)))
     {
index 94a00fa..22b7211 100644 (file)
@@ -25,6 +25,9 @@ spawned programs to their standard error stream, verbose=2 to see what
 programs are executed, or verbose=3 to see even more program output
 and exit codes.
 
+If you want to run gpg under valgrind add with_valgrind=1.
+
+
 ** Inspecting the test environment
 
 To inspect the environment in which tests are running, or to quickly
index 8fe953e..b864005 100644 (file)
 
 (define bin-prefix (getenv "BIN_PREFIX"))
 (define installed? (not (string=? "" bin-prefix)))
+(define with-valgrind? (not (string=? (getenv "with_valgrind") "")))
 
 (define (tool-hardcoded which)
   (let ((t (assoc which tools)))
 ;; (set! gpg `(,@valgrind ,@gpg))
 ;;
 (define valgrind
-  '("/usr/bin/valgrind" --leak-check=full --error-exitcode=154))
+  '("/usr/bin/valgrind" -q --leak-check=no --track-origins=yes
+                        --error-exitcode=154 --exit-on-first-error=yes))
 
 (unless installed?
        (setenv "GNUPG_BUILDDIR" (getenv "objdir") #t))
                   "but got" trust))))
 
 
+;;
+;; Enable checking with valgrind if the envvar "with_valgrind" is set
+;;
+(when with-valgrind?
+  (set! gpg `(,@valgrind ,@gpg)))
+
+
+
 ;; end
index 0b31eca..60bd1e2 100644 (file)
@@ -20,14 +20,35 @@ EXTRA_DIST = \
        Manifest watchgnupg.c no-libgcrypt.c \
        addgnupghome applygnupgdefaults \
        lspgpot mail-signed-keys convert-from-106 sockprox.c \
-       ccidmon.c ChangeLog-2011 gpg-connect-agent-w32info.rc
+       ccidmon.c ChangeLog-2011 \
+       gpgconf-w32info.rc           gpgconf.w32-manifest.in \
+       gpgtar-w32info.rc            gpgtar.w32-manifest.in \
+        gpg-connect-agent-w32info.rc gpg-connect-agent.w32-manifest.in \
+       gpg-check-pattern-w32info.rc gpg-check-pattern.w32-manifest.in \
+       gpg-wks-client-w32info.rc    gpg-wks-client.w32-manifest.in
 
 
 AM_CPPFLAGS =
 include $(top_srcdir)/am/cmacros.am
 
 if HAVE_W32_SYSTEM
-resource_objs += gpg-connect-agent-w32info.o
+gpgconf_robjs =           $(resource_objs) gpgconf-w32info.o
+gpgtar_robjs =            $(resource_objs) gpgtar-w32info.o
+gpg_connect_agent_robjs = $(resource_objs) gpg-connect-agent-w32info.o
+gpg_check_pattern_robjs = $(resource_objs) gpg-check-pattern-w32info.o
+gpg_wks_client_robjs =    $(resource_objs) gpg-wks-client-w32info.o
+
+gpgconf-w32info.o:           gpgconf.w32-manifest
+gpgtar-w32info.o:            gpgtar.w32-manifest
+gpg-connect-agent-w32info.o: gpg-connect-agent.w32-manifest
+gpg-check-pattern-w32info.o: gpg-check-pattern.w32-manifest
+gpg-wks-client-w32info.o:    gpg-wks-client.w32-manifest
+else
+gpg_connect_agent_robjs =
+gpgconf_robjs =
+gpg_check_pattern_robjs =
+gpgtar_robjs =
+gpg_wks_client_robjs =
 endif
 
 AM_CFLAGS = $(LIBGCRYPT_CFLAGS) $(GPG_ERROR_CFLAGS) $(LIBASSUAN_CFLAGS)
@@ -56,6 +77,8 @@ libexec_PROGRAMS = gpg-wks-client
 bin_PROGRAMS = gpgconf gpg-connect-agent ${symcryptrun}
 if !HAVE_W32_SYSTEM
 bin_PROGRAMS += watchgnupg gpgparsemail ${gpg_wks_server} gpgsplit
+else
+bin_PROGRAMS += gpgconf-w32
 endif
 
 libexec_PROGRAMS += gpg-check-pattern
@@ -105,9 +128,14 @@ gpgconf_SOURCES = gpgconf.c gpgconf.h gpgconf-comp.c
 # do not eliminate the supposed-to-be-unused-inline-functions).
 gpgconf_LDADD = $(maybe_commonpth_libs) $(opt_libassuan_libs) \
                 $(LIBINTL) $(LIBGCRYPT_LIBS) $(GPG_ERROR_LIBS) $(NETLIBS) \
-               $(LIBICONV) $(W32SOCKLIBS)
+               $(LIBICONV) $(W32SOCKLIBS) \
+               $(gpgconf_robjs)
 gpgconf_LDFLAGS = $(extra_bin_ldflags)
 
+gpgconf_w32_SOURCES = $(gpgconf_SOURCES)
+gpgconf_w32_LDADD = $(gpgconf_LDADD)
+gpgconf_w32_LDFLAGS = $(gpgconf_LDFLAGS) -Wl,-subsystem,windows
+
 gpgparsemail_SOURCES = gpgparsemail.c rfc822parse.c rfc822parse.h
 gpgparsemail_LDADD =
 
@@ -124,15 +152,14 @@ gpg_connect_agent_LDADD = ../common/libgpgrl.a $(common_libs) \
                          $(LIBASSUAN_LIBS) $(LIBGCRYPT_LIBS) \
                           $(GPG_ERROR_LIBS) \
                           $(LIBREADLINE) $(LIBINTL) $(NETLIBS) $(LIBICONV) \
-                          $(resource_objs)
-
+                          $(gpg_connect_agent_robjs)
 
 gpg_check_pattern_SOURCES = gpg-check-pattern.c
 gpg_check_pattern_CFLAGS = $(LIBGCRYPT_CFLAGS) $(GPG_ERROR_CFLAGS) $(INCICONV)
 gpg_check_pattern_LDADD = $(common_libs) $(regexp_libs) $(LIBGCRYPT_LIBS) \
                          $(GPG_ERROR_LIBS) \
                          $(LIBINTL) $(NETLIBS) $(LIBICONV) $(W32SOCKLIBS) \
-                         $(LIBICONV)
+                         $(LIBICONV) $(gpg_check_pattern_robjs)
 
 gpgtar_SOURCES = \
        gpgtar.c gpgtar.h \
@@ -141,7 +168,8 @@ gpgtar_SOURCES = \
        gpgtar-list.c
 gpgtar_CFLAGS = $(GPG_ERROR_CFLAGS)
 gpgtar_LDADD = $(libcommon) $(LIBGCRYPT_LIBS) $(GPG_ERROR_LIBS) \
-               $(LIBINTL) $(NETLIBS) $(LIBICONV) $(W32SOCKLIBS)
+               $(LIBINTL) $(NETLIBS) $(LIBICONV) $(W32SOCKLIBS) \
+              $(gpgtar_robjs)
 
 gpg_wks_server_SOURCES = \
        gpg-wks-server.c \
@@ -171,7 +199,8 @@ gpg_wks_client_SOURCES = \
 gpg_wks_client_CFLAGS = $(LIBASSUAN_CFLAGS) $(GPG_ERROR_CFLAGS) $(INCICONV)
 gpg_wks_client_LDADD = $(libcommon) \
                       $(LIBASSUAN_LIBS) $(LIBGCRYPT_LIBS) $(GPG_ERROR_LIBS) \
-                      $(LIBINTL) $(LIBICONV) $(NETLIBS)
+                      $(LIBINTL) $(LIBICONV) $(NETLIBS) \
+                      $(gpg_wks_client_robjs)
 
 
 # Make sure that all libs are build before we use them.  This is
diff --git a/tools/gpg-check-pattern-w32info.rc b/tools/gpg-check-pattern-w32info.rc
new file mode 100644 (file)
index 0000000..ed50301
--- /dev/null
@@ -0,0 +1,52 @@
+/* gpg-check-pattern-w32info.rc                             -*- c -*-
+ * Copyright (C) 2020 g10 Code GmbH
+ *
+ * This file is free software; as a special exception the author gives
+ * unlimited permission to copy and/or distribute it, with or without
+ * modifications, as long as this notice is preserved.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+#include "afxres.h"
+#include "../common/w32info-rc.h"
+
+1 ICON "../common/gnupg.ico"
+
+1 VERSIONINFO
+  FILEVERSION    W32INFO_VI_FILEVERSION
+  PRODUCTVERSION W32INFO_VI_PRODUCTVERSION
+  FILEFLAGSMASK  0x3fL
+#ifdef _DEBUG
+  FILEFLAGS      0x01L    /* VS_FF_DEBUG (0x1)*/
+#else
+  FILEFLAGS      0x00L
+#endif
+  FILEOS         0x40004L /* VOS_NT (0x40000) | VOS__WINDOWS32 (0x4)  */
+  FILETYPE       0x1L     /* VFT_APP (0x1)  */
+  FILESUBTYPE    0x0L     /* VFT2_UNKNOWN   */
+  BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "040904b0"  /* US English (0409), Unicode (04b0) */
+        BEGIN
+            VALUE "FileDescription", L"GnuPG\x2019s pattern checker\0"
+            VALUE "InternalName", "gpg-check-pattern\0"
+            VALUE "OriginalFilename", "gpg-check-pattern.exe\0"
+            VALUE "ProductName",    W32INFO_PRODUCTNAME
+            VALUE "ProductVersion", W32INFO_PRODUCTVERSION
+            VALUE "CompanyName", W32INFO_COMPANYNAME
+            VALUE "FileVersion", W32INFO_FILEVERSION
+            VALUE "LegalCopyright", W32INFO_LEGALCOPYRIGHT
+            VALUE "Comments",    W32INFO_COMMENTS
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+      VALUE "Translation", 0x409, 0x4b0
+    END
+  END
+
+1 RT_MANIFEST "gpg-check-pattern.w32-manifest"
index e4906d2..46b9e58 100644 (file)
@@ -227,7 +227,7 @@ main (int argc, char **argv )
 static char *
 read_file (const char *fname, size_t *r_length)
 {
-  FILE *fp;
+  estream_t fp;
   char *buf;
   size_t buflen;
 
@@ -235,10 +235,8 @@ read_file (const char *fname, size_t *r_length)
     {
       size_t nread, bufsize = 0;
 
-      fp = stdin;
-#ifdef HAVE_DOSISH_SYSTEM
-      setmode ( fileno(fp) , O_BINARY );
-#endif
+      fp = es_stdin;
+      es_set_binary (fp);
       buf = NULL;
       buflen = 0;
 #define NCHUNK 8192
@@ -250,8 +248,8 @@ read_file (const char *fname, size_t *r_length)
           else
             buf = xrealloc (buf, bufsize+1);
 
-          nread = fread (buf+buflen, 1, NCHUNK, fp);
-          if (nread < NCHUNK && ferror (fp))
+          nread = es_fread (buf+buflen, 1, NCHUNK, fp);
+          if (nread < NCHUNK && es_ferror (fp))
             {
               log_error ("error reading '[stdin]': %s\n", strerror (errno));
               xfree (buf);
@@ -267,30 +265,30 @@ read_file (const char *fname, size_t *r_length)
     {
       struct stat st;
 
-      fp = fopen (fname, "rb");
+      fp = es_fopen (fname, "rb");
       if (!fp)
         {
           log_error ("can't open '%s': %s\n", fname, strerror (errno));
           return NULL;
         }
 
-      if (fstat (fileno(fp), &st))
+      if (fstat (es_fileno (fp), &st))
         {
           log_error ("can't stat '%s': %s\n", fname, strerror (errno));
-          fclose (fp);
+          es_fclose (fp);
           return NULL;
         }
 
       buflen = st.st_size;
       buf = xmalloc (buflen+1);
-      if (fread (buf, buflen, 1, fp) != 1)
+      if (es_fread (buf, buflen, 1, fp) != 1)
         {
           log_error ("error reading '%s': %s\n", fname, strerror (errno));
-          fclose (fp);
+          es_fclose (fp);
           xfree (buf);
           return NULL;
         }
-      fclose (fp);
+      es_fclose (fp);
     }
   buf[buflen] = 0;
   *r_length = buflen;
diff --git a/tools/gpg-check-pattern.w32-manifest.in b/tools/gpg-check-pattern.w32-manifest.in
new file mode 100644 (file)
index 0000000..2a5f8ec
--- /dev/null
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+<description>GNU Privacy Guard (Pattern checker)</description>
+<assemblyIdentity
+    type="win32"
+    name="GnuPG.gpg-check-pattern"
+    version="@BUILD_VERSION@"
+    />
+<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
+  <application>
+    <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/><!-- 10 -->
+    <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/><!-- 8.1 -->
+    <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/><!-- 8 -->
+    <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/><!-- 7 -->
+    <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/><!-- Vista -->
+  </application>
+</compatibility>
+</assembly>
index 4e7b19d..06612f8 100644 (file)
@@ -1,4 +1,4 @@
-/* scdaemon-w32info.rc                                        -*- c -*-
+/* gpg-connect-agent-w32info.rc                               -*- c -*-
  * Copyright (C) 2013 g10 Code GmbH
  *
  * This file is free software; as a special exception the author gives
@@ -32,8 +32,7 @@
     BEGIN
         BLOCK "040904b0"  /* US English (0409), Unicode (04b0) */
         BEGIN
-            VALUE "FileDescription", L"GnuPG\x2019s command line access \
-to the agent\0"
+            VALUE "FileDescription", L"GnuPG\x2019s IPC tool\0"
             VALUE "InternalName", "gpg-connect-agent\0"
             VALUE "OriginalFilename", "gpg-connect-agent.exe\0"
             VALUE "ProductName",    W32INFO_PRODUCTNAME
@@ -49,3 +48,5 @@ to the agent\0"
       VALUE "Translation", 0x409, 0x4b0
     END
   END
+
+1 RT_MANIFEST "gpg-connect-agent.w32-manifest"
index 7eb7ffa..0dabdad 100644 (file)
@@ -166,7 +166,7 @@ typedef struct loopline_s *loopline_t;
 static pid_t server_pid = (pid_t)(-1);
 
 /* The current datasink file or NULL.  */
-static FILE *current_datasink;
+static estream_t current_datasink;
 
 /* A list of open file descriptors. */
 static struct
@@ -874,7 +874,7 @@ clear_definq (void)
 static void
 do_sendfd (assuan_context_t ctx, char *line)
 {
-  FILE *fp;
+  estream_t fp;
   char *name, *mode, *p;
   int rc, fd;
 
@@ -900,14 +900,14 @@ do_sendfd (assuan_context_t ctx, char *line)
     }
 
   /* Open and send. */
-  fp = fopen (name, mode);
+  fp = es_fopen (name, mode);
   if (!fp)
     {
       log_error ("can't open '%s' in \"%s\" mode: %s\n",
                  name, mode, strerror (errno));
       return;
     }
-  fd = fileno (fp);
+  fd = es_fileno (fp);
 
   if (opt.verbose)
     log_error ("file '%s' opened in \"%s\" mode, fd=%d\n",
@@ -916,7 +916,7 @@ do_sendfd (assuan_context_t ctx, char *line)
   rc = assuan_sendfd (ctx, INT2FD (fd) );
   if (rc)
     log_error ("sending descriptor %d failed: %s\n", fd, gpg_strerror (rc));
-  fclose (fp);
+  es_fclose (fp);
 }
 
 
@@ -932,7 +932,7 @@ do_recvfd (assuan_context_t ctx, char *line)
 static void
 do_open (char *line)
 {
-  FILE *fp;
+  estream_t fp;
   char *varname, *name, *mode, *p;
   int fd;
 
@@ -976,14 +976,14 @@ do_open (char *line)
     }
 
   /* Open and send. */
-  fp = fopen (name, mode);
+  fp = es_fopen (name, mode);
   if (!fp)
     {
       log_error ("can't open '%s' in \"%s\" mode: %s\n",
                  name, mode, strerror (errno));
       return;
     }
-  fd = dup (fileno (fp));
+  fd = dup (es_fileno (fp));
   if (fd >= 0 && fd < DIM (open_fd_table))
     {
       open_fd_table[fd].inuse = 1;
@@ -1033,7 +1033,7 @@ do_open (char *line)
       if (fd != -1)
         close (fd); /* Table was full.  */
     }
-  fclose (fp);
+  es_fclose (fp);
 }
 
 
@@ -1182,6 +1182,7 @@ main (int argc, char **argv)
 
   assuan_set_gpg_err_source (0);
 
+  gnupg_init_signals (0, NULL);
 
   opt.autostart = 1;
   opt.connect_flags = 1;
@@ -1565,17 +1566,17 @@ main (int argc, char **argv)
 
               if (current_datasink)
                 {
-                  if (current_datasink != stdout)
-                    fclose (current_datasink);
+                  if (current_datasink != es_stdout)
+                    es_fclose (current_datasink);
                   current_datasink = NULL;
                 }
               tmpline = opt.enable_varsubst? substitute_line (p) : NULL;
               fname = tmpline? tmpline : p;
               if (fname && !strcmp (fname, "-"))
-                current_datasink = stdout;
+                current_datasink = es_stdout;
               else if (fname && *fname)
                 {
-                  current_datasink = fopen (fname, "wb");
+                  current_datasink = es_fopen (fname, "wb");
                   if (!current_datasink)
                     log_error ("can't open '%s': %s\n",
                                fname, strerror (errno));
@@ -1904,6 +1905,7 @@ handle_inquire (assuan_context_t ctx, char *line)
 {
   const char *name;
   definq_t d;
+  /* FIXME: Due to the use of popen we can't easily switch to estream.  */
   FILE *fp = NULL;
   char buffer[1024];
   int rc, n;
@@ -1965,7 +1967,7 @@ handle_inquire (assuan_context_t ctx, char *line)
         }
       else
         {
-          fp = fopen (d->file, "rb");
+          fp = gnupg_fopen (d->file, "rb");
           if (!fp)
             log_error ("error opening '%s': %s\n", d->file, strerror (errno));
           else if (opt.verbose)
@@ -2055,7 +2057,7 @@ read_and_print_response (assuan_context_t ctx, int withhash, int *r_goterr)
                     }
                   else
                     c = *s;
-                  putc (c, current_datasink);
+                  es_putc (c, current_datasink);
                 }
             }
           else if (opt.hex)
@@ -2126,7 +2128,7 @@ read_and_print_response (assuan_context_t ctx, int withhash, int *r_goterr)
         {
           if (need_lf)
             {
-              if (!current_datasink || current_datasink != stdout)
+              if (!current_datasink || current_datasink != es_stdout)
                 putchar ('\n');
               need_lf = 0;
             }
@@ -2135,7 +2137,7 @@ read_and_print_response (assuan_context_t ctx, int withhash, int *r_goterr)
               && line[0] == 'S'
               && (line[1] == '\0' || line[1] == ' '))
             {
-              if (!current_datasink || current_datasink != stdout)
+              if (!current_datasink || current_datasink != es_stdout)
                 {
                   fwrite (line, linelen, 1, stdout);
                   putchar ('\n');
@@ -2145,7 +2147,7 @@ read_and_print_response (assuan_context_t ctx, int withhash, int *r_goterr)
                    && line[0] == 'O' && line[1] == 'K'
                    && (line[2] == '\0' || line[2] == ' '))
             {
-              if (!current_datasink || current_datasink != stdout)
+              if (!current_datasink || current_datasink != es_stdout)
                 {
                   fwrite (line, linelen, 1, stdout);
                   putchar ('\n');
@@ -2163,7 +2165,7 @@ read_and_print_response (assuan_context_t ctx, int withhash, int *r_goterr)
               if (!errval)
                 errval = -1;
               set_int_var ("?", errval);
-              if (!current_datasink || current_datasink != stdout)
+              if (!current_datasink || current_datasink != es_stdout)
                 {
                   fwrite (line, linelen, 1, stdout);
                   putchar ('\n');
@@ -2177,7 +2179,7 @@ read_and_print_response (assuan_context_t ctx, int withhash, int *r_goterr)
                    && line[6] == 'E'
                    && (line[7] == '\0' || line[7] == ' '))
             {
-              if (!current_datasink || current_datasink != stdout)
+              if (!current_datasink || current_datasink != es_stdout)
                 {
                   fwrite (line, linelen, 1, stdout);
                   putchar ('\n');
@@ -2189,7 +2191,7 @@ read_and_print_response (assuan_context_t ctx, int withhash, int *r_goterr)
                    && line[0] == 'E' && line[1] == 'N' && line[2] == 'D'
                    && (line[3] == '\0' || line[3] == ' '))
             {
-              if (!current_datasink || current_datasink != stdout)
+              if (!current_datasink || current_datasink != es_stdout)
                 {
                   fwrite (line, linelen, 1, stdout);
                   putchar ('\n');
diff --git a/tools/gpg-connect-agent.w32-manifest.in b/tools/gpg-connect-agent.w32-manifest.in
new file mode 100644 (file)
index 0000000..aba5420
--- /dev/null
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+<description>GNU Privacy Guard (IPC tool)</description>
+<assemblyIdentity
+    type="win32"
+    name="GnuPG.gpg-connect-agent"
+    version="@BUILD_VERSION@"
+    />
+<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
+  <application>
+    <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/><!-- 10 -->
+    <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/><!-- 8.1 -->
+    <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/><!-- 8 -->
+    <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/><!-- 7 -->
+    <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/><!-- Vista -->
+  </application>
+</compatibility>
+</assembly>
diff --git a/tools/gpg-wks-client-w32info.rc b/tools/gpg-wks-client-w32info.rc
new file mode 100644 (file)
index 0000000..60021a7
--- /dev/null
@@ -0,0 +1,52 @@
+/* gpg-wks-client-w32info.rc                              -*- c -*-
+ * Copyright (C) 2020 g10 Code GmbH
+ *
+ * This file is free software; as a special exception the author gives
+ * unlimited permission to copy and/or distribute it, with or without
+ * modifications, as long as this notice is preserved.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+#include "afxres.h"
+#include "../common/w32info-rc.h"
+
+1 ICON "../common/gnupg.ico"
+
+1 VERSIONINFO
+  FILEVERSION    W32INFO_VI_FILEVERSION
+  PRODUCTVERSION W32INFO_VI_PRODUCTVERSION
+  FILEFLAGSMASK  0x3fL
+#ifdef _DEBUG
+  FILEFLAGS      0x01L    /* VS_FF_DEBUG (0x1)*/
+#else
+  FILEFLAGS      0x00L
+#endif
+  FILEOS         0x40004L /* VOS_NT (0x40000) | VOS__WINDOWS32 (0x4)  */
+  FILETYPE       0x1L     /* VFT_APP (0x1)  */
+  FILESUBTYPE    0x0L     /* VFT2_UNKNOWN   */
+  BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "040904b0"  /* US English (0409), Unicode (04b0) */
+        BEGIN
+            VALUE "FileDescription", L"GnuPG\x2019s Web Key Service client\0"
+            VALUE "InternalName", "gpg-wks-client\0"
+            VALUE "OriginalFilename", "gpg-wks-client.exe\0"
+            VALUE "ProductName",    W32INFO_PRODUCTNAME
+            VALUE "ProductVersion", W32INFO_PRODUCTVERSION
+            VALUE "CompanyName", W32INFO_COMPANYNAME
+            VALUE "FileVersion", W32INFO_FILEVERSION
+            VALUE "LegalCopyright", W32INFO_LEGALCOPYRIGHT
+            VALUE "Comments",    W32INFO_COMMENTS
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+      VALUE "Translation", 0x409, 0x4b0
+    END
+  END
+
+1 RT_MANIFEST "gpg-wks-client.w32-manifest"
index 5ec670e..56768aa 100644 (file)
@@ -307,7 +307,7 @@ main (int argc, char **argv)
     {
       struct stat sb;
 
-      if (stat (opt.directory, &sb))
+      if (gnupg_stat (opt.directory, &sb))
         {
           err = gpg_error_from_syserror ();
           log_error ("error accessing directory '%s': %s\n",
diff --git a/tools/gpg-wks-client.w32-manifest.in b/tools/gpg-wks-client.w32-manifest.in
new file mode 100644 (file)
index 0000000..ba2508e
--- /dev/null
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+<description>GNU Privacy Guard (Web Key Service client)</description>
+<assemblyIdentity
+    type="win32"
+    name="GnuPG.gpg-wks-client"
+    version="@BUILD_VERSION@"
+    />
+<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
+  <application>
+    <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/><!-- 10 -->
+    <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/><!-- 8.1 -->
+    <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/><!-- 8 -->
+    <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/><!-- 7 -->
+    <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/><!-- Vista -->
+  </application>
+</compatibility>
+</assembly>
index 8cdbfaf..addafa2 100644 (file)
@@ -332,7 +332,7 @@ main (int argc, char **argv)
   {
     struct stat sb;
 
-    if (stat (opt.directory, &sb))
+    if (gnupg_stat (opt.directory, &sb))
       {
         err = gpg_error_from_syserror ();
         log_error ("error accessing directory '%s': %s\n",
@@ -1177,7 +1177,7 @@ process_new_key (server_ctx_t ctx, estream_t key)
           goto leave;
         }
 
-      if (access (dname, W_OK))
+      if (gnupg_access (dname, W_OK))
         {
           log_info ("skipping address '%s': Domain not configured\n", sl->mbox);
           continue;
@@ -1454,7 +1454,7 @@ check_and_publish (server_ctx_t ctx, const char *address, const char *nonce)
       err = gpg_error_from_syserror ();
       goto leave;
     }
-  if (!access (fnewname, W_OK))
+  if (!gnupg_access (fnewname, W_OK))
     {
       /* Yes, we have a dane directory.  */
       s = strchr (address, '@');
@@ -1608,22 +1608,22 @@ static gpg_error_t
 get_domain_list (strlist_t *r_list)
 {
   gpg_error_t err;
-  DIR *dir = NULL;
+  gnupg_dir_t dir = NULL;
   char *fname = NULL;
-  struct dirent *dentry;
+  gnupg_dirent_t dentry;
   struct stat sb;
   strlist_t list = NULL;
 
   *r_list = NULL;
 
-  dir = opendir (opt.directory);
+  dir = gnupg_opendir (opt.directory);
   if (!dir)
     {
       err = gpg_error_from_syserror ();
       goto leave;
     }
 
-  while ((dentry = readdir (dir)))
+  while ((dentry = gnupg_readdir (dir)))
     {
       if (*dentry->d_name == '.')
         continue;
@@ -1640,7 +1640,7 @@ get_domain_list (strlist_t *r_list)
           goto leave;
         }
 
-      if (stat (fname, &sb))
+      if (gnupg_stat (fname, &sb))
         {
           err = gpg_error_from_syserror ();
           log_error ("error accessing '%s': %s\n", fname, gpg_strerror (err));
@@ -1663,8 +1663,7 @@ get_domain_list (strlist_t *r_list)
 
  leave:
   free_strlist (list);
-  if (dir)
-    closedir (dir);
+  gnupg_closedir (dir);
   xfree (fname);
   return err;
 }
@@ -1677,8 +1676,8 @@ expire_one_domain (const char *top_dirname, const char *domain)
   gpg_error_t err;
   char *dirname;
   char *fname = NULL;
-  DIR *dir = NULL;
-  struct dirent *dentry;
+  gnupg_dir_t dir = NULL;
+  gnupg_dirent_t dentry;
   struct stat sb;
   time_t now = gnupg_get_time ();
 
@@ -1691,7 +1690,7 @@ expire_one_domain (const char *top_dirname, const char *domain)
       goto leave;
     }
 
-  dir = opendir (dirname);
+  dir = gnupg_opendir (dirname);
   if (!dir)
     {
       err = gpg_error_from_syserror ();
@@ -1700,7 +1699,7 @@ expire_one_domain (const char *top_dirname, const char *domain)
       goto leave;
     }
 
-  while ((dentry = readdir (dir)))
+  while ((dentry = gnupg_readdir (dir)))
     {
       if (*dentry->d_name == '.')
         continue;
@@ -1718,7 +1717,7 @@ expire_one_domain (const char *top_dirname, const char *domain)
           log_info ("garbage file '%s' ignored\n", fname);
           continue;
         }
-      if (stat (fname, &sb))
+      if (gnupg_stat (fname, &sb))
         {
           err = gpg_error_from_syserror ();
           log_error ("error accessing '%s': %s\n", fname, gpg_strerror (err));
@@ -1749,8 +1748,7 @@ expire_one_domain (const char *top_dirname, const char *domain)
   err = 0;
 
  leave:
-  if (dir)
-    closedir (dir);
+  gnupg_closedir (dir);
   xfree (dirname);
   xfree (fname);
   return err;
@@ -1790,7 +1788,7 @@ command_list_domains (void)
     { "pending", "-rwx" },
     { "hu",      "-rwxr-xr-x" }
   };
-
+  gpg_err_code_t ec;
   gpg_error_t err;
   strlist_t domaindirs;
   strlist_t sl;
@@ -1827,9 +1825,9 @@ command_list_domains (void)
               err = gpg_error_from_syserror ();
               goto leave;
             }
-          if (access (fname, W_OK))
+          if ((ec = gnupg_access (fname, W_OK)))
             {
-              err = gpg_error_from_syserror ();
+              err = gpg_error (ec);
               if (gpg_err_code (err) == GPG_ERR_ENOENT)
                 {
                   if (gnupg_mkdir (fname, requireddirs[i].perm))
@@ -1857,9 +1855,9 @@ command_list_domains (void)
           err = gpg_error_from_syserror ();
           goto leave;
         }
-      if (access (fname, F_OK))
+      if ((ec = gnupg_access (fname, F_OK)))
         {
-          err = gpg_error_from_syserror ();
+          err = gpg_error (ec);
           if (gpg_err_code (err) == GPG_ERR_ENOENT)
             log_error ("domain %s: submission address not configured\n",
                        domain);
@@ -1936,6 +1934,7 @@ command_cron (void)
 static gpg_error_t
 command_check_key (const char *userid)
 {
+  gpg_err_code_t ec;
   gpg_error_t err;
   char *addrspec = NULL;
   char *fname = NULL;
@@ -1944,9 +1943,9 @@ command_check_key (const char *userid)
   if (err)
     goto leave;
 
-  if (access (fname, R_OK))
+  if ((ec = gnupg_access (fname, R_OK)))
     {
-      err = gpg_error_from_syserror ();
+      err = gpg_error (ec);
       if (opt_with_file)
         es_printf ("%s n %s\n", addrspec, fname);
       if (gpg_err_code (err) == GPG_ERR_ENOENT)
index 135d800..5903cf4 100644 (file)
@@ -2115,7 +2115,7 @@ retrieve_options_from_program (gc_component_t component, gc_backend_t backend,
   argv[i++] = "--gpgconf-list";
   argv[i++] = NULL;
 
-  if (only_installed && access (pgmname, X_OK))
+  if (only_installed && gnupg_access (pgmname, X_OK))
     {
       return;  /* The component is not installed.  */
     }
@@ -3016,8 +3016,9 @@ change_options_program (gc_component_t component, gc_backend_t backend,
   *dest_filenamep = dest_filename;
   *orig_filenamep = orig_filename;
 
-  /* Use open() so that we can use O_EXCL.  */
-  fd = open (src_filename, O_CREAT | O_EXCL | O_WRONLY, 0644);
+  /* Use open() so that we can use O_EXCL.
+   * FIXME: gpgrt has an x flag for quite some time now - use that.  */
+  fd = gnupg_open (src_filename, O_CREAT | O_EXCL | O_WRONLY, 0644);
   if (fd < 0)
     return -1;
   src_file = gpgrt_fdopen (fd, "w");
@@ -4055,7 +4056,7 @@ gc_apply_profile (const char *fname)
        * is installed and use that instead of the given file name.  */
       fname_buffer = xstrconcat (gnupg_datadir (), DIRSEP_S,
                                  fname, ".prf", NULL);
-      if (!access (fname_buffer, F_OK))
+      if (!gnupg_access (fname_buffer, F_OK))
         fname = fname_buffer;
     }
 
diff --git a/tools/gpgconf-w32info.rc b/tools/gpgconf-w32info.rc
new file mode 100644 (file)
index 0000000..cd8df29
--- /dev/null
@@ -0,0 +1,52 @@
+/* gpgconf-w32info.rc                                         -*- c -*-
+ * Copyright (C) 2020 g10 Code GmbH
+ *
+ * This file is free software; as a special exception the author gives
+ * unlimited permission to copy and/or distribute it, with or without
+ * modifications, as long as this notice is preserved.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+#include "afxres.h"
+#include "../common/w32info-rc.h"
+
+1 ICON "../common/gnupg.ico"
+
+1 VERSIONINFO
+  FILEVERSION    W32INFO_VI_FILEVERSION
+  PRODUCTVERSION W32INFO_VI_PRODUCTVERSION
+  FILEFLAGSMASK  0x3fL
+#ifdef _DEBUG
+  FILEFLAGS      0x01L    /* VS_FF_DEBUG (0x1)*/
+#else
+  FILEFLAGS      0x00L
+#endif
+  FILEOS         0x40004L /* VOS_NT (0x40000) | VOS__WINDOWS32 (0x4)  */
+  FILETYPE       0x1L     /* VFT_APP (0x1)  */
+  FILESUBTYPE    0x0L     /* VFT2_UNKNOWN   */
+  BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "040904b0"  /* US English (0409), Unicode (04b0) */
+        BEGIN
+            VALUE "FileDescription", L"GnuPG\x2019s config tool\0"
+            VALUE "InternalName", "gpgconf\0"
+            VALUE "OriginalFilename", "gpgconf.exe\0"
+            VALUE "ProductName",    W32INFO_PRODUCTNAME
+            VALUE "ProductVersion", W32INFO_PRODUCTVERSION
+            VALUE "CompanyName", W32INFO_COMPANYNAME
+            VALUE "FileVersion", W32INFO_FILEVERSION
+            VALUE "LegalCopyright", W32INFO_LEGALCOPYRIGHT
+            VALUE "Comments",    W32INFO_COMMENTS
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+      VALUE "Translation", 0x409, 0x4b0
+    END
+  END
+
+1 RT_MANIFEST "gpgconf.w32-manifest"
index 945d0e5..b6afc8b 100644 (file)
@@ -31,6 +31,7 @@
 #include "../common/sysutils.h"
 #include "../common/init.h"
 #include "../common/status.h"
+#include "../common/exechelp.h"
 
 
 /* Constants to identify the commands and options. */
@@ -65,7 +66,8 @@ enum cmd_and_opt_values
     aCreateSocketDir,
     aRemoveSocketDir,
     aApplyProfile,
-    aReload
+    aReload,
+    aShowVersions
   };
 
 
@@ -96,6 +98,8 @@ static ARGPARSE_OPTS opts[] =
     { aKill,          "kill", 256,   N_("kill a given component")},
     { aCreateSocketDir, "create-socketdir", 256, "@"},
     { aRemoveSocketDir, "remove-socketdir", 256, "@"},
+    ARGPARSE_c (aShowVersions, "show-versions", "@"),
+
 
     { 301, NULL, 0, N_("@\nOptions:\n ") },
 
@@ -120,6 +124,9 @@ static ARGPARSE_OPTS opts[] =
  * this is NULL.  */
 static estream_t statusfp;
 
+static void show_versions (estream_t fp);
+
+
 
 /* Print usage information and provide strings for help. */
 static const char *
@@ -594,6 +601,7 @@ main (int argc, char **argv)
         case aKill:
         case aCreateSocketDir:
         case aRemoveSocketDir:
+        case aShowVersions:
          cmd = pargs.r_opt;
          break;
 
@@ -773,12 +781,16 @@ main (int argc, char **argv)
          es_putc ('\n', es_stderr);
          gpgconf_failure (GPG_ERR_USER_2);
        }
+      if (!opt.dry_run && gnupg_access (gnupg_homedir (), F_OK))
+        gnupg_maybe_make_homedir (gnupg_homedir (), opt.quiet);
       gc_component_retrieve_options (-1);
       if (gc_process_gpgconf_conf (NULL, 1, 1, NULL))
         gpgconf_failure (0);
       break;
 
     case aApplyProfile:
+      if (!opt.dry_run && gnupg_access (gnupg_homedir (), F_OK))
+        gnupg_maybe_make_homedir (gnupg_homedir (), opt.quiet);
       gc_component_retrieve_options (-1);
       if (gc_apply_profile (fname))
         gpgconf_failure (0);
@@ -897,6 +909,13 @@ main (int argc, char **argv)
       }
       break;
 
+    case aShowVersions:
+      {
+        get_outfp (&outfp);
+        show_versions (outfp);
+      }
+      break;
+
     }
 
   if (outfp != es_stdout)
@@ -923,3 +942,155 @@ gpgconf_failure (gpg_error_t err)
      gpg_err_code (err) == GPG_ERR_USER_2? GPG_ERR_EINVAL : err);
   exit (gpg_err_code (err) == GPG_ERR_USER_2? 2 : 1);
 }
+
+
+
+/* Parse the revision part from the extended version blurb.  */
+static const char *
+get_revision_from_blurb (const char *blurb, int *r_len)
+{
+  const char *s = blurb? blurb : "";
+  int n;
+
+  for (; *s; s++)
+    if (*s == '\n' && s[1] == '(')
+      break;
+  if (s)
+    {
+      s += 2;
+      for (n=0; s[n] && s[n] != ' '; n++)
+        ;
+    }
+  else
+    {
+      s = "?";
+      n = 1;
+    }
+  *r_len = n;
+  return s;
+}
+
+
+static void
+show_version_gnupg (estream_t fp)
+{
+  es_fprintf (fp, "* GnuPG %s (%s)\n%s\n",
+              strusage (13), BUILD_REVISION, strusage (17));
+#ifdef HAVE_W32_SYSTEM
+  {
+    OSVERSIONINFO osvi = { sizeof (osvi) };
+
+    GetVersionEx (&osvi);
+    es_fprintf (fp, "Windows %lu.%lu build %lu%s%s%s\n",
+                (unsigned long)osvi.dwMajorVersion,
+                (unsigned long)osvi.dwMinorVersion,
+                (unsigned long)osvi.dwBuildNumber,
+                *osvi.szCSDVersion? " (":"",
+                osvi.szCSDVersion,
+                *osvi.szCSDVersion? ")":""
+                );
+  }
+#endif /*HAVE_W32_SYSTEM*/
+}
+
+
+static void
+show_version_libgcrypt (estream_t fp)
+{
+  const char *s;
+  int n;
+
+  s = get_revision_from_blurb (gcry_check_version ("\x01\x01"), &n);
+  es_fprintf (fp, "* Libgcrypt %s (%.*s)\n",
+              gcry_check_version (NULL), n, s);
+  s = gcry_get_config (0, NULL);
+  if (s)
+    es_fputs (s, fp);
+}
+
+
+static void
+show_version_gpgrt (estream_t fp)
+{
+  const char *s;
+  int n;
+
+  s = get_revision_from_blurb (gpg_error_check_version ("\x01\x01"), &n);
+  es_fprintf (fp, "* GpgRT %s (%.*s)\n",
+              gpg_error_check_version (NULL), n, s);
+}
+
+
+/* Printing version information for other libraries is problematic
+ * because we don't want to link gpgconf to all these libraries.  The
+ * best solution is delegating this to dirmngr which uses libassuan,
+ * libksba, libnpth and ntbtls anyway.  */
+static void
+show_versions_via_dirmngr (estream_t fp)
+{
+  gpg_error_t err;
+  const char *pgmname;
+  const char *argv[2];
+  estream_t outfp;
+  pid_t pid;
+  char *line = NULL;
+  size_t line_len = 0;
+  ssize_t length;
+  int exitcode;
+
+  pgmname = gnupg_module_name (GNUPG_MODULE_NAME_DIRMNGR);
+  argv[0] = "--gpgconf-versions";
+  argv[1] = NULL;
+  err = gnupg_spawn_process (pgmname, argv, NULL, NULL, 0,
+                             NULL, &outfp, NULL, &pid);
+  if (err)
+    {
+      log_error ("error spawning %s: %s", pgmname, gpg_strerror (err));
+      es_fprintf (fp, "[error: can't get further info]\n");
+      return;
+    }
+
+  while ((length = es_read_line (outfp, &line, &line_len, NULL)) > 0)
+    {
+      /* Strip newline and carriage return, if present.  */
+      while (length > 0
+            && (line[length - 1] == '\n' || line[length - 1] == '\r'))
+       line[--length] = '\0';
+      es_fprintf (fp, "%s\n", line);
+    }
+  if (length < 0 || es_ferror (outfp))
+    {
+      err = gpg_error_from_syserror ();
+      log_error ("error reading from %s: %s\n", pgmname, gpg_strerror (err));
+    }
+  if (es_fclose (outfp))
+    {
+      err = gpg_error_from_syserror ();
+      log_error ("error closing output stream of %s: %s\n",
+                 pgmname, gpg_strerror (err));
+    }
+
+  err = gnupg_wait_process (pgmname, pid, 1, &exitcode);
+  if (err)
+    {
+      log_error ("running %s failed (exitcode=%d): %s\n",
+                 pgmname, exitcode, gpg_strerror (err));
+      es_fprintf (fp, "[error: can't get further info]\n");
+    }
+  gnupg_release_process (pid);
+  xfree (line);
+}
+
+
+/* Show all kind of version information.  */
+static void
+show_versions (estream_t fp)
+{
+  show_version_gnupg (fp);
+  es_fputc ('\n', fp);
+  show_version_libgcrypt (fp);
+  es_fputc ('\n', fp);
+  show_version_gpgrt (fp);
+  es_fputc ('\n', fp);
+  show_versions_via_dirmngr (fp);
+}
diff --git a/tools/gpgconf.w32-manifest.in b/tools/gpgconf.w32-manifest.in
new file mode 100644 (file)
index 0000000..d7a1b01
--- /dev/null
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+<description>GNU Privacy Guard (Config tool)</description>
+<assemblyIdentity
+    type="win32"
+    name="GnuPG.gpgconf"
+    version="@BUILD_VERSION@"
+    />
+<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
+  <application>
+    <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/><!-- 10 -->
+    <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/><!-- 8.1 -->
+    <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/><!-- 8 -->
+    <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/><!-- 7 -->
+    <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/><!-- Vista -->
+  </application>
+</compatibility>
+</assembly>
index 674be62..e844008 100644 (file)
@@ -552,7 +552,7 @@ write_part (FILE *fpin, unsigned long pktlen,
     {
       if (opt_verbose)
         log_info ("writing '%s'\n", outname);
-      fpout = fopen (outname, "wb");
+      fpout = gnupg_fopen (outname, "wb");
       if (!fpout)
         {
           log_error ("error creating '%s': %s\n", outname, strerror(errno));
@@ -873,7 +873,7 @@ split_packets (const char *fname)
       fp = stdin;
       fname = "-";
     }
-  else if ( !(fp = fopen (fname,"rb")) )
+  else if ( !(fp = gnupg_fopen (fname,"rb")) )
     {
       log_error ("can't open '%s': %s\n", fname, strerror (errno));
       return;
index 8a54c70..c196b96 100644 (file)
@@ -42,7 +42,7 @@
 #include "gpgtar.h"
 
 #ifndef HAVE_LSTAT
-#define lstat(a,b) stat ((a), (b))
+#define lstat(a,b) gnupg_stat ((a), (b))
 #endif
 
 
@@ -301,6 +301,8 @@ scan_directory (const char *dname, scanctrl_t scanctrl)
   gpg_error_t err = 0;
 
 #ifdef HAVE_W32_SYSTEM
+  /* Note that we introduced gnupg_opendir only after we had deployed
+   * this code and thus we don't change it for now.  */
   WIN32_FIND_DATAW fi;
   HANDLE hd = INVALID_HANDLE_VALUE;
   char *p;
diff --git a/tools/gpgtar-w32info.rc b/tools/gpgtar-w32info.rc
new file mode 100644 (file)
index 0000000..211528b
--- /dev/null
@@ -0,0 +1,52 @@
+/* gpgtar-w32info.rc                                         -*- c -*-
+ * Copyright (C) 2020 g10 Code GmbH
+ *
+ * This file is free software; as a special exception the author gives
+ * unlimited permission to copy and/or distribute it, with or without
+ * modifications, as long as this notice is preserved.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+#include "afxres.h"
+#include "../common/w32info-rc.h"
+
+1 ICON "../common/gnupg.ico"
+
+1 VERSIONINFO
+  FILEVERSION    W32INFO_VI_FILEVERSION
+  PRODUCTVERSION W32INFO_VI_PRODUCTVERSION
+  FILEFLAGSMASK  0x3fL
+#ifdef _DEBUG
+  FILEFLAGS      0x01L    /* VS_FF_DEBUG (0x1)*/
+#else
+  FILEFLAGS      0x00L
+#endif
+  FILEOS         0x40004L /* VOS_NT (0x40000) | VOS__WINDOWS32 (0x4)  */
+  FILETYPE       0x1L     /* VFT_APP (0x1)  */
+  FILESUBTYPE    0x0L     /* VFT2_UNKNOWN   */
+  BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "040904b0"  /* US English (0409), Unicode (04b0) */
+        BEGIN
+            VALUE "FileDescription", L"GnuPG\x2019s archive tool\0"
+            VALUE "InternalName", "gpgtar\0"
+            VALUE "OriginalFilename", "gpgtar.exe\0"
+            VALUE "ProductName",    W32INFO_PRODUCTNAME
+            VALUE "ProductVersion", W32INFO_PRODUCTVERSION
+            VALUE "CompanyName", W32INFO_COMPANYNAME
+            VALUE "FileVersion", W32INFO_FILEVERSION
+            VALUE "LegalCopyright", W32INFO_LEGALCOPYRIGHT
+            VALUE "Comments",    W32INFO_COMMENTS
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+      VALUE "Translation", 0x409, 0x4b0
+    END
+  END
+
+1 RT_MANIFEST "gpgtar.w32-manifest"
diff --git a/tools/gpgtar.w32-manifest.in b/tools/gpgtar.w32-manifest.in
new file mode 100644 (file)
index 0000000..62d5937
--- /dev/null
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+<description>GNU Privacy Guard (Archive tool)</description>
+<assemblyIdentity
+    type="win32"
+    name="GnuPG.gpgtar"
+    version="@BUILD_VERSION@"
+    />
+<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
+  <application>
+    <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/><!-- 10 -->
+    <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/><!-- 8.1 -->
+    <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/><!-- 8 -->
+    <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/><!-- 7 -->
+    <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/><!-- Vista -->
+  </application>
+</compatibility>
+</assembly>
index c5780fd..d1f953c 100644 (file)
@@ -363,7 +363,7 @@ confucius_copy_file (char *infile, char *outfile, int plain)
     }
   else
     {
-      in = fopen (infile, "rb");
+      in = gnupg_fopen (infile, "rb");
       if (!in)
        {
          log_error (_("could not open %s for writing: %s\n"),
@@ -380,7 +380,7 @@ confucius_copy_file (char *infile, char *outfile, int plain)
     }
   else
     {
-      out = fopen (outfile, "wb");
+      out = gnupg_fopen (outfile, "wb");
       if (!out)
        {
          log_error (_("could not open %s for writing: %s\n"),
@@ -936,7 +936,7 @@ main (int argc, char **argv)
   if (configname)
     {
       configlineno = 0;
-      configfp = fopen (configname, "r");
+      configfp = gnupg_fopen (configname, "r");
       if (!configfp)
         {
           if (!default_config)
index 52c89ba..085301f 100644 (file)
@@ -843,13 +843,13 @@ wks_compute_hu_fname (char **r_fname, const char *addrspec)
 
   /* Try to create missing directories below opt.directory.  */
   fname = make_filename_try (opt.directory, domain, NULL);
-  if (fname && stat (fname, &sb)
+  if (fname && gnupg_stat (fname, &sb)
       && gpg_err_code_from_syserror () == GPG_ERR_ENOENT)
     if (!gnupg_mkdir (fname, "-rwxr--r--") && opt.verbose)
       log_info ("directory '%s' created\n", fname);
   xfree (fname);
   fname = make_filename_try (opt.directory, domain, "hu", NULL);
-  if (fname && stat (fname, &sb)
+  if (fname && gnupg_stat (fname, &sb)
       && gpg_err_code_from_syserror () == GPG_ERR_ENOENT)
     if (!gnupg_mkdir (fname, "-rwxr--r--") && opt.verbose)
       log_info ("directory '%s' created\n", fname);
@@ -873,6 +873,7 @@ wks_compute_hu_fname (char **r_fname, const char *addrspec)
 static gpg_error_t
 ensure_policy_file (const char *addrspec)
 {
+  gpg_err_code_t ec;
   gpg_error_t err;
   const char *domain;
   char *fname;
@@ -890,12 +891,12 @@ ensure_policy_file (const char *addrspec)
     goto leave;
 
   /* First a quick check whether it already exists.  */
-  if (!access (fname, F_OK))
+  if (!(ec = gnupg_access (fname, F_OK)))
     {
       err = 0; /* File already exists.  */
       goto leave;
     }
-  err = gpg_error_from_syserror ();
+  err = gpg_error (ec);
   if (gpg_err_code (err) == GPG_ERR_ENOENT)
     err = 0;
   else
@@ -911,7 +912,7 @@ ensure_policy_file (const char *addrspec)
     {
       err = gpg_error_from_syserror ();
       if (gpg_err_code (err) == GPG_ERR_EEXIST)
-        err = 0; /* Was created between the access() and fopen().  */
+        err = 0; /* Was created between the gnupg_access() and es_fopen().  */
       else
         log_error ("domain %s: error creating '%s': %s\n",
                    domain, fname, gpg_strerror (err));