Merge branch 'STABLE-BRANCH-2-2' into master
authorWerner Koch <wk@gnupg.org>
Sun, 13 May 2018 11:29:40 +0000 (13:29 +0200)
committerWerner Koch <wk@gnupg.org>
Sun, 13 May 2018 11:29:40 +0000 (13:29 +0200)
--

Resolved Conflicts:
NEWS  - removed
configure.ac - removed

Signed-off-by: Werner Koch <wk@gnupg.org>
73 files changed:
Makefile.am
agent/command.c
build-aux/getswdb.sh
build-aux/speedo/w32/inst.nsi
common/exechelp-w32.c
common/miscellaneous.c
configure.ac
dirmngr/certcache.c
dirmngr/crlcache.c
dirmngr/crlfetch.c
dirmngr/dirmngr.c
dirmngr/dirmngr_ldap.c
dirmngr/http-ntbtls.c
dirmngr/http.c
dirmngr/http.h
dirmngr/ks-action.c
dirmngr/ks-engine-hkp.c
dirmngr/ks-engine-http.c
dirmngr/ks-engine.h
dirmngr/ldap-wrapper-ce.c
dirmngr/ldap-wrapper.c
dirmngr/ldap.c
dirmngr/loadswdb.c
dirmngr/server.c
doc/DETAILS
doc/Makefile.am
doc/dirmngr.texi
doc/examples/vsnfd.prf
doc/gnupg.texi
doc/gpg.texi
doc/trust-values.texi [new file with mode: 0644]
g10/card-util.c
g10/compress.c
g10/filter.h
g10/getkey.c
g10/gpg.c
g10/import.c
g10/keydb.h
g10/keyedit.c
g10/keylist.c
g10/mainproc.c
g10/options.h
g10/packet.h
g10/passphrase.c
g10/pkclist.c
g10/revoke.c
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
sm/call-dirmngr.c

index c01c0a8..680fe1b 100644 (file)
 
 ## Process this file with automake to produce Makefile.in
 
+# Location of the released tarball archives.  Note that this is an
+# internal archive and before uploading this to the public server,
+# manual tests should be run and the git release tat set and pushed.
+# Adjust as needed.
+RELEASE_ARCHIVE_DIR  = wk@vigenere:tarballs/gnupg/v2.2
+
+# The key used to sign the released sources.  Adjust as needed.
+RELEASE_SIGNING_KEY  = D8692123C4065DEA5E0F3AB5249B39D24F25E3B6
+
+
+# Autoconf flags.
 ACLOCAL_AMFLAGS = -I m4
 AM_DISTCHECK_CONFIGURE_FLAGS = --enable-gnupg-builddir-envvar \
   --enable-all-tests --enable-symcryptrun --enable-g13 \
-  --enable-gpg2-is-gpg --enable-gpgtar --enable-wks-tools --disable-ntbtls
+  --enable-gpgtar --enable-wks-tools --disable-ntbtls
 
 GITLOG_TO_CHANGELOG=gitlog-to-changelog
 
@@ -151,8 +162,68 @@ TESTS_ENVIRONMENT = \
        objdir=$(abs_top_builddir) \
        GPGSCM_PATH=$(abs_top_srcdir)/tests/gpgscm
 
-.PHONY: check-all
+.PHONY: check-all release sign-release
 check-all:
        $(TESTS_ENVIRONMENT) \
          $(abs_top_builddir)/tests/gpgscm/gpgscm \
          $(abs_srcdir)/tests/run-tests.scm $(TESTFLAGS) $(TESTS)
+
+# Names of to help the release target.
+RELEASE_NAME = $(PACKAGE_TARNAME)-$(PACKAGE_VERSION)
+RELEASE_W32_STEM_NAME = $(PACKAGE_TARNAME)-w32-$(PACKAGE_VERSION)
+
+release:
+       +(set -e;\
+        if [ "$(abs_top_builddir)" = "$(abs_top_srcdir)" ]; then \
+           echo "error: build directory must not be the source directory" >&2;\
+          exit 2;\
+         fi ;\
+        echo "/* Build started at $$(date -uIseconds) */" ;\
+        cd $(top_srcdir); \
+        ./autogen.sh --force; \
+        cd $(abs_top_builddir); \
+        rm -rf dist; mkdir dist ; cd dist ; \
+        $(abs_top_srcdir)/configure --enable-maintainer-mode; \
+        $(MAKE) distcheck TESTFLAGS=--parallel; \
+        $(TAR) xjf $(RELEASE_NAME).tar.bz2 ;\
+        $(MAKE) -f  $(RELEASE_NAME)/build-aux/speedo.mk w32-release ;\
+        echo "/* Build finished at $$(date -uIseconds) */" ;\
+         echo "/*" ;\
+        echo " * Please run the final step interactivly:" ;\
+        echo " *   make sign-release" ;\
+        echo " */" ;\
+       ) 2>&1 | tee "$(RELEASE_NAME).buildlog"
+
+sign-release:
+        +(set -e; \
+         cd dist; \
+         release_w32_name="$(RELEASE_W32_STEM_NAME)_$$(date -u +%Y%m%d)" ;\
+         files1="$(RELEASE_NAME).tar.bz2 \
+                  $${release_w32_name}.tar.xz \
+                  $${release_w32_name}.exe" ;\
+         files2="$(RELEASE_NAME).tar.bz2.sig \
+                 $(RELEASE_NAME).swdb \
+                 $(RELEASE_NAME).buildlog \
+                 $${release_w32_name}.tar.xz.sig \
+                 $${release_w32_name}.exe.sig    \
+                 $${release_w32_name}.exe.swdb" ;\
+         $(MAKE) -f $(RELEASE_NAME)/build-aux/speedo.mk w32-sign-installer ;\
+         echo "/* Signing the source tarball ..." ;\
+         gpg -sbu $(RELEASE_SIGNING_KEY) $(RELEASE_NAME).tar.bz2 ;\
+         echo "/* Signing the W32 source tarball ..." ;\
+         gpg -sbu $(RELEASE_SIGNING_KEY) $${release_w32_name}.tar.xz ;\
+         echo "/* Signing the W32 installer ..." ;\
+         gpg -sbu $(RELEASE_SIGNING_KEY) $${release_w32_name}.exe ;\
+         cat $(RELEASE_NAME).swdb >swdb.snippet;\
+         echo '#+macro: gnupg22_branch  STABLE-BRANCH-2-2' >>swdb.snippet;\
+         cat  $${release_w32_name}.exe.swdb >>swdb.snippet;\
+         echo >>swdb.snippet ;\
+         sha1sum $${files1} >>swdb.snippet ;\
+          cat "../$(RELEASE_NAME).buildlog" swdb.snippet \
+               | gzip >$(RELEASE_NAME).buildlog ;\
+          echo "Release created - copying it to the local archive ..." ;\
+         scp -p $${files1} $${files2} $(RELEASE_ARCHIVE_DIR)/ || true;\
+         echo '/*' ;\
+         echo ' * All done; for checksums see dist/swdb.snippet' ;\
+         echo ' */' ;\
+         )
index a5baf4d..1a08cfc 100644 (file)
@@ -2825,6 +2825,7 @@ static const char hlp_getinfo[] =
   "  std_env_names   - List the names of the standard environment.\n"
   "  std_session_env - List the standard session environment.\n"
   "  std_startup_env - List the standard startup environment.\n"
+  "  getenv NAME     - Return value of envvar NAME.\n"
   "  connections     - Return number of active connections.\n"
   "  jent_active     - Returns OK if Libgcrypt's JENT is active.\n"
   "  restricted      - Returns OK if the connection is in restricted mode.\n"
@@ -2961,6 +2962,23 @@ cmd_getinfo (assuan_context_t ctx, char *line)
             }
         }
     }
+  else if (!strncmp (line, "getenv", 6)
+           && (line[6] == ' ' || line[6] == '\t' || !line[6]))
+    {
+      line += 6;
+      while (*line == ' ' || *line == '\t')
+        line++;
+      if (!*line)
+        rc = gpg_error (GPG_ERR_MISSING_VALUE);
+      else
+        {
+          const char *s = getenv (line);
+          if (!s)
+            rc = set_error (GPG_ERR_NOT_FOUND, "No such envvar");
+          else
+            rc = assuan_send_data (ctx, s, strlen (s));
+        }
+    }
   else if (!strcmp (line, "connections"))
     {
       char numbuf[20];
index 83ecdb2..cd419f2 100755 (executable)
@@ -175,9 +175,9 @@ fi
 # to help detect rollback attacks.
 #
 if [ $skip_selfcheck = no ]; then
-  gnupg_ver=$(awk '$1=="gnupg21_ver" {print $2;exit}' swdb.lst)
+  gnupg_ver=$(awk '$1=="gnupg22_ver" {print $2;exit}' swdb.lst)
   if [ -z "$gnupg_ver" ]; then
-      echo "GnuPG 2.1 version missing in swdb.lst!" >&2
+      echo "GnuPG 2.2 version missing in swdb.lst!" >&2
       exit 1
   fi
   gnupg_ver_num=$(echo "$gnupg_ver" | cvtver)
index b89876e..fb452d5 100644 (file)
@@ -625,6 +625,7 @@ Section "GnuPG" SEC_gnupg
   File "bin/gpgconf.exe"
   File "bin/gpg-connect-agent.exe"
   File "bin/gpgtar.exe"
+  File "libexec/dirmngr_ldap.exe"
   File "libexec/gpg-preset-passphrase.exe"
   File "libexec/gpg-wks-client.exe"
 
@@ -743,6 +744,8 @@ Section "-libgpg-error" SEC_libgpg_error
   File share/locale/de/LC_MESSAGES/libgpg-error.mo
   SetOutPath "$INSTDIR\share\locale\eo\LC_MESSAGES"
   File share/locale/eo/LC_MESSAGES/libgpg-error.mo
+  SetOutPath "$INSTDIR\share\locale\es\LC_MESSAGES"
+  File share/locale/es/LC_MESSAGES/libgpg-error.mo
   SetOutPath "$INSTDIR\share\locale\fr\LC_MESSAGES"
   File share/locale/fr/LC_MESSAGES/libgpg-error.mo
   SetOutPath "$INSTDIR\share\locale\hu\LC_MESSAGES"
@@ -1249,6 +1252,9 @@ Section "-un.libgpg-error"
   Delete "$INSTDIR\share\locale\eo\LC_MESSAGES\libgpg-error.mo"
   RMDir "$INSTDIR\share\locale\eo\LC_MESSAGES"
   RMDir "$INSTDIR\share\locale\eo"
+  Delete "$INSTDIR\share\locale\es\LC_MESSAGES\libgpg-error.mo"
+  RMDir "$INSTDIR\share\locale\es\LC_MESSAGES"
+  RMDir "$INSTDIR\share\locale\es"
   Delete "$INSTDIR\share\locale\fr\LC_MESSAGES\libgpg-error.mo"
   RMDir "$INSTDIR\share\locale\fr\LC_MESSAGES"
   RMDir "$INSTDIR\share\locale\fr"
@@ -1307,6 +1313,7 @@ Section "-un.gnupg"
   Delete "$INSTDIR\bin\gpgconf.exe"
   Delete "$INSTDIR\bin\gpg-connect-agent.exe"
   Delete "$INSTDIR\bin\gpgtar.exe"
+  Delete "$INSTDIR\bin\dirmngr_ldap.exe"
   Delete "$INSTDIR\bin\gpg-preset-passphrase.exe"
   Delete "$INSTDIR\bin\gpg-wks-client.exe"
 
index fddcbb6..86b1d68 100644 (file)
@@ -556,7 +556,7 @@ gnupg_spawn_process (const char *pgmname, const char *argv[],
   memset (&si, 0, sizeof si);
   si.cb = sizeof (si);
   si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
-  si.wShowWindow = DEBUG_W32_SPAWN? SW_SHOW : SW_MINIMIZE;
+  si.wShowWindow = DEBUG_W32_SPAWN? SW_SHOW : SW_HIDE;
   si.hStdInput  = inpipe[0]  == INVALID_HANDLE_VALUE? nullhd[0] : inpipe[0];
   si.hStdOutput = outpipe[1] == INVALID_HANDLE_VALUE? nullhd[1] : outpipe[1];
   si.hStdError  = errpipe[1] == INVALID_HANDLE_VALUE? nullhd[2] : errpipe[1];
index 7997a1a..0b374e6 100644 (file)
@@ -401,6 +401,7 @@ is_file_compressed (const char *s, int *ret_rc)
         *ret_rc = gpg_error_from_syserror ();
         return 0;
     }
+    iobuf_ioctl (a, IOBUF_IOCTL_NO_CACHE, 1, NULL);
 
     if ( iobuf_get_filelength( a, &overflow ) < 6 && !overflow) {
         *ret_rc = 0;
index 540dffc..0665115 100644 (file)
@@ -665,7 +665,6 @@ case "${host}" in
         have_dosish_system=yes
         have_w32_system=yes
         require_iconv=no
-        use_ldapwrapper=no  # Fixme: Do this only for CE.
         require_pipe_to_unblock_pselect=no
         case "${host}" in
           *-mingw32ce*)
@@ -976,6 +975,17 @@ else
 *** we need the support of the New Portable Threads Library.
 ***]])
 fi
+#
+# Enable debugging of nPth
+#
+AC_ARG_ENABLE(npth-debug,
+   AC_HELP_STRING([--enable-npth-debug],
+                  [build with debug version of npth]),
+                  [if test $enableval = yes ; then
+                     AC_DEFINE(NPTH_ENABLE_DEBUG,1,
+                              [Build with debug version of nPth])
+                  fi])
+
 
 
 #
index 56629fd..adb005e 100644 (file)
@@ -423,6 +423,9 @@ load_certs_from_dir (const char *dirname, unsigned int trustclass)
         log_info (_("certificate '%s' already cached\n"), fname);
       else if (!err)
         {
+          if ((trustclass & CERTTRUST_CLASS_CONFIG))
+            http_register_cfg_ca (fname);
+
           if (trustclass)
             log_info (_("trusted certificate '%s' loaded\n"), fname);
           else
@@ -763,6 +766,8 @@ cert_cache_deinit (int full)
         }
     }
 
+  http_register_cfg_ca (NULL);
+
   total_nonperm_certificates = 0;
   any_cert_of_class = 0;
   initialization_done = 0;
index 8687c7b..fbe3bee 100644 (file)
    idea anyway to limit the number of opened cache files. */
 #define MAX_OPEN_DB_FILES 5
 
+#ifndef O_BINARY
+# define O_BINARY 0
+#endif
 
 static const char oidstr_crlNumber[] = "2.5.29.20";
 /* static const char oidstr_issuingDistributionPoint[] = "2.5.29.28"; */
@@ -1139,7 +1142,7 @@ lock_db_file (crl_cache_t cache, crl_cache_entry_t entry)
       xfree (fname);
       return NULL;
     }
-  fd = open (fname, O_RDONLY);
+  fd = open (fname, O_RDONLY | O_BINARY);
   if (fd == -1)
     {
       log_error (_("error opening cache file '%s': %s\n"),
@@ -2051,7 +2054,7 @@ crl_cache_insert (ctrl_t ctrl, const char *url, ksba_reader_t reader)
       }
   }
 
-  fd_cdb = open (fname, O_WRONLY | O_CREAT | O_TRUNC, 0644);
+  fd_cdb = open (fname, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0644);
   if (fd_cdb == -1)
     {
       err = gpg_error_from_errno (errno);
index 0892421..57ac51b 100644 (file)
@@ -28,6 +28,7 @@
 #include "dirmngr.h"
 #include "misc.h"
 #include "http.h"
+#include "ks-engine.h"  /* For ks_http_fetch.  */
 
 #if USE_LDAP
 # include "ldap-wrapper.h"
@@ -154,41 +155,17 @@ crl_fetch (ctrl_t ctrl, const char *url, ksba_reader_t *reader)
 {
   gpg_error_t err;
   parsed_uri_t uri;
-  char *free_this = NULL;
-  int redirects_left = 2; /* We allow for 2 redirect levels.  */
+  estream_t httpfp = NULL;
 
   *reader = NULL;
 
   if (!url)
     return gpg_error (GPG_ERR_INV_ARG);
 
- once_more:
   err = http_parse_uri (&uri, url, 0);
   http_release_parsed_uri (uri);
-  if (err && !strncmp (url, "https:", 6))
-    {
-      /* FIXME: We now support https.
-       * Our HTTP code does not support TLS, thus we can't use this
-       * scheme and it is frankly not useful for CRL retrieval anyway.
-       * We resort to using http, assuming that the server also
-       * provides plain http access.  */
-      free_this = xtrymalloc (strlen (url) + 1);
-      if (free_this)
-        {
-          strcpy (stpcpy (free_this,"http:"), url+6);
-          err = http_parse_uri (&uri, free_this, 0);
-          http_release_parsed_uri (uri);
-          if (!err)
-            {
-              log_info (_("using \"http\" instead of \"https\"\n"));
-              url = free_this;
-            }
-        }
-    }
   if (!err) /* Yes, our HTTP code groks that. */
     {
-      http_t hd;
-
       if (opt.disable_http)
         {
           log_error (_("CRL access not possible due to disabled %s\n"),
@@ -196,97 +173,57 @@ crl_fetch (ctrl_t ctrl, const char *url, ksba_reader_t *reader)
           err = gpg_error (GPG_ERR_NOT_SUPPORTED);
         }
       else
-        err = http_open_document (&hd, url, NULL,
-                                  ((opt.honor_http_proxy? HTTP_FLAG_TRY_PROXY:0)
-                                   |(DBG_LOOKUP? HTTP_FLAG_LOG_RESP:0)
-                                   |(dirmngr_use_tor()? HTTP_FLAG_FORCE_TOR:0)
-                                   |(opt.disable_ipv4? HTTP_FLAG_IGNORE_IPv4:0)
-                                   |(opt.disable_ipv6? HTTP_FLAG_IGNORE_IPv6:0)
-                                   ),
-                                  ctrl->http_proxy, NULL, NULL, NULL);
-
-      switch ( err? 99999 : http_get_status_code (hd) )
         {
-        case 200:
-          {
-            estream_t fp = http_get_read_ptr (hd);
-            struct reader_cb_context_s *cb_ctx;
-
-            cb_ctx = xtrycalloc (1, sizeof *cb_ctx);
-            if (!cb_ctx)
-              err = gpg_error_from_syserror ();
-            if (!err)
-              err = ksba_reader_new (reader);
-            if (!err)
-              {
-                cb_ctx->fp = fp;
-                err = ksba_reader_set_cb (*reader, &my_es_read, cb_ctx);
-              }
-            if (err)
-              {
-                log_error (_("error initializing reader object: %s\n"),
-                           gpg_strerror (err));
-                ksba_reader_release (*reader);
-                *reader = NULL;
-                http_close (hd, 0);
-              }
-            else
-              {
-                /* The ksba reader misses a user pointer thus we need
-                   to come up with our own way of associating a file
-                   pointer (or well the callback context) with the
-                   reader.  It is only required when closing the
-                   reader thus there is no performance issue doing it
-                   this way.  FIXME: We now have a close notification
-                   which might be used here. */
-                register_file_reader (*reader, cb_ctx);
-                http_close (hd, 1);
-              }
-          }
-          break;
+          /* Note that we also allow root certificates loaded from
+           * "/etc/gnupg/trusted-certs/".  We also do not consult the
+           * CRL for the TLS connection - that may lead to a loop.
+           * Due to cacert.org redirecting their https URL to http we
+           * also allow such a downgrade.  */
+          err = ks_http_fetch (ctrl, url,
+                               (KS_HTTP_FETCH_TRUST_CFG
+                                | KS_HTTP_FETCH_NO_CRL
+                                | KS_HTTP_FETCH_ALLOW_DOWNGRADE ),
+                               &httpfp);
+        }
 
-        case 301: /* Redirection (perm.). */
-        case 302: /* Redirection (temp.). */
-          {
-            const char *s = http_get_header (hd, "Location");
-
-            log_info (_("URL '%s' redirected to '%s' (%u)\n"),
-                      url, s?s:"[none]", http_get_status_code (hd));
-            if (s && *s && redirects_left-- )
-              {
-                xfree (free_this); url = NULL;
-                free_this = xtrystrdup (s);
-                if (!free_this)
-                  err = gpg_error_from_errno (errno);
-                else
-                  {
-                    url = free_this;
-                    http_close (hd, 0);
-                    /* Note, that our implementation of redirection
-                       actually handles a redirect to LDAP.  */
-                    goto once_more;
-                  }
-              }
-            else
-              err = gpg_error (GPG_ERR_NO_DATA);
-            log_error (_("too many redirections\n")); /* Or no "Location". */
-            http_close (hd, 0);
-          }
-          break;
-
-        case 99999: /* Made up status code for error reporting.  */
-          log_error (_("error retrieving '%s': %s\n"),
-                     url, gpg_strerror (err));
-          break;
-
-        default:
-          log_error (_("error retrieving '%s': http status %u\n"),
-                     url, http_get_status_code (hd));
-          err = gpg_error (GPG_ERR_NO_DATA);
-          http_close (hd, 0);
+      if (err)
+        log_error (_("error retrieving '%s': %s\n"), url, gpg_strerror (err));
+      else
+        {
+          struct reader_cb_context_s *cb_ctx;
+
+          cb_ctx = xtrycalloc (1, sizeof *cb_ctx);
+          if (!cb_ctx)
+            err = gpg_error_from_syserror ();
+          else if (!(err = ksba_reader_new (reader)))
+            {
+              cb_ctx->fp = httpfp;
+              err = ksba_reader_set_cb (*reader, &my_es_read, cb_ctx);
+              if (!err)
+                {
+                  /* The ksba reader misses a user pointer thus we
+                   * need to come up with our own way of associating a
+                   * file pointer (or well the callback context) with
+                   * the reader.  It is only required when closing the
+                   * reader thus there is no performance issue doing
+                   * it this way.  FIXME: We now have a close
+                   * notification which might be used here. */
+                  register_file_reader (*reader, cb_ctx);
+                  httpfp = NULL;
+                }
+            }
+
+          if (err)
+            {
+              log_error (_("error initializing reader object: %s\n"),
+                         gpg_strerror (err));
+              ksba_reader_release (*reader);
+              *reader = NULL;
+              xfree (cb_ctx);
+            }
         }
     }
-  else /* Let the LDAP code try other schemes. */
+  else /* Let the LDAP code parse other schemes.  */
     {
       if (opt.disable_ldap)
         {
@@ -310,7 +247,7 @@ crl_fetch (ctrl_t ctrl, const char *url, ksba_reader_t *reader)
         }
     }
 
-  xfree (free_this);
+  es_fclose (httpfp);
   return err;
 }
 
index 00caf06..6fdfe36 100644 (file)
@@ -2243,7 +2243,8 @@ handle_connections (assuan_fd_t listen_fd)
       npth_timersub (&abstime, &curtime, &timeout);
 
 #ifndef HAVE_W32_SYSTEM
-      ret = npth_pselect (nfd+1, &read_fdset, NULL, NULL, &timeout, npth_sigev_sigmask());
+      ret = npth_pselect (nfd+1, &read_fdset, NULL, NULL, &timeout,
+                          npth_sigev_sigmask());
       saved_errno = errno;
 
       while (npth_sigev_get_pending(&signo))
index 5be4e58..8452c3b 100644 (file)
@@ -29,7 +29,6 @@
 # include <signal.h>
 #endif
 #include <errno.h>
-#include <assert.h>
 #include <sys/time.h>
 #include <unistd.h>
 #ifndef USE_LDAPWRAPPER
@@ -343,7 +342,7 @@ ldap_wrapper_main (char **argv, estream_t outstream)
     usage (1);
 #else
   /* All passed arguments should be fine in this case.  */
-  assert (argc);
+  log_assert (argc);
 #endif
 
 #ifdef USE_LDAPWRAPPER
@@ -382,16 +381,56 @@ catch_alarm (int dummy)
 }
 #endif
 
+
+#ifdef HAVE_W32_SYSTEM
+static DWORD CALLBACK
+alarm_thread (void *arg)
+{
+  HANDLE timer = arg;
+
+  WaitForSingleObject (timer, INFINITE);
+  _exit (10);
+
+  return 0;
+}
+#endif
+
+
 static void
 set_timeout (my_opt_t myopt)
 {
+  if (myopt->alarm_timeout)
+    {
 #ifdef HAVE_W32_SYSTEM
-  /* FIXME for W32.  */
-  (void)myopt;
+      static HANDLE timer;
+      LARGE_INTEGER due_time;
+
+      /* A negative value is a relative time.  */
+      due_time.QuadPart = (unsigned long long)-10000000 * myopt->alarm_timeout;
+
+      if (!timer)
+        {
+          SECURITY_ATTRIBUTES sec_attr;
+          DWORD tid;
+
+          memset (&sec_attr, 0, sizeof sec_attr);
+          sec_attr.nLength = sizeof sec_attr;
+          sec_attr.bInheritHandle = FALSE;
+
+          /* Create a manual resetable timer.  */
+          timer = CreateWaitableTimer (NULL, TRUE, NULL);
+          /* Intially set the timer.  */
+          SetWaitableTimer (timer, &due_time, 0, NULL, NULL, 0);
+
+          if (CreateThread (&sec_attr, 0, alarm_thread, timer, 0, &tid))
+            log_error ("failed to create alarm thread\n");
+        }
+      else /* Retrigger the timer.  */
+        SetWaitableTimer (timer, &due_time, 0, NULL, NULL, 0);
 #else
-  if (myopt->alarm_timeout)
-    alarm (myopt->alarm_timeout);
+      alarm (myopt->alarm_timeout);
 #endif
+    }
 }
 
 
index ea66a4d..ed4cdd4 100644 (file)
@@ -87,13 +87,15 @@ gnupg_http_tls_verify_cb (void *opaque,
     }
   else /* Use the certificates as requested from the HTTP module.  */
     {
+      if ((http_flags & HTTP_FLAG_TRUST_CFG))
+        validate_flags |= VALIDATE_FLAG_TRUST_CONFIG;
       if ((http_flags & HTTP_FLAG_TRUST_DEF))
         validate_flags |= VALIDATE_FLAG_TRUST_HKP;
       if ((http_flags & HTTP_FLAG_TRUST_SYS))
         validate_flags |= VALIDATE_FLAG_TRUST_SYSTEM;
 
       /* If HKP trust is requested and there are no HKP certificates
-       * configured, also try thye standard system certificates.  */
+       * configured, also try the standard system certificates.  */
       if ((validate_flags & VALIDATE_FLAG_TRUST_HKP)
           && !cert_cache_any_in_class (CERTTRUST_CLASS_HKP))
         validate_flags |= VALIDATE_FLAG_TRUST_SYSTEM;
index cc7f5a5..049aefc 100644 (file)
@@ -318,6 +318,9 @@ static gpg_error_t (*tls_callback) (http_t, http_session_t, int);
 /* The list of files with trusted CA certificates.  */
 static strlist_t tls_ca_certlist;
 
+/* The list of files with extra trusted CA certificates.  */
+static strlist_t cfg_ca_certlist;
+
 /* The global callback for net activity.  */
 static void (*netactivity_cb)(void);
 
@@ -596,6 +599,35 @@ http_register_tls_ca (const char *fname)
 }
 
 
+/* Register a CA certificate for future use.  The certificate is
+ * expected to be in FNAME.  PEM format is assume if FNAME has a
+ * suffix of ".pem".  If FNAME is NULL the list of CA files is
+ * removed.  This is a variant of http_register_tls_ca which puts the
+ * certificate into a separate list enabled using HTTP_FLAG_TRUST_CFG.  */
+void
+http_register_cfg_ca (const char *fname)
+{
+  strlist_t sl;
+
+  if (!fname)
+    {
+      free_strlist (cfg_ca_certlist);
+      cfg_ca_certlist = NULL;
+    }
+  else
+    {
+      /* 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()));
+      sl = add_to_strlist (&cfg_ca_certlist, fname);
+      if (*sl->d && !strcmp (sl->d + strlen (sl->d) - 4, ".pem"))
+        sl->flags = 1;
+    }
+}
+
+
 /* Register a callback which is called every time the HTTP mode has
  * made a successful connection to some server.  */
 void
@@ -680,6 +712,7 @@ http_session_release (http_session_t sess)
  * Valid values for FLAGS are:
  *   HTTP_FLAG_TRUST_DEF - Use the CAs set with http_register_tls_ca
  *   HTTP_FLAG_TRUST_SYS - Also use the CAs defined by the system
+ *   HTTP_FLAG_TRUST_CFG - Also use CAs set with http_register_cfg_ca
  *   HTTP_FLAG_NO_CRL    - Do not consult CRLs for https.
  */
 gpg_error_t
@@ -793,6 +826,21 @@ http_session_new (http_session_t *r_session,
 #endif /* gnutls >= 3.0.20 */
       }
 
+    /* Add other configured certificates to the session.  */
+    if ((flags & HTTP_FLAG_TRUST_CFG))
+      {
+        for (sl = cfg_ca_certlist; sl; sl = sl->next)
+          {
+            rc = gnutls_certificate_set_x509_trust_file
+              (sess->certcred, sl->d,
+               (sl->flags & 1)? GNUTLS_X509_FMT_PEM : GNUTLS_X509_FMT_DER);
+            if (rc < 0)
+              log_info ("setting extra CA from file '%s' failed: %s\n",
+                        sl->d, gnutls_strerror (rc));
+          }
+      }
+
+
     rc = gnutls_init (&sess->tls_session, GNUTLS_CLIENT);
     if (rc < 0)
       {
@@ -1688,9 +1736,19 @@ send_request (http_t hd, const char *httphost, const char *auth,
 #ifdef USE_TLS
   if (hd->uri->use_tls && !hd->session->tls_session)
     {
-      log_error ("TLS requested but no GNUTLS context available\n");
+      log_error ("TLS requested but no TLS context available\n");
       return gpg_err_make (default_errsource, GPG_ERR_INTERNAL);
     }
+  if (opt_debug)
+    log_debug ("Using TLS library: %s %s\n",
+# if HTTP_USE_NTBTLS
+               "NTBTLS", ntbtls_check_version (NULL)
+# elif HTTP_USE_GNUTLS
+               "GNUTLS", gnutls_check_version (NULL)
+# else
+               "?", "?"
+# endif /*HTTP_USE_*TLS*/
+               );
 #endif /*USE_TLS*/
 
   if ((hd->flags & HTTP_FLAG_FORCE_TOR))
index 9fa462c..4cfb4c8 100644 (file)
@@ -88,8 +88,9 @@ enum
     HTTP_FLAG_IGNORE_IPv4 = 64,  /* Do not use IPv4.  */
     HTTP_FLAG_IGNORE_IPv6 = 128, /* Do not use IPv6.  */
     HTTP_FLAG_TRUST_DEF   = 256, /* Use the CAs configured for HKP.  */
-    HTTP_FLAG_TRUST_SYS   = 512, /* Also use the system defined CAs.  */
-    HTTP_FLAG_NO_CRL     = 1024  /* Do not consult CRLs for https.  */
+    HTTP_FLAG_TRUST_SYS   = 512, /* Also use the system defined CAs. */
+    HTTP_FLAG_TRUST_CFG  = 1024, /* Also use configured CAs.         */
+    HTTP_FLAG_NO_CRL     = 2048  /* Do not consult CRLs for https.   */
   };
 
 
@@ -110,6 +111,7 @@ void http_set_verbose (int verbose, int debug);
 
 void http_register_tls_callback (gpg_error_t (*cb)(http_t,http_session_t,int));
 void http_register_tls_ca (const char *fname);
+void http_register_cfg_ca (const char *fname);
 void http_register_netactivity_cb (void (*cb)(void));
 
 
index 38cd02f..c1ecafb 100644 (file)
@@ -257,7 +257,9 @@ ks_action_get (ctrl_t ctrl, uri_item_t keyservers,
               if (is_hkp_s)
                 err = ks_hkp_get (ctrl, uri->parsed_uri, sl->d, &infp);
               else if (is_http_s)
-                err = ks_http_fetch (ctrl, uri->parsed_uri->original, &infp);
+                err = ks_http_fetch (ctrl, uri->parsed_uri->original,
+                                     KS_HTTP_FETCH_NOCACHE,
+                                     &infp);
               else
                 BUG ();
 
@@ -314,7 +316,7 @@ ks_action_fetch (ctrl_t ctrl, const char *url, estream_t outfp)
 
   if (parsed_uri->is_http)
     {
-      err = ks_http_fetch (ctrl, url, &infp);
+      err = ks_http_fetch (ctrl, url, KS_HTTP_FETCH_NOCACHE, &infp);
       if (!err)
         {
           err = copy_stream (infp, outfp);
index a9bb936..32840e6 100644 (file)
@@ -55,7 +55,7 @@
 
 
 /* Number of seconds after a host is marked as resurrected.  */
-#define RESURRECT_INTERVAL  (3600*3)  /* 3 hours */
+#define RESURRECT_INTERVAL  (3600+1800)  /* 1.5 hours */
 
 /* To match the behaviour of our old gpgkeys helper code we escape
    more characters than actually needed. */
@@ -110,7 +110,7 @@ static hostinfo_t *hosttable;
 static int hosttable_size;
 
 /* The number of host slots we initially allocate for HOSTTABLE.  */
-#define INITIAL_HOSTTABLE_SIZE 10
+#define INITIAL_HOSTTABLE_SIZE 50
 
 
 /* Create a new hostinfo object, fill in NAME and put it into
@@ -583,7 +583,7 @@ map_host (ctrl_t ctrl, const char *name, const char *srvtag, int force_reselect,
       /* Deal with the pool name before selecting a host. */
       if (r_httphost)
         {
-          *r_httphost = xtrystrdup (hi->cname? hi->cname : hi->name);
+          *r_httphost = xtrystrdup (hi->name);
           if (!*r_httphost)
             return gpg_error_from_syserror ();
         }
index 6492dda..946c927 100644 (file)
@@ -62,12 +62,17 @@ ks_http_help (ctrl_t ctrl, parsed_uri_t uri)
 
 
 /* Get the key from URL which is expected to specify a http style
-   scheme.  On success R_FP has an open stream to read the data.  */
+ * scheme.  On success R_FP has an open stream to read the data.
+ * Despite its name this function is also used to retrieve arbitrary
+ * data via https or http.
+ */
 gpg_error_t
-ks_http_fetch (ctrl_t ctrl, const char *url, estream_t *r_fp)
+ks_http_fetch (ctrl_t ctrl, const char *url, unsigned int flags,
+               estream_t *r_fp)
 {
   gpg_error_t err;
   http_session_t session = NULL;
+  unsigned int session_flags;
   http_t http = NULL;
   int redirects_left = MAX_REDIRECTS;
   estream_t fp = NULL;
@@ -81,12 +86,16 @@ ks_http_fetch (ctrl_t ctrl, const char *url, estream_t *r_fp)
   is_onion = uri->onion;
   is_https = uri->use_tls;
 
- once_more:
-  /* Note that we only use the system provided certificates with the
+  /* By default we only use the system provided certificates with this
    * fetch command.  */
-  err = http_session_new (&session, NULL,
-                          ((ctrl->http_no_crl? HTTP_FLAG_NO_CRL : 0)
-                           | HTTP_FLAG_TRUST_SYS),
+  session_flags = HTTP_FLAG_TRUST_SYS;
+  if ((flags & KS_HTTP_FETCH_NO_CRL) || ctrl->http_no_crl)
+    session_flags |= HTTP_FLAG_NO_CRL;
+  if ((flags & KS_HTTP_FETCH_TRUST_CFG))
+    session_flags |= HTTP_FLAG_TRUST_CFG;
+
+ once_more:
+  err = http_session_new (&session, NULL, session_flags,
                           gnupg_http_tls_verify_cb, ctrl);
   if (err)
     goto leave;
@@ -100,6 +109,7 @@ ks_http_fetch (ctrl_t ctrl, const char *url, estream_t *r_fp)
                    /* httphost */ NULL,
                    /* fixme: AUTH */ NULL,
                    ((opt.honor_http_proxy? HTTP_FLAG_TRY_PROXY:0)
+                    | (DBG_LOOKUP? HTTP_FLAG_LOG_RESP:0)
                     | (dirmngr_use_tor ()? HTTP_FLAG_FORCE_TOR:0)
                     | (opt.disable_ipv4? HTTP_FLAG_IGNORE_IPv4 : 0)
                     | (opt.disable_ipv6? HTTP_FLAG_IGNORE_IPv6 : 0)),
@@ -111,10 +121,11 @@ ks_http_fetch (ctrl_t ctrl, const char *url, estream_t *r_fp)
     {
       fp = http_get_write_ptr (http);
       /* Avoid caches to get the most recent copy of the key.  We set
-         both the Pragma and Cache-Control versions of the header, so
-         we're good with both HTTP 1.0 and 1.1.  */
-      es_fputs ("Pragma: no-cache\r\n"
-                "Cache-Control: no-cache\r\n", fp);
+       * both the Pragma and Cache-Control versions of the header, so
+       * we're good with both HTTP 1.0 and 1.1.  */
+      if ((flags & KS_HTTP_FETCH_NOCACHE))
+        es_fputs ("Pragma: no-cache\r\n"
+                  "Cache-Control: no-cache\r\n", fp);
       http_start_data (http);
       if (es_ferror (fp))
         err = gpg_error_from_syserror ();
@@ -164,7 +175,13 @@ ks_http_fetch (ctrl_t ctrl, const char *url, estream_t *r_fp)
                 if (err)
                   goto leave;
 
-                if ((is_onion && ! uri->onion) || (is_https && ! uri->use_tls))
+                if (is_onion && !uri->onion)
+                  {
+                    err = gpg_error (GPG_ERR_FORBIDDEN);
+                    goto leave;
+                  }
+                if (!(flags & KS_HTTP_FETCH_ALLOW_DOWNGRADE)
+                    && is_https && !uri->use_tls)
                   {
                     err = gpg_error (GPG_ERR_FORBIDDEN);
                     goto leave;
index b5b4dd0..d28c6ab 100644 (file)
@@ -41,8 +41,16 @@ gpg_error_t ks_hkp_put (ctrl_t ctrl, parsed_uri_t uri,
                         const void *data, size_t datalen);
 
 /*-- ks-engine-http.c --*/
+
+/* Flags for the ks_http_fetch.  */
+#define KS_HTTP_FETCH_NOCACHE         1  /* Request no caching.  */
+#define KS_HTTP_FETCH_TRUST_CFG       2  /* Requests HTTP_FLAG_TRUST_CFG.  */
+#define KS_HTTP_FETCH_NO_CRL          4  /* Requests HTTP_FLAG_NO_CRL.     */
+#define KS_HTTP_FETCH_ALLOW_DOWNGRADE 8  /* Allow redirect https -> http.  */
+
 gpg_error_t ks_http_help (ctrl_t ctrl, parsed_uri_t uri);
-gpg_error_t ks_http_fetch (ctrl_t ctrl, const char *url, estream_t *r_fp);
+gpg_error_t ks_http_fetch (ctrl_t ctrl, const char *url, unsigned int flags,
+                           estream_t *r_fp);
 
 
 /*-- ks-engine-finger.c --*/
index 01f8f64..884bb32 100644 (file)
@@ -45,6 +45,7 @@
 #ifdef USE_LDAPWRAPPER
 # error This module is not expected to be build.
 #endif
+#error This module might not anymore work.
 
 
 
index 8b53bd6..d01c480 100644 (file)
@@ -1,5 +1,5 @@
 /* ldap-wrapper.c - LDAP access via a wrapper process
- * Copyright (C) 2004, 2005, 2007, 2008 g10 Code GmbH
+ * Copyright (C) 2004, 2005, 2007, 2008, 2018 g10 Code GmbH
  * Copyright (C) 2010 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  */
 
 /*
-   We can't use LDAP directly for these reasons:
-
-   1. On some systems the LDAP library uses (indirectly) pthreads and
-      that is not compatible with PTh.
-
-   2. It is huge library in particular if TLS comes into play.  So
-      problems with unfreed memory might turn up and we don't want
-      this in a long running daemon.
-
-   3. There is no easy way for timeouts. In particular the timeout
-      value does not work for DNS lookups (well, this is usual) and it
-      seems not to work while loading a large attribute like a
-      CRL. Having a separate process allows us to either tell the
-      process to commit suicide or have our own housekepping function
-      kill it after some time.  The latter also allows proper
-      cancellation of a query at any point of time.
-
-   4. Given that we are going out to the network and usually get back
-      a long response, the fork/exec overhead is acceptable.
-
-   Note that under WindowsCE the number of processes is strongly
-   limited (32 processes including the kernel processes) and thus we
-   don't use the process approach but implement a different wrapper in
-   ldap-wrapper-ce.c.
-*/
+ * We can't use LDAP directly for these reasons:
+ *
+ * 1. On some systems the LDAP library uses (indirectly) pthreads and
+ *    that is not compatible with GNU Pth.  Since 2.1 we use nPth
+ *    instead of GNU Pth which does not have this problem anymore
+ *    because it will use pthreads if the platform supports it.  Thus
+ *    this was a historical reasons.
+ *
+ * 2. It is huge library in particular if TLS comes into play.  So
+ *    problems with unfreed memory might turn up and we don't want
+ *    this in a long running daemon.
+ *
+ * 3. There is no easy way for timeouts. In particular the timeout
+ *    value does not work for DNS lookups (well, this is usual) and it
+ *    seems not to work while loading a large attribute like a
+ *    CRL. Having a separate process allows us to either tell the
+ *    process to commit suicide or have our own housekepping function
+ *    kill it after some time.  The latter also allows proper
+ *    cancellation of a query at any point of time.
+ *
+ * 4. Given that we are going out to the network and usually get back
+ *    a long response, the fork/exec overhead is acceptable.
+ *
+ * Note that under WindowsCE the number of processes is strongly
+ * limited (32 processes including the kernel processes) and thus we
+ * don't use the process approach but implement a different wrapper in
+ * ldap-wrapper-ce.c.
+ */
 
 
 #include <config.h>
@@ -89,39 +92,66 @@ struct wrapper_context_s
 {
   struct wrapper_context_s *next;
 
-  pid_t pid;    /* The pid of the wrapper process. */
-  int printable_pid; /* Helper to print diagnostics after the process has
-                        been cleaned up. */
-  int fd;       /* Connected with stdout of the ldap wrapper.  */
-  gpg_error_t fd_error; /* Set to the gpg_error of the last read error
-                           if any.  */
-  int log_fd;   /* Connected with stderr of the ldap wrapper.  */
-  ctrl_t ctrl;  /* Connection data. */
-  int ready;    /* Internally used to mark to be removed contexts. */
-  ksba_reader_t reader; /* The ksba reader object or NULL. */
-  char *line;     /* Used to print the log lines (malloced). */
-  size_t linesize;/* Allocated size of LINE.  */
-  size_t linelen; /* Use size of LINE.  */
-  time_t stamp;   /* The last time we noticed ativity.  */
+  pid_t pid;           /* The pid of the wrapper process. */
+  int printable_pid;   /* Helper to print diagnostics after the process has
+                        * been cleaned up. */
+  estream_t fp;        /* Connected with stdout of the ldap wrapper.  */
+  gpg_error_t fp_err;  /* Set to the gpg_error of the last read error
+                        * if any.  */
+  estream_t log_fp;    /* Connected with stderr of the ldap wrapper.  */
+  ctrl_t ctrl;         /* Connection data. */
+  int ready;           /* Internally used to mark to be removed contexts. */
+  ksba_reader_t reader;/* The ksba reader object or NULL. */
+  char *line;          /* Used to print the log lines (malloced). */
+  size_t linesize;     /* Allocated size of LINE.  */
+  size_t linelen;      /* Use size of LINE.  */
+  time_t stamp;        /* The last time we noticed ativity.  */
+  int reaper_idx;      /* Private to ldap_wrapper_thread.   */
 };
 
 
 
-/* We keep a global list of spawned wrapper process.  A separate thread
-   makes use of this list to log error messages and to watch out for
-   finished processes. */
-static struct wrapper_context_s *wrapper_list;
+/* We keep a global list of spawned wrapper process.  A separate
+ * thread makes use of this list to log error messages and to watch
+ * out for finished processes.  Access to list is protected by a
+ * mutex.  The condition variable is used to wakeup the reaper
+ * thread.  */
+static struct wrapper_context_s *reaper_list;
+static npth_mutex_t reaper_list_mutex = NPTH_MUTEX_INITIALIZER;
+static npth_cond_t  reaper_run_cond  = NPTH_COND_INITIALIZER;
 
 /* We need to know whether we are shutting down the process.  */
 static int shutting_down;
 
-/* Close the pth file descriptor FD and set it to -1.  */
-#define SAFE_CLOSE(fd) \
-  do { int _fd = fd; if (_fd != -1) { close (_fd); fd = -1;} } while (0)
+
+
+/* Close the estream fp and set it to NULL.  */
+#define SAFE_CLOSE(fp) \
+  do { estream_t _fp = fp; es_fclose (_fp); fp = NULL; } while (0)
 
 
 
 \f
+
+static void
+lock_reaper_list (void)
+{
+  if (npth_mutex_lock (&reaper_list_mutex))
+    log_fatal ("%s: failed to acquire mutex: %s\n", __func__,
+               gpg_strerror (gpg_error_from_syserror ()));
+}
+
+
+static void
+unlock_reaper_list (void)
+{
+  if (npth_mutex_unlock (&reaper_list_mutex))
+    log_fatal ("%s: failed to release mutex: %s\n", __func__,
+               gpg_strerror (gpg_error_from_syserror ()));
+}
+
+
+
 /* Read a fixed amount of data from READER into BUFFER.  */
 static gpg_error_t
 read_buffer (ksba_reader_t reader, unsigned char *buffer, size_t count)
@@ -151,8 +181,8 @@ destroy_wrapper (struct wrapper_context_s *ctx)
       gnupg_release_process (ctx->pid);
     }
   ksba_reader_release (ctx->reader);
-  SAFE_CLOSE (ctx->fd);
-  SAFE_CLOSE (ctx->log_fd);
+  SAFE_CLOSE (ctx->fp);
+  SAFE_CLOSE (ctx->log_fp);
   xfree (ctx->line);
   xfree (ctx);
 }
@@ -218,25 +248,27 @@ print_log_line (struct wrapper_context_s *ctx, char *line)
 
 
 /* Read data from the log stream.  Returns true if the log stream
  indicated EOF or error.  */
* indicated EOF or error.  */
 static int
 read_log_data (struct wrapper_context_s *ctx)
 {
-  int n;
+  int rc;
+  size_t n;
   char line[256];
 
-  /* We must use the npth_read function for pipes, always.  */
-  do
-    n = npth_read (ctx->log_fd, line, sizeof line - 1);
-  while (n < 0 && errno == EINTR);
-
-  if (n <= 0) /* EOF or error. */
+  rc = es_read (ctx->log_fp, line, sizeof line - 1, &n);
+  if (rc || !n)  /* Error or EOF.  */
     {
-      if (n < 0)
-        log_error (_("error reading log from ldap wrapper %d: %s\n"),
-                   (int)ctx->pid, strerror (errno));
-      print_log_line (ctx, NULL);
-      SAFE_CLOSE (ctx->log_fd);
+      if (rc)
+        {
+          gpg_error_t err = gpg_error_from_syserror ();
+          if (gpg_err_code (err) == GPG_ERR_EAGAIN)
+            return 0;
+          log_error (_("error reading log from ldap wrapper %d: %s\n"),
+                     (int)ctx->pid, gpg_strerror (err));
+        }
+      print_log_line (ctx, NULL);  /* Flush.  */
+      SAFE_CLOSE (ctx->log_fp);
       return 1;
     }
 
@@ -251,15 +283,18 @@ read_log_data (struct wrapper_context_s *ctx)
 /* This function is run by a separate thread to maintain the list of
    wrappers and to log error messages from these wrappers.  */
 void *
-ldap_wrapper_thread (void *dummy)
+ldap_reaper_thread (void *dummy)
 {
-  int nfds;
+  gpg_error_t err;
   struct wrapper_context_s *ctx;
   struct wrapper_context_s *ctx_prev;
   struct timespec abstime;
   struct timespec curtime;
   struct timespec timeout;
-  fd_set fdset;
+  int millisecs;
+  gpgrt_poll_t *fparray = NULL;
+  int fparraysize = 0;
+  int count, i;
   int ret;
   time_t exptime;
 
@@ -272,6 +307,61 @@ ldap_wrapper_thread (void *dummy)
     {
       int any_action = 0;
 
+      /* Wait until we are needed and then setup the FPARRAY.  */
+      /* Note: There is one unlock inside the block!  */
+      lock_reaper_list ();
+      {
+        while (!reaper_list && !shutting_down)
+          {
+            if (npth_cond_wait (&reaper_run_cond, &reaper_list_mutex))
+              log_error ("ldap-reaper: waiting on condition failed: %s\n",
+                         gpg_strerror (gpg_error_from_syserror ()));
+          }
+
+        for (count = 0, ctx = reaper_list; ctx; ctx = ctx->next)
+          if (ctx->log_fp)
+            count++;
+        if (count > fparraysize || !fparray)
+          {
+            /* Need to realloc the array.  We simply discard it and
+             * replace it by a new one.  */
+            xfree (fparray);
+            fparray = xtrycalloc (count? count : 1, sizeof *fparray);
+            if (!fparray)
+              {
+                err = gpg_error_from_syserror ();
+                log_error ("ldap-reaper can't allocate poll array: %s"
+                           " - waiting 1s\n", gpg_strerror (err));
+                /* Note: Here we unlock and continue! */
+                unlock_reaper_list ();
+                npth_sleep (1);
+                continue;
+            }
+            fparraysize = count;
+          }
+        for (count = 0, ctx = reaper_list; ctx; ctx = ctx->next)
+          {
+            if (ctx->log_fp)
+              {
+                log_assert (count < fparraysize);
+                fparray[count].stream = ctx->log_fp;
+                fparray[count].want_read = 1;
+                fparray[count].ignore = 0;
+                ctx->reaper_idx = count;
+                count++;
+              }
+            else
+              {
+                ctx->reaper_idx = -1;
+                fparray[count].ignore = 1;
+              }
+          }
+        for (i=count; i < fparraysize; i++)
+          fparray[i].ignore = 1;
+      }
+      unlock_reaper_list (); /* Note the one unlock inside the block.  */
+
+      /* Compute the next timeout.  */
       npth_clock_gettime (&curtime);
       if (!(npth_timercmp (&curtime, &abstime, <)))
        {
@@ -280,142 +370,166 @@ ldap_wrapper_thread (void *dummy)
          abstime.tv_sec += TIMERTICK_INTERVAL;
        }
       npth_timersub (&abstime, &curtime, &timeout);
+      millisecs = timeout.tv_sec * 1000;
+      millisecs += timeout.tv_nsec / 1000000;
+      if (millisecs < 0)
+        millisecs = 1;
 
-      FD_ZERO (&fdset);
-      nfds = -1;
-      for (ctx = wrapper_list; ctx; ctx = ctx->next)
+      if (DBG_EXTPROG)
         {
-          if (ctx->log_fd != -1)
-            {
-              FD_SET (ctx->log_fd, &fdset);
-              if (ctx->log_fd > nfds)
-                nfds = ctx->log_fd;
-            }
+          log_debug ("ldap-reaper: next run (count=%d size=%d, timeout=%d)\n",
+                     count, fparraysize, millisecs);
+          for (count=0; count < fparraysize; count++)
+            if (!fparray[count].ignore)
+              log_debug ("ldap-reaper: fp[%d] stream=%p want=%d\n",
+                         count, fparray[count].stream,fparray[count].want_read);
         }
-      nfds++;
 
-      /* FIXME: For Windows, we have to use a reader thread on the
-        pipe that signals an event (and a npth_select_ev variant).  */
-      ret = npth_pselect (nfds + 1, &fdset, NULL, NULL, &timeout, NULL);
-      if (ret == -1)
+      ret = es_poll (fparray, fparraysize, millisecs);
+      if (ret < 0)
        {
-          if (errno != EINTR)
-            {
-              log_error (_("npth_select failed: %s - waiting 1s\n"),
-                         strerror (errno));
-              npth_sleep (1);
-            }
+          err = gpg_error_from_syserror ();
+          log_error ("ldap-reaper failed to poll: %s"
+                     " - waiting 1s\n", gpg_strerror (err));
+          /* In case the reason for the error is a too large array, we
+           * release it so that it will be allocated smaller in the
+           * next round.  */
+          xfree (fparray);
+          fparray = NULL;
+          fparraysize = 0;
+          npth_sleep (1);
           continue;
        }
 
+      if (DBG_EXTPROG)
+        {
+          for (count=0; count < fparraysize; count++)
+            if (!fparray[count].ignore)
+              log_debug ("ldap-reaper: fp[%d] stream=%p r=%d %c%c%c%c%c%c%c\n",
+                         count, fparray[count].stream, ret,
+                         fparray[count].got_read? 'r':'-',
+                         fparray[count].got_write?'w':'-',
+                         fparray[count].got_oob?  'o':'-',
+                         fparray[count].got_rdhup?'H':'-',
+                         fparray[count].got_err?  'e':'-',
+                         fparray[count].got_hup?  'h':'-',
+                         fparray[count].got_nval? 'n':'-');
+        }
+
       /* All timestamps before exptime should be considered expired.  */
       exptime = time (NULL);
       if (exptime > INACTIVITY_TIMEOUT)
         exptime -= INACTIVITY_TIMEOUT;
 
-      /* Note that there is no need to lock the list because we always
-         add entries at the head (with a pending event status) and
-         thus traversing the list will even work if we have a context
-         switch in waitpid (which should anyway only happen with Pth's
-         hard system call mapping).  */
-      for (ctx = wrapper_list; ctx; ctx = ctx->next)
-        {
-          /* Check whether there is any logging to be done. */
-          if (nfds && ctx->log_fd != -1 && FD_ISSET (ctx->log_fd, &fdset))
-            {
-              if (read_log_data (ctx))
-                {
-                  SAFE_CLOSE (ctx->log_fd);
-                  any_action = 1;
-                }
-            }
-
-          /* Check whether the process is still running.  */
-          if (ctx->pid != (pid_t)(-1))
-            {
-              gpg_error_t err;
-             int status;
-
-             err = gnupg_wait_process ("[dirmngr_ldap]", ctx->pid, 0,
-                                        &status);
-              if (!err)
-                {
-                 log_info (_("ldap wrapper %d ready"), (int)ctx->pid);
-                  ctx->ready = 1;
-                 gnupg_release_process (ctx->pid);
-                  ctx->pid = (pid_t)(-1);
-                  any_action = 1;
-                }
-              else if (gpg_err_code (err) == GPG_ERR_GENERAL)
-                {
-                  if (status == 10)
-                    log_info (_("ldap wrapper %d ready: timeout\n"),
-                              (int)ctx->pid);
-                  else
-                    log_info (_("ldap wrapper %d ready: exitcode=%d\n"),
-                              (int)ctx->pid, status);
-                  ctx->ready = 1;
-                 gnupg_release_process (ctx->pid);
-                  ctx->pid = (pid_t)(-1);
-                  any_action = 1;
-                }
-              else if (gpg_err_code (err) != GPG_ERR_TIMEOUT)
-                {
-                  log_error (_("waiting for ldap wrapper %d failed: %s\n"),
-                             (int)ctx->pid, gpg_strerror (err));
-                  any_action = 1;
-                }
-            }
-
-          /* Check whether we should terminate the process. */
-          if (ctx->pid != (pid_t)(-1)
-              && ctx->stamp != (time_t)(-1) && ctx->stamp < exptime)
-            {
-              gnupg_kill_process (ctx->pid);
-              ctx->stamp = (time_t)(-1);
-              log_info (_("ldap wrapper %d stalled - killing\n"),
-                        (int)ctx->pid);
-              /* We need to close the log fd because the cleanup loop
-                 waits for it.  */
-              SAFE_CLOSE (ctx->log_fd);
-              any_action = 1;
-            }
-        }
-
-      /* If something has been printed to the log file or we got an
-         EOF from a wrapper, we now print the list of active
-         wrappers.  */
-      if (any_action && DBG_LOOKUP)
-        {
-          log_info ("ldap worker stati:\n");
-          for (ctx = wrapper_list; ctx; ctx = ctx->next)
-            log_info ("  c=%p pid=%d/%d rdr=%p ctrl=%p/%d la=%lu rdy=%d\n",
-                      ctx,
-                      (int)ctx->pid, (int)ctx->printable_pid,
-                      ctx->reader,
-                      ctx->ctrl, ctx->ctrl? ctx->ctrl->refcount:0,
-                      (unsigned long)ctx->stamp, ctx->ready);
-        }
+      lock_reaper_list ();
+      {
+        for (ctx = reaper_list; ctx; ctx = ctx->next)
+          {
+            /* Check whether there is any logging to be done.  We need
+             * to check FPARRAYSIZE because it can be 0 in case
+             * es_poll returned a timeout.  */
+            if (fparraysize && ctx->log_fp && ctx->reaper_idx >= 0)
+              {
+                log_assert (ctx->reaper_idx < fparraysize);
+                if (fparray[ctx->reaper_idx].got_read)
+                  {
+                    if (read_log_data (ctx))
+                      {
+                        SAFE_CLOSE (ctx->log_fp);
+                        any_action = 1;
+                      }
+                  }
+              }
+
+            /* Check whether the process is still running.  */
+            if (ctx->pid != (pid_t)(-1))
+              {
+                int status;
+
+                err = gnupg_wait_process ("[dirmngr_ldap]", ctx->pid, 0,
+                                          &status);
+                if (!err)
+                  {
+                    if (DBG_EXTPROG)
+                      log_info (_("ldap wrapper %d ready"), (int)ctx->pid);
+                    ctx->ready = 1;
+                    gnupg_release_process (ctx->pid);
+                    ctx->pid = (pid_t)(-1);
+                    any_action = 1;
+                  }
+                else if (gpg_err_code (err) == GPG_ERR_GENERAL)
+                  {
+                    if (status == 10)
+                      log_info (_("ldap wrapper %d ready: timeout\n"),
+                                (int)ctx->pid);
+                    else
+                      log_info (_("ldap wrapper %d ready: exitcode=%d\n"),
+                                (int)ctx->pid, status);
+                    ctx->ready = 1;
+                    gnupg_release_process (ctx->pid);
+                    ctx->pid = (pid_t)(-1);
+                    any_action = 1;
+                  }
+                else if (gpg_err_code (err) != GPG_ERR_TIMEOUT)
+                  {
+                    log_error (_("waiting for ldap wrapper %d failed: %s\n"),
+                               (int)ctx->pid, gpg_strerror (err));
+                    any_action = 1;
+                  }
+              }
+
+            /* Check whether we should terminate the process. */
+            if (ctx->pid != (pid_t)(-1)
+                && ctx->stamp != (time_t)(-1) && ctx->stamp < exptime)
+              {
+                gnupg_kill_process (ctx->pid);
+                ctx->stamp = (time_t)(-1);
+                log_info (_("ldap wrapper %d stalled - killing\n"),
+                          (int)ctx->pid);
+                /* We need to close the log stream because the cleanup
+                 * loop waits for it.  */
+                SAFE_CLOSE (ctx->log_fp);
+                any_action = 1;
+              }
+          }
 
+        /* If something has been printed to the log file or we got an
+         * EOF from a wrapper, we now print the list of active
+         * wrappers.  */
+        if (any_action && DBG_EXTPROG)
+          {
+            log_debug ("ldap worker stati:\n");
+            for (ctx = reaper_list; ctx; ctx = ctx->next)
+              log_debug ("  c=%p pid=%d/%d rdr=%p logfp=%p"
+                         " ctrl=%p/%d la=%lu rdy=%d\n",
+                         ctx,
+                         (int)ctx->pid, (int)ctx->printable_pid,
+                         ctx->reader, ctx->log_fp,
+                         ctx->ctrl, ctx->ctrl? ctx->ctrl->refcount:0,
+                         (unsigned long)ctx->stamp, ctx->ready);
+          }
 
-      /* Use a separate loop to check whether ready marked wrappers
-         may be removed.  We may only do so if the ksba reader object
-         is not anymore in use or we are in shutdown state.  */
-     again:
-      for (ctx_prev=NULL, ctx=wrapper_list; ctx; ctx_prev=ctx, ctx=ctx->next)
-        if (ctx->ready
-            && ((ctx->log_fd == -1 && !ctx->reader) || shutting_down))
+        /* An extra loop to check whether ready marked wrappers may be
+         * removed.  We may only do so if the ksba reader object is
+         * not anymore in use or we are in shutdown state.  */
+      again:
+        for (ctx_prev=NULL, ctx=reaper_list; ctx; ctx_prev=ctx, ctx=ctx->next)
           {
-            if (ctx_prev)
-              ctx_prev->next = ctx->next;
-            else
-              wrapper_list = ctx->next;
-            destroy_wrapper (ctx);
-            /* We need to restart because destroy_wrapper might have
-               done a context switch. */
-            goto again;
+            if (ctx->ready
+                && ((!ctx->log_fp && !ctx->reader) || shutting_down))
+              {
+                if (ctx_prev)
+                  ctx_prev->next = ctx->next;
+                else
+                  reaper_list = ctx->next;
+                destroy_wrapper (ctx);
+                goto again;
+              }
           }
+      }
+      unlock_reaper_list ();
     }
+
   /*NOTREACHED*/
   return NULL; /* Make the compiler happy.  */
 }
@@ -424,7 +538,7 @@ ldap_wrapper_thread (void *dummy)
 
 /* Start the reaper thread for the ldap wrapper.  */
 void
-ldap_wrapper_launch_thread (void)
+ldap_reaper_launch_thread (void)
 {
   static int done;
   npth_attr_t tattr;
@@ -435,14 +549,21 @@ ldap_wrapper_launch_thread (void)
     return;
   done = 1;
 
+#ifdef HAVE_W32_SYSTEM
+  /* Static init does not yet work in W32 nPth.  */
+  if (npth_cond_init (&reaper_run_cond, NULL))
+    log_fatal ("%s: failed to init condition variabale: %s\n",
+               __func__, gpg_strerror (gpg_error_from_syserror ()));
+#endif
+
   npth_attr_init (&tattr);
   npth_attr_setdetachstate (&tattr, NPTH_CREATE_DETACHED);
 
-  err = npth_create (&thread, &tattr, ldap_wrapper_thread, NULL);
-  if (err)
+  if (npth_create (&thread, &tattr, ldap_reaper_thread, NULL))
     {
-      log_error (_("error spawning ldap wrapper reaper thread: %s\n"),
-                 strerror (err) );
+      err = gpg_error_from_syserror ();
+      log_error ("error spawning ldap reaper reaper thread: %s\n",
+                 gpg_strerror (err) );
       dirmngr_exit (1);
     }
   npth_setname_np (thread, "ldap-reaper");
@@ -451,16 +572,20 @@ ldap_wrapper_launch_thread (void)
 
 
 
-
-
 /* Wait until all ldap wrappers have terminated.  We assume that the
    kill has already been sent to all of them.  */
 void
 ldap_wrapper_wait_connections ()
 {
-  shutting_down = 1;
-  /* FIXME: This is a busy wait.  */
-  while (wrapper_list)
+  lock_reaper_list ();
+  {
+    shutting_down = 1;
+    if (npth_cond_signal (&reaper_run_cond))
+      log_error ("%s: Ooops: signaling condition failed: %s\n",
+                 __func__, gpg_strerror (gpg_error_from_syserror ()));
+  }
+  unlock_reaper_list ();
+  while (reaper_list)
     npth_usleep (200);
 }
 
@@ -475,30 +600,35 @@ ldap_wrapper_release_context (ksba_reader_t reader)
   if (!reader )
     return;
 
-  for (ctx=wrapper_list; ctx; ctx=ctx->next)
-    if (ctx->reader == reader)
-      {
-        if (DBG_LOOKUP)
-          log_info ("releasing ldap worker c=%p pid=%d/%d rdr=%p ctrl=%p/%d\n",
-                    ctx,
-                    (int)ctx->pid, (int)ctx->printable_pid,
-                    ctx->reader,
-                    ctx->ctrl, ctx->ctrl? ctx->ctrl->refcount:0);
-
-        ctx->reader = NULL;
-        SAFE_CLOSE (ctx->fd);
-        if (ctx->ctrl)
-          {
-            ctx->ctrl->refcount--;
-            ctx->ctrl = NULL;
-          }
-        if (ctx->fd_error)
-          log_info (_("reading from ldap wrapper %d failed: %s\n"),
-                    ctx->printable_pid, gpg_strerror (ctx->fd_error));
-        break;
-      }
+  lock_reaper_list ();
+  {
+    for (ctx=reaper_list; ctx; ctx=ctx->next)
+      if (ctx->reader == reader)
+        {
+          if (DBG_EXTPROG)
+            log_debug ("releasing ldap worker c=%p pid=%d/%d rdr=%p"
+                       " ctrl=%p/%d\n", ctx,
+                       (int)ctx->pid, (int)ctx->printable_pid,
+                       ctx->reader,
+                       ctx->ctrl, ctx->ctrl? ctx->ctrl->refcount:0);
+
+          ctx->reader = NULL;
+          SAFE_CLOSE (ctx->fp);
+          if (ctx->ctrl)
+            {
+              ctx->ctrl->refcount--;
+              ctx->ctrl = NULL;
+            }
+          if (ctx->fp_err)
+            log_info ("%s: reading from ldap wrapper %d failed: %s\n",
+                      __func__, ctx->printable_pid, gpg_strerror (ctx->fp_err));
+          break;
+        }
+  }
+  unlock_reaper_list ();
 }
 
+
 /* Cleanup all resources held by the connection associated with
    CTRL.  This is used after a cancel to kill running wrappers.  */
 void
@@ -506,41 +636,45 @@ ldap_wrapper_connection_cleanup (ctrl_t ctrl)
 {
   struct wrapper_context_s *ctx;
 
-  for (ctx=wrapper_list; ctx; ctx=ctx->next)
-    if (ctx->ctrl && ctx->ctrl == ctrl)
-      {
-        ctx->ctrl->refcount--;
-        ctx->ctrl = NULL;
-        if (ctx->pid != (pid_t)(-1))
-          gnupg_kill_process (ctx->pid);
-        if (ctx->fd_error)
-          log_info (_("reading from ldap wrapper %d failed: %s\n"),
-                    ctx->printable_pid, gpg_strerror (ctx->fd_error));
-      }
+  lock_reaper_list ();
+  {
+    for (ctx=reaper_list; ctx; ctx=ctx->next)
+      if (ctx->ctrl && ctx->ctrl == ctrl)
+        {
+          ctx->ctrl->refcount--;
+          ctx->ctrl = NULL;
+          if (ctx->pid != (pid_t)(-1))
+            gnupg_kill_process (ctx->pid);
+          if (ctx->fp_err)
+            log_info ("%s: reading from ldap wrapper %d failed: %s\n",
+                      __func__, ctx->printable_pid, gpg_strerror (ctx->fp_err));
+        }
+  }
+  unlock_reaper_list ();
 }
 
 
 /* This is the callback used by the ldap wrapper to feed the ksba
  reader with the wrappers stdout.  See the description of
  ksba_reader_set_cb for details.  */
* reader with the wrapper's stdout.  See the description of
* ksba_reader_set_cb for details.  */
 static int
 reader_callback (void *cb_value, char *buffer, size_t count,  size_t *nread)
 {
   struct wrapper_context_s *ctx = cb_value;
   size_t nleft = count;
-  int nfds;
   struct timespec abstime;
   struct timespec curtime;
   struct timespec timeout;
-  int saved_errno;
-  fd_set fdset, read_fdset;
+  int millisecs;
+  gpgrt_poll_t fparray[1];
   int ret;
+  gpg_error_t err;
+
 
   /* FIXME: We might want to add some internal buffering because the
      ksba code does not do any buffering for itself (because a ksba
      reader may be detached from another stream to read other data and
-     the it would be cumbersome to get back already buffered
-     stuff).  */
+     then it would be cumbersome to get back already buffered stuff).  */
 
   if (!buffer && !count && !nread)
     return -1; /* Rewind is not supported. */
@@ -548,81 +682,108 @@ reader_callback (void *cb_value, char *buffer, size_t count,  size_t *nread)
   /* If we ever encountered a read error, don't continue (we don't want to
      possibly overwrite the last error cause).  Bail out also if the
      file descriptor has been closed. */
-  if (ctx->fd_error || ctx->fd == -1)
+  if (ctx->fp_err || !ctx->fp)
     {
       *nread = 0;
       return -1;
     }
 
-  FD_ZERO (&fdset);
-  FD_SET (ctx->fd, &fdset);
-  nfds = ctx->fd + 1;
+  memset (fparray, 0, sizeof fparray);
+  fparray[0].stream = ctx->fp;
+  fparray[0].want_read = 1;
 
   npth_clock_gettime (&abstime);
   abstime.tv_sec += TIMERTICK_INTERVAL;
 
   while (nleft > 0)
     {
-      int n;
-      gpg_error_t err;
-
       npth_clock_gettime (&curtime);
       if (!(npth_timercmp (&curtime, &abstime, <)))
        {
          err = dirmngr_tick (ctx->ctrl);
           if (err)
             {
-              ctx->fd_error = err;
-              SAFE_CLOSE (ctx->fd);
+              ctx->fp_err = err;
+              SAFE_CLOSE (ctx->fp);
               return -1;
             }
          npth_clock_gettime (&abstime);
          abstime.tv_sec += TIMERTICK_INTERVAL;
        }
       npth_timersub (&abstime, &curtime, &timeout);
+      millisecs = timeout.tv_sec * 1000;
+      millisecs += timeout.tv_nsec / 1000000;
+      if (millisecs < 0)
+        millisecs = 1;
 
-      read_fdset = fdset;
-      ret = npth_pselect (nfds, &read_fdset, NULL, NULL, &timeout, NULL);
-      saved_errno = errno;
+      if (DBG_EXTPROG)
+        {
+          log_debug ("%s: fp[0] stream=%p want=%d\n",
+                     __func__, fparray[0].stream,fparray[0].want_read);
+        }
 
-      if (ret == -1 && saved_errno != EINTR)
+      ret = es_poll (fparray, DIM (fparray), millisecs);
+      if (ret < 0)
        {
-          ctx->fd_error = gpg_error_from_errno (errno);
-          SAFE_CLOSE (ctx->fd);
+          ctx->fp_err = gpg_error_from_syserror ();
+          log_error ("error polling stdout of ldap wrapper %d: %s\n",
+                     ctx->printable_pid, gpg_strerror (ctx->fp_err));
+          SAFE_CLOSE (ctx->fp);
           return -1;
         }
-      if (ret <= 0)
-       /* Timeout.  Will be handled when calculating the next timeout.  */
-       continue;
-
-      /* This should not block now that select returned with a file
-        descriptor.  So it shouldn't be necessary to use npth_read
-        (and it is slightly dangerous in the sense that a concurrent
-        thread might (accidentially?) change the status of ctx->fd
-        before we read.  FIXME: Set ctx->fd to nonblocking?  */
-      n = read (ctx->fd, buffer, nleft);
-      if (n < 0)
+      if (DBG_EXTPROG)
         {
-          ctx->fd_error = gpg_error_from_errno (errno);
-          SAFE_CLOSE (ctx->fd);
-          return -1;
+          log_debug ("%s: fp[0] stream=%p r=%d %c%c%c%c%c%c%c\n",
+                     __func__, fparray[0].stream, ret,
+                     fparray[0].got_read? 'r':'-',
+                     fparray[0].got_write?'w':'-',
+                     fparray[0].got_oob?  'o':'-',
+                     fparray[0].got_rdhup?'H':'-',
+                     fparray[0].got_err?  'e':'-',
+                     fparray[0].got_hup?  'h':'-',
+                     fparray[0].got_nval? 'n':'-');
         }
-      else if (!n)
+      if (!ret)
         {
-          if (nleft == count)
-           return -1; /* EOF. */
-          break;
+          /* Timeout.  Will be handled when calculating the next timeout.  */
+          continue;
+        }
+
+      if (fparray[0].got_read)
+        {
+          size_t n;
+
+          if (es_read (ctx->fp, buffer, nleft, &n))
+            {
+              ctx->fp_err = gpg_error_from_syserror ();
+              if (gpg_err_code (ctx->fp_err) == GPG_ERR_EAGAIN)
+                ctx->fp_err = 0;
+              else
+                {
+                  log_error ("%s: error reading: %s (%d)\n",
+                             __func__, gpg_strerror (ctx->fp_err), ctx->fp_err);
+                  SAFE_CLOSE (ctx->fp);
+                  return -1;
+                }
+            }
+          else if (!n) /* EOF */
+            {
+              if (nleft == count)
+                return -1; /* EOF. */
+              break;
+            }
+          nleft -= n;
+          buffer += n;
+          if (n > 0 && ctx->stamp != (time_t)(-1))
+            ctx->stamp = time (NULL);
         }
-      nleft -= n;
-      buffer += n;
-      if (n > 0 && ctx->stamp != (time_t)(-1))
-        ctx->stamp = time (NULL);
     }
   *nread = count - nleft;
 
   return 0;
 }
 
+
 /* Fork and exec the LDAP wrapper and return a new libksba reader
    object at READER.  ARGV is a NULL terminated list of arguments for
    the wrapper.  The function returns 0 on success or an error code.
@@ -646,7 +807,7 @@ ldap_wrapper (ctrl_t ctrl, ksba_reader_t *reader, const char *argv[])
   int j;
   const char **arg_list;
   const char *pgmname;
-  int outpipe[2], errpipe[2];
+  estream_t outfp, errfp;
 
   /* It would be too simple to connect stderr just to our logging
      stream.  The problem is that if we are running multi-threaded
@@ -656,7 +817,7 @@ ldap_wrapper (ctrl_t ctrl, ksba_reader_t *reader, const char *argv[])
      wrapper module to do the logging on its own.  Given that we anyway
      need a way to reap the child process and this is best done using a
      general reaping thread, that thread can do the logging too. */
-  ldap_wrapper_launch_thread ();
+  ldap_reaper_launch_thread ();
 
   *reader = NULL;
 
@@ -696,41 +857,21 @@ ldap_wrapper (ctrl_t ctrl, ksba_reader_t *reader, const char *argv[])
       return err;
     }
 
-  err = gnupg_create_inbound_pipe (outpipe, NULL, 0);
-  if (!err)
-    {
-      err = gnupg_create_inbound_pipe (errpipe, NULL, 0);
-      if (err)
-        {
-          close (outpipe[0]);
-          close (outpipe[1]);
-        }
-    }
-  if (err)
-    {
-      log_error (_("error creating a pipe: %s\n"), gpg_strerror (err));
-      xfree (arg_list);
-      xfree (ctx);
-      return err;
-    }
-
-  err = gnupg_spawn_process_fd (pgmname, arg_list,
-                                -1, outpipe[1], errpipe[1], &pid);
+  err = gnupg_spawn_process (pgmname, arg_list,
+                             NULL, NULL, GNUPG_SPAWN_NONBLOCK,
+                             NULL, &outfp, &errfp, &pid);
   xfree (arg_list);
-  close (outpipe[1]);
-  close (errpipe[1]);
   if (err)
     {
-      close (outpipe[0]);
-      close (errpipe[0]);
       xfree (ctx);
+      log_error ("error running '%s': %s\n", pgmname, gpg_strerror (err));
       return err;
     }
 
   ctx->pid = pid;
   ctx->printable_pid = (int) pid;
-  ctx->fd = outpipe[0];
-  ctx->log_fd = errpipe[0];
+  ctx->fp = outfp;
+  ctx->log_fp = errfp;
   ctx->ctrl = ctrl;
   ctrl->refcount++;
   ctx->stamp = time (NULL);
@@ -749,12 +890,20 @@ ldap_wrapper (ctrl_t ctrl, ksba_reader_t *reader, const char *argv[])
     }
 
   /* Hook the context into our list of running wrappers.  */
-  ctx->reader = *reader;
-  ctx->next = wrapper_list;
-  wrapper_list = ctx;
-  if (opt.verbose)
-    log_info ("ldap wrapper %d started (reader %p)\n",
-              (int)ctx->pid, ctx->reader);
+  lock_reaper_list ();
+  {
+    ctx->reader = *reader;
+    ctx->next = reaper_list;
+    reaper_list = ctx;
+    if (npth_cond_signal (&reaper_run_cond))
+      log_error ("ldap-wrapper: Ooops: signaling condition failed: %s (%d)\n",
+                 gpg_strerror (gpg_error_from_syserror ()), errno);
+  }
+  unlock_reaper_list ();
+
+  if (DBG_EXTPROG)
+    log_debug ("ldap wrapper %d started (%p, %s)\n",
+               (int)ctx->pid, ctx->reader, pgmname);
 
   /* Need to wait for the first byte so we are able to detect an empty
      output and not let the consumer see an EOF without further error
index adf8307..cb3c0b7 100644 (file)
@@ -136,8 +136,12 @@ run_ldap_wrapper (ctrl_t ctrl,
       argv[argc++] = "--pass";
       argv[argc++] = pass;
     }
-  if (opt.verbose)
+
+  if (DBG_LOOKUP)
     argv[argc++] = "-vv";
+  else if (DBG_EXTPROG)
+    argv[argc++] = "-v";
+
   argv[argc++] = "--log-with-pid";
   if (multi_mode)
     argv[argc++] = "--multi";
@@ -564,8 +568,12 @@ start_cert_fetch_ldap (ctrl_t ctrl, cert_fetch_context_t *context,
       argv[argc++] = "--pass";
       argv[argc++] = pass;
     }
-  if (opt.verbose)
+
+  if (DBG_LOOKUP)
     argv[argc++] = "-vv";
+  else if (DBG_EXTPROG)
+    argv[argc++] = "-v";
+
   argv[argc++] = "--log-with-pid";
   argv[argc++] = "--multi";
   if (opt.ldaptimeout)
index bc00466..fb88372 100644 (file)
@@ -126,7 +126,7 @@ fetch_file (ctrl_t ctrl, const char *url, estream_t *r_fp)
   size_t nread, nwritten;
   char buffer[1024];
 
-  if ((err = ks_http_fetch (ctrl, url, &httpfp)))
+  if ((err = ks_http_fetch (ctrl, url, KS_HTTP_FETCH_NOCACHE, &httpfp)))
     goto leave;
 
   /* We now read the data from the web server into a memory buffer.
index 60d9802..b7cdb24 100644 (file)
@@ -1105,7 +1105,7 @@ cmd_ldapserver (assuan_context_t ctx, char *line)
 
 static const char hlp_isvalid[] =
   "ISVALID [--only-ocsp] [--force-default-responder]"
-  " <certificate_id>|<certificate_fpr>\n"
+  " <certificate_id> [<certificate_fpr>]\n"
   "\n"
   "This command checks whether the certificate identified by the\n"
   "certificate_id is valid.  This is done by consulting CRLs or\n"
@@ -1117,8 +1117,9 @@ static const char hlp_isvalid[] =
   "delimited by a single dot.  The first part is the SHA-1 hash of the\n"
   "issuer name and the second part the serial number.\n"
   "\n"
-  "Alternatively the certificate's fingerprint may be given in which\n"
-  "case an OCSP request is done before consulting the CRL.\n"
+  "If an OCSP check is desired CERTIFICATE_FPR with the hex encoded\n"
+  "fingerprint of the certificate is required.  In this case an OCSP\n"
+  "request is done before consulting the CRL.\n"
   "\n"
   "If the option --only-ocsp is given, no fallback to a CRL check will\n"
   "be used.\n"
@@ -1130,7 +1131,7 @@ static gpg_error_t
 cmd_isvalid (assuan_context_t ctx, char *line)
 {
   ctrl_t ctrl = assuan_get_pointer (ctx);
-  char *issuerhash, *serialno;
+  char *issuerhash, *serialno, *fpr;
   gpg_error_t err;
   int did_inquire = 0;
   int ocsp_mode = 0;
@@ -1141,25 +1142,36 @@ cmd_isvalid (assuan_context_t ctx, char *line)
   force_default_responder = has_option (line, "--force-default-responder");
   line = skip_options (line);
 
-  issuerhash = xstrdup (line); /* We need to work on a copy of the
-                                  line because that same Assuan
-                                  context may be used for an inquiry.
-                                  That is because Assuan reuses its
-                                  line buffer.
-                                   */
+  /* We need to work on a copy of the line because that same Assuan
+   * context may be used for an inquiry.  That is because Assuan
+   * reuses its line buffer.  */
+  issuerhash = xstrdup (line);
 
   serialno = strchr (issuerhash, '.');
-  if (serialno)
-    *serialno++ = 0;
-  else
+  if (!serialno)
+    {
+      xfree (issuerhash);
+      return leave_cmd (ctx, PARM_ERROR (_("serialno missing in cert ID")));
+    }
+  *serialno++ = 0;
+  if (strlen (issuerhash) != 40)
     {
-      char *endp = strchr (issuerhash, ' ');
+      xfree (issuerhash);
+      return leave_cmd (ctx, PARM_ERROR ("cert ID is too short"));
+    }
+
+  fpr = strchr (serialno, ' ');
+  while (fpr && spacep (fpr))
+    fpr++;
+  if (fpr && *fpr)
+    {
+      char *endp = strchr (fpr, ' ');
       if (endp)
         *endp = 0;
-      if (strlen (issuerhash) != 40)
+      if (strlen (fpr) != 40)
         {
           xfree (issuerhash);
-          return leave_cmd (ctx, PARM_ERROR (_("serialno missing in cert ID")));
+          return leave_cmd (ctx, PARM_ERROR ("fingerprint too short"));
         }
       ocsp_mode = 1;
     }
@@ -1168,17 +1180,24 @@ cmd_isvalid (assuan_context_t ctx, char *line)
  again:
   if (ocsp_mode)
     {
-      /* Note, that we ignore the given issuer hash and instead rely
-         on the current certificate semantics used with this
-         command. */
+      /* Note, that we currently ignore the supplied fingerprint FPR;
+       * instead ocsp_isvalid does an inquire to ask for the cert.
+       * The fingerprint may eventually be used to lookup the
+       * certificate in a local cache.  */
       if (!opt.allow_ocsp)
         err = gpg_error (GPG_ERR_NOT_SUPPORTED);
       else
         err = ocsp_isvalid (ctrl, NULL, NULL, force_default_responder);
-      /* Fixme: If we got no ocsp response and --only-ocsp is not used
-         we should fall back to CRL mode.  Thus we need to clear
-         OCSP_MODE, get the issuerhash and the serialno from the
-         current certificate and jump to again. */
+
+      if (gpg_err_code (err) == GPG_ERR_CONFIGURATION
+          && gpg_err_source (err) == GPG_ERR_SOURCE_DIRMNGR)
+        {
+          /* No default responder configured - fallback to CRL.  */
+          if (!only_ocsp)
+            log_info ("falling back to CRL check\n");
+          ocsp_mode = 0;
+          goto again;
+        }
     }
   else if (only_ocsp)
     err = gpg_error (GPG_ERR_NO_CRL_KNOWN);
@@ -1858,7 +1877,7 @@ static const char hlp_validate[] =
   "  INQUIRE CERTLIST\n"
   "\n"
   "Here the first certificate is the target certificate, the remaining\n"
-  "certificates are suggested intermediary certificates.  All certifciates\n"
+  "certificates are suggested intermediary certificates.  All certificates\n"
   "need to be PEM encoded.\n"
   "\n"
   "The option --systrust changes the behaviour to include the system\n"
@@ -1909,7 +1928,7 @@ cmd_validate (assuan_context_t ctx, char *line)
             err = gpg_error (GPG_ERR_MISSING_CERT);
           if (!err)
             {
-              /* Extraxt the first certificate from the list.  */
+              /* Extract the first certificate from the list.  */
               cert = certlist->cert;
               ksba_cert_ref (cert);
             }
@@ -1978,6 +1997,38 @@ make_keyserver_item (const char *uri, uri_item_t *r_item)
   uri_item_t item;
 
   *r_item = NULL;
+
+  /* We used to have DNS CNAME redirection from the URLs below to
+   * sks-keyserver. pools.  The idea was to allow for a quick way to
+   * switch to a different set of pools.  The problem with that
+   * approach is that TLS needs to verify the hostname and - because
+   * DNS is not secured - it can only check the user supplied hostname
+   * and not a hostname from a CNAME RR.  Thus the final server all
+   * need to have certificates with the actual pool name as well as
+   * for keys.gnupg.net - that would render the advantage of
+   * keys.gnupg.net useless and so we better give up on this.  Because
+   * the keys.gnupg.net URL are still in widespread use we do a static
+   * mapping here.
+   */
+  if (!strcmp (uri, "hkps://keys.gnupg.net")
+      || !strcmp (uri, "keys.gnupg.net"))
+    uri = "hkps://hkps.pool.sks-keyservers.net";
+  else if (!strcmp (uri, "https://keys.gnupg.net"))
+    uri = "https://hkps.pool.sks-keyservers.net";
+  else if (!strcmp (uri, "hkp://keys.gnupg.net"))
+    uri = "hkp://hkps.pool.sks-keyservers.net";
+  else if (!strcmp (uri, "http://keys.gnupg.net"))
+    uri = "http://hkps.pool.sks-keyservers.net";
+  else if (!strcmp (uri, "hkps://http-keys.gnupg.net")
+           || !strcmp (uri, "http-keys.gnupg.net"))
+    uri = "hkps://ha.pool.sks-keyservers.net";
+  else if (!strcmp (uri, "https://http-keys.gnupg.net"))
+    uri = "https://ha.pool.sks-keyservers.net";
+  else if (!strcmp (uri, "hkp://http-keys.gnupg.net"))
+    uri = "hkp://ha.pool.sks-keyservers.net";
+  else if (!strcmp (uri, "http://http-keys.gnupg.net"))
+    uri = "http://ha.pool.sks-keyservers.net";
+
   item = xtrymalloc (sizeof *item + strlen (uri));
   if (!item)
     return gpg_error_from_syserror ();
@@ -2489,7 +2540,8 @@ static const char hlp_getinfo[] =
   "dnsinfo     - Return info about the DNS resolver\n"
   "socket_name - Return the name of the socket.\n"
   "session_id  - Return the current session_id.\n"
-  "workqueue   - Inspect the work queue\n";
+  "workqueue   - Inspect the work queue\n"
+  "getenv NAME - Return value of envvar NAME\n";
 static gpg_error_t
 cmd_getinfo (assuan_context_t ctx, char *line)
 {
@@ -2557,6 +2609,23 @@ cmd_getinfo (assuan_context_t ctx, char *line)
       workqueue_dump_queue (ctrl);
       err = 0;
     }
+  else if (!strncmp (line, "getenv", 6)
+           && (line[6] == ' ' || line[6] == '\t' || !line[6]))
+    {
+      line += 6;
+      while (*line == ' ' || *line == '\t')
+        line++;
+      if (!*line)
+        err = gpg_error (GPG_ERR_MISSING_VALUE);
+      else
+        {
+          const char *s = getenv (line);
+          if (!s)
+            err = set_error (GPG_ERR_NOT_FOUND, "No such envvar");
+          else
+            err = assuan_send_data (ctx, s, strlen (s));
+        }
+    }
   else
     err = set_error (GPG_ERR_ASS_PARAMETER, "unknown value for WHAT");
 
index a4063b4..52051ed 100644 (file)
@@ -105,6 +105,19 @@ described here.
     certificate (i.e. for the trust anchor) and an 'f' for all other
     valid certificates.
 
+    In "sig" records, this field may have one of these values as first
+    character:
+
+    - ! :: Signature is good.
+    - - :: Signature is bad.
+    - ? :: No public key to verify signature or public key is not usable.
+    - % :: Other error verifying a signature
+
+    More values may be added later.  The field may also be empty if
+    gpg has been invoked in a non-checking mode (--list-sigs) or in a
+    fast checking mode.  Since 2.2.7 '?' will also be printed by the
+    command --list-sigs if the key is not in the local keyring.
+
 *** Field 3 - Key length
 
     The length of key in bits.
@@ -195,9 +208,11 @@ described here.
     gpg's --edit-key menu does.
 
     For "sig" records, this is the fingerprint of the key that issued
-    the signature.  Note that this is only filled in if the signature
+    the signature.  Note that this may only be filled if the signature
     verified correctly.  Note also that for various technical reasons,
     this fingerprint is only available if --no-sig-cache is used.
+    Since 2.2.7 this field will also be set if the key is missing but
+    the signature carries an issuer fingerprint as meta data.
 
 *** Field 14 - Flag field
 
@@ -437,14 +452,17 @@ pkd:0:1024:B665B1435F4C2 .... FF26ABB:
     available.  This is the case with CMS and might eventually also be
     available for OpenPGP.
 
-*** ERRSIG  <keyid>  <pkalgo> <hashalgo> <sig_class> <time> <rc>
+*** ERRSIG  <keyid>  <pkalgo> <hashalgo> <sig_class> <time> <rc> <fpr>
     It was not possible to check the signature.  This may be caused by
     a missing public key or an unsupported algorithm.  A RC of 4
     indicates unknown algorithm, a 9 indicates a missing public
     key. The other fields give more information about this signature.
     sig_class is a 2 byte hex-value.  The fingerprint may be used
-    instead of the keyid if it is available.  This is the case with
-    gpgsm and might eventually also be available for OpenPGP.
+    instead of the long_keyid_or_fpr if it is available.  This is the
+    case with gpgsm and might eventually also be available for
+    OpenPGP.  The ERRSIG line has FPR filed which is only available
+    since 2.2.7; that FPR may either be missing or - if the signature
+    has no fingerprint as meta data.
 
     Note, that TIME may either be the number of seconds since Epoch or
     an ISO 8601 string.  The latter can be detected by the presence of
@@ -722,7 +740,9 @@ pkd:0:1024:B665B1435F4C2 .... FF26ABB:
     The used key has been revoked by its owner.  No arguments yet.
 
 *** NO_PUBKEY  <long keyid>
-    The public key is not available
+    The public key is not available.  Note the arg should in general
+    not be used because it is better to take it from the ERRSIG
+    status line which is printed right before this one.
 
 *** NO_SECKEY  <long keyid>
     The secret key is not available
index aa16b77..cb69cd9 100644 (file)
@@ -49,7 +49,8 @@ EXTRA_DIST = samplekeys.asc mksamplekeys com-certs.pem \
              gnupg-card-architecture.png gnupg-card-architecture.pdf \
              FAQ gnupg7.texi mkdefsinc.c defsincdate \
              opt-homedir.texi see-also-note.texi specify-user-id.texi \
-            gpgv.texi yat2m.c ChangeLog-2011 whats-new-in-2.1.txt
+            gpgv.texi yat2m.c ChangeLog-2011 whats-new-in-2.1.txt \
+             trust-values.texi
 
 BUILT_SOURCES = gnupg-module-overview.png gnupg-module-overview.pdf \
                 gnupg-card-architecture.png gnupg-card-architecture.pdf \
index 800955c..76be528 100644 (file)
@@ -208,9 +208,10 @@ flag names.  To get a list of all supported flags the single word
 @opindex debug-all
 Same as @code{--debug=0xffffffff}
 
-@item --gnutls-debug @var{level}
-@opindex gnutls-debug
-Enable debugging of GNUTLS at @var{level}.
+@item --tls-debug @var{level}
+@opindex tls-debug
+Enable debugging of the TLS layer at @var{level}.  The details of the
+debug level depend on the used TLS library and are not set in stone.
 
 @item --debug-wait @var{n}
 @opindex debug-wait
index 061e069..2884fe7 100644 (file)
@@ -15,7 +15,7 @@ enable-crl-checks
 [gpg-agent]
 enable-extended-key-format
 default-cache-ttl 900
-max-cache-ttl [] 3600
+max-cache-ttl 3600
 no-allow-mark-trusted
 no-allow-external-cache
 enforce-passphrase-constraints
index 7154fc8..3364148 100644 (file)
@@ -140,6 +140,7 @@ the administration and the architecture.
 * Invoking GPGSM::      Using the S/MIME protocol.
 * Invoking SCDAEMON::   How to handle Smartcards.
 * Specify a User ID::   How to Specify a User Id.
+* Trust Values::        How GnuPG displays trust values.
 
 * Helper Tools::        Description of small helper tools
 * Web Key Service::     Tools for the Web Key Service
@@ -179,6 +180,11 @@ the administration and the architecture.
 @anchor{how-to-specify-a-user-id}
 @include specify-user-id.texi
 
+@node Trust Values
+@chapter Trust Values
+@anchor{trust-values}
+@cindex trust values
+@include trust-values.texi
 
 @include tools.texi
 @include wks.texi
index 14818b7..00ac033 100644 (file)
@@ -214,7 +214,10 @@ symmetric cipher used is @value{GPGSYMENCALGO}, but may be chosen with the
 @option{--encrypt} (for a message that may be decrypted via a secret key
 or a passphrase), or @option{--sign} and @option{--encrypt} together
 (for a signed message that may be decrypted via a secret key or a
-passphrase).
+passphrase).  @command{@gpgname} caches the passphrase used for
+symmetric encryption so that a decrypt operation may not require that
+the user needs to enter the passphrase.  The option
+@option{--no-symkey-cache} can be used to disable this feature.
 
 @item --store
 @opindex store
@@ -1037,38 +1040,13 @@ signing.
 
 @c man:.RS
 The listing shows you the key with its secondary keys and all user
-ids.  The primary user id is indicated by a dot, and selected keys or
-user ids are indicated by an asterisk.  The trust
-value is displayed with the primary key: the first is the assigned owner
-trust and the second is the calculated trust value. Letters are used for
-the values:
+IDs.  The primary user ID is indicated by a dot, and selected keys or
+user IDs are indicated by an asterisk.  The trust
+value is displayed with the primary key: "trust" is the assigned owner
+trust and "validity" is the calculated validity of the key.  Validity
+values are also displayed for all user IDs.
+For possible values of trust, @pxref{trust-values}.
 @c man:.RE
-
-@table @asis
-
-  @item -
-  No ownertrust assigned / not yet calculated.
-
-  @item e
-  Trust
-  calculation has failed; probably due to an expired key.
-
-  @item q
-  Not enough information for calculation.
-
-  @item n
-  Never trust this key.
-
-  @item m
-  Marginally trusted.
-
-  @item f
-  Fully trusted.
-
-  @item u
-  Ultimately trusted.
-
-@end table
 @c ******** End Edit-key Options **********
 
 @item --sign-key @var{name}
@@ -3188,6 +3166,12 @@ are:
   Pinentry the user is not prompted again if he enters a bad password.
 @end table
 
+@item --no-symkey-cache
+@opindex no-symkey-cache
+Disable the passphrase cache used for symmetrical en- and decryption.
+This cache is based on the message specific salt value
+(cf. @option{--s2k-mode}).
+
 @item --request-origin @var{origin}
 @opindex request-origin
 Tell gpg to assume that the operation ultimately originated at
@@ -3302,8 +3286,14 @@ print the public key data.
 Same as @option{--list-keys}, but the signatures are listed too.  This
 command has the same effect as using @option{--list-keys} with
 @option{--with-sig-list}.  Note that in contrast to
-@option{--check-signatures} the key signatures are not verified.
+@option{--check-signatures} the key signatures are not verified.  This
+command can be used to create a list of signing keys missing in the
+lcoal keyring; for example:
 
+@example
+      gpg --list-sigs --with-colons USERID | \
+        awk -F: '$1=="sig" && $2=="?" @{if($13)@{print $13@}else@{print $5@}@}'
+@end example
 
 @item --fast-list-mode
 @opindex fast-list-mode
@@ -3831,6 +3821,10 @@ which is equivalent to
 imports only the user ids of a key containing the strings "Alfa"
 or "Alpha" but not the string "test".
 
+@mansect trust values
+@ifset isman
+@include trust-values.texi
+@end ifset
 
 @mansect return value
 @chapheading RETURN VALUE
diff --git a/doc/trust-values.texi b/doc/trust-values.texi
new file mode 100644 (file)
index 0000000..634a784
--- /dev/null
@@ -0,0 +1,47 @@
+@c Copyright (C) 2018 Free Software Foundation, Inc.
+@c This is part of the GnuPG manual.
+@c For copying conditions, see the file gnupg.texi.
+
+Trust values are used to indicate ownertrust and validity of keys and
+user IDs.  They are displayed with letters or strings:
+
+@table @asis
+
+  @item -
+  @itemx unknown
+  No ownertrust assigned / not yet calculated.
+
+  @item e
+  @itemx expired
+
+  Trust calculation has failed; probably due to an expired key.
+
+  @item q
+  @itemx undefined, undef
+  Not enough information for calculation.
+
+  @item n
+  @itemx never
+  Never trust this key.
+
+  @item m
+  @itemx marginal
+  Marginally trusted.
+
+  @item f
+  @itemx full
+  Fully trusted.
+
+  @item u
+  @itemx ultimate
+  Ultimately trusted.
+
+  @item r
+  @itemx revoked
+  For validity only: the key or the user ID has been revoked.
+
+  @item ?
+  @itemx err
+  The program encountered an unknown trust value.
+
+@end table
index ffb94da..587f181 100644 (file)
@@ -633,7 +633,7 @@ current_card_status (ctrl_t ctrl, estream_t fp,
         {
           tty_fprintf (fp, "      created ....: %s\n",
                        isotimestamp (info.fpr3time));
-          print_keygrip (fp, info.grp2);
+          print_keygrip (fp, info.grp3);
         }
       tty_fprintf (fp, "General key info..: ");
 
index 61bb756..e7a6f2b 100644 (file)
@@ -309,15 +309,19 @@ int
 handle_compressed (ctrl_t ctrl, void *procctx, PKT_compressed *cd,
                   int (*callback)(IOBUF, void *), void *passthru )
 {
-    compress_filter_context_t *cfx;
     int rc;
 
     if(check_compress_algo(cd->algorithm))
       return GPG_ERR_COMPR_ALGO;
-    cfx = xmalloc_clear (sizeof *cfx);
-    cfx->release = release_context;
-    cfx->algo = cd->algorithm;
-    push_compress_filter(cd->buf,cfx,cd->algorithm);
+    if(cd->algorithm) {
+        compress_filter_context_t *cfx;
+
+        cfx = xmalloc_clear (sizeof *cfx);
+        cfx->release = release_context;
+        cfx->algo = cd->algorithm;
+        if (push_compress_filter(cd->buf, cfx, cd->algorithm))
+          xfree (cfx);
+    }
     if( callback )
        rc = callback(cd->buf, passthru );
     else
@@ -326,16 +330,20 @@ handle_compressed (ctrl_t ctrl, void *procctx, PKT_compressed *cd,
     return rc;
 }
 
-void
+gpg_error_t
 push_compress_filter(IOBUF out,compress_filter_context_t *zfx,int algo)
 {
-  push_compress_filter2(out,zfx,algo,0);
+  return push_compress_filter2(out,zfx,algo,0);
 }
 
-void
+
+/* Push a compress filter and return 0 if that succeeded.  */
+gpg_error_t
 push_compress_filter2(IOBUF out,compress_filter_context_t *zfx,
                      int algo,int rel)
 {
+  gpg_error_t err = gpg_error (GPG_ERR_FALSE);
+
   if(algo>=0)
     zfx->algo=algo;
   else
@@ -350,16 +358,20 @@ push_compress_filter2(IOBUF out,compress_filter_context_t *zfx,
     case COMPRESS_ALGO_ZIP:
     case COMPRESS_ALGO_ZLIB:
       iobuf_push_filter2(out,compress_filter,zfx,rel);
+      err = 0;
       break;
 #endif
 
 #ifdef HAVE_BZIP2
     case COMPRESS_ALGO_BZIP2:
       iobuf_push_filter2(out,compress_filter_bz2,zfx,rel);
+      err = 0;
       break;
 #endif
 
     default:
       BUG();
     }
+
+  return err;
 }
index cd177f4..6daf273 100644 (file)
@@ -177,9 +177,10 @@ void        unarmor_pump_release (UnarmorPump x);
 int         unarmor_pump (UnarmorPump x, int c);
 
 /*-- compress.c --*/
-void push_compress_filter(iobuf_t out,compress_filter_context_t *zfx,int algo);
-void push_compress_filter2(iobuf_t out,compress_filter_context_t *zfx,
-                          int algo,int rel);
+gpg_error_t push_compress_filter (iobuf_t out, compress_filter_context_t *zfx,
+                                  int algo);
+gpg_error_t push_compress_filter2 (iobuf_t out,compress_filter_context_t *zfx,
+                                   int algo, int rel);
 
 /*-- cipher.c --*/
 int cipher_filter_cfb (void *opaque, int control,
index 445e8a6..1120e88 100644 (file)
@@ -4136,15 +4136,20 @@ get_seckey_default_or_card (ctrl_t ctrl, PKT_public_key *pk,
  *********************************************/
 
 /* Return a string with a printable representation of the user_id.
- * this string must be freed by xfree.   */
+ * this string must be freed by xfree.  If R_NOUID is not NULL it is
+ * set to true if a user id was not found; otherwise to false.  */
 static char *
-get_user_id_string (ctrl_t ctrl, u32 * keyid, int mode, size_t *r_len)
+get_user_id_string (ctrl_t ctrl, u32 * keyid, int mode, size_t *r_len,
+                    int *r_nouid)
 {
   user_id_db_t r;
   keyid_list_t a;
   int pass = 0;
   char *p;
 
+  if (r_nouid)
+    *r_nouid = 0;
+
   /* Try it two times; second pass reads from the database.  */
   do
     {
@@ -4191,6 +4196,8 @@ get_user_id_string (ctrl_t ctrl, u32 * keyid, int mode, size_t *r_len)
   else
     p = xasprintf ("%s [?]", keystr (keyid));
 
+  if (r_nouid)
+    *r_nouid = 1;
   if (r_len)
     *r_len = strlen (p);
   return p;
@@ -4200,7 +4207,7 @@ get_user_id_string (ctrl_t ctrl, u32 * keyid, int mode, size_t *r_len)
 char *
 get_user_id_string_native (ctrl_t ctrl, u32 * keyid)
 {
-  char *p = get_user_id_string (ctrl, keyid, 0, NULL);
+  char *p = get_user_id_string (ctrl, keyid, 0, NULL, NULL);
   char *p2 = utf8_to_native (p, strlen (p), 0);
   xfree (p);
   return p2;
@@ -4210,15 +4217,15 @@ get_user_id_string_native (ctrl_t ctrl, u32 * keyid)
 char *
 get_long_user_id_string (ctrl_t ctrl, u32 * keyid)
 {
-  return get_user_id_string (ctrl, keyid, 1, NULL);
+  return get_user_id_string (ctrl, keyid, 1, NULL, NULL);
 }
 
 
 /* Please try to use get_user_byfpr instead of this one.  */
 char *
-get_user_id (ctrl_t ctrl, u32 *keyid, size_t *rn)
+get_user_id (ctrl_t ctrl, u32 *keyid, size_t *rn, int *r_nouid)
 {
-  return get_user_id_string (ctrl, keyid, 2, rn);
+  return get_user_id_string (ctrl, keyid, 2, rn, r_nouid);
 }
 
 
@@ -4227,7 +4234,7 @@ char *
 get_user_id_native (ctrl_t ctrl, u32 *keyid)
 {
   size_t rn;
-  char *p = get_user_id (ctrl, keyid, &rn);
+  char *p = get_user_id (ctrl, keyid, &rn, NULL);
   char *p2 = utf8_to_native (p, rn, 0);
   xfree (p);
   return p2;
index 1f3314e..75eeceb 100644 (file)
--- a/g10/gpg.c
+++ b/g10/gpg.c
@@ -429,6 +429,7 @@ enum cmd_and_opt_values
     oSender,
     oKeyOrigin,
     oRequestOrigin,
+    oNoSymkeyCache,
 
     oNoop
   };
@@ -902,6 +903,7 @@ static ARGPARSE_OPTS opts[] = {
   ARGPARSE_s_s (oAutoKeyLocate, "auto-key-locate", "@"),
   ARGPARSE_s_n (oNoAutoKeyLocate, "no-auto-key-locate", "@"),
   ARGPARSE_s_n (oNoAutostart, "no-autostart", "@"),
+  ARGPARSE_s_n (oNoSymkeyCache, "no-symkey-cache", "@"),
 
   /* Dummy options with warnings.  */
   ARGPARSE_s_n (oUseAgent,      "use-agent", "@"),
@@ -3624,6 +3626,7 @@ main (int argc, char **argv)
             break;
 
           case oNoAutostart: opt.autostart = 0; break;
+          case oNoSymkeyCache: opt.no_symkey_cache = 1; break;
 
          case oDefaultNewKeyAlgo:
             opt.def_new_key_algo = pargs.r.ret_str;
@@ -5214,7 +5217,7 @@ g10_exit( int rc )
   /* If we had an error but not printed an error message, do it now.
    * Note that write_status_failure will never print a second failure
    * status line. */
-  if (log_get_errorcount (0))
+  if (rc)
     write_status_failure ("gpg-exit", gpg_error (GPG_ERR_GENERAL));
 
   gcry_control (GCRYCTL_UPDATE_RANDOM_SEED_FILE);
index ed679d5..9fc769d 100644 (file)
@@ -767,7 +767,7 @@ valid_keyblock_packet (int pkttype)
  * Meta data (ring trust packets) are only considered of WITH_META is set.
  * PENDING_PKT should be initialized to NULL and not changed by the caller.
  * Return: 0 = okay, -1 no more blocks or another errorcode.
- *         The int at at R_V3KEY counts the number of unsupported v3
+ *         The int at R_V3KEY counts the number of unsupported v3
  *         keyblocks.
  */
 static int
@@ -856,7 +856,9 @@ read_block( IOBUF a, int with_meta,
              {
                compress_filter_context_t *cfx = xmalloc_clear( sizeof *cfx );
                pkt->pkt.compressed->buf = NULL;
-               push_compress_filter2(a,cfx,pkt->pkt.compressed->algorithm,1);
+               if (push_compress_filter2 (a, cfx,
+                                           pkt->pkt.compressed->algorithm, 1))
+                  xfree (cfx); /* e.g. in case of compression_algo NONE.  */
              }
            free_packet (pkt, &parsectx);
            init_packet(pkt);
index 6936579..c65af02 100644 (file)
@@ -405,10 +405,10 @@ void setup_main_keyids (kbnode_t keyblock);
    data structures.  */
 void merge_keys_and_selfsig (ctrl_t ctrl, kbnode_t keyblock);
 
-char*get_user_id_string_native (ctrl_t ctrl, u32 *keyid);
-char*get_long_user_id_string (ctrl_t ctrl, u32 *keyid);
-char*get_user_id (ctrl_t ctrl, u32 *keyid, size_t *rn);
-char*get_user_id_native (ctrl_t ctrl, u32 *keyid);
+char *get_user_id_string_native (ctrl_t ctrl, u32 *keyid);
+char *get_long_user_id_string (ctrl_t ctrl, u32 *keyid);
+char *get_user_id (ctrl_t ctrl, u32 *keyid, size_t *rn, int *r_nouid);
+char *get_user_id_native (ctrl_t ctrl, u32 *keyid);
 char *get_user_id_byfpr (ctrl_t ctrl, const byte *fpr, size_t *rn);
 char *get_user_id_byfpr_native (ctrl_t ctrl, const byte *fpr);
 
index 3d4418e..00b4e72 100644 (file)
@@ -264,7 +264,7 @@ keyedit_print_one_sig (ctrl_t ctrl, estream_t fp,
       else
        {
          size_t n;
-         char *p = get_user_id (ctrl, sig->keyid, &n);
+         char *p = get_user_id (ctrl, sig->keyid, &n, NULL);
          tty_print_utf8_string2 (fp, p, n,
                                  opt.screen_columns - keystrlen () - 26 -
                                  ((opt.
index bcbad45..1f501fc 100644 (file)
@@ -1182,7 +1182,7 @@ list_keyblock_print (ctrl_t ctrl, kbnode_t keyblock, int secret, int fpr,
          else if (!opt.fast_list_mode)
            {
              size_t n;
-             char *p = get_user_id (ctrl, sig->keyid, &n);
+             char *p = get_user_id (ctrl, sig->keyid, &n, NULL);
              print_utf8_buffer (es_stdout, p, n);
              xfree (p);
            }
@@ -1553,6 +1553,7 @@ list_keyblock_colon (ctrl_t ctrl, kbnode_t keyblock,
          byte fparray[MAX_FINGERPRINT_LEN];
           char *siguid;
           size_t siguidlen;
+          char *issuer_fpr = NULL;
 
          if (sig->sig_class == 0x20 || sig->sig_class == 0x28
              || sig->sig_class == 0x30)
@@ -1610,11 +1611,16 @@ list_keyblock_colon (ctrl_t ctrl, kbnode_t keyblock,
          else
            {
              rc = 0;
-             sigrc = ' ';
+             sigrc = ' '; /* Note the fix-up below in --list-sigs mode.  */
            }
 
          if (sigrc != '%' && sigrc != '?' && !opt.fast_list_mode)
-            siguid = get_user_id (ctrl, sig->keyid, &siguidlen);
+            {
+              int nouid;
+              siguid = get_user_id (ctrl, sig->keyid, &siguidlen, &nouid);
+              if (!opt.check_sigs && nouid)
+                sigrc = '?';  /* No key in local keyring.  */
+            }
           else
             {
               siguid = NULL;
@@ -1653,6 +1659,8 @@ list_keyblock_colon (ctrl_t ctrl, kbnode_t keyblock,
              for (i = 0; i < fplen; i++)
                es_fprintf (es_stdout, "%02X", fparray[i]);
            }
+          else if ((issuer_fpr = issuer_fpr_string (sig)))
+            es_fputs (issuer_fpr, es_stdout);
 
          es_fprintf (es_stdout, ":::%d:\n", sig->digest_algo);
 
@@ -1661,6 +1669,7 @@ list_keyblock_colon (ctrl_t ctrl, kbnode_t keyblock,
 
          /* fixme: check or list other sigs here */
           xfree (siguid);
+          xfree (issuer_fpr);
        }
     }
 
index 1af89c5..69de865 100644 (file)
@@ -1307,7 +1307,7 @@ list_node (CTX c, kbnode_t node)
        }
       else if (!opt.fast_list_mode)
         {
-          p = get_user_id (c->ctrl, sig->keyid, &n);
+          p = get_user_id (c->ctrl, sig->keyid, &n, NULL);
           es_write_sanitized (es_stdout, p, n,
                               opt.with_colons?":":NULL, NULL );
           xfree (p);
@@ -1710,21 +1710,40 @@ akl_has_wkd_method (void)
 }
 
 
-/* Return the ISSUER fingerprint string in human readbale format if
- * available.  Caller must release the string.  */
-static char *
-issuer_fpr_string (PKT_signature *sig)
+/* Return the ISSUER fingerprint buffer and its lenbgth at R_LEN.
+ * Returns NULL if not available.  The returned buffer is valid as
+ * long as SIG is not modified.  */
+static const byte *
+issuer_fpr_raw (PKT_signature *sig, size_t *r_len)
 {
   const byte *p;
   size_t n;
 
   p = parse_sig_subpkt (sig->hashed, SIGSUBPKT_ISSUER_FPR, &n);
   if (p && n == 21 && p[0] == 4)
-    return bin2hex (p+1, n-1, NULL);
+    {
+      *r_len = n - 1;
+      return p+1;
+    }
+  *r_len = 0;
   return NULL;
 }
 
 
+/* Return the ISSUER fingerprint string in human readbale format if
+ * available.  Caller must release the string.  */
+/* FIXME: Move to another file.  */
+char *
+issuer_fpr_string (PKT_signature *sig)
+{
+  const byte *p;
+  size_t n;
+
+  p = issuer_fpr_raw (sig, &n);
+  return p? bin2hex (p, n, NULL) : NULL;
+}
+
+
 static void
 print_good_bad_signature (int statno, const char *keyid_str, kbnode_t un,
                           PKT_signature *sig, int rc)
@@ -1761,7 +1780,7 @@ check_sig_and_print (CTX c, kbnode_t node)
   int rc;
   int is_expkey = 0;
   int is_revkey = 0;
-  char *issuer_fpr;
+  char *issuer_fpr = NULL;
   PKT_public_key *pk = NULL;  /* The public key for the signature or NULL. */
   int tried_ks_by_fpr;
 
@@ -1888,13 +1907,14 @@ check_sig_and_print (CTX c, kbnode_t node)
     write_status_text (STATUS_NEWSIG, NULL);
 
   astr = openpgp_pk_algo_name ( sig->pubkey_algo );
-  if ((issuer_fpr = issuer_fpr_string (sig)))
+  issuer_fpr = issuer_fpr_string (sig);
+
+  if (issuer_fpr)
     {
       log_info (_("Signature made %s\n"), asctimestamp(sig->timestamp));
       log_info (_("               using %s key %s\n"),
                 astr? astr: "?", issuer_fpr);
 
-      xfree (issuer_fpr);
     }
   else if (!keystrlen () || keystrlen () > 8)
     {
@@ -2001,14 +2021,14 @@ check_sig_and_print (CTX c, kbnode_t node)
       const byte *p;
       size_t n;
 
-      p = parse_sig_subpkt (sig->hashed, SIGSUBPKT_ISSUER_FPR, &n);
-      if (p && n == 21 && p[0] == 4)
+      p = issuer_fpr_raw (sig, &n);
+      if (p)
         {
           /* v4 packet with a SHA-1 fingerprint.  */
           free_public_key (pk);
           pk = NULL;
           glo_ctrl.in_auto_key_retrieve++;
-          res = keyserver_import_fprint (c->ctrl, p+1, n-1, opt.keyserver, 1);
+          res = keyserver_import_fprint (c->ctrl, p, n, opt.keyserver, 1);
           tried_ks_by_fpr = 1;
           glo_ctrl.in_auto_key_retrieve--;
           if (!res)
@@ -2375,22 +2395,23 @@ check_sig_and_print (CTX c, kbnode_t node)
     }
   else
     {
-      char buf[50];
-
-      snprintf (buf, sizeof buf, "%08lX%08lX %d %d %02x %lu %d",
-                (ulong)sig->keyid[0], (ulong)sig->keyid[1],
-                sig->pubkey_algo, sig->digest_algo,
-                sig->sig_class, (ulong)sig->timestamp, gpg_err_code (rc));
-      write_status_text (STATUS_ERRSIG, buf);
+      write_status_printf (STATUS_ERRSIG, "%08lX%08lX %d %d %02x %lu %d %s",
+                           (ulong)sig->keyid[0], (ulong)sig->keyid[1],
+                           sig->pubkey_algo, sig->digest_algo,
+                           sig->sig_class, (ulong)sig->timestamp,
+                           gpg_err_code (rc),
+                           issuer_fpr? issuer_fpr:"-");
       if (gpg_err_code (rc) == GPG_ERR_NO_PUBKEY)
         {
-          buf[16] = 0;
-          write_status_text (STATUS_NO_PUBKEY, buf);
+          write_status_printf (STATUS_NO_PUBKEY, "%08lX%08lX",
+                               (ulong)sig->keyid[0], (ulong)sig->keyid[1]);
        }
       if (gpg_err_code (rc) != GPG_ERR_NOT_PROCESSED)
         log_error (_("Can't check signature: %s\n"), gpg_strerror (rc));
     }
 
+  free_public_key (pk);
+  xfree (issuer_fpr);
   return rc;
 }
 
index f186225..dab6e9f 100644 (file)
@@ -249,7 +249,7 @@ struct
     unsigned int allow_weak_digest_algos:1;
     unsigned int large_rsa:1;
     unsigned int disable_signer_uid:1;
-    /* Flag to enbale experimental features from RFC4880bis.  */
+    /* Flag to enable experimental features from RFC4880bis.  */
     unsigned int rfc4880bis:1;
   } flags;
 
@@ -282,6 +282,8 @@ struct
 
   int unwrap_encryption;
   int only_sign_text_ids;
+
+  int no_symkey_cache;   /* Disable the cache used for --symmetric.  */
 } opt;
 
 /* CTRL is used to keep some global variables we currently can't
index 4f4569f..e8397ea 100644 (file)
@@ -620,6 +620,8 @@ int proc_signature_packets_by_fd (ctrl_t ctrl,
 int proc_encryption_packets (ctrl_t ctrl, void *ctx, iobuf_t a);
 int list_packets( iobuf_t a );
 
+char *issuer_fpr_string (PKT_signature *sig);
+
 /*-- parse-packet.c --*/
 
 /* Sets the packet list mode to MODE (i.e., whether we are dumping a
index a498f62..10574ec 100644 (file)
@@ -317,6 +317,9 @@ passphrase_to_dek (int cipher_algo, STRING2KEY *s2k,
     canceled = &dummy_canceled;
   *canceled = 0;
 
+  if (opt.no_symkey_cache)
+    nocache = 1;  /* Force no symmtric key caching.  */
+
   if ( !s2k )
     {
       log_assert (create && !nocache);
@@ -485,7 +488,7 @@ gpg_format_keydesc (ctrl_t ctrl, PKT_public_key *pk, int mode, int escaped)
                && pk->keyid[1] != pk->main_keyid[1]);
   algo_name = openpgp_pk_algo_name (pk->pubkey_algo);
   timestr = strtimestamp (pk->timestamp);
-  uid = get_user_id (ctrl, is_subkey? pk->main_keyid:pk->keyid, &uidlen);
+  uid = get_user_id (ctrl, is_subkey? pk->main_keyid:pk->keyid, &uidlen, NULL);
 
   orig_codeset = i18n_switchto_utf8 ();
 
index 6ec5537..8b5d042 100644 (file)
@@ -1149,7 +1149,7 @@ build_pk_list (ctrl_t ctrl, strlist_t rcpts, PK_LIST *ret_pk_list)
                   else
                     {
                       size_t n;
-                      char *p = get_user_id (ctrl, keyid, &n );
+                      char *p = get_user_id (ctrl, keyid, &n, NULL);
                       tty_print_utf8_string ( p, n );
                       xfree(p);
                     }
index 8465232..3a08972 100644 (file)
@@ -571,7 +571,7 @@ gen_standard_revoke (ctrl_t ctrl, PKT_public_key *psk, const char *cache_nonce)
 
   kl = opt.keyid_format == KF_NONE? 0 : keystrlen ();
 
-  tmpstr = get_user_id (ctrl, keyid, &len);
+  tmpstr = get_user_id (ctrl, keyid, &len, NULL);
   es_fprintf (memfp, "uid%*s%.*s\n\n",
               kl + 10, "",
               (int)len, tmpstr);
index dd2407e..31c20ad 100644 (file)
--- a/po/ca.po
+++ b/po/ca.po
@@ -7988,33 +7988,18 @@ msgstr "no s'ha pogut eliminar el bloc de claus: %s\n"
 msgid "reader to file mapping table full - waiting\n"
 msgstr ""
 
-msgid "using \"http\" instead of \"https\"\n"
-msgstr ""
-
 #, c-format
 msgid "CRL access not possible due to disabled %s\n"
 msgstr ""
 
 #, fuzzy, c-format
-#| msgid "%s: error writing dir record: %s\n"
-msgid "error initializing reader object: %s\n"
-msgstr "%s: error en escriure el registre de directoris: %s\n"
-
-#, c-format
-msgid "URL '%s' redirected to '%s' (%u)\n"
-msgstr ""
-
-#, fuzzy
-msgid "too many redirections\n"
-msgstr "hi ha massa preferències «%c»\n"
-
-#, fuzzy, c-format
 msgid "error retrieving '%s': %s\n"
 msgstr "error en crear «%s»: %s\n"
 
 #, fuzzy, c-format
-msgid "error retrieving '%s': http status %u\n"
-msgstr "error en la lectura de «%s»: %s\n"
+#| msgid "%s: error writing dir record: %s\n"
+msgid "error initializing reader object: %s\n"
+msgstr "%s: error en escriure el registre de directoris: %s\n"
 
 #, fuzzy
 msgid "CRL access not possible due to Tor mode\n"
@@ -8475,10 +8460,6 @@ msgstr "error mentre s'escrivia l'anell «%s»: %s\n"
 msgid "error reading log from ldap wrapper %d: %s\n"
 msgstr "error en la lectura de «%s»: %s\n"
 
-#, fuzzy, c-format
-msgid "npth_select failed: %s - waiting 1s\n"
-msgstr "ha fallat l'actualització de la clau secreta: %s\n"
-
 #, c-format
 msgid "ldap wrapper %d ready"
 msgstr ""
@@ -8500,14 +8481,6 @@ msgid "ldap wrapper %d stalled - killing\n"
 msgstr ""
 
 #, c-format
-msgid "error spawning ldap wrapper reaper thread: %s\n"
-msgstr ""
-
-#, fuzzy, c-format
-msgid "reading from ldap wrapper %d failed: %s\n"
-msgstr "no s'ha pogut eliminar el bloc de claus: %s\n"
-
-#, c-format
 msgid "invalid char 0x%02x in host name - not added\n"
 msgstr ""
 
@@ -8574,6 +8547,14 @@ msgstr "error mentre s'escrivia l'anell «%s»: %s\n"
 msgid "error reading HTTP response for '%s': %s\n"
 msgstr "error en la lectura de «%s»: %s\n"
 
+#, c-format
+msgid "URL '%s' redirected to '%s' (%u)\n"
+msgstr ""
+
+#, fuzzy
+msgid "too many redirections\n"
+msgstr "hi ha massa preferències «%c»\n"
+
 #, fuzzy, c-format
 msgid "error parsing OCSP response for '%s': %s\n"
 msgstr "error mentre s'enviava a «%s»: %s\n"
@@ -9192,6 +9173,18 @@ msgid ""
 msgstr ""
 
 #, fuzzy
+#~ msgid "error retrieving '%s': http status %u\n"
+#~ msgstr "error en la lectura de «%s»: %s\n"
+
+#, fuzzy
+#~ msgid "npth_select failed: %s - waiting 1s\n"
+#~ msgstr "ha fallat l'actualització de la clau secreta: %s\n"
+
+#, fuzzy
+#~ msgid "reading from ldap wrapper %d failed: %s\n"
+#~ msgstr "no s'ha pogut eliminar el bloc de claus: %s\n"
+
+#, fuzzy
 #~ msgid "What keysize do you want for the Signature key? (%u) "
 #~ msgstr "Quina grandària voleu? (1024) "
 
index 79b4bc2..06f91b1 100644 (file)
--- a/po/cs.po
+++ b/po/cs.po
@@ -7487,32 +7487,18 @@ msgstr "volání crl_cache_insert přes vydavatele selhalo: %s\n"
 msgid "reader to file mapping table full - waiting\n"
 msgstr "tabulka mapování čtenáře na soubor je plná – čeká se\n"
 
-msgid "using \"http\" instead of \"https\"\n"
-msgstr "namísto „https“ se použije „http“\n"
-
 # Poslední argument je název protokolu
 #, c-format
 msgid "CRL access not possible due to disabled %s\n"
 msgstr "Přístup k CRL není možný kvůli vypnutému %s\n"
 
 #, c-format
-msgid "error initializing reader object: %s\n"
-msgstr "chyba při inicializaci čtecího objektu: %s\n"
-
-#, c-format
-msgid "URL '%s' redirected to '%s' (%u)\n"
-msgstr "URL „%s“ přesměrováno na „%s“ (%u)\n"
-
-msgid "too many redirections\n"
-msgstr "příliš mnoho přesměrování\n"
-
-#, c-format
 msgid "error retrieving '%s': %s\n"
 msgstr "chyba při získávání „%s“: %s\n"
 
 #, c-format
-msgid "error retrieving '%s': http status %u\n"
-msgstr "chyba při získávání „%s“: status HTTP je %u\n"
+msgid "error initializing reader object: %s\n"
+msgstr "chyba při inicializaci čtecího objektu: %s\n"
 
 # Poslední argument je název protokolu
 msgid "CRL access not possible due to Tor mode\n"
@@ -7929,10 +7915,6 @@ msgid "error reading log from ldap wrapper %d: %s\n"
 msgstr "chyba při čtení protokolu z ldapové obálky č. %d: %s\n"
 
 #, c-format
-msgid "npth_select failed: %s - waiting 1s\n"
-msgstr "npth_select selhala: %s – čeká se 1 s\n"
-
-#, c-format
 msgid "ldap wrapper %d ready"
 msgstr "ldapová obálka %d připravena"
 
@@ -7953,14 +7935,6 @@ msgid "ldap wrapper %d stalled - killing\n"
 msgstr "ldapová obálka %d se zasekla – bude zabita\n"
 
 #, c-format
-msgid "error spawning ldap wrapper reaper thread: %s\n"
-msgstr "chyba při zakládání vlákna ovládajícího obálku LDAPu: %s\n"
-
-#, c-format
-msgid "reading from ldap wrapper %d failed: %s\n"
-msgstr "čtení z ldapové obálky %d selhalo: %s\n"
-
-#, c-format
 msgid "invalid char 0x%02x in host name - not added\n"
 msgstr "v názvu stroje je neplatný znak 0x%02x – nepřidáno\n"
 
@@ -8024,6 +7998,13 @@ msgid "error reading HTTP response for '%s': %s\n"
 msgstr "chyba při čtení HTTP odpovědi od „%s“: %s\n"
 
 #, c-format
+msgid "URL '%s' redirected to '%s' (%u)\n"
+msgstr "URL „%s“ přesměrováno na „%s“ (%u)\n"
+
+msgid "too many redirections\n"
+msgstr "příliš mnoho přesměrování\n"
+
+#, c-format
 msgid "error parsing OCSP response for '%s': %s\n"
 msgstr "chyba při rozebírání OCSP odpovědi od „%s“: %s\n"
 
@@ -8612,6 +8593,21 @@ msgstr ""
 "Syntaxe: gpg-check-pattern [volby] soubor_se_vzorem\n"
 "Prověří heslo zadané na vstupu proti souboru se vzory\n"
 
+#~ msgid "using \"http\" instead of \"https\"\n"
+#~ msgstr "namísto „https“ se použije „http“\n"
+
+#~ msgid "error retrieving '%s': http status %u\n"
+#~ msgstr "chyba při získávání „%s“: status HTTP je %u\n"
+
+#~ msgid "npth_select failed: %s - waiting 1s\n"
+#~ msgstr "npth_select selhala: %s – čeká se 1 s\n"
+
+#~ msgid "error spawning ldap wrapper reaper thread: %s\n"
+#~ msgstr "chyba při zakládání vlákna ovládajícího obálku LDAPu: %s\n"
+
+#~ msgid "reading from ldap wrapper %d failed: %s\n"
+#~ msgstr "čtení z ldapové obálky %d selhalo: %s\n"
+
 #~ msgid "What keysize do you want for the Signature key? (%u) "
 #~ msgstr "Jakou délku klíče pro podepisování si přejete? (%u) "
 
index 156dabc..c8cd33c 100644 (file)
--- a/po/da.po
+++ b/po/da.po
@@ -7946,36 +7946,19 @@ msgstr "modtagelse af linje mislykkedes: %s\n"
 msgid "reader to file mapping table full - waiting\n"
 msgstr ""
 
-msgid "using \"http\" instead of \"https\"\n"
-msgstr ""
-
 #, c-format
 msgid "CRL access not possible due to disabled %s\n"
 msgstr ""
 
 #, fuzzy, c-format
-#| msgid "%s: error writing dir record: %s\n"
-msgid "error initializing reader object: %s\n"
-msgstr "%s: fejl ved skrivning af mappepost: %s\n"
-
-#, c-format
-msgid "URL '%s' redirected to '%s' (%u)\n"
-msgstr ""
-
-#, fuzzy
-#| msgid "too many cipher preferences\n"
-msgid "too many redirections\n"
-msgstr "for mange chifferpræferencer\n"
-
-#, fuzzy, c-format
 #| msgid "error retrieving `%s' via %s: %s\n"
 msgid "error retrieving '%s': %s\n"
 msgstr "fejl ved indhentelse af »%s« via %s: %s\n"
 
 #, fuzzy, c-format
-#| msgid "error running `%s': exit status %d\n"
-msgid "error retrieving '%s': http status %u\n"
-msgstr "fejl ved kørsel af »%s«: afslutningsstatus %d\n"
+#| msgid "%s: error writing dir record: %s\n"
+msgid "error initializing reader object: %s\n"
+msgstr "%s: fejl ved skrivning af mappepost: %s\n"
 
 #, fuzzy
 #| msgid "certificate `%s' not found: %s\n"
@@ -8476,11 +8459,6 @@ msgstr "fejl ved skrivning til »%s«: %s\n"
 msgid "error reading log from ldap wrapper %d: %s\n"
 msgstr "fejl ved læsning fra %s: %s\n"
 
-#, fuzzy, c-format
-#| msgid "pth_select failed: %s - waiting 1s\n"
-msgid "npth_select failed: %s - waiting 1s\n"
-msgstr "pth_select mislykkeds: %s - venter 1s\n"
-
 #, c-format
 msgid "ldap wrapper %d ready"
 msgstr ""
@@ -8503,15 +8481,6 @@ msgid "ldap wrapper %d stalled - killing\n"
 msgstr ""
 
 #, c-format
-msgid "error spawning ldap wrapper reaper thread: %s\n"
-msgstr ""
-
-#, fuzzy, c-format
-#| msgid "reading public key failed: %s\n"
-msgid "reading from ldap wrapper %d failed: %s\n"
-msgstr "læsning af offentlig nøgle mislykkedes: %s\n"
-
-#, c-format
 msgid "invalid char 0x%02x in host name - not added\n"
 msgstr ""
 
@@ -8588,6 +8557,15 @@ msgstr "fejl ved skrivning til »%s«: %s\n"
 msgid "error reading HTTP response for '%s': %s\n"
 msgstr "fejl ved læsning fra %s: %s\n"
 
+#, c-format
+msgid "URL '%s' redirected to '%s' (%u)\n"
+msgstr ""
+
+#, fuzzy
+#| msgid "too many cipher preferences\n"
+msgid "too many redirections\n"
+msgstr "for mange chifferpræferencer\n"
+
 #, fuzzy, c-format
 #| msgid "error binding socket to `%s': %s\n"
 msgid "error parsing OCSP response for '%s': %s\n"
@@ -9259,6 +9237,21 @@ msgstr ""
 "Syntaks: gpg-check-pattern [tilvalg] mønsterfil\n"
 "Kontroller en adgangsfrase angivet på stdin mod mønsterfilen\n"
 
+#, fuzzy
+#~| msgid "error running `%s': exit status %d\n"
+#~ msgid "error retrieving '%s': http status %u\n"
+#~ msgstr "fejl ved kørsel af »%s«: afslutningsstatus %d\n"
+
+#, fuzzy
+#~| msgid "pth_select failed: %s - waiting 1s\n"
+#~ msgid "npth_select failed: %s - waiting 1s\n"
+#~ msgstr "pth_select mislykkeds: %s - venter 1s\n"
+
+#, fuzzy
+#~| msgid "reading public key failed: %s\n"
+#~ msgid "reading from ldap wrapper %d failed: %s\n"
+#~ msgstr "læsning af offentlig nøgle mislykkedes: %s\n"
+
 #~ msgid "What keysize do you want for the Signature key? (%u) "
 #~ msgstr "Hvilken nøglestørrelse ønsker du for underskriftsnøglen (%u) "
 
index ae5fef2..87c3c15 100644 (file)
--- a/po/de.po
+++ b/po/de.po
@@ -7653,31 +7653,17 @@ msgstr "crl_cache_insert über den Issuer fehlgeschlagen: %s\n"
 msgid "reader to file mapping table full - waiting\n"
 msgstr "\"reader to file\" Zuordnungstabelle ist voll - warte\n"
 
-msgid "using \"http\" instead of \"https\"\n"
-msgstr "Es wird \"HTTP\" anstatt \"HTTPS\" verwendet\n"
-
 #, c-format
 msgid "CRL access not possible due to disabled %s\n"
 msgstr "CRL Zugriff nicht möglich da %s abgeschaltet ist\n"
 
 #, c-format
-msgid "error initializing reader object: %s\n"
-msgstr "Fehler beim Initialisieren des \"reader\" Objekts: %s\n"
-
-#, c-format
-msgid "URL '%s' redirected to '%s' (%u)\n"
-msgstr "URL `%s' nach `%s' umgeleitet (%u)\n"
-
-msgid "too many redirections\n"
-msgstr "zu viele verschachtelte Umleitungen\n"
-
-#, c-format
 msgid "error retrieving '%s': %s\n"
 msgstr "Fehler beim Holen von `%s': %s\n"
 
 #, c-format
-msgid "error retrieving '%s': http status %u\n"
-msgstr "Fehler beim Holen von `%s': HTTP Status %u\n"
+msgid "error initializing reader object: %s\n"
+msgstr "Fehler beim Initialisieren des \"reader\" Objekts: %s\n"
 
 msgid "CRL access not possible due to Tor mode\n"
 msgstr "CRL Zugriff ist im Tor Modus nicht möglich\n"
@@ -8097,10 +8083,6 @@ msgid "error reading log from ldap wrapper %d: %s\n"
 msgstr "Fehler beim Lesen des Logs vom LDAP Wrapper %d: %s\n"
 
 #, c-format
-msgid "npth_select failed: %s - waiting 1s\n"
-msgstr "npth_select()-Aufruf fehlgeschlagen: %s - warte 1s\n"
-
-#, c-format
 msgid "ldap wrapper %d ready"
 msgstr "LDAP Wrapper %d fertig"
 
@@ -8121,14 +8103,6 @@ msgid "ldap wrapper %d stalled - killing\n"
 msgstr "LDAP Wrapper %d versackt - abgeschossen\n"
 
 #, c-format
-msgid "error spawning ldap wrapper reaper thread: %s\n"
-msgstr "Fehler beim Starten des LDAP Wrapper Kontrollthreads: %s\n"
-
-#, c-format
-msgid "reading from ldap wrapper %d failed: %s\n"
-msgstr "Lesen vom LDAP Wrapper %d fehlgeschlagen: %s\n"
-
-#, c-format
 msgid "invalid char 0x%02x in host name - not added\n"
 msgstr "Ungültiges Zeichen 0x%02X im Hostnamen - nicht hinzugefügt\n"
 
@@ -8192,6 +8166,13 @@ msgid "error reading HTTP response for '%s': %s\n"
 msgstr "Fehler beim Lesen der HTTP Antwort von `%s': %s\n"
 
 #, c-format
+msgid "URL '%s' redirected to '%s' (%u)\n"
+msgstr "URL `%s' nach `%s' umgeleitet (%u)\n"
+
+msgid "too many redirections\n"
+msgstr "zu viele verschachtelte Umleitungen\n"
+
+#, c-format
 msgid "error parsing OCSP response for '%s': %s\n"
 msgstr "Fehler beim Zerlegen der OCSP Antwort für `%s': %s\n"
 
@@ -8785,6 +8766,21 @@ msgstr ""
 "Syntax: gpg-check-pattern [optionen] Musterdatei\n"
 "Die von stdin gelesene Passphrase gegen die Musterdatei prüfen\n"
 
+#~ msgid "using \"http\" instead of \"https\"\n"
+#~ msgstr "Es wird \"HTTP\" anstatt \"HTTPS\" verwendet\n"
+
+#~ msgid "error retrieving '%s': http status %u\n"
+#~ msgstr "Fehler beim Holen von `%s': HTTP Status %u\n"
+
+#~ msgid "npth_select failed: %s - waiting 1s\n"
+#~ msgstr "npth_select()-Aufruf fehlgeschlagen: %s - warte 1s\n"
+
+#~ msgid "error spawning ldap wrapper reaper thread: %s\n"
+#~ msgstr "Fehler beim Starten des LDAP Wrapper Kontrollthreads: %s\n"
+
+#~ msgid "reading from ldap wrapper %d failed: %s\n"
+#~ msgstr "Lesen vom LDAP Wrapper %d fehlgeschlagen: %s\n"
+
 #~ msgid "What keysize do you want for the Signature key? (%u) "
 #~ msgstr ""
 #~ "Welche Schlüssellänge wünschen Sie für den Signatur-Schlüssel? (%u) "
index def69a4..3300d5c 100644 (file)
--- a/po/el.po
+++ b/po/el.po
@@ -7827,33 +7827,18 @@ msgstr "διαγραφή block κλειδιών απέτυχε: %s\n"
 msgid "reader to file mapping table full - waiting\n"
 msgstr ""
 
-msgid "using \"http\" instead of \"https\"\n"
-msgstr ""
-
 #, c-format
 msgid "CRL access not possible due to disabled %s\n"
 msgstr ""
 
 #, fuzzy, c-format
-#| msgid "%s: error writing dir record: %s\n"
-msgid "error initializing reader object: %s\n"
-msgstr "%s: σφάλμα στην εγγραφή της εγγραφής dir : %s\n"
-
-#, c-format
-msgid "URL '%s' redirected to '%s' (%u)\n"
-msgstr ""
-
-#, fuzzy
-msgid "too many redirections\n"
-msgstr "πάρα πολλές `%c' προεπιλογές\n"
-
-#, fuzzy, c-format
 msgid "error retrieving '%s': %s\n"
 msgstr "σφάλμα κατά τη δημιουργία του `%s': %s\n"
 
 #, fuzzy, c-format
-msgid "error retrieving '%s': http status %u\n"
-msgstr "σφάλμα κατά την ανάγνωση του `%s': %s\n"
+#| msgid "%s: error writing dir record: %s\n"
+msgid "error initializing reader object: %s\n"
+msgstr "%s: σφάλμα στην εγγραφή της εγγραφής dir : %s\n"
 
 #, fuzzy
 msgid "CRL access not possible due to Tor mode\n"
@@ -8301,10 +8286,6 @@ msgstr "αδυναμία εγγραφής της κλειδοθήκης `%s': %s
 msgid "error reading log from ldap wrapper %d: %s\n"
 msgstr "σφάλμα κατά την ανάγνωση του `%s': %s\n"
 
-#, fuzzy, c-format
-msgid "npth_select failed: %s - waiting 1s\n"
-msgstr "η ενημέρωση μυστικού απέτυχε: %s\n"
-
 #, c-format
 msgid "ldap wrapper %d ready"
 msgstr ""
@@ -8326,14 +8307,6 @@ msgid "ldap wrapper %d stalled - killing\n"
 msgstr ""
 
 #, c-format
-msgid "error spawning ldap wrapper reaper thread: %s\n"
-msgstr ""
-
-#, fuzzy, c-format
-msgid "reading from ldap wrapper %d failed: %s\n"
-msgstr "διαγραφή block κλειδιών απέτυχε: %s\n"
-
-#, c-format
 msgid "invalid char 0x%02x in host name - not added\n"
 msgstr ""
 
@@ -8400,6 +8373,14 @@ msgstr "αδυναμία εγγραφής της κλειδοθήκης `%s': %s
 msgid "error reading HTTP response for '%s': %s\n"
 msgstr "σφάλμα κατά την ανάγνωση του `%s': %s\n"
 
+#, c-format
+msgid "URL '%s' redirected to '%s' (%u)\n"
+msgstr ""
+
+#, fuzzy
+msgid "too many redirections\n"
+msgstr "πάρα πολλές `%c' προεπιλογές\n"
+
 #, fuzzy, c-format
 msgid "error parsing OCSP response for '%s': %s\n"
 msgstr "σφάλμα στη αποστολή προς το `%s': %s\n"
@@ -9018,6 +8999,18 @@ msgid ""
 msgstr ""
 
 #, fuzzy
+#~ msgid "error retrieving '%s': http status %u\n"
+#~ msgstr "σφάλμα κατά την ανάγνωση του `%s': %s\n"
+
+#, fuzzy
+#~ msgid "npth_select failed: %s - waiting 1s\n"
+#~ msgstr "η ενημέρωση μυστικού απέτυχε: %s\n"
+
+#, fuzzy
+#~ msgid "reading from ldap wrapper %d failed: %s\n"
+#~ msgstr "διαγραφή block κλειδιών απέτυχε: %s\n"
+
+#, fuzzy
 #~ msgid "What keysize do you want for the Signature key? (%u) "
 #~ msgstr "Τι μέγεθος κλειδιού θα θέλατε; (1024) "
 
index 0e3f40c..fb797f0 100644 (file)
--- a/po/eo.po
+++ b/po/eo.po
@@ -7770,33 +7770,18 @@ msgstr "forviŝo de ŝlosilbloko malsukcesis: %s\n"
 msgid "reader to file mapping table full - waiting\n"
 msgstr ""
 
-msgid "using \"http\" instead of \"https\"\n"
-msgstr ""
-
 #, c-format
 msgid "CRL access not possible due to disabled %s\n"
 msgstr ""
 
 #, fuzzy, c-format
-#| msgid "%s: error writing dir record: %s\n"
-msgid "error initializing reader object: %s\n"
-msgstr "%s: eraro dum skribo de dosieruja registro: %s\n"
-
-#, c-format
-msgid "URL '%s' redirected to '%s' (%u)\n"
-msgstr ""
-
-#, fuzzy
-msgid "too many redirections\n"
-msgstr "tro da '%c'-preferoj\n"
-
-#, fuzzy, c-format
 msgid "error retrieving '%s': %s\n"
 msgstr "eraro dum kreado de '%s': %s\n"
 
 #, fuzzy, c-format
-msgid "error retrieving '%s': http status %u\n"
-msgstr "eraro dum legado de '%s': %s\n"
+#| msgid "%s: error writing dir record: %s\n"
+msgid "error initializing reader object: %s\n"
+msgstr "%s: eraro dum skribo de dosieruja registro: %s\n"
 
 #, fuzzy
 msgid "CRL access not possible due to Tor mode\n"
@@ -8243,10 +8228,6 @@ msgstr "eraro dum skribado de ŝlosilaro '%s': %s\n"
 msgid "error reading log from ldap wrapper %d: %s\n"
 msgstr "eraro dum legado de '%s': %s\n"
 
-#, fuzzy, c-format
-msgid "npth_select failed: %s - waiting 1s\n"
-msgstr "aktualigo de sekreto malsukcesis: %s\n"
-
 #, c-format
 msgid "ldap wrapper %d ready"
 msgstr ""
@@ -8268,14 +8249,6 @@ msgid "ldap wrapper %d stalled - killing\n"
 msgstr ""
 
 #, c-format
-msgid "error spawning ldap wrapper reaper thread: %s\n"
-msgstr ""
-
-#, fuzzy, c-format
-msgid "reading from ldap wrapper %d failed: %s\n"
-msgstr "forviŝo de ŝlosilbloko malsukcesis: %s\n"
-
-#, c-format
 msgid "invalid char 0x%02x in host name - not added\n"
 msgstr ""
 
@@ -8342,6 +8315,14 @@ msgstr "eraro dum skribado de ŝlosilaro '%s': %s\n"
 msgid "error reading HTTP response for '%s': %s\n"
 msgstr "eraro dum legado de '%s': %s\n"
 
+#, c-format
+msgid "URL '%s' redirected to '%s' (%u)\n"
+msgstr ""
+
+#, fuzzy
+msgid "too many redirections\n"
+msgstr "tro da '%c'-preferoj\n"
+
 #, fuzzy, c-format
 msgid "error parsing OCSP response for '%s': %s\n"
 msgstr "eraro dum sendo al '%s': %s\n"
@@ -8959,6 +8940,18 @@ msgid ""
 msgstr ""
 
 #, fuzzy
+#~ msgid "error retrieving '%s': http status %u\n"
+#~ msgstr "eraro dum legado de '%s': %s\n"
+
+#, fuzzy
+#~ msgid "npth_select failed: %s - waiting 1s\n"
+#~ msgstr "aktualigo de sekreto malsukcesis: %s\n"
+
+#, fuzzy
+#~ msgid "reading from ldap wrapper %d failed: %s\n"
+#~ msgstr "forviŝo de ŝlosilbloko malsukcesis: %s\n"
+
+#, fuzzy
 #~ msgid "What keysize do you want for the Signature key? (%u) "
 #~ msgstr "Kiun ŝlosilgrandon vi deziras? (1024) "
 
index 1ab8e88..c0f69ef 100644 (file)
--- a/po/es.po
+++ b/po/es.po
@@ -4,19 +4,21 @@
 #  I've tried to mantain the terminology used by Armando Ramos
 #  <armando@clerval.org> in his PGP 2.3.6i translation.
 #  I also got inspiration from it.po by Marco d'Itri <md@linux.it>
-#
+# Jaime Suárez <jaime.suma@gmail.com> 2017
 msgid ""
 msgstr ""
 "Project-Id-Version: gnupg 2.0.9\n"
 "Report-Msgid-Bugs-To: translations@gnupg.org\n"
-"PO-Revision-Date: 2017-11-02 17:39+0100\n"
-"Last-Translator: Jaime Suárez <jaime.suma@gmail.com>\n"
+"PO-Revision-Date: 2018-04-16 14:06+0000\n"
+"Last-Translator: emma peel <emma.peel@riseup.net>\n"
 "Language-Team: Spanish <es@li.org>\n"
 "Language: es\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "plural: Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 1.8.11\n"
 
 #, c-format
 msgid "failed to acquire the pinentry lock: %s\n"
@@ -29,41 +31,31 @@ msgstr "no pude conseguir el bloqueo de entrada de pin: %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 "|entrada de pin-etiqueta|_OK"
+msgstr "|pinentry-label|_OK"
 
 msgid "|pinentry-label|_Cancel"
-msgstr "|entrada de pin-etiqueta|_Cancelar"
+msgstr "|pinentry-label|_Cancelar"
 
-#, fuzzy
-#| msgid "|pinentry-label|_OK"
 msgid "|pinentry-label|_Yes"
-msgstr "|entrada de pin-etiqueta|_OK"
+msgstr "|pinentry-label|_Sí"
 
-#, fuzzy
-#| msgid "|pinentry-label|_OK"
 msgid "|pinentry-label|_No"
-msgstr "|entrada de pin-etiqueta|_OK"
+msgstr "|pinentry-label|_No"
 
 msgid "|pinentry-label|PIN:"
-msgstr "|entrada de pin-etiqueta|PIN:"
+msgstr "|pinentry-label|PIN:"
 
-#, fuzzy
-#| msgid "|pinentry-label|_Cancel"
 msgid "|pinentry-label|_Save in password manager"
-msgstr "|entrada de pin-etiqueta|_Cancelar"
+msgstr "|pinentry-label|_Guardar en gestor de contraseñas"
 
-#, fuzzy
-#| msgid "Do you really want to create a sign and encrypt key? "
 msgid "Do you really want to make your passphrase visible on the screen?"
-msgstr "¿De verdad quiere crear una clave de firma y cifrado? "
+msgstr "¿De verdad quiere hacer que su frase contraseña se vea en la pantalla?"
 
 msgid "|pinentry-tt|Make passphrase visible"
-msgstr ""
+msgstr "|pinentry-tt|Mostrar frase contraseña"
 
-#, fuzzy
-#| msgid "invalid passphrase"
 msgid "|pinentry-tt|Hide passphrase"
-msgstr "frase contraseña incorrecta"
+msgstr "|pinentry-tt|Esconder frase contraseña"
 
 #. TRANSLATORS: This string is displayed by Pinentry as the label
 #. for the quality bar.
@@ -93,7 +85,7 @@ msgstr ""
 "de esta sesión"
 
 msgid "PIN:"
-msgstr ""
+msgstr "PIN:"
 
 # ¿Por qué no frase de paso?
 # Porque todo el mundo sabe lo que es una contraseña
@@ -118,7 +110,7 @@ msgid "SETERROR %s (try %d of %d)"
 msgstr "SETERROR %s (intento %d de %d)"
 
 msgid "Repeat:"
-msgstr ""
+msgstr "Repetir:"
 
 msgid "PIN too long"
 msgstr "PIN demasiado largo"
@@ -151,15 +143,13 @@ msgstr "Frase contraseña errónea"
 msgid "ssh keys greater than %d bits are not supported\n"
 msgstr "no pueden usarse claves ssh de más de %d bits\n"
 
-#, fuzzy, c-format
-#| msgid "can't create `%s': %s\n"
+#, c-format
 msgid "can't create '%s': %s\n"
-msgstr "no se puede crear %s: %s\n"
+msgstr "no se puede crear '%s': %s\n"
 
-#, fuzzy, c-format
-#| msgid "can't open `%s': %s\n"
+#, c-format
 msgid "can't open '%s': %s\n"
-msgstr "no se puede abrir `%s': %s\n"
+msgstr "no se puede abrir '%s': %s\n"
 
 #, c-format
 msgid "error getting serial number of card: %s\n"
@@ -169,52 +159,47 @@ msgstr "error obteniendo el número de serie de la tarjeta: %s\n"
 msgid "detected card with S/N: %s\n"
 msgstr "detectada tarjeta con S/N: %s\n"
 
-#, fuzzy, c-format
-#| msgid "error getting default authentication keyID of card: %s\n"
+#, c-format
 msgid "no authentication key for ssh on card: %s\n"
-msgstr ""
-"error obteniendo ID de la clave por defecto para autenticaren la tarjeta: "
-"%s\n"
+msgstr "no tenemos clave de certificación para ssh en la tarjeta: %s\n"
 
 #, c-format
 msgid "no suitable card key found: %s\n"
 msgstr "no se encuentra una clave de tarjeta adecuada: %s\n"
 
-#, fuzzy, c-format
-#| msgid "error getting stored flags: %s\n"
+#, c-format
 msgid "error getting list of cards: %s\n"
-msgstr "error obteniendo parámetros almacenados: %s\n"
+msgstr "error intentando obtener lista de tarjetas: %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 proceso ssh requirió el uso de la clave%%0A  %s%%0A  (%s)%%0A¿Quiere "
+"permitirlo?"
 
 msgid "Allow"
-msgstr ""
+msgstr "Permitir"
 
 msgid "Deny"
-msgstr ""
+msgstr "Denegar"
 
-#, fuzzy, c-format
-#| msgid "Please enter the passphrase for the ssh key%0A  %c"
+#, c-format
 msgid "Please enter the passphrase for the ssh key%%0A  %F%%0A  (%c)"
-msgstr "Por favor introduzca la frase contraseña para la clave ssh%0A %c"
+msgstr ""
+"Por favor introduzca la frase contraseña para la clave ssh %%0A %F%%0A  (%c)"
 
 msgid "Please re-enter this passphrase"
 msgstr "Por favor vuelva a introducir frase contraseña"
 
-#, fuzzy, c-format
-#| msgid ""
-#| "Please enter a passphrase to protect the received secret key%%0A   %s"
-#| "%%0Awithin gpg-agent's key storage"
+#, c-format
 msgid ""
 "Please enter a passphrase to protect the received secret key%%0A   %s%%0A   "
 "%s%%0Awithin gpg-agent's key storage"
 msgstr ""
-"Por favor introduzca una frase contraseña para proteger la clave "
-"secretarecibida%%0A  %s%%0Aen el almacen de claves del agente gpg"
+"Por favor introduzca una frase contraseña para proteger la clave secreta "
+"recibida %%0A  %s%%0A  %s%%0A  en el almacén de claves del agente gpg"
 
 #, c-format
 msgid "failed to create stream from socket: %s\n"
@@ -237,10 +222,9 @@ msgstr "PUK"
 msgid "Reset Code"
 msgstr "Código de Reinicio"
 
-#, fuzzy, c-format
-#| msgid "%s%%0A%%0AUse the reader's keypad for input."
+#, c-format
 msgid "%s%%0A%%0AUse the reader's pinpad for input."
-msgstr "%s%%0A%%0AUse el teclado del lector como entrada."
+msgstr "%s%%0A%%0A Use el teclado del lector como entrada."
 
 msgid "Repeat this Reset Code"
 msgstr "Repita este Código de Reinicio"
@@ -266,7 +250,7 @@ msgstr "Por favor introduzca el PIN%s%s%s para desbloquear la tarjeta"
 
 #, c-format
 msgid "error creating temporary file: %s\n"
-msgstr "error creando fichero temporal: %s\n"
+msgstr "error al crear fichero temporal: %s\n"
 
 #, c-format
 msgid "error writing to temporary file: %s\n"
@@ -296,53 +280,33 @@ msgstr ""
 msgid "Yes, protection is not needed"
 msgstr "Sí, no se necesita protección"
 
-#, 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] "El nombre debe tener al menos 5 caracteres\n"
-msgstr[1] "El nombre debe tener al menos 5 caracteres\n"
+msgstr[0] "Una frase contraseña debe tener al menos %u caracter."
+msgstr[1] "Una frase contraseña debe tener al menos %u caracteres."
 
-#, fuzzy, c-format
-#| msgid ""
-#| "Warning: You have entered an insecure passphrase.%%0AA passphrase should "
-#| "contain at least %u digit or%%0Aspecial character."
-#| msgid_plural ""
-#| "Warning: You have entered an insecure passphrase.%%0AA passphrase should "
-#| "contain at least %u digits or%%0Aspecial characters."
+#, 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] ""
-"Aviso: Ha introducido una frase contraseña insegura.%%0AUna frasecontraseña "
-"debe tener al menos %u digito o%%0Acarácter especial."
+"Una frase contraseña debería tener al menos %u dígito o%%0A carácter "
+"especial."
 msgstr[1] ""
-"Aviso: Ha introducido una frase contraseña insegura.%%0AUna frasecontraseña "
-"debe tener al menos %u digitos o%%0Acaracteres especiales."
+"Una frase contraseña debe tener al menos %u dígitos o %%0A caracteres "
+"especiales."
 
-#, fuzzy, c-format
-#| msgid ""
-#| "Warning: You have entered an insecure passphrase.%%0AA passphrase may not "
-#| "be a known term or match%%0Acertain pattern."
+#, c-format
 msgid "A passphrase may not be a known term or match%%0Acertain pattern."
 msgstr ""
-"Aviso: ha introducido una frase contraseña insegura.%%0AUna frase contraseña "
-"no puede ser un término conocido%%0Ao ajustarse a cierto patrón."
+"Una frase contraseña no puede ser un término conocido%%0A o ajustarse a "
+"cierto patrón."
 
-#, fuzzy
-#| msgid ""
-#| "Warning: You have entered an insecure passphrase.%%0AA passphrase should "
-#| "be at least %u character long."
-#| msgid_plural ""
-#| "Warning: You have entered an insecure passphrase.%%0AA passphrase should "
-#| "be at least %u characters long."
 msgid "Warning: You have entered an insecure passphrase."
-msgstr ""
-"Aviso: ha introducido una frase contraseña insegura.%%0AUna frase contraseña "
-"debe tener al menos %u carácter."
+msgstr "Aviso: ha introducido una frase contraseña insegura."
 
-#, fuzzy, c-format
-#| msgid "Please enter the passphrase to%0Ato protect your new key"
+#, c-format
 msgid "Please enter the passphrase to%0Aprotect your new key"
 msgstr "Por favor introduzca frase contraseña para%0Aproteger su nueva clave"
 
@@ -362,10 +326,8 @@ msgstr "ejecutar en modo demonio (segundo plano)"
 msgid "run in server mode (foreground)"
 msgstr "ejecutar en modo servidor (primer plano)"
 
-#, fuzzy
-#| msgid "run in server mode"
 msgid "run in supervised mode"
-msgstr "ejecutar en modo servidor"
+msgstr "ejecutar en modo supervisado"
 
 msgid "verbose"
 msgstr "prolijo"
@@ -380,7 +342,7 @@ msgid "csh-style command output"
 msgstr "salida de datos estilo csh"
 
 msgid "|FILE|read options from FILE"
-msgstr "|FICHERO|lee opciones desde FICHERO"
+msgstr "|FILE|lee opciones desde FICHERO"
 
 msgid "do not detach from the console"
 msgstr "no independizarse de la consola"
@@ -397,10 +359,8 @@ msgstr "|PGM|usar PCM como programa SCdaemon"
 msgid "do not use the SCdaemon"
 msgstr "no usar SCdaemon"
 
-#, fuzzy
-#| msgid "|NAME|connect to Assuan socket NAME"
 msgid "|NAME|accept some commands via NAME"
-msgstr "|NOMBRE|conectar al socket Assuan NOMBRE"
+msgstr "|NAME|aceptar algunos comandos via NAME"
 
 msgid "ignore requests to change the TTY"
 msgstr "ignorar peticiones de cambiar el TTY"
@@ -414,37 +374,29 @@ msgstr "|N|los PINs en la caché expiran en N segundos"
 msgid "do not use the PIN cache when signing"
 msgstr "no usar el caché de PINs al firmar"
 
-#, fuzzy
-#| msgid "do not allow the reuse of old passphrases"
 msgid "disallow the use of an external password cache"
-msgstr "no permite reusar antiguas frases contraseña"
+msgstr "no permitir el uso de un cache externo de contraseñas"
 
-#, fuzzy
-#| msgid "allow clients to mark keys as \"trusted\""
 msgid "disallow clients to mark keys as \"trusted\""
-msgstr "permitir que los clientes marquen claves como \"fiables\""
+msgstr "no permitir que los clientes marquen claves como \"confiables\""
 
 msgid "allow presetting passphrase"
 msgstr "permitir preestablecer frase contraseña"
 
 msgid "disallow caller to override the pinentry"
-msgstr ""
+msgstr "no permitir que el caller cambie la entrada de pin"
 
 msgid "allow passphrase to be prompted through Emacs"
-msgstr ""
+msgstr "permitir que Emacs pida la clave"
 
-#, fuzzy
-#| msgid "enable ssh-agent emulation"
 msgid "enable ssh support"
-msgstr "permitir emulación de ssh-agent"
+msgstr "permitir soporte de ssh-agent"
 
 msgid "|ALGO|use ALGO to show ssh fingerprints"
-msgstr ""
+msgstr "|ALGO|usar ALGO para mostrar las huellas digitales de ssh"
 
-#, fuzzy
-#| msgid "not supported"
 msgid "enable putty support"
-msgstr "no disponible"
+msgstr "habilitar soporte de putty"
 
 #. TRANSLATORS: @EMAIL@ will get replaced by the actual bug
 #. reporting address.  This is so that we can change the
@@ -452,58 +404,46 @@ msgstr "no disponible"
 msgid "Please report bugs to <@EMAIL@>.\n"
 msgstr "Por favor, informe de posibles \"bugs\" a <@EMAIL@>.\n"
 
-#, fuzzy
-#| msgid "Usage: gpgconf [options] (-h for help)"
 msgid "Usage: @GPG_AGENT@ [options] (-h for help)"
-msgstr "Uso: gpgconf [opciones] (-h para ayuda)"
+msgstr "Uso: @GPG_AGENT@ [opciones] (-h para ayuda)"
 
-#, fuzzy
-#| msgid ""
-#| "Syntax: gpg-agent [options] [command [args]]\n"
-#| "Secret key management for GnuPG\n"
 msgid ""
 "Syntax: @GPG_AGENT@ [options] [command [args]]\n"
 "Secret key management for @GNUPG@\n"
 msgstr ""
-"Sintaxis: gpg-agent [opciones] [orden [argumentos]]\n"
-"Manejo de claves privadas por GnuPG\n"
+"Sintaxis: @GPG_AGENT@ [opciones] [orden [argumentos]]\n"
+"Manejo de claves privadas por @GNUPG@\n"
 
-#, fuzzy, c-format
-#| msgid "invalid debug-level `%s' given\n"
+#, c-format
 msgid "invalid debug-level '%s' given\n"
-msgstr "el nivel de depuración `%s` no es válido\n"
+msgstr "el nivel de depuración '%s' no es válido\n"
 
 msgid "selected digest algorithm is invalid\n"
 msgstr "el algoritmo de resumen seleccionado no inválido\n"
 
-#, fuzzy, c-format
-#| msgid "NOTE: no default option file `%s'\n"
+#, c-format
 msgid "Note: no default option file '%s'\n"
-msgstr "NOTA: no existe el fichero de opciones predefinido `%s'\n"
+msgstr "NOTA: no existe el fichero de opciones predeterminado '%s'\n"
 
-#, fuzzy, c-format
-#| msgid "option file `%s': %s\n"
+#, c-format
 msgid "option file '%s': %s\n"
-msgstr "fichero de opciones `%s': %s\n"
+msgstr "fichero de opciones '%s': %s\n"
 
-#, fuzzy, c-format
-#| msgid "reading options from `%s'\n"
+#, c-format
 msgid "reading options from '%s'\n"
-msgstr "leyendo opciones desde `%s'\n"
+msgstr "leyendo opciones de '%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 "ATENCIÓN: \"%s\" es una opción obsoleta\n"
+msgstr "Atención: \"%s\" no se considera una opción\n"
 
 #, c-format
 msgid "can't create socket: %s\n"
 msgstr "no se puede crear el socket: %s\n"
 
-#, fuzzy, c-format
-#| msgid "socket name `%s' is too long\n"
+#, c-format
 msgid "socket name '%s' is too long\n"
-msgstr "el nombre de socket `%s' es demasiado largo\n"
+msgstr "el nombre de socket '%s' es demasiado largo\n"
 
 msgid "a gpg-agent is already running - not starting a new one\n"
 msgstr "ya hay un agente gpg ejecutándose - no se inicia otro\n"
@@ -511,44 +451,37 @@ msgstr "ya hay un agente gpg ejecutándose - no se inicia otro\n"
 msgid "error getting nonce for the socket\n"
 msgstr "error obteniendo valor único para el socket\n"
 
-#, fuzzy, c-format
-#| msgid "error binding socket to `%s': %s\n"
+#, c-format
 msgid "error binding socket to '%s': %s\n"
-msgstr "error enlazando el socket con `%s': %s\n"
+msgstr "error enlazando el socket con '%s': %s\n"
 
-#, fuzzy, c-format
-#| msgid "Warning: unsafe permissions on %s \"%s\"\n"
+#, c-format
 msgid "can't set permissions of '%s': %s\n"
-msgstr "Aviso: permisos inseguros en %s \"%s\"\n"
+msgstr "no puedo cambiar los permisos de '%s': %s\n"
 
-#, fuzzy, c-format
-#| msgid "listening on socket `%s'\n"
+#, c-format
 msgid "listening on socket '%s'\n"
-msgstr "escuchando el socket `%s'\n"
+msgstr "escuchando en el 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 "no se puede crear el directorio `%s': %s\n"
+msgstr "no se puede crear el directorio '%s': %s\n"
 
-#, fuzzy, c-format
-#| msgid "directory `%s' created\n"
+#, c-format
 msgid "directory '%s' created\n"
-msgstr "directorio `%s' creado\n"
+msgstr "creado el directorio '%s'\n"
 
-#, fuzzy, c-format
-#| msgid "stat() failed for `%s': %s\n"
+#, c-format
 msgid "stat() failed for '%s': %s\n"
-msgstr "stat() falló para `%s': %s\n"
+msgstr "stat() falló para '%s': %s\n"
 
-#, fuzzy, c-format
-#| msgid "can't use `%s' as home directory\n"
+#, c-format
 msgid "can't use '%s' as home directory\n"
-msgstr "no puede usar `%s' como directorio personal\n"
+msgstr "no puede usar '%s' como directorio personal\n"
 
 #, c-format
 msgid "error reading nonce on fd %d: %s\n"
-msgstr "error leyendo valor único en el descriptor %d: %s\n"
+msgstr "error al leer valor único en el descriptor %d: %s\n"
 
 #, c-format
 msgid "handler 0x%lx for fd %d started\n"
@@ -566,10 +499,9 @@ msgstr "manejador ssh 0x%lx para el descriptor %d iniciado\n"
 msgid "ssh handler 0x%lx for fd %d terminated\n"
 msgstr "manejador ssh 0x%lx para el descriptor %d finalizado\n"
 
-#, fuzzy, c-format
-#| msgid "pth_select failed: %s - waiting 1s\n"
+#, c-format
 msgid "npth_pselect failed: %s - waiting 1s\n"
-msgstr "pth_select falló: %s - espero 1s\n"
+msgstr "npth_pselect falló: %s - espero 1s\n"
 
 # msgstr "clave %08lX: %d nuevas subclaves\n"
 #, c-format
@@ -629,7 +561,7 @@ msgid ""
 "Please enter the passphrase to protect the imported object within the GnuPG "
 "system."
 msgstr ""
-"Introduzca la frase contraseña para proteger el objeto importado en GnuPG"
+"Introduzca la frase contraseña para proteger el objeto importado en GnuPG."
 
 msgid ""
 "Please enter the passphrase or the PIN\n"
@@ -645,43 +577,36 @@ msgstr "cancelado\n"
 msgid "error while asking for the passphrase: %s\n"
 msgstr "error pidiendo la frase contraseña: %s\n"
 
-#, fuzzy, c-format
-#| msgid "error opening `%s': %s\n"
+#, c-format
 msgid "error opening '%s': %s\n"
-msgstr "error abriendo `%s': %s\n"
+msgstr "error abriendo '%s': %s\n"
 
-#, fuzzy, c-format
-#| msgid "file `%s', line %d: %s\n"
+#, c-format
 msgid "file '%s', line %d: %s\n"
-msgstr "fichero `%s', línea %d: %s\n"
+msgstr "fichero '%s', línea %d: %s\n"
 
-#, fuzzy, c-format
-#| msgid "statement \"%s\" ignored in `%s', line %d\n"
+#, c-format
 msgid "statement \"%s\" ignored in '%s', line %d\n"
-msgstr "declaración \"%s\" ignorada en `%s', línea %d\n"
+msgstr "declaración \"%s\" ignorada en '%s', línea %d\n"
 
-#, fuzzy, c-format
-#| msgid "system trustlist `%s' not available\n"
+#, c-format
 msgid "system trustlist '%s' not available\n"
-msgstr "la lista de confianza `%s' del sistema no está disponible\n"
+msgstr "la lista de confianza '%s' del sistema no está disponible\n"
 
-#, fuzzy, c-format
-#| msgid "bad fingerprint in `%s', line %d\n"
+#, c-format
 msgid "bad fingerprint in '%s', line %d\n"
-msgstr "huella digital incorrecta en `%s', línea %d\n"
+msgstr "huella digital incorrecta en '%s', línea %d\n"
 
-#, fuzzy, c-format
-#| msgid "invalid keyflag in `%s', line %d\n"
+#, c-format
 msgid "invalid keyflag in '%s', line %d\n"
-msgstr "opción de clave inválida en `%s', línea %d\n"
+msgstr "opción de clave inválida en '%s', línea %d\n"
 
-#, fuzzy, c-format
-#| msgid "error reading `%s', line %d: %s\n"
+#, c-format
 msgid "error reading '%s', line %d: %s\n"
-msgstr "error leyendo `%s', línea %d: %s\n"
+msgstr "error al leer '%s', línea %d: %s\n"
 
 msgid "error reading list of trusted root certificates\n"
-msgstr "error leyendo la lista de certificados raíz fiables\n"
+msgstr "error al leer la lista de certificados raíz fiables\n"
 
 #. TRANSLATORS: This prompt is shown by the Pinentry
 #. and has one special property: A "%%0A" is used by
@@ -749,22 +674,23 @@ msgstr "Cambia la frase contraseña"
 msgid "I'll change it later"
 msgstr "La cambiaré más tarde"
 
-#, fuzzy, c-format
-#| msgid "Do you really want to delete the selected keys? (y/N) "
+#, c-format
 msgid ""
 "Do you really want to delete the key identified by keygrip%%0A  %s%%0A  %%C"
 "%%0A?"
-msgstr "¿De verdad quiere borrar las claves seleccionadas? (s/N) "
+msgstr ""
+"¿De verdad quiere borrar la clave identificada con el keygrip%%0A  %s%%0A  "
+"%%C%%0A?"
 
-#, fuzzy
-#| msgid "enable key"
 msgid "Delete key"
-msgstr "habilita clave"
+msgstr "Borrar clave"
 
 msgid ""
 "Warning: This key is also listed for use with SSH!\n"
 "Deleting the key might remove your ability to access remote machines."
 msgstr ""
+"Cuidado: ¡Esta clave también está listada para usarse con SSH!\n"
+"Borrarla puede remover tu capacidad de acceder a máquinas remotas."
 
 msgid "DSA requires the hash length to be a multiple of 8 bits\n"
 msgstr "DSA necesita un resumen cuya longitud sea múltiplo de 8 bits\n"
@@ -773,10 +699,9 @@ msgstr "DSA necesita un resumen cuya longitud sea múltiplo de 8 bits\n"
 msgid "%s key uses an unsafe (%u bit) hash\n"
 msgstr "la clave %s usa un hash inseguro (de %u bits)\n"
 
-#, fuzzy, c-format
-#| msgid "a %u bit hash is not valid for a %u bit %s key\n"
+#, c-format
 msgid "a %zu bit hash is not valid for a %u bit %s key\n"
-msgstr "un hash de %u bits no vale para %u bits de la clave %s\n"
+msgstr "un hash de %zu bits no vale para %u bits de la clave %s\n"
 
 #, c-format
 msgid "checking created signature failed: %s\n"
@@ -785,29 +710,25 @@ msgstr "la comprobación de la firma creada falló: %s\n"
 msgid "secret key parts are not available\n"
 msgstr "las partes de la clave privada no están disponibles\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 "el algoritmo de protección %d%s no puede ser utilizado\n"
+msgstr "el algoritmo de llave pública %d (%s) no se puede usar\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 "el algoritmo de protección %d%s no puede ser utilizado\n"
+msgstr "el algoritmo de protección %d (%s) no se puede usar\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 "el algoritmo de protección %d%s no puede ser utilizado\n"
+msgstr "el algoritmo de protección de hash %d (%s) no se puede usar\n"
 
 #, c-format
 msgid "error creating a pipe: %s\n"
-msgstr "error creando tubería: %s\n"
+msgstr "error al crear tubería: %s\n"
 
-#, fuzzy, c-format
-#| msgid "error creating a pipe: %s\n"
+#, c-format
 msgid "error creating a stream for a pipe: %s\n"
-msgstr "error creando tubería: %s\n"
+msgstr "error al crear stream para una tubería: %s\n"
 
 #, c-format
 msgid "error forking process: %s\n"
@@ -817,34 +738,29 @@ msgstr "error bifurcando procesos: %s\n"
 msgid "waiting for process %d to terminate failed: %s\n"
 msgstr "fallo esperando que el proceso %d terminara: %s\n"
 
-#, fuzzy, c-format
-#| msgid "error running `%s': probably not installed\n"
+#, c-format
 msgid "error running '%s': probably not installed\n"
-msgstr "error ejecutando `%s': probablemente no está instalado\n"
+msgstr "error al ejecutar '%s': probablemente no está instalado\n"
 
-#, fuzzy, c-format
-#| msgid "error running `%s': exit status %d\n"
+#, c-format
 msgid "error running '%s': exit status %d\n"
-msgstr "error ejecutando `%s': código de finalización %d\n"
+msgstr "error ejecutando '%s': código de salida %d\n"
 
-#, fuzzy, c-format
-#| msgid "error running `%s': terminated\n"
+#, c-format
 msgid "error running '%s': terminated\n"
-msgstr "error ejecutando `%s': terminado\n"
+msgstr "error al ejecutar '%s': terminado\n"
 
-#, fuzzy, c-format
-#| msgid "waiting for process %d to terminate failed: %s\n"
+#, c-format
 msgid "waiting for processes to terminate failed: %s\n"
-msgstr "fallo esperando que el proceso %d terminara: %s\n"
+msgstr "fallo esperando que el proceso termine: %s\n"
 
 #, c-format
 msgid "error getting exit code of process %d: %s\n"
 msgstr "error obteniendo código de finalización del proceso: %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 "no se puede conectar con `%s': %s\n"
+msgstr "no se puede conectar con '%s': %s\n"
 
 msgid "problem setting the gpg-agent options\n"
 msgstr "problema estableciendo opciones de gpg-agent\n"
@@ -861,15 +777,13 @@ msgstr "Aviso: propiedad insegura de %s \"%s\"\n"
 msgid "Warning: unsafe permissions on %s \"%s\"\n"
 msgstr "Aviso: permisos inseguros en %s \"%s\"\n"
 
-#, fuzzy, c-format
-#| msgid "waiting %d seconds for the agent to come up\n"
+#, c-format
 msgid "waiting for file '%s' to become accessible ...\n"
-msgstr "esperando %d segundos para que el agente arranque\n"
+msgstr "esperando que el archivo '%s' esté disponible ...\n"
 
-#, fuzzy, c-format
-#| msgid "renaming `%s' to `%s' failed: %s\n"
+#, c-format
 msgid "renaming '%s' to '%s' failed: %s\n"
-msgstr "renombrando `%s' en `%s' fallo: %s\n"
+msgstr "renombrar '%s' a '%s' falló: %s\n"
 
 #. TRANSLATORS: See doc/TRANSLATE about this string.
 msgid "yes"
@@ -908,11 +822,11 @@ msgstr "cC"
 
 #, c-format
 msgid "out of core in secure memory while allocating %lu bytes"
-msgstr "agotado nucleo de memoria segura reservando %lu bytes"
+msgstr "agotado núcleo de memoria segura reservando %lu bytes"
 
 #, c-format
 msgid "out of core while allocating %lu bytes"
-msgstr "error de memoria reservando %lu bytes"
+msgstr "error de memoria al reservar %lu bytes"
 
 #, c-format
 msgid "error allocating enough memory: %s\n"
@@ -922,47 +836,38 @@ msgstr "error reservando memoria: %s\n"
 msgid "%s:%u: obsolete option \"%s\" - it has no effect\n"
 msgstr "%s:%u: opción obsoleta \"%s\" - no tiene efecto\n"
 
-#, fuzzy, c-format
-#| msgid "WARNING: \"%s\" is an obsolete option - it has no effect\n"
+#, c-format
 msgid "WARNING: \"%s%s\" is an obsolete option - it has no effect\n"
-msgstr "ATENCIÓN: \"%s\" es una opción obsoleta - no tiene efecto\n"
+msgstr "ATENCIÓN: \"%s%s\" es una opción obsoleta - no tiene efecto\n"
 
 #, c-format
 msgid "unknown debug flag '%s' ignored\n"
-msgstr ""
+msgstr "etiqueta de debug '%s' ignorada\n"
 
-#, fuzzy, c-format
-#| msgid "no running gpg-agent - starting one\n"
+#, c-format
 msgid "no running gpg-agent - starting '%s'\n"
-msgstr "no hay gpg-agent en ejecución - inicando uno\n"
+msgstr "no hay gpg-agent en ejecución - iniciando '%s'\n"
 
-#, fuzzy, c-format
-#| msgid "waiting %d seconds for the agent to come up\n"
+#, c-format
 msgid "waiting for the agent to come up ... (%ds)\n"
-msgstr "esperando %d segundos para que el agente arranque\n"
+msgstr "esperando que el agente arranque... ( %ds)\n"
 
 msgid "connection to agent established\n"
-msgstr ""
+msgstr "conexión establecida al agente\n"
 
-#, fuzzy
-#| msgid "can't connect to the dirmngr - trying fall back\n"
 msgid "connection to agent is in restricted mode\n"
-msgstr "no puedo conectar con el dirmngr - intentando retirada\n"
+msgstr "la conexión al agente está en modo restringido\n"
 
-#, fuzzy, c-format
-#| msgid "no running dirmngr - starting `%s'\n"
+#, c-format
 msgid "no running Dirmngr - starting '%s'\n"
-msgstr "no hay dirmngr en ejecución - iniciando `%s'\n"
+msgstr "no hay dirmngr en ejecución - iniciando '%s'\n"
 
-#, fuzzy, c-format
-#| msgid "waiting %d seconds for the agent to come up\n"
+#, c-format
 msgid "waiting for the dirmngr to come up ... (%ds)\n"
-msgstr "esperando %d segundos para que el agente arranque\n"
+msgstr "esperando que el dirmngr arranque... ( %ds)\n"
 
-#, fuzzy
-#| msgid "can't connect to the dirmngr - trying fall back\n"
 msgid "connection to the dirmngr established\n"
-msgstr "no puedo conectar con el dirmngr - intentando retirada\n"
+msgstr "conexión establecida al dirmngr\n"
 
 #. TRANSLATORS: Copy the prefix between the vertical bars
 #. verbatim.  It will not be printed.
@@ -1086,7 +991,7 @@ msgid "Included certificates"
 msgstr "Certificados incluidos"
 
 msgid "No audit log entries."
-msgstr "No auditar entradas de los logs"
+msgstr "No auditar entradas de los logs."
 
 msgid "Unknown operation"
 msgstr "Operación desconocida"
@@ -1097,10 +1002,9 @@ msgstr "Gpg-Agent utilizable"
 msgid "Dirmngr usable"
 msgstr "Dirmngr utilizable"
 
-#, fuzzy, c-format
-#| msgid "No help available for `%s'."
+#, c-format
 msgid "No help available for '%s'."
-msgstr "No hay ayuda disponible para `%s'."
+msgstr "No hay ayuda disponible para '%s'."
 
 msgid "ignoring garbage line"
 msgstr "ignorando línea con basura"
@@ -1124,10 +1028,8 @@ msgstr "palabra clave demasiado larga"
 msgid "missing argument"
 msgstr "falta el parámetro"
 
-#, fuzzy
-#| msgid "invalid armor"
 msgid "invalid argument"
-msgstr "armadura inválida"
+msgstr "parámetro incorrecto"
 
 msgid "invalid command"
 msgstr "orden inválida"
@@ -1145,10 +1047,9 @@ msgstr "opción inválida"
 msgid "missing argument for option \"%.50s\"\n"
 msgstr "falta parámetro para la opción \"%.50s\"\n"
 
-#, fuzzy, c-format
-#| msgid "missing argument for option \"%.50s\"\n"
+#, c-format
 msgid "invalid argument for option \"%.50s\"\n"
-msgstr "falta parámetro para la opción \"%.50s\"\n"
+msgstr "parámetro incorrecto para la opción \"%.50s\"\n"
 
 #, c-format
 msgid "option \"%.50s\" does not expect an argument\n"
@@ -1173,29 +1074,25 @@ msgstr "memoria desbordada\n"
 msgid "invalid option \"%.50s\"\n"
 msgstr "opción inválida \"%.50s\"\n"
 
-#, fuzzy, c-format
-#| msgid "conversion from `%s' to `%s' not available\n"
+#, c-format
 msgid "conversion from '%s' to '%s' not available\n"
-msgstr "la conversión de `%s' en `%s' no está disponible\n"
+msgstr "la conversión de '%s' a '%s' no está disponible\n"
 
 #, c-format
 msgid "iconv_open failed: %s\n"
 msgstr "iconv_open falló: %s\n"
 
-#, fuzzy, c-format
-#| msgid "conversion from `%s' to `%s' failed: %s\n"
+#, c-format
 msgid "conversion from '%s' to '%s' failed: %s\n"
-msgstr "la conversión de `%s' en `%s' falló: %s\n"
+msgstr "la conversión de '%s' a '%s' falló: %s\n"
 
-#, fuzzy, c-format
-#| msgid "failed to create temporary file `%s': %s\n"
+#, c-format
 msgid "failed to create temporary file '%s': %s\n"
-msgstr "no se puede crear el fichero temporal `%s': %s\n"
+msgstr "no se pudo crear el fichero temporal '%s': %s\n"
 
-#, fuzzy, c-format
-#| msgid "error writing to `%s': %s\n"
+#, c-format
 msgid "error writing to '%s': %s\n"
-msgstr "error escribiendo en `%s': %s\n"
+msgstr "error escribiendo a '%s': %s\n"
 
 #, c-format
 msgid "removing stale lockfile (created by %d)\n"
@@ -1206,12 +1103,11 @@ msgid "waiting for lock (held by %d%s) %s...\n"
 msgstr "esperando al bloqueo (que mantiene %d%s) %s...\n"
 
 msgid "(deadlock?) "
-msgstr "(¿bloqueo mutuo?)"
+msgstr "(¿bloqueo mutuo?) "
 
-#, fuzzy, c-format
-#| msgid "lock `%s' not made: %s\n"
+#, c-format
 msgid "lock '%s' not made: %s\n"
-msgstr "bloqueo `%s' no hecho: %s\n"
+msgstr "bloqueo '%s' no hecho: %s\n"
 
 #, c-format
 msgid "waiting for lock %s...\n"
@@ -1282,10 +1178,9 @@ msgstr ""
 "caracter \"quoted printable\" en la armadura - probablemente se usó\n"
 "un MTA defectuoso\n"
 
-#, fuzzy, c-format
-#| msgid "not human readable"
+#, c-format
 msgid "[ not human readable (%zu bytes: %s%s) ]"
-msgstr "ilegible"
+msgstr "[ ilegible (%zu bytes: %s%s) ]"
 
 msgid ""
 "a notation name must have only printable characters or spaces, and end with "
@@ -1303,19 +1198,12 @@ msgstr "un nombre de notación no debe contener más de un caracter '@'\n"
 msgid "a notation value must not use any control characters\n"
 msgstr "un valor de notación no debe usar ningún caracter de control\n"
 
-#, fuzzy
-#| msgid "a notation name must not contain more than one '@' character\n"
 msgid "a notation name may not contain an '=' character\n"
-msgstr "un nombre de notación no debe contener más de un caracter '@'\n"
+msgstr "un nombre de notación no debe contener ningún caracter '='\n"
 
-#, fuzzy
-#| msgid ""
-#| "a notation name must have only printable characters or spaces, and end "
-#| "with an '='\n"
 msgid "a notation name must have only printable characters or spaces\n"
 msgstr ""
-"un nombre de notación debe tener sólo caracteres imprimibles o espacios, y "
-"acabar con un '='\n"
+"un nombre de notación debe tener sólo caracteres imprimibles o espacios\n"
 
 msgid "WARNING: invalid notation data found\n"
 msgstr "ATENCIÓN: encontrados datos de notación inválidos\n"
@@ -1325,34 +1213,32 @@ msgid "failed to proxy %s inquiry to client\n"
 msgstr "fallo al hacer la petición proxy %s al cliente\n"
 
 msgid "Enter passphrase: "
-msgstr "Introduzca frase contraseña: "
+msgstr "Introduzca la frase contraseña: "
 
-#, fuzzy, c-format
-#| msgid "error creating keyring `%s': %s\n"
+#, c-format
 msgid "error getting version from '%s': %s\n"
-msgstr "error escribiendo anillo `%s': %s\n"
+msgstr "error intentando averiguar la versión de '%s': %s\n"
 
 #, c-format
 msgid "server '%s' is older than us (%s < %s)"
-msgstr ""
+msgstr "el servidor '%s' es más viejo que nosotros (%s < %s)"
 
-#, fuzzy, c-format
-#| msgid "WARNING: "
+#, c-format
 msgid "WARNING: %s\n"
-msgstr "ATENCION: "
+msgstr "ATENCIÓN: %s\n"
 
 msgid "Note: Outdated servers may lack important security fixes.\n"
 msgstr ""
+"Advertencia: Los servidores no mantenidos pueden carecer de importantes "
+"actualizaciones de seguridad.\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 "Por favor use la orden \"cambia\" primero.\n"
+msgstr "Atención: Usa el comando \"%s\" para reiniciarlos.\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 aún no funciona con %s\n"
+msgstr "%s no funciona con el modo %s\n"
 
 #, c-format
 msgid "OpenPGP card not available: %s\n"
@@ -1414,15 +1300,13 @@ msgstr "Error: nombre combinado demasiado largo (máximo %d caracteres).\n"
 msgid "URL to retrieve public key: "
 msgstr "URL de donde recuperar la clave pública: "
 
-#, fuzzy, c-format
-#| msgid "error reading `%s': %s\n"
+#, c-format
 msgid "error reading '%s': %s\n"
-msgstr "error leyendo `%s': %s\n"
+msgstr "error al leer '%s': %s\n"
 
-#, fuzzy, c-format
-#| msgid "error writing `%s': %s\n"
+#, c-format
 msgid "error writing '%s': %s\n"
-msgstr "error escribiendo `%s': %s\n"
+msgstr "error al escribir '%s': %s\n"
 
 msgid "Login data (account name): "
 msgstr "Datos de login (nombre de la cuenta): "
@@ -1446,10 +1330,10 @@ msgid "Error: invalid response.\n"
 msgstr "Error: respuesta no válida.\n"
 
 msgid "CA fingerprint: "
-msgstr "Huella dactilar CA:"
+msgstr "Huella digital CA: "
 
 msgid "Error: invalid formatted fingerprint.\n"
-msgstr "Error: formato inválido de huella dactilar.\n"
+msgstr "Error: formato inválido de huella digital.\n"
 
 #, c-format
 msgid "key operation not possible: %s\n"
@@ -1492,7 +1376,7 @@ msgstr ""
 #, fuzzy
 #| msgid "   (1) Signature key\n"
 msgid "Signature key\n"
-msgstr "    (1) Clave de firmado\n"
+msgstr "   (1) Clave de firmado\n"
 
 #, fuzzy
 #| msgid "   (2) Encryption key\n"
@@ -1512,9 +1396,9 @@ msgid "   (%d) RSA\n"
 msgstr "   (%d) RSA\n"
 
 #, fuzzy, c-format
-#| msgid "   (%d) DSA and Elgamal\n"
+#| msgid "   (%d) ECC and ECC\n"
 msgid "   (%d) ECC\n"
-msgstr "   (%d) DSA y ElGamal\n"
+msgstr "   (%d) ECC y ECC\n"
 
 msgid "Invalid selection.\n"
 msgstr "Elección inválida.\n"
@@ -1523,10 +1407,9 @@ msgstr "Elección inválida.\n"
 msgid "The card will now be re-configured to generate a key of %u bits\n"
 msgstr "Ahora la tarjeta se reconfigurará para generar una clave de %u bits\n"
 
-#, fuzzy, c-format
-#| msgid "The card will now be re-configured to generate a key of %u bits\n"
+#, c-format
 msgid "The card will now be re-configured to generate a key of type: %s\n"
-msgstr "Ahora la tarjeta se reconfigurará para generar una clave de %u bits\n"
+msgstr "Ahora la tarjeta se reconfigurará para generar una clave de tipo: %s\n"
 
 #, fuzzy, c-format
 #| msgid "error changing size of key %d to %u bits: %s\n"
@@ -1538,42 +1421,34 @@ msgstr "error cambiando el tamaño de la clave %d a %u bits: %s\n"
 msgid "error getting card info: %s\n"
 msgstr "error obteniendo la información actual de la clave: %s\n"
 
-#, fuzzy
-#| msgid "This command is not allowed while in %s mode.\n"
 msgid "This command is not supported by this card\n"
-msgstr "Esta orden no se permite en modo %s.\n"
+msgstr "Esta orden no se puede usar con esta tarjeta\n"
 
 msgid "Make off-card backup of encryption key? (Y/n) "
 msgstr ""
-"¿Hacer copia de seguridad externa a la tarjeta de clave de cifrado? (S/n)"
+"¿Hacer copia de seguridad externa a la tarjeta de clave de cifrado? (S/n) "
 
-#, fuzzy
-#| msgid "NOTE: keys are already stored on the card!\n"
 msgid "Note: keys are already stored on the card!\n"
-msgstr "NOTA: ¡claves ya almacenadas en la tarjeta!\n"
+msgstr "NOTA: ¡ya hay claves almacenadas en la tarjeta!\n"
 
 msgid "Replace existing keys? (y/N) "
 msgstr "¿Reemplazar las claves existentes? (s/N) "
 
-#, fuzzy, c-format
-#| msgid ""
-#| "Please note that the factory settings of the PINs are\n"
-#| "   PIN = `%s'     Admin PIN = `%s'\n"
-#| "You should change them using the command --change-pin\n"
+#, c-format
 msgid ""
 "Please note that the factory settings of the PINs are\n"
 "   PIN = '%s'     Admin PIN = '%s'\n"
 "You should change them using the command --change-pin\n"
 msgstr ""
-"Por favor observe que los valores de fábrica del PIN son\n"
-"   PIN = `%s'     PIN Administrador = `%s'\n"
+"Ten en cuenta que los valores de fábrica del PIN son\n"
+"   PIN = '%s'     PIN Administrador = '%s'\n"
 "Debería cambiarlos usando la orden --change-pin\n"
 
 msgid "Please select the type of key to generate:\n"
 msgstr "Por favor seleccione tipo de clave que generar:\n"
 
 msgid "   (1) Signature key\n"
-msgstr "    (1) Clave de firmado\n"
+msgstr "   (1) Clave de firmado\n"
 
 msgid "   (2) Encryption key\n"
 msgstr "   (2) Clave de cifrado\n"
@@ -1584,31 +1459,27 @@ msgstr "   (3) Clave de autentificación\n"
 msgid "Please select where to store the key:\n"
 msgstr "Por favor elija donde guardar la clave:\n"
 
-#, fuzzy, c-format
-#| msgid "read failed: %s\n"
+#, c-format
 msgid "KEYTOCARD failed: %s\n"
-msgstr "lectura fallida: %s\n"
+msgstr "KEYTOCARD fallido: %s\n"
 
-#, fuzzy
-#| msgid "NOTE: keys are already stored on the card!\n"
 msgid "Note: This command destroys all keys stored on the card!\n"
-msgstr "NOTA: ¡claves ya almacenadas en la tarjeta!\n"
+msgstr ""
+"NOTA: ¡Esta orden destruye todas las claves almacenadas en la tarjeta!\n"
 
-#, fuzzy
-#| msgid "Sign it? (y/N) "
 msgid "Continue? (y/N) "
-msgstr "¿Firmarlo? (s/N) "
+msgstr "¿Continuar? (s/N) "
 
 msgid "Really do a factory reset? (enter \"yes\") "
-msgstr ""
+msgstr "¿Realmente quiere volver a los valores de fábrica? (escriba \"sí\") "
 
 #, fuzzy, c-format
-#| msgid "error closing %s: %s\n"
+#| msgid "error looking up: %s\n"
 msgid "error for setup KDF: %s\n"
-msgstr "error cerrando %s: %s\n"
+msgstr "error al buscar: %s\n"
 
 msgid "quit this menu"
-msgstr "sale de este menú"
+msgstr "salir de este menú"
 
 msgid "show admin commands"
 msgstr "ver órdenes de administrador"
@@ -1638,7 +1509,7 @@ msgid "change card holder's sex"
 msgstr "cambiar sexo del titular de la tarjeta"
 
 msgid "change a CA fingerprint"
-msgstr "cambiar huella dactilar de una CA"
+msgstr "cambiar huella digital de una CA"
 
 msgid "toggle the signature force PIN flag"
 msgstr "cambiar estado de la opción forzar firma del PIN"
@@ -1656,12 +1527,12 @@ msgid "unblock the PIN using a Reset Code"
 msgstr "desbloquear PIN usando Código de Reinicio"
 
 msgid "destroy all keys and data"
-msgstr ""
+msgstr "destruir todas las claves y datos"
 
 #, fuzzy
-#| msgid "|NAME|use NAME as default recipient"
+#| msgid "|NAME|use user NAME for authentication"
 msgid "setup KDF for PIN authentication"
-msgstr "|NOMBRE|usa NOMBRE como destinatario por defecto"
+msgstr "|NAME|usa NOMBRE como destinatario por defecto"
 
 #, fuzzy
 #| msgid "change the ownertrust"
@@ -1686,10 +1557,9 @@ msgstr "Orden inválida (pruebe \"help\")\n"
 msgid "--output doesn't work for this command\n"
 msgstr "--output no funciona con esta orden\n"
 
-#, fuzzy, c-format
-#| msgid "can't open `%s'\n"
+#, c-format
 msgid "can't open '%s'\n"
-msgstr "no se puede abrir `%s'\n"
+msgstr "no se puede abrir '%s'\n"
 
 #, c-format
 msgid "key \"%s\" not found: %s\n"
@@ -1697,12 +1567,11 @@ msgstr "clave \"%s\" no encontrada: %s\n"
 
 #, c-format
 msgid "error reading keyblock: %s\n"
-msgstr "error leyendo bloque de claves: %s\n"
+msgstr "error al leer bloque de claves: %s\n"
 
-#, fuzzy, c-format
-#| msgid "key \"%s\" not found: %s\n"
+#, c-format
 msgid "key \"%s\" not found\n"
-msgstr "clave \"%s\" no encontrada: %s\n"
+msgstr "clave \"%s\" no encontrada\n"
 
 msgid "(unless you specify the key by fingerprint)\n"
 msgstr "(excepto si especifica la clave dando su huella digital)\n"
@@ -1716,18 +1585,15 @@ msgstr "¿Eliminar esta clave del anillo? (s/N) "
 msgid "This is a secret key! - really delete? (y/N) "
 msgstr "¡Es una clave secreta! ¿Eliminar realmente? (s/N) "
 
-#, fuzzy, c-format
-#| msgid "deleting certificate \"%s\" failed: %s\n"
+#, c-format
 msgid "deleting secret %s failed: %s\n"
-msgstr "borrado del certificado \"%s\" fallido: %s\n"
+msgstr "ha fallado el borrado del secreto %s: %s\n"
 
 msgid "key"
 msgstr "clave"
 
-#, fuzzy
-#| msgid "Pubkey: "
 msgid "subkey"
-msgstr "Clave pública: "
+msgstr "subclave"
 
 #, c-format
 msgid "deleting keyblock failed: %s\n"
@@ -1745,7 +1611,7 @@ msgstr "use antes la opción \"--delete-secret-key\" para borrarla.\n"
 
 #, c-format
 msgid "error creating passphrase: %s\n"
-msgstr "error creando frase contraseña: %s\n"
+msgstr "error al crear frase contraseña: %s\n"
 
 msgid "can't use a symmetric ESK packet due to the S2K mode\n"
 msgstr "no puede usar un paquete simétrico ESK debido al modo S2K\n"
@@ -1754,20 +1620,17 @@ msgstr "no puede usar un paquete simétrico ESK debido al modo S2K\n"
 msgid "using cipher %s\n"
 msgstr "usando cifrado %s\n"
 
-#, fuzzy, c-format
-#| msgid "`%s' already compressed\n"
+#, c-format
 msgid "'%s' already compressed\n"
-msgstr "`%s' ya está comprimido\n"
+msgstr "'%s' ya está comprimido\n"
 
-#, fuzzy, c-format
-#| msgid "WARNING: `%s' is an empty file\n"
+#, c-format
 msgid "WARNING: '%s' is an empty file\n"
-msgstr "ATENCIÓN `%s' es un fichero vacío\n"
+msgstr "ATENCIÓN '%s' es un fichero vacío\n"
 
-#, fuzzy, c-format
-#| msgid "reading from `%s'\n"
+#, c-format
 msgid "reading from '%s'\n"
-msgstr "leyendo desde `%s'\n"
+msgstr "leyendo desde '%s'\n"
 
 #, c-format
 msgid ""
@@ -1776,15 +1639,15 @@ msgstr ""
 "AVISO: forzar el cifrado simétrico %s (%d) viola las preferencias\n"
 "del destinatario\n"
 
-#, fuzzy, c-format
-#| msgid "you may not use cipher algorithm `%s' while in %s mode\n"
+#, c-format
 msgid "cipher algorithm '%s' may not be used in %s mode\n"
-msgstr "no puede usar el cifrado `%s' en modo %s\n"
+msgstr "no se puede usar el cifrado '%s' en modo %s\n"
 
-#, fuzzy, c-format
-#| msgid "WARNING: \"%s\" is an obsolete option - it has no effect\n"
+#, c-format
 msgid "WARNING: key %s is not suitable for encryption in %s mode\n"
-msgstr "ATENCIÓN: \"%s\" es una opción obsoleta - no tiene efecto\n"
+msgstr ""
+"ATENCIÓN: la clave %s no es adecuada para la encriptación en modo %s\n"
+"\n"
 
 #, c-format
 msgid ""
@@ -1804,10 +1667,9 @@ msgstr ""
 msgid "%s/%s encrypted for: \"%s\"\n"
 msgstr "%s/%s cifrado para: \"%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 "no puede usar %s en modo %s\n"
+msgstr "no se puede usar la opción '%s' en modo %s\n"
 
 #, c-format
 msgid "%s encrypted data\n"
@@ -1839,15 +1701,13 @@ msgstr ""
 "esta plataforma necesita ficheros temporales para llamar a programas "
 "externos\n"
 
-#, fuzzy, c-format
-#| msgid "unable to execute program `%s': %s\n"
+#, c-format
 msgid "unable to execute program '%s': %s\n"
-msgstr "no se puede ejecutar el programa `%s': %s\n"
+msgstr "no se puede ejecutar el programa '%s': %s\n"
 
-#, fuzzy, c-format
-#| msgid "unable to execute shell `%s': %s\n"
+#, c-format
 msgid "unable to execute shell '%s': %s\n"
-msgstr "no se puede ejecutar el intérprete de órdenes `%s': %s\n"
+msgstr "no se puede ejecutar el intérprete de órdenes '%s': %s\n"
 
 #, c-format
 msgid "system error while calling external program: %s\n"
@@ -1863,15 +1723,13 @@ msgstr "no se puede ejecutar el programa externo\n"
 msgid "unable to read external program response: %s\n"
 msgstr "no se puede leer la respuesta del programa externo: %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 "AVISO: no se puede borrar fichero temporal (%s) `%s': %s\n"
+msgstr "AVISO: no se puede borrar fichero temporal (%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 "AVISO: no se puede borrar el fichero temporal `%s': %s\n"
+msgstr "AVISO: no se puede borrar el directorio temporal '%s': %s\n"
 
 msgid "export signatures that are marked as local-only"
 msgstr "exportar firmas marcadas como sólo locales"
@@ -1889,17 +1747,14 @@ msgid "remove as much as possible from key during export"
 msgstr "borrar tanto como sea posible de la clave al exportar"
 
 msgid "use the GnuPG key backup format"
-msgstr ""
+msgstr "usar el formato de backup de claves GnuPG"
 
-#, fuzzy
-#| msgid "%s: skipped: %s\n"
 msgid " - skipped"
-msgstr "%s: omitido: %s\n"
+msgstr " - omitido"
 
-#, fuzzy, c-format
-#| msgid "writing to `%s'\n"
+#, c-format
 msgid "writing to '%s'\n"
-msgstr "escribiendo en `%s'\n"
+msgstr "escribiendo en '%s'\n"
 
 #, c-format
 msgid "key %s: key material on-card - skipped\n"
@@ -1915,63 +1770,59 @@ msgstr "clave %s: clave estilo PGP 2.x - omitida\n"
 msgid "WARNING: nothing exported\n"
 msgstr "ATENCIÓN: no se ha exportado nada\n"
 
-#, fuzzy, c-format
-#| msgid "error creating `%s': %s\n"
+#, c-format
 msgid "error creating '%s': %s\n"
-msgstr "error creando `%s': %s\n"
+msgstr "error al crear '%s': %s\n"
 
 msgid "[User ID not found]"
 msgstr "[ID de usuario no encontrado]"
 
-#, fuzzy, c-format
-#| msgid "missing argument for option \"%.50s\"\n"
+#, c-format
 msgid "(check argument of option '%s')\n"
-msgstr "falta parámetro para la opción \"%.50s\"\n"
+msgstr "(revisar el parámetro de la opción '%s')\n"
 
 #, c-format
 msgid "Warning: '%s' should be a long key ID or a fingerprint\n"
 msgstr ""
+"Atención: '%s' debería ser un identificador largo de usuario o una huella "
+"digital\n"
 
-#, fuzzy, c-format
-#| msgid "error closing %s: %s\n"
+#, c-format
 msgid "error looking up: %s\n"
-msgstr "error cerrando %s: %s\n"
+msgstr "error al buscar: %s\n"
 
-#, fuzzy, c-format
-#| msgid "error creating keyring `%s': %s\n"
+#, c-format
 msgid "Warning: %s appears in the keyring %d times\n"
-msgstr "error escribiendo anillo `%s': %s\n"
+msgstr ""
+"Advertencia: %s aparece %d veces en el anillo de claves\n"
+"\n"
 
-#, fuzzy, c-format
-#| msgid "automatically retrieved `%s' via %s\n"
+#, c-format
 msgid "automatically retrieved '%s' via %s\n"
-msgstr "recuperado automáticamente `%s' vía %s\n"
+msgstr "'%s' recuperado automáticamente vía %s\n"
 
-#, fuzzy, c-format
-#| msgid "error retrieving `%s' via %s: %s\n"
+#, c-format
 msgid "error retrieving '%s' via %s: %s\n"
-msgstr "error recuperando `%s' vía %s: %s\n"
+msgstr "error recuperando '%s' vía %s: %s\n"
 
 msgid "No fingerprint"
-msgstr "No hay huella dactilar"
+msgstr "No hay huella digital"
 
 #, c-format
 msgid "secret key \"%s\" not found: %s\n"
 msgstr "clave secreta \"%s\" no encontrada: %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 "|NOMBRE|usa NOMBRE como clave secreta por defecto"
+msgstr "Advertencia: no estamos usando '%s' como clave predeterminada: %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 "|NOMBRE|usa NOMBRE como clave secreta por defecto"
+msgstr "usando \"%s\" como clave secreta predeterminada para firmar\n"
 
 #, c-format
 msgid "all values passed to '%s' ignored\n"
-msgstr ""
+msgstr "todos los valores pasados a '%s' ignorados\n"
 
 #, c-format
 msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
@@ -1981,10 +1832,9 @@ msgstr "Clave %s inválida hecha válida mediante --allow-non-selfsigned-uid\n"
 msgid "using subkey %s instead of primary key %s\n"
 msgstr "usando subclave %s en vez de clave primaria %s\n"
 
-#, fuzzy, c-format
-#| msgid "missing argument for option \"%.50s\"\n"
+#, c-format
 msgid "valid values for option '%s':\n"
-msgstr "falta parámetro para la opción \"%.50s\"\n"
+msgstr "parámetros válidos para la opción '%s':\n"
 
 msgid "make a signature"
 msgstr "crea una firma"
@@ -2025,28 +1875,20 @@ msgstr "lista claves secretas"
 msgid "generate a new key pair"
 msgstr "genera un nuevo par de claves"
 
-#, fuzzy
-#| msgid "generate a new key pair"
 msgid "quickly generate a new key pair"
-msgstr "genera un nuevo par de claves"
+msgstr "genera un nuevo par de claves en modo rápido"
 
-#, fuzzy
-#| msgid "generate a new key pair"
 msgid "quickly add a new user-id"
-msgstr "genera un nuevo par de claves"
+msgstr "añade una nueva id de usuario en modo rápido"
 
-#, fuzzy
-#| msgid "generate a new key pair"
 msgid "quickly revoke a user-id"
-msgstr "genera un nuevo par de claves"
+msgstr "revoca una id de usuario en modo rápido"
 
-#, fuzzy
-#| msgid "generate a new key pair"
 msgid "quickly set a new expiration date"
-msgstr "genera un nuevo par de claves"
+msgstr "cambia la fecha de caducidad de modo rápido"
 
 msgid "full featured key pair generation"
-msgstr ""
+msgstr "generación de claves con todas las funcionalidades"
 
 msgid "generate a revocation certificate"
 msgstr "genera un certificado de revocación"
@@ -2057,15 +1899,11 @@ msgstr "elimina claves del anillo público"
 msgid "remove keys from the secret keyring"
 msgstr "elimina claves del anillo privado"
 
-#, fuzzy
-#| msgid "sign a key"
 msgid "quickly sign a key"
-msgstr "firma la clave"
+msgstr "firma una clave en modo rápido"
 
-#, fuzzy
-#| msgid "sign a key locally"
 msgid "quickly sign a key locally"
-msgstr "firma la clave localmente"
+msgstr "firma una clave localmente en modo rápido"
 
 msgid "sign a key"
 msgstr "firma la clave"
@@ -2116,16 +1954,16 @@ msgid "run in server mode"
 msgstr "ejecutar en modo servidor"
 
 msgid "|VALUE|set the TOFU policy for a key"
-msgstr ""
+msgstr "|VALUE|decide la política TOFU de una clave"
 
 msgid "create ascii armored output"
 msgstr "crea una salida ascii con armadura"
 
 msgid "|USER-ID|encrypt for USER-ID"
-msgstr "|ID-USUARIO|cifra para ID-USUARIO"
+msgstr "|USER-ID|cifra para ID-USUARIO"
 
 msgid "|USER-ID|use USER-ID to sign or decrypt"
-msgstr "|ID-USUARIO|usa este identificador para firmar o descifrar"
+msgstr "|USER-ID|usa este identificador para firmar o descifrar"
 
 msgid "|N|set compress level to N (0 disables)"
 msgstr "|N|nivel de compresión N (0 desactiva)"
@@ -2134,7 +1972,7 @@ msgid "use canonical text mode"
 msgstr "usa modo de texto canónico"
 
 msgid "|FILE|write output to FILE"
-msgstr "|FICHERO|volcar salida en FICHERO"
+msgstr "|FILE|volcar salida en FICHERO"
 
 msgid "do not make any changes"
 msgstr "no hace ningún cambio"
@@ -2156,16 +1994,6 @@ msgstr ""
 "@\n"
 "(Véase en la página del manual la lista completo de órdenes y opciones)\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"
@@ -2185,22 +2013,15 @@ msgstr ""
 " --list-keys [nombres]      muestra las claves\n"
 " --fingerprint [nombres]    muestra las huellas dactilares\n"
 
-#, fuzzy
-#| msgid "Usage: gpg [options] [files] (-h for help)"
 msgid "Usage: @GPG@ [options] [files] (-h for help)"
-msgstr "Uso: gpg [opciones] [ficheros] (-h para ayuda)"
+msgstr "Uso: @GPG@ [opciones] [ficheros] (-h para ayuda)"
 
-#, 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 ""
-"Sintaxis: gpg [opciones] [ficheros]\n"
+"Sintaxis: @GPG@ [opciones] [ficheros]\n"
 "firma, comprueba, cifra o descifra\n"
 "la operación por defecto depende de los datos de entrada\n"
 
@@ -2223,102 +2044,82 @@ msgstr "Resumen: "
 msgid "Compression: "
 msgstr "Compresión: "
 
-#, fuzzy, c-format
-#| msgid "usage: gpgsm [options] "
+#, c-format
 msgid "usage: %s [options] %s\n"
-msgstr "uso: gpgsm [opciones] "
+msgstr "uso: %s [opciones] %s\n"
 
 msgid "conflicting commands\n"
 msgstr "órdenes incompatibles\n"
 
-#, fuzzy, c-format
-#| msgid "no = sign found in group definition `%s'\n"
+#, c-format
 msgid "no = sign found in group definition '%s'\n"
-msgstr "no se encontró el signo = en la definición de grupo `%s'\n"
+msgstr "no se encontró el signo = en la definición de grupo '%s'\n"
 
-#, fuzzy, c-format
-#| msgid "WARNING: unsafe ownership on homedir `%s'\n"
+#, c-format
 msgid "WARNING: unsafe ownership on homedir '%s'\n"
-msgstr "AVISO: propiedad insegura del directorio personal `%s'\n"
+msgstr "AVISO: propiedad insegura del directorio personal '%s'\n"
 
-#, fuzzy, c-format
-#| msgid "WARNING: unsafe ownership on configuration file `%s'\n"
+#, c-format
 msgid "WARNING: unsafe ownership on configuration file '%s'\n"
-msgstr "AVISO: propiedad insegura del fichero de configuración `%s'\n"
+msgstr "AVISO: propiedad insegura del fichero de configuración '%s'\n"
 
-#, fuzzy, c-format
-#| msgid "WARNING: unsafe ownership on extension `%s'\n"
+#, c-format
 msgid "WARNING: unsafe ownership on extension '%s'\n"
-msgstr "AVISO: propiedad insegura de la extensión `%s'\n"
+msgstr "AVISO: propiedad insegura de la extensión '%s'\n"
 
-#, fuzzy, c-format
-#| msgid "WARNING: unsafe permissions on homedir `%s'\n"
+#, c-format
 msgid "WARNING: unsafe permissions on homedir '%s'\n"
-msgstr "AVISO: permisos inseguros del directorio personal `%s'\n"
+msgstr "AVISO: permisos inseguros del directorio personal '%s'\n"
 
-#, fuzzy, c-format
-#| msgid "WARNING: unsafe permissions on configuration file `%s'\n"
+#, c-format
 msgid "WARNING: unsafe permissions on configuration file '%s'\n"
-msgstr "AVISO: permisos inseguros del fichero de configuración `%s'\n"
+msgstr "AVISO: permisos inseguros del fichero de configuración '%s'\n"
 
-#, fuzzy, c-format
-#| msgid "WARNING: unsafe permissions on extension `%s'\n"
+#, c-format
 msgid "WARNING: unsafe permissions on extension '%s'\n"
-msgstr "AVISO: permisos inseguros de la extensión `%s'\n"
+msgstr "AVISO: permisos inseguros de la extensión '%s'\n"
 
-#, fuzzy, c-format
-#| msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n"
+#, c-format
 msgid "WARNING: unsafe enclosing directory ownership on homedir '%s'\n"
-msgstr "AVISO: propiedad insegura del directorio contenedor de `%s'\n"
+msgstr "AVISO: propiedad insegura del directorio contenedor de '%s'\n"
 
-#, fuzzy, c-format
-#| msgid ""
-#| "WARNING: unsafe enclosing directory ownership on configuration file `%s'\n"
+#, c-format
 msgid ""
 "WARNING: unsafe enclosing directory ownership on configuration file '%s'\n"
 msgstr ""
 "AVISO: propiedad insegura del directorio contenedor del fichero de\n"
-"configuración `%s'\n"
+"configuración '%s'\n"
 
-#, fuzzy, c-format
-#| msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n"
+#, c-format
 msgid "WARNING: unsafe enclosing directory ownership on extension '%s'\n"
 msgstr ""
-"AVISO: propiedad insegura del directorio contenedor de la extensión `%s'\n"
+"AVISO: propiedad insegura del directorio contenedor de la extensión '%s'\n"
 
-#, fuzzy, c-format
-#| msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n"
+#, c-format
 msgid "WARNING: unsafe enclosing directory permissions on homedir '%s'\n"
-msgstr "AVISO: permisos inseguros del directorio contenedor de `%s'\n"
+msgstr "AVISO: permisos inseguros del directorio contenedor de '%s'\n"
 
-#, fuzzy, c-format
-#| msgid ""
-#| "WARNING: unsafe enclosing directory permissions on configuration file `"
-#| "%s'\n"
+#, c-format
 msgid ""
 "WARNING: unsafe enclosing directory permissions on configuration file '%s'\n"
 msgstr ""
 "AVISO: permisos inseguros del directorio contenedor del fichero de\n"
-"configuración `%s'\n"
+"configuración '%s'\n"
 
-#, fuzzy, c-format
-#| msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n"
+#, c-format
 msgid "WARNING: unsafe enclosing directory permissions on extension '%s'\n"
 msgstr ""
-"AVISO: permisos inseguros del directorio contenedor de la extensión `%s'\n"
+"AVISO: permisos inseguros del directorio contenedor de la extensión '%s'\n"
 
-#, fuzzy, c-format
-#| msgid "unknown configuration item `%s'\n"
+#, c-format
 msgid "unknown configuration item '%s'\n"
-msgstr "artículo de configuración desconocido `%s'\n"
+msgstr "artículo de configuración desconocido '%s'\n"
 
 msgid "display photo IDs during key listings"
 msgstr "mostrar foto IDs al listar claves"
 
-#, fuzzy
-#| msgid "show user ID validity during key listings"
 msgid "show key usage information during key listings"
-msgstr "mostrar validez de la ID de usuario al listar claves"
+msgstr "mostrar información de uso de las claves al listarlas"
 
 msgid "show policy URLs during signature listings"
 msgstr "mostrar URLS de política al listar firmas"
@@ -2350,48 +2151,41 @@ msgstr "mostrar nombre de los anillos de claves al listar claves"
 msgid "show expiration dates during signature listings"
 msgstr "mostrar fechas de caducidad al listar firmas"
 
-#, fuzzy, c-format
-#| msgid "unknown option `%s'\n"
+#, c-format
 msgid "unknown TOFU policy '%s'\n"
-msgstr "opción desconocida `%s'\n"
+msgstr "política TOFU desconocida '%s'\n"
 
 msgid "(use \"help\" to list choices)\n"
-msgstr ""
+msgstr "(usa \"ayuda\" para listar las opciones)\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: se ignora el antiguo fichero de opciones predefinidas `%s'\n"
+msgstr "NOTA: se ignora el antiguo fichero de opciones predefinidas '%s'\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 no es para uso normal!\n"
 
-#, fuzzy, c-format
-#| msgid "`%s' is not a valid signature expiration\n"
+#, c-format
 msgid "'%s' is not a valid signature expiration\n"
-msgstr "`%s' no es una fecha de caducidad válida\n"
+msgstr "'%s' no es una fecha de caducidad de firma válida\n"
 
-#, fuzzy, c-format
-#| msgid "line %d: not a valid email address\n"
+#, c-format
 msgid "\"%s\" is not a proper mail address\n"
-msgstr "línea %d: no es una dirección de email válida\n"
+msgstr "\"%s\" no es una dirección de email válida\n"
 
-#, fuzzy, c-format
-#| msgid "invalid country code in `%s', line %d\n"
+#, c-format
 msgid "invalid pinentry mode '%s'\n"
-msgstr "código de país inválido en `%s', línea %d\n"
+msgstr "modo de entrada de pin inválido '%s'\n"
 
 #, fuzzy, c-format
-#| msgid "missing argument for option \"%.50s\"\n"
+#| msgid "invalid value for option '%s'\n"
 msgid "invalid request origin '%s'\n"
-msgstr "falta parámetro para la opción \"%.50s\"\n"
+msgstr "parámetro incorrecto para la opción '%s'\n"
 
-#, fuzzy, c-format
-#| msgid "`%s' is not a valid character set\n"
+#, c-format
 msgid "'%s' is not a valid character set\n"
-msgstr "`%s' no es un juego de caracteres válido\n"
+msgstr "'%s' no es un juego de caracteres válido\n"
 
 msgid "could not parse keyserver URL\n"
 msgstr "no se puede interpretar la URL del servidor de claves\n"
@@ -2410,10 +2204,9 @@ msgstr "%s:%d: opciones de importación inválidas\n"
 msgid "invalid import options\n"
 msgstr "opciones de importación inválidas\n"
 
-#, fuzzy, c-format
-#| msgid "invalid list options\n"
+#, c-format
 msgid "invalid filter option: %s\n"
-msgstr "lista de opciones inválida\n"
+msgstr "opción de filtro inválida: %s\n"
 
 #, c-format
 msgid "%s:%d: invalid export options\n"
@@ -2496,7 +2289,7 @@ msgid "%s makes no sense with %s!\n"
 msgstr "¡%s no tiene sentido con %s!\n"
 
 msgid "WARNING: running with faked system time: "
-msgstr "AVISO: ejecutándose con hora del sistema falsificada"
+msgstr "AVISO: ejecutándose con hora del sistema falsificada "
 
 #, c-format
 msgid "will not run with insecure memory due to %s\n"
@@ -2526,8 +2319,6 @@ msgstr "default-cert-level inválido; debe ser 0, 1, 2, ó 3\n"
 msgid "invalid min-cert-level; must be 1, 2, or 3\n"
 msgstr "min-cert-level inválido; debe ser 0, 1, 2, ó 3\n"
 
-#, fuzzy
-#| msgid "NOTE: simple S2K mode (0) is strongly discouraged\n"
 msgid "Note: simple S2K mode (0) is strongly discouraged\n"
 msgstr "NOTA: el modo S2K simple (0) no es nada recomendable\n"
 
@@ -2550,15 +2341,13 @@ msgstr "preferencias personales de compresión inválidas\n"
 msgid "%s does not yet work with %s\n"
 msgstr "%s aún no funciona con %s\n"
 
-#, fuzzy, c-format
-#| msgid "you may not use digest algorithm `%s' while in %s mode\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"
+msgstr "no puede usar el resumen '%s' en modo %s\n"
 
-#, fuzzy, c-format
-#| msgid "you may not use compression algorithm `%s' while in %s mode\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"
+msgstr "no puede usar la compresión '%s' en modo %s\n"
 
 #, c-format
 msgid "failed to initialize the TrustDB: %s\n"
@@ -2567,24 +2356,21 @@ msgstr "inicialización de la base de datos de confianza fallida: %s\n"
 msgid "WARNING: recipients (-r) given without using public key encryption\n"
 msgstr "AVISO: se indicaron receptores (-r) sin clave pública de cifrado\n"
 
-#, fuzzy, c-format
-#| msgid "symmetric encryption of `%s' failed: %s\n"
+#, c-format
 msgid "symmetric encryption of '%s' failed: %s\n"
-msgstr "el cifrado simétrico de `%s' falló: %s\n"
+msgstr "el cifrado simétrico de '%s' falló: %s\n"
 
 msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n"
 msgstr "no puede usar --symetric --encrypt con --s2k-mode 0\n"
 
-#, fuzzy, c-format
-#| msgid "you cannot use --symmetric --encrypt while in %s mode\n"
+#, c-format
 msgid "you cannot use --symmetric --encrypt in %s mode\n"
-msgstr "no puede usar --symetric --encrypt en modo %s\n"
+msgstr "no puede usar --symmetric --encrypt en modo %s\n"
 
 msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n"
 msgstr "no puede usar --symetric --sign --encrypt con --s2k-mode 0\n"
 
-#, fuzzy, c-format
-#| msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n"
+#, c-format
 msgid "you cannot use --symmetric --sign --encrypt in %s mode\n"
 msgstr "no puede usar --symmetric --sign --encrypt en modo %s\n"
 
@@ -2600,10 +2386,9 @@ msgstr "recepción del servidor de claves fallida: %s\n"
 msgid "key export failed: %s\n"
 msgstr "exportación de clave fallida: %s\n"
 
-#, fuzzy, c-format
-#| msgid "key export failed: %s\n"
+#, c-format
 msgid "export as ssh key failed: %s\n"
-msgstr "exportación de clave fallida: %s\n"
+msgstr "exportación como clave ssh fallida: %s\n"
 
 #, c-format
 msgid "keyserver search failed: %s\n"
@@ -2621,22 +2406,22 @@ msgstr "eliminación de armadura fallida: %s\n"
 msgid "enarmoring failed: %s\n"
 msgstr "creación de armadura fallida: %s\n"
 
-#, fuzzy, c-format
-#| msgid "invalid hash algorithm `%s'\n"
+#, c-format
 msgid "invalid hash algorithm '%s'\n"
-msgstr "algoritmo de distribución inválido `%s'\n"
+msgstr "algoritmo de distribución inválido '%s'\n"
 
-#, fuzzy, c-format
-#| msgid "error storing certificate: %s\n"
+#, c-format
 msgid "error parsing key specification '%s': %s\n"
-msgstr "error almacenando certificado: %s\n"
+msgstr "error al leer la especificación de clave '%s': %s\n"
 
 #, c-format
 msgid "'%s' does not appear to be a valid key ID, fingerprint or keygrip\n"
-msgstr ""
+msgstr "'%s' no parece ser una ID de clave, huella digital o keygrip válido\n"
 
 msgid "WARNING: no command supplied.  Trying to guess what you mean ...\n"
 msgstr ""
+"ADVERTENCIA: no se ha proporcionado ninguna orden. Intentando adivinar lo "
+"que quieres...\n"
 
 # Falta un espacio.
 # En español no se deja espacio antes de los puntos suspensivos
@@ -2655,16 +2440,16 @@ msgid "the given preferred keyserver URL is invalid\n"
 msgstr "la URL del servidor de claves preferido no es válida\n"
 
 msgid "|FILE|take the keys from the keyring FILE"
-msgstr "|FICHERO|tomar las claves del anillo FILE"
+msgstr "|FILE|tomar las claves del anillo FILE"
 
 msgid "make timestamp conflicts only a warning"
 msgstr "hacer que los conflictos de fecha-hora sean sólo un aviso"
 
 msgid "|FD|write status info to this FD"
-msgstr "|DF|escribe información de estado en este descriptor de fichero"
+msgstr "|FD|escribe información de estado en este descriptor de fichero"
 
 msgid "|ALGO|reject signatures made with ALGO"
-msgstr ""
+msgstr "|ALGO|rechaza firmas hechas con ALGO"
 
 msgid "Usage: gpgv [options] [files] (-h for help)"
 msgstr "Uso: gpgv [opciones] [ficheros] (-h para ayuda)"
@@ -2679,10 +2464,9 @@ msgstr ""
 msgid "No help available"
 msgstr "Ayuda no disponible"
 
-#, fuzzy, c-format
-#| msgid "No help available for `%s'"
+#, c-format
 msgid "No help available for '%s'"
-msgstr "No hay ayuda disponible para `%s'"
+msgstr "No hay ayuda disponible para '%s'"
 
 msgid "import signatures that are marked as local-only"
 msgstr "importar firmas marcadas como sólo locales"
@@ -2690,18 +2474,14 @@ msgstr "importar firmas marcadas como sólo locales"
 msgid "repair damage from the pks keyserver during import"
 msgstr "reparar daño del servidor de claves públicas al importar"
 
-#, fuzzy
-#| msgid "do not update the trustdb after import"
 msgid "do not clear the ownertrust values during import"
-msgstr "no actualiza la base de datos de confianza después de importar"
+msgstr "no limpiar los valores de confianza durante la importación"
 
 msgid "do not update the trustdb after import"
 msgstr "no actualiza la base de datos de confianza después de importar"
 
-#, fuzzy
-#| msgid "show key fingerprint"
 msgid "show key during import"
-msgstr "muestra huella dactilar de la clave"
+msgstr "mostrar la clave durante la importación"
 
 msgid "only accept updates to existing keys"
 msgstr "sólo aceptar actualizaciones de claves ya existentes"
@@ -2713,17 +2493,13 @@ msgid "remove as much as possible from key after import"
 msgstr "borrar tanto como sea posible de la clave tras importar"
 
 msgid "run import filters and export key immediately"
-msgstr ""
+msgstr "ejecutar filtros de importación y exportar clave inmediatamente"
 
-#, fuzzy
-#| msgid "assume input is in binary format"
 msgid "assume the GnuPG key backup format"
-msgstr "asumir entrada en formato binario"
+msgstr "asumir entrada en formato de backup de clave GnuPG"
 
-#, fuzzy
-#| msgid "show key fingerprint"
 msgid "repair keys on import"
-msgstr "muestra huella dactilar de la clave"
+msgstr "reparar claves al importar"
 
 #, c-format
 msgid "skipping block of type %d\n"
@@ -2737,10 +2513,9 @@ msgstr "%lu claves procesadas hasta ahora\n"
 msgid "Total number processed: %lu\n"
 msgstr "Cantidad total procesada: %lu\n"
 
-#, fuzzy, c-format
-#| msgid "      skipped new keys: %lu\n"
+#, c-format
 msgid "    skipped PGP-2 keys: %lu\n"
-msgstr "      omitidas nuevas claves: %lu\n"
+msgstr "      omitidas las claves PGP-2: %lu\n"
 
 #, c-format
 msgid "      skipped new keys: %lu\n"
@@ -2760,7 +2535,7 @@ msgstr "             sin cambios: %lu\n"
 
 #, c-format
 msgid "          new user IDs: %lu\n"
-msgstr "     nuevos identificativos: %lu\n"
+msgstr "          nuevos identificativos: %lu\n"
 
 #, c-format
 msgid "           new subkeys: %lu\n"
@@ -2768,23 +2543,23 @@ msgstr "           nuevas subclaves: %lu\n"
 
 #, c-format
 msgid "        new signatures: %lu\n"
-msgstr "              nuevas firmas: %lu\n"
+msgstr "        nuevas firmas: %lu\n"
 
 #, c-format
 msgid "   new key revocations: %lu\n"
-msgstr "        nuevas revocaciones de claves: %lu\n"
+msgstr "   nuevas revocaciones de claves: %lu\n"
 
 #, c-format
 msgid "      secret keys read: %lu\n"
-msgstr "     claves secretas leídas: %lu\n"
+msgstr "      claves secretas leídas: %lu\n"
 
 #, c-format
 msgid "  secret keys imported: %lu\n"
-msgstr " claves secretas importadas: %lu\n"
+msgstr "  claves secretas importadas: %lu\n"
 
 #, c-format
 msgid " secret keys unchanged: %lu\n"
-msgstr "claves secretas sin cambios: %lu\n"
+msgstr " claves secretas sin cambios: %lu\n"
 
 #, c-format
 msgid "          not imported: %lu\n"
@@ -2823,7 +2598,7 @@ msgstr "se recomienda encarecidamente que actualice sus preferencias y\n"
 
 msgid "re-distribute this key to avoid potential algorithm mismatch problems\n"
 msgstr ""
-"re-dustribuya esta clave para evitar potenciales problemas de\n"
+"redistribuya esta clave para evitar potenciales problemas de\n"
 "diferencias en los algoritmos.\n"
 
 #, c-format
@@ -2835,13 +2610,12 @@ msgstr ""
 msgid "key %s: no user ID\n"
 msgstr "clave %s: sin identificador de usuario\n"
 
-#, fuzzy, c-format
-#| msgid "skipped \"%s\": %s\n"
+#, c-format
 msgid "key %s: %s\n"
-msgstr "omitido \"%s\": %s\n"
+msgstr "clave %s: %s\n"
 
 msgid "rejected by import screener"
-msgstr ""
+msgstr "rechazado por el filtro de importación"
 
 #, c-format
 msgid "key %s: PKS subkey corruption repaired\n"
@@ -2870,10 +2644,9 @@ msgstr "clave %s: clave nueva - omitida\n"
 msgid "no writable keyring found: %s\n"
 msgstr "anillo de claves no escribible encontrado: %s\n"
 
-#, fuzzy, c-format
-#| msgid "error writing keyring `%s': %s\n"
+#, c-format
 msgid "error writing keyring '%s': %s\n"
-msgstr "error escribiendo anillo `%s': %s\n"
+msgstr "error escribiendo anillo '%s': %s\n"
 
 #, c-format
 msgid "key %s: public key \"%s\" imported\n"
@@ -2931,27 +2704,24 @@ msgstr "clave %s: \"%s\" sin cambios\n"
 msgid "key %s: secret key imported\n"
 msgstr "clave %s: clave secreta importada\n"
 
-#, fuzzy, c-format
-#| msgid "skipped: secret key already present\n"
+#, c-format
 msgid "key %s: secret key already exists\n"
-msgstr "omitido: clave secreta ya presente\n"
+msgstr "clave %s: clave secreta ya existe\n"
 
-#, fuzzy, c-format
-#| msgid "error sending %s command: %s\n"
+#, c-format
 msgid "key %s: error sending to agent: %s\n"
-msgstr "error enviando orden %s: %s\n"
+msgstr "clave %s: error enviando al agente: %s\n"
 
-#, fuzzy, c-format
-#| msgid "secret key \"%s\" not found: %s\n"
+#, c-format
 msgid "secret key %s: %s\n"
-msgstr "clave secreta \"%s\" no encontrada: %s\n"
+msgstr "clave secreta %s: %s\n"
 
 msgid "importing secret keys not allowed\n"
 msgstr "no se permite importar claves secretas\n"
 
 #, c-format
 msgid "key %s: secret key with invalid cipher %d - skipped\n"
-msgstr "clave %s: clave secreta con cifrado inválido %d - omitida\n"
+msgstr "clave %s: clave secreta con cifrado incorrecto %d - omitida\n"
 
 #. TRANSLATORS: For smartcard, each private key on
 #. host has a reference (stub) to a smartcard and
@@ -2965,7 +2735,7 @@ msgstr "clave %s: clave secreta con cifrado inválido %d - omitida\n"
 #. created again.
 #, c-format
 msgid "To migrate '%s', with each smartcard, run: %s\n"
-msgstr ""
+msgstr "Para migrar '%s', para cada smartcard ejecuta: %s\n"
 
 #, c-format
 msgid "key %s: no public key - can't apply revocation certificate\n"
@@ -3043,7 +2813,7 @@ msgstr "clave %s: subclave omitida\n"
 
 #, c-format
 msgid "key %s: non exportable signature (class 0x%02X) - skipped\n"
-msgstr "clave %s: firma no exportable (clase 0x%02x) - omitida\n"
+msgstr "clave %s: firma no exportable (clase 0x%02X) - omitida\n"
 
 #, c-format
 msgid "key %s: revocation certificate at wrong place - skipped\n"
@@ -3059,7 +2829,7 @@ msgstr "clave %s: firma de subclave en lugar equivocado - omitida\n"
 
 #, c-format
 msgid "key %s: unexpected signature class (0x%02X) - skipped\n"
-msgstr "clave %s: firma de clase (0x%02x) inesperada - omitida\n"
+msgstr "clave %s: firma de clase (0x%02X) inesperada - omitida\n"
 
 #, c-format
 msgid "key %s: duplicated user ID detected - merged\n"
@@ -3083,35 +2853,29 @@ msgstr "clave %s: \"%s\" certificado de revocación añadido\n"
 msgid "key %s: direct key signature added\n"
 msgstr "clave %s: firma directa de clave añadida\n"
 
-#, fuzzy, c-format
-#| msgid "error creating keybox `%s': %s\n"
+#, c-format
 msgid "error creating keybox '%s': %s\n"
-msgstr "error creando caja de claves `%s': %s\n"
+msgstr "error al crear caja de claves '%s': %s\n"
 
-#, fuzzy, c-format
-#| msgid "error creating keyring `%s': %s\n"
+#, c-format
 msgid "error creating keyring '%s': %s\n"
-msgstr "error escribiendo anillo `%s': %s\n"
+msgstr "error al crear anillo '%s': %s\n"
 
-#, fuzzy, c-format
-#| msgid "keybox `%s' created\n"
+#, c-format
 msgid "keybox '%s' created\n"
-msgstr "caja de claves `%s' creada\n"
+msgstr "caja de claves '%s' creada\n"
 
-#, fuzzy, c-format
-#| msgid "keyring `%s' created\n"
+#, c-format
 msgid "keyring '%s' created\n"
-msgstr "anillo `%s' creado\n"
+msgstr "anillo '%s' creado\n"
 
-#, fuzzy, c-format
-#| msgid "keyblock resource `%s': %s\n"
+#, c-format
 msgid "keyblock resource '%s': %s\n"
-msgstr "recurso de bloque de claves: `%s': %s\n"
+msgstr "recurso de bloque de claves '%s': %s\n"
 
-#, fuzzy, c-format
-#| msgid "error opening `%s': %s\n"
+#, c-format
 msgid "error opening key DB: %s\n"
-msgstr "error abriendo `%s': %s\n"
+msgstr "error al abrir base de datos de claves: %s\n"
 
 #, c-format
 msgid "failed to rebuild keyring cache: %s\n"
@@ -3136,11 +2900,11 @@ msgstr ""
 
 #, c-format
 msgid "  %d = I trust marginally\n"
-msgstr " %d = Confío un poco\n"
+msgstr "  %d = Confío un poco\n"
 
 #, c-format
 msgid "  %d = I trust fully\n"
-msgstr " %d = Confío totalmente\n"
+msgstr "  %d = Confío totalmente\n"
 
 msgid ""
 "Please enter the depth of this trust signature.\n"
@@ -3156,7 +2920,7 @@ msgstr "Introduzca un dominio para restringir esta firma, o intro para nada.\n"
 
 #, c-format
 msgid "Skipping user ID \"%s\", which is not a text ID.\n"
-msgstr ""
+msgstr "Salteando el ID de usuario \"%s\", que no es un ID de texto.\n"
 
 #, c-format
 msgid "User ID \"%s\" is revoked."
@@ -3178,7 +2942,7 @@ msgstr "ID de usuario \"%s\" no tiene autofirma."
 
 #, c-format
 msgid "User ID \"%s\" is signable.  "
-msgstr "ID de usuario \"%s\" puede firmarse."
+msgstr "ID de usuario \"%s\" puede firmarse.  "
 
 msgid "Sign it? (y/N) "
 msgstr "¿Firmarlo? (s/N) "
@@ -3266,10 +3030,8 @@ msgstr "   (2) He hecho una comprobación informal.%s\n"
 msgid "   (3) I have done very careful checking.%s\n"
 msgstr "   (3) Lo he comprobado meticulosamente.%s\n"
 
-#, fuzzy
-#| msgid "Your selection? (enter `?' for more information): "
 msgid "Your selection? (enter '?' for more information): "
-msgstr "¿Su elección? (escriba '?' si desea más información): "
+msgstr "¿Su elección? (escriba '?' para más información): "
 
 #, c-format
 msgid ""
@@ -3315,21 +3077,18 @@ msgstr ""
 "La clave tiene sólo un apuntador u objetos de clave en la propia tarjeta\n"
 "- no hay frase contraseña que cambiar.\n"
 
-#, fuzzy, c-format
-#| msgid "error creating passphrase: %s\n"
+#, c-format
 msgid "key %s: error changing passphrase: %s\n"
-msgstr "error creando frase contraseña: %s\n"
+msgstr "clave %s: error al cambiar frase contraseña: %s\n"
 
 msgid "save and quit"
 msgstr "graba y sale"
 
 msgid "show key fingerprint"
-msgstr "muestra huella dactilar de la clave"
+msgstr "muestra huella digital de la clave"
 
-#, fuzzy
-#| msgid "Enter the keygrip: "
 msgid "show the keygrip"
-msgstr "Introduzca keygrip: "
+msgstr "mostrar el keygrip"
 
 msgid "list key and user IDs"
 msgstr "lista clave e identificadores de usuario"
@@ -3439,38 +3198,29 @@ msgstr "compactar IDs inutilizables y borrar todas las firmas de la clave"
 msgid "Secret key is available.\n"
 msgstr "Clave secreta disponible.\n"
 
-#, fuzzy
-#| msgid "Secret key is available.\n"
 msgid "Secret subkeys are available.\n"
-msgstr "Clave secreta disponible.\n"
+msgstr "Subclaves secretas disponibles.\n"
 
 msgid "Need the secret key to do this.\n"
 msgstr "Se necesita la clave secreta para hacer esto.\n"
 
-#, fuzzy
-#| msgid ""
-#| "* The `sign' command may be prefixed with an `l' for local signatures "
-#| "(lsign),\n"
-#| "  a `t' for trust signatures (tsign), an `nr' for non-revocable "
-#| "signatures\n"
-#| "  (nrsign), or any combination thereof (ltsign, tnrsign, etc.).\n"
 msgid ""
 "* The 'sign' command may be prefixed with an 'l' for local signatures "
 "(lsign),\n"
 "  a 't' for trust signatures (tsign), an 'nr' for non-revocable signatures\n"
 "  (nrsign), or any combination thereof (ltsign, tnrsign, etc.).\n"
 msgstr ""
-"* La orden `sign' (firmar) puede estar precedida por una 'l' para firmas\n"
-"locales (lsign), una 't' para firmas fiables (tsign), `nr' para firmas no\n"
+"* La orden 'sign' (firmar) puede estar precedida por una 'l' para firmas\n"
+"locales (lsign), una 't' para firmas fiables (tsign), 'nr' para firmas no\n"
 "revocables (nrsign) o cualquier combinación de ellas (ltsign, tnrsign, etc)\n"
 
 msgid "Key is revoked."
 msgstr "La clave está revocada."
 
-#, fuzzy
-#| msgid "Really sign all user IDs? (y/N) "
 msgid "Really sign all text user IDs? (y/N) "
-msgstr "¿Firmar realmente todos los IDs de usuario? (s/N) "
+msgstr ""
+"¿Firmar realmente todos los identificadores de usuario que son sólo texto? "
+"(s/N) "
 
 msgid "Really sign all user IDs? (y/N) "
 msgstr "¿Firmar realmente todos los IDs de usuario? (s/N) "
@@ -3478,10 +3228,9 @@ msgstr "¿Firmar realmente todos los IDs de usuario? (s/N) "
 msgid "Hint: Select the user IDs to sign\n"
 msgstr "Sugerencia: seleccione los identificadores de usuario que firmar\n"
 
-#, fuzzy, c-format
-#| msgid "Unknown signature type `%s'\n"
+#, c-format
 msgid "Unknown signature type '%s'\n"
-msgstr "Clase de firma desconocida `%s'\n"
+msgstr "Clase de firma desconocida '%s'\n"
 
 #, c-format
 msgid "This command is not allowed while in %s mode.\n"
@@ -3492,7 +3241,7 @@ msgstr "Debe seleccionar por lo menos un identificador de usuario.\n"
 
 #, c-format
 msgid "(Use the '%s' command.)\n"
-msgstr ""
+msgstr "(Use la orden '%s')\n"
 
 msgid "You can't delete the last user ID!\n"
 msgstr "¡No puede borrar el último identificador de usuario!\n"
@@ -3506,7 +3255,7 @@ msgstr "¿Borrar realmente este identificador de usuario? (s/N) "
 #. TRANSLATORS: Please take care: This is about
 #. moving the key and not about removing it.
 msgid "Really move the primary key? (y/N) "
-msgstr "¿Realmente cambiar de sitio la clave primaria? (s/N)"
+msgstr "¿Realmente cambiar de sitio la clave primaria? (s/N) "
 
 msgid "You must select exactly one key.\n"
 msgstr "Debe seleccionar exactamente una clave.\n"
@@ -3514,15 +3263,13 @@ msgstr "Debe seleccionar exactamente una clave.\n"
 msgid "Command expects a filename argument\n"
 msgstr "La orden espera un nombre de fichero como argumento\n"
 
-#, fuzzy, c-format
-#| msgid "Can't open `%s': %s\n"
+#, c-format
 msgid "Can't open '%s': %s\n"
-msgstr "No se puede abrir `%s': %s\n"
+msgstr "No se puede abrir '%s': %s\n"
 
-#, fuzzy, c-format
-#| msgid "Error reading backup key from `%s': %s\n"
+#, c-format
 msgid "Error reading backup key from '%s': %s\n"
-msgstr "Error leyendo clave de respaldo desde `%s': %s\n"
+msgstr "Error al leer clave de respaldo desde '%s': %s\n"
 
 msgid "You must select at least one key.\n"
 msgstr "Debe seleccionar por lo menos una clave.\n"
@@ -3543,7 +3290,7 @@ msgid "Do you really want to revoke the entire key? (y/N) "
 msgstr "¿De verdad quiere revocar la clave completa? (s/N) "
 
 msgid "Do you really want to revoke the selected subkeys? (y/N) "
-msgstr "¿De verdad quiere revocar las subclaves seleccionadas? (s/N)"
+msgstr "¿De verdad quiere revocar las subclaves seleccionadas? (s/N) "
 
 msgid "Do you really want to revoke this subkey? (y/N) "
 msgstr "¿De verdad quiere revocar esta subclave? (s/N) "
@@ -3576,60 +3323,48 @@ msgstr "actualización fallida: %s\n"
 msgid "Key not changed so no update needed.\n"
 msgstr "Clave sin cambios, no se necesita actualización.\n"
 
-#, fuzzy
-#| msgid "You can't delete the last user ID!\n"
 msgid "cannot revoke the last valid user ID.\n"
-msgstr "¡No puede borrar el último identificador de usuario!\n"
+msgstr "no se puede revocar el último identificador de usuario válido\n"
 
-#, fuzzy, c-format
-#| msgid "checking the trust list failed: %s\n"
+#, c-format
 msgid "revoking the user ID failed: %s\n"
-msgstr "la comprobación de la lista de confianza falló: %s\n"
+msgstr "la revocación del identificador de usuario ha fallado: %s\n"
 
-#, fuzzy, c-format
-#| msgid "checking the trust list failed: %s\n"
+#, c-format
 msgid "setting the primary user ID failed: %s\n"
-msgstr "la comprobación de la lista de confianza falló: %s\n"
+msgstr "la configuración del ID de usuario primario ha fallado: %s\n"
 
-#, fuzzy, c-format
-#| msgid "invalid fingerprint"
+#, c-format
 msgid "\"%s\" is not a fingerprint\n"
-msgstr "huella dactilar no válida"
+msgstr "\"%s\" no es una huella digital\n"
 
-#, fuzzy, c-format
-#| msgid "failed to get the fingerprint\n"
+#, c-format
 msgid "\"%s\" is not the primary fingerprint\n"
-msgstr "fallo obteniendo huella digital\n"
+msgstr ""
+"\"%s\" no es la huella digital primaria\n"
+"\n"
 
-#, fuzzy, c-format
-#| msgid "invalid value\n"
+#, c-format
 msgid "Invalid user ID '%s': %s\n"
-msgstr "valor inválido\n"
+msgstr "Identificador de usuario '%s' no válido : %s\n"
 
-#, fuzzy
-#| msgid "No such user ID.\n"
 msgid "No matching user IDs."
-msgstr "ID de usuario inexistente.\n"
+msgstr "No coincide con ningún identificador de usuario."
 
-#, fuzzy
-#| msgid "Nothing to sign with key %s\n"
 msgid "Nothing to sign.\n"
-msgstr "Nada que firmar con la clave %s\n"
+msgstr "Nada que firmar.\n"
 
-#, fuzzy, c-format
-#| msgid "`%s' is not a valid signature expiration\n"
+#, c-format
 msgid "'%s' is not a valid expiration time\n"
-msgstr "`%s' no es una fecha de caducidad válida\n"
+msgstr "'%s' no es una fecha de caducidad válida\n"
 
-#, fuzzy, c-format
-#| msgid "invalid fingerprint"
+#, c-format
 msgid "\"%s\" is not a proper fingerprint\n"
-msgstr "huella dactilar no válida"
+msgstr "\"%s\" no es una huella digital válida\n"
 
-#, fuzzy, c-format
-#| msgid "key \"%s\" not found: %s\n"
+#, c-format
 msgid "subkey \"%s\" not found\n"
-msgstr "clave \"%s\" no encontrada: %s\n"
+msgstr "subclave \"%s\" no encontrada\n"
 
 msgid "Digest: "
 msgstr "Resumen: "
@@ -3698,8 +3433,8 @@ msgid ""
 "Please note that the shown key validity is not necessarily correct\n"
 "unless you restart the program.\n"
 msgstr ""
-"Por favor, advierta que la validez de clave mostrada no es necesariamente\n"
-"correcta a menos de que reinicie el programa.\n"
+"Ten en cuenta que la validez de clave mostrada no es necesariamente\n"
+"correcta a menos de que reinicies el programa.\n"
 
 msgid "revoked"
 msgstr "revocada"
@@ -3715,12 +3450,10 @@ msgstr ""
 "       causar que se tome como principal por defecto otro ID de usuario.\n"
 
 msgid "WARNING: Your encryption subkey expires soon.\n"
-msgstr ""
+msgstr "AVISO: Tu subclave de cifrado caduca pronto.\n"
 
-#, fuzzy
-#| msgid "You can't change the expiration date of a v3 key\n"
 msgid "You may want to change its expiration date too.\n"
-msgstr "No puede cambiar la fecha de caducidad de una clave v3\n"
+msgstr "Puede que también quieras cambiar su fecha de caducidad.\n"
 
 msgid ""
 "WARNING: This is a PGP2-style key.  Adding a photo ID may cause some "
@@ -3751,11 +3484,10 @@ msgstr "¿Borrar esta firma desconocida? (s/N/q)"
 msgid "Really delete this self-signature? (y/N)"
 msgstr "¿Borrar realmente esta 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] "%d firmas borradas.\n"
+msgstr[0] "%d firma borrada.\n"
 msgstr[1] "%d firmas borradas.\n"
 
 msgid "Nothing deleted.\n"
@@ -3768,12 +3500,11 @@ msgstr "inválida"
 msgid "User ID \"%s\" compacted: %s\n"
 msgstr "ID de usuario \"%s\" compactado: %s\n"
 
-#, fuzzy, c-format
-#| msgid "User ID \"%s\": %d signature removed\n"
+#, c-format
 msgid "User ID \"%s\": %d signature removed\n"
 msgid_plural "User ID \"%s\": %d signatures removed\n"
 msgstr[0] "ID de usuario \"%s\": %d firma borrada\n"
-msgstr[1] "ID de usuario \"%s\": %d firma borrada\n"
+msgstr[1] "ID de usuario \"%s\": %d firmas borradas\n"
 
 #, c-format
 msgid "User ID \"%s\": already minimized\n"
@@ -3815,14 +3546,12 @@ msgid ""
 msgstr ""
 "¿Está seguro de querer elegir esta clave como revocador designado? (s/N) "
 
-#, fuzzy
-#| msgid ""
-#| "Are you sure you want to appoint this key as a designated revoker? (y/N) "
 msgid ""
 "Are you sure you want to change the expiration time for multiple subkeys? (y/"
 "N) "
 msgstr ""
-"¿Está seguro de querer elegir esta clave como revocador designado? (s/N) "
+"¿Está seguro de querer cambiar la fecha de caducidad para multiples "
+"subclaves? (s/N) "
 
 msgid "Changing expiration time for a subkey.\n"
 msgstr "Cambiando fecha de caducidad de subclave.\n"
@@ -3881,10 +3610,9 @@ msgstr "No hay ningún identificador de usuario con el índice %d\n"
 msgid "No user ID with hash %s\n"
 msgstr "No hay ID de usuario con hash %s\n"
 
-#, fuzzy, c-format
-#| msgid "No subkey with index %d\n"
+#, c-format
 msgid "No subkey with key ID '%s'.\n"
-msgstr "No existe una subclave con índice %d\n"
+msgstr "No existe una subclave con ID de usuario '%s'.\n"
 
 #, c-format
 msgid "No subkey with index %d\n"
@@ -3909,7 +3637,7 @@ msgid "Are you sure you still want to revoke it? (y/N) "
 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)"
+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"
@@ -3934,10 +3662,9 @@ msgstr "¿Crear los certificados de revocación realmente? (s/N) "
 msgid "no secret key\n"
 msgstr "no hay clave secreta\n"
 
-#, fuzzy, c-format
-#| msgid "revoke a user ID"
+#, c-format
 msgid "tried to revoke a non-user ID: %s\n"
-msgstr "revocar un identificador de usuario"
+msgstr "ha intentado revocar una ID no de usuario: %s\n"
 
 #, c-format
 msgid "user ID \"%s\" is already revoked\n"
@@ -3947,10 +3674,8 @@ msgstr "ID de usuario \"%s\" ya ha sido revocado\n"
 msgid "WARNING: a user ID signature is dated %d seconds in the future\n"
 msgstr "AVISO: un ID de usuario tiene fecha %d segundos en el futuro\n"
 
-#, fuzzy
-#| msgid "You can't delete the last user ID!\n"
 msgid "Cannot revoke the last valid user ID.\n"
-msgstr "¡No puede borrar el último identificador de usuario!\n"
+msgstr "No se puede revocar el último identificador de usuario válido\n"
 
 #, c-format
 msgid "Key %s is already revoked.\n"
@@ -3964,15 +3689,13 @@ msgstr "La subclave %s ya ha sido revocada.\n"
 msgid "Displaying %s photo ID of size %ld for key %s (uid %d)\n"
 msgstr "Mostrando ID fotográfico %s de tamaño %ld para la clave %s (uid %d)\n"
 
-#, fuzzy, c-format
-#| msgid "missing argument for option \"%.50s\"\n"
+#, c-format
 msgid "invalid value for option '%s'\n"
-msgstr "falta parámetro para la opción \"%.50s\"\n"
+msgstr "parámetro incorrecto para la opción '%s'\n"
 
-#, fuzzy, c-format
-#| msgid "preference `%s' duplicated\n"
+#, c-format
 msgid "preference '%s' duplicated\n"
-msgstr "preferencia `%s' duplicada\n"
+msgstr "preferencia '%s' duplicada\n"
 
 msgid "too many cipher preferences\n"
 msgstr "demasiadas preferencias de cifrado\n"
@@ -3983,10 +3706,9 @@ msgstr "demasiadas preferencias de resumen\n"
 msgid "too many compression preferences\n"
 msgstr "demasiadas preferencias de compresión\n"
 
-#, fuzzy, c-format
-#| msgid "invalid item `%s' in preference string\n"
+#, c-format
 msgid "invalid item '%s' in preference string\n"
-msgstr "caracter inválido `%s' en cadena de preferencias\n"
+msgstr "item incorrecto '%s' en cadena de preferencias\n"
 
 msgid "writing direct signature\n"
 msgstr "escribiendo firma directa\n"
@@ -4091,28 +3813,23 @@ msgstr "   (%d) DSA (permite elegir capacidades)\n"
 msgid "   (%d) RSA (set your own capabilities)\n"
 msgstr "   (%d) RSA (permite elegir capacidades)\n"
 
-#, fuzzy, c-format
-#| msgid "   (%d) DSA and Elgamal\n"
+#, c-format
 msgid "   (%d) ECC and ECC\n"
-msgstr "   (%d) DSA y ElGamal\n"
+msgstr "   (%d) ECC y ECC\n"
 
-#, fuzzy, c-format
-#| msgid "   (%d) DSA (sign only)\n"
+#, c-format
 msgid "  (%d) ECC (sign only)\n"
-msgstr "   (%d) DSA (sólo firmar)\n"
+msgstr "  (%d) ECC (sólo firmar)\n"
 
-#, fuzzy, c-format
-#| msgid "   (%d) DSA (set your own capabilities)\n"
+#, c-format
 msgid "  (%d) ECC (set your own capabilities)\n"
-msgstr "   (%d) DSA (permite elegir capacidades)\n"
+msgstr "   (%d) ECC (permite elegir capacidades)\n"
 
-#, fuzzy, c-format
-#| msgid "   (%d) RSA (encrypt only)\n"
+#, c-format
 msgid "  (%d) ECC (encrypt only)\n"
-msgstr "   (%d) RSA (sólo cifrar)\n"
+msgstr "   (%d) ECC (sólo cifrar)\n"
 
-#, fuzzy, c-format
-#| msgid "   (%d) Existing key\n"
+#, c-format
 msgid "  (%d) Existing key\n"
 msgstr "   (%d) Clave existente\n"
 
@@ -4125,8 +3842,7 @@ msgstr "No es un keygrip válido (se esperaban 40 dígitos hex)\n"
 msgid "No key with this keygrip\n"
 msgstr "No hay claves con ese keygrip\n"
 
-#, fuzzy, c-format
-#| msgid "rounded up to %u bits\n"
+#, c-format
 msgid "rounded to %u bits\n"
 msgstr "redondeados a %u bits\n"
 
@@ -4142,10 +3858,8 @@ msgstr "¿De qué tamaño quiere la subclave? (%u) "
 msgid "Requested keysize is %u bits\n"
 msgstr "El tamaño requerido es de %u bits\n"
 
-#, fuzzy
-#| msgid "Please select what kind of key you want:\n"
 msgid "Please select which elliptic curve you want:\n"
-msgstr "Por favor seleccione tipo de clave deseado:\n"
+msgstr "Seleccione el tipo de curva elíptica deseado:\n"
 
 msgid ""
 "Please specify how long the key should be valid.\n"
@@ -4247,7 +3961,7 @@ msgstr "Caracter inválido en el nombre\n"
 
 #, c-format
 msgid "The characters '%s' and '%s' may not appear in name\n"
-msgstr ""
+msgstr "Los caracteres '%s' y '%s' no pueden aparecer en el nombre\n"
 
 msgid "Name may not start with a digit\n"
 msgstr "El nombre no puede empezar con un número\n"
@@ -4267,10 +3981,9 @@ msgstr "Comentario: "
 msgid "Invalid character in comment\n"
 msgstr "Caracter inválido en el comentario\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 "Está usando el juego de caracteres `%s'.\n"
+msgstr "Está usando el juego de caracteres '%s'.\n"
 
 #, c-format
 msgid ""
@@ -4338,55 +4051,49 @@ msgid ""
 "    \"%s\"\n"
 "\n"
 msgstr ""
+"A punto de crear una clave para:\n"
+"    \"%s\"\n"
+"\n"
 
 msgid "Continue? (Y/n) "
-msgstr ""
+msgstr "¿Continuar? (S/n) "
 
-#, fuzzy, c-format
-#| msgid "key already exists\n"
+#, c-format
 msgid "A key for \"%s\" already exists\n"
-msgstr "la clave ya existe\n"
+msgstr "Ya existe una clave para \"%s\"\n"
 
-#, fuzzy
-#| msgid "Create anyway? "
 msgid "Create anyway? (y/N) "
-msgstr "¿Crear de todas formas?"
+msgstr "¿Crear de todas formas?(s/N) "
 
-#, fuzzy
-#| msgid "Create anyway? "
 msgid "creating anyway\n"
-msgstr "¿Crear de todas formas?"
+msgstr "creando de todas formas\n"
 
 #, c-format
 msgid "Note: Use \"%s %s\" for a full featured key generation dialog.\n"
-msgstr ""
+msgstr "Nota: Usa \"%s %s\" para el diálogo completo de generación de clave.\n"
 
 msgid "Key generation canceled.\n"
 msgstr "Creación de claves cancelada.\n"
 
-#, fuzzy, c-format
-#| msgid "can't create backup file `%s': %s\n"
+#, c-format
 msgid "can't create backup file '%s': %s\n"
-msgstr "no se puede crear fichero de respaldo `%s': %s\n"
+msgstr "no se puede crear fichero de respaldo '%s': %s\n"
 
-#, fuzzy, c-format
-#| msgid "NOTE: backup of card key saved to `%s'\n"
+#, c-format
 msgid "Note: backup of card key saved to '%s'\n"
-msgstr "NOTA: copia de seguridad de la clave guardada en `%s'\n"
+msgstr "NOTA: copia de seguridad de la clave guardada en '%s'\n"
 
-#, fuzzy, c-format
-#| msgid "writing public key to `%s'\n"
+#, c-format
 msgid "writing public key to '%s'\n"
-msgstr "escribiendo clave pública en `%s'\n"
+msgstr "escribiendo clave pública en '%s'\n"
 
 #, c-format
 msgid "no writable public keyring found: %s\n"
 msgstr "anillo público de claves no escribible encontrado: %s\n"
 
-#, fuzzy, c-format
-#| msgid "error writing public keyring `%s': %s\n"
+#, c-format
 msgid "error writing public keyring '%s': %s\n"
-msgstr "error escribiendo anillo público `%s': %s\n"
+msgstr "error al escribir en el anillo público '%s': %s\n"
 
 msgid "public and secret key created and signed.\n"
 msgstr "claves pública y secreta creadas y firmadas.\n"
@@ -4412,10 +4119,9 @@ msgstr ""
 "clave pública creada %lu segundos en el futuro (salto en el tiempo o\n"
 "problemas con el reloj)\n"
 
-#, fuzzy
-#| msgid "NOTE: creating subkeys for v3 keys is not OpenPGP compliant\n"
 msgid "Note: creating subkeys for v3 keys is not OpenPGP compliant\n"
-msgstr "NOTA: crear subclaves para claves V3 no sigue el estándar OpenPGP\n"
+msgstr ""
+"Atención: crear subclaves para claves V3 no sigue el estándar OpenPGP\n"
 
 msgid "Secret parts of primary key are not available.\n"
 msgstr "Las partes secretas de la clave primaria no están disponibles.\n"
@@ -4444,39 +4150,35 @@ msgstr "Notación de firmas críticas: "
 msgid "Signature notation: "
 msgstr "Notación de 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 firmas incorrectas\n"
-msgstr[1] "%d firmas incorrectas\n"
+msgstr[0] "%d firma correcta\n"
+msgstr[1] "%d firmas correctas\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 firmas incorrectas\n"
+msgstr[0] "%d firma incorrecta\n"
 msgstr[1] "%d firmas incorrectas\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] "1 firma no comprobada por falta de clave\n"
-msgstr[1] "1 firma no comprobada por falta de clave\n"
+msgstr[0] "1 firma no comprobada por falta de una clave\n"
+msgstr[1] "%d firmas no comprobadas por falta de claves\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] "1 firma no comprobada por causa de un error\n"
-msgstr[1] "1 firma no comprobada por causa de un error\n"
+msgstr[1] "%d firmas no comprobadas por causa de errores\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] "Advertencia: clave %lu no usada por su gran tamaño\n"
+msgstr[1] "Advertencia: claves %lu no usadas por su gran tamaño\n"
 
 msgid "Keyring"
 msgstr "Anillo de claves"
@@ -4501,38 +4203,34 @@ msgstr "      Huella de clave ="
 msgid "      Card serial no. ="
 msgstr "      Número de serie de la tarjeta ="
 
-#, fuzzy, c-format
-#| msgid "caching keyring `%s'\n"
+#, c-format
 msgid "caching keyring '%s'\n"
-msgstr "memorizando anillo `%s'\n"
+msgstr "memorizando anillo '%s'\n"
 
-#, fuzzy, c-format
-#| msgid "%lu keys cached so far (%lu signatures)\n"
+#, c-format
 msgid "%lu keys cached so far (%lu signature)\n"
 msgid_plural "%lu keys cached so far (%lu signatures)\n"
-msgstr[0] "%lu claves memorizadas hasta ahora (%lu firmas)\n"
+msgstr[0] "%lu clave memorizada hasta ahora (%lu firmas)\n"
 msgstr[1] "%lu claves memorizadas hasta ahora (%lu firmas)\n"
 
-#, fuzzy, c-format
-#| msgid "\t%lu keys updated\n"
+#, c-format
 msgid "%lu key cached"
 msgid_plural "%lu keys cached"
-msgstr[0] "\t%lu claves actualizadas\n"
-msgstr[1] "\t%lu claves actualizadas\n"
+msgstr[0] "%lu clave memorizada"
+msgstr[1] "\t%lu claves memrizadas"
 
-#, fuzzy, c-format
-#| msgid "1 bad signature\n"
+#, c-format
 msgid " (%lu signature)\n"
 msgid_plural " (%lu signatures)\n"
-msgstr[0] "1 firma incorrecta\n"
-msgstr[1] "1 firma incorrecta\n"
+msgstr[0] " (%lu firma)\n"
+msgstr[1] " (%lu firmas)\n"
 
 #, c-format
 msgid "%s: keyring created\n"
 msgstr "%s: anillo creado\n"
 
 msgid "override proxy options set for dirmngr"
-msgstr ""
+msgstr "pasar por encima las opciones de proxy configuradas para dirmngr"
 
 msgid "include revoked keys in search results"
 msgstr "incluir claves revocadas en resultados de la búsqueda"
@@ -4541,7 +4239,7 @@ msgid "include subkeys when searching by key ID"
 msgstr "incluir subclaves al buscar por ID de clave"
 
 msgid "override timeout options set for dirmngr"
-msgstr ""
+msgstr "pasar por encima las opciones de timeout configuradas para dirmngr"
 
 msgid "automatically retrieve keys when verifying signatures"
 msgstr "recuperar automáticamente claves al verificar firmas"
@@ -4556,7 +4254,7 @@ msgid "disabled"
 msgstr "deshabilitado"
 
 msgid "Enter number(s), N)ext, or Q)uit > "
-msgstr "Introduzca número(s), O)tro, o F)in >"
+msgstr "Introduzca número(s), O)tro, o F)in > "
 
 #, c-format
 msgid "invalid keyserver protocol (us %d!=handler %d)\n"
@@ -4566,11 +4264,10 @@ msgstr "protocolo del servidor de claves inválido (us %d!=handler %d)\n"
 msgid "\"%s\" not a key ID: skipping\n"
 msgstr "\"%s\" no es un identificador de clave válido: omitido\n"
 
-#, fuzzy, c-format
-#| msgid "refreshing %d keys from %s\n"
+#, c-format
 msgid "refreshing %d key from %s\n"
 msgid_plural "refreshing %d keys from %s\n"
-msgstr[0] "renovando %d claves desde %s\n"
+msgstr[0] "renovando %d clave desde %s\n"
 msgstr[1] "renovando %d claves desde %s\n"
 
 #, c-format
@@ -4595,10 +4292,8 @@ msgstr "solicitando clave %s de %s servidor %s\n"
 msgid "requesting key %s from %s\n"
 msgstr "solicitando clave %s de %s\n"
 
-#, fuzzy
-#| msgid "no keyserver action!\n"
 msgid "no keyserver known\n"
-msgstr "¡no se solicita ninguna acción al servidor de claves!\n"
+msgstr "ningún servidor de claves conocido\n"
 
 #, c-format
 msgid "skipped \"%s\": %s\n"
@@ -4608,10 +4303,9 @@ msgstr "omitido \"%s\": %s\n"
 msgid "sending key %s to %s\n"
 msgstr "enviando clave %s a %s\n"
 
-#, fuzzy, c-format
-#| msgid "requesting key %s from %s\n"
+#, c-format
 msgid "requesting key from '%s'\n"
-msgstr "solicitando clave %s de %s\n"
+msgstr "solicitando clave de %s\n"
 
 #, c-format
 msgid "WARNING: unable to fetch URI %s: %s\n"
@@ -4638,7 +4332,7 @@ msgstr "datos cifrados con la clave pública: DEK correcta\n"
 
 #, c-format
 msgid "encrypted with %u-bit %s key, ID %s, created %s\n"
-msgstr "cifrado con clave %2$s de %1$u bits, ID %3$s, creada el %4$s\n"
+msgstr "cifrado con clave de %u bits %s, ID %s, creada el %s\n"
 
 #, c-format
 msgid "      \"%s\"\n"
@@ -4681,10 +4375,8 @@ msgstr "ATENCIÓN: ¡el mensaje cifrado ha sido manipulado!\n"
 msgid "decryption failed: %s\n"
 msgstr "descifrado fallido: %s\n"
 
-#, fuzzy
-#| msgid "NOTE: sender requested \"for-your-eyes-only\"\n"
 msgid "Note: sender requested \"for-your-eyes-only\"\n"
-msgstr "NOTA: el remitente solicitó \"sólo-para-tus-ojos\"\n"
+msgstr "Atención: el remitente solicitó \"sólo-para-tus-ojos\"\n"
 
 #, c-format
 msgid "original file name='%.*s'\n"
@@ -4729,10 +4421,9 @@ msgstr "               usando %s clave %s\n"
 msgid "Signature made %s using %s key ID %s\n"
 msgstr "Firmado el %s usando clave %s ID %s\n"
 
-#, fuzzy, c-format
-#| msgid "                aka \"%s\""
+#, c-format
 msgid "               issuer \"%s\"\n"
-msgstr "                alias \"%s\""
+msgstr "               emisor \"%s\"\n"
 
 msgid "Key available at: "
 msgstr "Clave disponible en: "
@@ -4744,11 +4435,9 @@ msgstr "[incierto]"
 msgid "                aka \"%s\""
 msgstr "                alias \"%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 ""
-"ATENCIÓN: ¡Esta clave no está certificada por una firma de confianza!\n"
+msgstr "ATENCIÓN: ¡Esta clave no se puede usar para firmar en modo %s!\n"
 
 #, c-format
 msgid "Signature expired %s\n"
@@ -4758,10 +4447,11 @@ msgstr "Firma caducada en %s\n"
 msgid "Signature expires %s\n"
 msgstr "La firma caduca el %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 de resumen %s\n"
+msgstr ""
+"firma %s, algoritmo de resumen %s%s%s\n"
+"\n"
 
 msgid "binary"
 msgstr "binaria"
@@ -4772,14 +4462,13 @@ msgstr "modotexto"
 msgid "unknown"
 msgstr "desconocido"
 
-#, fuzzy
-#| msgid "unknown pubkey algorithm"
 msgid ", key algorithm "
-msgstr "Algoritmo de clave pública desconocido"
+msgstr ", algoritmo de clave pública "
 
 #, c-format
 msgid "WARNING: not a detached signature; file '%s' was NOT verified!\n"
 msgstr ""
+"ADVERTENCIA: firma no separada; ¡el archivo %s NO ha sido verificado!\n"
 
 #, c-format
 msgid "Can't check signature: %s\n"
@@ -4799,10 +4488,9 @@ msgstr "firma independiente de clase 0x%02x\n"
 msgid "old style (PGP 2.x) signature\n"
 msgstr "firma al viejo estilo (PGP 2.x)\n"
 
-#, fuzzy, c-format
-#| msgid "fstat of `%s' failed in %s: %s\n"
+#, c-format
 msgid "fstat of '%s' failed in %s: %s\n"
-msgstr "fstat de `%s' falló en %s: %s\n"
+msgstr "fstat de '%s' falló en %s: %s\n"
 
 #, c-format
 msgid "fstat(%d) failed in %s: %s\n"
@@ -4827,23 +4515,20 @@ msgstr "AVISO: usando algoritmo de resumen experimental %s\n"
 msgid "WARNING: digest algorithm %s is deprecated\n"
 msgstr "AVISO: el algoritmo de resumen %s está obsoleto\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 de resumen %s\n"
+msgstr "Atención: las firmas que usan el algoritmo %s son rechazadas\n"
 
-#, fuzzy, c-format
-#| msgid "read error in `%s': %s\n"
+#, c-format
 msgid "(reported error: %s)\n"
-msgstr "error de lectura `%s': %s\n"
+msgstr "(error reportado: %s)\n"
 
-#, fuzzy, c-format
-#| msgid "read error in `%s': %s\n"
+#, c-format
 msgid "(reported error: %s <%s>)\n"
-msgstr "error de lectura `%s': %s\n"
+msgstr "(error reportado: %s <%s>)\n"
 
 msgid "(further info: "
-msgstr ""
+msgstr "(más información: "
 
 #, c-format
 msgid "%s:%d: deprecated option \"%s\"\n"
@@ -4861,16 +4546,16 @@ msgstr "por favor use \"%s%s\" en su lugar\n"
 msgid "WARNING: \"%s\" is a deprecated command - do not use it\n"
 msgstr "ATENCIÓN: \"%s\" es una orden obsoleta - no la use\n"
 
-#, fuzzy, c-format
-#| msgid "%s:%u: obsolete option \"%s\" - it has no effect\n"
+#, c-format
 msgid "%s:%u: \"%s\" is obsolete in this file - it only has effect in %s\n"
-msgstr "%s:%u: opción obsoleta \"%s\" - no tiene efecto\n"
+msgstr ""
+"%s:%u: opción obsoleta \"%s\"en este archivo - sólo tiene efecto en %s\n"
 
-#, fuzzy, c-format
-#| msgid "WARNING: \"%s\" is an obsolete option - it has no effect\n"
+#, c-format
 msgid ""
 "WARNING: \"%s%s\" is an obsolete option - it has no effect except on %s\n"
-msgstr "ATENCIÓN: \"%s\" es una opción obsoleta - no tiene efecto\n"
+msgstr ""
+"ATENCIÓN: \"%s%s\" es una opción obsoleta - no tiene efecto excepto en %s\n"
 
 msgid "Uncompressed"
 msgstr "Sin comprimir"
@@ -4883,30 +4568,25 @@ msgstr "sin_comprimir|ninguno"
 msgid "this message may not be usable by %s\n"
 msgstr "este mensaje podría no ser utilizable por %s\n"
 
-#, fuzzy, c-format
-#| msgid "ambiguous option `%s'\n"
+#, c-format
 msgid "ambiguous option '%s'\n"
-msgstr "opción ambigua `%s'\n"
+msgstr "opción ambigua '%s'\n"
 
-#, fuzzy, c-format
-#| msgid "unknown option `%s'\n"
+#, c-format
 msgid "unknown option '%s'\n"
-msgstr "opción desconocida `%s'\n"
+msgstr "opción desconocida '%s'\n"
 
-#, fuzzy
-#| msgid "DSA requires the hash length to be a multiple of 8 bits\n"
 msgid "ECDSA public key is expected to be in SEC encoding multiple of 8 bits\n"
-msgstr "DSA necesita un resumen cuya longitud sea múltiplo de 8 bits\n"
+msgstr ""
+"Una clave pública ECDSA debe estar en un encoding SEC múltiplo de 8 bits\n"
 
-#, fuzzy, c-format
-#| msgid "Unknown signature type `%s'\n"
+#, c-format
 msgid "unknown weak digest '%s'\n"
-msgstr "Clase de firma desconocida `%s'\n"
+msgstr "algoritmo débil de resumen desconocido '%s'\n"
 
-#, fuzzy, c-format
-#| msgid "File `%s' exists. "
+#, c-format
 msgid "File '%s' exists. "
-msgstr "El fichero `%s' ya existe. "
+msgstr "El fichero '%s' ya existe. "
 
 msgid "Overwrite? (y/N) "
 msgstr "¿Sobreescribir? (s/N) "
@@ -4921,10 +4601,9 @@ msgstr "Introduzca nuevo nombre de fichero"
 msgid "writing to stdout\n"
 msgstr "escribiendo en stdout\n"
 
-#, fuzzy, c-format
-#| msgid "assuming signed data in `%s'\n"
+#, c-format
 msgid "assuming signed data in '%s'\n"
-msgstr "asumiendo que hay datos firmados en `%s'\n"
+msgstr "asumiendo que los datos firmados están en '%s'\n"
 
 #, c-format
 msgid "can't handle public key algorithm %d\n"
@@ -4950,47 +4629,40 @@ msgstr "cancelado por el usuario\n"
 
 #, c-format
 msgid " (main key ID %s)"
-msgstr "(ID de clave primaria %s)"
+msgstr " (ID de clave primaria %s)"
 
-#, fuzzy
-#| msgid "Please enter the passphrase to unprotect the PKCS#12 object."
 msgid "Please enter the passphrase to unlock the OpenPGP secret key:"
-msgstr "Introduzca frase contraseña para desproteger el objeto PKCS#12."
+msgstr "Introduzca frase contraseña para desbloquear la clave secreta OpenPGP:"
 
-#, fuzzy
-#| msgid "Please enter the passphrase to protect the new PKCS#12 object."
 msgid "Please enter the passphrase to import the OpenPGP secret key:"
-msgstr "Introduzca frase contraseña para proteger el nuevo objeto PKCS#12."
+msgstr "Introduzca frase contraseña para importar la clave secreta OpenPGP:"
 
-#, fuzzy
-#| msgid "Please enter the passphrase to protect the new PKCS#12 object."
 msgid "Please enter the passphrase to export the OpenPGP secret subkey:"
-msgstr "Introduzca frase contraseña para proteger el nuevo objeto PKCS#12."
+msgstr "Introduzca frase contraseña para exportar la subclave secreta OpenPGP:"
 
-#, fuzzy
-#| msgid "Please enter the passphrase to protect the new PKCS#12 object."
 msgid "Please enter the passphrase to export the OpenPGP secret key:"
-msgstr "Introduzca frase contraseña para proteger el nuevo objeto PKCS#12."
+msgstr "Introduzca frase contraseña para exportar la clave secreta OpenPGP:"
 
-#, fuzzy
-#| msgid "Do you really want to delete the selected keys? (y/N) "
 msgid "Do you really want to permanently delete the OpenPGP secret subkey key:"
-msgstr "¿De verdad quiere borrar las claves seleccionadas? (s/N) "
+msgstr ""
+"De verdad quiere borrar para siempre la subclave secreta de la clave OpenPGP:"
 
-#, fuzzy
-#| msgid "Do you really want to delete the selected keys? (y/N) "
 msgid "Do you really want to permanently delete the OpenPGP secret key:"
-msgstr "¿De verdad quiere borrar las claves seleccionadas? (s/N) "
+msgstr "De verdad quiere borrar para siempre la clave secreta OpenPGP:"
 
-#, fuzzy, c-format
-#| msgid "%u-bit %s key, ID %s, created %s"
+#, c-format
 msgid ""
 "%s\n"
 "\"%.*s\"\n"
 "%u-bit %s key, ID %s,\n"
 "created %s%s.\n"
 "%s"
-msgstr "clave %2$s de %1$u bits, ID %3$s, creada el %4$s"
+msgstr ""
+"%s\n"
+"\"%.*s\"\n"
+"clave de %u-bit %s, ID %s,\n"
+"creada el %s%s.\n"
+"%s"
 
 msgid ""
 "\n"
@@ -5008,10 +4680,9 @@ msgstr ""
 msgid "Enter JPEG filename for photo ID: "
 msgstr "Introduzca nombre del fichero JPEG para ID fotográfico: "
 
-#, fuzzy, c-format
-#| msgid "unable to open JPEG file `%s': %s\n"
+#, c-format
 msgid "unable to open JPEG file '%s': %s\n"
-msgstr "Imposible abrir fichero JPEG `%s': %s\n"
+msgstr "Imposible abrir fichero JPEG '%s': %s\n"
 
 #, c-format
 msgid "This JPEG is really large (%d bytes) !\n"
@@ -5020,10 +4691,9 @@ msgstr "¡Este JPEG es realmente grande (%d bytes)!\n"
 msgid "Are you sure you want to use it? (y/N) "
 msgstr "¿Seguro que quiere usarlo? (s/N) "
 
-#, fuzzy, c-format
-#| msgid "`%s' is not a JPEG file\n"
+#, c-format
 msgid "'%s' is not a JPEG file\n"
-msgstr "`%s' no es un fichero JPEG\n"
+msgstr "'%s' no es un fichero JPEG\n"
 
 msgid "Is this photo correct (y/N/q)? "
 msgstr "¿Es correcta la foto? (s/n) "
@@ -5035,7 +4705,7 @@ msgid "No reason specified"
 msgstr "No se dio ninguna razón"
 
 msgid "Key is superseded"
-msgstr "La clave ha sido reemplazada."
+msgstr "La clave ha sido reemplazada"
 
 msgid "Key has been compromised"
 msgstr "La clave ha sido comprometida"
@@ -5080,15 +4750,15 @@ msgstr ""
 
 #, c-format
 msgid "  %d = I don't know or won't say\n"
-msgstr " %d = No lo sé o prefiero no decirlo\n"
+msgstr "  %d = No lo sé o prefiero no decirlo\n"
 
 #, c-format
 msgid "  %d = I do NOT trust\n"
-msgstr " %d = NO tengo confianza\n"
+msgstr "  %d = NO tengo confianza\n"
 
 #, c-format
 msgid "  %d = I trust ultimately\n"
-msgstr " %d = confío absolutamente\n"
+msgstr "  %d = confío absolutamente\n"
 
 msgid "  m = back to the main menu\n"
 msgstr "  m = volver al menú principal\n"
@@ -5134,23 +4804,17 @@ msgstr "Esta clave probablemente pertenece al usuario que se nombra\n"
 msgid "This key belongs to us\n"
 msgstr "Esta clave nos pertenece\n"
 
-#, fuzzy, c-format
-#| msgid "root certificate has now been marked as trusted\n"
+#, c-format
 msgid "%s: This key is bad!  It has been marked as untrusted!\n"
-msgstr "certificado raíz marcado ahora como fiable\n"
+msgstr "%s: ¡Esta clave es mala! ¡Está marcada como no confiable!\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"
 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 ""
-"No es seguro que la clave pertenezca a la persona que se nombra en el\n"
-"identificador de usuario. Si *realmente* sabe lo que está haciendo,\n"
+" ¡Esta clave es mala! ¡Está marcada como no confiable! Si *realmente* sabe "
+"lo que está haciendo,\n"
 "puede contestar sí a la siguiente pregunta.\n"
 
 msgid ""
@@ -5188,15 +4852,13 @@ msgstr "ATENCIÓN: ¡Esta clave ha sido revocada por su propietario!\n"
 msgid "Note: This key has been disabled.\n"
 msgstr "Nota: Esta clave está deshabilitada.\n"
 
-#, fuzzy, c-format
-#| msgid "Note: Verified signer's address is `%s'\n"
+#, c-format
 msgid "Note: Verified signer's address is '%s'\n"
-msgstr "Nota: la dirección del firmante verificado es `%s'\n"
+msgstr "Nota: la dirección del firmante verificado es '%s'\n"
 
-#, fuzzy, c-format
-#| msgid "Note: Signer's address `%s' does not match DNS entry\n"
+#, c-format
 msgid "Note: Signer's address '%s' does not match DNS entry\n"
-msgstr "Nota: la dirección del firmante `%s' no coincide con la entrada DNS\n"
+msgstr "Nota: la dirección del firmante '%s' no coincide con la entrada DNS\n"
 
 msgid "trustlevel adjusted to FULL due to valid PKA info\n"
 msgstr "nivel de confianza puesto a TOTAL (información PKA válida)\n"
@@ -5213,13 +4875,13 @@ msgstr ""
 
 msgid ""
 "         There is no indication that the signature belongs to the owner.\n"
-msgstr "          No hay indicios de que la firma pertenezca al propietario.\n"
+msgstr "         No hay indicios de que la firma pertenezca al propietario.\n"
 
 msgid "WARNING: We do NOT trust this key!\n"
 msgstr "ATENCIÓN: ¡Esta clave NO es de confianza!\n"
 
 msgid "         The signature is probably a FORGERY.\n"
-msgstr "          La firma es probablemente una FALSIFICACIÓN.\n"
+msgstr "         La firma es probablemente una FALSIFICACIÓN.\n"
 
 msgid ""
 "WARNING: This key is not certified with sufficiently trusted signatures!\n"
@@ -5228,7 +4890,7 @@ msgstr ""
 "confianza!\n"
 
 msgid "         It is not certain that the signature belongs to the owner.\n"
-msgstr "          No es seguro que la firma pertenezca al propietario.\n"
+msgstr "         No es seguro que la firma pertenezca al propietario.\n"
 
 #, c-format
 msgid "%s: skipped: %s\n"
@@ -5242,20 +4904,23 @@ msgstr "%s: omitida: clave pública deshabilitada\n"
 msgid "%s: skipped: public key already present\n"
 msgstr "%s: omitida: clave pública ya presente\n"
 
-#, fuzzy, c-format
-#| msgid "can't connect to `%s': %s\n"
+#, c-format
 msgid "can't encrypt to '%s'\n"
-msgstr "no se puede conectar con `%s': %s\n"
+msgstr ""
+"no se puede cifrar a '%s'\n"
+"\n"
 
-#, fuzzy, c-format
-#| msgid "line %d: invalid algorithm\n"
+#, c-format
 msgid "option '%s' given, but no valid default keys given\n"
-msgstr "línea %d: algoritmo inválido\n"
+msgstr ""
+"se ha dado la opción %s, pero no se han dado claves predeterminadas válidas\n"
+"\n"
 
-#, fuzzy, c-format
-#| msgid "line %d: invalid algorithm\n"
+#, c-format
 msgid "option '%s' given, but option '%s' not given\n"
-msgstr "línea %d: algoritmo inválido\n"
+msgstr ""
+"se ha dado la opción %s, pero no se ha dado la opción '%s'\n"
+"\n"
 
 msgid "You did not specify a user ID. (you may use \"-r\")\n"
 msgstr "No ha especificado un ID de usuario (puede usar \"-r\")\n"
@@ -5312,19 +4977,17 @@ msgstr "leyendo stdin...\n"
 msgid "no signed data\n"
 msgstr "no hay datos firmados\n"
 
-#, fuzzy, c-format
-#| msgid "can't open signed data `%s'\n"
+#, c-format
 msgid "can't open signed data '%s'\n"
-msgstr "imposible abrir datos firmados `%s'\n"
+msgstr "imposible abrir datos firmados '%s'\n"
 
 #, c-format
 msgid "can't open signed data fd=%d: %s\n"
 msgstr "imposible abrir datos firmados fd=%d: %s\n"
 
-#, fuzzy, c-format
-#| msgid "certificate is not usable for encryption\n"
+#, c-format
 msgid "key %s is not suitable for decryption in %s mode\n"
-msgstr "el certificado no es utilizable para cifrar\n"
+msgstr "la clave %s no se puede usar para cifrar en modo %s\n"
 
 #, c-format
 msgid "anonymous recipient; trying secret key %s ...\n"
@@ -5344,13 +5007,10 @@ msgstr "algoritmo de cifrado %d%s desconocido o desactivado\n"
 msgid "WARNING: cipher algorithm %s not found in recipient preferences\n"
 msgstr "NOTA: el cifrado %s no aparece en las preferencias del receptor\n"
 
-#, fuzzy, c-format
-#| msgid "NOTE: secret key %s expired at %s\n"
+#, c-format
 msgid "Note: secret key %s expired at %s\n"
 msgstr "NOTA: clave secreta %s caducó el %s\n"
 
-#, fuzzy
-#| msgid "NOTE: key has been revoked"
 msgid "Note: key has been revoked"
 msgstr "NOTA: la clave ha sido revocada"
 
@@ -5368,13 +5028,11 @@ msgstr "Será revocado por:\n"
 msgid "(This is a sensitive revocation key)\n"
 msgstr "(Este es una clave de revocación confidencial)\n"
 
-#, fuzzy
-#| msgid "Secret key is available.\n"
 msgid "Secret key is not available.\n"
-msgstr "Clave secreta disponible.\n"
+msgstr "Clave secreta no disponible.\n"
 
 msgid "Create a designated revocation certificate for this key? (y/N) "
-msgstr "¿Crear un certificado de revocación para esta clave? (s/N)"
+msgstr "¿Crear un certificado de revocación para esta clave? (s/N) "
 
 msgid "ASCII armored output forced.\n"
 msgstr "se fuerza salida con armadura ASCII.\n"
@@ -5388,18 +5046,20 @@ msgstr "Certificado de revocación creado.\n"
 
 #, c-format
 msgid "no revocation keys found for \"%s\"\n"
-msgstr "no se encuetran claves de revocación para \"%s\"\n"
+msgstr "no se encuentran claves de revocación para \"%s\"\n"
 
-#, fuzzy
-#| msgid "Create a revocation certificate for this key? (y/N) "
 msgid "This is a revocation certificate for the OpenPGP key:"
-msgstr "¿Crear un certificado de revocación para esta clave? (s/N) "
+msgstr "Este es un certificado de revocación para la clave 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 certificado de revocación es una especie de \"interruptor general\" para "
+"declarar\n"
+"públicamente que una clave no debería usarse más. No es posible deshacer\n"
+"un certificado de este tipo una vez que se publica."
 
 msgid ""
 "Use it to revoke this key in case of a compromise or loss of\n"
@@ -5408,34 +5068,42 @@ msgid ""
 "a reason for the revocation.  For details see the description of\n"
 "of the gpg command \"--generate-revocation\" in the GnuPG manual."
 msgstr ""
+"Úsalo para revocar esta clave en caso de un compromiso o pérdida de\n"
+"la clave secreta. De cualquier modo, si la clave secreta está disponible,\n"
+"es mejor generar un nuevo certificado de revocación y dar una razón para la "
+"misma\n"
+"Para más detalles, lee la descripción de la orden gpg \"--generate-revocation"
+"\"\n"
+"en el manual 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 ""
+"Para prevenir el uso accidental de este archivo se han insertado dos\n"
+"puntos (:) antes de los 5 guiones debajo. Remueve estos dos puntos\n"
+"con un editor de texto antes de importar y publicar este certificado\n"
+"de revocación."
 
-#, fuzzy, c-format
-#| msgid "Revocation certificate created.\n"
+#, c-format
 msgid "revocation certificate stored as '%s.rev'\n"
-msgstr "Certificado de revocación creado.\n"
+msgstr "certificado de revocación guardado como '%s.rev'\n"
 
-#, fuzzy, c-format
-#| msgid "secret key \"%s\" not found: %s\n"
+#, c-format
 msgid "secret key \"%s\" not found\n"
-msgstr "clave secreta \"%s\" no encontrada: %s\n"
+msgstr "clave secreta \"%s\" no encontrada\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' coincide con varias claves secretas:\n"
 
-#, fuzzy, c-format
-#| msgid "error creating keyring `%s': %s\n"
+#, c-format
 msgid "error searching the keyring: %s\n"
-msgstr "error escribiendo anillo `%s': %s\n"
+msgstr "error buscando el anillo de claves: %s\n"
 
 msgid "Create a revocation certificate for this key? (y/N) "
 msgstr "¿Crear un certificado de revocación para esta clave? (s/N) "
@@ -5490,23 +5158,22 @@ msgstr ""
 "¡imposible evitar clave débil para cifrado simétrico después de %d "
 "intentos!\n"
 
-#, fuzzy, c-format
-#| msgid "%s key uses an unsafe (%u bit) hash\n"
+#, c-format
 msgid "%s key %s uses an unsafe (%zu bit) hash\n"
-msgstr "la clave %s usa un hash inseguro (de %u bits)\n"
+msgstr "la clave %s %s usa un hash inseguro (de %zu bits)\n"
 
-#, fuzzy, c-format
-#| msgid "DSA key %s requires a %u bit or larger hash\n"
+#, c-format
 msgid "%s key %s requires a %zu bit or larger hash (hash is %s)\n"
-msgstr "la clave DSA %s requiere un resumen de %u bits al menos\n"
+msgstr ""
+"la clave %s %s requiere un resumen de %zu bits o mayor (el resumen es de "
+"%s)\n"
 
 msgid "WARNING: signature digest conflict in message\n"
 msgstr "AVISO: conflicto con el resumen de la firma del mensaje\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 "no puede usar %s en modo %s\n"
+msgstr "no puede usar la clave %s para firmar en modo %s\n"
 
 #, c-format
 msgid "WARNING: signing subkey %s is not cross-certified\n"
@@ -5521,23 +5188,19 @@ msgid "WARNING: signing subkey %s has an invalid cross-certification\n"
 msgstr ""
 "AVISO: la subclave de cifrado %s tiene un certificado cruzado inválido\n"
 
-#, fuzzy, c-format
-#| msgid "public key %s is %lu second newer than the signature\n"
+#, 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 clave pública %s es %lu segundos más nueva que la firma\n"
+msgstr[0] "la clave pública %s es %lu segundo más nueva que la firma\n"
 msgstr[1] "la clave pública %s es %lu segundos más nueva que la firma\n"
 
-#, fuzzy, c-format
-#| msgid "public key %s is %lu second newer than the signature\n"
+#, 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 clave pública %s es %lu segundos más nueva que la firma\n"
-msgstr[1] "la clave pública %s es %lu segundos más nueva que la firma\n"
+msgstr[0] "la clave pública %s es %lu día más nueva que la firma\n"
+msgstr[1] "la clave pública %s es %lu días más nueva que la firma\n"
 
-#, fuzzy, c-format
-#| msgid ""
-#| "key %s was created %lu second in the future (time warp or clock problem)\n"
+#, c-format
 msgid ""
 "key %s was created %lu second in the future (time warp or clock problem)\n"
 msgid_plural ""
@@ -5546,12 +5209,10 @@ msgstr[0] ""
 "la clave %s fue creada %lu segundo en el futuro (viaje en el tiempo\n"
 "o problemas con el reloj)\n"
 msgstr[1] ""
-"la clave %s fue creada %lu segundo en el futuro (viaje en el tiempo\n"
+"la clave %s fue creada %lu segundos en el futuro (viaje en el tiempo\n"
 "o problemas con el reloj)\n"
 
-#, fuzzy, c-format
-#| msgid ""
-#| "key %s was created %lu second in the future (time warp or clock problem)\n"
+#, 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"
@@ -5559,16 +5220,14 @@ msgstr[0] ""
 "la clave %s fue creada %lu segundo en el futuro (viaje en el tiempo\n"
 "o problemas con el reloj)\n"
 msgstr[1] ""
-"la clave %s fue creada %lu segundo en el futuro (viaje en el tiempo\n"
+"la clave %s fue creada %lu segundos en el futuro (viaje en el tiempo\n"
 "o problemas con el reloj)\n"
 
-#, fuzzy, c-format
-#| msgid "NOTE: signature key %s expired %s\n"
+#, c-format
 msgid "Note: signature key %s expired %s\n"
-msgstr "NOTA: clave de la firma %s caducada el %s\n"
+msgstr "NOTA: clave de firmado %s caducada el %s\n"
 
-#, fuzzy, c-format
-#| msgid "NOTE: signature key %s has been revoked\n"
+#, c-format
 msgid "Note: signature key %s has been revoked\n"
 msgstr "NOTA: la clave de firmado %s ha sido revocada\n"
 
@@ -5593,13 +5252,14 @@ msgstr "clave %s: no hay subclave para firma de subclave de enlace\n"
 #, c-format
 msgid "WARNING: unable to %%-expand notation (too large).  Using unexpanded.\n"
 msgstr ""
-"AVISO: no puedo expandir el %% de la url de política . Se usa sin expandir.\n"
+"AVISO: no puedo expandir el %%- de la url de política . Se usa sin "
+"expandir.\n"
 
 #, c-format
 msgid ""
 "WARNING: unable to %%-expand policy URL (too large).  Using unexpanded.\n"
 msgstr ""
-"AVISO: no puedo expandir el %% de la url de política (demasiado larga).\n"
+"AVISO: no puedo expandir el %%- de la url de política (demasiado larga).\n"
 "Se usa sin expandir.\n"
 
 #, c-format
@@ -5607,7 +5267,7 @@ msgid ""
 "WARNING: unable to %%-expand preferred keyserver URL (too large).  Using "
 "unexpanded.\n"
 msgstr ""
-"AVISO: no puedo expandir el %% de la URL del servidor de claves\n"
+"AVISO: no puedo expandir el %%- de la URL del servidor de claves\n"
 "preferido. Se usa sin expandir.\n"
 
 #, c-format
@@ -5654,10 +5314,9 @@ msgstr ""
 "# Lista de valores de confianza asignados, creada %s\n"
 "# (Use \"gpg --import-ownertrust\" para restablecerlos)\n"
 
-#, fuzzy, c-format
-#| msgid "error in `%s': %s\n"
+#, c-format
 msgid "error in '%s': %s\n"
-msgstr "error en `%s': %s\n"
+msgstr "error en '%s': %s\n"
 
 msgid "line too long"
 msgstr "línea demasiado larga"
@@ -5666,34 +5325,30 @@ msgid "colon missing"
 msgstr "falta una coma"
 
 msgid "invalid fingerprint"
-msgstr "huella dactilar no válida"
+msgstr "huella digital no válida"
 
 msgid "ownertrust value missing"
 msgstr "falta el valor de confianza"
 
-#, fuzzy, c-format
-#| msgid "error finding trust record in `%s': %s\n"
+#, c-format
 msgid "error finding trust record in '%s': %s\n"
-msgstr "error econtrando registro de confianza en `%s': %s\n"
+msgstr "error intentando encontrar el registro de confianza en '%s': %s\n"
 
-#, fuzzy, c-format
-#| msgid "read error in `%s': %s\n"
+#, c-format
 msgid "read error in '%s': %s\n"
-msgstr "error de lectura `%s': %s\n"
+msgstr "error de lectura '%s': %s\n"
 
 #, c-format
 msgid "trustdb: sync failed: %s\n"
 msgstr "base de datos de confianza: fallo sincronización: %s\n"
 
-#, fuzzy, c-format
-#| msgid "can't create lock for `%s'\n"
+#, c-format
 msgid "can't create lock for '%s'\n"
-msgstr "no se puede crear el bloqueo para `%s'\n"
+msgstr "no se puede crear el bloqueo para '%s'\n"
 
-#, fuzzy, c-format
-#| msgid "can't lock `%s'\n"
+#, c-format
 msgid "can't lock '%s'\n"
-msgstr "no se puede bloquear `%s'\n"
+msgstr "no se puede bloquear '%s'\n"
 
 #, c-format
 msgid "trustdb rec %lu: lseek failed: %s\n"
@@ -5711,10 +5366,9 @@ msgstr "transacción en la base de datos de confianza demasiado grande\n"
 msgid "%s: directory does not exist!\n"
 msgstr "%s: ¡el directorio no existe!\n"
 
-#, fuzzy, c-format
-#| msgid "can't access `%s': %s\n"
+#, c-format
 msgid "can't access '%s': %s\n"
-msgstr "no se puede acceder a `%s': %s\n"
+msgstr "no se puede acceder a '%s': %s\n"
 
 #, c-format
 msgid "%s: failed to create version record: %s"
@@ -5728,8 +5382,6 @@ msgstr "%s: se ha creado base de datos de confianza inválida\n"
 msgid "%s: trustdb created\n"
 msgstr "%s: se ha creado base de datos de confianza\n"
 
-#, fuzzy
-#| msgid "NOTE: trustdb not writable\n"
 msgid "Note: trustdb not writable\n"
 msgstr "NOTA: no se puede escribir base de datos de confianza\n"
 
@@ -5747,7 +5399,7 @@ msgstr "%s: error actualizando el registro de versión: %s\n"
 
 #, c-format
 msgid "%s: error reading version record: %s\n"
-msgstr "%s: error leyendo registro de versión: %s\n"
+msgstr "%s: error al leer registro de versión: %s\n"
 
 #, c-format
 msgid "%s: error writing version record: %s\n"
@@ -5775,7 +5427,7 @@ msgstr "%s: versión del fichero %d inválida\n"
 
 #, c-format
 msgid "%s: error reading free record: %s\n"
-msgstr "%s: error leyendo registro libre: %s\n"
+msgstr "%s: error al leer registro libre: %s\n"
 
 #, c-format
 msgid "%s: error writing dir record: %s\n"
@@ -5800,147 +5452,142 @@ msgstr "no se pueden manejar líneas de texto de más de %d caracteres\n"
 msgid "input line longer than %d characters\n"
 msgstr "línea de longitud superior a %d caracteres\n"
 
-#, fuzzy, c-format
-#| msgid "error sending standard options: %s\n"
+#, c-format
 msgid "error beginning transaction on TOFU database: %s\n"
-msgstr "error enviando opciones estándar: %s\n"
+msgstr "error al comenzar transacción con la base de datos TOFU: %s\n"
 
 #, c-format
 msgid "error committing transaction on TOFU database: %s\n"
-msgstr ""
+msgstr "error al guardar la transacción en la base de datos TOFU: %s\n"
 
 #, c-format
 msgid "error rolling back transaction on TOFU database: %s\n"
-msgstr ""
+msgstr "error al deshacer la transacción en la base de datos TOFU: %s\n"
 
-#, fuzzy, c-format
-#| msgid "unsupported algorithm: %s"
+#, c-format
 msgid "unsupported TOFU database version: %s\n"
-msgstr "algoritmo no disponible: %s"
+msgstr "version de base de datos TOFU no soportada: %s\n"
 
-#, fuzzy, c-format
-#| msgid "error creating temporary file: %s\n"
+#, c-format
 msgid "error creating 'ultimately_trusted_keys' TOFU table: %s\n"
-msgstr "error creando fichero temporal: %s\n"
+msgstr "error al crear tabla TOFU de 'claves confiadas': %s\n"
 
 msgid "TOFU DB error"
-msgstr ""
+msgstr "Error de la base de datos de TOFU"
 
-#, fuzzy, c-format
-#| msgid "error sending %s command: %s\n"
+#, c-format
 msgid "error reading TOFU database: %s\n"
-msgstr "error enviando orden %s: %s\n"
+msgstr "error al leer la base de datos 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 "error escribiendo anillo privado `%s': %s\n"
+msgstr "error al intentar determinar la versión de la base de datos 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: error escribiendo registro de directorio: %s\n"
+msgstr "error iniciando base de datos TOFU: %s\n"
 
-#, fuzzy, c-format
-#| msgid "error sending %s command: %s\n"
+#, c-format
 msgid "error creating 'encryptions' TOFU table: %s\n"
-msgstr "error enviando orden %s: %s\n"
+msgstr "error al crear la tabla TOFU 'encryptions': %s\n"
 
 #, c-format
 msgid "adding column effective_policy to bindings DB: %s\n"
 msgstr ""
+"agregando la columna effective_policy a la base de datos bindings: %s\n"
 
-#, fuzzy, c-format
-#| msgid "error opening `%s': %s\n"
+#, c-format
 msgid "error opening TOFU database '%s': %s\n"
-msgstr "error abriendo `%s': %s\n"
+msgstr "error al abrir base de datos TOFU '%s': %s\n"
 
-#, fuzzy, c-format
-#| msgid "error sending %s command: %s\n"
+#, c-format
 msgid "error updating TOFU database: %s\n"
-msgstr "error enviando orden %s: %s\n"
+msgstr "error al actualizar la base de datos TOFU: %s\n"
 
 #, c-format
 msgid ""
 "This is the first time the email address \"%s\" is being used with key %s."
 msgstr ""
+"Esta es la primera vez que la dirección de email \"%s\" se usa con la clave "
+"%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] ""
+"¡La dirección de correo electrónico \"%s\" está asociada a %d claves!"
 msgstr[1] ""
+"¡La dirección de correo electrónico \"%s\" está asociada a %d claves!"
 
 msgid "  Since this binding's policy was 'auto', it has been changed to 'ask'."
 msgstr ""
+"  Como esta política de binding era 'auto', se ha cambiado a 'preguntar'."
 
 #, c-format
 msgid ""
 "Please indicate whether this email address should be associated with key %s "
 "or whether you think someone is impersonating \"%s\"."
 msgstr ""
+"Indica si esta dirección de correo electrónico debería ser asociada a la "
+"clave %s, o si por el contrario crees que es alguien tratando de hacerse "
+"pasar por \"%s\"."
 
-#, fuzzy, c-format
-#| msgid "error getting new PIN: %s\n"
+#, c-format
 msgid "error gathering other user IDs: %s\n"
-msgstr "error obteniendo nuevo PIN: %s\n"
+msgstr "error al obtener otras ID de usuario: %s\n"
 
-#, fuzzy
-#| msgid "list key and user IDs"
 msgid "This key's user IDs:\n"
-msgstr "lista clave e identificadores de usuario"
+msgstr "Las ID de usuario de esta clave:\n"
 
-#, fuzzy, c-format
-#| msgid "Policy: "
+#, c-format
 msgid "policy: %s"
-msgstr "Política: "
+msgstr "política: %s"
 
-#, fuzzy, c-format
-#| msgid "error getting stored flags: %s\n"
+#, c-format
 msgid "error gathering signature stats: %s\n"
-msgstr "error obteniendo parámetros almacenados: %s\n"
+msgstr "error al obtener estadísticas de las firmas: %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] ""
+"La dirección de correo electrónico \"%s\" está asociada a %d clave:\n"
 msgstr[1] ""
+"La dirección de correo electrónico \"%s\" está asociada a %d claves:\n"
 
 #, c-format
 msgid "Statistics for keys with the email address \"%s\":\n"
 msgstr ""
+"Estadísticas para las claves con la dirección de correo electrónico \"%s\":\n"
 
-#, fuzzy
-#| msgid "list keys"
 msgid "this key"
-msgstr "lista claves"
+msgstr "esta clave"
 
-#, fuzzy, c-format
-#| msgid "print message digests"
+#, c-format
 msgid "Verified %d message."
 msgid_plural "Verified %d messages."
-msgstr[0] "imprime resúmenes de mensaje"
-msgstr[1] "imprime resúmenes de mensaje"
+msgstr[0] "Verificado %d mensaje."
+msgstr[1] "Verificados %d mensajes."
 
-#, fuzzy, c-format
+#, c-format
 msgid "Encrypted %d message."
 msgid_plural "Encrypted %d messages."
-msgstr[0] "el algoritmo de resumen seleccionado no es válido\n"
-msgstr[1] "el algoritmo de resumen seleccionado no es válido\n"
+msgstr[0] "Cifrado %d mensaje."
+msgstr[1] "Cifrados %d mensajes."
 
-#, fuzzy, c-format
-#| msgid "print message digests"
+#, c-format
 msgid "Verified %d message in the future."
 msgid_plural "Verified %d messages in the future."
-msgstr[0] "imprime resúmenes de mensaje"
-msgstr[1] "imprime resúmenes de mensaje"
+msgstr[0] "Verificado %d mensaje en el futuro."
+msgstr[1] "Verificados %d mensajes en el futuro."
 
-#, fuzzy, c-format
+#, c-format
 msgid "Encrypted %d message in the future."
 msgid_plural "Encrypted %d messages in the future."
-msgstr[0] "el algoritmo de resumen seleccionado no es válido\n"
-msgstr[1] "el algoritmo de resumen seleccionado no es válido\n"
+msgstr[0] "Cifrado %d mensaje en el futuro."
+msgstr[1] "Cifrados %d mensajes en el futuro."
 
+# this string and the following ones are not easy to translate to spanish. is the string of the answer always meaning plural thins, or it can say 1week apart of 7weeks? if so, we in Spanish need to change the translation of 'last'...
 #, c-format
 msgid "Messages verified over the past %d day: %d."
 msgid_plural "Messages verified over the past %d days: %d."
@@ -5979,135 +5626,132 @@ msgstr[1] ""
 
 #, c-format
 msgid "Messages verified in the past: %d."
-msgstr ""
+msgstr "Mensajes verificados en el pasado: %d."
 
-#, fuzzy, c-format
+#, c-format
 msgid "Messages encrypted in the past: %d."
-msgstr "el algoritmo de resumen seleccionado no es válido\n"
+msgstr "Mensajes cifrados en el pasado: %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 detectado un conflicto de 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 "bBaAdDrRmM"
 
 msgid "(G)ood, (A)ccept once, (U)nknown, (R)eject once, (B)ad? "
 msgstr ""
+"(B)ien, (A)ceptar esta vez, (D)esconocido, (R)echazar esta vez, (M)ala? "
 
 msgid "Defaulting to unknown.\n"
-msgstr ""
+msgstr "Por defecto elegiremos desconocido.\n"
 
 msgid "TOFU db corruption detected.\n"
-msgstr ""
+msgstr "Detectada corrupción en la base de datos TOFU.\n"
 
-#, fuzzy, c-format
-#| msgid "error writing key: %s\n"
+#, c-format
 msgid "resetting keydb: %s\n"
-msgstr "error escribiendo clave: %s\n"
+msgstr "reiniciando base de datos de claves: %s\n"
 
-#, fuzzy, c-format
-#| msgid "error storing flags: %s\n"
+#, c-format
 msgid "error setting TOFU binding's policy to %s\n"
-msgstr "error almacenando parámetros: %s\n"
+msgstr "error al establecer la política de binding TOFU a %s\n"
 
-#, fuzzy, c-format
-#| msgid "error creating a pipe: %s\n"
+#, c-format
 msgid "error changing TOFU policy: %s\n"
-msgstr "error creando tubería: %s\n"
+msgstr "error al cambiar la política TOFU: %s\n"
 
 #, c-format
 msgid "%lld~year"
 msgid_plural "%lld~years"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%lld~año"
+msgstr[1] "%lld~años"
 
 #, c-format
 msgid "%lld~month"
 msgid_plural "%lld~months"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%lld~mes"
+msgstr[1] "%lld~meses"
 
 #, c-format
 msgid "%lld~week"
 msgid_plural "%lld~weeks"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%lld~semana"
+msgstr[1] "%lld~semanas"
 
 #, c-format
 msgid "%lld~day"
 msgid_plural "%lld~days"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%lld~día"
+msgstr[1] "%lld~días"
 
 #, c-format
 msgid "%lld~hour"
 msgid_plural "%lld~hours"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%lld~hora"
+msgstr[1] "%lld~horas"
 
 #, c-format
 msgid "%lld~minute"
 msgid_plural "%lld~minutes"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%lld~minuto"
+msgstr[1] "%lld~minutos"
 
-#, fuzzy, c-format
-#| msgid "second"
+#, c-format
 msgid "%lld~second"
 msgid_plural "%lld~seconds"
-msgstr[0] "segundo"
-msgstr[1] "segundo"
+msgstr[0] "%lld~segundo"
+msgstr[1] "%lld~segundos"
 
 #, c-format
 msgid "%s: Verified 0~signatures and encrypted 0~messages."
-msgstr ""
+msgstr "%s: Verificadas 0~firmas y cifrados 0~mensajes."
 
-#, fuzzy, c-format
-#| msgid "Deleted %d signatures.\n"
+#, c-format
 msgid "%s: Verified 0 signatures."
-msgstr "%d firmas borradas\n"
+msgstr "%s: Verificadas 0 firmas."
 
-#, fuzzy, c-format
-#| msgid "print message digests"
+#, c-format
 msgid "%s: Verified %ld~signature in the past %s."
 msgid_plural "%s: Verified %ld~signatures in the past %s."
-msgstr[0] "imprime resúmenes de mensaje"
-msgstr[1] "imprime resúmenes de mensaje"
+msgstr[0] "%s: Verificada %ld~firma en %s."
+msgstr[1] "%s: Verificadas %ld~firmas en %s."
 
-#, fuzzy
 msgid "Encrypted 0 messages."
-msgstr "el algoritmo de resumen seleccionado no es válido\n"
+msgstr "Cifrados 0 mensajes."
 
-#, fuzzy, c-format
+#, c-format
 msgid "Encrypted %ld~message in the past %s."
 msgid_plural "Encrypted %ld~messages in the past %s."
-msgstr[0] "el algoritmo de resumen seleccionado no es válido\n"
-msgstr[1] "el algoritmo de resumen seleccionado no es válido\n"
+msgstr[0] "Cifrado %ld~mensaje en los últimos %s."
+msgstr[1] "Cifrados %ld~mensajes en los últimos %s."
 
-#, fuzzy, c-format
-#| msgid "Policy: "
+#, c-format
 msgid "(policy: %s)"
-msgstr "Política: "
+msgstr "(política: %s)"
 
 msgid ""
 "Warning: we have yet to see a message signed using this key and user id!\n"
 msgstr ""
+"Advertencia: ¡Todavía no hemos visto ningún mensaje firmado con esta clave e "
+"identificador de usuario/a!\n"
 
 msgid ""
 "Warning: we've only seen one message signed using this key and user id!\n"
 msgstr ""
+"Advertencia: ¡sólo hemos visto un mensaje firmado con esta clave e "
+"identificador de usuario!\n"
 
 msgid "Warning: you have yet to encrypt a message to this key!\n"
-msgstr ""
+msgstr "Advertencia: ¡todavía no has cifrado ningún mensaje para esta clave!\n"
 
 msgid "Warning: you have only encrypted one message to this key!\n"
-msgstr ""
+msgstr "Advertencia: ¡sólo has cifrado un mensaje para esta clave!\n"
 
 #, c-format
 msgid ""
@@ -6123,24 +5767,36 @@ msgid_plural ""
 "  %s\n"
 "to mark it as being bad.\n"
 msgstr[0] ""
+"Advertencia: ¡si crees que has visto más firmas de esta clave e "
+"identificador de usuario, puede que esta clave sea falsa! Examina "
+"cuidadosamente la dirección de correo buscando pequeñas variaciones. Si la "
+"clave es sospechosa, usa\n"
+"  %s\n"
+"para marcarla como mala.\n"
 msgstr[1] ""
+"Advertencia: ¡si crees que has visto más firmas de esta clave y estos "
+"identificadores de usuario, puede que esta clave sea falsa! Examina "
+"cuidadosamente la dirección de correo buscando pequeñas variaciones. Si la "
+"clave es sospechosa, usa\n"
+"  %s\n"
+"para marcarla como mala.\n"
 
-#, fuzzy, c-format
-#| msgid "error sending %s command: %s\n"
+#, c-format
 msgid "error opening TOFU database: %s\n"
-msgstr "error enviando orden %s: %s\n"
+msgstr "error al abrir base de datos TOFU: %s\n"
 
 #, c-format
 msgid "WARNING: Encrypting to %s, which has no non-revoked user ids\n"
 msgstr ""
+"ADVERTENCIA: Cifrando para %s, que no tiene ningún identificador de usuario "
+"no revocado\n"