summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--AUTHORS10
-rw-r--r--Makefile.am17
-rw-r--r--NEWS55
-rw-r--r--README4
-rw-r--r--agent/agent.h8
-rw-r--r--agent/call-pinentry.c12
-rw-r--r--agent/call-scd.c22
-rw-r--r--agent/command-ssh.c174
-rw-r--r--agent/command.c32
-rw-r--r--agent/cvt-openpgp.c10
-rw-r--r--agent/cvt-openpgp.h1
-rw-r--r--agent/gpg-agent.c119
-rw-r--r--agent/pksign.c14
-rwxr-xr-xautogen.sh2
-rwxr-xr-xbuild-aux/getswdb.sh20
-rw-r--r--build-aux/speedo.mk42
-rw-r--r--common/Makefile.am5
-rw-r--r--common/argparse.c4
-rw-r--r--common/asshelp.c38
-rw-r--r--common/asshelp.h4
-rw-r--r--common/b64enc.c2
-rw-r--r--common/call-gpg.c41
-rw-r--r--common/call-gpg.h9
-rw-r--r--common/common-defs.h20
-rw-r--r--common/dotlock.c104
-rw-r--r--common/exectool.c440
-rw-r--r--common/exectool.h56
-rw-r--r--common/fwddecl.h39
-rw-r--r--common/get-passphrase.c13
-rw-r--r--common/gettime.h20
-rw-r--r--common/iobuf.c53
-rw-r--r--common/iobuf.h7
-rw-r--r--common/isascii.c19
-rw-r--r--common/keyserver.h20
-rw-r--r--common/membuf.c14
-rw-r--r--common/membuf.h1
-rw-r--r--common/mischelp.h28
-rw-r--r--common/status.c20
-rw-r--r--common/status.h21
-rw-r--r--common/stringhelp.c85
-rw-r--r--common/stringhelp.h3
-rw-r--r--common/t-convert.c8
-rw-r--r--common/t-iobuf.c5
-rw-r--r--common/t-mapstrings.c7
-rw-r--r--common/t-stringhelp.c98
-rw-r--r--common/t-support.h4
-rw-r--r--common/t-timestuff.c35
-rw-r--r--common/tlv.c1
-rw-r--r--common/types.h10
-rw-r--r--common/userids.c1
-rw-r--r--common/utf8conv.c65
-rw-r--r--common/utf8conv.h2
-rw-r--r--common/util.h131
-rw-r--r--common/yesno.c20
-rw-r--r--configure.ac20
-rw-r--r--dirmngr/Makefile.am1
-rw-r--r--dirmngr/crlcache.c7
-rw-r--r--dirmngr/dns-stuff.c2
-rw-r--r--dirmngr/http.c31
-rw-r--r--dirmngr/http.h3
-rw-r--r--dirmngr/ks-action.c19
-rw-r--r--dirmngr/ks-engine-hkp.c30
-rw-r--r--dirmngr/ks-engine-http.c2
-rw-r--r--dirmngr/ks-engine.h2
-rw-r--r--dirmngr/misc.c16
-rw-r--r--dirmngr/misc.h2
-rw-r--r--dirmngr/t-dns-stuff.c6
-rw-r--r--dirmngr/t-http.c2
-rw-r--r--doc/DETAILS12
-rw-r--r--doc/Makefile.am4
-rw-r--r--doc/gpg-agent.texi7
-rw-r--r--doc/gpg.texi98
-rw-r--r--doc/tools.texi73
-rw-r--r--doc/whats-new-in-2.1.txt119
-rw-r--r--g10/armor.c4
-rw-r--r--g10/call-agent.c136
-rw-r--r--g10/call-agent.h4
-rw-r--r--g10/call-dirmngr.c49
-rw-r--r--g10/card-util.c1
-rw-r--r--g10/cipher.c2
-rw-r--r--g10/compress-bz2.c2
-rw-r--r--g10/compress.c2
-rw-r--r--g10/decrypt-data.c4
-rw-r--r--g10/delkey.c5
-rw-r--r--g10/dirmngr-conf.skel6
-rw-r--r--g10/encrypt.c5
-rw-r--r--g10/export.c455
-rw-r--r--g10/getkey.c705
-rw-r--r--g10/gpg.c300
-rw-r--r--g10/gpgv.c7
-rw-r--r--g10/import.c75
-rw-r--r--g10/keydb.c314
-rw-r--r--g10/keydb.h541
-rw-r--r--g10/keyedit.c170
-rw-r--r--g10/keygen.c592
-rw-r--r--g10/keyid.c10
-rw-r--r--g10/keylist.c40
-rw-r--r--g10/keyring.c357
-rw-r--r--g10/keyserver-internal.h1
-rw-r--r--g10/keyserver.c63
-rw-r--r--g10/main.h26
-rw-r--r--g10/mainproc.c4
-rw-r--r--g10/mdfilter.c2
-rw-r--r--g10/misc.c46
-rw-r--r--g10/options.h7
-rw-r--r--g10/options.skel81
-rw-r--r--g10/packet.h1
-rw-r--r--g10/parse-packet.c9
-rw-r--r--g10/pkclist.c82
-rw-r--r--g10/progress.c2
-rw-r--r--g10/revoke.c13
-rw-r--r--g10/server.c3
-rw-r--r--g10/sig-check.c641
-rw-r--r--g10/sign.c13
-rw-r--r--g10/skclist.c7
-rw-r--r--g10/tdbio.c33
-rw-r--r--g10/test-stubs.c7
-rw-r--r--g10/test.c11
-rw-r--r--g10/textfilter.c2
-rw-r--r--g10/tofu.c523
-rw-r--r--g10/trustdb.c41
-rw-r--r--kbx/keybox-defs.h12
-rw-r--r--kbx/keybox-dump.c16
-rw-r--r--kbx/keybox-init.c96
-rw-r--r--kbx/keybox-openpgp.c1
-rw-r--r--kbx/keybox-search.c47
-rw-r--r--kbx/keybox-update.c105
-rw-r--r--kbx/keybox-util.c133
-rw-r--r--kbx/keybox.h20
-rw-r--r--po/POTFILES.in1
-rw-r--r--po/ca.po723
-rw-r--r--po/cs.po1131
-rw-r--r--po/da.po766
-rw-r--r--po/de.po790
-rw-r--r--po/el.po710
-rw-r--r--po/eo.po704
-rw-r--r--po/es.po784
-rw-r--r--po/et.po697
-rw-r--r--po/fi.po708
-rw-r--r--po/fr.po783
-rw-r--r--po/gl.po709
-rw-r--r--po/hu.po701
-rw-r--r--po/id.po703
-rw-r--r--po/it.po707
-rw-r--r--po/ja.po846
-rw-r--r--po/nb.po724
-rw-r--r--po/pl.po806
-rw-r--r--po/pt.po700
-rw-r--r--po/ro.po746
-rw-r--r--po/ru.po897
-rw-r--r--po/sk.po705
-rw-r--r--po/sv.po771
-rw-r--r--po/tr.po768
-rw-r--r--po/uk.po810
-rw-r--r--po/zh_CN.po730
-rw-r--r--po/zh_TW.po720
-rw-r--r--scd/apdu.c3
-rw-r--r--scd/app-openpgp.c21
-rw-r--r--sm/call-agent.c70
-rw-r--r--sm/call-dirmngr.c47
-rw-r--r--sm/certchain.c14
-rw-r--r--sm/encrypt.c7
-rw-r--r--sm/export.c2
-rw-r--r--sm/fingerprint.c1
-rw-r--r--sm/gpgsm.c2
-rw-r--r--sm/keydb.c54
-rw-r--r--sm/keydb.h6
-rw-r--r--sm/server.c2
-rwxr-xr-xtests/openpgp/4gb-packet.test6
-rw-r--r--tests/openpgp/Makefile.am2
-rwxr-xr-xtests/openpgp/default-key.test73
-rwxr-xr-xtests/openpgp/gpgtar.test77
-rw-r--r--tools/Makefile.am17
-rw-r--r--tools/gpgconf-comp.c4
-rw-r--r--tools/gpgkey2ssh.c337
-rw-r--r--tools/gpgtar-create.c72
-rw-r--r--tools/gpgtar-extract.c26
-rw-r--r--tools/gpgtar-list.c34
-rw-r--r--tools/gpgtar.c25
-rw-r--r--tools/gpgtar.h2
180 files changed, 20170 insertions, 8859 deletions
diff --git a/AUTHORS b/AUTHORS
index 83ad5bd..b192214 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -15,9 +15,9 @@ copyrightable year that would otherwise be listed individually.
List of Copyright holders
=========================
- Copyright (C) 1997-2015 Werner Koch
- Copyright (C) 1994-2015 Free Software Foundation, Inc.
- Copyright (C) 2003-2013 g10 Code GmbH
+ Copyright (C) 1997-2016 Werner Koch
+ Copyright (C) 1994-2016 Free Software Foundation, Inc.
+ Copyright (C) 2003-2013,2015-2016 g10 Code GmbH
Copyright (C) 2002 Klarälvdalens Datakonsult AB
Copyright (C) 1995-1997, 2000-2007 Ulrich Drepper <drepper@gnu.ai.mit.edu>
Copyright (C) 1994 X Consortium
@@ -226,8 +226,8 @@ at the bottom of this file.
=========
- Copyright 1998-2013 Free Software Foundation, Inc.
- Copyright 1997-2014 Werner Koch
+ Copyright 1998-2016 Free Software Foundation, Inc.
+ Copyright 1997-2016 Werner Koch
This file is free software; as a special exception the author gives
unlimited permission to copy and/or distribute it, with or without
diff --git a/Makefile.am b/Makefile.am
index 8e213f3..19f13fe 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -103,6 +103,21 @@ dist_doc_DATA = README
dist-hook: gen-ChangeLog
+distcheck-hook:
+ set -e; ( \
+ pref="#+macro: gnupg21_" ;\
+ reldate="$$(date -u +%Y-%m-%d)" ;\
+ echo "$${pref}ver $(PACKAGE_VERSION)" ;\
+ echo "$${pref}date $${reldate}" ;\
+ list='$(DIST_ARCHIVES)'; for i in $$list; do \
+ case "$$i" in *.tar.bz2) \
+ echo "$${pref}size $$(wc -c <$$i|awk '{print int($$1/1024)}')k" ;\
+ echo "$${pref}sha1 $$(sha1sum <$$i|cut -d' ' -f1)" ;\
+ echo "$${pref}sha2 $$(sha256sum <$$i|cut -d' ' -f1)" ;;\
+ esac;\
+ done ) | tee $(distdir).swdb
+
+
if HAVE_W32_SYSTEM
install-data-hook:
set -e; \
@@ -120,7 +135,7 @@ endif
gen_start_date = 2011-12-01T06:00:00
.PHONY: gen-ChangeLog
gen-ChangeLog:
- if test -d $(top_srcdir)/.git; then \
+ if test -e $(top_srcdir)/.git; then \
(cd $(top_srcdir) && \
$(GITLOG_TO_CHANGELOG) --append-dot --tear-off \
--amend=build-aux/git-log-fix \
diff --git a/NEWS b/NEWS
index 4965652..acae85a 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,54 @@
+Noteworthy changes in version 2.1.11 (2016-01-26)
+-------------------------------------------------
+
+ * gpg: New command --export-ssh-key to replace the gpgkey2ssh tool.
+
+ * gpg: Allow to generate mail address only keys with --gen-key.
+
+ * gpg: "--list-options show-usage" is now the default.
+
+ * gpg: Make lookup of DNS CERT records holding an URL work.
+
+ * gpg: Emit PROGRESS status lines during key generation.
+
+ * gpg: Don't check for ambigious or non-matching key specification in
+ the config file or given to --encrypt-to. This feature will return
+ in 2.3.x.
+
+ * gpg: Lock keybox files while updating them.
+
+ * gpg: Solve rare error on Windows during keyring and Keybox updates.
+
+ * gpg: Fix possible keyring corruption. (bug#2193)
+
+ * gpg: Fix regression of "bkuptocard" sub-command in --edit-key and
+ remove "checkbkupkey" sub-command introduced with 2.1. (bug#2169)
+
+ * gpg: Fix internal error in gpgv when using default keyid-format.
+
+ * gpg: Fix --auto-key-retrieve to work with dirmngr.conf configured
+ keyservers. (bug#2147).
+
+ * agent: New option --pinentry-timeout.
+
+ * scd: Improve unplugging of USB readers under Windows.
+
+ * scd: Fix regression for generating RSA keys on card.
+
+ * dirmmgr: All configured keyservers are now searched.
+
+ * dirmngr: Install CA certificate for hkps.pool.sks-keyservers.net.
+ Use this certiticate even if --hkp-cacert is not used.
+
+ * gpgtar: Add actual encryption code. gpgtar does now fully replace
+ gpg-zip.
+
+ * gpgtar: Fix filename encoding problem on Windows.
+
+ * Print a warning if a GnuPG component is using an older version of
+ gpg-agent, dirmngr, or scdaemon.
+
+
Noteworthy changes in version 2.1.10 (2015-12-04)
-------------------------------------------------
@@ -2858,8 +2909,8 @@ Version 0.1.0 (1998-01-05)
Version 0.0.0 (1997-12-20)
- Copyright (C) 1998-2015 Free Software Foundation, Inc.
- Copyright (C) 1997-2015 Werner Koch
+ Copyright (C) 1998-2016 Free Software Foundation, Inc.
+ Copyright (C) 1997-2016 Werner Koch
This file is free software; as a special exception the author gives
unlimited permission to copy and/or distribute it, with or without
diff --git a/README b/README
index f1215ef..224db30 100644
--- a/README
+++ b/README
@@ -2,8 +2,8 @@
=========================
Version 2.1
- Copyright 1997-2015 Werner Koch
- Copyright 1998-2015 Free Software Foundation, Inc.
+ Copyright 1997-2016 Werner Koch
+ Copyright 1998-2016 Free Software Foundation, Inc.
* INTRODUCTION
diff --git a/agent/agent.h b/agent/agent.h
index 6e24df4..c2726bb 100644
--- a/agent/agent.h
+++ b/agent/agent.h
@@ -94,6 +94,11 @@ struct
custom invisible character. */
char *pinentry_invisible_char;
+ /* The timeout value for the Pinentry in seconds. This is passed to
+ the pinentry if it is not 0. It is up to the pinentry to act
+ upon this timeout value. */
+ unsigned long pinentry_timeout;
+
/* The default and maximum TTL of cache entries. */
unsigned long def_cache_ttl; /* Default. */
unsigned long def_cache_ttl_ssh; /* for SSH. */
@@ -331,6 +336,9 @@ typedef int (*lookup_ttl_t)(const char *hexgrip);
/*-- gpg-agent.c --*/
void agent_exit (int rc)
GPGRT_ATTR_NORETURN; /* Also implemented in other tools */
+void agent_set_progress_cb (void (*cb)(ctrl_t ctrl, const char *what,
+ int printchar, int current, int total),
+ ctrl_t ctrl);
gpg_error_t agent_copy_startup_env (ctrl_t ctrl);
const char *get_agent_socket_name (void);
const char *get_agent_ssh_socket_name (void);
diff --git a/agent/call-pinentry.c b/agent/call-pinentry.c
index 33e3ec3..0f24086 100644
--- a/agent/call-pinentry.c
+++ b/agent/call-pinentry.c
@@ -491,6 +491,18 @@ start_pinentry (ctrl_t ctrl)
}
}
+ if (opt.pinentry_timeout)
+ {
+ char *optstr;
+ if ((optstr = xtryasprintf ("SETTIMEOUT %lu", opt.pinentry_timeout)))
+ {
+ assuan_transact (entry_ctx, optstr, NULL, NULL, NULL, NULL, NULL,
+ NULL);
+ /* We ignore errors because this is just a fancy thing. */
+ xfree (optstr);
+ }
+ }
+
/* Tell the pinentry the name of a file it shall touch after having
messed with the tty. This is optional and only supported by
newer pinentries and thus we do no error checking. */
diff --git a/agent/call-scd.c b/agent/call-scd.c
index 9c4d7b1..b776840 100644
--- a/agent/call-scd.c
+++ b/agent/call-scd.c
@@ -113,8 +113,6 @@ static int primary_scd_ctx_reusable;
/* Local prototypes. */
-static gpg_error_t membuf_data_cb (void *opaque,
- const void *buffer, size_t length);
@@ -354,7 +352,7 @@ start_scd (ctrl_t ctrl)
socket_name = NULL;
init_membuf (&data, 256);
assuan_transact (ctx, "GETINFO socket_name",
- membuf_data_cb, &data, NULL, NULL, NULL, NULL);
+ put_membuf_cb, &data, NULL, NULL, NULL, NULL);
databuf = get_membuf (&data, &datalen);
if (databuf && datalen)
@@ -688,16 +686,6 @@ agent_card_serialno (ctrl_t ctrl, char **r_serialno)
-static gpg_error_t
-membuf_data_cb (void *opaque, const void *buffer, size_t length)
-{
- membuf_t *data = opaque;
-
- if (buffer)
- put_membuf (data, buffer, length);
- return 0;
-}
-
/* Handle the NEEDPIN inquiry. */
static gpg_error_t
inq_needpin (void *opaque, const char *line)
@@ -855,7 +843,7 @@ agent_card_pksign (ctrl_t ctrl,
snprintf (line, sizeof line, "PKSIGN %s %s",
hash_algo_option (mdalgo), keyid);
rc = assuan_transact (ctrl->scd_local->ctx, line,
- membuf_data_cb, &data,
+ put_membuf_cb, &data,
inq_needpin, &inqparm,
NULL, NULL);
if (inqparm.any_inq_seen && (gpg_err_code(rc) == GPG_ERR_CANCELED ||
@@ -944,7 +932,7 @@ agent_card_pkdecrypt (ctrl_t ctrl,
snprintf (line, DIM(line)-1, "PKDECRYPT %s", keyid);
line[DIM(line)-1] = 0;
rc = assuan_transact (ctrl->scd_local->ctx, line,
- membuf_data_cb, &data,
+ put_membuf_cb, &data,
inq_needpin, &inqparm,
padding_info_cb, r_padding);
if (inqparm.any_inq_seen && (gpg_err_code(rc) == GPG_ERR_CANCELED ||
@@ -984,7 +972,7 @@ agent_card_readcert (ctrl_t ctrl,
snprintf (line, DIM(line)-1, "READCERT %s", id);
line[DIM(line)-1] = 0;
rc = assuan_transact (ctrl->scd_local->ctx, line,
- membuf_data_cb, &data,
+ put_membuf_cb, &data,
NULL, NULL,
NULL, NULL);
if (rc)
@@ -1020,7 +1008,7 @@ agent_card_readkey (ctrl_t ctrl, const char *id, unsigned char **r_buf)
snprintf (line, DIM(line)-1, "READKEY %s", id);
line[DIM(line)-1] = 0;
rc = assuan_transact (ctrl->scd_local->ctx, line,
- membuf_data_cb, &data,
+ put_membuf_cb, &data,
NULL, NULL,
NULL, NULL);
if (rc)
diff --git a/agent/command-ssh.c b/agent/command-ssh.c
index 5f159f1..6e809f6 100644
--- a/agent/command-ssh.c
+++ b/agent/command-ssh.c
@@ -75,6 +75,7 @@
#define SPEC_FLAG_USE_PKCS1V2 (1 << 0)
#define SPEC_FLAG_IS_ECDSA (1 << 1)
#define SPEC_FLAG_IS_EdDSA (1 << 2) /*(lowercase 'd' on purpose.)*/
+#define SPEC_FLAG_WITH_CERT (1 << 7)
/* The name of the control file. */
#define SSH_CONTROL_FILE_NAME "sshcontrol"
@@ -302,6 +303,42 @@ static ssh_key_type_spec_t ssh_key_types[] =
"ecdsa-sha2-nistp521", "ECDSA", "ecdsa", "qd", "q", "rs", "qd",
NULL, ssh_signature_encoder_ecdsa,
"nistp521", GCRY_MD_SHA512, SPEC_FLAG_IS_ECDSA
+ },
+ {
+ "ssh-ed25519-cert-v01@openssh.com", "Ed25519",
+ "ecc", "qd", "q", "rs", "qd",
+ NULL, ssh_signature_encoder_eddsa,
+ "Ed25519", 0, SPEC_FLAG_IS_EdDSA | SPEC_FLAG_WITH_CERT
+ },
+ {
+ "ssh-rsa-cert-v01@openssh.com", "RSA",
+ "rsa", "nedupq", "en", "s", "nedpqu",
+ ssh_key_modifier_rsa, ssh_signature_encoder_rsa,
+ NULL, 0, SPEC_FLAG_USE_PKCS1V2 | SPEC_FLAG_WITH_CERT
+ },
+ {
+ "ssh-dss-cert-v01@openssh.com", "DSA",
+ "dsa", "pqgyx", "pqgy", "rs", "pqgyx",
+ NULL, ssh_signature_encoder_dsa,
+ NULL, 0, SPEC_FLAG_WITH_CERT | SPEC_FLAG_WITH_CERT
+ },
+ {
+ "ecdsa-sha2-nistp256-cert-v01@openssh.com", "ECDSA",
+ "ecdsa", "qd", "q", "rs", "qd",
+ NULL, ssh_signature_encoder_ecdsa,
+ "nistp256", GCRY_MD_SHA256, SPEC_FLAG_IS_ECDSA | SPEC_FLAG_WITH_CERT
+ },
+ {
+ "ecdsa-sha2-nistp384-cert-v01@openssh.com", "ECDSA",
+ "ecdsa", "qd", "q", "rs", "qd",
+ NULL, ssh_signature_encoder_ecdsa,
+ "nistp384", GCRY_MD_SHA384, SPEC_FLAG_IS_ECDSA | SPEC_FLAG_WITH_CERT
+ },
+ {
+ "ecdsa-sha2-nistp521-cert-v01@openssh.com", "ECDSA",
+ "ecdsa", "qd", "q", "rs", "qd",
+ NULL, ssh_signature_encoder_ecdsa,
+ "nistp521", GCRY_MD_SHA512, SPEC_FLAG_IS_ECDSA | SPEC_FLAG_WITH_CERT
}
};
@@ -531,7 +568,7 @@ stream_write_data (estream_t stream, const unsigned char *buffer, size_t size)
/* Read a binary string from STREAM into STRING, store size of string
in STRING_SIZE. Append a hidden nul so that the result may
directly be used as a C string. Depending on SECURE use secure
- memory for STRING. */
+ memory for STRING. If STRING is NULL do only a dummy read. */
static gpg_error_t
stream_read_string (estream_t stream, unsigned int secure,
unsigned char **string, u32 *string_size)
@@ -548,25 +585,35 @@ stream_read_string (estream_t stream, unsigned int secure,
if (err)
goto out;
- /* Allocate space. */
- if (secure)
- buffer = xtrymalloc_secure (length + 1);
- else
- buffer = xtrymalloc (length + 1);
- if (! buffer)
+ if (string)
{
- err = gpg_error_from_syserror ();
- goto out;
- }
+ /* Allocate space. */
+ if (secure)
+ buffer = xtrymalloc_secure (length + 1);
+ else
+ buffer = xtrymalloc (length + 1);
+ if (! buffer)
+ {
+ err = gpg_error_from_syserror ();
+ goto out;
+ }
- /* Read data. */
- err = stream_read_data (stream, buffer, length);
- if (err)
- goto out;
+ /* Read data. */
+ err = stream_read_data (stream, buffer, length);
+ if (err)
+ goto out;
+
+ /* Finalize string object. */
+ buffer[length] = 0;
+ *string = buffer;
+ }
+ else /* Dummy read requested. */
+ {
+ err = stream_read_skip (stream, length);
+ if (err)
+ goto out;
+ }
- /* Finalize string object. */
- buffer[length] = 0;
- *string = buffer;
if (string_size)
*string_size = length;
@@ -1258,31 +1305,38 @@ mpint_list_free (gcry_mpi_t *mpi_list)
}
/* Receive key material MPIs from STREAM according to KEY_SPEC;
- depending on SECRET expect a public key or secret key. The newly
+ depending on SECRET expect a public key or secret key. CERT is the
+ certificate blob used if KEY_SPEC indicates the certificate format;
+ it needs to be positioned to the end of the nonce. The newly
allocated list of MPIs is stored in MPI_LIST. Returns usual error
code. */
static gpg_error_t
ssh_receive_mpint_list (estream_t stream, int secret,
- ssh_key_type_spec_t key_spec, gcry_mpi_t **mpi_list)
+ ssh_key_type_spec_t *spec, estream_t cert,
+ gcry_mpi_t **mpi_list)
{
const char *elems_public;
unsigned int elems_n;
const char *elems;
int elem_is_secret;
- gcry_mpi_t *mpis;
- gpg_error_t err;
+ gcry_mpi_t *mpis = NULL;
+ gpg_error_t err = 0;
unsigned int i;
- mpis = NULL;
- err = 0;
-
if (secret)
- elems = key_spec.elems_key_secret;
+ elems = spec->elems_key_secret;
else
- elems = key_spec.elems_key_public;
+ elems = spec->elems_key_public;
elems_n = strlen (elems);
+ elems_public = spec->elems_key_public;
- elems_public = key_spec.elems_key_public;
+ /* Check that either noth, CERT and the WITH_CERT flag, are given or
+ none of them. */
+ if (!(!!(spec->flags & SPEC_FLAG_WITH_CERT) ^ !cert))
+ {
+ err = gpg_error (GPG_ERR_INV_CERT_OBJ);
+ goto out;
+ }
mpis = xtrycalloc (elems_n + 1, sizeof *mpis );
if (!mpis)
@@ -1295,18 +1349,20 @@ ssh_receive_mpint_list (estream_t stream, int secret,
for (i = 0; i < elems_n; i++)
{
if (secret)
- elem_is_secret = ! strchr (elems_public, elems[i]);
- err = stream_read_mpi (stream, elem_is_secret, &mpis[i]);
+ elem_is_secret = !strchr (elems_public, elems[i]);
+
+ if (cert && !elem_is_secret)
+ err = stream_read_mpi (cert, elem_is_secret, &mpis[i]);
+ else
+ err = stream_read_mpi (stream, elem_is_secret, &mpis[i]);
if (err)
- break;
+ goto out;
}
- if (err)
- goto out;
*mpi_list = mpis;
+ mpis = NULL;
out:
-
if (err)
mpint_list_free (mpis);
@@ -2112,6 +2168,7 @@ ssh_receive_key (estream_t stream, gcry_sexp_t *key_new, int secret,
gpg_error_t err;
char *key_type = NULL;
char *comment = NULL;
+ estream_t cert = NULL;
gcry_sexp_t key = NULL;
ssh_key_type_spec_t spec;
gcry_mpi_t *mpi_list = NULL;
@@ -2127,6 +2184,44 @@ ssh_receive_key (estream_t stream, gcry_sexp_t *key_new, int secret,
if (err)
goto out;
+ if ((spec.flags & SPEC_FLAG_WITH_CERT))
+ {
+ /* This is an OpenSSH certificate+private key. The certificate
+ is an SSH string and which we store in an estream object. */
+ unsigned char *buffer;
+ u32 buflen;
+ char *cert_key_type;
+
+ err = stream_read_string (stream, 0, &buffer, &buflen);
+ if (err)
+ goto out;
+ cert = es_fopenmem_init (0, "rb", buffer, buflen);
+ xfree (buffer);
+ if (!cert)
+ {
+ err = gpg_error_from_syserror ();
+ goto out;
+ }
+
+ /* Check that the key type matches. */
+ err = stream_read_cstring (cert, &cert_key_type);
+ if (err)
+ goto out;
+ if (strcmp (cert_key_type, key_type) )
+ {
+ xfree (cert_key_type);
+ log_error ("key types in received ssh certificate do not match\n");
+ err = gpg_error (GPG_ERR_INV_CERT_OBJ);
+ goto out;
+ }
+ xfree (cert_key_type);
+
+ /* Skip the nonce. */
+ err = stream_read_string (cert, 0, NULL, NULL);
+ if (err)
+ goto out;
+ }
+
if ((spec.flags & SPEC_FLAG_IS_EdDSA))
{
/* The format of an EdDSA key is:
@@ -2146,7 +2241,7 @@ ssh_receive_key (estream_t stream, gcry_sexp_t *key_new, int secret,
goto out;
}
- err = stream_read_blob (stream, 0, &mpi_list[0]);
+ err = stream_read_blob (cert? cert : stream, 0, &mpi_list[0]);
if (err)
goto out;
if (secret)
@@ -2196,12 +2291,14 @@ ssh_receive_key (estream_t stream, gcry_sexp_t *key_new, int secret,
* mpint ecdsa_private
*
* Note that we use the mpint reader instead of the string
- * reader for ecsa_public_key.
+ * reader for ecsa_public_key. For the certificate variante
+ * ecdsa_curve_name+ecdsa_public_key are replaced by the
+ * certificate.
*/
unsigned char *buffer;
const char *mapped;
- err = stream_read_string (stream, 0, &buffer, NULL);
+ err = stream_read_string (cert? cert : stream, 0, &buffer, NULL);
if (err)
goto out;
curve_name = buffer;
@@ -2228,13 +2325,13 @@ ssh_receive_key (estream_t stream, gcry_sexp_t *key_new, int secret,
}
}
- err = ssh_receive_mpint_list (stream, secret, spec, &mpi_list);
+ err = ssh_receive_mpint_list (stream, secret, &spec, cert, &mpi_list);
if (err)
goto out;
}
else
{
- err = ssh_receive_mpint_list (stream, secret, spec, &mpi_list);
+ err = ssh_receive_mpint_list (stream, secret, &spec, cert, &mpi_list);
if (err)
goto out;
}
@@ -2292,6 +2389,7 @@ ssh_receive_key (estream_t stream, gcry_sexp_t *key_new, int secret,
*key_new = key;
out:
+ es_fclose (cert);
mpint_list_free (mpi_list);
xfree (curve_name);
xfree (key_type);
diff --git a/agent/command.c b/agent/command.c
index 4b6040a..421df00 100644
--- a/agent/command.c
+++ b/agent/command.c
@@ -446,6 +446,23 @@ agent_inq_pinentry_launched (ctrl_t ctrl, unsigned long pid)
}
+/* An agent progress callback for Libgcrypt. This has been registered
+ * to be called via the progress dispatcher mechanism from
+ * gpg-agent.c */
+static void
+progress_cb (ctrl_t ctrl, const char *what, int printchar,
+ int current, int total)
+{
+ if (!ctrl || !ctrl->server_local || !ctrl->server_local->assuan_ctx)
+ ;
+ else if (printchar == '\n' && what && !strcmp (what, "primegen"))
+ agent_print_status (ctrl, "PROGRESS", "%.20s X 100 100", what);
+ else
+ agent_print_status (ctrl, "PROGRESS", "%.20s %c %d %d",
+ what, printchar=='\n'?'X':printchar, current, total);
+}
+
+
/* Helper to print a message while leaving a command. */
static gpg_error_t
leave_cmd (assuan_context_t ctx, gpg_error_t err)
@@ -2028,7 +2045,7 @@ cmd_keywrap_key (assuan_context_t ctx, char *line)
static const char hlp_import_key[] =
- "IMPORT_KEY [--unattended] [<cache_nonce>]\n"
+ "IMPORT_KEY [--unattended] [--force] [<cache_nonce>]\n"
"\n"
"Import a secret key into the key store. The key is expected to be\n"
"encrypted using the current session's key wrapping key (cf. command\n"
@@ -2036,13 +2053,14 @@ static const char hlp_import_key[] =
"no arguments but uses the inquiry \"KEYDATA\" to ask for the actual\n"
"key data. The unwrapped key must be a canonical S-expression. The\n"
"option --unattended tries to import the key as-is without any\n"
- "re-encryption";
+ "re-encryption. Existing key can be overwritten with --force.";
static gpg_error_t
cmd_import_key (assuan_context_t ctx, char *line)
{
ctrl_t ctrl = assuan_get_pointer (ctx);
gpg_error_t err;
int opt_unattended;
+ int force;
unsigned char *wrappedkey = NULL;
size_t wrappedkeylen;
gcry_cipher_hd_t cipherhd = NULL;
@@ -2066,6 +2084,7 @@ cmd_import_key (assuan_context_t ctx, char *line)
}
opt_unattended = has_option (line, "--unattended");
+ force = has_option (line, "--force");
line = skip_options (line);
p = line;
@@ -2149,7 +2168,7 @@ cmd_import_key (assuan_context_t ctx, char *line)
xfree (key);
key = NULL;
- err = convert_from_openpgp (ctrl, openpgp_sexp, grip,
+ err = convert_from_openpgp (ctrl, openpgp_sexp, force, grip,
ctrl->server_local->keydesc, cache_nonce,
&key, opt_unattended? NULL : &passphrase);
if (err)
@@ -2180,7 +2199,7 @@ cmd_import_key (assuan_context_t ctx, char *line)
}
else
{
- if (!agent_key_available (grip))
+ if (!force && !agent_key_available (grip))
err = gpg_error (GPG_ERR_EEXIST);
else
{
@@ -2202,10 +2221,10 @@ cmd_import_key (assuan_context_t ctx, char *line)
err = agent_protect (key, passphrase, &finalkey, &finalkeylen,
ctrl->s2k_count);
if (!err)
- err = agent_write_private_key (grip, finalkey, finalkeylen, 0);
+ err = agent_write_private_key (grip, finalkey, finalkeylen, force);
}
else
- err = agent_write_private_key (grip, key, realkeylen, 0);
+ err = agent_write_private_key (grip, key, realkeylen, force);
leave:
gcry_sexp_release (openpgp_sexp);
@@ -3203,6 +3222,7 @@ start_command_handler (ctrl_t ctrl, gnupg_fd_t listen_fd, gnupg_fd_t fd)
ctrl->digest.raw_value = 0;
assuan_set_io_monitor (ctx, io_monitor, NULL);
+ agent_set_progress_cb (progress_cb, ctrl);
for (;;)
{
diff --git a/agent/cvt-openpgp.c b/agent/cvt-openpgp.c
index 0b9ecf0..8df6b8e 100644
--- a/agent/cvt-openpgp.c
+++ b/agent/cvt-openpgp.c
@@ -685,7 +685,7 @@ try_do_unprotect_cb (struct pin_entry_info_s *pi)
silently decrypt the key; CACHE_NONCE and R_PASSPHRASE must both be
NULL in this mode. */
static gpg_error_t
-convert_from_openpgp_main (ctrl_t ctrl, gcry_sexp_t s_pgp,
+convert_from_openpgp_main (ctrl_t ctrl, gcry_sexp_t s_pgp, int dontcare_exist,
unsigned char *grip, const char *prompt,
const char *cache_nonce, const char *passphrase,
unsigned char **r_key, char **r_passphrase)
@@ -894,7 +894,7 @@ convert_from_openpgp_main (ctrl_t ctrl, gcry_sexp_t s_pgp,
if (err)
goto leave;
- if (!from_native && !agent_key_available (grip))
+ if (!dontcare_exist && !from_native && !agent_key_available (grip))
{
err = gpg_error (GPG_ERR_EEXIST);
goto leave;
@@ -1028,12 +1028,12 @@ convert_from_openpgp_main (ctrl_t ctrl, gcry_sexp_t s_pgp,
the key. The keygrip will be stored at the 20 byte buffer pointed
to by GRIP. On error NULL is stored at all return arguments. */
gpg_error_t
-convert_from_openpgp (ctrl_t ctrl, gcry_sexp_t s_pgp,
+convert_from_openpgp (ctrl_t ctrl, gcry_sexp_t s_pgp, int dontcare_exist,
unsigned char *grip, const char *prompt,
const char *cache_nonce,
unsigned char **r_key, char **r_passphrase)
{
- return convert_from_openpgp_main (ctrl, s_pgp, grip, prompt,
+ return convert_from_openpgp_main (ctrl, s_pgp, dontcare_exist, grip, prompt,
cache_nonce, NULL,
r_key, r_passphrase);
}
@@ -1052,7 +1052,7 @@ convert_from_openpgp_native (ctrl_t ctrl,
if (!passphrase)
return gpg_error (GPG_ERR_INTERNAL);
- err = convert_from_openpgp_main (ctrl, s_pgp, grip, NULL,
+ err = convert_from_openpgp_main (ctrl, s_pgp, 0, grip, NULL,
NULL, passphrase,
r_key, NULL);
diff --git a/agent/cvt-openpgp.h b/agent/cvt-openpgp.h
index d27a776..9a4fc3d 100644
--- a/agent/cvt-openpgp.h
+++ b/agent/cvt-openpgp.h
@@ -20,6 +20,7 @@
#define GNUPG_AGENT_CVT_OPENPGP_H
gpg_error_t convert_from_openpgp (ctrl_t ctrl, gcry_sexp_t s_pgp,
+ int dontcare_exist,
unsigned char *grip, const char *prompt,
const char *cache_nonce,
unsigned char **r_key, char **r_passphrase);
diff --git a/agent/gpg-agent.c b/agent/gpg-agent.c
index b60287d..8aab2b9 100644
--- a/agent/gpg-agent.c
+++ b/agent/gpg-agent.c
@@ -93,6 +93,7 @@ enum cmd_and_opt_values
oPinentryProgram,
oPinentryTouchFile,
oPinentryInvisibleChar,
+ oPinentryTimeout,
oDisplay,
oTTYname,
oTTYtype,
@@ -168,6 +169,7 @@ static ARGPARSE_OPTS opts[] = {
/* */ N_("|PGM|use PGM as the PIN-Entry program")),
ARGPARSE_s_s (oPinentryTouchFile, "pinentry-touch-file", "@"),
ARGPARSE_s_s (oPinentryInvisibleChar, "pinentry-invisible-char", "@"),
+ ARGPARSE_s_u (oPinentryTimeout, "pinentry-timeout", "@"),
ARGPARSE_s_s (oScdaemonProgram, "scdaemon-program",
/* */ N_("|PGM|use PGM as the SCdaemon program") ),
ARGPARSE_s_n (oDisableScdaemon, "disable-scdaemon",
@@ -370,6 +372,32 @@ static pid_t parent_pid = (pid_t)(-1);
/* Number of active connections. */
static int active_connections;
+/* This object is used to dispatch progress messages from Libgcrypt to
+ * the right thread. Given that we won't have at max a few dozen
+ * connections at the same time using a linked list is the easiest way
+ * to handle this. */
+struct progress_dispatch_s
+{
+ struct progress_dispatch_s *next;
+ /* The control object of the connection. If this is NULL no
+ * connection is associated with this item and it is free for reuse
+ * by new connections. */
+ ctrl_t ctrl;
+
+ /* The thread id of (npth_self) of the connection. */
+ npth_t tid;
+
+ /* The callback set by the connection. This is similar to the
+ * Libgcrypt callback but with the control object passed as the
+ * first argument. */
+ void (*cb)(ctrl_t ctrl,
+ const char *what, int printchar,
+ int current, int total);
+};
+struct progress_dispatch_s *progress_dispatch_list;
+
+
+
/*
Local prototypes.
@@ -381,6 +409,9 @@ static gnupg_fd_t create_server_socket (char *name, int primary, int cygwin,
assuan_sock_nonce_t *nonce);
static void create_directories (void);
+static void agent_libgcrypt_progress_cb (void *data, const char *what,
+ int printchar,
+ int current, int total);
static void agent_init_default_ctrl (ctrl_t ctrl);
static void agent_deinit_default_ctrl (ctrl_t ctrl);
@@ -580,6 +611,7 @@ parse_rereadable_options (ARGPARSE_ARGS *pargs, int reread)
opt.pinentry_touch_file = NULL;
xfree (opt.pinentry_invisible_char);
opt.pinentry_invisible_char = NULL;
+ opt.pinentry_timeout = 0;
opt.scdaemon_program = NULL;
opt.def_cache_ttl = DEFAULT_CACHE_TTL;
opt.def_cache_ttl_ssh = DEFAULT_CACHE_TTL_SSH;
@@ -632,6 +664,7 @@ parse_rereadable_options (ARGPARSE_ARGS *pargs, int reread)
xfree (opt.pinentry_invisible_char);
opt.pinentry_invisible_char = xtrystrdup (pargs->r.ret_str); break;
break;
+ case oPinentryTimeout: opt.pinentry_timeout = pargs->r.ret_ulong; break;
case oScdaemonProgram: opt.scdaemon_program = pargs->r.ret_str; break;
case oDisableScdaemon: opt.disable_scdaemon = 1; break;
case oDisableCheckOwnSocket: disable_check_own_socket = 1; break;
@@ -756,6 +789,7 @@ main (int argc, char **argv )
setup_libgcrypt_logging ();
gcry_control (GCRYCTL_USE_SECURE_RNDPOOL);
+ gcry_set_progress_handler (agent_libgcrypt_progress_cb, NULL);
disable_core_dumps ();
@@ -1124,6 +1158,8 @@ main (int argc, char **argv )
GC_OPT_FLAG_NONE|GC_OPT_FLAG_RUNTIME);
es_printf ("allow-emacs-pinentry:%lu:\n",
GC_OPT_FLAG_NONE|GC_OPT_FLAG_RUNTIME);
+ es_printf ("pinentry-timeout:%lu:0:\n",
+ GC_OPT_FLAG_DEFAULT|GC_OPT_FLAG_RUNTIME);
agent_exit (0);
}
@@ -1439,6 +1475,88 @@ agent_exit (int rc)
}
+/* This is our callback function for gcrypt progress messages. It is
+ set once at startup and dispatches progress messages to the
+ corresponding threads of the agent. */
+static void
+agent_libgcrypt_progress_cb (void *data, const char *what, int printchar,
+ int current, int total)
+{
+ struct progress_dispatch_s *dispatch;
+ npth_t mytid = npth_self ();
+
+ (void)data;
+
+ for (dispatch = progress_dispatch_list; dispatch; dispatch = dispatch->next)
+ if (dispatch->ctrl && dispatch->tid == mytid)
+ break;
+ if (dispatch && dispatch->cb)
+ dispatch->cb (dispatch->ctrl, what, printchar, current, total);
+}
+
+
+/* If a progress dispatcher callback has been associated with the
+ * current connection unregister it. */
+static void
+unregister_progress_cb (void)
+{
+ struct progress_dispatch_s *dispatch;
+ npth_t mytid = npth_self ();
+
+ for (dispatch = progress_dispatch_list; dispatch; dispatch = dispatch->next)
+ if (dispatch->ctrl && dispatch->tid == mytid)
+ break;
+ if (dispatch)
+ {
+ dispatch->ctrl = NULL;
+ dispatch->cb = NULL;
+ }
+}
+
+
+/* Setup a progress callback CB for the current connection. Using a
+ * CB of NULL disables the callback. */
+void
+agent_set_progress_cb (void (*cb)(ctrl_t ctrl, const char *what,
+ int printchar, int current, int total),
+ ctrl_t ctrl)
+{
+ struct progress_dispatch_s *dispatch, *firstfree;
+ npth_t mytid = npth_self ();
+
+ firstfree = NULL;
+ for (dispatch = progress_dispatch_list; dispatch; dispatch = dispatch->next)
+ {
+ if (dispatch->ctrl && dispatch->tid == mytid)
+ break;
+ if (!dispatch->ctrl && !firstfree)
+ firstfree = dispatch;
+ }
+ if (!dispatch) /* None allocated: Reuse or allocate a new one. */
+ {
+ if (firstfree)
+ {
+ dispatch = firstfree;
+ }
+ else if ((dispatch = xtrycalloc (1, sizeof *dispatch)))
+ {
+ dispatch->next = progress_dispatch_list;
+ progress_dispatch_list = dispatch;
+ }
+ else
+ {
+ log_error ("error allocating new progress dispatcher slot: %s\n",
+ gpg_strerror (gpg_error_from_syserror ()));
+ return;
+ }
+ dispatch->ctrl = ctrl;
+ dispatch->tid = mytid;
+ }
+
+ dispatch->cb = cb;
+}
+
+
/* Each thread has its own local variables conveyed by a control
structure usually identified by an argument named CTRL. This
function is called immediately after allocating the control
@@ -1475,6 +1593,7 @@ agent_init_default_ctrl (ctrl_t ctrl)
static void
agent_deinit_default_ctrl (ctrl_t ctrl)
{
+ unregister_progress_cb ();
session_env_release (ctrl->session_env);
if (ctrl->lc_ctype)
diff --git a/agent/pksign.c b/agent/pksign.c
index e079c3f..9011be2 100644
--- a/agent/pksign.c
+++ b/agent/pksign.c
@@ -281,7 +281,7 @@ do_encode_raw_pkcs1 (const byte *md, size_t mdlen, unsigned int nbits,
passphrase. If OVERRIDEDATA is not NULL, OVERRIDEDATALEN bytes
from this buffer are used instead of the data in CTRL. The
override feature is required to allow the use of Ed25519 with ssh
- because Ed25519 dies the hashing itself. */
+ because Ed25519 does the hashing itself. */
int
agent_pksign_do (ctrl_t ctrl, const char *cache_nonce,
const char *desc_text,
@@ -492,20 +492,20 @@ agent_pksign_do (ctrl_t ctrl, const char *cache_nonce,
* for RSA internally there is no need to do it here again. */
if (check_signature)
{
+ gcry_sexp_t sexp_key = s_pkey? s_pkey: s_skey;
+
if (s_hash == NULL)
{
if (ctrl->digest.algo == MD_USER_TLS_MD5SHA1)
rc = do_encode_raw_pkcs1 (data, datalen,
- gcry_pk_get_nbits (s_skey),
- &s_hash);
+ gcry_pk_get_nbits (sexp_key), &s_hash);
else
- rc = do_encode_md (data, datalen,
- ctrl->digest.algo,
- &s_hash,
+ rc = do_encode_md (data, datalen, ctrl->digest.algo, &s_hash,
ctrl->digest.raw_value);
}
- rc = gcry_pk_verify (s_sig, s_hash, s_pkey? s_pkey: s_skey);
+ if (! rc)
+ rc = gcry_pk_verify (s_sig, s_hash, sexp_key);
if (rc)
{
diff --git a/autogen.sh b/autogen.sh
index 3fe24ea..7d843bd 100755
--- a/autogen.sh
+++ b/autogen.sh
@@ -214,7 +214,7 @@ if [ "$myhost" = "find-version" ]; then
esac
beta=no
- if [ -d .git ]; then
+ if [ -e .git ]; then
ingit=yes
tmp=$(git describe --match "${matchstr1}" --long 2>/dev/null)
if [ -n "$tmp" ]; then
diff --git a/build-aux/getswdb.sh b/build-aux/getswdb.sh
index e7f6fca..4a1730b 100755
--- a/build-aux/getswdb.sh
+++ b/build-aux/getswdb.sh
@@ -37,6 +37,7 @@ Options:
--skip-verify Do not check signatures
--skip-selfcheck Do not check GnuPG version
--find-sha1sum Print the name of the sha1sum utility
+ --find-sha256sum Print the name of the sha256sum utility
--help Print this help.
EOF
exit $1
@@ -49,6 +50,7 @@ skip_download=no
skip_verify=no
skip_selfcheck=no
find_sha1sum=no
+find_sha256sum=no
while test $# -gt 0; do
case "$1" in
# Set up `optarg'.
@@ -76,6 +78,9 @@ while test $# -gt 0; do
--find-sha1sum)
find_sha1sum=yes
;;
+ --find-sha256sum)
+ find_sha256sum=yes
+ ;;
*)
usage 1 1>&2
;;
@@ -96,6 +101,21 @@ if [ ${find_sha1sum} = yes ]; then
exit 1
fi
+# Mac OSX has only a shasum and not sha256sum
+if [ ${find_sha256sum} = yes ]; then
+ for i in 'shasum -a 256' sha256sum ; do
+ tmp=$($i </dev/null 2>/dev/null | cut -d ' ' -f1)
+ tmp2="e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ if [ x"$tmp" = x"$tmp2" ]; then
+ echo "$i"
+ exit 0
+ fi
+ done
+ echo "false"
+ exit 1
+fi
+
+
# Get GnuPG version from VERSION file. For a GIT checkout this means
# that ./autogen.sh must have been run first. For a regular tarball
# VERSION is always available.
diff --git a/build-aux/speedo.mk b/build-aux/speedo.mk
index cd3a66d..5dde0fe 100644
--- a/build-aux/speedo.mk
+++ b/build-aux/speedo.mk
@@ -260,39 +260,51 @@ gnupg_ver := $(shell awk '$$1=="gnupg21_ver" {print $$2}' swdb.lst)
libgpg_error_ver := $(shell awk '$$1=="libgpg_error_ver" {print $$2}' swdb.lst)
libgpg_error_sha1:= $(shell awk '$$1=="libgpg_error_sha1" {print $$2}' swdb.lst)
+libgpg_error_sha2:= $(shell awk '$$1=="libgpg_error_sha2" {print $$2}' swdb.lst)
npth_ver := $(shell awk '$$1=="npth_ver" {print $$2}' swdb.lst)
npth_sha1 := $(shell awk '$$1=="npth_sha1" {print $$2}' swdb.lst)
+npth_sha2 := $(shell awk '$$1=="npth_sha2" {print $$2}' swdb.lst)
libgcrypt_ver := $(shell awk '$$1=="libgcrypt_ver" {print $$2}' swdb.lst)
libgcrypt_sha1 := $(shell awk '$$1=="libgcrypt_sha1" {print $$2}' swdb.lst)
+libgcrypt_sha2 := $(shell awk '$$1=="libgcrypt_sha2" {print $$2}' swdb.lst)
libassuan_ver := $(shell awk '$$1=="libassuan_ver" {print $$2}' swdb.lst)
libassuan_sha1 := $(shell awk '$$1=="libassuan_sha1" {print $$2}' swdb.lst)
+libassuan_sha2 := $(shell awk '$$1=="libassuan_sha2" {print $$2}' swdb.lst)
libksba_ver := $(shell awk '$$1=="libksba_ver" {print $$2}' swdb.lst)
libksba_sha1 := $(shell awk '$$1=="libksba_sha1" {print $$2}' swdb.lst)
+libksba_sha2 := $(shell awk '$$1=="libksba_sha2" {print $$2}' swdb.lst)
gpgme_ver := $(shell awk '$$1=="gpgme_ver" {print $$2}' swdb.lst)
gpgme_sha1 := $(shell awk '$$1=="gpgme_sha1" {print $$2}' swdb.lst)
+gpgme_sha2 := $(shell awk '$$1=="gpgme_sha2" {print $$2}' swdb.lst)
pinentry_ver := $(shell awk '$$1=="pinentry_ver" {print $$2}' swdb.lst)
pinentry_sha1 := $(shell awk '$$1=="pinentry_sha1" {print $$2}' swdb.lst)
+pinentry_sha2 := $(shell awk '$$1=="pinentry_sha2" {print $$2}' swdb.lst)
gpa_ver := $(shell awk '$$1=="gpa_ver" {print $$2}' swdb.lst)
gpa_sha1 := $(shell awk '$$1=="gpa_sha1" {print $$2}' swdb.lst)
+gpa_sha2 := $(shell awk '$$1=="gpa_sha2" {print $$2}' swdb.lst)
gpgex_ver := $(shell awk '$$1=="gpgex_ver" {print $$2}' swdb.lst)
gpgex_sha1 := $(shell awk '$$1=="gpgex_sha1" {print $$2}' swdb.lst)
+gpgex_sha2 := $(shell awk '$$1=="gpgex_sha2" {print $$2}' swdb.lst)
zlib_ver := $(shell awk '$$1=="zlib_ver" {print $$2}' swdb.lst)
zlib_sha1 := $(shell awk '$$1=="zlib_sha1_gz" {print $$2}' swdb.lst)
+zlib_sha2 := $(shell awk '$$1=="zlib_sha2_gz" {print $$2}' swdb.lst)
bzip2_ver := $(shell awk '$$1=="bzip2_ver" {print $$2}' swdb.lst)
bzip2_sha1 := $(shell awk '$$1=="bzip2_sha1_gz" {print $$2}' swdb.lst)
+bzip2_sha2 := $(shell awk '$$1=="bzip2_sha2_gz" {print $$2}' swdb.lst)
adns_ver := $(shell awk '$$1=="adns_ver" {print $$2}' swdb.lst)
adns_sha1 := $(shell awk '$$1=="adns_sha1" {print $$2}' swdb.lst)
+adns_sha2 := $(shell awk '$$1=="adns_sha2" {print $$2}' swdb.lst)
$(info Information from the version database)
$(info GnuPG ..........: $(gnupg_ver) (building $(gnupg_ver_this)))
@@ -628,6 +640,10 @@ SHA1SUM := $(shell $(topsrc)/build-aux/getswdb.sh --find-sha1sum)
ifeq ($(SHA1SUM),false)
$(error The sha1sum tool is missing)
endif
+SHA2SUM := $(shell $(topsrc)/build-aux/getswdb.sh --find-sha256sum)
+ifeq ($(SHA2SUM),false)
+$(error The sha256sum tool is missing)
+endif
BUILD_ISODATE=$(shell date -u +%Y-%m-%d)
@@ -705,6 +721,7 @@ define SETVARS
git="$(call GETVAR,speedo_pkg_$(1)_git)"; \
gitref="$(call GETVAR,speedo_pkg_$(1)_gitref)"; \
tar="$(call GETVAR,speedo_pkg_$(1)_tar)"; \
+ sha2="$(call GETVAR,$(1)_sha2)"; \
sha1="$(call GETVAR,$(1)_sha1)"; \
pkgsdir="$(sdir)/$(1)"; \
if [ "$(1)" = "gnupg" ]; then \
@@ -739,6 +756,7 @@ define SETVARS_W64
git="$(call GETVAR,speedo_pkg_$(1)_git)"; \
gitref="$(call GETVAR,speedo_pkg_$(1)_gitref)"; \
tar="$(call GETVAR,speedo_pkg_$(1)_tar)"; \
+ sha2="$(call GETVAR,$(1)_sha2)"; \
sha1="$(call GETVAR,$(1)_sha1)"; \
pkgsdir="$(sdir)/$(1)"; \
if [ "$(1)" = "gnupg" ]; then \
@@ -814,11 +832,19 @@ $(stampdir)/stamp-$(1)-00-unpack: $(stampdir)/stamp-directories
| $$$${pretar} | tar x$$$${opt}f - ;; \
esac; \
if [ -f tmp.tgz ]; then \
- if [ -n "$$$${sha1}" ]; then \
+ if [ -n "$$$${sha2}" ]; then \
+ tmp=$$$$($(SHA2SUM) <tmp.tgz|cut -d' ' -f1);\
+ if [ "$$$${tmp}" != "$$$${sha2}" ]; then \
+ echo "speedo:"; \
+ echo "speedo: ERROR: SHA-256 checksum mismatch for $(1)";\
+ echo "speedo:"; \
+ exit 1; \
+ fi; \
+ elif [ -n "$$$${sha1}" ]; then \
tmp=$$$$($(SHA1SUM) <tmp.tgz|cut -d' ' -f1);\
if [ "$$$${tmp}" != "$$$${sha1}" ]; then \
echo "speedo:"; \
- echo "speedo: ERROR: checksum mismatch for $(1)";\
+ echo "speedo: ERROR: SHA-1 checksum mismatch for $(1)";\
echo "speedo:"; \
exit 1; \
fi; \
@@ -1128,7 +1154,17 @@ installer-from-source: dist-source
tar xJf "../$(INST_NAME)-$(INST_VERSION)_$(BUILD_DATESTR).tar.xz";\
cd $(INST_NAME)-$(INST_VERSION); \
$(MAKE) -f build-aux/speedo.mk this-w32-installer SELFCHECK=0;\
- mv "PLAY/inst/$(INST_NAME)-$(INST_VERSION)_$(BUILD_DATESTR).exe" ../.. ;\
+ reldate="$$(date -u +%Y-%m-%d)" ;\
+ exefile="$(INST_NAME)-$(INST_VERSION)_$(BUILD_DATESTR).exe" ;\
+ mv "PLAY/inst/$$exefile" ../.. ;\
+ exefile="../../$$exefile" ;\
+ ( pref="#+macro: gnupg21_w32_" ;\
+ echo "$${pref}ver $(INST_VERSION)_$(BUILD_DATESTR)" ;\
+ echo "$${pref}date $${reldate}" ;\
+ echo "$${pref}size $$(wc -c <$$exefile|awk '{print int($$1/1024)}')k";\
+ echo "$${pref}sha1 $$(sha1sum <$$exefile|cut -d' ' -f1)" ;\
+ echo "$${pref}sha2 $$(sha256sum <$$exefile|cut -d' ' -f1)" ;\
+ ) | tee $$exefile.swdb ;\
)
endif
diff --git a/common/Makefile.am b/common/Makefile.am
index c02c60e..d09f0df 100644
--- a/common/Makefile.am
+++ b/common/Makefile.am
@@ -42,7 +42,7 @@ include $(top_srcdir)/am/cmacros.am
common_sources = \
common-defs.h \
- util.h i18n.c i18n.h \
+ util.h fwddecl.h i18n.c i18n.h \
types.h host2net.h dynload.h w32help.h \
mapstrings.c stringhelp.c stringhelp.h \
strlist.c strlist.h \
@@ -87,7 +87,8 @@ common_sources = \
helpfile.c \
mkdir_p.c mkdir_p.h \
strlist.c strlist.h \
- call-gpg.c call-gpg.h
+ call-gpg.c call-gpg.h \
+ exectool.c exectool.h
if HAVE_W32_SYSTEM
common_sources += w32-reg.c w32-afunix.c w32-afunix.h
diff --git a/common/argparse.c b/common/argparse.c
index b6abf86..c69241d 100644
--- a/common/argparse.c
+++ b/common/argparse.c
@@ -1,6 +1,6 @@
/* [argparse.c wk 17.06.97] Argument Parser for option handling
* Copyright (C) 1998-2001, 2006-2008, 2012 Free Software Foundation, Inc.
- * Copyright (C) 1997-2001, 2006-2008, 2013-2015 Werner Koch
+ * Copyright (C) 1997-2001, 2006-2008, 2013-2016 Werner Koch
*
* This file is part of GnuPG.
*
@@ -71,7 +71,7 @@
#else /* Used by GnuPG */
# define ARGPARSE_GPL_VERSION 3
-# define ARGPARSE_CRIGHT_STR "Copyright (C) 2015 Free Software Foundation, Inc."
+# define ARGPARSE_CRIGHT_STR "Copyright (C) 2016 Free Software Foundation, Inc."
#endif /*GNUPG_MAJOR_VERSION*/
diff --git a/common/asshelp.c b/common/asshelp.c
index d33ffb5..f2b4402 100644
--- a/common/asshelp.c
+++ b/common/asshelp.c
@@ -42,6 +42,7 @@
#include "exechelp.h"
#include "sysutils.h"
#include "status.h"
+#include "membuf.h"
#include "asshelp.h"
/* The type we use for lock_agent_spawning. */
@@ -699,3 +700,40 @@ start_new_dirmngr (assuan_context_t *r_ctx,
*r_ctx = ctx;
return 0;
}
+
+
+/* Return the version of a server using "GETINFO version". On success
+ 0 is returned and R_VERSION receives a malloced string with the
+ version which must be freed by the caller. On error NULL is stored
+ at R_VERSION and an error code returned. Mode is in general 0 but
+ certian values may be used to modify the used version command:
+
+ MODE == 0 = Use "GETINFO version"
+ MODE == 2 - Use "SCD GETINFO version"
+ */
+gpg_error_t
+get_assuan_server_version (assuan_context_t ctx, int mode, char **r_version)
+{
+ gpg_error_t err;
+ membuf_t data;
+
+ init_membuf (&data, 64);
+ err = assuan_transact (ctx,
+ mode == 2? "SCD GETINFO version"
+ /**/ : "GETINFO version",
+ put_membuf_cb, &data,
+ NULL, NULL, NULL, NULL);
+ if (err)
+ {
+ xfree (get_membuf (&data, NULL));
+ *r_version = NULL;
+ }
+ else
+ {
+ put_membuf (&data, "", 1);
+ *r_version = get_membuf (&data, NULL);
+ if (!*r_version)
+ err = gpg_error_from_syserror ();
+ }
+ return err;
+}
diff --git a/common/asshelp.h b/common/asshelp.h
index 35d2115..20414bd 100644
--- a/common/asshelp.h
+++ b/common/asshelp.h
@@ -74,6 +74,10 @@ start_new_dirmngr (assuan_context_t *r_ctx,
gpg_error_t (*status_cb)(ctrl_t, int, ...),
ctrl_t status_cb_arg);
+/* Return the version of a server using "GETINFO version". */
+gpg_error_t get_assuan_server_version (assuan_context_t ctx,
+ int mode, char **r_version);
+
/*-- asshelp2.c --*/
diff --git a/common/b64enc.c b/common/b64enc.c
index 087f27c..9101d98 100644
--- a/common/b64enc.c
+++ b/common/b64enc.c
@@ -348,7 +348,6 @@ b64enc_finish (struct b64state *state)
{
for (idx=0; idx < 4; idx++)
es_putc (tmp[idx], state->stream);
- idx = 0;
if (es_ferror (state->stream))
goto write_error;
}
@@ -356,7 +355,6 @@ b64enc_finish (struct b64state *state)
{
for (idx=0; idx < 4; idx++)
putc (tmp[idx], state->fp);
- idx = 0;
if (ferror (state->fp))
goto write_error;
}
diff --git a/common/call-gpg.c b/common/call-gpg.c
index cd865ef..f5a62ec 100644
--- a/common/call-gpg.c
+++ b/common/call-gpg.c
@@ -36,6 +36,19 @@
#include "strlist.h"
#include "util.h"
+
+static GPGRT_INLINE gpg_error_t
+my_error_from_syserror (void)
+{
+ return gpg_err_make (default_errsource, gpg_err_code_from_syserror ());
+}
+
+static GPGRT_INLINE gpg_error_t
+my_error_from_errno (int e)
+{
+ return gpg_err_make (default_errsource, gpg_err_code_from_errno (e));
+}
+
/* Fire up a new GPG. Handle the server's initial greeting. Returns
0 on success and stores the assuan context at R_CTX. */
@@ -74,7 +87,7 @@ start_gpg (ctrl_t ctrl, const char *gpg_program, strlist_t gpg_arguments,
if (fflush (NULL))
{
- err = gpg_error_from_syserror ();
+ err = my_error_from_syserror ();
log_error ("error flushing pending output: %s\n", gpg_strerror (err));
return err;
}
@@ -82,7 +95,7 @@ start_gpg (ctrl_t ctrl, const char *gpg_program, strlist_t gpg_arguments,
argv = xtrycalloc (strlist_length (gpg_arguments) + 3, sizeof *argv);
if (argv == NULL)
{
- err = gpg_error_from_syserror ();
+ err = my_error_from_syserror ();
return err;
}
i = 0;
@@ -196,7 +209,7 @@ writer_thread_main (void *arg)
{
if (errno == EINTR)
continue;
- err = gpg_error_from_syserror ();
+ err = my_error_from_syserror ();
break; /* Write error. */
}
length -= nwritten;
@@ -250,7 +263,7 @@ start_writer (int fd, const void *data, size_t datalen, estream_t stream,
parm = xtrymalloc (sizeof *parm);
if (!parm)
- return gpg_error_from_syserror ();
+ return my_error_from_syserror ();
parm->fd = fd;
parm->data = data;
parm->datalen = datalen;
@@ -263,7 +276,7 @@ start_writer (int fd, const void *data, size_t datalen, estream_t stream,
ret = npth_create (&thread, &tattr, writer_thread_main, parm);
if (ret)
{
- err = gpg_error_from_errno (ret);
+ err = my_error_from_errno (ret);
log_error ("error spawning writer thread: %s\n", gpg_strerror (err));
}
else
@@ -304,7 +317,7 @@ reader_thread_main (void *arg)
{
if (errno == EINTR)
continue;
- err = gpg_error_from_syserror ();
+ err = my_error_from_syserror ();
break; /* Read error. */
}
@@ -357,7 +370,7 @@ start_reader (int fd, membuf_t *mb, estream_t stream,
parm = xtrymalloc (sizeof *parm);
if (!parm)
- return gpg_error_from_syserror ();
+ return my_error_from_syserror ();
parm->fd = fd;
parm->mb = mb;
parm->stream = stream;
@@ -369,7 +382,7 @@ start_reader (int fd, membuf_t *mb, estream_t stream,
ret = npth_create (&thread, &tattr, reader_thread_main, parm);
if (ret)
{
- err = gpg_error_from_errno (ret);
+ err = my_error_from_errno (ret);
log_error ("error spawning reader thread: %s\n", gpg_strerror (err));
}
else
@@ -474,7 +487,7 @@ _gpg_encrypt (ctrl_t ctrl,
ret = npth_join (reader_thread, NULL);
if (ret)
{
- err = gpg_error_from_errno (ret);
+ err = my_error_from_errno (ret);
log_error ("waiting for reader thread failed: %s\n", gpg_strerror (err));
goto leave;
}
@@ -491,7 +504,7 @@ _gpg_encrypt (ctrl_t ctrl,
ret = npth_join (writer_thread, NULL);
if (ret)
{
- err = gpg_error_from_errno (ret);
+ err = my_error_from_errno (ret);
log_error ("waiting for writer thread failed: %s\n", gpg_strerror (err));
goto leave;
}
@@ -549,7 +562,7 @@ gpg_encrypt_blob (ctrl_t ctrl,
*r_ciph = get_membuf (&reader_mb, r_ciphlen);
if (!*r_ciph)
{
- err = gpg_error_from_syserror ();
+ err = my_error_from_syserror ();
log_error ("error while storing the data in the reader thread: %s\n",
gpg_strerror (err));
}
@@ -646,7 +659,7 @@ _gpg_decrypt (ctrl_t ctrl,
ret = npth_join (reader_thread, NULL);
if (ret)
{
- err = gpg_error_from_errno (ret);
+ err = my_error_from_errno (ret);
log_error ("waiting for reader thread failed: %s\n", gpg_strerror (err));
goto leave;
}
@@ -662,7 +675,7 @@ _gpg_decrypt (ctrl_t ctrl,
ret = npth_join (writer_thread, NULL);
if (ret)
{
- err = gpg_error_from_errno (ret);
+ err = my_error_from_errno (ret);
log_error ("waiting for writer thread failed: %s\n", gpg_strerror (err));
goto leave;
}
@@ -717,7 +730,7 @@ gpg_decrypt_blob (ctrl_t ctrl,
*r_plain = get_membuf (&reader_mb, r_plainlen);
if (!*r_plain)
{
- err = gpg_error_from_syserror ();
+ err = my_error_from_syserror ();
log_error ("error while storing the data in the reader thread: %s\n",
gpg_strerror (err));
}
diff --git a/common/call-gpg.h b/common/call-gpg.h
index 74d3819..19993ef 100644
--- a/common/call-gpg.h
+++ b/common/call-gpg.h
@@ -17,15 +17,14 @@
* along with this program; if not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef G13_CALL_GPG_H
-#define G13_CALL_GPG_H
+#ifndef GNUPG_COMMON_CALL_GPG_H
+#define GNUPG_COMMON_CALL_GPG_H
#include <gpg-error.h>
+#include "fwddecl.h"
#include "strlist.h"
-typedef struct server_control_s *ctrl_t;
-
gpg_error_t gpg_encrypt_blob (ctrl_t ctrl,
const char *gpg_program,
strlist_t gpg_arguments,
@@ -52,4 +51,4 @@ gpg_error_t gpg_decrypt_stream (ctrl_t ctrl,
estream_t cipher_stream,
estream_t plain_stream);
-#endif /*G13_CALL_GPG_H*/
+#endif /*GNUPG_COMMON_CALL_GPG_H*/
diff --git a/common/common-defs.h b/common/common-defs.h
index 861967f..ab5ed34 100644
--- a/common/common-defs.h
+++ b/common/common-defs.h
@@ -3,12 +3,22 @@
*
* This file is part of GnuPG.
*
- * GnuPG is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of either
*
- * GnuPG is distributed in the hope that it will be useful,
+ * - the GNU Lesser General Public License as published by the Free
+ * Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * or
+ *
+ * - the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * or both in parallel, as here.
+ *
+ * This file is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
diff --git a/common/dotlock.c b/common/dotlock.c
index d880859..26005bf 100644
--- a/common/dotlock.c
+++ b/common/dotlock.c
@@ -412,7 +412,8 @@ struct dotlock_handle
/* A list of of all lock handles. The volatile attribute might help
- if used in an atexit handler. */
+ if used in an atexit handler. Note that [UN]LOCK_all_lockfiles
+ must not change ERRNO. */
static volatile dotlock_t all_lockfiles;
#ifdef DOTLOCK_USE_PTHREAD
static pthread_mutex_t all_lockfiles_mutex = PTHREAD_MUTEX_INITIALIZER;
@@ -434,6 +435,41 @@ static int never_lock;
+
+#ifdef HAVE_DOSISH_SYSTEM
+static int
+map_w32_to_errno (DWORD w32_err)
+{
+ switch (w32_err)
+ {
+ case 0:
+ return 0;
+
+ case ERROR_FILE_NOT_FOUND:
+ return ENOENT;
+
+ case ERROR_PATH_NOT_FOUND:
+ return ENOENT;
+
+ case ERROR_ACCESS_DENIED:
+ return EPERM;
+
+ case ERROR_INVALID_HANDLE:
+ case ERROR_INVALID_BLOCK:
+ return EINVAL;
+
+ case ERROR_NOT_ENOUGH_MEMORY:
+ return ENOMEM;
+
+ case ERROR_NO_DATA:
+ case ERROR_BROKEN_PIPE:
+ return EPIPE;
+
+ default:
+ return EIO;
+ }
+}
+#endif /*HAVE_DOSISH_SYSTEM*/
/* Entirely disable all locking. This function should be called
@@ -514,11 +550,12 @@ read_lockfile (dotlock_t h, int *same_node )
continue;
if (res < 0)
{
+ int e = errno;
my_info_1 ("error reading lockfile '%s'\n", h->lockname );
close (fd);
if (buffer != buffer_space)
xfree (buffer);
- my_set_errno (0); /* Do not return an inappropriate ERRNO. */
+ my_set_errno (e);
return -1;
}
p += res;
@@ -532,7 +569,7 @@ read_lockfile (dotlock_t h, int *same_node )
my_info_1 ("invalid size of lockfile '%s'\n", h->lockname);
if (buffer != buffer_space)
xfree (buffer);
- my_set_errno (0); /* Better don't return an inappropriate ERRNO. */
+ my_set_errno (EINVAL);
return -1;
}
@@ -543,7 +580,7 @@ read_lockfile (dotlock_t h, int *same_node )
my_error_2 ("invalid pid %d in lockfile '%s'\n", pid, h->lockname);
if (buffer != buffer_space)
xfree (buffer);
- my_set_errno (0);
+ my_set_errno (EINVAL);
return -1;
}
@@ -664,12 +701,14 @@ dotlock_create_unix (dotlock_t h, const char *file_to_lock)
if ( fd == -1 )
{
+ int saveerrno = errno;
all_lockfiles = h->next;
UNLOCK_all_lockfiles ();
my_error_2 (_("failed to create temporary file '%s': %s\n"),
- h->tname, strerror(errno));
+ h->tname, strerror (errno));
xfree (h->tname);
xfree (h);
+ my_set_errno (saveerrno);
return NULL;
}
if ( write (fd, pidstr, 11 ) != 11 )
@@ -696,19 +735,25 @@ dotlock_create_unix (dotlock_t h, const char *file_to_lock)
h->use_o_excl = 1;
break;
default:
- my_error_2 ("can't check whether hardlinks are supported for '%s': %s\n",
- h->tname, strerror(errno));
+ {
+ int saveerrno = errno;
+ my_error_2 ("can't check whether hardlinks are supported for '%s': %s\n"
+ , h->tname, strerror (saveerrno));
+ my_set_errno (saveerrno);
+ }
goto write_failed;
}
h->lockname = xtrymalloc (strlen (file_to_lock) + 6 );
if (!h->lockname)
{
+ int saveerrno = errno;
all_lockfiles = h->next;
UNLOCK_all_lockfiles ();
unlink (h->tname);
xfree (h->tname);
xfree (h);
+ my_set_errno (saveerrno);
return NULL;
}
strcpy (stpcpy (h->lockname, file_to_lock), EXTSEP_S "lock");
@@ -719,14 +764,18 @@ dotlock_create_unix (dotlock_t h, const char *file_to_lock)
return h;
write_failed:
- all_lockfiles = h->next;
- UNLOCK_all_lockfiles ();
- my_error_2 (_("error writing to '%s': %s\n"), h->tname, strerror (errno));
- if ( fd != -1 )
- close (fd);
- unlink (h->tname);
- xfree (h->tname);
- xfree (h);
+ {
+ int saveerrno = errno;
+ all_lockfiles = h->next;
+ UNLOCK_all_lockfiles ();
+ my_error_2 (_("error writing to '%s': %s\n"), h->tname, strerror (errno));
+ if ( fd != -1 )
+ close (fd);
+ unlink (h->tname);
+ xfree (h->tname);
+ xfree (h);
+ my_set_errno (saveerrno);
+ }
return NULL;
}
#endif /*HAVE_POSIX_SYSTEM*/
@@ -784,11 +833,13 @@ dotlock_create_w32 (dotlock_t h, const char *file_to_lock)
}
if (h->lockhd == INVALID_HANDLE_VALUE)
{
+ int saveerrno = map_w32_to_errno (GetLastError ());
all_lockfiles = h->next;
UNLOCK_all_lockfiles ();
my_error_2 (_("can't create '%s': %s\n"), h->lockname, w32_strerror (-1));
xfree (h->lockname);
xfree (h);
+ my_set_errno (saveerrno);
return NULL;
}
return h;
@@ -911,7 +962,7 @@ dotlock_destroy_w32 (dotlock_t h)
#endif /*HAVE_DOSISH_SYSTEM*/
-/* Destroy the locck handle H and release the lock. */
+/* Destroy the lock handle H and release the lock. */
void
dotlock_destroy (dotlock_t h)
{
@@ -962,6 +1013,7 @@ dotlock_take_unix (dotlock_t h, long timeout)
int ownerchanged;
const char *maybe_dead="";
int same_node;
+ int saveerrno;
again:
if (h->use_o_excl)
@@ -981,8 +1033,10 @@ dotlock_take_unix (dotlock_t h, long timeout)
; /* Lock held by another process. */
else if (fd == -1)
{
+ saveerrno = errno;
my_error_2 ("lock not made: open(O_EXCL) of '%s' failed: %s\n",
- h->lockname, strerror (errno));
+ h->lockname, strerror (saveerrno));
+ my_set_errno (saveerrno);
return -1;
}
else
@@ -1000,10 +1054,12 @@ dotlock_take_unix (dotlock_t h, long timeout)
return 0;
}
/* Write error. */
+ saveerrno = errno;
my_error_2 ("lock not made: writing to '%s' failed: %s\n",
h->lockname, strerror (errno));
close (fd);
unlink (h->lockname);
+ my_set_errno (saveerrno);
return -1;
}
}
@@ -1016,11 +1072,13 @@ dotlock_take_unix (dotlock_t h, long timeout)
if (stat (h->tname, &sb))
{
+ saveerrno = errno;
my_error_1 ("lock not made: Oops: stat of tmp file failed: %s\n",
strerror (errno));
/* In theory this might be a severe error: It is possible
that link succeeded but stat failed due to changed
permissions. We can't do anything about it, though. */
+ my_set_errno (saveerrno);
return -1;
}
@@ -1036,7 +1094,9 @@ dotlock_take_unix (dotlock_t h, long timeout)
{
if ( errno != ENOENT )
{
+ saveerrno = errno;
my_info_0 ("cannot read lockfile\n");
+ my_set_errno (saveerrno);
return -1;
}
my_info_0 ("lockfile disappeared\n");
@@ -1131,6 +1191,7 @@ dotlock_take_w32 (dotlock_t h, long timeout)
{
my_error_2 (_("lock '%s' not made: %s\n"),
h->lockname, w32_strerror (w32err));
+ my_set_errno (map_w32_to_errno (w32err));
return -1;
}
@@ -1161,6 +1222,7 @@ dotlock_take_w32 (dotlock_t h, long timeout)
goto again;
}
+ my_set_errno (EACCES);
return -1;
}
#endif /*HAVE_DOSISH_SYSTEM*/
@@ -1200,23 +1262,29 @@ static int
dotlock_release_unix (dotlock_t h)
{
int pid, same_node;
+ int saveerrno;
pid = read_lockfile (h, &same_node);
if ( pid == -1 )
{
+ saveerrno = errno;
my_error_0 ("release_dotlock: lockfile error\n");
+ my_set_errno (saveerrno);
return -1;
}
if ( pid != getpid() || !same_node )
{
my_error_1 ("release_dotlock: not our lock (pid=%d)\n", pid);
+ my_set_errno (EACCES);
return -1;
}
if ( unlink( h->lockname ) )
{
+ saveerrno = errno;
my_error_1 ("release_dotlock: error removing lockfile '%s'\n",
h->lockname);
+ my_set_errno (saveerrno);
return -1;
}
/* Fixme: As an extra check we could check whether the link count is
@@ -1236,8 +1304,10 @@ dotlock_release_w32 (dotlock_t h)
memset (&ovl, 0, sizeof ovl);
if (!UnlockFileEx (h->lockhd, 0, 1, 0, &ovl))
{
+ int saveerrno = map_w32_to_errno (GetLastError ());
my_error_2 ("release_dotlock: error removing lockfile '%s': %s\n",
h->lockname, w32_strerror (-1));
+ my_set_errno (saveerrno);
return -1;
}
diff --git a/common/exectool.c b/common/exectool.c
new file mode 100644
index 0000000..766ee94
--- /dev/null
+++ b/common/exectool.c
@@ -0,0 +1,440 @@
+/* exectool.c - Utility functions to execute a helper tool
+ * Copyright (C) 2015 Werner Koch
+ *
+ * This file is part of GnuPG.
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of either
+ *
+ * - the GNU Lesser General Public License as published by the Free
+ * Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * or
+ *
+ * - the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * or both in parallel, as here.
+ *
+ * This file is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#include <errno.h>
+#include <assert.h>
+#include <gpg-error.h>
+
+#include <assuan.h>
+#include "i18n.h"
+#include "logging.h"
+#include "membuf.h"
+#include "mischelp.h"
+#include "exechelp.h"
+#include "sysutils.h"
+#include "util.h"
+
+typedef struct
+{
+ const char *pgmname;
+ int cont;
+ int used;
+ char buffer[256];
+} read_and_log_buffer_t;
+
+
+static inline gpg_error_t
+my_error_from_syserror (void)
+{
+ return gpg_err_make (default_errsource, gpg_err_code_from_syserror ());
+}
+
+
+static void
+read_and_log_stderr (read_and_log_buffer_t *state, es_poll_t *fderr)
+{
+ gpg_error_t err;
+ int c;
+
+ if (!fderr)
+ {
+ /* Flush internal buffer. */
+ if (state->used)
+ {
+ const char *pname;
+ int len;
+
+ state->buffer[state->used] = 0;
+ state->used = 0;
+
+ pname = strrchr (state->pgmname, '/');
+ if (pname && pname != state->pgmname && pname[1])
+ pname++;
+ else
+ pname = state->pgmname;
+ /* If our pgmname plus colon is identical to the start of
+ the output, print only the output. */
+ len = strlen (pname);
+ if (!state->cont
+ && !strncmp (state->buffer, pname, len)
+ && strlen (state->buffer) > strlen (pname)
+ && state->buffer[len] == ':' )
+ log_info ("%s\n", state->buffer);
+ else
+ log_info ("%s%c %s\n",
+ pname, state->cont? '+':':', state->buffer);
+ }
+ state->cont = 0;
+ return;
+ }
+ for (;;)
+ {
+ c = es_fgetc (fderr->stream);
+ if (c == EOF)
+ {
+ if (es_feof (fderr->stream))
+ {
+ fderr->ignore = 1; /* Not anymore needed. */
+ }
+ else if (es_ferror (fderr->stream))
+ {
+ err = my_error_from_syserror ();
+ log_error ("error reading stderr of '%s': %s\n",
+ state->pgmname, gpg_strerror (err));
+ fderr->ignore = 1; /* Disable. */
+ }
+
+ break;
+ }
+ else if (c == '\n')
+ {
+ read_and_log_stderr (state, NULL);
+ }
+ else
+ {
+ if (state->used >= sizeof state->buffer - 1)
+ {
+ read_and_log_stderr (state, NULL);
+ state->cont = 1;
+ }
+ state->buffer[state->used++] = c;
+ }
+ }
+}
+
+
+
+/* A buffer to copy from one stream to another. */
+struct copy_buffer
+{
+ char buffer[4096];
+ char *writep;
+ size_t nread;
+};
+
+
+/* Initialize a copy buffer. */
+static void
+copy_buffer_init (struct copy_buffer *c)
+{
+ c->writep = c->buffer;
+ c->nread = 0;
+}
+
+
+/* Securely wipe a copy buffer. */
+static void
+copy_buffer_shred (struct copy_buffer *c)
+{
+ wipememory (c->buffer, sizeof c->buffer);
+ c->writep = NULL;
+ c->nread = ~0U;
+}
+
+
+/* Copy data from SOURCE to SINK using copy buffer C. */
+static gpg_error_t
+copy_buffer_do_copy (struct copy_buffer *c, estream_t source, estream_t sink)
+{
+ gpg_error_t err;
+ size_t nwritten;
+
+ if (c->nread == 0)
+ {
+ c->writep = c->buffer;
+ err = es_read (source, c->buffer, sizeof c->buffer, &c->nread);
+ if (err)
+ {
+ if (errno == EAGAIN)
+ return 0; /* We will just retry next time. */
+
+ return my_error_from_syserror ();
+ }
+
+ assert (c->nread <= sizeof c->buffer);
+ }
+
+ if (c->nread == 0)
+ return 0; /* Done copying. */
+
+ err = es_write (sink, c->writep, c->nread, &nwritten);
+ if (err)
+ {
+ if (errno == EAGAIN)
+ return 0; /* We will just retry next time. */
+
+ return my_error_from_syserror ();
+ }
+
+ assert (nwritten <= c->nread);
+ c->writep += nwritten;
+ c->nread -= nwritten;
+ assert (c->writep - c->buffer <= sizeof c->buffer);
+
+ if (es_fflush (sink) && errno != EAGAIN)
+ err = my_error_from_syserror ();
+
+ return err;
+}
+
+
+/* Flush the remaining data to SINK. */
+static gpg_error_t
+copy_buffer_flush (struct copy_buffer *c, estream_t sink)
+{
+ gpg_error_t err;
+
+ while (c->nread > 0)
+ {
+ err = copy_buffer_do_copy (c, NULL, sink);
+ if (err)
+ return err;
+ }
+
+ return 0;
+}
+
+
+
+/* Run the program PGMNAME with the command line arguments given in
+ the NULL terminates array ARGV. If INPUT is not NULL it will be
+ fed to stdin of the process. stderr is logged using log_info and
+ the process' stdout is written to OUTPUT. On error a diagnostic is
+ printed, and an error code returned. */
+gpg_error_t
+gnupg_exec_tool_stream (const char *pgmname, const char *argv[],
+ estream_t input,
+ estream_t output)
+{
+ gpg_error_t err;
+ pid_t pid;
+ estream_t infp = NULL;
+ estream_t outfp, errfp;
+ es_poll_t fds[3];
+ int count;
+ read_and_log_buffer_t fderrstate;
+ struct copy_buffer cpbuf[2];
+
+ memset (fds, 0, sizeof fds);
+ memset (&fderrstate, 0, sizeof fderrstate);
+ copy_buffer_init (&cpbuf[0]);
+ copy_buffer_init (&cpbuf[1]);
+
+ err = gnupg_spawn_process (pgmname, argv, GPG_ERR_SOURCE_DEFAULT,
+ NULL, GNUPG_SPAWN_NONBLOCK,
+ input? &infp : NULL,
+ &outfp, &errfp, &pid);
+ if (err)
+ {
+ log_error ("error running '%s': %s\n", pgmname, gpg_strerror (err));
+ return err;
+ }
+
+ fderrstate.pgmname = pgmname;
+
+ fds[0].stream = infp;
+ fds[0].want_write = 1;
+ if (!input)
+ fds[0].ignore = 1;
+ fds[1].stream = outfp;
+ fds[1].want_read = 1;
+ fds[2].stream = errfp;
+ fds[2].want_read = 1;
+ /* Now read as long as we have something to poll. We continue
+ reading even after EOF or error on stdout so that we get the
+ other error messages or remaining outut. */
+ while (!fds[1].ignore && !fds[2].ignore)
+ {
+ count = es_poll (fds, DIM(fds), -1);
+ if (count == -1)
+ {
+ err = my_error_from_syserror ();
+ log_error ("error polling '%s': %s\n", pgmname, gpg_strerror (err));
+ goto leave;
+ }
+ if (!count)
+ {
+ log_debug ("unexpected timeout while polling '%s'\n", pgmname);
+ break;
+ }
+
+ if (fds[0].got_write)
+ {
+ err = copy_buffer_do_copy (&cpbuf[0], input, fds[0].stream);
+ if (err)
+ {
+ log_error ("error feeding data to '%s': %s\n",
+ pgmname, gpg_strerror (err));
+ goto leave;
+ }
+
+ if (es_feof (input))
+ {
+ err = copy_buffer_flush (&cpbuf[0], fds[0].stream);
+ if (err)
+ {
+ log_error ("error feeding data to '%s': %s\n",
+ pgmname, gpg_strerror (err));
+ goto leave;
+ }
+
+ fds[0].ignore = 1; /* ready. */
+ es_fclose (infp); infp = NULL;
+ }
+ }
+
+ if (fds[1].got_read)
+ {
+ err = copy_buffer_do_copy (&cpbuf[1], fds[1].stream, output);
+ if (err)
+ {
+ log_error ("error reading data from '%s': %s\n",
+ pgmname, gpg_strerror (err));
+ goto leave;
+ }
+ }
+
+ if (fds[2].got_read)
+ read_and_log_stderr (&fderrstate, fds + 2);
+ }
+
+ err = copy_buffer_flush (&cpbuf[1], output);
+ if (err)
+ {
+ log_error ("error reading data from '%s': %s\n",
+ pgmname, gpg_strerror (err));
+ goto leave;
+ }
+
+ read_and_log_stderr (&fderrstate, NULL); /* Flush. */
+ es_fclose (infp); infp = NULL;
+ es_fclose (outfp); outfp = NULL;
+ es_fclose (errfp); errfp = NULL;
+
+ err = gnupg_wait_process (pgmname, pid, 1, NULL);
+ pid = (pid_t)(-1);
+
+ leave:
+ if (err)
+ gnupg_kill_process (pid);
+
+ es_fclose (infp);
+ es_fclose (outfp);
+ es_fclose (errfp);
+ if (pid != (pid_t)(-1))
+ gnupg_wait_process (pgmname, pid, 1, NULL);
+ gnupg_release_process (pid);
+
+ copy_buffer_shred (&cpbuf[0]);
+ copy_buffer_shred (&cpbuf[1]);
+ return err;
+}
+
+
+/* A dummy free function to pass to 'es_mopen'. */
+static void
+nop_free (void *ptr)
+{
+ (void) ptr;
+}
+
+/* Run the program PGMNAME with the command line arguments given in
+ the NULL terminates array ARGV. If INPUT_STRING is not NULL it
+ will be fed to stdin of the process. stderr is logged using
+ log_info and the process' stdout is returned in a newly malloced
+ buffer RESULT with the length stored at RESULTLEN if not given as
+ NULL. A hidden Nul is appended to the output. On error NULL is
+ stored at RESULT, a diagnostic is printed, and an error code
+ returned. */
+gpg_error_t
+gnupg_exec_tool (const char *pgmname, const char *argv[],
+ const char *input_string,
+ char **result, size_t *resultlen)
+{
+ gpg_error_t err;
+ estream_t input = NULL;
+ estream_t output;
+ size_t len;
+ size_t nread;
+
+ *result = NULL;
+ if (resultlen)
+ *resultlen = 0;
+
+ if (input_string)
+ {
+ len = strlen (input_string);
+ input = es_mopen ((char *) input_string, len, len,
+ 0 /* don't grow */, NULL, nop_free, "rb");
+ if (! input)
+ return my_error_from_syserror ();
+ }
+
+ output = es_fopenmem (0, "wb");
+ if (! output)
+ {
+ err = my_error_from_syserror ();
+ goto leave;
+ }
+
+ err = gnupg_exec_tool_stream (pgmname, argv, input, output);
+ if (err)
+ goto leave;
+
+ len = es_ftello (output);
+ err = es_fseek (output, 0, SEEK_SET);
+ if (err)
+ goto leave;
+
+ *result = xtrymalloc (len);
+ if (*result == NULL)
+ {
+ err = my_error_from_syserror ();
+ goto leave;
+ }
+
+ err = es_read (output, *result, len, &nread);
+ if (! err)
+ {
+ assert (nread == len || !"short read on memstream");
+ if (resultlen)
+ *resultlen = len;
+ }
+
+ leave:
+ if (input)
+ es_fclose (input);
+ es_fclose (output);
+ return err;
+}
diff --git a/common/exectool.h b/common/exectool.h
new file mode 100644
index 0000000..d9439aa
--- /dev/null
+++ b/common/exectool.h
@@ -0,0 +1,56 @@
+/* sh-exectool.h - Utility functions to execute a helper tool
+ * Copyright (C) 2015 g10 Code GmbH
+ *
+ * This file is part of GnuPG.
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of either
+ *
+ * - the GNU Lesser General Public License as published by the Free
+ * Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * or
+ *
+ * - the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * or both in parallel, as here.
+ *
+ * This file is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GNUPG_COMMON_EXECTOOL_H
+#define GNUPG_COMMON_EXECTOOL_H
+
+#include <gpg-error.h>
+
+/* Run the program PGMNAME with the command line arguments given in
+ the NULL terminates array ARGV. If INPUT_STRING is not NULL it
+ will be fed to stdin of the process. stderr is logged using
+ log_info and the process' stdout is returned in a newly malloced
+ buffer RESULT with the length stored at RESULTLEN if not given as
+ NULL. A hidden Nul is appended to the output. On error NULL is
+ stored at RESULT, a diagnostic is printed, and an error code
+ returned. */
+gpg_error_t gnupg_exec_tool (const char *pgmname, const char *argv[],
+ const char *input_string,
+ char **result, size_t *resultlen);
+
+/* Run the program PGMNAME with the command line arguments given in
+ the NULL terminates array ARGV. If INPUT is not NULL it will be
+ fed to stdin of the process. stderr is logged using log_info and
+ the process' stdout is written to OUTPUT. On error a diagnostic is
+ printed, and an error code returned. */
+gpg_error_t gnupg_exec_tool_stream (const char *pgmname, const char *argv[],
+ estream_t input,
+ estream_t output);
+
+#endif /* GNUPG_COMMON_EXECTOOL_H */
diff --git a/common/fwddecl.h b/common/fwddecl.h
new file mode 100644
index 0000000..92f0453
--- /dev/null
+++ b/common/fwddecl.h
@@ -0,0 +1,39 @@
+/* fwddecl.h - Formward declarations
+ * Copyright (C) 2015 Werner Koch
+ *
+ * This file is part of GnuPG.
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of either
+ *
+ * - the GNU Lesser General Public License as published by the Free
+ * Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * or
+ *
+ * - the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * or both in parallel, as here.
+ *
+ * This file is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GNUPG_COMMON_FWDDECL_H
+#define GNUPG_COMMON_FWDDECL_H
+
+
+/*-- Forward declaration of the commonly used server control structure. */
+struct server_control_s;
+typedef struct server_control_s *ctrl_t;
+
+
+#endif /*GNUPG_COMMON_FWDDECL_H*/
diff --git a/common/get-passphrase.c b/common/get-passphrase.c
index 53ce7d1..f1517fb 100644
--- a/common/get-passphrase.c
+++ b/common/get-passphrase.c
@@ -130,17 +130,6 @@ default_inq_cb (void *opaque, const char *line)
}
-static gpg_error_t
-membuf_data_cb (void *opaque, const void *buffer, size_t length)
-{
- membuf_t *data = opaque;
-
- if (buffer)
- put_membuf (data, buffer, length);
- return 0;
-}
-
-
/* Ask for a passphrase via gpg-agent. On success the caller needs to
free the string stored at R_PASSPHRASE. On error NULL will be
stored at R_PASSPHRASE and an appropriate gpg error code is
@@ -214,7 +203,7 @@ gnupg_get_passphrase (const char *cache_id,
else
init_membuf (&data, 64);
err = assuan_transact (agent_ctx, line,
- membuf_data_cb, &data,
+ put_membuf_cb, &data,
default_inq_cb, NULL, NULL, NULL);
/* Older Pinentries return the old assuan error code for canceled
diff --git a/common/gettime.h b/common/gettime.h
index ec68faa..cbc257a 100644
--- a/common/gettime.h
+++ b/common/gettime.h
@@ -3,12 +3,22 @@
*
* This file is part of GnuPG.
*
- * GnuPG is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of either
*
- * GnuPG is distributed in the hope that it will be useful,
+ * - the GNU Lesser General Public License as published by the Free
+ * Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * or
+ *
+ * - the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * or both in parallel, as here.
+ *
+ * This file is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
diff --git a/common/iobuf.c b/common/iobuf.c
index e8b4a03..b6e7885 100644
--- a/common/iobuf.c
+++ b/common/iobuf.c
@@ -578,7 +578,7 @@ file_filter (void *opaque, int control, iobuf_t chain, byte * buf,
}
else if (control == IOBUFCTRL_DESC)
{
- *(char **) buf = "file_filter(fd)";
+ mem2str (buf, "file_filter(fd)", *ret_len);
}
else if (control == IOBUFCTRL_FREE)
{
@@ -589,7 +589,6 @@ file_filter (void *opaque, int control, iobuf_t chain, byte * buf,
if (!a->keep_open)
fd_cache_close (a->no_cache ? NULL : a->fname, f);
}
- f = GNUPG_INVALID_FD;
xfree (a); /* We can free our context now. */
}
@@ -668,7 +667,7 @@ file_es_filter (void *opaque, int control, iobuf_t chain, byte * buf,
}
else if (control == IOBUFCTRL_DESC)
{
- *(char **) buf = "estream_filter";
+ mem2str (buf, "estream_filter", *ret_len);
}
else if (control == IOBUFCTRL_FREE)
{
@@ -766,7 +765,7 @@ sock_filter (void *opaque, int control, iobuf_t chain, byte * buf,
}
else if (control == IOBUFCTRL_DESC)
{
- *(char **) buf = "sock_filter";
+ mem2str (buf, "sock_filter", *ret_len);
}
else if (control == IOBUFCTRL_FREE)
{
@@ -994,7 +993,7 @@ block_filter (void *opaque, int control, iobuf_t chain, byte * buffer,
}
else if (control == IOBUFCTRL_DESC)
{
- *(char **) buf = "block_filter";
+ mem2str (buf, "block_filter", *ret_len);
}
else if (control == IOBUFCTRL_FREE)
{
@@ -1058,19 +1057,23 @@ block_filter (void *opaque, int control, iobuf_t chain, byte * buffer,
return rc;
}
+#define MAX_IOBUF_DESC 32
+/*
+ * Fill the buffer by the description of iobuf A.
+ * The buffer size should be MAX_IOBUF_DESC (or larger).
+ * Returns BUF as (const char *).
+ */
static const char *
-iobuf_desc (iobuf_t a)
+iobuf_desc (iobuf_t a, byte *buf)
{
- size_t dummy_len = 0;
- const char *desc = "?";
+ size_t len = MAX_IOBUF_DESC;
if (! a || ! a->filter)
- return desc;
-
- a->filter (a->filter_ov, IOBUFCTRL_DESC, NULL,
- (byte *) & desc, &dummy_len);
+ memcpy (buf, "?", 2);
+ else
+ a->filter (a->filter_ov, IOBUFCTRL_DESC, NULL, buf, &len);
- return desc;
+ return buf;
}
static void
@@ -1080,9 +1083,10 @@ print_chain (iobuf_t a)
return;
for (; a; a = a->chain)
{
+ byte desc[MAX_IOBUF_DESC];
log_debug ("iobuf chain: %d.%d '%s' filter_eof=%d start=%d len=%d\n",
- a->no, a->subno, iobuf_desc (a), a->filter_eof,
+ a->no, a->subno, iobuf_desc (a, desc), a->filter_eof,
(int) a->d.start, (int) a->d.len);
}
}
@@ -1127,6 +1131,7 @@ iobuf_close (iobuf_t a)
for (; a; a = a_chain)
{
+ byte desc[MAX_IOBUF_DESC];
int rc2 = 0;
a_chain = a->chain;
@@ -1136,7 +1141,7 @@ iobuf_close (iobuf_t a)
if (DBG_IOBUF)
log_debug ("iobuf-%d.%d: close '%s'\n",
- a->no, a->subno, iobuf_desc (a));
+ a->no, a->subno, iobuf_desc (a, desc));
if (a->filter && (rc2 = a->filter (a->filter_ov, IOBUFCTRL_FREE,
a->chain, NULL, &dummy_len)))
@@ -1276,6 +1281,7 @@ do_open (const char *fname, int special_filenames,
size_t len = 0;
int print_only = 0;
int fd;
+ byte desc[MAX_IOBUF_DESC];
assert (use == IOBUF_INPUT || use == IOBUF_OUTPUT);
@@ -1322,7 +1328,7 @@ do_open (const char *fname, int special_filenames,
file_filter (fcx, IOBUFCTRL_INIT, NULL, NULL, &len);
if (DBG_IOBUF)
log_debug ("iobuf-%d.%d: open '%s' desc=%s fd=%d\n",
- a->no, a->subno, fname, iobuf_desc (a), FD2INT (fcx->fp));
+ a->no, a->subno, fname, iobuf_desc (a, desc), FD2INT (fcx->fp));
return a;
}
@@ -1440,6 +1446,8 @@ iobuf_sockopen (int fd, const char *mode)
int
iobuf_ioctl (iobuf_t a, iobuf_ioctl_t cmd, int intval, void *ptrval)
{
+ byte desc[MAX_IOBUF_DESC];
+
if (cmd == IOBUF_IOCTL_KEEP_OPEN)
{
/* Keep system filepointer/descriptor open. This was used in
@@ -1447,7 +1455,7 @@ iobuf_ioctl (iobuf_t a, iobuf_ioctl_t cmd, int intval, void *ptrval)
anymore. */
if (DBG_IOBUF)
log_debug ("iobuf-%d.%d: ioctl '%s' keep_open=%d\n",
- a ? a->no : -1, a ? a->subno : -1, iobuf_desc (a),
+ a ? a->no : -1, a ? a->subno : -1, iobuf_desc (a, desc),
intval);
for (; a; a = a->chain)
if (!a->chain && a->filter == file_filter)
@@ -1481,7 +1489,7 @@ iobuf_ioctl (iobuf_t a, iobuf_ioctl_t cmd, int intval, void *ptrval)
{
if (DBG_IOBUF)
log_debug ("iobuf-%d.%d: ioctl '%s' no_cache=%d\n",
- a ? a->no : -1, a ? a->subno : -1, iobuf_desc (a),
+ a ? a->no : -1, a ? a->subno : -1, iobuf_desc (a, desc),
intval);
for (; a; a = a->chain)
if (!a->chain && a->filter == file_filter)
@@ -1659,8 +1667,9 @@ iobuf_push_filter2 (iobuf_t a,
if (DBG_IOBUF)
{
+ byte desc[MAX_IOBUF_DESC];
log_debug ("iobuf-%d.%d: push '%s'\n",
- a->no, a->subno, iobuf_desc (a));
+ a->no, a->subno, iobuf_desc (a, desc));
print_chain (a);
}
@@ -1682,10 +1691,11 @@ pop_filter (iobuf_t a, int (*f) (void *opaque, int control,
iobuf_t b;
size_t dummy_len = 0;
int rc = 0;
+ byte desc[MAX_IOBUF_DESC];
if (DBG_IOBUF)
log_debug ("iobuf-%d.%d: pop '%s'\n",
- a->no, a->subno, iobuf_desc (a));
+ a->no, a->subno, iobuf_desc (a, desc));
if (a->use == IOBUF_INPUT_TEMP || a->use == IOBUF_OUTPUT_TEMP)
{
/* This should be the last filter in the pipeline. */
@@ -2189,6 +2199,7 @@ iobuf_write_temp (iobuf_t dest, iobuf_t source)
size_t
iobuf_temp_to_buffer (iobuf_t a, byte * buffer, size_t buflen)
{
+ byte desc[MAX_IOBUF_DESC];
size_t n;
while (1)
@@ -2196,7 +2207,7 @@ iobuf_temp_to_buffer (iobuf_t a, byte * buffer, size_t buflen)
int rc = filter_flush (a);
if (rc)
log_bug ("Flushing iobuf %d.%d (%s) from iobuf_temp_to_buffer failed. Ignoring.\n",
- a->no, a->subno, iobuf_desc (a));
+ a->no, a->subno, iobuf_desc (a, desc));
if (! a->chain)
break;
a = a->chain;
diff --git a/common/iobuf.h b/common/iobuf.h
index cb79105..8ba02b3 100644
--- a/common/iobuf.h
+++ b/common/iobuf.h
@@ -404,10 +404,9 @@ int iobuf_cancel (iobuf_t iobuf);
called on the pipeline.
IOBUFCTRL_DESC: Called with this value to get a human-readable
- description of the filter. * (char **) BUF should set to the
- NUL-terminated string. Note: you need to keep track of this
- value and, if necessary, free it when the filter function is
- called with control set to IOBUFCTRL_FREE.
+ description of the filter. *LEN is the size of the buffer.
+ The description is filled into BUF, NUL-terminated. Always
+ returns 0.
*/
int iobuf_push_filter (iobuf_t a, int (*f) (void *opaque, int control,
iobuf_t chain, byte * buf,
diff --git a/common/isascii.c b/common/isascii.c
index be14a38..6ebe79b 100644
--- a/common/isascii.c
+++ b/common/isascii.c
@@ -1,20 +1,13 @@
/* isascii.c - Replacement for isascii.
* Copyright (C) 2002 Free Software Foundation, Inc.
*
- * This file is part of GnuPG.
+ * This file is free software; as a special exception the author gives
+ * unlimited permission to copy and/or distribute it, with or without
+ * modifications, as long as this notice is preserved.
*
- * GnuPG is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * GnuPG is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ * This file is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
#ifdef HAVE_CONFIG_H
diff --git a/common/keyserver.h b/common/keyserver.h
index d56b4f4..63dbde6 100644
--- a/common/keyserver.h
+++ b/common/keyserver.h
@@ -3,12 +3,22 @@
*
* This file is part of GnuPG.
*
- * GnuPG is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of either
*
- * GnuPG is distributed in the hope that it will be useful,
+ * - the GNU Lesser General Public License as published by the Free
+ * Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * or
+ *
+ * - the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * or both in parallel, as here.
+ *
+ * This file is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
diff --git a/common/membuf.c b/common/membuf.c
index f4430a9..fde24f6 100644
--- a/common/membuf.c
+++ b/common/membuf.c
@@ -116,6 +116,20 @@ put_membuf (membuf_t *mb, const void *buf, size_t len)
}
+/* A variant of put_membuf accepting a void * and returning a
+ gpg_error_t (which will always return 0) to be used as a generic
+ callback handler. This function also allows buffer to be NULL. */
+gpg_error_t
+put_membuf_cb (void *opaque, const void *buf, size_t len)
+{
+ membuf_t *data = opaque;
+
+ if (buf)
+ put_membuf (data, buf, len);
+ return 0;
+}
+
+
void
put_membuf_str (membuf_t *mb, const char *string)
{
diff --git a/common/membuf.h b/common/membuf.h
index eb7d565..a1610b6 100644
--- a/common/membuf.h
+++ b/common/membuf.h
@@ -53,6 +53,7 @@ void init_membuf (membuf_t *mb, int initiallen);
void init_membuf_secure (membuf_t *mb, int initiallen);
void clear_membuf (membuf_t *mb, size_t amount);
void put_membuf (membuf_t *mb, const void *buf, size_t len);
+gpg_error_t put_membuf_cb (void *opaque, const void *buf, size_t len);
void put_membuf_str (membuf_t *mb, const char *string);
void put_membuf_printf (membuf_t *mb, const char *format,
...) GPGRT_ATTR_PRINTF(2,3);
diff --git a/common/mischelp.h b/common/mischelp.h
index cd72a4a..3911202 100644
--- a/common/mischelp.h
+++ b/common/mischelp.h
@@ -47,34 +47,6 @@ time_t timegm (struct tm *tm);
#define DIM(v) (sizeof(v)/sizeof((v)[0]))
#define DIMof(type,member) DIM(((type *)0)->member)
-
-/* Replacements for macros not available with libgpg-error < 1.20. */
-#ifndef GPGRT_GCC_VERSION
-
-# undef GPGRT_HAVE_PRAGMA_GCC_PUSH
-# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 5 )
-# define GPGRT_HAVE_MACRO_FUNCTION 1 /* __FUNCTION__ macro is available. */
-# define GPGRT_ATTR_NORETURN __attribute__ ((noreturn))
-# if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4 )
-# define GPGRT_HAVE_PRAGMA_GCC_PUSH 1
-# define GPGRT_ATTR_PRINTF(f,a) \
- __attribute__ ((format (__gnu_printf__,f,a)))
-# define GPGRT_ATTR_NR_PRINTF(f,a) \
- __attribute__ ((noreturn, format (__gnu_printf__,f,a)))
-# else
-# define GPGRT_ATTR_PRINTF(f, a) \
- __attribute__ ((format (printf,f,a)))
-# define GPGRT_ATTR_NR_PRINTF(f, a) \
- __attribute__ ((noreturn, format (printf,f,a)))
-# endif
-# else
-# define GPGRT_ATTR_NORETURN
-# define GPGRT_ATTR_PRINTF( f, a )
-# define GPGRT_ATTR_NR_PRINTF( f, a )
-# endif
-
-#endif /*Older libgpg-error. */
-
/* To avoid that a compiler optimizes certain memset calls away, these
macros may be used instead. */
#define wipememory2(_ptr,_set,_len) do { \
diff --git a/common/status.c b/common/status.c
index 435279c..a16e7b4 100644
--- a/common/status.c
+++ b/common/status.c
@@ -3,12 +3,22 @@
*
* This file is part of GnuPG.
*
- * GnuPG is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of either
*
- * GnuPG is distributed in the hope that it will be useful,
+ * - the GNU Lesser General Public License as published by the Free
+ * Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * or
+ *
+ * - the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * or both in parallel, as here.
+ *
+ * This file is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
diff --git a/common/status.h b/common/status.h
index 71bcc95..e50827f 100644
--- a/common/status.h
+++ b/common/status.h
@@ -3,12 +3,22 @@
*
* This file is part of GnuPG.
*
- * GnuPG is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of either
*
- * GnuPG is distributed in the hope that it will be useful,
+ * - the GNU Lesser General Public License as published by the Free
+ * Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * or
+ *
+ * - the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * or both in parallel, as here.
+ *
+ * This file is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
@@ -131,6 +141,7 @@ enum
STATUS_PLAINTEXT_FOLLOWS, /* Used by g13-syshelp */
STATUS_ERROR,
+ STATUS_WARNING,
STATUS_SUCCESS,
STATUS_FAILURE,
diff --git a/common/stringhelp.c b/common/stringhelp.c
index e8b990a..8b47a1c 100644
--- a/common/stringhelp.c
+++ b/common/stringhelp.c
@@ -1329,6 +1329,91 @@ strtokenize (const char *string, const char *delim)
}
+
+/* Version number parsing. */
+
+/* This function parses the first portion of the version number S and
+ stores it in *NUMBER. On success, this function returns a pointer
+ into S starting with the first character, which is not part of the
+ initial number portion; on failure, NULL is returned. */
+static const char*
+parse_version_number (const char *s, int *number)
+{
+ int val = 0;
+
+ if (*s == '0' && digitp (s+1))
+ return NULL; /* Leading zeros are not allowed. */
+ for (; digitp (s); s++)
+ {
+ val *= 10;
+ val += *s - '0';
+ }
+ *number = val;
+ return val < 0 ? NULL : s;
+}
+
+
+/* This function breaks up the complete string-representation of the
+ version number S, which is of the following struture: <major
+ number>.<minor number>.<micro number><patch level>. The major,
+ minor and micro number components will be stored in *MAJOR, *MINOR
+ and *MICRO.
+
+ On success, the last component, the patch level, will be returned;
+ in failure, NULL will be returned. */
+static const char *
+parse_version_string (const char *s, int *major, int *minor, int *micro)
+{
+ s = parse_version_number (s, major);
+ if (!s || *s != '.')
+ return NULL;
+ s++;
+ s = parse_version_number (s, minor);
+ if (!s)
+ return NULL;
+ if (*s == '.')
+ {
+ s++;
+ s = parse_version_number (s, micro);
+ if (!s)
+ return NULL;
+ }
+ else
+ *micro = 0;
+ return s; /* Patchlevel. */
+}
+
+
+/* Check that the version string MY_VERSION is greater or equal than
+ REQ_VERSION. Returns true if the condition is satisfied or false
+ if not. This works with 3 part and two part version strings; for a
+ two part version string the micor part is assumed to be 0. */
+int
+compare_version_strings (const char *my_version, const char *req_version)
+{
+ int my_major, my_minor, my_micro;
+ int rq_major, rq_minor, rq_micro;
+
+ if (!my_version || !req_version)
+ return 0;
+
+ if (!parse_version_string (my_version, &my_major, &my_minor, &my_micro))
+ return 0;
+ if (!parse_version_string(req_version, &rq_major, &rq_minor, &rq_micro))
+ return 0;
+
+ if (my_major > rq_major
+ || (my_major == rq_major && my_minor > rq_minor)
+ || (my_major == rq_major && my_minor == rq_minor
+ && my_micro >= rq_micro))
+ {
+ return 1;
+ }
+ return 0;
+}
+
+
+
/* Format a string so that it fits within about TARGET_COLS columns.
If IN_PLACE is 0, then TEXT is copied to a new buffer, which is
returned. Otherwise, TEXT is modified in place and returned.
diff --git a/common/stringhelp.h b/common/stringhelp.h
index c813662..d9225a3 100644
--- a/common/stringhelp.h
+++ b/common/stringhelp.h
@@ -148,6 +148,9 @@ char **strsplit (char *string, char delim, char replacement, int *count);
/* Tokenize STRING using the set of delimiters in DELIM. */
char **strtokenize (const char *string, const char *delim);
+/* Return True if MYVERSION is greater or equal than REQ_VERSION. */
+int compare_version_strings (const char *my_version, const char *req_version);
+
/* Format a string so that it fits within about TARGET_COLS columns. */
char *format_text (char *text, int in_place, int target_cols, int max_cols);
diff --git a/common/t-convert.c b/common/t-convert.c
index a03c680..ad33dff 100644
--- a/common/t-convert.c
+++ b/common/t-convert.c
@@ -232,13 +232,13 @@ test_bin2hex (void)
p = bin2hex (stuff, 20, NULL);
if (!p)
fail (0);
- if (strcmp (p, hexstuff))
+ else if (strcmp (p, hexstuff))
fail (0);
p = bin2hex (stuff, (size_t)(-1), NULL);
if (p)
fail (0);
- if (errno != ENOMEM)
+ else if (errno != ENOMEM)
fail (1);
}
@@ -264,13 +264,13 @@ test_bin2hexcolon (void)
p = bin2hexcolon (stuff, 20, NULL);
if (!p)
fail (0);
- if (strcmp (p, hexstuff))
+ else if (strcmp (p, hexstuff))
fail (0);
p = bin2hexcolon (stuff, (size_t)(-1), NULL);
if (p)
fail (0);
- if (errno != ENOMEM)
+ else if (errno != ENOMEM)
fail (1);
}
diff --git a/common/t-iobuf.c b/common/t-iobuf.c
index 99581b9..2835df4 100644
--- a/common/t-iobuf.c
+++ b/common/t-iobuf.c
@@ -5,6 +5,7 @@
#include <stdlib.h>
#include "iobuf.h"
+#include "stringhelp.h"
/* Return every other byte. In particular, reads two bytes, returns
the second one. */
@@ -16,7 +17,7 @@ every_other_filter (void *opaque, int control,
if (control == IOBUFCTRL_DESC)
{
- *(char **) buf = "every_other_filter";
+ mem2str (buf, "every_other_filter", *len);
}
if (control == IOBUFCTRL_UNDERFLOW)
{
@@ -52,7 +53,7 @@ double_filter (void *opaque, int control,
if (control == IOBUFCTRL_DESC)
{
- * (char **) buf = "double_filter";
+ mem2str (buf, "double_filter", *len);
}
if (control == IOBUFCTRL_FLUSH)
{
diff --git a/common/t-mapstrings.c b/common/t-mapstrings.c
index 14e4bb9..8f4c650 100644
--- a/common/t-mapstrings.c
+++ b/common/t-mapstrings.c
@@ -32,9 +32,8 @@
#include <stdlib.h>
#include <string.h>
-#include "stringhelp.h"
-
#include "t-support.h"
+#include "stringhelp.h"
static void
test_map_static_macro_string (void)
@@ -69,7 +68,7 @@ test_map_static_macro_string (void)
result = map_static_macro_string (tests[testno].string);
if (!result)
fail (testno);
- if (strcmp (result, tests[testno].expected))
+ else if (strcmp (result, tests[testno].expected))
fail (testno);
if (!tests[testno].lastresult)
tests[testno].lastresult = result;
@@ -81,7 +80,7 @@ test_map_static_macro_string (void)
result = map_static_macro_string (tests[testno].string);
if (!result)
fail (testno);
- if (strcmp (result, tests[testno].expected))
+ else if (strcmp (result, tests[testno].expected))
fail (testno);
if (result != tests[testno].lastresult)
fail (testno);
diff --git a/common/t-stringhelp.c b/common/t-stringhelp.c
index 9e5410b..b4a41ac 100644
--- a/common/t-stringhelp.c
+++ b/common/t-stringhelp.c
@@ -40,9 +40,8 @@
#include <unistd.h>
#include <sys/types.h>
-#include "stringhelp.h"
-
#include "t-support.h"
+#include "stringhelp.h"
static char *home_buffer;
@@ -144,7 +143,7 @@ test_percent_escape (void)
result = percent_escape (tests[testno].value, tests[testno].extra);
if (!result)
fail (testno);
- if (strcmp (result, tests[testno].expected))
+ else if (strcmp (result, tests[testno].expected))
fail (testno);
xfree (result);
}
@@ -399,13 +398,13 @@ test_make_filename_try (void)
out = make_filename_try ("~/foo", "bar", NULL);
if (!out)
fail (2);
- if (home)
+ else if (home)
{
if (strlen (out) < homelen + 7)
fail (2);
- if (strncmp (out, home, homelen))
+ else if (strncmp (out, home, homelen))
fail (2);
- if (strcmp (out+homelen, "/foo/bar"))
+ else if (strcmp (out+homelen, "/foo/bar"))
fail (2);
}
else
@@ -418,13 +417,13 @@ test_make_filename_try (void)
out = make_filename_try ("~", "bar", NULL);
if (!out)
fail (2);
- if (home)
+ else if (home)
{
if (strlen (out) < homelen + 3)
fail (2);
- if (strncmp (out, home, homelen))
+ else if (strncmp (out, home, homelen))
fail (2);
- if (strcmp (out+homelen, "/bar"))
+ else if (strcmp (out+homelen, "/bar"))
fail (2);
}
else
@@ -446,33 +445,33 @@ test_make_absfilename_try (void)
out = make_absfilename_try ("foo", "bar", NULL);
if (!out)
fail (0);
- if (strlen (out) < cwdlen + 7)
+ else if (strlen (out) < cwdlen + 7)
fail (0);
- if (strncmp (out, cwd, cwdlen))
+ else if (strncmp (out, cwd, cwdlen))
fail (0);
- if (strcmp (out+cwdlen, "/foo/bar"))
+ else if (strcmp (out+cwdlen, "/foo/bar"))
fail (0);
xfree (out);
out = make_absfilename_try ("./foo", NULL);
if (!out)
fail (1);
- if (strlen (out) < cwdlen + 5)
+ else if (strlen (out) < cwdlen + 5)
fail (1);
- if (strncmp (out, cwd, cwdlen))
+ else if (strncmp (out, cwd, cwdlen))
fail (1);
- if (strcmp (out+cwdlen, "/./foo"))
+ else if (strcmp (out+cwdlen, "/./foo"))
fail (1);
xfree (out);
out = make_absfilename_try (".", NULL);
if (!out)
fail (2);
- if (strlen (out) < cwdlen)
+ else if (strlen (out) < cwdlen)
fail (2);
- if (strncmp (out, cwd, cwdlen))
+ else if (strncmp (out, cwd, cwdlen))
fail (2);
- if (strcmp (out+cwdlen, ""))
+ else if (strcmp (out+cwdlen, ""))
fail (2);
xfree (out);
@@ -706,6 +705,7 @@ stresc (char *s)
return p;
}
+
static void
test_format_text (void)
{
@@ -814,6 +814,65 @@ test_format_text (void)
fail(0);
}
+
+static void
+test_compare_version_strings (void)
+{
+ struct { const char *a; const char *b; int okay; } tests[] = {
+ { "1.0.0", "1.0.0", 1 },
+ { "1.0.0-", "1.0.0", 1 },
+ { "1.0.0-1", "1.0.0", 1 },
+ { "1.0.0.1", "1.0.0", 1 },
+ { "1.0.0", "1.0.1", 0 },
+ { "1.0.0-", "1.0.1", 0 },
+ { "1.0.0-1", "1.0.1", 0 },
+ { "1.0.0.1", "1.0.1", 0 },
+ { "1.0.0", "1.1.0", 0 },
+ { "1.0.0-", "1.1.0", 0 },
+ { "1.0.0-1", "1.1.0", 0 },
+ { "1.0.0.1", "1.1.0", 0 },
+
+ { "1.0.0", "1.0.0-", 1 },
+ { "1.0.0", "1.0.0-1", 1 },
+ { "1.0.0", "1.0.0.1", 1 },
+ { "1.1.0", "1.0.0", 1 },
+ { "1.1.1", "1.1.0", 1 },
+ { "1.1.2", "1.1.2", 1 },
+ { "1.1.2", "1.0.2", 1 },
+ { "1.1.2", "0.0.2", 1 },
+ { "1.1.2", "1.1.3", 0 },
+
+ { "0.99.1", "0.9.9", 1 },
+ { "0.9.1", "0.91.0", 0 },
+
+ { "1.5.3", "1.5", 1 },
+ { "1.5.0", "1.5", 1 },
+ { "1.4.99", "1.5", 0 },
+ { "1.5", "1.4.99", 1 },
+ { "1.5", "1.5.0", 1 },
+ { "1.5", "1.5.1", 0 },
+
+ { "1.5.3-x17", "1.5-23", 1 },
+
+ { "1.5.3a", "1.5.3", 1 },
+ { "1.5.3a", "1.5.3b", 1 },
+
+ { NULL, NULL, 0 }
+ };
+ int idx;
+ int res;
+
+ for (idx=0; idx < DIM(tests); idx++)
+ {
+ res = compare_version_strings (tests[idx].a, tests[idx].b);
+ /* printf ("test %d: '%s' '%s' %d -> %d\n", */
+ /* idx, tests[idx].a, tests[idx].b, tests[idx].okay, res); */
+ if (res != tests[idx].okay)
+ fail (idx);
+ }
+}
+
+
int
main (int argc, char **argv)
{
@@ -828,8 +887,9 @@ main (int argc, char **argv)
test_make_absfilename_try ();
test_strsplit ();
test_strtokenize ();
+ test_compare_version_strings ();
test_format_text ();
xfree (home_buffer);
- return 0;
+ return !!errcount;
}
diff --git a/common/t-support.h b/common/t-support.h
index 8ff2810..cda6759 100644
--- a/common/t-support.h
+++ b/common/t-support.h
@@ -38,9 +38,7 @@
#include <stdlib.h>
#include <stdio.h>
-#ifdef HAVE_W32CE_SYSTEM
-#include <gpg-error.h> /* Defines strerror. */
-#endif
+#include <gpg-error.h>
#ifndef HAVE_GETENV
diff --git a/common/t-timestuff.c b/common/t-timestuff.c
index cb7cd39..a80aaff 100644
--- a/common/t-timestuff.c
+++ b/common/t-timestuff.c
@@ -124,25 +124,28 @@ test_timegm (void)
tp = gmtime (&now);
if (!tp)
fail (tidx);
- tbuf = *tp;
- tbuf2 = tbuf;
+ else
+ {
+ tbuf = *tp;
+ tbuf2 = tbuf;
#ifdef HAVE_TIMEGM
- atime = timegm (&tbuf);
+ atime = timegm (&tbuf);
#else
- atime = mktime (&tbuf);
+ atime = mktime (&tbuf);
#endif
- if (atime == (time_t)(-1))
- fail (tidx);
- if (atime != now)
- fail (tidx);
-
- tp = gmtime (&atime);
- if (!tp)
- fail (tidx);
- if (cmp_time_s (tp, &tbuf))
- fail (tidx);
- if (cmp_time_s (tp, &tbuf2))
- fail (tidx);
+ if (atime == (time_t)(-1))
+ fail (tidx);
+ else if (atime != now)
+ fail (tidx);
+
+ tp = gmtime (&atime);
+ if (!tp)
+ fail (tidx);
+ else if (cmp_time_s (tp, &tbuf))
+ fail (tidx);
+ else if (cmp_time_s (tp, &tbuf2))
+ fail (tidx);
+ }
}
}
diff --git a/common/tlv.c b/common/tlv.c
index 74cb4a7..1a6c18f 100644
--- a/common/tlv.c
+++ b/common/tlv.c
@@ -59,7 +59,6 @@ do_find_tlv (const unsigned char *buffer, size_t length,
for (;;)
{
- buffer = s;
if (n < 2)
return NULL; /* Buffer definitely too short for tag and length. */
if (!*s || *s == 0xff)
diff --git a/common/types.h b/common/types.h
index 2bb817f..0767a27 100644
--- a/common/types.h
+++ b/common/types.h
@@ -113,14 +113,4 @@
# define HAVE_U32_TYPEDEF
#endif
-
-/* Some GCC attributes. These are replacements for libgpg-error < 1.20. */
-#ifndef GPGRT_GCC_VERSION
-# if __GNUC__ >= 4
-# define GPGRT_ATTR_SENTINEL(a) __attribute__ ((sentinel(a)))
-# else
-# define GPGRT_ATTR_SENTINEL(a)
-# endif
-#endif
-
#endif /*GNUPG_COMMON_TYPES_H*/
diff --git a/common/userids.c b/common/userids.c
index e094c69..b761d14 100644
--- a/common/userids.c
+++ b/common/userids.c
@@ -235,7 +235,6 @@ classify_user_id (const char *name, KEYDB_SEARCH_DESC *desc, int openpgp_hack)
desc->u.fpr[i] = hextobyte(si);
for (; i < 20; i++)
desc->u.fpr[i]= 0;
- s = se + 1;
mode = KEYDB_SEARCH_MODE_FPR;
}
break;
diff --git a/common/utf8conv.c b/common/utf8conv.c
index a912b82..8a2cf8a 100644
--- a/common/utf8conv.c
+++ b/common/utf8conv.c
@@ -713,17 +713,17 @@ jnlib_iconv_close (jnlib_iconv_t cd)
#ifdef HAVE_W32_SYSTEM
-/* Return a malloced string encoded in UTF-8 from the wide char input
+/* Return a malloced string encoded for CODEPAGE from the wide char input
string STRING. Caller must free this value. Returns NULL and sets
ERRNO on failure. Calling this function with STRING set to NULL is
not defined. */
-char *
-wchar_to_utf8 (const wchar_t *string)
+static char *
+wchar_to_cp (const wchar_t *string, unsigned int codepage)
{
int n;
char *result;
- n = WideCharToMultiByte (CP_UTF8, 0, string, -1, NULL, 0, NULL, NULL);
+ n = WideCharToMultiByte (codepage, 0, string, -1, NULL, 0, NULL, NULL);
if (n < 0)
{
gpg_err_set_errno (EINVAL);
@@ -734,7 +734,7 @@ wchar_to_utf8 (const wchar_t *string)
if (!result)
return NULL;
- n = WideCharToMultiByte (CP_UTF8, 0, string, -1, result, n, NULL, NULL);
+ n = WideCharToMultiByte (codepage, 0, string, -1, result, n, NULL, NULL);
if (n < 0)
{
xfree (result);
@@ -745,18 +745,18 @@ wchar_to_utf8 (const wchar_t *string)
}
-/* Return a malloced wide char string from an UTF-8 encoded input
+/* Return a malloced wide char string from a CODEPAGE encoded input
string STRING. Caller must free this value. Returns NULL and sets
ERRNO on failure. Calling this function with STRING set to NULL is
not defined. */
-wchar_t *
-utf8_to_wchar (const char *string)
+static wchar_t *
+cp_to_wchar (const char *string, unsigned int codepage)
{
int n;
size_t nbytes;
wchar_t *result;
- n = MultiByteToWideChar (CP_UTF8, 0, string, -1, NULL, 0);
+ n = MultiByteToWideChar (codepage, 0, string, -1, NULL, 0);
if (n < 0)
{
gpg_err_set_errno (EINVAL);
@@ -773,7 +773,7 @@ utf8_to_wchar (const char *string)
if (!result)
return NULL;
- n = MultiByteToWideChar (CP_UTF8, 0, string, -1, result, n);
+ n = MultiByteToWideChar (codepage, 0, string, -1, result, n);
if (n < 0)
{
xfree (result);
@@ -782,4 +782,49 @@ utf8_to_wchar (const char *string)
}
return result;
}
+
+
+/* Return a malloced string encoded in the active code page from the
+ * wide char input string STRING. Caller must free this value.
+ * Returns NULL and sets ERRNO on failure. Calling this function with
+ * STRING set to NULL is not defined. */
+char *
+wchar_to_native (const wchar_t *string)
+{
+ return wchar_to_cp (string, CP_ACP);
+}
+
+
+/* Return a malloced wide char string from an UTF-8 encoded input
+ * string STRING. Caller must free this value. Returns NULL and sets
+ * ERRNO on failure. Calling this function with STRING set to NULL is
+ * not defined. */
+wchar_t *
+native_to_wchar (const char *string)
+{
+ return cp_to_wchar (string, CP_ACP);
+}
+
+
+/* Return a malloced string encoded in UTF-8 from the wide char input
+ * string STRING. Caller must free this value. Returns NULL and sets
+ * ERRNO on failure. Calling this function with STRING set to NULL is
+ * not defined. */
+char *
+wchar_to_utf8 (const wchar_t *string)
+{
+ return wchar_to_cp (string, CP_UTF8);
+}
+
+
+/* Return a malloced wide char string from an UTF-8 encoded input
+ * string STRING. Caller must free this value. Returns NULL and sets
+ * ERRNO on failure. Calling this function with STRING set to NULL is
+ * not defined. */
+wchar_t *
+utf8_to_wchar (const char *string)
+{
+ return cp_to_wchar (string, CP_UTF8);
+}
+
#endif /*HAVE_W32_SYSTEM*/
diff --git a/common/utf8conv.h b/common/utf8conv.h
index ad7dbe9..def35de 100644
--- a/common/utf8conv.h
+++ b/common/utf8conv.h
@@ -48,6 +48,8 @@ size_t jnlib_iconv (jnlib_iconv_t cd, const char **inbuf, size_t *inbytesleft,
int jnlib_iconv_close (jnlib_iconv_t cd);
#ifdef HAVE_W32_SYSTEM
+char *wchar_to_native (const wchar_t *string);
+wchar_t *native_to_wchar (const char *string);
char *wchar_to_utf8 (const wchar_t *string);
wchar_t *utf8_to_wchar (const char *string);
#endif /*HAVE_W32_SYSTEM*/
diff --git a/common/util.h b/common/util.h
index 81d63ee..6410b11 100644
--- a/common/util.h
+++ b/common/util.h
@@ -37,101 +37,10 @@
/* These error codes are used but not defined in the required
libgpg-error version. Define them here. */
-#if GPG_ERROR_VERSION_NUMBER < 0x011200 /* 1.18 */
-# define GPG_ERR_LEGACY_KEY 222
-# define GPG_ERR_OBJ_TERM_STATE 225
-# define GPG_ERR_FORBIDDEN 251
-#endif
-#if GPG_ERROR_VERSION_NUMBER < 0x011300 /* 1.19 */
-# define GPG_ERR_LDAP_GENERAL 721
-# define GPG_ERR_LDAP_ATTR_GENERAL 722
-# define GPG_ERR_LDAP_NAME_GENERAL 723
-# define GPG_ERR_LDAP_SECURITY_GENERAL 724
-# define GPG_ERR_LDAP_SERVICE_GENERAL 725
-# define GPG_ERR_LDAP_UPDATE_GENERAL 726
-# define GPG_ERR_LDAP_E_GENERAL 727
-# define GPG_ERR_LDAP_X_GENERAL 728
-# define GPG_ERR_LDAP_OTHER_GENERAL 729
-# define GPG_ERR_LDAP_X_CONNECTING 750
-# define GPG_ERR_LDAP_REFERRAL_LIMIT 751
-# define GPG_ERR_LDAP_CLIENT_LOOP 752
-# define GPG_ERR_LDAP_NO_RESULTS 754
-# define GPG_ERR_LDAP_CONTROL_NOT_FOUND 755
-# define GPG_ERR_LDAP_NOT_SUPPORTED 756
-# define GPG_ERR_LDAP_CONNECT 757
-# define GPG_ERR_LDAP_NO_MEMORY 758
-# define GPG_ERR_LDAP_PARAM 759
-# define GPG_ERR_LDAP_USER_CANCELLED 760
-# define GPG_ERR_LDAP_FILTER 761
-# define GPG_ERR_LDAP_AUTH_UNKNOWN 762
-# define GPG_ERR_LDAP_TIMEOUT 763
-# define GPG_ERR_LDAP_DECODING 764
-# define GPG_ERR_LDAP_ENCODING 765
-# define GPG_ERR_LDAP_LOCAL 766
-# define GPG_ERR_LDAP_SERVER_DOWN 767
-# define GPG_ERR_LDAP_SUCCESS 768
-# define GPG_ERR_LDAP_OPERATIONS 769
-# define GPG_ERR_LDAP_PROTOCOL 770
-# define GPG_ERR_LDAP_TIMELIMIT 771
-# define GPG_ERR_LDAP_SIZELIMIT 772
-# define GPG_ERR_LDAP_COMPARE_FALSE 773
-# define GPG_ERR_LDAP_COMPARE_TRUE 774
-# define GPG_ERR_LDAP_UNSUPPORTED_AUTH 775
-# define GPG_ERR_LDAP_STRONG_AUTH_RQRD 776
-# define GPG_ERR_LDAP_PARTIAL_RESULTS 777
-# define GPG_ERR_LDAP_REFERRAL 778
-# define GPG_ERR_LDAP_ADMINLIMIT 779
-# define GPG_ERR_LDAP_UNAVAIL_CRIT_EXTN 780
-# define GPG_ERR_LDAP_CONFIDENT_RQRD 781
-# define GPG_ERR_LDAP_SASL_BIND_INPROG 782
-# define GPG_ERR_LDAP_NO_SUCH_ATTRIBUTE 784
-# define GPG_ERR_LDAP_UNDEFINED_TYPE 785
-# define GPG_ERR_LDAP_BAD_MATCHING 786
-# define GPG_ERR_LDAP_CONST_VIOLATION 787
-# define GPG_ERR_LDAP_TYPE_VALUE_EXISTS 788
-# define GPG_ERR_LDAP_INV_SYNTAX 789
-# define GPG_ERR_LDAP_NO_SUCH_OBJ 800
-# define GPG_ERR_LDAP_ALIAS_PROBLEM 801
-# define GPG_ERR_LDAP_INV_DN_SYNTAX 802
-# define GPG_ERR_LDAP_IS_LEAF 803
-# define GPG_ERR_LDAP_ALIAS_DEREF 804
-# define GPG_ERR_LDAP_X_PROXY_AUTH_FAIL 815
-# define GPG_ERR_LDAP_BAD_AUTH 816
-# define GPG_ERR_LDAP_INV_CREDENTIALS 817
-# define GPG_ERR_LDAP_INSUFFICIENT_ACC 818
-# define GPG_ERR_LDAP_BUSY 819
-# define GPG_ERR_LDAP_UNAVAILABLE 820
-# define GPG_ERR_LDAP_UNWILL_TO_PERFORM 821
-# define GPG_ERR_LDAP_LOOP_DETECT 822
-# define GPG_ERR_LDAP_NAMING_VIOLATION 832
-# define GPG_ERR_LDAP_OBJ_CLS_VIOLATION 833
-# define GPG_ERR_LDAP_NOT_ALLOW_NONLEAF 834
-# define GPG_ERR_LDAP_NOT_ALLOW_ON_RDN 835
-# define GPG_ERR_LDAP_ALREADY_EXISTS 836
-# define GPG_ERR_LDAP_NO_OBJ_CLASS_MODS 837
-# define GPG_ERR_LDAP_RESULTS_TOO_LARGE 838
-# define GPG_ERR_LDAP_AFFECTS_MULT_DSAS 839
-# define GPG_ERR_LDAP_VLV 844
-# define GPG_ERR_LDAP_OTHER 848
-# define GPG_ERR_LDAP_CUP_RESOURCE_LIMIT 881
-# define GPG_ERR_LDAP_CUP_SEC_VIOLATION 882
-# define GPG_ERR_LDAP_CUP_INV_DATA 883
-# define GPG_ERR_LDAP_CUP_UNSUP_SCHEME 884
-# define GPG_ERR_LDAP_CUP_RELOAD 885
-# define GPG_ERR_LDAP_CANCELLED 886
-# define GPG_ERR_LDAP_NO_SUCH_OPERATION 887
-# define GPG_ERR_LDAP_TOO_LATE 888
-# define GPG_ERR_LDAP_CANNOT_CANCEL 889
-# define GPG_ERR_LDAP_ASSERTION_FAILED 890
-# define GPG_ERR_LDAP_PROX_AUTH_DENIED 891
-#endif /*GPG_ERROR_VERSION_NUMBER < 0x011300*/
-#if GPG_ERROR_VERSION_NUMBER < 0x011500 /* 1.21 */
-# define GPG_ERR_SERVER_FAILED 219
-# define GPG_ERR_NO_KEY 220
-# define GPG_ERR_NO_NAME 221
-# define GPG_ERR_TRUE 255
-# define GPG_ERR_FALSE 256
-#endif
+/* Example: (#if GPG_ERROR_VERSION_NUMBER < 0x011500 // 1.21) */
+#if GPG_ERROR_VERSION_NUMBER < 0x011600 /* 1.22 */
+# define GPG_ERR_DB_CORRUPTED 218
+#endif /* gpg_error < 1.22 */
/* Hash function used with libksba. */
#define HASH_FNC ((void (*)(void *, const void*,size_t))gcry_md_write)
@@ -145,6 +54,7 @@
#include "../common/dotlock.h"
#include "../common/utf8conv.h"
#include "../common/dynload.h"
+#include "../common/fwddecl.h"
#include "gettime.h"
@@ -160,30 +70,6 @@
/* Replacements for macros not available with libgpg-error < 1.20. */
-#ifndef GPGRT_GCC_VERSION
-
-# ifndef GPGRT_ATTR_FORMAT_ARG
-# if __GNUC__ >= 3 /* Actually 2.8 but testing the major is easier. */
-# define GPGRT_ATTR_FORMAT_ARG(a) __attribute__ ((__format_arg__ (a)))
-# else
-# define GPGRT_ATTR_FORMAT_ARG(a)
-# endif
-# endif
-
-# if __GNUC__ >= 4
-# define GPGRT_ATTR_SENTINEL(a) __attribute__ ((sentinel(a)))
-# else
-# define GPGRT_ATTR_SENTINEL(a)
-# endif
-
-# if __GNUC__ >= 4
-# define GPGRT_ATTR_USED __attribute__ ((used))
-# else
-# define GPGRT_ATTR_USED
-# endif
-
-#endif /*libgpg-error < 1.20 */
-
/* We need this type even if we are not using libreadline and or we
did not include libreadline in the current file. */
@@ -463,11 +349,4 @@ int _gnupg_isatty (int fd);
#define xtoi_2(p) ((xtoi_1(p) * 16) + xtoi_1((p)+1))
#define xtoi_4(p) ((xtoi_2(p) * 256) + xtoi_2((p)+2))
-
-/*-- Forward declaration of the commonly used server control structure. */
-/* (We need it here as it is used by some callback prototypes.) */
-struct server_control_s;
-typedef struct server_control_s *ctrl_t;
-
-
#endif /*GNUPG_COMMON_UTIL_H*/
diff --git a/common/yesno.c b/common/yesno.c
index 821df4b..7803349 100644
--- a/common/yesno.c
+++ b/common/yesno.c
@@ -3,12 +3,22 @@
*
* This file is part of GnuPG.
*
- * GnuPG is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of either
*
- * GnuPG is distributed in the hope that it will be useful,
+ * - the GNU Lesser General Public License as published by the Free
+ * Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * or
+ *
+ * - the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * or both in parallel, as here.
+ *
+ * This file is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
diff --git a/configure.ac b/configure.ac
index 412ea8b..266eae5 100644
--- a/configure.ac
+++ b/configure.ac
@@ -28,7 +28,7 @@ min_automake_version="1.14"
m4_define([mym4_package],[gnupg])
m4_define([mym4_major], [2])
m4_define([mym4_minor], [1])
-m4_define([mym4_micro], [10])
+m4_define([mym4_micro], [11])
# To start a new development series, i.e a new major or minor number
# you need to mark an arbitrary commit before the first beta release
@@ -49,7 +49,7 @@ m4_define([mym4_revision_dec], m4_argn(8, mym4_verslist))
m4_esyscmd([echo ]mym4_version[>VERSION])
AC_INIT([mym4_package],[mym4_version], [http://bugs.gnupg.org])
-NEED_GPG_ERROR_VERSION=1.16
+NEED_GPG_ERROR_VERSION=1.21
NEED_LIBGCRYPT_API=1
NEED_LIBGCRYPT_VERSION=1.6.0
@@ -85,6 +85,13 @@ AB_INIT
AC_GNU_SOURCE
+# Before we do anything with the C compiler, we first save the user's
+# CFLAGS (they are restored at the end of the configure script). This
+# is because some configure checks don't work with -Werror, but we'd
+# like to use -Werror with our build.
+CFLAGS_orig=$CFLAGS
+CFLAGS=
+
# Some status variables.
have_gpg_error=no
have_libgcrypt=no
@@ -589,6 +596,7 @@ AC_ISC_POSIX
AC_SYS_LARGEFILE
GNUPG_CHECK_USTAR
+
# We need to compile and run a program on the build machine. A
# comment in libgpg-error says that the AC_PROG_CC_FOR_BUILD macro in
# the AC archive is broken for autoconf 2.57. Given that there is no
@@ -604,6 +612,9 @@ fi
AC_MSG_RESULT($CC_FOR_BUILD)
AC_ARG_VAR(CC_FOR_BUILD,[build system C compiler])
+# We need to call this macro because other pkg-config macros are
+# not always used.
+PKG_PROG_PKG_CONFIG
try_gettext=yes
@@ -1572,6 +1583,11 @@ AC_ARG_ENABLE(optimization,
fi])
#
+# Add user CFLAGS.
+#
+CFLAGS="$CFLAGS $CFLAGS_orig"
+
+#
# Decide what to build
#
diff --git a/dirmngr/Makefile.am b/dirmngr/Makefile.am
index c3bce0d..1c74d10 100644
--- a/dirmngr/Makefile.am
+++ b/dirmngr/Makefile.am
@@ -20,6 +20,7 @@
## Process this file with automake to produce Makefile.in
EXTRA_DIST = OAUTHORS ONEWS ChangeLog-2011 tls-ca.pem
+dist_pkgdata_DATA = sks-keyservers.netCA.pem
bin_PROGRAMS = dirmngr dirmngr-client
diff --git a/dirmngr/crlcache.c b/dirmngr/crlcache.c
index 13d8a26..25ce7a6 100644
--- a/dirmngr/crlcache.c
+++ b/dirmngr/crlcache.c
@@ -1345,12 +1345,13 @@ cache_isvalid (ctrl_t ctrl, const char *issuer_hash,
if (n != 16)
{
log_error (_("WARNING: invalid cache record length for S/N "));
+ log_printf ("0x");
log_printhex ("", sn, snlen);
}
else if (opt.verbose)
{
unsigned char record[16];
- char *tmp = hexify_data (sn, snlen);
+ char *tmp = hexify_data (sn, snlen, 1);
if (cdb_read (cdb, record, n, cdb_datapos (cdb)))
log_error (_("problem reading cache record for S/N %s: %s\n"),
@@ -1366,7 +1367,7 @@ cache_isvalid (ctrl_t ctrl, const char *issuer_hash,
{
if (opt.verbose)
{
- char *serialno = hexify_data (sn, snlen);
+ char *serialno = hexify_data (sn, snlen, 1);
log_info (_("S/N %s is valid, it is not listed in the CRL\n"),
serialno );
xfree (serialno);
@@ -2095,7 +2096,7 @@ crl_cache_insert (ctrl_t ctrl, const char *url, ksba_reader_t reader)
err = gpg_error (GPG_ERR_CHECKSUM);
goto leave;
}
- checksum = hexify_data (md5buf, 16);
+ checksum = hexify_data (md5buf, 16, 0);
}
diff --git a/dirmngr/dns-stuff.c b/dirmngr/dns-stuff.c
index 1bf6cfc..63dfc8d 100644
--- a/dirmngr/dns-stuff.c
+++ b/dirmngr/dns-stuff.c
@@ -119,6 +119,8 @@ static char tor_credentials[50];
gpg_error_t
enable_dns_tormode (int new_circuit)
{
+ (void) new_circuit;
+
#if defined(USE_DNS_CERT) && defined(USE_ADNS)
# if HAVE_ADNS_IF_TORMODE
if (!*tor_credentials || new_circuit)
diff --git a/dirmngr/http.c b/dirmngr/http.c
index 74b6911..aa33917 100644
--- a/dirmngr/http.c
+++ b/dirmngr/http.c
@@ -562,7 +562,8 @@ http_session_release (http_session_t sess)
/* Create a new session object which is currently used to enable TLS
support. It may eventually allow reusing existing connections. */
gpg_error_t
-http_session_new (http_session_t *r_session, const char *tls_priority)
+http_session_new (http_session_t *r_session, const char *tls_priority,
+ const char *intended_hostname)
{
gpg_error_t err;
http_session_t sess;
@@ -600,6 +601,34 @@ http_session_new (http_session_t *r_session, const char *tls_priority)
goto leave;
}
+ /* If the user has not specified a CA list, and they are looking
+ * for the hkps pool from sks-keyservers.net, then default to
+ * Kristian's certificate authority: */
+ if (!tls_ca_certlist
+ && intended_hostname
+ && !ascii_strcasecmp (intended_hostname,
+ "hkps.pool.sks-keyservers.net"))
+ {
+ char *pemname = make_filename_try (gnupg_datadir (),
+ "sks-keyservers.netCA.pem", NULL);
+ if (!pemname)
+ {
+ err = gpg_error_from_syserror ();
+ log_error ("setting CA from file '%s' failed: %s\n",
+ pemname, gpg_strerror (err));
+ }
+ else
+ {
+ rc = gnutls_certificate_set_x509_trust_file
+ (sess->certcred, pemname, GNUTLS_X509_FMT_PEM);
+ if (rc < 0)
+ log_info ("setting CA from file '%s' failed: %s\n",
+ pemname, gnutls_strerror (rc));
+ xfree (pemname);
+ }
+ }
+
+ /* Add configured certificates to the session. */
for (sl = tls_ca_certlist; sl; sl = sl->next)
{
rc = gnutls_certificate_set_x509_trust_file
diff --git a/dirmngr/http.h b/dirmngr/http.h
index 64f55e1..58b8c1a 100644
--- a/dirmngr/http.h
+++ b/dirmngr/http.h
@@ -98,7 +98,8 @@ void http_register_tls_callback (gpg_error_t (*cb)(http_t,http_session_t,int));
void http_register_tls_ca (const char *fname);
gpg_error_t http_session_new (http_session_t *r_session,
- const char *tls_priority);
+ const char *tls_priority,
+ const char *intended_hostname);
http_session_t http_session_ref (http_session_t sess);
void http_session_release (http_session_t sess);
diff --git a/dirmngr/ks-action.c b/dirmngr/ks-action.c
index dd4516a..21aa646 100644
--- a/dirmngr/ks-action.c
+++ b/dirmngr/ks-action.c
@@ -144,6 +144,7 @@ ks_action_search (ctrl_t ctrl, uri_item_t keyservers,
{
gpg_error_t err = 0;
int any_server = 0;
+ int any_results = 0;
uri_item_t uri;
estream_t infp;
@@ -155,11 +156,13 @@ ks_action_search (ctrl_t ctrl, uri_item_t keyservers,
parallel and merge them. We also need to decide what to do with
errors - it might not be the best idea to ignore an error from
one server and silently continue with another server. For now we
- stop at the first error. */
+ stop at the first error, unless the server responds with '404 Not
+ Found', in which case we try the next server. */
for (uri = keyservers; !err && uri; uri = uri->next)
{
int is_http = uri->parsed_uri->is_http;
int is_ldap = 0;
+ unsigned int http_status = 0;
#if USE_LDAP
is_ldap = (strcmp (uri->parsed_uri->scheme, "ldap") == 0
|| strcmp (uri->parsed_uri->scheme, "ldaps") == 0
@@ -174,13 +177,23 @@ ks_action_search (ctrl_t ctrl, uri_item_t keyservers,
else
#endif
{
- err = ks_hkp_search (ctrl, uri->parsed_uri, patterns->d, &infp);
+ err = ks_hkp_search (ctrl, uri->parsed_uri, patterns->d,
+ &infp, &http_status);
}
+ if (err == gpg_error (GPG_ERR_NO_DATA)
+ && http_status == 404 /* not found */)
+ {
+ /* No record found. Clear error and try next server. */
+ err = 0;
+ continue;
+ }
+
if (!err)
{
err = copy_stream (infp, outfp);
es_fclose (infp);
+ any_results = 1;
break;
}
}
@@ -188,6 +201,8 @@ ks_action_search (ctrl_t ctrl, uri_item_t keyservers,
if (!any_server)
err = gpg_error (GPG_ERR_NO_KEYSERVER);
+ else if (err == 0 && !any_results)
+ err = gpg_error (GPG_ERR_NO_DATA);
return err;
}
diff --git a/dirmngr/ks-engine-hkp.c b/dirmngr/ks-engine-hkp.c
index e458899..eca02f0 100644
--- a/dirmngr/ks-engine-hkp.c
+++ b/dirmngr/ks-engine-hkp.c
@@ -545,9 +545,9 @@ map_host (ctrl_t ctrl, const char *name, int force_reselect,
if (hi->pool)
{
/* Deal with the pool name before selecting a host. */
- if (r_poolname && hi->cname)
+ if (r_poolname)
{
- *r_poolname = xtrystrdup (hi->cname);
+ *r_poolname = xtrystrdup (hi->cname? hi->cname : hi->name);
if (!*r_poolname)
return gpg_error_from_syserror ();
}
@@ -974,12 +974,13 @@ ks_hkp_housekeeping (time_t curtime)
R_FP. HOSTPORTSTR is only used for diagnostics. If HTTPHOST is
not NULL it will be used as HTTP "Host" header. If POST_CB is not
NULL a post request is used and that callback is called to allow
- writing the post data. */
+ writing the post data. If R_HTTP_STATUS is not NULL, the http
+ status code will be stored there. */
static gpg_error_t
send_request (ctrl_t ctrl, const char *request, const char *hostportstr,
const char *httphost, unsigned int httpflags,
gpg_error_t (*post_cb)(void *, http_t), void *post_cb_value,
- estream_t *r_fp)
+ estream_t *r_fp, unsigned int *r_http_status)
{
gpg_error_t err;
http_session_t session = NULL;
@@ -990,7 +991,7 @@ send_request (ctrl_t ctrl, const char *request, const char *hostportstr,
*r_fp = NULL;
- err = http_session_new (&session, NULL);
+ err = http_session_new (&session, NULL, httphost);
if (err)
goto leave;
http_session_set_log_cb (session, cert_log_cb);
@@ -1050,6 +1051,9 @@ send_request (ctrl_t ctrl, const char *request, const char *hostportstr,
httpflags |= HTTP_FLAG_FORCE_TLS;
}
+ if (r_http_status)
+ *r_http_status = http_get_status_code (http);
+
switch (http_get_status_code (http))
{
case 200:
@@ -1083,6 +1087,10 @@ send_request (ctrl_t ctrl, const char *request, const char *hostportstr,
}
goto leave;
+ case 501:
+ err = gpg_error (GPG_ERR_NOT_IMPLEMENTED);
+ goto leave;
+
default:
log_error (_("error accessing '%s': http status %u\n"),
request, http_get_status_code (http));
@@ -1154,10 +1162,12 @@ handle_send_request_error (gpg_error_t err, const char *request,
/* Search the keyserver identified by URI for keys matching PATTERN.
- On success R_FP has an open stream to read the data. */
+ On success R_FP has an open stream to read the data. If
+ R_HTTP_STATUS is not NULL, the http status code will be stored
+ there. */
gpg_error_t
ks_hkp_search (ctrl_t ctrl, parsed_uri_t uri, const char *pattern,
- estream_t *r_fp)
+ estream_t *r_fp, unsigned int *r_http_status)
{
gpg_error_t err;
KEYDB_SEARCH_DESC desc;
@@ -1244,7 +1254,7 @@ ks_hkp_search (ctrl_t ctrl, parsed_uri_t uri, const char *pattern,
/* Send the request. */
err = send_request (ctrl, request, hostport, httphost, httpflags,
- NULL, NULL, &fp);
+ NULL, NULL, &fp, r_http_status);
if (handle_send_request_error (err, request, &tries))
{
reselect = 1;
@@ -1377,7 +1387,7 @@ ks_hkp_get (ctrl_t ctrl, parsed_uri_t uri, const char *keyspec, estream_t *r_fp)
/* Send the request. */
err = send_request (ctrl, request, hostport, httphost, httpflags,
- NULL, NULL, &fp);
+ NULL, NULL, &fp, NULL);
if (handle_send_request_error (err, request, &tries))
{
reselect = 1;
@@ -1485,7 +1495,7 @@ ks_hkp_put (ctrl_t ctrl, parsed_uri_t uri, const void *data, size_t datalen)
/* Send the request. */
err = send_request (ctrl, request, hostport, httphost, 0,
- put_post_cb, &parm, &fp);
+ put_post_cb, &parm, &fp, NULL);
if (handle_send_request_error (err, request, &tries))
{
reselect = 1;
diff --git a/dirmngr/ks-engine-http.c b/dirmngr/ks-engine-http.c
index ae128ee..c51c0ce 100644
--- a/dirmngr/ks-engine-http.c
+++ b/dirmngr/ks-engine-http.c
@@ -65,7 +65,7 @@ ks_http_fetch (ctrl_t ctrl, const char *url, estream_t *r_fp)
estream_t fp = NULL;
char *request_buffer = NULL;
- err = http_session_new (&session, NULL);
+ err = http_session_new (&session, NULL, NULL);
if (err)
goto leave;
http_session_set_log_cb (session, cert_log_cb);
diff --git a/dirmngr/ks-engine.h b/dirmngr/ks-engine.h
index 6684a12..cb48f7f 100644
--- a/dirmngr/ks-engine.h
+++ b/dirmngr/ks-engine.h
@@ -34,7 +34,7 @@ gpg_error_t ks_hkp_mark_host (ctrl_t ctrl, const char *name, int alive);
gpg_error_t ks_hkp_print_hosttable (ctrl_t ctrl);
gpg_error_t ks_hkp_help (ctrl_t ctrl, parsed_uri_t uri);
gpg_error_t ks_hkp_search (ctrl_t ctrl, parsed_uri_t uri, const char *pattern,
- estream_t *r_fp);
+ estream_t *r_fp, unsigned int *r_http_status);
gpg_error_t ks_hkp_get (ctrl_t ctrl, parsed_uri_t uri,
const char *keyspec, estream_t *r_fp);
gpg_error_t ks_hkp_put (ctrl_t ctrl, parsed_uri_t uri,
diff --git a/dirmngr/misc.c b/dirmngr/misc.c
index c2c5af1..ac3856e 100644
--- a/dirmngr/misc.c
+++ b/dirmngr/misc.c
@@ -59,17 +59,23 @@ hashify_data( const char* data, size_t len )
{
unsigned char buf[20];
gcry_md_hash_buffer (GCRY_MD_SHA1, buf, data, len);
- return hexify_data( buf, 20 );
+ return hexify_data (buf, 20, 0);
}
char*
-hexify_data( const unsigned char* data, size_t len )
+hexify_data (const unsigned char* data, size_t len, int with_prefix)
{
int i;
- char* result = xmalloc( sizeof( char ) * (2*len+1));
+ char *result = xmalloc (2*len + (with_prefix?2:0) + 1);
+ char *p;
+
+ if (with_prefix)
+ p = stpcpy (result, "0x");
+ else
+ p = result;
- for( i = 0; i < 2*len; i+=2 )
- sprintf( result+i, "%02X", *data++);
+ for (i = 0; i < 2*len; i+=2 )
+ snprintf (p+i, 3, "%02X", *data++);
return result;
}
diff --git a/dirmngr/misc.h b/dirmngr/misc.h
index d8c53d3..be4049e 100644
--- a/dirmngr/misc.h
+++ b/dirmngr/misc.h
@@ -28,7 +28,7 @@ size_t unhexify (unsigned char *result, const char *string);
char* hashify_data( const char* data, size_t len );
/* Returns data as a hex string. */
-char* hexify_data( const unsigned char* data, size_t len );
+char* hexify_data (const unsigned char* data, size_t len, int with_prefix);
/* Returns the serial number as a hex string. */
char* serial_hex ( ksba_sexp_t serial );
diff --git a/dirmngr/t-dns-stuff.c b/dirmngr/t-dns-stuff.c
index 3030277..05b39a0 100644
--- a/dirmngr/t-dns-stuff.c
+++ b/dirmngr/t-dns-stuff.c
@@ -155,7 +155,8 @@ main (int argc, char **argv)
void *key;
size_t keylen;
- printf ("CERT lookup on '%s'\n", name);
+ if (verbose || any_options)
+ printf ("CERT lookup on '%s'\n", name);
err = get_dns_cert (name, DNS_CERTTYPE_ANY, &key, &keylen,
&fpr, &fpr_len, &url);
@@ -164,7 +165,8 @@ main (int argc, char **argv)
gpg_strerror (err), gpg_strsource (err));
else if (key)
{
- printf ("Key found (%u bytes)\n", (unsigned int)keylen);
+ if (verbose || any_options)
+ printf ("Key found (%u bytes)\n", (unsigned int)keylen);
}
else
{
diff --git a/dirmngr/t-http.c b/dirmngr/t-http.c
index 63662a2..9d5ea5f 100644
--- a/dirmngr/t-http.c
+++ b/dirmngr/t-http.c
@@ -262,7 +262,7 @@ main (int argc, char **argv)
http_register_tls_callback (verify_callback);
http_register_tls_ca (cafile);
- err = http_session_new (&session, NULL);
+ err = http_session_new (&session, NULL, NULL);
if (err)
log_error ("http_session_new failed: %s\n", gpg_strerror (err));
diff --git a/doc/DETAILS b/doc/DETAILS
index 7c3e67c..7d5a5a8 100644
--- a/doc/DETAILS
+++ b/doc/DETAILS
@@ -840,7 +840,12 @@ pkd:0:1024:B665B1435F4C2 .... FF26ABB:
should not contain spaces. The error code is a either a string
commencing with a letter or such a string prefixed with a
numerical error code and an underscore; e.g.: "151011327_EOF".
-
+*** WARNING <location> <error code> [<text>]
+ This is a generic warning status message, it might be followed by
+ error location specific data. <error code> and <location>
+ should not contain spaces. The error code is a either a string
+ commencing with a letter or such a string prefixed with a
+ numerical error code and an underscore; e.g.: "151011327_EOF".
*** SUCCESS [<location>]
Postive confirmation that an operation succeeded. It is used
similar to ISO-C's EXIT_SUCCESS. <location> is optional but if
@@ -945,11 +950,6 @@ pkd:0:1024:B665B1435F4C2 .... FF26ABB:
All other data after this header is raw image (JPEG) data.
-* Unattended key generation
-
- Please see the GnuPG manual for a description.
-
-
* Layout of the TrustDB
The TrustDB is built from fixed length records, where the first byte
diff --git a/doc/Makefile.am b/doc/Makefile.am
index 6e0bc15..a1a570c 100644
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -84,7 +84,7 @@ watchgnupg_SOURCE = gnupg.texi
CLEANFILES = yat2m mkdefsinc defs.inc
DISTCLEANFILES = gnupg.tmp gnupg.ops yat2m-stamp.tmp yat2m-stamp \
- $(myman_pages) gpg-zip.1 gpgkey2ssh.1 gnupg.7
+ $(myman_pages) gpg-zip.1 gnupg.7
yat2m: yat2m.c
$(CC_FOR_BUILD) -o $@ $(srcdir)/yat2m.c
@@ -136,7 +136,7 @@ dist-hook: defsincdate
defsincdate: $(gnupg_TEXINFOS)
: >defsincdate ; \
- if test -d $(top_srcdir)/.git; then \
+ if test -e $(top_srcdir)/.git; then \
(cd $(srcdir) && git log -1 --format='%ct' \
-- $(gnupg_TEXINFOS) 2>/dev/null) >>defsincdate; \
fi
diff --git a/doc/gpg-agent.texi b/doc/gpg-agent.texi
index 4e18b92..f4da9cf 100644
--- a/doc/gpg-agent.texi
+++ b/doc/gpg-agent.texi
@@ -402,6 +402,13 @@ This option asks the Pinentry to use @var{char} for displaying hidden
characters. @var{char} must be one character UTF-8 string. A
Pinentry may or may not honor this request.
+@item --pinentry-timeout @var{n}
+@opindex pinentry-timeout
+This option asks the Pinentry to timeout after @var{n} seconds with no
+user input. The default value of 0 does not ask the pinentry to
+timeout, however a Pinentry may use its own default timeout value in
+this case. A Pinentry may or may not honor this request.
+
@item --pinentry-program @var{filename}
@opindex pinentry-program
Use program @var{filename} as the PIN entry. The default is
diff --git a/doc/gpg.texi b/doc/gpg.texi
index d6ae579..e1835cf 100644
--- a/doc/gpg.texi
+++ b/doc/gpg.texi
@@ -185,7 +185,7 @@ passphrase).
@item --store
@opindex store
-Store only (make a simple RFC1991 literal data packet).
+Store only (make a simple literal data packet).
@item --decrypt
@itemx -d
@@ -396,6 +396,19 @@ GnuPG may ask you to enter the passphrase for the key. This is
required because the internal protection method of the secret key is
different from the one specified by the OpenPGP protocol.
+@item --export-ssh-key
+@opindex export-ssh-key
+This command is used to export a key in the OpenSSH public key format.
+It requires the specification of one key by the usual means and
+exports the latest valid subkey which has an authentication capability
+to STDOUT or to the file given with option @option{--output}. That
+output can directly be added to ssh's @file{authorized_key} file.
+
+By specifying the key to export using a key ID or a fingerprint
+suffixed with an exclamation mark (!), a specific subkey or the
+primary key can be exported. This does not even require that the key
+has the authentication capability flag set.
+
@item --import
@itemx --fast-import
@opindex import
@@ -574,7 +587,9 @@ may be used.
@item --gen-key
@opindex gen-key
Generate a new key pair using the current default parameters. This is
-the standard command to create a new key.
+the standard command to create a new key. In addition to the key a
+revocation certificate is created and stored in the
+@file{openpgp-revocs.d} directory below the GnuPG home directory.
@item --full-gen-key
@opindex gen-key
@@ -582,13 +597,23 @@ Generate a new key pair with dialogs for all options. This is an
extended version of @option{--gen-key}.
There is also a feature which allows you to create keys in batch
-mode. See the the manual section ``Unattended key generation'' on how
+mode. See the manual section ``Unattended key generation'' on how
to use this.
@item --gen-revoke @code{name}
@opindex gen-revoke
-Generate a revocation certificate for the complete key. To revoke
-a subkey or a signature, use the @option{--edit} command.
+Generate a revocation certificate for the complete key. To only revoke
+a subkey or a key signature, use the @option{--edit} command.
+
+This command merely creates the revocation certificate so that it can
+be used to revoke the key if that is ever needed. To actually revoke
+a key the created revocation certificate needs to be merged with the
+key to revoke. This is done by importing the revocation certificate
+using the @option{--import} command. Then the revoked key needs to be
+published, which is best done by sending the key to a keyserver
+(command @option{--send-key}) and by exporting (@option{--export}) it
+to a file which is then send to frequent communication partners.
+
@item --desig-revoke @code{name}
@opindex desig-revoke
@@ -1083,7 +1108,7 @@ give the opposite meaning. The options are:
Show usage information for keys and subkeys in the standard key
listing. This is a list of letters indicating the allowed usage for a
key (@code{E}=encryption, @code{S}=signing, @code{C}=certification,
- @code{A}=authentication). Defaults to no.
+ @code{A}=authentication). Defaults to yes.
@item show-policy-urls
@opindex list-options:show-policy-urls
@@ -2255,33 +2280,32 @@ to consider (e.g. @option{--symmetric}).
@item --s2k-cipher-algo @code{name}
@opindex s2k-cipher-algo
-Use @code{name} as the cipher algorithm used to protect secret keys.
-The default cipher is @value{GPGSYMENCALGO}. This cipher is also used
-for symmetric encryption with a passphrase if
-@option{--personal-cipher-preferences} and @option{--cipher-algo} is
-not given.
+Use @code{name} as the cipher algorithm for symmetric encryption with
+a passphrase if @option{--personal-cipher-preferences} and
+@option{--cipher-algo} are not given. The default is @value{GPGSYMENCALGO}.
@item --s2k-digest-algo @code{name}
@opindex s2k-digest-algo
-Use @code{name} as the digest algorithm used to mangle the passphrases.
-The default algorithm is SHA-1.
+Use @code{name} as the digest algorithm used to mangle the passphrases
+for symmetric encryption. The default is SHA-1.
@item --s2k-mode @code{n}
@opindex s2k-mode
-Selects how passphrases are mangled. If @code{n} is 0 a plain
-passphrase (which is not recommended) will be used, a 1 adds a salt to
-the passphrase and a 3 (the default) iterates the whole process a
-number of times (see --s2k-count). Unless @option{--rfc1991} is used,
-this mode is also used for symmetric encryption with a passphrase.
+Selects how passphrases for symmetric encryption are mangled. If
+@code{n} is 0 a plain passphrase (which is in general not recommended)
+will be used, a 1 adds a salt (which should not be used) to the
+passphrase and a 3 (the default) iterates the whole process a number
+of times (see @option{--s2k-count}).
@item --s2k-count @code{n}
@opindex s2k-count
-Specify how many times the passphrase mangling is repeated. This
-value may range between 1024 and 65011712 inclusive. The default is
-inquired from gpg-agent. Note that not all values in the
-1024-65011712 range are legal and if an illegal value is selected,
-GnuPG will round up to the nearest legal value. This option is only
-meaningful if @option{--s2k-mode} is 3.
+Specify how many times the passphrases mangling for symmetric
+encryption is repeated. This value may range between 1024 and
+65011712 inclusive. The default is inquired from gpg-agent. Note
+that not all values in the 1024-65011712 range are legal and if an
+illegal value is selected, GnuPG will round up to the nearest legal
+value. This option is only meaningful if @option{--s2k-mode} is set
+to the default of 3.
@end table
@@ -2327,32 +2351,6 @@ behavior. Note that this is currently the same thing as
Reset all packet, cipher and digest options to strict RFC-2440
behavior.
-@ifclear gpgtowone
-@item --rfc1991
-@opindex rfc1991
-Try to be more RFC-1991 (PGP 2.x) compliant. This option is
-deprecated will be removed in GnuPG 2.1.
-
-@item --pgp2
-@opindex pgp2
-Set up all options to be as PGP 2.x compliant as possible, and warn if
-an action is taken (e.g. encrypting to a non-RSA key) that will create
-a message that PGP 2.x will not be able to handle. Note that `PGP
-2.x' here means `MIT PGP 2.6.2'. There are other versions of PGP 2.x
-available, but the MIT release is a good common baseline.
-
-This option implies
-@option{--rfc1991 --disable-mdc --no-force-v4-certs
- --escape-from-lines --force-v3-sigs --allow-weak-digest-algos
- --cipher-algo IDEA --digest-algo MD5 --compress-algo ZIP}.
-It also disables @option{--textmode} when encrypting.
-
-This option is deprecated will be removed in GnuPG 2.1. The reason
-for dropping PGP-2 support is that the PGP 2 format is not anymore
-considered safe (for example due to the use of the broken MD5 algorithm).
-Note that the decryption of PGP-2 created messages will continue to work.
-@end ifclear
-
@item --pgp6
@opindex pgp6
Set up all options to be as PGP 6 compliant as possible. This
diff --git a/doc/tools.texi b/doc/tools.texi
index 633502e..425790e 100644
--- a/doc/tools.texi
+++ b/doc/tools.texi
@@ -21,7 +21,6 @@ GnuPG comes with a couple of smaller tools:
* gpgparsemail:: Parse a mail message into an annotated format
* symcryptrun:: Call a simple symmetric encryption tool.
* gpg-zip:: Encrypt or sign files into an archive.
-* gpgkey2ssh:: Emit GPG public keys in OpenSSH format.
@end menu
@c
@@ -1894,75 +1893,3 @@ gpg-zip --list-archive test1
@command{tar}(1),
@end ifset
@include see-also-note.texi
-
-
-@c
-@c GPGKEY2SSH
-@c
-@manpage gpgkey2ssh.1
-@node gpgkey2ssh
-@section Emit GPG public keys in OpenSSH format
-@ifset manverb
-.B gpgkey2ssh \- Emit GPG public keys in OpenSSH format
-@end ifset
-
-@mansect synopsis
-@ifset manverb
-.B gpgkey2ssh
-.I keyid
-@end ifset
-
-@mansect description
-This tool is deprecated and will be removed soon.
-
-@command{gpgkey2ssh} emits the public key of an OpenPGP RSA or DSA key
-in a format readable by OpenSSH clients and servers.
-
-It takes only a single argument, a key ID, which designates the
-primary key or subkey whose public key should be converted.
-
-The key ID should use upper-case (A-F, not a-f) for all hex digits
-greater than 9, and the key in question must be present in
-@code{gpg}'s public keyring.
-
-The output of a successful run can be used verbatim as an entry in an
-@code{authorized_keys} file for @code{sshd}, or can be prefixed with a
-host name and appended to a @code{known_hosts} file for @code{ssh}.
-
-@mansect return value
-
-The program returns 0 if the key was successfully converted and
-non-zero if there was an error (e.g., if the key ID was malformed, the
-key was not present in the public keyring, or if the key is not an RSA
-or DSA key).
-
-@mansect environment
-@subsection Environment
-
-@table @asis
-
-@item HOME
-Used to locate the default home directory.
-
-@item GNUPGHOME
-If set directory used instead of "~/.gnupg".
-
-@end table
-
-@mansect files
-@subsection FILES
-
-@table @asis
-
-@item gpg2
-The command used to search the user's keyring.
-
-@end table
-
-@mansect see also
-@ifset isman
-@command{gpg2}(1),
-@command{sshd}(8),
-@command{ssh}(1)
-@end ifset
-@include see-also-note.texi
diff --git a/doc/whats-new-in-2.1.txt b/doc/whats-new-in-2.1.txt
index d20239f..6c46b04 100644
--- a/doc/whats-new-in-2.1.txt
+++ b/doc/whats-new-in-2.1.txt
@@ -6,7 +6,7 @@
â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”
- 2014-11-04
+ 2016-01-14
Table of Contents
@@ -28,8 +28,9 @@ Table of Contents
.. 1.13 Improved card support
.. 1.14 New format for key listings
.. 1.15 Support for Putty
-.. 1.16 Improved X.509 certificate creation
-.. 1.17 Scripts to create a Windows installer
+.. 1.16 Export of SSH public keys
+.. 1.17 Improved X.509 certificate creation
+.. 1.18 Scripts to create a Windows installer
A possibly revised version of this article can be found at:
@@ -91,6 +92,8 @@ https://gnupg.org/faq/whats-new-in-2.1.html
possible to export them directly in PKCS#8 and PEM format for use on
TLS servers.
+ • Export of /ssh/ keys has been integrated.
+
• The scripts to create a Windows installer are now part of GnuPG.
Now for the detailed description of these new features:
@@ -172,7 +175,7 @@ https://gnupg.org/faq/whats-new-in-2.1.html
This is best shown with an example:
- ╭────
+ ┌────
│ $ gpg2 --gen-key
│ gpg (GnuPG) 2.1.0; Copyright (C) 2014 Free Software Foundation, Inc.
│ This is free software: you are free to change and redistribute it.
@@ -194,7 +197,7 @@ https://gnupg.org/faq/whats-new-in-2.1.html
│ Key fingerprint = 0290 5ABF 17C7 81FB C390 9B00 636A 1BBD 68FD 0088
│ uid [ultimate] Glenn Greenwald <glenn@example.org>
│ sub rsa2048/84439DCD 2014-11-03
- ╰────
+ └────
Thus only the name and the mail address are required. For all other
parameters the default values are used. Many graphical frontends
@@ -212,10 +215,10 @@ https://gnupg.org/faq/whats-new-in-2.1.html
options to create an ECC key.
For those who want to experiment with ECC or already want to prepare a
- key for future use, the command `--gen-full-key' along with the option
+ key for future use, the command `--full-gen-key' along with the option
`--expert' is the enabler:
- ╭────
+ ┌────
│ $ gpg2 --expert --full-gen-key
│ gpg (GnuPG) 2.1.0; Copyright (C) 2014 Free Software Foundation, Inc.
│ This is free software: you are free to change and redistribute it.
@@ -264,7 +267,7 @@ https://gnupg.org/faq/whats-new-in-2.1.html
│ Key fingerprint = E630 27CF 3D68 22A7 6FF2 093E D179 9E72 3826 60E3
│ uid [ultimate] Edward Snowden <edward@example.org>
│ sub nistp256/48C9A997 2014-11-03 nistp256
- ╰────
+ └────
In this example we created a primary ECC key for signing and an subkey
for encryption. For both we use the NIST P-256 curve. The key may
@@ -284,7 +287,7 @@ https://gnupg.org/faq/whats-new-in-2.1.html
releases. Recall that an encryption subkey can be added to a key at
any time. If you want to create a signing key you may do it this way:
- ╭────
+ ┌────
│ $ gpg2 --expert --full-gen-key
│ gpg (GnuPG) 2.1.0; Copyright (C) 2014 Free Software Foundation, Inc.
│ This is free software: you are free to change and redistribute it.
@@ -335,7 +338,7 @@ https://gnupg.org/faq/whats-new-in-2.1.html
│ pub ed25519/5C1AFC2A 2014-11-03
│ Key fingerprint = ED85 4D98 5D8F 502F C6C5 FFB2 AA81 319E 5C1A FC2A
│ uid [ultimate] Laura Poitras <laura@example.org>
- ╰────
+ └────
Support for ECC keys is available only on some keyservers but it is
expected that this will be fixed over the next few months.
@@ -355,17 +358,17 @@ https://gnupg.org/faq/whats-new-in-2.1.html
parameter file or interactive prompts for generating a key or to sign
a key. This can now be accomplished with a few new commands:
- ╭────
+ ┌────
│ $ gpg2 --batch --quick-gen-key 'Daniel Ellsberg <ellsberg@example.org>'
│ gpg: key 911B90A9 marked as ultimately trusted
- ╰────
+ └────
If a key with that user id already exists, gpg bails out with an error
message. You can force creation using the option `--yes'. If you
want some more control, you may not use `--batch' and gpg will ask for
confirmation and show the resulting key:
- ╭────
+ ┌────
│ $ gpg2 --quick-gen-key 'Daniel Ellsberg <ellsberg@example.org>'
│ About to create a key for:
│ "Daniel Ellsberg <ellsberg@example.org>"
@@ -379,13 +382,13 @@ https://gnupg.org/faq/whats-new-in-2.1.html
│ Key fingerprint = 15CB 723E 2000 A1A8 2505 F3B7 CC00 B501 BD19 AC1C
│ uid [ultimate] Daniel Ellsberg <ellsberg@example.org>
│ sub rsa2048/72A4D018 2014-11-04
- ╰────
+ └────
Another common operation is to sign a key. /gpg/ can do this directly
from the command line by giving the fingerprint of the to-be-signed
key:
- ╭────
+ ┌────
│ $ gpg2 --quick-sign-key '15CB 723E 2000 A1A8 2505 F3B7 CC00 B501 BD19 AC1C'
│
│ pub rsa2048/BD19AC1C
@@ -394,13 +397,13 @@ https://gnupg.org/faq/whats-new-in-2.1.html
│ Primary key fingerprint: 15CB 723E 2000 A1A8 2505 F3B7 CC00 B501 BD19 AC1C
│
│ Daniel Ellsberg <ellsberg@example.org>
- ╰────
+ └────
In case the key has already been signed, the command prints a note and
exits with success. In case you want to check that it really worked,
use `=--check-sigs' as usual:
- ╭────
+ ┌────
│ $ gpg2 --check-sigs '15CB 723E 2000 A1A8 2505 F3B7 CC00 B501 BD19 AC1C'
│ gpg: checking the trustdb
│ gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
@@ -411,7 +414,7 @@ https://gnupg.org/faq/whats-new-in-2.1.html
│ sig! 68FD0088 2014-11-04 Glenn Greenwald <glenn@example.org>
│ sub rsa2048/72A4D018 2014-11-04
│ sig! BD19AC1C 2014-11-04 Daniel Ellsberg <ellsberg@example.org>
- ╰────
+ └────
The fingerprint may also be given without the spaces in which case
@@ -420,6 +423,20 @@ https://gnupg.org/faq/whats-new-in-2.1.html
To create a non-exportable key signature, use the command
`--quick-lsign-key' instead.
+ Since version 2.1.4 it possible to directly add another user id to an
+ existing key:
+
+ ┌────
+ │ $ gpg2 -k 8CFDE12197965A9A
+ │ pub ed25519/8CFDE12197965A9A 2014-08-19
+ │ uid [ unknown] EdDSA sample key 1
+ │ $ gpg2 --quick-adduid 8CFDE12197965A9A 'Sample 2 <me@example.org>'
+ │ $ gpg2 -k 8CFDE12197965A9A
+ │ pub ed25519/8CFDE12197965A9A 2014-08-19
+ │ uid [ unknown] Sample 2 <me@example.org>
+ │ uid [ unknown] EdDSA sample key 1
+ └────
+
1.6 Improved Pinentry support
─────────────────────────────
@@ -531,10 +548,10 @@ https://gnupg.org/faq/whats-new-in-2.1.html
dead so that it won’t be used in future. To interact with the
/dirmngr/ the `gpg-connect-agent' tool is used:
- ╭────
+ ┌────
│ $ gpg-connect-agent --dirmngr 'help keyserver' /bye
│ $ gpg-connect-agent --dirmngr 'keyserver --hosttable' /bye
- ╰────
+ └────
The first command prints a help screen for the keyserver command and
the second command prints the current host table.
@@ -571,16 +588,23 @@ https://gnupg.org/faq/whats-new-in-2.1.html
keybox file.
To convert an existing `pubring.gpg' file to the keybox format, you
- first rename the file to (for example) `publickeys' so it won’t be
- recognized by any GnuPG version and then you run the command
-
- ╭────
- │ $ gpg2 --import publickeys
- ╰────
+ first backup the ownertrust values, then rename the file to (for
+ example) `publickeys', so it won’t be recognized by any GnuPG version,
+ then run import, and finally restore the ownertrust values:
+
+ ┌────
+ │ $ cd ~/.gnupg
+ │ $ gpg --export-ownertrust >otrust.lst
+ │ $ mv pubring.gpg publickeys
+ │ $ gpg2 --import-options import-local-sigs --import publickeys
+ │ $ gpg2 --import-ownertrust otrust.lst
+ └────
You may then rename the `publickeys' file back so that it can be used
by older GnuPG versions. Remember that in this case you have two
- independent copies of the public keys.
+ independent copies of the public keys. The ownertrust values are kept
+ by all gpg versions in the file `trustdb.gpg' but the above
+ precautions need to be taken to keep them over an import.
1.12 Auto-generated revocation certificates
@@ -597,14 +621,17 @@ https://gnupg.org/faq/whats-new-in-2.1.html
──────────────────────────
The /scdaemon/, which is responsible for accessing smardcards and
- other tokens, has received may updates. In particular plugable USB
+ other tokens, has received many updates. In particular plugable USB
readers with a fixed card now work smoothless and similar to standard
- readers. The latest features of the /gnuk/ token are supported. Code
- for the HSM smartcard has been added. More card readers with a PIN
+ readers. The latest features of the [gnuk] token are supported. Code
+ for the SmartCard-HSM has been added. More card readers with a PIN
pad are supported. The internal CCID driver does now also work with
certain non-auto configuration equipped readers.
+ [gnuk] http://www.fsij.org/doc-gnuk/
+
+
1.14 New format for key listings
────────────────────────────────
@@ -616,11 +643,11 @@ https://gnupg.org/faq/whats-new-in-2.1.html
either use the algorithm name with appended key length or use the name
of the curve:
- ╭────
+ ┌────
│ pub 2048D/1E42B367 2007-12-31 [expires: 2018-12-31]
│ pub dsa2048/1E42B367 2007-12-31 [expires: 2018-12-31]
│ pub ed25519/0AA914C9 2014-10-18
- ╰────
+ └────
The first two lines show the same key in the old format and in the new
format. The third line shows an example of an ECC key using the
@@ -653,7 +680,18 @@ https://gnupg.org/faq/whats-new-in-2.1.html
[Putty] http://www.chiark.greenend.org.uk/~sgtatham/putty/
-1.16 Improved X.509 certificate creation
+1.16 Export of SSH public keys
+──────────────────────────────
+
+ The new command `--export-ssh-key' makes it easy to export an /ssh/
+ public key in the format used for ssh’s `authorized_keys' file. By
+ default the command exports the newest subkey with an authorization
+ usage flags. A special syntax can be used to export other subkeys.
+ This command is available since 2.1.11 and replaces the former debug
+ utility /gpgkey2ssh/.
+
+
+1.17 Improved X.509 certificate creation
────────────────────────────────────────
In addition to an improved certificate signing request menu, it is now
@@ -673,7 +711,7 @@ https://gnupg.org/faq/whats-new-in-2.1.html
and directly exported in a format suitable for OpenSSL based servers.
-1.17 Scripts to create a Windows installer
+1.18 Scripts to create a Windows installer
──────────────────────────────────────────
GnuPG now comes with the /speedo/ build system which may be used to
@@ -686,9 +724,9 @@ https://gnupg.org/faq/whats-new-in-2.1.html
and GpgEX as a Windows Explorer extension. GnuPG needs to be unpacked
and from the top source directory you run this command
- ╭────
+ ┌────
│ make -f build-aux/speedo.mk w32-installer
- ╰────
+ └────
This command downloads all direct dependencies, checks the signatures
using the GnuPG version from the build system (all Linux distros
@@ -696,12 +734,15 @@ https://gnupg.org/faq/whats-new-in-2.1.html
uses NSIS to create the installer. Although this sounds easy, some
experience in setting up a development machine is still required.
Some versions of the toolchain exhibit bugs and thus your mileage may
- vary. Support for keyserver access over TLS is currently not
- available but will be added with one of the next point releases.
+ vary. See the [Wiki] for more info.
+
+ Support for keyserver access over TLS is currently not available but
+ will be added with one of the next point releases.
+ [Wiki] https://wiki.gnupg.org/Build2.1_Windows
- # Copyright 2014 The GnuPG Project.
+ # Copyright 2014--2016 The GnuPG Project.
# This work is licensed under the Creative Commons
# Attribution-ShareAlike 4.0 International License. To view a copy of
# this license, visit http://creativecommons.org/licenses/by-sa/4.0/
diff --git a/g10/armor.c b/g10/armor.c
index e368660..55ee5d3 100644
--- a/g10/armor.c
+++ b/g10/armor.c
@@ -274,7 +274,7 @@ parse_hash_header( const char *line )
return 0; /* too short or too long */
if( memcmp( line, "Hash:", 5 ) )
return 0; /* invalid header */
- s = line+5;
+
for(s=line+5;;s=s2) {
for(; *s && (*s==' ' || *s == '\t'); s++ )
;
@@ -1251,7 +1251,7 @@ armor_filter( void *opaque, int control,
release_armor_context (afx);
}
else if( control == IOBUFCTRL_DESC )
- *(char**)buf = "armor_filter";
+ mem2str (buf, "armor_filter", *ret_len);
return rc;
}
diff --git a/g10/call-agent.c b/g10/call-agent.c
index 8eb16e4..d9e4859 100644
--- a/g10/call-agent.c
+++ b/g10/call-agent.c
@@ -137,18 +137,6 @@ status_sc_op_failure (int rc)
}
-static gpg_error_t
-membuf_data_cb (void *opaque, const void *buffer, size_t length)
-{
- membuf_t *data = opaque;
-
- if (buffer)
- put_membuf (data, buffer, length);
- return 0;
-}
-
-
-
/* This is the default inquiry callback. It mainly handles the
Pinentry notifications. */
static gpg_error_t
@@ -214,7 +202,7 @@ check_hijacking (assuan_context_t ctx)
/* AGENT_ID is a command implemented by gnome-keyring-daemon. It
does not return any data but an OK line with a remark. */
if (assuan_transact (ctx, "AGENT_ID",
- membuf_data_cb, &mb, NULL, NULL, NULL, NULL))
+ put_membuf_cb, &mb, NULL, NULL, NULL, NULL))
{
xfree (get_membuf (&mb, NULL));
return; /* Error - Probably not hijacked. */
@@ -265,6 +253,40 @@ check_hijacking (assuan_context_t ctx)
+/* Print a warning if the server's version number is less than our
+ version number. Returns an error code on a connection problem. */
+static gpg_error_t
+warn_version_mismatch (assuan_context_t ctx, const char *servername, int mode)
+{
+ gpg_error_t err;
+ char *serverversion;
+ const char *myversion = strusage (13);
+
+ err = get_assuan_server_version (ctx, mode, &serverversion);
+ if (err)
+ log_error (_("error getting version from '%s': %s\n"),
+ servername, gpg_strerror (err));
+ else if (!compare_version_strings (serverversion, myversion))
+ {
+ char *warn;
+
+ warn = xtryasprintf (_("server '%s' is older than us (%s < %s)"),
+ servername, serverversion, myversion);
+ if (!warn)
+ err = gpg_error_from_syserror ();
+ else
+ {
+ log_info (_("WARNING: %s\n"), warn);
+ write_status_strings (STATUS_WARNING, "server_version_mismatch 0",
+ " ", warn, NULL);
+ xfree (warn);
+ }
+ }
+ xfree (serverversion);
+ return err;
+}
+
+
/* Try to connect to the agent via socket or fork it off and work by
pipes. Handle the server's initial greeting */
static int
@@ -298,7 +320,8 @@ start_agent (ctrl_t ctrl, int for_card)
log_info (_("no gpg-agent running in this session\n"));
}
}
- else if (!rc)
+ else if (!rc
+ && !(rc = warn_version_mismatch (agent_ctx, GPG_AGENT_NAME, 0)))
{
/* Tell the agent that we support Pinentry notifications.
No error checking so that it will work also with older
@@ -336,9 +359,12 @@ start_agent (ctrl_t ctrl, int for_card)
struct agent_card_info_s info;
memset (&info, 0, sizeof info);
- rc = assuan_transact (agent_ctx, "SCD SERIALNO openpgp",
- NULL, NULL, NULL, NULL,
- learn_status_cb, &info);
+
+ rc = warn_version_mismatch (agent_ctx, SCDAEMON_NAME, 2);
+ if (!rc)
+ rc = assuan_transact (agent_ctx, "SCD SERIALNO openpgp",
+ NULL, NULL, NULL, NULL,
+ learn_status_cb, &info);
if (rc)
{
switch (gpg_err_code (rc))
@@ -675,14 +701,10 @@ learn_status_cb (void *opaque, const char *line)
{
const char *curve;
- i = 0;
- do
- {
- curve = openpgp_enum_curves (&i);
- if (!strcmp (curve, line+n))
- break;
- }
- while (curve != NULL);
+ for (i = 0; (curve = openpgp_enum_curves (&i));)
+ if (!strcmp (curve, line+n))
+ break;
+
parm->key_attr[keyno].curve = curve;
}
}
@@ -780,7 +802,7 @@ agent_scd_apdu (const char *hexapdu, unsigned int *r_sw)
snprintf (line, DIM(line)-1, "SCD APDU %s", hexapdu);
err = assuan_transact (agent_ctx, line,
- membuf_data_cb, &mb, NULL, NULL, NULL, NULL);
+ put_membuf_cb, &mb, NULL, NULL, NULL, NULL);
if (!err)
{
data = get_membuf (&mb, &datalen);
@@ -1292,7 +1314,7 @@ agent_scd_readcert (const char *certidstr,
snprintf (line, DIM(line)-1, "SCD READCERT %s", certidstr);
line[DIM(line)-1] = 0;
rc = assuan_transact (agent_ctx, line,
- membuf_data_cb, &data,
+ put_membuf_cb, &data,
default_inq_cb, &dfltparm,
NULL, NULL);
if (rc)
@@ -1455,7 +1477,7 @@ agent_get_passphrase (const char *cache_id,
init_membuf_secure (&data, 64);
rc = assuan_transact (agent_ctx, line,
- membuf_data_cb, &data,
+ put_membuf_cb, &data,
default_inq_cb, &dfltparm,
NULL, NULL);
@@ -1553,7 +1575,7 @@ agent_get_s2k_count (unsigned long *r_count)
init_membuf (&data, 32);
err = assuan_transact (agent_ctx, "GETINFO s2k_count",
- membuf_data_cb, &data,
+ put_membuf_cb, &data,
NULL, NULL, NULL, NULL);
if (err)
xfree (get_membuf (&data, NULL));
@@ -1723,30 +1745,29 @@ static gpg_error_t
cache_nonce_status_cb (void *opaque, const char *line)
{
struct cache_nonce_parm_s *parm = opaque;
- const char *keyword = line;
- int keywordlen;
-
- for (keywordlen=0; *line && !spacep (line); line++, keywordlen++)
- ;
- while (spacep (line))
- line++;
+ const char *s;
- if (keywordlen == 11 && !memcmp (keyword, "CACHE_NONCE", keywordlen))
+ if ((s = has_leading_keyword (line, "CACHE_NONCE")))
{
if (parm->cache_nonce_addr)
{
xfree (*parm->cache_nonce_addr);
- *parm->cache_nonce_addr = xtrystrdup (line);
+ *parm->cache_nonce_addr = xtrystrdup (s);
}
}
- else if (keywordlen == 12 && !memcmp (keyword, "PASSWD_NONCE", keywordlen))
+ else if ((s = has_leading_keyword (line, "PASSWD_NONCE")))
{
if (parm->passwd_nonce_addr)
{
xfree (*parm->passwd_nonce_addr);
- *parm->passwd_nonce_addr = xtrystrdup (line);
+ *parm->passwd_nonce_addr = xtrystrdup (s);
}
}
+ else if ((s = has_leading_keyword (line, "PROGRESS")))
+ {
+ if (opt.enable_progress_filter)
+ write_status_text (STATUS_PROGRESS, s);
+ }
return 0;
}
@@ -1825,7 +1846,7 @@ agent_genkey (ctrl_t ctrl, char **cache_nonce_addr,
cn_parm.cache_nonce_addr = cache_nonce_addr;
cn_parm.passwd_nonce_addr = NULL;
err = assuan_transact (agent_ctx, line,
- membuf_data_cb, &data,
+ put_membuf_cb, &data,
inq_genkey_parms, &gk_parm,
cache_nonce_status_cb, &cn_parm);
if (err)
@@ -1879,7 +1900,7 @@ agent_readkey (ctrl_t ctrl, int fromcard, const char *hexkeygrip,
init_membuf (&data, 1024);
err = assuan_transact (agent_ctx, line,
- membuf_data_cb, &data,
+ put_membuf_cb, &data,
default_inq_cb, &dfltparm,
NULL, NULL);
if (err)
@@ -1967,7 +1988,7 @@ agent_pksign (ctrl_t ctrl, const char *cache_nonce,
cache_nonce? " -- ":"",
cache_nonce? cache_nonce:"");
err = assuan_transact (agent_ctx, line,
- membuf_data_cb, &data,
+ put_membuf_cb, &data,
default_inq_cb, &dfltparm,
NULL, NULL);
if (err)
@@ -2097,7 +2118,7 @@ agent_pkdecrypt (ctrl_t ctrl, const char *keygrip, const char *desc,
if (err)
return err;
err = assuan_transact (agent_ctx, "PKDECRYPT",
- membuf_data_cb, &data,
+ put_membuf_cb, &data,
inq_ciphertext_cb, &parm,
padding_info_cb, r_padding);
xfree (parm.ciphertext);
@@ -2177,7 +2198,7 @@ agent_keywrap_key (ctrl_t ctrl, int forexport, void **r_kek, size_t *r_keklen)
init_membuf_secure (&data, 64);
err = assuan_transact (agent_ctx, line,
- membuf_data_cb, &data,
+ put_membuf_cb, &data,
default_inq_cb, &dfltparm,
NULL, NULL);
if (err)
@@ -2216,7 +2237,7 @@ inq_import_key_parms (void *opaque, const char *line)
/* Call the agent to import a key into the agent. */
gpg_error_t
agent_import_key (ctrl_t ctrl, const char *desc, char **cache_nonce_addr,
- const void *key, size_t keylen, int unattended)
+ const void *key, size_t keylen, int unattended, int force)
{
gpg_error_t err;
struct import_key_parm_s parm;
@@ -2246,8 +2267,9 @@ agent_import_key (ctrl_t ctrl, const char *desc, char **cache_nonce_addr,
parm.key = key;
parm.keylen = keylen;
- snprintf (line, sizeof line, "IMPORT_KEY%s%s%s",
+ snprintf (line, sizeof line, "IMPORT_KEY%s%s%s%s",
unattended? " --unattended":"",
+ force? " --force":"",
cache_nonce_addr && *cache_nonce_addr? " ":"",
cache_nonce_addr && *cache_nonce_addr? *cache_nonce_addr:"");
cn_parm.cache_nonce_addr = cache_nonce_addr;
@@ -2308,7 +2330,7 @@ agent_export_key (ctrl_t ctrl, const char *hexkeygrip, const char *desc,
cn_parm.cache_nonce_addr = cache_nonce_addr;
cn_parm.passwd_nonce_addr = NULL;
err = assuan_transact (agent_ctx, line,
- membuf_data_cb, &data,
+ put_membuf_cb, &data,
default_inq_cb, &dfltparm,
cache_nonce_status_cb, &cn_parm);
if (err)
@@ -2419,27 +2441,11 @@ gpg_error_t
agent_get_version (ctrl_t ctrl, char **r_version)
{
gpg_error_t err;
- membuf_t data;
err = start_agent (ctrl, 0);
if (err)
return err;
- init_membuf (&data, 64);
- err = assuan_transact (agent_ctx, "GETINFO version",
- membuf_data_cb, &data,
- NULL, NULL, NULL, NULL);
- if (err)
- {
- xfree (get_membuf (&data, NULL));
- *r_version = NULL;
- }
- else
- {
- put_membuf (&data, "", 1);
- *r_version = get_membuf (&data, NULL);
- if (!*r_version)
- err = gpg_error_from_syserror ();
- }
+ err = get_assuan_server_version (agent_ctx, 0, r_version);
return err;
}
diff --git a/g10/call-agent.h b/g10/call-agent.h
index fa1b88a..208b75b 100644
--- a/g10/call-agent.h
+++ b/g10/call-agent.h
@@ -186,8 +186,8 @@ gpg_error_t agent_keywrap_key (ctrl_t ctrl, int forexport,
/* Send a key to the agent. */
gpg_error_t agent_import_key (ctrl_t ctrl, const char *desc,
- char **cache_nonce_addr,
- const void *key, size_t keylen, int unattended);
+ char **cache_nonce_addr, const void *key,
+ size_t keylen, int unattended, int force);
/* Receive a key from the agent. */
gpg_error_t agent_export_key (ctrl_t ctrl, const char *keygrip,
diff --git a/g10/call-dirmngr.c b/g10/call-dirmngr.c
index 83af0be..e596533 100644
--- a/g10/call-dirmngr.c
+++ b/g10/call-dirmngr.c
@@ -38,6 +38,7 @@
#include "i18n.h"
#include "asshelp.h"
#include "keyserver.h"
+#include "status.h"
#include "call-dirmngr.h"
@@ -132,6 +133,40 @@ gpg_dirmngr_deinit_session_data (ctrl_t ctrl)
}
+/* Print a warning if the server's version number is less than our
+ version number. Returns an error code on a connection problem. */
+static gpg_error_t
+warn_version_mismatch (assuan_context_t ctx, const char *servername)
+{
+ gpg_error_t err;
+ char *serverversion;
+ const char *myversion = strusage (13);
+
+ err = get_assuan_server_version (ctx, 0, &serverversion);
+ if (err)
+ log_error (_("error getting version from '%s': %s\n"),
+ servername, gpg_strerror (err));
+ else if (!compare_version_strings (serverversion, myversion))
+ {
+ char *warn;
+
+ warn = xtryasprintf (_("server '%s' is older than us (%s < %s)"),
+ servername, serverversion, myversion);
+ if (!warn)
+ err = gpg_error_from_syserror ();
+ else
+ {
+ log_info (_("WARNING: %s\n"), warn);
+ write_status_strings (STATUS_WARNING, "server_version_mismatch 0",
+ " ", warn, NULL);
+ xfree (warn);
+ }
+ }
+ xfree (serverversion);
+ return err;
+}
+
+
/* Try to connect to the Dirmngr via a socket or spawn it if possible.
Handle the server's initial greeting and set global options. */
static gpg_error_t
@@ -157,7 +192,7 @@ create_context (ctrl_t ctrl, assuan_context_t *r_ctx)
log_info (_("no dirmngr running in this session\n"));
}
}
- else if (!err)
+ else if (!err && !(err = warn_version_mismatch (ctx, DIRMNGR_NAME)))
{
char *line;
@@ -369,7 +404,8 @@ gpg_dirmngr_ks_list (ctrl_t ctrl, char **r_keyserver)
memset (&stparm, 0, sizeof stparm);
stparm.keyword = "KEYSERVER";
- *r_keyserver = NULL;
+ if (r_keyserver)
+ *r_keyserver = NULL;
err = open_context (ctrl, &ctx);
if (err)
@@ -385,7 +421,10 @@ gpg_dirmngr_ks_list (ctrl_t ctrl, char **r_keyserver)
goto leave;
}
- *r_keyserver = stparm.source;
+ if (r_keyserver)
+ *r_keyserver = stparm.source;
+ else
+ xfree (stparm.source);
stparm.source = NULL;
leave:
@@ -1080,10 +1119,8 @@ dns_cert_status_cb (void *opaque, const char *line)
{
if (parm->url)
err = gpg_error (GPG_ERR_DUP_KEY);
- else if (!(parm->fpr = xtrymalloc (nbytes)))
+ else if (!(parm->url = xtrystrdup (s)))
err = gpg_error_from_syserror ();
- else
- memcpy (parm->fpr, line, (parm->fprlen = nbytes));
}
return err;
diff --git a/g10/card-util.c b/g10/card-util.c
index 7196031..b48705b 100644
--- a/g10/card-util.c
+++ b/g10/card-util.c
@@ -145,7 +145,6 @@ change_pin (int unblock_v2, int allow_admin)
if (strlen (answer) != 1)
continue;
- rc = 0;
if (*answer == '1')
{
/* Change PIN. */
diff --git a/g10/cipher.c b/g10/cipher.c
index b72b144..41324c3 100644
--- a/g10/cipher.c
+++ b/g10/cipher.c
@@ -157,7 +157,7 @@ cipher_filter( void *opaque, int control,
gcry_cipher_close (cfx->cipher_hd);
}
else if( control == IOBUFCTRL_DESC ) {
- *(char**)buf = "cipher_filter";
+ mem2str (buf, "cipher_filter", *ret_len);
}
return rc;
}
diff --git a/g10/compress-bz2.c b/g10/compress-bz2.c
index ea80956..128eadf 100644
--- a/g10/compress-bz2.c
+++ b/g10/compress-bz2.c
@@ -248,6 +248,6 @@ compress_filter_bz2( void *opaque, int control,
zfx->release (zfx);
}
else if( control == IOBUFCTRL_DESC )
- *(char**)buf = "compress_filter";
+ mem2str (buf, "compress_filter", *ret_len);
return rc;
}
diff --git a/g10/compress.c b/g10/compress.c
index 8047dbb..fd1ed6a 100644
--- a/g10/compress.c
+++ b/g10/compress.c
@@ -288,7 +288,7 @@ compress_filter( void *opaque, int control,
zfx->release (zfx);
}
else if( control == IOBUFCTRL_DESC )
- *(char**)buf = "compress_filter";
+ mem2str (buf, "compress_filter", *ret_len);
return rc;
}
#endif /*HAVE_ZIP*/
diff --git a/g10/decrypt-data.c b/g10/decrypt-data.c
index 2d9f54f..1380faf 100644
--- a/g10/decrypt-data.c
+++ b/g10/decrypt-data.c
@@ -425,7 +425,7 @@ mdc_decode_filter (void *opaque, int control, IOBUF a,
}
else if ( control == IOBUFCTRL_DESC )
{
- *(char**)buf = "mdc_decode_filter";
+ mem2str (buf, "mdc_decode_filter", *ret_len);
}
return rc;
}
@@ -496,7 +496,7 @@ decode_filter( void *opaque, int control, IOBUF a, byte *buf, size_t *ret_len)
}
else if ( control == IOBUFCTRL_DESC )
{
- *(char**)buf = "decode_filter";
+ mem2str (buf, "decode_filter", *ret_len);
}
return rc;
}
diff --git a/g10/delkey.c b/g10/delkey.c
index b0a2b0d..5d0c3df 100644
--- a/g10/delkey.c
+++ b/g10/delkey.c
@@ -201,7 +201,10 @@ do_delete_key( const char *username, int secret, int force, int *r_sec_avail )
firsterr = err;
if (gpg_err_code (err) == GPG_ERR_CANCELED
|| gpg_err_code (err) == GPG_ERR_FULLY_CANCELED)
- break;
+ {
+ write_status_error ("delete_key.secret", err);
+ break;
+ }
}
}
diff --git a/g10/dirmngr-conf.skel b/g10/dirmngr-conf.skel
index d5a02d9..fbb730b 100644
--- a/g10/dirmngr-conf.skel
+++ b/g10/dirmngr-conf.skel
@@ -29,8 +29,8 @@
# Example HKP keyservers:
# hkp://keys.gnupg.net
#
-# Example HKP keyserver using a Tor hidden service
-# hkp://dyh2j3qyrirn43iw.onion
+# Example HKP keyserver using a Tor OnionBalance service
+# hkp://jirk5u4osbsr34t5.onion
#
# Example HKPS keyservers (see --hkp-cacert below):
# hkps://hkps.pool.sks-keyservers.net
@@ -54,7 +54,7 @@
# service, Dirmngr selects the keyserver to use depending on whether
# Tor is locally running or not (on a per session base).
-keyserver hkp://dyh2j3qyrirn43iw.onion
+keyserver hkp://jirk5u4osbsr34t5.onion
keyserver hkp://keys.gnupg.net
# --hkp-cacert FILENAME
diff --git a/g10/encrypt.c b/g10/encrypt.c
index 4432f29..abd8002 100644
--- a/g10/encrypt.c
+++ b/g10/encrypt.c
@@ -326,6 +326,7 @@ encrypt_simple (const char *filename, int mode, int use_seskey)
if (!opt.no_literal)
{
+ /* Note that PT has been initialized above in no_literal mode. */
pt->timestamp = make_timestamp();
pt->mode = opt.textmode? 't' : 'b';
pt->len = filesize;
@@ -500,7 +501,7 @@ encrypt_crypt (ctrl_t ctrl, int filefd, const char *filename,
pk_list = provided_keys;
else
{
- if ((rc = build_pk_list (ctrl, remusr, &pk_list, PUBKEY_USAGE_ENC)))
+ if ((rc = build_pk_list (ctrl, remusr, &pk_list)))
{
release_progress_context (pfx);
return rc;
@@ -847,7 +848,7 @@ encrypt_filter (void *opaque, int control,
}
else if ( control == IOBUFCTRL_DESC )
{
- *(char**)buf = "encrypt_filter";
+ mem2str (buf, "encrypt_filter", *ret_len);
}
return rc;
}
diff --git a/g10/export.c b/g10/export.c
index f7ad1b2..3f06934 100644
--- a/g10/export.c
+++ b/g10/export.c
@@ -1,7 +1,7 @@
/* export.c - Export keys in the OpenPGP defined format.
* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004,
* 2005, 2010 Free Software Foundation, Inc.
- * Copyright (C) 1998-2015 Werner Koch
+ * Copyright (C) 1998-2016 Werner Koch
*
* This file is part of GnuPG.
*
@@ -34,6 +34,8 @@
#include "util.h"
#include "main.h"
#include "i18n.h"
+#include "membuf.h"
+#include "host2net.h"
#include "trustdb.h"
#include "call-agent.h"
@@ -825,6 +827,78 @@ print_status_exported (PKT_public_key *pk)
}
+/*
+ * Receive a secret key from agent specified by HEXGRIP.
+ *
+ * Since the key data from agant is encrypted, decrypt it by CIPHERHD.
+ * Then, parse the decrypted key data in transfer format, and put
+ * secret papameters into PK.
+ *
+ * CACHE_NONCE_ADDR is used to share nonce for multple key retrievals.
+ */
+gpg_error_t
+receive_seckey_from_agent (ctrl_t ctrl, gcry_cipher_hd_t cipherhd,
+ char **cache_nonce_addr, const char *hexgrip,
+ PKT_public_key *pk)
+{
+ gpg_error_t err = 0;
+ unsigned char *wrappedkey = NULL;
+ size_t wrappedkeylen;
+ unsigned char *key = NULL;
+ size_t keylen, realkeylen;
+ gcry_sexp_t s_skey;
+ char *prompt;
+
+ if (opt.verbose)
+ log_info ("key %s: asking agent for the secret parts\n", hexgrip);
+
+ prompt = gpg_format_keydesc (pk, FORMAT_KEYDESC_EXPORT,1);
+ err = agent_export_key (ctrl, hexgrip, prompt, cache_nonce_addr,
+ &wrappedkey, &wrappedkeylen);
+ xfree (prompt);
+
+ if (err)
+ goto unwraperror;
+ if (wrappedkeylen < 24)
+ {
+ err = gpg_error (GPG_ERR_INV_LENGTH);
+ goto unwraperror;
+ }
+ keylen = wrappedkeylen - 8;
+ key = xtrymalloc_secure (keylen);
+ if (!key)
+ {
+ err = gpg_error_from_syserror ();
+ goto unwraperror;
+ }
+ err = gcry_cipher_decrypt (cipherhd, key, keylen, wrappedkey, wrappedkeylen);
+ if (err)
+ goto unwraperror;
+ realkeylen = gcry_sexp_canon_len (key, keylen, NULL, &err);
+ if (!realkeylen)
+ goto unwraperror; /* Invalid csexp. */
+
+ err = gcry_sexp_sscan (&s_skey, NULL, key, realkeylen);
+ if (!err)
+ {
+ err = transfer_format_to_openpgp (s_skey, pk);
+ gcry_sexp_release (s_skey);
+ }
+
+ unwraperror:
+ xfree (key);
+ xfree (wrappedkey);
+ if (err)
+ {
+ log_error ("key %s: error receiving key from agent:"
+ " %s%s\n", hexgrip, gpg_strerror (err),
+ gpg_err_code (err) == GPG_ERR_FULLY_CANCELED?
+ "":_(" - skipped"));
+ }
+ return err;
+}
+
+
/* Export the keys identified by the list of strings in USERS to the
stream OUT. If Secret is false public keys will be exported. With
secret true secret keys will be exported; in this case 1 means the
@@ -1203,83 +1277,24 @@ do_export_stream (ctrl_t ctrl, iobuf_t out, strlist_t users, int secret,
}
else if (!err)
{
- /* FIXME: Move this spaghetti code into a separate
- function. */
- unsigned char *wrappedkey = NULL;
- size_t wrappedkeylen;
- unsigned char *key = NULL;
- size_t keylen, realkeylen;
- gcry_sexp_t s_skey;
-
- if (opt.verbose)
- log_info ("key %s: asking agent for the secret parts\n",
- keystr_with_sub (keyid, subkid));
-
- {
- char *prompt = gpg_format_keydesc (pk,
- FORMAT_KEYDESC_EXPORT,1);
- err = agent_export_key (ctrl, hexgrip, prompt, &cache_nonce,
- &wrappedkey, &wrappedkeylen);
- xfree (prompt);
- }
+ err = receive_seckey_from_agent (ctrl, cipherhd, &cache_nonce,
+ hexgrip, pk);
if (err)
- goto unwraperror;
- if (wrappedkeylen < 24)
{
- err = gpg_error (GPG_ERR_INV_LENGTH);
- goto unwraperror;
- }
- keylen = wrappedkeylen - 8;
- key = xtrymalloc_secure (keylen);
- if (!key)
- {
- err = gpg_error_from_syserror ();
- goto unwraperror;
- }
- err = gcry_cipher_decrypt (cipherhd, key, keylen,
- wrappedkey, wrappedkeylen);
- if (err)
- goto unwraperror;
- realkeylen = gcry_sexp_canon_len (key, keylen, NULL, &err);
- if (!realkeylen)
- goto unwraperror; /* Invalid csexp. */
-
- err = gcry_sexp_sscan (&s_skey, NULL, key, realkeylen);
- xfree (key);
- key = NULL;
- if (err)
- goto unwraperror;
- err = transfer_format_to_openpgp (s_skey, pk);
- gcry_sexp_release (s_skey);
- if (err)
- goto unwraperror;
-
- err = build_packet (out, node->pkt);
- if (!err && node->pkt->pkttype == PKT_PUBLIC_KEY)
- {
- stats->exported++;
- print_status_exported (node->pkt->pkt.public_key);
- }
- goto unwraperror_leave;
-
- unwraperror:
- xfree (wrappedkey);
- xfree (key);
- if (err)
- {
- log_error ("key %s: error receiving key from agent:"
- " %s%s\n",
- keystr_with_sub (keyid, subkid),
- gpg_strerror (err),
- gpg_err_code (err) == GPG_ERR_FULLY_CANCELED?
- "":_(" - skipped"));
if (gpg_err_code (err) == GPG_ERR_FULLY_CANCELED)
goto leave;
skip_until_subkey = 1;
err = 0;
}
- unwraperror_leave:
- ;
+ else
+ {
+ err = build_packet (out, node->pkt);
+ if (node->pkt->pkttype == PKT_PUBLIC_KEY)
+ {
+ stats->exported++;
+ print_status_exported (node->pkt->pkt.public_key);
+ }
+ }
}
else
{
@@ -1337,3 +1352,301 @@ do_export_stream (ctrl_t ctrl, iobuf_t out, strlist_t users, int secret,
log_info(_("WARNING: nothing exported\n"));
return err;
}
+
+
+
+
+static gpg_error_t
+key_to_sshblob (membuf_t *mb, const char *identifier, ...)
+{
+ va_list arg_ptr;
+ gpg_error_t err = 0;
+ unsigned char nbuf[4];
+ unsigned char *buf;
+ size_t buflen;
+ gcry_mpi_t a;
+
+ ulongtobuf (nbuf, (ulong)strlen (identifier));
+ put_membuf (mb, nbuf, 4);
+ put_membuf_str (mb, identifier);
+ if (!strncmp (identifier, "ecdsa-sha2-", 11))
+ {
+ ulongtobuf (nbuf, (ulong)strlen (identifier+11));
+ put_membuf (mb, nbuf, 4);
+ put_membuf_str (mb, identifier+11);
+ }
+ va_start (arg_ptr, identifier);
+ while ((a = va_arg (arg_ptr, gcry_mpi_t)))
+ {
+ err = gcry_mpi_aprint (GCRYMPI_FMT_SSH, &buf, &buflen, a);
+ if (err)
+ break;
+ if (!strcmp (identifier, "ssh-ed25519")
+ && buflen > 5 && buf[4] == 0x40)
+ {
+ /* We need to strip our 0x40 prefix. */
+ put_membuf (mb, "\x00\x00\x00\x20", 4);
+ put_membuf (mb, buf+5, buflen-5);
+ }
+ else
+ put_membuf (mb, buf, buflen);
+ gcry_free (buf);
+ }
+ va_end (arg_ptr);
+ return err;
+}
+
+/* Export the key identified by USERID in the SSH public key format.
+ The function exports the latest subkey with Authentication
+ capability unless the '!' suffix is used to export a specific
+ key. */
+gpg_error_t
+export_ssh_key (ctrl_t ctrl, const char *userid)
+{
+ gpg_error_t err;
+ kbnode_t keyblock = NULL;
+ KEYDB_SEARCH_DESC desc;
+ u32 latest_date;
+ u32 curtime = make_timestamp ();
+ kbnode_t latest_key, node;
+ PKT_public_key *pk;
+ const char *identifier;
+ membuf_t mb;
+ estream_t fp = NULL;
+ struct b64state b64_state;
+ const char *fname = "-";
+
+ init_membuf (&mb, 4096);
+
+ /* We need to know whether the key has been specified using the
+ exact syntax ('!' suffix). Thus we need to run a
+ classify_user_id on our own. */
+ err = classify_user_id (userid, &desc, 1);
+
+ /* Get the public key. */
+ if (!err)
+ {
+ getkey_ctx_t getkeyctx;
+
+ err = get_pubkey_byname (ctrl, &getkeyctx, NULL, userid, &keyblock,
+ NULL,
+ 0 /* Only usable keys or given exact. */,
+ 1 /* No AKL lookup. */);
+ if (!err)
+ {
+ err = getkey_next (getkeyctx, NULL, NULL);
+ if (!err)
+ err = gpg_error (GPG_ERR_AMBIGUOUS_NAME);
+ else if (gpg_err_code (err) == GPG_ERR_NO_PUBKEY)
+ err = 0;
+ }
+ getkey_end (getkeyctx);
+ }
+ if (err)
+ {
+ log_error (_("key \"%s\" not found: %s\n"), userid, gpg_strerror (err));
+ return err;
+ }
+
+ /* The finish_lookup code in getkey.c does not handle auth keys,
+ thus we have to duplicate the code here to find the latest
+ subkey. However, if the key has been found using an exact match
+ ('!' notation) we use that key without any further checks and
+ even allow the use of the primary key. */
+ latest_date = 0;
+ latest_key = NULL;
+ for (node = keyblock; node; node = node->next)
+ {
+ if ((node->pkt->pkttype == PKT_PUBLIC_SUBKEY
+ || node->pkt->pkttype == PKT_PUBLIC_KEY)
+ && node->pkt->pkt.public_key->flags.exact)
+ {
+ latest_key = node;
+ break;
+ }
+ }
+ if (!latest_key)
+ {
+ for (node = keyblock; node; node = node->next)
+ {
+ if (node->pkt->pkttype != PKT_PUBLIC_SUBKEY)
+ continue;
+
+ pk = node->pkt->pkt.public_key;
+ if (DBG_LOOKUP)
+ log_debug ("\tchecking subkey %08lX\n",
+ (ulong) keyid_from_pk (pk, NULL));
+ if (!(pk->pubkey_usage & PUBKEY_USAGE_AUTH))
+ {
+ if (DBG_LOOKUP)
+ log_debug ("\tsubkey not usable for authentication\n");
+ continue;
+ }
+ if (!pk->flags.valid)
+ {
+ if (DBG_LOOKUP)
+ log_debug ("\tsubkey not valid\n");
+ continue;
+ }
+ if (pk->flags.revoked)
+ {
+ if (DBG_LOOKUP)
+ log_debug ("\tsubkey has been revoked\n");
+ continue;
+ }
+ if (pk->has_expired)
+ {
+ if (DBG_LOOKUP)
+ log_debug ("\tsubkey has expired\n");
+ continue;
+ }
+ if (pk->timestamp > curtime && !opt.ignore_valid_from)
+ {
+ if (DBG_LOOKUP)
+ log_debug ("\tsubkey not yet valid\n");
+ continue;
+ }
+ if (DBG_LOOKUP)
+ log_debug ("\tsubkey might be fine\n");
+ /* In case a key has a timestamp of 0 set, we make sure that it
+ is used. A better change would be to compare ">=" but that
+ might also change the selected keys and is as such a more
+ intrusive change. */
+ if (pk->timestamp > latest_date || (!pk->timestamp && !latest_date))
+ {
+ latest_date = pk->timestamp;
+ latest_key = node;
+ }
+ }
+ }
+
+ if (!latest_key)
+ {
+ err = gpg_error (GPG_ERR_UNUSABLE_PUBKEY);
+ log_error (_("key \"%s\" not found: %s\n"), userid, gpg_strerror (err));
+ goto leave;
+ }
+
+ pk = latest_key->pkt->pkt.public_key;
+ if (DBG_LOOKUP)
+ log_debug ("\tusing key %08lX\n", (ulong) keyid_from_pk (pk, NULL));
+
+ switch (pk->pubkey_algo)
+ {
+ case PUBKEY_ALGO_DSA:
+ identifier = "ssh-dss";
+ err = key_to_sshblob (&mb, identifier,
+ pk->pkey[0], pk->pkey[1], pk->pkey[2], pk->pkey[3],
+ NULL);
+ break;
+
+ case PUBKEY_ALGO_RSA:
+ case PUBKEY_ALGO_RSA_S:
+ identifier = "ssh-rsa";
+ err = key_to_sshblob (&mb, identifier, pk->pkey[1], pk->pkey[0], NULL);
+ break;
+
+ case PUBKEY_ALGO_ECDSA:
+ {
+ char *curveoid;
+ const char *curve;
+
+ curveoid = openpgp_oid_to_str (pk->pkey[0]);
+ if (!curveoid)
+ err = gpg_error_from_syserror ();
+ else if (!(curve = openpgp_oid_to_curve (curveoid, 0)))
+ err = gpg_error (GPG_ERR_UNKNOWN_CURVE);
+ else
+ {
+ if (!strcmp (curve, "nistp256"))
+ identifier = "ecdsa-sha2-nistp256";
+ else if (!strcmp (curve, "nistp384"))
+ identifier = "ecdsa-sha2-nistp384";
+ else if (!strcmp (curve, "nistp521"))
+ identifier = "ecdsa-sha2-nistp521";
+ else
+ identifier = NULL;
+
+ if (!identifier)
+ err = gpg_error (GPG_ERR_UNKNOWN_CURVE);
+ else
+ err = key_to_sshblob (&mb, identifier, pk->pkey[1], NULL);
+ }
+ xfree (curveoid);
+ }
+ break;
+
+ case PUBKEY_ALGO_EDDSA:
+ if (!openpgp_oid_is_ed25519 (pk->pkey[0]))
+ err = gpg_error (GPG_ERR_UNKNOWN_CURVE);
+ else
+ {
+ identifier = "ssh-ed25519";
+ err = key_to_sshblob (&mb, identifier, pk->pkey[1], NULL);
+ }
+ break;
+
+ case PUBKEY_ALGO_ELGAMAL_E:
+ case PUBKEY_ALGO_ELGAMAL:
+ err = gpg_error (GPG_ERR_UNUSABLE_PUBKEY);
+ break;
+
+ default:
+ err = GPG_ERR_PUBKEY_ALGO;
+ break;
+ }
+
+ if (err)
+ goto leave;
+
+ if (opt.outfile && *opt.outfile && strcmp (opt.outfile, "-"))
+ fp = es_fopen ((fname = opt.outfile), "w");
+ else
+ fp = es_stdout;
+ if (!fp)
+ {
+ err = gpg_error_from_syserror ();
+ log_error (_("error creating '%s': %s\n"), fname, gpg_strerror (err));
+ goto leave;
+ }
+
+ es_fprintf (fp, "%s ", identifier);
+ err = b64enc_start_es (&b64_state, fp, "");
+ if (err)
+ goto leave;
+ {
+ void *blob;
+ size_t bloblen;
+
+ blob = get_membuf (&mb, &bloblen);
+ if (!blob)
+ err = gpg_error_from_syserror ();
+ else
+ err = b64enc_write (&b64_state, blob, bloblen);
+ xfree (blob);
+ if (err)
+ goto leave;
+ }
+ err = b64enc_finish (&b64_state);
+ if (err)
+ goto leave;
+ es_fprintf (fp, " openpgp:0x%08lX\n", (ulong)keyid_from_pk (pk, NULL));
+
+ if (es_ferror (fp))
+ err = gpg_error_from_syserror ();
+ else
+ {
+ if (es_fclose (fp))
+ err = gpg_error_from_syserror ();
+ fp = NULL;
+ }
+
+ if (err)
+ log_error (_("error writing '%s': %s\n"), fname, gpg_strerror (err));
+
+ leave:
+ es_fclose (fp);
+ xfree (get_membuf (&mb, NULL));
+ release_kbnode (keyblock);
+ return err;
+}
diff --git a/g10/getkey.c b/g10/getkey.c
index b09d967..74fa753 100644
--- a/g10/getkey.c
+++ b/g10/getkey.c
@@ -155,7 +155,18 @@ print_stats ()
#endif
-/* For documentation see keydb.h. */
+/* Cache a copy of a public key in the public key cache. PK is not
+ * cached if caching is disabled (via getkey_disable_caches), if
+ * PK->FLAGS.DONT_CACHE is set, we don't know how to derive a key id
+ * from the public key (e.g., unsupported algorithm), or a key with
+ * the key id is already in the cache.
+ *
+ * The public key packet is copied into the cache using
+ * copy_public_key. Thus, any secret parts are not copied, for
+ * instance.
+ *
+ * This cache is filled by get_pubkey and is read by get_pubkey and
+ * get_pubkey_fast. */
void
cache_public_key (PKT_public_key * pk)
{
@@ -196,7 +207,7 @@ cache_public_key (PKT_public_key * pk)
/* Remove the last 50% of the entries. */
for (ce = pk_cache, n = 0; ce && n < pk_cache_entries/2; n++)
ce = ce->next;
- if (ce != pk_cache && ce->next)
+ if (ce && ce != pk_cache && ce->next)
{
ce2 = ce->next;
ce->next = NULL;
@@ -300,7 +311,8 @@ cache_user_id (KBNODE keyblock)
/* First check for duplicates. */
for (r = user_id_db; r; r = r->next)
{
- keyid_list_t b = r->keyids;
+ keyid_list_t b;
+
for (b = r->keyids; b; b = b->next)
{
if (!memcmp (b->fpr, a->fpr, MAX_FINGERPRINT_LEN))
@@ -343,7 +355,9 @@ cache_user_id (KBNODE keyblock)
}
-/* For documentation see keydb.h. */
+/* Disable and drop the public key cache (which is filled by
+ cache_public_key and get_pubkey). Note: there is currently no way
+ to reenable this cache. */
void
getkey_disable_caches ()
{
@@ -366,6 +380,277 @@ getkey_disable_caches ()
}
+void
+pubkey_free (pubkey_t key)
+{
+ if (key)
+ {
+ xfree (key->pk);
+ release_kbnode (key->keyblock);
+ xfree (key);
+ }
+}
+
+void
+pubkeys_free (pubkey_t keys)
+{
+ while (keys)
+ {
+ pubkey_t next = keys->next;
+ pubkey_free (keys);
+ keys = next;
+ }
+}
+
+/* Returns all keys that match the search specfication SEARCH_TERMS.
+
+ This function also checks for and warns about duplicate entries in
+ the keydb, which can occur if the user has configured multiple
+ keyrings or keyboxes or if a keyring or keybox was corrupted.
+
+ Note: SEARCH_TERMS will not be expanded (i.e., it may not be a
+ group).
+
+ USE is the operation for which the key is required. It must be
+ either PUBKEY_USAGE_ENC, PUBKEY_USAGE_SIG, PUBKEY_USAGE_CERT or
+ PUBKEY_USAGE_AUTH.
+
+ XXX: Currently, only PUBKEY_USAGE_ENC and PUBKEY_USAGE_SIG are
+ implemented.
+
+ INCLUDE_UNUSABLE indicates whether disabled keys are allowed.
+ (Recipients specified with --encrypt-to and --hidden-encrypt-to may
+ be disabled. It is possible to edit disabled keys.)
+
+ SOURCE is the context in which SEARCH_TERMS was specified, e.g.,
+ "--encrypt-to", etc. If this function is called interactively,
+ then this should be NULL.
+
+ If WARN_POSSIBLY_AMBIGUOUS is set, then emits a warning if the user
+ does not specify a long key id or a fingerprint.
+
+ The results are placed in *KEYS. *KEYS must be NULL! */
+gpg_error_t
+get_pubkeys (ctrl_t ctrl,
+ char *search_terms, int use, int include_unusable, char *source,
+ int warn_possibly_ambiguous,
+ pubkey_t *r_keys)
+{
+ /* We show a warning when a key appears multiple times in the DB.
+ This can happen for two reasons:
+
+ - The user has configured multiple keyrings or keyboxes.
+
+ - The keyring or keybox has been corrupted in some way, e.g., a
+ bug or a random process changing them.
+
+ For each duplicate, we only want to show the key once. Hence,
+ this list. */
+ static strlist_t key_dups;
+
+ /* USE transformed to a string. */
+ char *use_str;
+
+ gpg_error_t err;
+
+ KEYDB_SEARCH_DESC desc;
+
+ GETKEY_CTX ctx;
+ pubkey_t results = NULL;
+ pubkey_t r;
+
+ int count;
+
+ char fingerprint[2 * MAX_FINGERPRINT_LEN + 1];
+
+ if (DBG_LOOKUP)
+ {
+ log_debug ("\n");
+ log_debug ("%s: Checking %s=%s\n",
+ __func__, source ? source : "user input", search_terms);
+ }
+
+ if (*r_keys)
+ log_bug ("%s: KEYS should be NULL!\n", __func__);
+
+ switch (use)
+ {
+ case PUBKEY_USAGE_ENC: use_str = "encrypt"; break;
+ case PUBKEY_USAGE_SIG: use_str = "sign"; break;
+ case PUBKEY_USAGE_CERT: use_str = "cetify"; break;
+ case PUBKEY_USAGE_AUTH: use_str = "authentication"; break;
+ default: log_bug ("%s: Bad value for USE (%d)\n", __func__, use);
+ }
+
+ if (use == PUBKEY_USAGE_CERT || use == PUBKEY_USAGE_AUTH)
+ log_bug ("%s: use=%s is unimplemented.\n", __func__, use_str);
+
+ err = classify_user_id (search_terms, &desc, 1);
+ if (err)
+ {
+ log_info (_("key \"%s\" not found: %s\n"),
+ search_terms, gpg_strerror (err));
+ if (!opt.quiet && source)
+ log_info (_("(check argument of option '%s')\n"), source);
+ goto out;
+ }
+
+ if (warn_possibly_ambiguous
+ && ! (desc.mode == KEYDB_SEARCH_MODE_LONG_KID
+ || desc.mode == KEYDB_SEARCH_MODE_FPR16
+ || desc.mode == KEYDB_SEARCH_MODE_FPR20
+ || desc.mode == KEYDB_SEARCH_MODE_FPR))
+ {
+ log_info (_("Warning: '%s' should be a long key ID or a fingerprint\n"),
+ search_terms);
+ if (!opt.quiet && source)
+ log_info (_("(check argument of option '%s')\n"), source);
+ }
+
+ /* Gather all of the results. */
+ ctx = NULL;
+ count = 0;
+ do
+ {
+ PKT_public_key *pk = xmalloc_clear (sizeof *pk);
+ KBNODE kb;
+ pk->req_usage = use;
+
+ if (! ctx)
+ err = get_pubkey_byname (ctrl, &ctx, pk, search_terms, &kb, NULL,
+ include_unusable, 1);
+ else
+ err = getkey_next (ctx, pk, &kb);
+
+ if (gpg_err_code (err) == GPG_ERR_NOT_FOUND)
+ /* No more results. */
+ {
+ xfree (pk);
+ break;
+ }
+ else if (err)
+ /* An error (other than "not found"). */
+ {
+ log_error (_("error looking up: %s\n"),
+ gpg_strerror (err));
+ xfree (pk);
+ break;
+ }
+
+ /* Another result! */
+ count ++;
+
+ r = xmalloc_clear (sizeof (*r));
+ r->pk = pk;
+ r->keyblock = kb;
+ r->next = results;
+ results = r;
+ }
+ while (ctx);
+ getkey_end (ctx);
+
+ if (DBG_LOOKUP)
+ {
+ log_debug ("%s resulted in %d matches.\n", search_terms, count);
+ for (r = results; r; r = r->next)
+ log_debug (" %s\n",
+ hexfingerprint (r->keyblock->pkt->pkt.public_key,
+ fingerprint, sizeof (fingerprint)));
+ }
+
+ if (! results && gpg_err_code (err) == GPG_ERR_NOT_FOUND)
+ /* No match. */
+ {
+ if (DBG_LOOKUP)
+ log_debug ("%s: '%s' not found.\n", __func__, search_terms);
+
+ log_info (_("key \"%s\" not found\n"), search_terms);
+ if (!opt.quiet && source)
+ log_info (_("(check argument of option '%s')\n"), source);
+
+ goto out;
+ }
+ else if (gpg_err_code (err) == GPG_ERR_NOT_FOUND)
+ /* No more matches. */
+ ;
+ else if (err)
+ /* Some other error. An error message was already printed
+ out. Free RESULTS and continue. */
+ goto out;
+
+ /* Check for duplicates. */
+ if (DBG_LOOKUP)
+ log_debug ("%s: Checking results of %s='%s' for dups\n",
+ __func__, source ? source : "user input", search_terms);
+ count = 0;
+ for (r = results; r; r = r->next)
+ {
+ pubkey_t *prevp;
+ pubkey_t next;
+ pubkey_t r2;
+ int dups = 0;
+
+ prevp = &r->next;
+ next = r->next;
+ while ((r2 = next))
+ {
+ if (cmp_public_keys (r->keyblock->pkt->pkt.public_key,
+ r2->keyblock->pkt->pkt.public_key) != 0)
+ /* Not a dup. */
+ {
+ prevp = &r2->next;
+ next = r2->next;
+ continue;
+ }
+
+ dups ++;
+ count ++;
+
+ /* Remove R2 from the list. */
+ *prevp = r2->next;
+ release_kbnode (r2->keyblock);
+ next = r2->next;
+ xfree (r2);
+ }
+
+ if (dups)
+ {
+ hexfingerprint (r->keyblock->pkt->pkt.public_key,
+ fingerprint, sizeof fingerprint);
+ if (! strlist_find (key_dups, fingerprint))
+ {
+ char fingerprint_formatted[MAX_FORMATTED_FINGERPRINT_LEN + 1];
+
+ log_info (_("Warning: %s appears in the keyring %d times\n"),
+ format_hexfingerprint (fingerprint,
+ fingerprint_formatted,
+ sizeof fingerprint_formatted),
+ 1 + dups);
+ add_to_strlist (&key_dups, fingerprint);
+ }
+ }
+ }
+
+ if (DBG_LOOKUP && count)
+ {
+ log_debug ("After removing %d dups:\n", count);
+ for (r = results, count = 0; r; r = r->next)
+ log_debug (" %d: %s\n",
+ count,
+ hexfingerprint (r->keyblock->pkt->pkt.public_key,
+ fingerprint, sizeof fingerprint));
+ }
+
+ out:
+ if (err)
+ pubkeys_free (results);
+ else
+ *r_keys = results;
+
+ return err;
+}
+
+
static void
pk_from_block (GETKEY_CTX ctx, PKT_public_key * pk, KBNODE keyblock,
KBNODE found_key)
@@ -381,7 +666,27 @@ pk_from_block (GETKEY_CTX ctx, PKT_public_key * pk, KBNODE keyblock,
}
-/* For documentation see keydb.h. */
+/* Return the public key with the key id KEYID and store it at PK.
+ * The resources in *PK should be released using
+ * release_public_key_parts(). This function also stores a copy of
+ * the public key in the user id cache (see cache_public_key).
+ *
+ * If PK is NULL, this function just stores the public key in the
+ * cache and returns the usual return code.
+ *
+ * PK->REQ_USAGE (which is a mask of PUBKEY_USAGE_SIG,
+ * PUBKEY_USAGE_ENC and PUBKEY_USAGE_CERT) is passed through to the
+ * lookup function. If this is non-zero, only keys with the specified
+ * usage will be returned. As such, it is essential that
+ * PK->REQ_USAGE be correctly initialized!
+ *
+ * Returns 0 on success, GPG_ERR_NO_PUBKEY if there is no public key
+ * with the specified key id, or another error code if an error
+ * occurs.
+ *
+ * If the data was not read from the cache, then the self-signed data
+ * has definitely been merged into the public key using
+ * merge_selfsigs. */
int
get_pubkey (PKT_public_key * pk, u32 * keyid)
{
@@ -456,7 +761,16 @@ leave:
}
-/* For documentation see keydb.h. */
+/* Similar to get_pubkey, but it does not take PK->REQ_USAGE into
+ * account nor does it merge in the self-signed data. This function
+ * also only considers primary keys. It is intended to be used as a
+ * quick check of the key to avoid recursion. It should only be used
+ * in very certain cases. Like get_pubkey and unlike any of the other
+ * lookup functions, this function also consults the user id cache
+ * (see cache_public_key).
+ *
+ * Return the public key in *PK. The resources in *PK should be
+ * released using release_public_key_parts(). */
int
get_pubkey_fast (PKT_public_key * pk, u32 * keyid)
{
@@ -523,8 +837,12 @@ get_pubkey_fast (PKT_public_key * pk, u32 * keyid)
}
-/* For documentation see keydb.h. */
-KBNODE
+/* Return the key block for the key with key id KEYID or NULL, if an
+ * error occurs. Use release_kbnode() to release the key block.
+ *
+ * The self-signed data has already been merged into the public key
+ * using merge_selfsigs. */
+kbnode_t
get_pubkeyblock (u32 * keyid)
{
struct getkey_ctx_s ctx;
@@ -548,7 +866,23 @@ get_pubkeyblock (u32 * keyid)
}
-/* For documentation see keydb.h. */
+/* Return the public key with the key id KEYID iff the secret key is
+ * available and store it at PK. The resources should be released
+ * using release_public_key_parts().
+ *
+ * Unlike other lookup functions, PK may not be NULL. PK->REQ_USAGE
+ * is passed through to the lookup function and is a mask of
+ * PUBKEY_USAGE_SIG, PUBKEY_USAGE_ENC and PUBKEY_USAGE_CERT. Thus, it
+ * must be valid! If this is non-zero, only keys with the specified
+ * usage will be returned.
+ *
+ * Returns 0 on success. If a public key with the specified key id is
+ * not found or a secret key is not available for that public key, an
+ * error code is returned. Note: this function ignores legacy keys.
+ * An error code is also return if an error occurs.
+ *
+ * The self-signed data has already been merged into the public key
+ * using merge_selfsigs. */
gpg_error_t
get_seckey (PKT_public_key *pk, u32 *keyid)
{
@@ -798,7 +1132,56 @@ key_byname (GETKEY_CTX *retctx, strlist_t namelist,
}
-/* For documentation see keydb.h. */
+/* Find a public key identified by NAME.
+ *
+ * If name appears to be a valid valid RFC822 mailbox (i.e., email
+ * address) and auto key lookup is enabled (no_akl == 0), then the
+ * specified auto key lookup methods (--auto-key-lookup) are used to
+ * import the key into the local keyring. Otherwise, just the local
+ * keyring is consulted.
+ *
+ * If RETCTX is not NULL, then the constructed context is returned in
+ * *RETCTX so that getpubkey_next can be used to get subsequent
+ * results. In this case, getkey_end() must be used to free the
+ * search context. If RETCTX is not NULL, then RET_KDBHD must be
+ * NULL.
+ *
+ * If PK is not NULL, the public key of the first result is returned
+ * in *PK. Note: PK->REQ_USAGE must be valid!!! PK->REQ_USAGE is
+ * passed through to the lookup function and is a mask of
+ * PUBKEY_USAGE_SIG, PUBKEY_USAGE_ENC and PUBKEY_USAGE_CERT. If this
+ * is non-zero, only keys with the specified usage will be returned.
+ * Note: The self-signed data has already been merged into the public
+ * key using merge_selfsigs. Free *PK by calling
+ * release_public_key_parts (or, if PK was allocated using xfree, you
+ * can use free_public_key, which calls release_public_key_parts(PK)
+ * and then xfree(PK)).
+ *
+ * NAME is a string, which is turned into a search query using
+ * classify_user_id.
+ *
+ * If RET_KEYBLOCK is not NULL, the keyblock is returned in
+ * *RET_KEYBLOCK. This should be freed using release_kbnode().
+ *
+ * If RET_KDBHD is not NULL, then the new database handle used to
+ * conduct the search is returned in *RET_KDBHD. This can be used to
+ * get subsequent results using keydb_search_next or to modify the
+ * returned record. Note: in this case, no advanced filtering is done
+ * for subsequent results (e.g., PK->REQ_USAGE is not respected).
+ * Unlike RETCTX, this is always returned.
+ *
+ * If INCLUDE_UNUSABLE is set, then unusable keys (see the
+ * documentation for skip_unusable for an exact definition) are
+ * skipped unless they are looked up by key id or by fingerprint.
+ *
+ * If NO_AKL is set, then the auto key locate functionality is
+ * disabled and only the local key ring is considered. Note: the
+ * local key ring is consulted even if local is not in the
+ * --auto-key-locate option list!
+ *
+ * This function returns 0 on success. Otherwise, an error code is
+ * returned. In particular, GPG_ERR_NO_PUBKEY or GPG_ERR_NO_SECKEY
+ * (if want_secret is set) is returned if the key is not found. */
int
get_pubkey_byname (ctrl_t ctrl, GETKEY_CTX * retctx, PKT_public_key * pk,
const char *name, KBNODE * ret_keyblock,
@@ -950,9 +1333,9 @@ get_pubkey_byname (ctrl_t ctrl, GETKEY_CTX * retctx, PKT_public_key * pk,
mailbox for the getname search, but it helps cut down
on the problem of searching for something like "john"
and getting a whole lot of keys back. */
- if (opt.keyserver)
+ if (keyserver_any_configured (ctrl))
{
- mechanism = opt.keyserver->uri;
+ mechanism = "keyserver";
glo_ctrl.in_auto_key_retrieve++;
rc = keyserver_import_name (ctrl, name, &fpr, &fpr_len,
opt.keyserver);
@@ -1062,11 +1445,34 @@ get_pubkey_byname (ctrl_t ctrl, GETKEY_CTX * retctx, PKT_public_key * pk,
}
-/* For documentation see keydb.h.
-
- FIXME: We should replace this with the _byname function. This can
- be done by creating a userID conforming to the unified fingerprint
- style. */
+/* Lookup a key with the specified fingerprint.
+ *
+ * If PK is not NULL, the public key of the first result is returned
+ * in *PK. Note: this function does an exact search and thus the
+ * returned public key may be a subkey rather than the primary key.
+ * Note: The self-signed data has already been merged into the public
+ * key using merge_selfsigs. Free *PK by calling
+ * release_public_key_parts (or, if PK was allocated using xfree, you
+ * can use free_public_key, which calls release_public_key_parts(PK)
+ * and then xfree(PK)).
+ *
+ * If PK->REQ_USAGE is set, it is used to filter the search results.
+ * (Thus, if PK is not NULL, PK->REQ_USAGE must be valid!!!) See the
+ * documentation for finish_lookup to understand exactly how this is
+ * used.
+ *
+ * If R_KEYBLOCK is not NULL, then the first result's keyblock is
+ * returned in *R_KEYBLOCK. This should be freed using
+ * release_kbnode().
+ *
+ * FPRINT is a byte array whose contents is the fingerprint to use as
+ * the search term. FPRINT_LEN specifies the length of the
+ * fingerprint (in bytes). Currently, only 16 and 20-byte
+ * fingerprints are supported.
+ *
+ * FIXME: We should replace this with the _byname function. This can
+ * be done by creating a userID conforming to the unified fingerprint
+ * style. */
int
get_pubkey_byfprint (PKT_public_key *pk, kbnode_t *r_keyblock,
const byte * fprint, size_t fprint_len)
@@ -1110,7 +1516,16 @@ get_pubkey_byfprint (PKT_public_key *pk, kbnode_t *r_keyblock,
}
-/* For documentation see keydb.h. */
+/* This function is similar to get_pubkey_byfprint, but it doesn't
+ * merge the self-signed data into the public key and subkeys or into
+ * the user ids. It also doesn't add the key to the user id cache.
+ * Further, this function ignores PK->REQ_USAGE.
+ *
+ * This function is intended to avoid recursion and, as such, should
+ * only be used in very specific situations.
+ *
+ * Like get_pubkey_byfprint, PK may be NULL. In that case, this
+ * function effectively just checks for the existence of the key. */
int
get_pubkey_byfprint_fast (PKT_public_key * pk,
const byte * fprint, size_t fprint_len)
@@ -1168,6 +1583,7 @@ parse_def_secret_key (ctrl_t ctrl)
gpg_error_t err;
KEYDB_SEARCH_DESC desc;
KBNODE kb;
+ KBNODE node;
err = classify_user_id (t->d, &desc, 1);
if (err)
@@ -1208,16 +1624,71 @@ parse_def_secret_key (ctrl_t ctrl)
continue;
}
- err = agent_probe_secret_key (ctrl, kb->pkt->pkt.public_key);
+ merge_selfsigs (kb);
+
+ err = gpg_error (GPG_ERR_NO_SECKEY);
+ node = kb;
+ do
+ {
+ PKT_public_key *pk = node->pkt->pkt.public_key;
+
+ /* Check that the key has the signing capability. */
+ if (! (pk->pubkey_usage & PUBKEY_USAGE_SIG))
+ continue;
+
+ /* Check if the key is valid. */
+ if (pk->flags.revoked)
+ {
+ if (DBG_LOOKUP)
+ log_debug ("not using %s as default key, %s",
+ keystr_from_pk (pk), "revoked");
+ continue;
+ }
+ if (pk->has_expired)
+ {
+ if (DBG_LOOKUP)
+ log_debug ("not using %s as default key, %s",
+ keystr_from_pk (pk), "expired");
+ continue;
+ }
+ if (pk_is_disabled (pk))
+ {
+ if (DBG_LOOKUP)
+ log_debug ("not using %s as default key, %s",
+ keystr_from_pk (pk), "disabled");
+ continue;
+ }
+
+ err = agent_probe_secret_key (ctrl, pk);
+ if (! err)
+ /* This is a valid key. */
+ break;
+ }
+ while ((node = find_next_kbnode (node, PKT_PUBLIC_SUBKEY)));
+
release_kbnode (kb);
- if (! err)
+ if (err)
+ {
+ if (! warned && ! opt.quiet)
+ {
+ log_info (_("Warning: not using '%s' as default key: %s\n"),
+ t->d, gpg_strerror (GPG_ERR_NO_SECKEY));
+ print_reported_error (err, GPG_ERR_NO_SECKEY);
+ }
+ }
+ else
{
if (! warned)
- log_info (_("using \"%s\" as default secret key\n"), t->d);
+ log_info (_("using \"%s\" as default secret key for signing\n"),
+ t->d);
break;
}
}
+ if (! warned && opt.def_secret_key && ! t)
+ log_info (_("all values passed to '%s' ignored\n"),
+ "--default-key");
+
warned = 1;
if (hd)
@@ -1228,7 +1699,30 @@ parse_def_secret_key (ctrl_t ctrl)
return NULL;
}
-/* For documentation see keydb.h. */
+
+/* Look up a secret key.
+ *
+ * If PK is not NULL, the public key of the first result is returned
+ * in *PK. Note: PK->REQ_USAGE must be valid!!! If PK->REQ_USAGE is
+ * set, it is used to filter the search results. See the
+ * documentation for finish_lookup to understand exactly how this is
+ * used. Note: The self-signed data has already been merged into the
+ * public key using merge_selfsigs. Free *PK by calling
+ * release_public_key_parts (or, if PK was allocated using xfree, you
+ * can use free_public_key, which calls release_public_key_parts(PK)
+ * and then xfree(PK)).
+ *
+ * If --default-key was set, then the specified key is looked up. (In
+ * this case, the default key is returned even if it is considered
+ * unusable. See the documentation for skip_unusable for exactly what
+ * this means.)
+ *
+ * Otherwise, this initiates a DB scan that returns all keys that are
+ * usable (see previous paragraph for exactly what usable means) and
+ * for which a secret key is available.
+ *
+ * This function returns the first match. Additional results can be
+ * returned using getkey_next. */
gpg_error_t
get_seckey_default (ctrl_t ctrl, PKT_public_key *pk)
{
@@ -1249,8 +1743,44 @@ get_seckey_default (ctrl_t ctrl, PKT_public_key *pk)
return err;
}
+
+
-/* For documentation see keydb.h. */
+/* Search for keys matching some criteria.
+ *
+ * If RETCTX is not NULL, then the constructed context is returned in
+ * *RETCTX so that getpubkey_next can be used to get subsequent
+ * results. In this case, getkey_end() must be used to free the
+ * search context. If RETCTX is not NULL, then RET_KDBHD must be
+ * NULL.
+ *
+ * If PK is not NULL, the public key of the first result is returned
+ * in *PK. Note: PK->REQ_USAGE must be valid!!! If PK->REQ_USAGE is
+ * set, it is used to filter the search results. See the
+ * documentation for finish_lookup to understand exactly how this is
+ * used. Note: The self-signed data has already been merged into the
+ * public key using merge_selfsigs. Free *PK by calling
+ * release_public_key_parts (or, if PK was allocated using xfree, you
+ * can use free_public_key, which calls release_public_key_parts(PK)
+ * and then xfree(PK)).
+ *
+ * If NAMES is not NULL, then a search query is constructed using
+ * classify_user_id on each of the strings in the list. (Recall: the
+ * database does an OR of the terms, not an AND.) If NAMES is
+ * NULL, then all results are returned.
+ *
+ * If WANT_SECRET is set, then only keys with an available secret key
+ * (either locally or via key registered on a smartcard) are returned.
+ *
+ * This function does not skip unusable keys (see the documentation
+ * for skip_unusable for an exact definition).
+ *
+ * If RET_KEYBLOCK is not NULL, the keyblock is returned in
+ * *RET_KEYBLOCK. This should be freed using release_kbnode().
+ *
+ * This function returns 0 on success. Otherwise, an error code is
+ * returned. In particular, GPG_ERR_NO_PUBKEY or GPG_ERR_NO_SECKEY
+ * (if want_secret is set) is returned if the key is not found. */
gpg_error_t
getkey_bynames (getkey_ctx_t *retctx, PKT_public_key *pk,
strlist_t names, int want_secret, kbnode_t *ret_keyblock)
@@ -1260,7 +1790,46 @@ getkey_bynames (getkey_ctx_t *retctx, PKT_public_key *pk,
}
-/* For documentation see keydb.h. */
+/* Search for one key matching some criteria.
+ *
+ * If RETCTX is not NULL, then the constructed context is returned in
+ * *RETCTX so that getpubkey_next can be used to get subsequent
+ * results. In this case, getkey_end() must be used to free the
+ * search context. If RETCTX is not NULL, then RET_KDBHD must be
+ * NULL.
+ *
+ * If PK is not NULL, the public key of the first result is returned
+ * in *PK. Note: PK->REQ_USAGE must be valid!!! If PK->REQ_USAGE is
+ * set, it is used to filter the search results. See the
+ * documentation for finish_lookup to understand exactly how this is
+ * used. Note: The self-signed data has already been merged into the
+ * public key using merge_selfsigs. Free *PK by calling
+ * release_public_key_parts (or, if PK was allocated using xfree, you
+ * can use free_public_key, which calls release_public_key_parts(PK)
+ * and then xfree(PK)).
+ *
+ * If NAME is not NULL, then a search query is constructed using
+ * classify_user_id on the string. In this case, even unusable keys
+ * (see the documentation for skip_unusable for an exact definition of
+ * unusable) are returned. Otherwise, if --default-key was set, then
+ * that key is returned (even if it is unusable). If neither of these
+ * conditions holds, then the first usable key is returned.
+ *
+ * If WANT_SECRET is set, then only keys with an available secret key
+ * (either locally or via key registered on a smartcard) are returned.
+ *
+ * This function does not skip unusable keys (see the documentation
+ * for skip_unusable for an exact definition).
+ *
+ * If RET_KEYBLOCK is not NULL, the keyblock is returned in
+ * *RET_KEYBLOCK. This should be freed using release_kbnode().
+ *
+ * This function returns 0 on success. Otherwise, an error code is
+ * returned. In particular, GPG_ERR_NO_PUBKEY or GPG_ERR_NO_SECKEY
+ * (if want_secret is set) is returned if the key is not found.
+ *
+ * FIXME: We also have the get_pubkey_byname function which has a
+ * different semantic. Should be merged with this one. */
gpg_error_t
getkey_byname (ctrl_t ctrl, getkey_ctx_t *retctx, PKT_public_key *pk,
const char *name, int want_secret, kbnode_t *ret_keyblock)
@@ -1292,7 +1861,22 @@ getkey_byname (ctrl_t ctrl, getkey_ctx_t *retctx, PKT_public_key *pk,
}
-/* For documentation see keydb.h. */
+/* Return the next search result.
+ *
+ * If PK is not NULL, the public key of the next result is returned in
+ * *PK. Note: The self-signed data has already been merged into the
+ * public key using merge_selfsigs. Free *PK by calling
+ * release_public_key_parts (or, if PK was allocated using xfree, you
+ * can use free_public_key, which calls release_public_key_parts(PK)
+ * and then xfree(PK)).
+ *
+ * RET_KEYBLOCK can be given as NULL; if it is not NULL it the entire
+ * found keyblock wis retruned hich must be released with
+ * release_kbnode. If the function returns an error NULL is stored at
+ * RET_KEYBLOCK.
+ *
+ * The self-signed data has already been merged into the public key
+ * using merge_selfsigs. */
gpg_error_t
getkey_next (getkey_ctx_t ctx, PKT_public_key *pk, kbnode_t *ret_keyblock)
{
@@ -1313,7 +1897,8 @@ getkey_next (getkey_ctx_t ctx, PKT_public_key *pk, kbnode_t *ret_keyblock)
}
-/* For documentation see keydb.h. */
+/* Release any resources used by a key listing context. This must be
+ * called on the context returned by, e.g., getkey_byname. */
void
getkey_end (getkey_ctx_t ctx)
{
@@ -1332,7 +1917,10 @@ getkey_end (getkey_ctx_t ctx)
************* Merging stuff ********************
************************************************/
-/* For documentation see keydb.h. */
+/* Set the mainkey_id fields for all keys in KEYBLOCK. This is
+ * usually done by merge_selfsigs but at some places we only need the
+ * main_kid not a full merge. The function also guarantees that all
+ * pk->keyids are computed. */
void
setup_main_keyids (kbnode_t keyblock)
{
@@ -1361,7 +1949,13 @@ setup_main_keyids (kbnode_t keyblock)
}
-/* For documentation see keydb.h. */
+/* KEYBLOCK corresponds to a public key block. This function merges
+ * much of the information from the self-signed data into the public
+ * key, public subkey and user id data structures. If you use the
+ * high-level search API (e.g., get_pubkey) for looking up key blocks,
+ * then you don't need to call this function. This function is
+ * useful, however, if you change the keyblock, e.g., by adding or
+ * removing a self-signed data packet. */
void
merge_keys_and_selfsig (KBNODE keyblock)
{
@@ -2182,6 +2776,7 @@ merge_selfsigs_subkey (KBNODE keyblock, KBNODE subnode)
keytimestamp = subpk->timestamp;
subpk->flags.valid = 0;
+ subpk->flags.exact = 0;
subpk->main_keyid[0] = mainpk->main_keyid[0];
subpk->main_keyid[1] = mainpk->main_keyid[1];
@@ -2508,6 +3103,8 @@ finish_lookup (GETKEY_CTX ctx, KBNODE keyblock)
u32 latest_date;
KBNODE latest_key;
+ PKT_public_key *pk;
+
assert (keyblock->pkt->pkttype == PKT_PUBLIC_KEY);
@@ -2522,6 +3119,8 @@ finish_lookup (GETKEY_CTX ctx, KBNODE keyblock)
assert (k->pkt->pkttype == PKT_PUBLIC_KEY
|| k->pkt->pkttype == PKT_PUBLIC_SUBKEY);
foundk = k;
+ pk = k->pkt->pkt.public_key;
+ pk->flags.exact = 1;
break;
}
}
@@ -2565,8 +3164,6 @@ finish_lookup (GETKEY_CTX ctx, KBNODE keyblock)
/* Either start a loop or check just this one subkey. */
for (k = foundk ? foundk : keyblock; k; k = nextk)
{
- PKT_public_key *pk;
-
if (foundk)
/* If FOUNDK is not NULL, then only consider that exact
key, i.e., don't iterate. */
@@ -2640,7 +3237,6 @@ finish_lookup (GETKEY_CTX ctx, KBNODE keyblock)
- we're just considering the primary key. */
if ((!latest_key && !ctx->exact) || foundk == keyblock || req_prim)
{
- PKT_public_key *pk;
if (DBG_LOOKUP && !foundk && !req_prim)
log_debug ("\tno suitable subkeys found - trying primary\n");
pk = keyblock->pkt->pkt.public_key;
@@ -2670,7 +3266,6 @@ finish_lookup (GETKEY_CTX ctx, KBNODE keyblock)
if (DBG_LOOKUP)
log_debug ("\tprimary key may be used\n");
latest_key = keyblock;
- latest_date = pk->timestamp;
}
}
@@ -2688,7 +3283,7 @@ found:
if (latest_key)
{
- PKT_public_key *pk = latest_key->pkt->pkt.public_key;
+ pk = latest_key->pkt->pkt.public_key;
if (pk->user_id)
free_user_id (pk->user_id);
pk->user_id = scopy_user_id (foundu);
@@ -2730,6 +3325,9 @@ lookup (getkey_ctx_t ctx, kbnode_t *ret_keyblock, kbnode_t *ret_found_key,
KBNODE keyblock = NULL;
KBNODE found_key = NULL;
+ if (ret_keyblock)
+ *ret_keyblock = NULL;
+
for (;;)
{
rc = keydb_search (ctx->kr_handle, ctx->items, ctx->nitems, NULL);
@@ -2747,7 +3345,6 @@ lookup (getkey_ctx_t ctx, kbnode_t *ret_keyblock, kbnode_t *ret_found_key,
if (rc)
{
log_error ("keydb_get_keyblock failed: %s\n", gpg_strerror (rc));
- rc = 0;
goto skip;
}
@@ -2785,7 +3382,8 @@ found:
if (!rc)
{
- *ret_keyblock = keyblock; /* Return the keyblock. */
+ if (ret_keyblock)
+ *ret_keyblock = keyblock; /* Return the keyblock. */
keyblock = NULL;
}
else if (gpg_err_code (rc) == GPG_ERR_NOT_FOUND && no_suitable_key)
@@ -2807,7 +3405,38 @@ found:
}
-/* For documentation see keydb.h. */
+/* Enumerate some secret keys (specifically, those specified with
+ * --default-key and --try-secret-key). Use the following procedure:
+ *
+ * 1) Initialize a void pointer to NULL
+ * 2) Pass a reference to this pointer to this function (content)
+ * and provide space for the secret key (sk)
+ * 3) Call this function as long as it does not return an error (or
+ * until you are done). The error code GPG_ERR_EOF indicates the
+ * end of the listing.
+ * 4) Call this function a last time with SK set to NULL,
+ * so that can free it's context.
+ *
+ * In pseudo-code:
+ *
+ * void *ctx = NULL;
+ * PKT_public_key *sk = xmalloc_clear (sizeof (*sk));
+ *
+ * while ((err = enum_secret_keys (&ctx, sk)))
+ * { // Process SK.
+ * if (done)
+ * break;
+ * free_public_key (sk);
+ * sk = xmalloc_clear (sizeof (*sk));
+ * }
+ *
+ * // Release any resources used by CTX.
+ * enum_secret_keys (&ctx, NULL);
+ * free_public_key (sk);
+ *
+ * if (gpg_err_code (err) != GPG_ERR_EOF)
+ * ; // An error occurred.
+ */
gpg_error_t
enum_secret_keys (ctrl_t ctrl, void **context, PKT_public_key *sk)
{
@@ -3070,8 +3699,8 @@ get_user_id_byfpr_native (const byte *fpr)
}
-
-/* For documentation see keydb.h. */
+/* Return the database handle used by this context. The context still
+ owns the handle. */
KEYDB_HANDLE
get_ctx_handle (GETKEY_CTX ctx)
{
diff --git a/g10/gpg.c b/g10/gpg.c
index 2b48421..56bbd0d 100644
--- a/g10/gpg.c
+++ b/g10/gpg.c
@@ -1,7 +1,7 @@
/* gpg.c - The GnuPG utility (main for gpg)
* Copyright (C) 1998-2011 Free Software Foundation, Inc.
- * Copyright (C) 1997-2014 Werner Koch
- * Copyright (C) 2015 g10 Code GmbH
+ * Copyright (C) 1997-2016 Werner Koch
+ * Copyright (C) 2015-2016 g10 Code GmbH
*
* This file is part of GnuPG.
*
@@ -141,6 +141,7 @@ enum cmd_and_opt_values
aExport,
aExportSecret,
aExportSecretSub,
+ aExportSshKey,
aCheckKeys,
aGenRevoke,
aDesigRevoke,
@@ -453,6 +454,7 @@ static ARGPARSE_OPTS opts[] = {
ARGPARSE_c (aFetchKeys, "fetch-keys" , "@" ),
ARGPARSE_c (aExportSecret, "export-secret-keys" , "@" ),
ARGPARSE_c (aExportSecretSub, "export-secret-subkeys" , "@" ),
+ ARGPARSE_c (aExportSshKey, "export-ssh-key", "@" ),
ARGPARSE_c (aImport, "import", N_("import/merge keys")),
ARGPARSE_c (aFastImport, "fast-import", "@"),
#ifdef ENABLE_CARD_SUPPORT
@@ -2101,249 +2103,6 @@ get_default_configname (void)
return configname;
}
-
-static gpg_error_t
-check_user_ids (strlist_t *sp,
- int warn_possibly_ambiguous,
- int error_if_not_found)
-{
- strlist_t s = *sp;
- strlist_t s2 = NULL;
- strlist_t t;
-
- gpg_error_t rc = 0;
- gpg_error_t err;
-
- KEYDB_HANDLE hd = NULL;
-
- /* A quick check to avoid allocating a new strlist if we can skip
- all keys. Handles also the case of !SP. See below for details. */
- for (t = s; t && (!(t->flags & PK_LIST_CONFIG)
- && !(t->flags & PK_LIST_ENCRYPT_TO)); t = t->next)
- ;
- if (!t)
- return 0;
-
- for (t = s; t; t = t->next)
- {
- const char *option;
-
- KEYDB_SEARCH_DESC desc;
- KBNODE kb;
- PKT_public_key *pk;
- char fingerprint_bin[MAX_FINGERPRINT_LEN];
- size_t fingerprint_bin_len = sizeof (fingerprint_bin);
- /* We also potentially need a ! at the end. */
- char fingerprint[2 * MAX_FINGERPRINT_LEN + 1 + 1];
-
- /* If the key has been given on the command line and it has not
- been given by one of the encrypt-to options, we skip the
- checks. The reason is that the actual key selection code
- does its own checks and provides proper status message to the
- caller to detect the wrong keys. */
- if (!(t->flags & PK_LIST_CONFIG) && !(t->flags & PK_LIST_ENCRYPT_TO))
- {
- add_to_strlist (&s2, t->d);
- s2->flags = t->flags;
- continue;
- }
-
- switch (t->flags >> PK_LIST_SHIFT)
- {
- case oDefaultKey: option = "--default-key"; break;
- case oEncryptTo: option = "--encrypt-to"; break;
- case oHiddenEncryptTo: option = "--hidden-encrypt-to"; break;
- case oEncryptToDefaultKey: option = "--encrypt-to-default-key"; break;
- case oRecipient: option = "--recipient"; break;
- case oHiddenRecipient: option = "--hidden-recipient"; break;
- case oLocalUser: option = "--local-user"; break;
- default:
- log_bug ("Unsupport option: %d\n", (t->flags >> PK_LIST_SHIFT));
- }
-
- if (DBG_LOOKUP)
- {
- log_debug ("\n");
- log_debug ("%s: Checking %s=%s\n", __func__, option, t->d);
- }
-
- err = classify_user_id (t->d, &desc, 1);
- if (err)
- {
- if (! rc)
- rc = err;
-
- log_error (_("key \"%s\" not found: %s\n"),
- t->d, gpg_strerror (err));
- if (!opt.quiet)
- log_info (_("(check argument of option '%s')\n"), option);
- continue;
- }
-
- if (warn_possibly_ambiguous
- && ! (desc.mode == KEYDB_SEARCH_MODE_LONG_KID
- || desc.mode == KEYDB_SEARCH_MODE_FPR16
- || desc.mode == KEYDB_SEARCH_MODE_FPR20
- || desc.mode == KEYDB_SEARCH_MODE_FPR))
- log_info (_("Warning: value '%s' for option '%s'"
- " should be a long key ID or a fingerprint\n"),
- t->d, option);
-
- if (! hd)
- {
- hd = keydb_new ();
- if (!hd)
- {
- rc = gpg_error_from_syserror ();
- break;
- }
- }
- else
- keydb_search_reset (hd);
-
- err = keydb_search (hd, &desc, 1, NULL);
- if (gpg_err_code (err) == GPG_ERR_NOT_FOUND)
- {
- if (DBG_LOOKUP)
- log_debug ("%s: '%s' not found.\n", __func__, t->d);
-
- if (error_if_not_found)
- {
- if (! rc)
- rc = err;
-
- log_error (_("key \"%s\" not found\n"), t->d);
- if (!opt.quiet)
- log_info (_("(check argument of option '%s')\n"), option);
- }
- continue;
- }
- if (err)
- {
- if (! rc)
- rc = err;
-
- log_error (_("key \"%s\" not found: %s\n"), t->d, gpg_strerror (err));
- break;
- }
-
- err = keydb_get_keyblock (hd, &kb);
- if (err)
- {
- if (! rc)
- rc = err;
-
- log_error (_("error reading keyblock: %s\n"), gpg_strerror (err));
- continue;
- }
-
- pk = kb->pkt->pkt.public_key;
- if ((desc.mode == KEYDB_SEARCH_MODE_SHORT_KID
- || desc.mode == KEYDB_SEARCH_MODE_LONG_KID
- || desc.mode == KEYDB_SEARCH_MODE_FPR16
- || desc.mode == KEYDB_SEARCH_MODE_FPR20)
- && strchr (t->d, '!'))
- /* Exact search. In this case we want to set FINGERPRINT not
- to the primary key, but the key (primary or sub) that
- matched the search criteria. Note: there will always be
- exactly one match. */
- {
- kbnode_t n = kb;
- PKT_public_key *match = NULL;
- int i;
-
- do
- {
- if ((n->flag & 1))
- /* The matched node. */
- {
- assert (! match);
- match = n->pkt->pkt.public_key;
- }
- }
- while ((n = find_next_kbnode (n, PKT_PUBLIC_SUBKEY)));
- assert (match);
-
- fingerprint_from_pk (match, fingerprint_bin, &fingerprint_bin_len);
- assert (fingerprint_bin_len == sizeof (fingerprint_bin));
- bin2hex (fingerprint_bin, MAX_FINGERPRINT_LEN, fingerprint);
-
- i = strlen (fingerprint);
- fingerprint[i] = '!';
- fingerprint[i + 1] = '\0';
- }
- else
- {
- fingerprint_from_pk (pk, fingerprint_bin, &fingerprint_bin_len);
- assert (fingerprint_bin_len == sizeof (fingerprint_bin));
- bin2hex (fingerprint_bin, MAX_FINGERPRINT_LEN, fingerprint);
- }
-
- add_to_strlist (&s2, fingerprint);
- s2->flags = s->flags;
-
- release_kbnode (kb);
-
- /* Continue the search. */
- if (DBG_LOOKUP)
- log_debug ("%s: Check for duplicates for %s='%s'\n",
- __func__, option, t->d);
- err = keydb_search (hd, &desc, 1, NULL);
- if (! err)
- /* Another result! */
- {
- char fingerprint_bin2[MAX_FINGERPRINT_LEN];
- size_t fingerprint_bin2_len = sizeof (fingerprint_bin2);
- char fingerprint2[2 * MAX_FINGERPRINT_LEN + 1];
-
- log_error (_("key specification '%s' is ambiguous\n"), t->d);
- if (!opt.quiet)
- log_info (_("(check argument of option '%s')\n"), option);
-
- if (! rc)
- rc = GPG_ERR_AMBIGUOUS_NAME;
-
- err = keydb_get_keyblock (hd, &kb);
- if (err)
- log_error (_("error reading keyblock: %s\n"), gpg_strerror (err));
- else
- {
- pk = kb->pkt->pkt.public_key;
- fingerprint_from_pk (pk, fingerprint_bin2, &fingerprint_bin2_len);
- assert (fingerprint_bin2_len == sizeof (fingerprint_bin2));
- bin2hex (fingerprint_bin2, MAX_FINGERPRINT_LEN, fingerprint2);
-
- /* TRANSLATORS: The %s prints a key specification which
- for example has been given at the command line. Two
- lines with fingerprints are printed after this message. */
- log_info (_("'%s' matches at least:\n"), t->d);
- log_info (" %s\n", fingerprint);
- log_info (" %s\n", fingerprint2);
-
- release_kbnode (kb);
- }
- }
- else if (! (gpg_err_code (err) == GPG_ERR_NOT_FOUND
- || gpg_err_code (err) == GPG_ERR_EOF))
- /* An error (other than "not found"). */
- {
- log_error (_("error searching the keyring: %s\n"),
- gpg_strerror (err));
- if (! rc)
- rc = err;
- }
- }
-
- strlist_rev (&s2);
-
- keydb_release (hd);
-
- free_strlist (s);
- *sp = s2;
- return rc;
-}
-
-
int
main (int argc, char **argv)
{
@@ -2467,7 +2226,8 @@ main (int argc, char **argv)
| VERIFY_SHOW_POLICY_URLS
| VERIFY_SHOW_STD_NOTATIONS
| VERIFY_SHOW_KEYSERVER_URLS);
- opt.list_options = LIST_SHOW_UID_VALIDITY;
+ opt.list_options = (LIST_SHOW_UID_VALIDITY
+ | LIST_SHOW_USAGE);
#ifdef NO_TRUST_MODELS
opt.trust_model = TM_ALWAYS;
#else
@@ -2643,6 +2403,7 @@ main (int argc, char **argv)
case aListSigs:
case aExportSecret:
case aExportSecretSub:
+ case aExportSshKey:
case aSym:
case aClearsign:
case aGenRevoke:
@@ -2848,6 +2609,8 @@ main (int argc, char **argv)
case oDefaultKey:
sl = add_to_strlist (&opt.def_secret_key, pargs.r.ret_str);
sl->flags = (pargs.r_opt << PK_LIST_SHIFT);
+ if (configfp)
+ sl->flags |= PK_LIST_CONFIG;
break;
case oDefRecipient:
if( *pargs.r.ret_str )
@@ -3051,7 +2814,7 @@ main (int argc, char **argv)
sl->flags |= PK_LIST_CONFIG;
break;
case oEncryptToDefaultKey:
- opt.encrypt_to_default_key = 1;
+ opt.encrypt_to_default_key = configfp ? 2 : 1;
break;
case oRecipient: /* store the recipient */
sl = add_to_strlist2( &remusr, pargs.r.ret_str, utf8_strings );
@@ -4021,37 +3784,6 @@ main (int argc, char **argv)
break;
}
- {
- int have_def_secret_key = opt.def_secret_key != NULL;
-
- rc = check_user_ids (&locusr, 1, 1);
- if (rc)
- g10_exit (1);
- rc = check_user_ids (&remusr, 0, 1);
- if (rc)
- g10_exit (1);
- rc = check_user_ids (&opt.def_secret_key, 1, 0);
- if (rc)
- g10_exit (1);
-
- if (opt.encrypt_to_default_key)
- {
- const char *default_key = parse_def_secret_key (ctrl);
- if (default_key)
- {
- sl = add_to_strlist2 (&remusr, default_key, utf8_strings);
- sl->flags = ((oEncryptToDefaultKey << PK_LIST_SHIFT)
- | PK_LIST_ENCRYPT_TO);
- }
- else if (have_def_secret_key)
- log_info (_("option '%s' given, but no valid default keys given\n"),
- "--encrypt-to-default-key");
- else
- log_info (_("option '%s' given, but option '%s' not given\n"),
- "--encrypt-to-default-key", "--default-key");
- }
- }
-
/* The command dispatcher. */
switch( cmd )
{
@@ -4213,7 +3945,6 @@ main (int argc, char **argv)
break;
case aVerify:
- rc = 0;
if (multifile)
{
if ((rc = verify_files (ctrl, argc, argv)))
@@ -4457,6 +4188,17 @@ main (int argc, char **argv)
free_strlist(sl);
break;
+ case aExportSshKey:
+ if (argc != 1)
+ wrong_args ("--export-ssh-key <user-id>");
+ rc = export_ssh_key (ctrl, argv[0]);
+ if (rc)
+ {
+ write_status_failure ("export-ssh-key", rc);
+ log_error (_("export as ssh key failed: %s\n"), gpg_strerror (rc));
+ }
+ break;
+
case aSearchKeys:
sl = NULL;
for (; argc; argc--, argv++)
diff --git a/g10/gpgv.c b/g10/gpgv.c
index 9932756..19a2ff6 100644
--- a/g10/gpgv.c
+++ b/g10/gpgv.c
@@ -345,6 +345,13 @@ keyserver_match (struct keyserver_spec *spec)
}
int
+keyserver_any_configured (ctrl_t ctrl)
+{
+ (void)ctrl;
+ return 0;
+}
+
+int
keyserver_import_keyid (u32 *keyid, void *dummy)
{
(void)keyid;
diff --git a/g10/import.c b/g10/import.c
index 518e97f..369be35 100644
--- a/g10/import.c
+++ b/g10/import.c
@@ -40,7 +40,7 @@
#include "call-agent.h"
#include "../common/membuf.h"
-struct stats_s
+struct import_stats_s
{
ulong count;
ulong no_user_id;
@@ -62,23 +62,24 @@ struct stats_s
static int import (ctrl_t ctrl,
- IOBUF inp, const char* fname, struct stats_s *stats,
+ IOBUF inp, const char* fname, struct import_stats_s *stats,
unsigned char **fpr, size_t *fpr_len, unsigned int options,
import_screener_t screener, void *screener_arg);
static int read_block (IOBUF a, PACKET **pending_pkt, kbnode_t *ret_root,
int *r_v3keys);
static void revocation_present (ctrl_t ctrl, kbnode_t keyblock);
static int import_one (ctrl_t ctrl,
- const char *fname, kbnode_t keyblock,struct stats_s *stats,
+ const char *fname, kbnode_t keyblock,
+ struct import_stats_s *stats,
unsigned char **fpr, size_t *fpr_len,
unsigned int options, int from_sk, int silent,
import_screener_t screener, void *screener_arg);
static int import_secret_one (ctrl_t ctrl, const char *fname, kbnode_t keyblock,
- struct stats_s *stats, int batch,
+ struct import_stats_s *stats, int batch,
unsigned int options, int for_migration,
import_screener_t screener, void *screener_arg);
static int import_revoke_cert( const char *fname, kbnode_t node,
- struct stats_s *stats);
+ struct import_stats_s *stats);
static int chk_self_sigs (const char *fname, kbnode_t keyblock,
PKT_public_key *pk, u32 *keyid, int *non_self );
static int delete_inv_parts (const char *fname, kbnode_t keyblock,
@@ -137,15 +138,15 @@ parse_import_options(char *str,unsigned int *options,int noisy)
}
-void *
+import_stats_t
import_new_stats_handle (void)
{
- return xmalloc_clear ( sizeof (struct stats_s) );
+ return xmalloc_clear ( sizeof (struct import_stats_s) );
}
void
-import_release_stats_handle (void *p)
+import_release_stats_handle (import_stats_t p)
{
xfree (p);
}
@@ -183,13 +184,14 @@ import_release_stats_handle (void *p)
*/
static int
import_keys_internal (ctrl_t ctrl, iobuf_t inp, char **fnames, int nnames,
- void *stats_handle, unsigned char **fpr, size_t *fpr_len,
+ import_stats_t stats_handle,
+ unsigned char **fpr, size_t *fpr_len,
unsigned int options,
import_screener_t screener, void *screener_arg)
{
int i;
int rc = 0;
- struct stats_s *stats = stats_handle;
+ struct import_stats_s *stats = stats_handle;
if (!stats)
stats = import_new_stats_handle ();
@@ -256,14 +258,14 @@ import_keys_internal (ctrl_t ctrl, iobuf_t inp, char **fnames, int nnames,
void
import_keys (ctrl_t ctrl, char **fnames, int nnames,
- void *stats_handle, unsigned int options )
+ import_stats_t stats_handle, unsigned int options )
{
import_keys_internal (ctrl, NULL, fnames, nnames, stats_handle,
NULL, NULL, options, NULL, NULL);
}
int
-import_keys_stream (ctrl_t ctrl, IOBUF inp, void *stats_handle,
+import_keys_stream (ctrl_t ctrl, IOBUF inp, import_stats_t stats_handle,
unsigned char **fpr, size_t *fpr_len, unsigned int options)
{
return import_keys_internal (ctrl, inp, NULL, 0, stats_handle,
@@ -273,7 +275,8 @@ import_keys_stream (ctrl_t ctrl, IOBUF inp, void *stats_handle,
/* Variant of import_keys_stream reading from an estream_t. */
int
-import_keys_es_stream (ctrl_t ctrl, estream_t fp, void *stats_handle,
+import_keys_es_stream (ctrl_t ctrl, estream_t fp,
+ import_stats_t stats_handle,
unsigned char **fpr, size_t *fpr_len,
unsigned int options,
import_screener_t screener, void *screener_arg)
@@ -299,7 +302,7 @@ import_keys_es_stream (ctrl_t ctrl, estream_t fp, void *stats_handle,
static int
-import (ctrl_t ctrl, IOBUF inp, const char* fname,struct stats_s *stats,
+import (ctrl_t ctrl, IOBUF inp, const char* fname,struct import_stats_s *stats,
unsigned char **fpr,size_t *fpr_len, unsigned int options,
import_screener_t screener, void *screener_arg)
{
@@ -350,7 +353,6 @@ import (ctrl_t ctrl, IOBUF inp, const char* fname,struct stats_s *stats,
&& gpg_err_source (rc) == GPG_ERR_SOURCE_KEYBOX)
{
stats->not_imported++;
- rc = 0;
}
else if (rc)
break;
@@ -378,7 +380,7 @@ import_old_secring (ctrl_t ctrl, const char *fname)
kbnode_t keyblock = NULL; /* Need to initialize because gcc can't
grasp the return semantics of
read_block. */
- struct stats_s *stats;
+ struct import_stats_s *stats;
int v3keys;
inp = iobuf_open (fname);
@@ -422,10 +424,8 @@ import_old_secring (ctrl_t ctrl, const char *fname)
void
-import_print_stats (void *hd)
+import_print_stats (import_stats_t stats)
{
- struct stats_s *stats = hd;
-
if (!opt.quiet)
{
log_info(_("Total number processed: %lu\n"),
@@ -798,7 +798,6 @@ print_import_check (PKT_public_key * pk, PKT_user_id * id)
for (i = 0; i < n; i++, pos += 2)
sprintf (buf+pos, "%02X", fpr[i]);
strcat (buf, " ");
- pos += 1;
strcat (buf, id->name);
write_status_text (STATUS_IMPORT_CHECK, buf);
xfree (buf);
@@ -932,7 +931,7 @@ check_prefs (ctrl_t ctrl, kbnode_t keyblock)
*/
static int
import_one (ctrl_t ctrl,
- const char *fname, kbnode_t keyblock, struct stats_s *stats,
+ const char *fname, kbnode_t keyblock, struct import_stats_s *stats,
unsigned char **fpr, size_t *fpr_len, unsigned int options,
int from_sk, int silent,
import_screener_t screener, void *screener_arg)
@@ -1317,9 +1316,9 @@ import_one (ctrl_t ctrl,
function prints diagnostics and returns an error code. If BATCH is
true the secret keys are stored by gpg-agent in the transfer format
(i.e. no re-protection and aksing for passphrases). */
-static gpg_error_t
-transfer_secret_keys (ctrl_t ctrl, struct stats_s *stats, kbnode_t sec_keyblock,
- int batch)
+gpg_error_t
+transfer_secret_keys (ctrl_t ctrl, struct import_stats_s *stats,
+ kbnode_t sec_keyblock, int batch, int force)
{
gpg_error_t err = 0;
void *kek = NULL;
@@ -1388,8 +1387,11 @@ transfer_secret_keys (ctrl_t ctrl, struct stats_s *stats, kbnode_t sec_keyblock,
if (!ski)
BUG ();
- stats->count++;
- stats->secret_read++;
+ if (stats)
+ {
+ stats->count++;
+ stats->secret_read++;
+ }
/* We ignore stub keys. The way we handle them in other parts
of the code is by asking the agent whether any secret key is
@@ -1552,7 +1554,7 @@ transfer_secret_keys (ctrl_t ctrl, struct stats_s *stats, kbnode_t sec_keyblock,
{
char *desc = gpg_format_keydesc (pk, FORMAT_KEYDESC_IMPORT, 1);
err = agent_import_key (ctrl, desc, &cache_nonce,
- wrappedkey, wrappedkeylen, batch);
+ wrappedkey, wrappedkeylen, batch, force);
xfree (desc);
}
if (!err)
@@ -1560,7 +1562,8 @@ transfer_secret_keys (ctrl_t ctrl, struct stats_s *stats, kbnode_t sec_keyblock,
if (opt.verbose)
log_info (_("key %s: secret key imported\n"),
keystr_from_pk_with_sub (main_pk, pk));
- stats->secret_imported++;
+ if (stats)
+ stats->secret_imported++;
}
else if ( gpg_err_code (err) == GPG_ERR_EEXIST )
{
@@ -1568,7 +1571,8 @@ transfer_secret_keys (ctrl_t ctrl, struct stats_s *stats, kbnode_t sec_keyblock,
log_info (_("key %s: secret key already exists\n"),
keystr_from_pk_with_sub (main_pk, pk));
err = 0;
- stats->secret_dups++;
+ if (stats)
+ stats->secret_dups++;
}
else
{
@@ -1652,7 +1656,7 @@ sec_to_pub_keyblock (kbnode_t sec_keyblock)
*/
static int
import_secret_one (ctrl_t ctrl, const char *fname, kbnode_t keyblock,
- struct stats_s *stats, int batch, unsigned int options,
+ struct import_stats_s *stats, int batch, unsigned int options,
int for_migration,
import_screener_t screener, void *screener_arg)
{
@@ -1777,7 +1781,7 @@ import_secret_one (ctrl_t ctrl, const char *fname, kbnode_t keyblock,
gpg_error_t err;
nr_prev = stats->secret_imported;
- err = transfer_secret_keys (ctrl, stats, keyblock, batch);
+ err = transfer_secret_keys (ctrl, stats, keyblock, batch, 0);
if (gpg_err_code (err) == GPG_ERR_NOT_PROCESSED)
{
/* TRANSLATORS: For smartcard, each private key on
@@ -1819,7 +1823,8 @@ import_secret_one (ctrl_t ctrl, const char *fname, kbnode_t keyblock,
* Import a revocation certificate; this is a single signature packet.
*/
static int
-import_revoke_cert( const char *fname, kbnode_t node, struct stats_s *stats )
+import_revoke_cert (const char *fname, kbnode_t node,
+ struct import_stats_s *stats)
{
PKT_public_key *pk = NULL;
kbnode_t onode;
@@ -2466,9 +2471,9 @@ revocation_present (ctrl_t ctrl, kbnode_t keyblock)
char *tempkeystr=xstrdup(keystr_from_pk(pk));
/* No, so try and get it */
- if(opt.keyserver
- && (opt.keyserver_options.options
- & KEYSERVER_AUTO_KEY_RETRIEVE))
+ if ((opt.keyserver_options.options
+ & KEYSERVER_AUTO_KEY_RETRIEVE)
+ && keyserver_any_configured (ctrl))
{
log_info(_("WARNING: key %s may be revoked:"
" fetching revocation key %s\n"),
diff --git a/g10/keydb.c b/g10/keydb.c
index 97dfb5f..9604807 100644
--- a/g10/keydb.c
+++ b/g10/keydb.c
@@ -60,7 +60,10 @@ struct resource_item
static struct resource_item all_resources[MAX_KEYDB_RESOURCES];
static int used_resources;
-static void *primary_keyring=NULL;
+
+/* A pointer used to check for the primary key database by comparing
+ to the struct resource_item's TOKEN. */
+static void *primary_keydb;
/* This is a simple cache used to return the last result of a
@@ -81,6 +84,9 @@ struct keyblock_cache {
u32 *sigstatus;
int pk_no;
int uid_no;
+ /* Offset of the record in the keybox. */
+ int resource;
+ off_t offset;
};
@@ -245,6 +251,8 @@ keyblock_cache_clear (struct keydb_handle *hd)
hd->keyblock_cache.sigstatus = NULL;
iobuf_close (hd->keyblock_cache.iobuf);
hd->keyblock_cache.iobuf = NULL;
+ hd->keyblock_cache.resource = -1;
+ hd->keyblock_cache.offset = -1;
}
@@ -256,7 +264,7 @@ keyblock_cache_clear (struct keydb_handle *hd)
the keyring or keybox will be created.
Return 0 if it is okay to access the specified file. */
-static int
+static gpg_error_t
maybe_create_keyring_or_box (char *filename, int is_box, int force_create)
{
dotlock_t lockhd = NULL;
@@ -264,6 +272,8 @@ maybe_create_keyring_or_box (char *filename, int is_box, int force_create)
int rc;
mode_t oldmask;
char *last_slash_in_filename;
+ char *bak_fname = NULL;
+ char *tmp_fname = NULL;
int save_slash;
/* A quick test whether the filename already exists. */
@@ -342,11 +352,39 @@ maybe_create_keyring_or_box (char *filename, int is_box, int force_create)
}
/* Now the real test while we are locked. */
+
+ /* Gpg either uses pubring.gpg or pubring.kbx and thus different
+ * lock files. Now, when one gpg process is updating a pubring.gpg
+ * and thus holding the corresponding lock, a second gpg process may
+ * get to here at the time between the two rename operation used by
+ * the first process to update pubring.gpg. The lock taken above
+ * may not protect the second process if it tries to create a
+ * pubring.kbx file which would be protected by a different lock
+ * file.
+ *
+ * We can detect this case by checking that the two temporary files
+ * used by the update code exist at the same time. In that case we
+ * do not create a new file but act as if FORCE_CREATE has not been
+ * given. Obviously there is a race between our two checks but the
+ * worst thing is that we won't create a new file, which is better
+ * than to accidentally creating one. */
+ rc = keybox_tmp_names (filename, is_box, &bak_fname, &tmp_fname);
+ if (rc)
+ goto leave;
+
if (!access (filename, F_OK))
{
rc = 0; /* Okay, we may access the file now. */
goto leave;
}
+ if (!access (bak_fname, F_OK) && !access (tmp_fname, F_OK))
+ {
+ /* Very likely another process is updating a pubring.gpg and we
+ should not create a pubring.kbx. */
+ rc = gpg_error (GPG_ERR_ENOENT);
+ goto leave;
+ }
+
/* The file does not yet exist, create it now. */
oldmask = umask (077);
@@ -414,6 +452,8 @@ maybe_create_keyring_or_box (char *filename, int is_box, int force_create)
dotlock_release (lockhd);
dotlock_destroy (lockhd);
}
+ xfree (bak_fname);
+ xfree (tmp_fname);
return rc;
}
@@ -470,7 +510,7 @@ char *
keydb_search_desc_dump (struct keydb_search_desc *desc)
{
char b[MAX_FORMATTED_FINGERPRINT_LEN + 1];
- char fpr[MAX_FINGERPRINT_LEN + 1];
+ char fpr[2 * MAX_FINGERPRINT_LEN + 1];
switch (desc->mode)
{
@@ -528,7 +568,52 @@ keydb_search_desc_dump (struct keydb_search_desc *desc)
return xasprintf ("Bad search mode (%d)", desc->mode);
}
}
+
+
+/* Register a resource (keyring or keybox). The first keyring or
+ * keybox that is added using this function is created if it does not
+ * already exist and the KEYDB_RESOURCE_FLAG_READONLY is not set.
+ *
+ * FLAGS are a combination of the KEYDB_RESOURCE_FLAG_* constants.
+ *
+ * URL must have the following form:
+ *
+ * gnupg-ring:filename = plain keyring
+ * gnupg-kbx:filename = keybox file
+ * filename = check file's type (create as a plain keyring)
+ *
+ * Note: on systems with drive letters (Windows) invalid URLs (i.e.,
+ * those with an unrecognized part before the ':' such as "c:\...")
+ * will silently be treated as bare filenames. On other systems, such
+ * URLs will cause this function to return GPG_ERR_GENERAL.
+ *
+ * If KEYDB_RESOURCE_FLAG_DEFAULT is set, the resource is a keyring
+ * and the file ends in ".gpg", then this function also checks if a
+ * file with the same name, but the extension ".kbx" exists, is a
+ * keybox and the OpenPGP flag is set. If so, this function opens
+ * that resource instead.
+ *
+ * If the file is not found, KEYDB_RESOURCE_FLAG_GPGVDEF is set and
+ * the URL ends in ".kbx", then this function will try opening the
+ * same URL, but with the extension ".gpg". If that file is a keybox
+ * with the OpenPGP flag set or it is a keyring, then we use that
+ * instead.
+ *
+ * If the file is not found, KEYDB_RESOURCE_FLAG_DEFAULT is set, the
+ * file should be created and the file's extension is ".gpg" then we
+ * replace the extension with ".kbx".
+ *
+ * If the KEYDB_RESOURCE_FLAG_PRIMARY is set and the resource is a
+ * keyring (not a keybox), then this resource is considered the
+ * primary resource. This is used by keydb_locate_writable(). If
+ * another primary keyring is set, then that keyring is considered the
+ * primary.
+ *
+ * If KEYDB_RESOURCE_FLAG_READONLY is set and the resource is a
+ * keyring (not a keybox), then the keyring is marked as read only and
+ * operations just as keyring_insert_keyblock will return
+ * GPG_ERR_ACCESS. */
gpg_error_t
keydb_add_resource (const char *url, unsigned int flags)
{
@@ -542,7 +627,7 @@ keydb_add_resource (const char *url, unsigned int flags)
int read_only = !!(flags&KEYDB_RESOURCE_FLAG_READONLY);
int is_default = !!(flags&KEYDB_RESOURCE_FLAG_DEFAULT);
int is_gpgvdef = !!(flags&KEYDB_RESOURCE_FLAG_GPGVDEF);
- int rc = 0;
+ gpg_error_t err = 0;
KeydbResourceType rt = KEYDB_RESOURCE_TYPE_NONE;
void *token;
@@ -563,7 +648,7 @@ keydb_add_resource (const char *url, unsigned int flags)
else if (strchr (resname, ':'))
{
log_error ("invalid key resource URL '%s'\n", url );
- rc = gpg_error (GPG_ERR_GENERAL);
+ err = gpg_error (GPG_ERR_GENERAL);
goto leave;
}
#endif /* !HAVE_DRIVE_LETTERS && !__riscos__ */
@@ -658,22 +743,22 @@ keydb_add_resource (const char *url, unsigned int flags)
{
case KEYDB_RESOURCE_TYPE_NONE:
log_error ("unknown type of key resource '%s'\n", url );
- rc = gpg_error (GPG_ERR_GENERAL);
+ err = gpg_error (GPG_ERR_GENERAL);
goto leave;
case KEYDB_RESOURCE_TYPE_KEYRING:
- rc = maybe_create_keyring_or_box (filename, 0, create);
- if (rc)
+ err = maybe_create_keyring_or_box (filename, 0, create);
+ if (err)
goto leave;
if (keyring_register_filename (filename, read_only, &token))
{
if (used_resources >= MAX_KEYDB_RESOURCES)
- rc = gpg_error (GPG_ERR_RESOURCE_LIMIT);
+ err = gpg_error (GPG_ERR_RESOURCE_LIMIT);
else
{
if ((flags & KEYDB_RESOURCE_FLAG_PRIMARY))
- primary_keyring = token;
+ primary_keydb = token;
all_resources[used_resources].type = rt;
all_resources[used_resources].u.kr = NULL; /* Not used here */
all_resources[used_resources].token = token;
@@ -686,26 +771,25 @@ keydb_add_resource (const char *url, unsigned int flags)
However, we can still mark it as primary even if it was
already registered. */
if ((flags & KEYDB_RESOURCE_FLAG_PRIMARY))
- primary_keyring = token;
+ primary_keydb = token;
}
break;
case KEYDB_RESOURCE_TYPE_KEYBOX:
{
- rc = maybe_create_keyring_or_box (filename, 1, create);
- if (rc)
+ err = maybe_create_keyring_or_box (filename, 1, create);
+ if (err)
goto leave;
- /* FIXME: How do we register a read-only keybox? */
- token = keybox_register_file (filename, 0);
- if (token)
+ err = keybox_register_file (filename, 0, &token);
+ if (!err)
{
if (used_resources >= MAX_KEYDB_RESOURCES)
- rc = gpg_error (GPG_ERR_RESOURCE_LIMIT);
+ err = gpg_error (GPG_ERR_RESOURCE_LIMIT);
else
{
- /* if ((flags & KEYDB_RESOURCE_FLAG_PRIMARY)) */
- /* primary_keyring = token; */
+ if ((flags & KEYDB_RESOURCE_FLAG_PRIMARY))
+ primary_keydb = token;
all_resources[used_resources].type = rt;
all_resources[used_resources].u.kb = NULL; /* Not used here */
all_resources[used_resources].token = token;
@@ -716,32 +800,31 @@ keydb_add_resource (const char *url, unsigned int flags)
used_resources++;
}
}
- else
+ else if (gpg_err_code (err) == GPG_ERR_EEXIST)
{
/* Already registered. We will mark it as the primary key
if requested. */
- /* FIXME: How to do that? Change the keybox interface? */
- /* if ((flags & KEYDB_RESOURCE_FLAG_PRIMARY)) */
- /* primary_keyring = token; */
+ if ((flags & KEYDB_RESOURCE_FLAG_PRIMARY))
+ primary_keydb = token;
}
}
break;
default:
log_error ("resource type of '%s' not supported\n", url);
- rc = gpg_error (GPG_ERR_GENERAL);
+ err = gpg_error (GPG_ERR_GENERAL);
goto leave;
}
/* fixme: check directory permissions and print a warning */
leave:
- if (rc)
- log_error (_("keyblock resource '%s': %s\n"), filename, gpg_strerror (rc));
+ if (err)
+ log_error (_("keyblock resource '%s': %s\n"), filename, gpg_strerror (err));
else
any_registered = 1;
xfree (filename);
- return rc;
+ return err;
}
@@ -859,6 +942,9 @@ keydb_release (KEYDB_HANDLE hd)
}
+/* Set a flag on the handle to suppress use of cached results. This
+ * is required for updating a keyring and for key listings. Fixme:
+ * Using a new parameter for keydb_new might be a better solution. */
void
keydb_disable_caching (KEYDB_HANDLE hd)
{
@@ -867,6 +953,14 @@ keydb_disable_caching (KEYDB_HANDLE hd)
}
+/* Return the file name of the resource in which the current search
+ * result was found or, if there is no search result, the filename of
+ * the current resource (i.e., the resource that the file position
+ * points to). Note: the filename is not necessarily the URL used to
+ * open it!
+ *
+ * This function only returns NULL if no handle is specified, in all
+ * other error cases an empty string is returned. */
const char *
keydb_get_resource_name (KEYDB_HANDLE hd)
{
@@ -941,7 +1035,7 @@ lock_all (KEYDB_HANDLE hd)
keyring_lock (hd->active[i].u.kr, 0);
break;
case KEYDB_RESOURCE_TYPE_KEYBOX:
- rc = keybox_lock (hd->active[i].u.kb, 0);
+ keybox_lock (hd->active[i].u.kb, 0);
break;
}
}
@@ -980,6 +1074,22 @@ unlock_all (KEYDB_HANDLE hd)
+/* Save the last found state and invalidate the current selection
+ * (i.e., the entry selected by keydb_search() is invalidated and
+ * something like keydb_get_keyblock() will return an error). This
+ * does not change the file position. This makes it possible to do
+ * something like:
+ *
+ * keydb_search (hd, ...); // Result 1.
+ * keydb_push_found_state (hd);
+ * keydb_search_reset (hd);
+ * keydb_search (hd, ...); // Result 2.
+ * keydb_pop_found_state (hd);
+ * keydb_get_keyblock (hd, ...); // -> Result 1.
+ *
+ * Note: it is only possible to save a single save state at a time.
+ * In other words, the the save stack only has room for a single
+ * instance of the state. */
void
keydb_push_found_state (KEYDB_HANDLE hd)
{
@@ -1009,6 +1119,8 @@ keydb_push_found_state (KEYDB_HANDLE hd)
}
+/* Restore the previous save state. If the saved state is NULL or
+ invalid, this is a NOP. */
void
keydb_pop_found_state (KEYDB_HANDLE hd)
{
@@ -1199,6 +1311,15 @@ parse_keyblock_image (iobuf_t iobuf, int pk_no, int uid_no,
}
+/* Return the keyblock last found by keydb_search() in *RET_KB.
+ *
+ * On success, the function returns 0 and the caller must free *RET_KB
+ * using release_kbnode(). Otherwise, the function returns an error
+ * code.
+ *
+ * The returned keyblock has the kbnode flag bit 0 set for the node
+ * with the public key used to locate the keyblock or flag bit 1 set
+ * for the user ID node. */
gpg_error_t
keydb_get_keyblock (KEYDB_HANDLE hd, KBNODE *ret_kb)
{
@@ -1377,10 +1498,32 @@ build_keyblock_image (kbnode_t keyblock, iobuf_t *r_iobuf, u32 **r_sigstatus)
}
+/* Update the keyblock KB (i.e., extract the fingerprint and find the
+ * corresponding keyblock in the keyring).
+ *
+ * This doesn't do anything if --dry-run was specified.
+ *
+ * Returns 0 on success. Otherwise, it returns an error code. Note:
+ * if there isn't a keyblock in the keyring corresponding to KB, then
+ * this function returns GPG_ERR_VALUE_NOT_FOUND.
+ *
+ * This function selects the matching record and modifies the current
+ * file position to point to the record just after the selected entry.
+ * Thus, if you do a subsequent search using HD, you should first do a
+ * keydb_search_reset. Further, if the selected record is important,
+ * you should use keydb_push_found_state and keydb_pop_found_state to
+ * save and restore it. */
gpg_error_t
keydb_update_keyblock (KEYDB_HANDLE hd, kbnode_t kb)
{
gpg_error_t err;
+ PKT_public_key *pk;
+ KEYDB_SEARCH_DESC desc;
+ size_t len;
+
+ assert (kb);
+ assert (kb->pkt->pkttype == PKT_PUBLIC_KEY);
+ pk = kb->pkt->pkt.public_key;
if (!hd)
return gpg_error (GPG_ERR_INV_ARG);
@@ -1388,9 +1531,6 @@ keydb_update_keyblock (KEYDB_HANDLE hd, kbnode_t kb)
kid_not_found_flush ();
keyblock_cache_clear (hd);
- if (hd->found < 0 || hd->found >= hd->used)
- return gpg_error (GPG_ERR_VALUE_NOT_FOUND);
-
if (opt.dry_run)
return 0;
@@ -1398,6 +1538,19 @@ keydb_update_keyblock (KEYDB_HANDLE hd, kbnode_t kb)
if (err)
return err;
+ memset (&desc, 0, sizeof (desc));
+ fingerprint_from_pk (pk, desc.u.fpr, &len);
+ if (len == 20)
+ desc.mode = KEYDB_SEARCH_MODE_FPR20;
+ else
+ log_bug ("%s: Unsupported key length: %zu\n", __func__, len);
+
+ keydb_search_reset (hd);
+ err = keydb_search (hd, &desc, 1, NULL);
+ if (err)
+ return gpg_error (GPG_ERR_VALUE_NOT_FOUND);
+ assert (hd->found >= 0 && hd->found < hd->used);
+
switch (hd->active[hd->found].type)
{
case KEYDB_RESOURCE_TYPE_NONE:
@@ -1427,6 +1580,16 @@ keydb_update_keyblock (KEYDB_HANDLE hd, kbnode_t kb)
}
+/* Insert a keyblock into one of the underlying keyrings or keyboxes.
+ *
+ * Be default, the keyring / keybox from which the last search result
+ * came is used. If there was no previous search result (or
+ * keydb_search_reset was called), then the keyring / keybox where the
+ * next search would start is used (i.e., the current file position).
+ *
+ * Note: this doesn't do anything if --dry-run was specified.
+ *
+ * Returns 0 on success. Otherwise, it returns an error code. */
gpg_error_t
keydb_insert_keyblock (KEYDB_HANDLE hd, kbnode_t kb)
{
@@ -1488,6 +1651,11 @@ keydb_insert_keyblock (KEYDB_HANDLE hd, kbnode_t kb)
}
+/* Delete the currently selected keyblock. If you haven't done a
+ * search yet on this database handle (or called keydb_search_reset),
+ * then this will return an error.
+ *
+ * Returns 0 on success or an error code, if an error occurs. */
gpg_error_t
keydb_delete_keyblock (KEYDB_HANDLE hd)
{
@@ -1528,6 +1696,15 @@ keydb_delete_keyblock (KEYDB_HANDLE hd)
+/* A database may consists of multiple keyrings / key boxes. This
+ * sets the "file position" to the start of the first keyring / key
+ * box that is writable (i.e., doesn't have the read-only flag set).
+ *
+ * This first tries the primary keyring (the last keyring (not
+ * keybox!) added using keydb_add_resource() and with
+ * KEYDB_RESOURCE_FLAG_PRIMARY set). If that is not writable, then it
+ * tries the keyrings / keyboxes in the order in which they were
+ * added. */
gpg_error_t
keydb_locate_writable (KEYDB_HANDLE hd)
{
@@ -1541,11 +1718,11 @@ keydb_locate_writable (KEYDB_HANDLE hd)
return rc;
/* If we have a primary set, try that one first */
- if (primary_keyring)
+ if (primary_keydb)
{
for ( ; hd->current >= 0 && hd->current < hd->used; hd->current++)
{
- if(hd->active[hd->current].token==primary_keyring)
+ if(hd->active[hd->current].token == primary_keydb)
{
if(keyring_is_writable (hd->active[hd->current].token))
return 0;
@@ -1580,6 +1757,8 @@ keydb_locate_writable (KEYDB_HANDLE hd)
return gpg_error (GPG_ERR_NOT_FOUND);
}
+
+/* Rebuild the on-disk caches of all key resources. */
void
keydb_rebuild_caches (int noisy)
{
@@ -1607,6 +1786,8 @@ keydb_rebuild_caches (int noisy)
}
+/* Return the number of skipped blocks (because they were to large to
+ read from a keybox) since the last search reset. */
unsigned long
keydb_get_skipped_counter (KEYDB_HANDLE hd)
{
@@ -1614,6 +1795,12 @@ keydb_get_skipped_counter (KEYDB_HANDLE hd)
}
+/* Clears the current search result and resets the handle's position
+ * so that the next search starts at the beginning of the database
+ * (the start of the first resource).
+ *
+ * Returns 0 on success and an error code if an error occurred.
+ * (Currently, this function always returns 0 if HD is valid.) */
gpg_error_t
keydb_search_reset (KEYDB_HANDLE hd)
{
@@ -1654,6 +1841,24 @@ keydb_search_reset (KEYDB_HANDLE hd)
}
+/* Search the database for keys matching the search description. If
+ * the DB contains any legacy keys, these are silently ignored.
+ *
+ * DESC is an array of search terms with NDESC entries. The search
+ * terms are or'd together. That is, the next entry in the DB that
+ * matches any of the descriptions will be returned.
+ *
+ * Note: this function resumes searching where the last search left
+ * off (i.e., at the current file position). If you want to search
+ * from the start of the database, then you need to first call
+ * keydb_search_reset().
+ *
+ * If no key matches the search description, returns
+ * GPG_ERR_NOT_FOUND. If there was a match, returns 0. If an error
+ * occurred, returns an error code.
+ *
+ * The returned key is considered to be selected and the raw data can,
+ * for instance, be returned by calling keydb_get_keyblock(). */
gpg_error_t
keydb_search (KEYDB_HANDLE hd, KEYDB_SEARCH_DESC *desc,
size_t ndesc, size_t *descindex)
@@ -1701,11 +1906,23 @@ keydb_search (KEYDB_HANDLE hd, KEYDB_SEARCH_DESC *desc,
&& (desc[0].mode == KEYDB_SEARCH_MODE_FPR20
|| desc[0].mode == KEYDB_SEARCH_MODE_FPR)
&& hd->keyblock_cache.state == KEYBLOCK_CACHE_FILLED
- && !memcmp (hd->keyblock_cache.fpr, desc[0].u.fpr, 20))
+ && !memcmp (hd->keyblock_cache.fpr, desc[0].u.fpr, 20)
+ /* Make sure the current file position occurs before the cached
+ result to avoid an infinite loop. */
+ && (hd->current < hd->keyblock_cache.resource
+ || (hd->current == hd->keyblock_cache.resource
+ && (keybox_offset (hd->active[hd->current].u.kb)
+ <= hd->keyblock_cache.offset))))
{
/* (DESCINDEX is already set). */
if (DBG_CLOCK)
log_clock ("keydb_search leave (cached)");
+
+ hd->current = hd->keyblock_cache.resource;
+ /* HD->KEYBLOCK_CACHE.OFFSET is the last byte in the record.
+ Seek just beyond that. */
+ keybox_seek (hd->active[hd->current].u.kb,
+ hd->keyblock_cache.offset + 1);
return 0;
}
@@ -1772,6 +1989,12 @@ keydb_search (KEYDB_HANDLE hd, KEYDB_SEARCH_DESC *desc,
&& hd->active[hd->current].type == KEYDB_RESOURCE_TYPE_KEYBOX)
{
hd->keyblock_cache.state = KEYBLOCK_CACHE_PREPARED;
+ hd->keyblock_cache.resource = hd->current;
+ /* The current offset is at the start of the next record. Since
+ a record is at least 1 byte, we just use offset - 1, which is
+ within the record. */
+ hd->keyblock_cache.offset
+ = keybox_offset (hd->active[hd->current].u.kb) - 1;
memcpy (hd->keyblock_cache.fpr, desc[0].u.fpr, 20);
}
@@ -1787,6 +2010,11 @@ keydb_search (KEYDB_HANDLE hd, KEYDB_SEARCH_DESC *desc,
}
+/* Return the first non-legacy key in the database.
+ *
+ * If you want the very first key in the database, you can directly
+ * call keydb_search with the search description
+ * KEYDB_SEARCH_MODE_FIRST. */
gpg_error_t
keydb_search_first (KEYDB_HANDLE hd)
{
@@ -1803,6 +2031,10 @@ keydb_search_first (KEYDB_HANDLE hd)
}
+/* Return the next key (not the next matching key!).
+ *
+ * Unlike calling keydb_search with KEYDB_SEARCH_MODE_NEXT, this
+ * function silently skips legacy keys. */
gpg_error_t
keydb_search_next (KEYDB_HANDLE hd)
{
@@ -1813,6 +2045,13 @@ keydb_search_next (KEYDB_HANDLE hd)
return keydb_search (hd, &desc, 1, NULL);
}
+
+/* This is a convenience function for searching for keys with a long
+ * key id.
+ *
+ * Note: this function resumes searching where the last search left
+ * off. If you want to search the whole database, then you need to
+ * first call keydb_search_reset(). */
gpg_error_t
keydb_search_kid (KEYDB_HANDLE hd, u32 *kid)
{
@@ -1825,6 +2064,13 @@ keydb_search_kid (KEYDB_HANDLE hd, u32 *kid)
return keydb_search (hd, &desc, 1, NULL);
}
+
+/* This is a convenience function for searching for keys with a long
+ * (20 byte) fingerprint.
+ *
+ * Note: this function resumes searching where the last search left
+ * off. If you want to search the whole database, then you need to
+ * first call keydb_search_reset(). */
gpg_error_t
keydb_search_fpr (KEYDB_HANDLE hd, const byte *fpr)
{
diff --git a/g10/keydb.h b/g10/keydb.h
index d7aa432..e679d94 100644
--- a/g10/keydb.h
+++ b/g10/keydb.h
@@ -70,12 +70,18 @@ enum resource_type {
/* Bit flags used with build_pk_list. */
-#define PK_LIST_ENCRYPT_TO 1 /* This is an encrypt-to recipient. */
-#define PK_LIST_HIDDEN 2 /* This is a hidden recipient. */
-#define PK_LIST_CONFIG 4 /* Specified via config file. */
+enum
+ {
+ PK_LIST_ENCRYPT_TO=1, /* This is an encrypt-to recipient. */
+ PK_LIST_HIDDEN=2, /* This is a hidden recipient. */
+ PK_LIST_CONFIG=4 /* Specified via config file. */
+ };
/* To store private data in the flags they must be left shifted by
this value. */
-#define PK_LIST_SHIFT 3
+enum
+ {
+ PK_LIST_SHIFT=3
+ };
/****************
* A data structure to hold information about the external position
@@ -145,50 +151,7 @@ union pref_hint
the result. */
char *keydb_search_desc_dump (struct keydb_search_desc *desc);
-/* Register a resource (keyring or keybox). The first keyring or
- keybox that is added using this function is created if it does not
- already exist and the KEYDB_RESOURCE_FLAG_READONLY is not set.
-
- FLAGS are a combination of the KEYDB_RESOURCE_FLAG_* constants.
-
- URL must have the following form:
-
- gnupg-ring:filename = plain keyring
- gnupg-kbx:filename = keybox file
- filename = check file's type (create as a plain keyring)
-
- Note: on systems with drive letters (Windows) invalid URLs (i.e.,
- those with an unrecognized part before the ':' such as "c:\...")
- will silently be treated as bare filenames. On other systems, such
- URLs will cause this function to return GPG_ERR_GENERAL.
-
- If KEYDB_RESOURCE_FLAG_DEFAULT is set, the resource is a keyring
- and the file ends in ".gpg", then this function also checks if a
- file with the same name, but the extension ".kbx" exists, is a
- keybox and the OpenPGP flag is set. If so, this function opens
- that resource instead.
-
- If the file is not found, KEYDB_RESOURCE_FLAG_GPGVDEF is set and
- the URL ends in ".kbx", then this function will try opening the
- same URL, but with the extension ".gpg". If that file is a keybox
- with the OpenPGP flag set or it is a keyring, then we use that
- instead.
-
- If the file is not found, KEYDB_RESOURCE_FLAG_DEFAULT is set, the
- file should be created and the file's extension is ".gpg" then we
- replace the extension with ".kbx".
-
-
- If the KEYDB_RESOURCE_FLAG_PRIMARY is set and the resource is a
- keyring (not a keybox), then this resource is considered the
- primary resource. This is used by keydb_locate_writable(). If
- another primary keyring is set, then that keyring is considered the
- primary.
-
- If KEYDB_RESOURCE_FLAG_READONLY is set and the resource is a
- keyring (not a keybox), then the keyring is marked as read only and
- operations just as keyring_insert_keyblock will return
- GPG_ERR_ACCESS. */
+/* Register a resource (keyring or keybox). */
gpg_error_t keydb_add_resource (const char *url, unsigned int flags);
/* Dump some statistics to the log. */
@@ -206,85 +169,28 @@ void keydb_release (KEYDB_HANDLE hd);
Using a new parameter for keydb_new might be a better solution. */
void keydb_disable_caching (KEYDB_HANDLE hd);
-/* Save the last found state and invalidate the current selection
- (i.e., the entry selected by keydb_search() is invalidated and
- something like keydb_get_keyblock() will return an error). This
- does not change the file position. This makes it possible to do
- something like:
-
- keydb_search (hd, ...); // Result 1.
- keydb_push_found_state (hd);
- keydb_search_reset (hd);
- keydb_search (hd, ...); // Result 2.
- keydb_pop_found_state (hd);
- keydb_get_keyblock (hd, ...); // -> Result 1.
-
- Note: it is only possible to save a single save state at a time.
- In other words, the the save stack only has room for a single
- instance of the state. */
+/* Save the last found state and invalidate the current selection. */
void keydb_push_found_state (KEYDB_HANDLE hd);
-/* Restore the previous save state. If the saved state is invalid,
- this is equivalent to */
+/* Restore the previous save state. */
void keydb_pop_found_state (KEYDB_HANDLE hd);
-/* Return the file name of the resource in which the current search
- result was found or, if there is no search result, the filename of
- the current resource (i.e., the resource that the file position
- points to). Note: the filename is not necessarily the URL used to
- open it!
-
- This function only returns NULL if no handle is specified, in all
- other error cases an empty string is returned. */
+/* Return the file name of the resource. */
const char *keydb_get_resource_name (KEYDB_HANDLE hd);
-/* Return the keyblock last found by keydb_search() in *RET_KB.
-
- On success, the function returns 0 and the caller must free *RET_KB
- using release_kbnode(). Otherwise, the function returns an error
- code.
-
- The returned keyblock has the kbnode flag bit 0 set for the node
- with the public key used to locate the keyblock or flag bit 1 set
- for the user ID node. */
+/* Return the keyblock last found by keydb_search. */
gpg_error_t keydb_get_keyblock (KEYDB_HANDLE hd, KBNODE *ret_kb);
-/* Replace the currently selected keyblock (i.e., the last result
- returned by keydb_search) with the key block in KB.
-
- This doesn't do anything if --dry-run was specified.
-
- Returns 0 on success. Otherwise, it returns an error code. */
+/* Update the keyblock KB. */
gpg_error_t keydb_update_keyblock (KEYDB_HANDLE hd, kbnode_t kb);
-/* Insert a keyblock into one of the underlying keyrings or keyboxes.
-
- Be default, the keyring / keybox from which the last search result
- came is used. If there was no previous search result (or
- keydb_search_reset was called), then the keyring / keybox where the
- next search would start is used (i.e., the current file position).
-
- Note: this doesn't do anything if --dry-run was specified.
-
- Returns 0 on success. Otherwise, it returns an error code. */
+/* Insert a keyblock into one of the underlying keyrings or keyboxes. */
gpg_error_t keydb_insert_keyblock (KEYDB_HANDLE hd, kbnode_t kb);
-/* Delete the currently selected keyblock. If you haven't done a
- search yet on this database handle (or called keydb_search_reset),
- then this will return an error.
-
- Returns 0 on success or an error code, if an error occurs. */
+/* Delete the currently selected keyblock. */
gpg_error_t keydb_delete_keyblock (KEYDB_HANDLE hd);
-/* A database may consists of multiple keyrings / key boxes. This
- sets the "file position" to the start of the first keyring / key
- box that is writable (i.e., doesn't have the read-only flag set).
-
- This first tries the primary keyring (the last keyring (not
- keybox!) added using keydb_add_resource() and with
- KEYDB_RESOURCE_FLAG_PRIMARY set). If that is not writable, then it
- tries the keyrings / keyboxes in the order in which they were
- added. */
+/* Find the first writable resource. */
gpg_error_t keydb_locate_writable (KEYDB_HANDLE hd);
/* Rebuild the on-disk caches of all key resources. */
@@ -294,62 +200,25 @@ void keydb_rebuild_caches (int noisy);
read from a keybox) since the last search reset. */
unsigned long keydb_get_skipped_counter (KEYDB_HANDLE hd);
-/* Clears the current search result and resets the handle's position
- so that the next search starts at the beginning of the database
- (the start of the first resource).
-
- Returns 0 on success and an error code if an error occurred.
- (Currently, this function always returns 0 if HD is valid.) */
+/* Clears the current search result and resets the handle's position. */
gpg_error_t keydb_search_reset (KEYDB_HANDLE hd);
-/* Search the database for keys matching the search description. If
- the DB contains any legacy keys, these are silently ignored.
-
- DESC is an array of search terms with NDESC entries. The search
- terms are or'd together. That is, the next entry in the DB that
- matches any of the descriptions will be returned.
-
- Note: this function resumes searching where the last search left
- off (i.e., at the current file position). If you want to search
- from the start of the database, then you need to first call
- keydb_search_reset().
-
- If no key matches the search description, returns
- GPG_ERR_NOT_FOUND. If there was a match, returns 0. If an error
- occurred, returns an error code.
-
- The returned key is considered to be selected and the raw data can,
- for instance, be returned by calling keydb_get_keyblock(). */
+/* Search the database for keys matching the search description. */
gpg_error_t keydb_search (KEYDB_HANDLE hd, KEYDB_SEARCH_DESC *desc,
size_t ndesc, size_t *descindex);
-/* Return the first non-legacy key in the database.
-
- If you want the very first key in the database, you can directly
- call keydb_search with the search description
- KEYDB_SEARCH_MODE_FIRST. */
+/* Return the first non-legacy key in the database. */
gpg_error_t keydb_search_first (KEYDB_HANDLE hd);
-/* Return the next key (not the next matching key!).
-
- Unlike calling keydb_search with KEYDB_SEARCH_MODE_NEXT, this
- function silently skips legacy keys. */
+/* Return the next key (not the next matching key!). */
gpg_error_t keydb_search_next (KEYDB_HANDLE hd);
/* This is a convenience function for searching for keys with a long
- key id.
-
- Note: this function resumes searching where the last search left
- off. If you want to search the whole database, then you need to
- first call keydb_search_reset(). */
+ key id. */
gpg_error_t keydb_search_kid (KEYDB_HANDLE hd, u32 *kid);
/* This is a convenience function for searching for keys with a long
- (20 byte) fingerprint.
-
- Note: this function resumes searching where the last search left
- off. If you want to search the whole database, then you need to
- first call keydb_search_reset(). */
+ (20 byte) fingerprint. */
gpg_error_t keydb_search_fpr (KEYDB_HANDLE hd, const byte *fpr);
@@ -358,8 +227,7 @@ void show_revocation_reason( PKT_public_key *pk, int mode );
int check_signatures_trust( PKT_signature *sig );
void release_pk_list (PK_LIST pk_list);
-int build_pk_list (ctrl_t ctrl,
- strlist_t rcpts, PK_LIST *ret_pk_list, unsigned use);
+int build_pk_list (ctrl_t ctrl, strlist_t rcpts, PK_LIST *ret_pk_list);
gpg_error_t find_and_check_key (ctrl_t ctrl,
const char *name, unsigned int use,
int mark_hidden, pk_list_t *pk_list_addr);
@@ -410,179 +278,65 @@ char *gpg_format_keydesc (PKT_public_key *pk, int mode, int escaped);
/*-- getkey.c --*/
-/* Cache a copy of a public key in the public key cache. PK is not
- cached if caching is disabled (via getkey_disable_caches), if
- PK->FLAGS.DONT_CACHE is set, we don't know how to derive a key id
- from the public key (e.g., unsupported algorithm), or a key with
- the key id is already in the cache.
-
- The public key packet is copied into the cache using
- copy_public_key. Thus, any secret parts are not copied, for
- instance.
-
- This cache is filled by get_pubkey and is read by get_pubkey and
- get_pubkey_fast. */
+/* Cache a copy of a public key in the public key cache. */
void cache_public_key( PKT_public_key *pk );
-/* Disable and drop the public key cache (which is filled by
- cache_public_key and get_pubkey). Note: there is currently no way
- to reenable this cache. */
+/* Disable and drop the public key cache. */
void getkey_disable_caches(void);
-/* Return the public key with the key id KEYID and store it in *PK.
- The resources in *PK should be released using
- release_public_key_parts(). This function also stores a copy of
- the public key in the user id cache (see cache_public_key).
+/* Return the public key with the key id KEYID and store it at PK. */
+int get_pubkey( PKT_public_key *pk, u32 *keyid );
- If PK is NULL, this function just stores the public key in the
- cache and returns the usual return code.
+/* Similar to get_pubkey, but it does not take PK->REQ_USAGE into
+ account nor does it merge in the self-signed data. This function
+ also only considers primary keys. */
+int get_pubkey_fast (PKT_public_key *pk, u32 *keyid);
- PK->REQ_USAGE (which is a mask of PUBKEY_USAGE_SIG,
- PUBKEY_USAGE_ENC and PUBKEY_USAGE_CERT) is passed through to the
- lookup function. If this is non-zero, only keys with the specified
- usage will be returned. As such, it is essential that
- PK->REQ_USAGE be correctly initialized!
+/* Return the key block for the key with KEYID. */
+kbnode_t get_pubkeyblock (u32 *keyid);
- Returns 0 on success, GPG_ERR_NO_PUBKEY if there is no public key
- with the specified key id, or another error code if an error
- occurs.
+/* A list used by get_pubkeys to gather all of the matches. */
+struct pubkey_s
+{
+ struct pubkey_s *next;
+ /* The key to use (either the public key or the subkey). */
+ PKT_public_key *pk;
+ kbnode_t keyblock;
+};
+typedef struct pubkey_s *pubkey_t;
- If the data was not read from the cache, then the self-signed data
- has definitely been merged into the public key using
- merge_selfsigs. */
-int get_pubkey( PKT_public_key *pk, u32 *keyid );
+/* Free a single key. This does not remove key from any list! */
+void pubkey_free (pubkey_t key);
-/* Similar to get_pubkey, but it does not take PK->REQ_USAGE into
- account nor does it merge in the self-signed data. This function
- also only considers primary keys. It is intended to be used as a
- quick check of the key to avoid recursion. It should only be used
- in very certain cases. Like get_pubkey and unlike any of the other
- lookup functions, this function also consults the user id cache
- (see cache_public_key).
-
- Return the public key in *PK. The resources in *PK should be
- released using release_public_key_parts(). */
-int get_pubkey_fast ( PKT_public_key *pk, u32 *keyid );
-
-/* Return the key block for the key with key id KEYID or NULL, if an
- error occurs. Use release_kbnode() to release the key block.
-
- The self-signed data has already been merged into the public key
- using merge_selfsigs. */
-KBNODE get_pubkeyblock( u32 *keyid );
-
-/* Find a public key identified by the name NAME.
-
- If name appears to be a valid valid RFC822 mailbox (i.e., email
- address) and auto key lookup is enabled (no_akl == 0), then the
- specified auto key lookup methods (--auto-key-lookup) are used to
- import the key into the local keyring. Otherwise, just the local
- keyring is consulted.
-
-
- If RETCTX is not NULL, then the constructed context is returned in
- *RETCTX so that getpubkey_next can be used to get subsequent
- results. In this case, getkey_end() must be used to free the
- search context. If RETCTX is not NULL, then RET_KDBHD must be
- NULL.
-
- If PK is not NULL, the public key of the first result is returned
- in *PK. Note: PK->REQ_USAGE must be valid!!! PK->REQ_USAGE is
- passed through to the lookup function and is a mask of
- PUBKEY_USAGE_SIG, PUBKEY_USAGE_ENC and PUBKEY_USAGE_CERT. If this
- is non-zero, only keys with the specified usage will be returned.
- Note: The self-signed data has already been merged into the public
- key using merge_selfsigs. Free *PK by calling
- release_public_key_parts (or, if PK was allocated using xfree, you
- can use free_public_key, which calls release_public_key_parts(PK)
- and then xfree(PK)).
-
- NAME is a string, which is turned into a search query using
- classify_user_id.
-
- If RET_KEYBLOCK is not NULL, the keyblock is returned in
- *RET_KEYBLOCK. This should be freed using release_kbnode().
-
- If RET_KDBHD is not NULL, then the new database handle used to
- conduct the search is returned in *RET_KDBHD. This can be used to
- get subsequent results using keydb_search_next or to modify the
- returned record. Note: in this case, no advanced filtering is done
- for subsequent results (e.g., PK->REQ_USAGE is not respected).
- Unlike RETCTX, this is always returned.
-
- If INCLUDE_UNUSABLE is set, then unusable keys (see the
- documentation for skip_unusable for an exact definition) are
- skipped unless they are looked up by key id or by fingerprint.
-
- If NO_AKL is set, then the auto key locate functionality is
- disabled and only the local key ring is considered. Note: the
- local key ring is consulted even if local is not in the
- --auto-key-locate option list!
-
- This function returns 0 on success. Otherwise, an error code is
- returned. In particular, GPG_ERR_NO_PUBKEY or GPG_ERR_NO_SECKEY
- (if want_secret is set) is returned if the key is not found. */
+/* Free a list of public keys. */
+void pubkeys_free (pubkey_t keys);
+
+/* Returns all keys that match the search specfication SEARCH_TERMS.
+ The returned keys should be freed using pubkeys_free. */
+gpg_error_t
+get_pubkeys (ctrl_t ctrl,
+ char *search_terms, int use, int include_unusable, char *source,
+ int warn_possibly_ambiguous,
+ pubkey_t *r_keys);
+
+/* Find a public key identified by NAME. */
int get_pubkey_byname (ctrl_t ctrl,
GETKEY_CTX *retctx, PKT_public_key *pk,
const char *name,
KBNODE *ret_keyblock, KEYDB_HANDLE *ret_kdbhd,
int include_unusable, int no_akl );
-/* Return the public key with the key id KEYID and store it in *PK.
- The resources should be released using release_public_key_parts().
-
- Unlike other lookup functions, PK may not be NULL. PK->REQ_USAGE
- is passed through to the lookup function and is a mask of
- PUBKEY_USAGE_SIG, PUBKEY_USAGE_ENC and PUBKEY_USAGE_CERT. Thus, it
- must be valid! If this is non-zero, only keys with the specified
- usage will be returned.
-
- Returns 0 on success. If a public key with the specified key id is
- not found or a secret key is not available for that public key, an
- error code is returned. Note: this function ignores legacy keys.
- An error code is also return if an error occurs.
-
- The self-signed data has already been merged into the public key
- using merge_selfsigs. */
+/* Return the public key with the key id KEYID iff the secret key is
+ * available and store it at PK. */
gpg_error_t get_seckey (PKT_public_key *pk, u32 *keyid);
-/* Lookup a key with the specified fingerprint.
-
- If PK is not NULL, the public key of the first result is returned
- in *PK. Note: this function does an exact search and thus the
- returned public key may be a subkey rather than the primary key.
- Note: The self-signed data has already been merged into the public
- key using merge_selfsigs. Free *PK by calling
- release_public_key_parts (or, if PK was allocated using xfree, you
- can use free_public_key, which calls release_public_key_parts(PK)
- and then xfree(PK)).
-
- If PK->REQ_USAGE is set, it is used to filter the search results.
- (Thus, if PK is not NULL, PK->REQ_USAGE must be valid!!!) See the
- documentation for finish_lookup to understand exactly how this is
- used.
-
- If R_KEYBLOCK is not NULL, then the first result's keyblock is
- returned in *R_KEYBLOCK. This should be freed using
- release_kbnode().
-
- FPRINT is a byte array whose contents is the fingerprint to use as
- the search term. FPRINT_LEN specifies the length of the
- fingerprint (in bytes). Currently, only 16 and 20-byte
- fingerprints are supported. */
+/* Lookup a key with the specified fingerprint. */
int get_pubkey_byfprint (PKT_public_key *pk, kbnode_t *r_keyblock,
const byte *fprint, size_t fprint_len);
/* This function is similar to get_pubkey_byfprint, but it doesn't
merge the self-signed data into the public key and subkeys or into
- the user ids. It also doesn't add the key to the user id cache.
- Further, this function ignores PK->REQ_USAGE.
-
- This function is intended to avoid recursion and, as such, should
- only be used in very specific situations.
-
- Like get_pubkey_byfprint, PK may be NULL. In that case, this
- function effectively just checks for the existence of the key. */
+ the user ids. */
int get_pubkey_byfprint_fast (PKT_public_key *pk,
const byte *fprint, size_t fprint_len);
@@ -594,189 +348,40 @@ int have_secret_key_with_kid (u32 *keyid);
of when the option is given) that is available. */
const char *parse_def_secret_key (ctrl_t ctrl);
-/* Look up a secret key.
-
- If PK is not NULL, the public key of the first result is returned
- in *PK. Note: PK->REQ_USAGE must be valid!!! If PK->REQ_USAGE is
- set, it is used to filter the search results. See the
- documentation for finish_lookup to understand exactly how this is
- used. Note: The self-signed data has already been merged into the
- public key using merge_selfsigs. Free *PK by calling
- release_public_key_parts (or, if PK was allocated using xfree, you
- can use free_public_key, which calls release_public_key_parts(PK)
- and then xfree(PK)).
-
- If --default-key was set, then the specified key is looked up. (In
- this case, the default key is returned even if it is considered
- unusable. See the documentation for skip_unusable for exactly what
- this means.)
-
- Otherwise, this initiates a DB scan that returns all keys that are
- usable (see previous paragraph for exactly what usable means) and
- for which a secret key is available.
-
- This function returns the first match. Additional results can be
- returned using getkey_next. */
+/* Look up a secret key. */
gpg_error_t get_seckey_default (ctrl_t ctrl, PKT_public_key *pk);
-/* Search for keys matching some criteria.
-
- If RETCTX is not NULL, then the constructed context is returned in
- *RETCTX so that getpubkey_next can be used to get subsequent
- results. In this case, getkey_end() must be used to free the
- search context. If RETCTX is not NULL, then RET_KDBHD must be
- NULL.
-
- If PK is not NULL, the public key of the first result is returned
- in *PK. Note: PK->REQ_USAGE must be valid!!! If PK->REQ_USAGE is
- set, it is used to filter the search results. See the
- documentation for finish_lookup to understand exactly how this is
- used. Note: The self-signed data has already been merged into the
- public key using merge_selfsigs. Free *PK by calling
- release_public_key_parts (or, if PK was allocated using xfree, you
- can use free_public_key, which calls release_public_key_parts(PK)
- and then xfree(PK)).
-
- If NAMES is not NULL, then a search query is constructed using
- classify_user_id on each of the strings in the list. (Recall: the
- database does an OR of the terms, not an AND.) If NAMES is
- NULL, then all results are returned.
-
- If WANT_SECRET is set, then only keys with an available secret key
- (either locally or via key registered on a smartcard) are returned.
-
- This function does not skip unusable keys (see the documentation
- for skip_unusable for an exact definition).
-
- If RET_KEYBLOCK is not NULL, the keyblock is returned in
- *RET_KEYBLOCK. This should be freed using release_kbnode().
-
- This function returns 0 on success. Otherwise, an error code is
- returned. In particular, GPG_ERR_NO_PUBKEY or GPG_ERR_NO_SECKEY
- (if want_secret is set) is returned if the key is not found. */
+/* Search for keys matching some criteria. */
gpg_error_t getkey_bynames (getkey_ctx_t *retctx, PKT_public_key *pk,
strlist_t names, int want_secret,
kbnode_t *ret_keyblock);
-/* Search for keys matching some criteria.
-
- If RETCTX is not NULL, then the constructed context is returned in
- *RETCTX so that getpubkey_next can be used to get subsequent
- results. In this case, getkey_end() must be used to free the
- search context. If RETCTX is not NULL, then RET_KDBHD must be
- NULL.
-
- If PK is not NULL, the public key of the first result is returned
- in *PK. Note: PK->REQ_USAGE must be valid!!! If PK->REQ_USAGE is
- set, it is used to filter the search results. See the
- documentation for finish_lookup to understand exactly how this is
- used. Note: The self-signed data has already been merged into the
- public key using merge_selfsigs. Free *PK by calling
- release_public_key_parts (or, if PK was allocated using xfree, you
- can use free_public_key, which calls release_public_key_parts(PK)
- and then xfree(PK)).
-
- If NAME is not NULL, then a search query is constructed using
- classify_user_id on the string. In this case, even unusable keys
- (see the documentation for skip_unusable for an exact definition of
- unusable) are returned. Otherwise, if --default-key was set, then
- that key is returned (even if it is unusable). If neither of these
- conditions holds, then the first usable key is returned.
-
- If WANT_SECRET is set, then only keys with an available secret key
- (either locally or via key registered on a smartcard) are returned.
-
- This function does not skip unusable keys (see the documentation
- for skip_unusable for an exact definition).
-
- If RET_KEYBLOCK is not NULL, the keyblock is returned in
- *RET_KEYBLOCK. This should be freed using release_kbnode().
-
- This function returns 0 on success. Otherwise, an error code is
- returned. In particular, GPG_ERR_NO_PUBKEY or GPG_ERR_NO_SECKEY
- (if want_secret is set) is returned if the key is not found.
-
- FIXME: We also have the get_pubkey_byname function which has a
- different semantic. Should be merged with this one. */
+/* Search for one key matching some criteria. */
gpg_error_t getkey_byname (ctrl_t ctrl,
getkey_ctx_t *retctx, PKT_public_key *pk,
const char *name, int want_secret,
kbnode_t *ret_keyblock);
-/* Return the next search result.
-
- If PK is not NULL, the public key of the next result is returned in
- *PK. Note: The self-signed data has already been merged into the
- public key using merge_selfsigs. Free *PK by calling
- release_public_key_parts (or, if PK was allocated using xfree, you
- can use free_public_key, which calls release_public_key_parts(PK)
- and then xfree(PK)).
-
- The self-signed data has already been merged into the public key
- using merge_selfsigs. */
+/* Return the next search result. */
gpg_error_t getkey_next (getkey_ctx_t ctx, PKT_public_key *pk,
kbnode_t *ret_keyblock);
-/* Release any resources used by a key listing content. This must be
- called on the context returned by, e.g., getkey_byname. */
+/* Release any resources used by a key listing context. */
void getkey_end (getkey_ctx_t ctx);
/* Return the database handle used by this context. The context still
owns the handle. */
KEYDB_HANDLE get_ctx_handle(GETKEY_CTX ctx);
-/* Enumerate some secret keys (specifically, those specified with
- --default-key and --try-secret-key). Use the following procedure:
-
- 1) Initialize a void pointer to NULL
- 2) Pass a reference to this pointer to this function (content)
- and provide space for the secret key (sk)
- 3) Call this function as long as it does not return an error (or
- until you are done). The error code GPG_ERR_EOF indicates the
- end of the listing.
- 4) Call this function a last time with SK set to NULL,
- so that can free it's context.
-
- In pseudo-code:
-
- void *ctx = NULL;
- PKT_public_key *sk = xmalloc_clear (sizeof (*sk));
- gpg_error_t err;
-
- while ((err = enum_secret_keys (&ctx, sk)))
- {
- // Process SK.
-
- if (done)
- break;
-
- free_public_key (sk);
- sk = xmalloc_clear (sizeof (*sk));
- }
-
- // Release any resources used by CTX.
- enum_secret_keys (&ctx, NULL);
- free_public_key (sk);
-
- if (gpg_err_code (err) != GPG_ERR_EOF)
- ; // An error occurred.
- */
+/* Enumerate some secret keys. */
gpg_error_t enum_secret_keys (ctrl_t ctrl, void **context, PKT_public_key *pk);
-/* Set the mainkey_id fields for all keys in KEYBLOCK. This is
- usually done by merge_selfsigs but at some places we only need the
- main_kid not a full merge. The function also guarantees that all
- pk->keyids are computed. */
+/* Set the mainkey_id fields for all keys in KEYBLOCK. */
void setup_main_keyids (kbnode_t keyblock);
-/* KEYBLOCK corresponds to a public key block. This function merges
- much of the information from the self-signed data into the public
- key, public subkey and user id data structures. If you use the
- high-level search API (e.g., get_pubkey) for looking up key blocks,
- then you don't need to call this function. This function is
- useful, however, if you change the keyblock, e.g., by adding or
- removing a self-signed data packet. */
-void merge_keys_and_selfsig( KBNODE keyblock );
+/* This function merges information from the self-signed data into the
+ data structures. */
+void merge_keys_and_selfsig (kbnode_t keyblock);
char*get_user_id_string_native( u32 *keyid );
char*get_long_user_id_string( u32 *keyid );
diff --git a/g10/keyedit.c b/g10/keyedit.c
index 0a4766e..30f52a4 100644
--- a/g10/keyedit.c
+++ b/g10/keyedit.c
@@ -363,7 +363,13 @@ check_all_keysigs (KBNODE keyblock, int only_selected, int only_selfsigs)
if (only_selfsigs
&& !(keyid[0] == sig->keyid[0] && keyid[1] == sig->keyid[1]))
- ; /* Not a selfsig but we want only selfsigs - skip. */
+ {
+ /* Not a selfsig but we want only selfsigs - skip. */
+ /* Static analyzer note: A claim that KEYID above has
+ garbage is not correct because KEYID is set from the
+ public key packet which is always the first packet in
+ a keyblock and thus parsed before this signature. */
+ }
else if (print_and_check_one_sig (keyblock, node, &inv_sigs,
&no_key, &oth_err, &selfsig,
0, only_selfsigs))
@@ -376,23 +382,25 @@ check_all_keysigs (KBNODE keyblock, int only_selected, int only_selfsigs)
}
if (!has_selfsig)
mis_selfsig++;
- if (inv_sigs == 1)
- tty_printf (_("1 bad signature\n"));
- else if (inv_sigs)
- tty_printf (_("%d bad signatures\n"), inv_sigs);
- if (no_key == 1)
- tty_printf (_("1 signature not checked due to a missing key\n"));
- else if (no_key)
- tty_printf (_("%d signatures not checked due to missing keys\n"), no_key);
- if (oth_err == 1)
- tty_printf (_("1 signature not checked due to an error\n"));
- else if (oth_err)
- tty_printf (_("%d signatures not checked due to errors\n"), oth_err);
- if (mis_selfsig == 1)
- tty_printf (_("1 user ID without valid self-signature detected\n"));
- else if (mis_selfsig)
- tty_printf (_("%d user IDs without valid self-signatures detected\n"),
- mis_selfsig);
+
+ if (inv_sigs)
+ tty_printf (ngettext("%d bad signature\n",
+ "%d bad signatures\n", inv_sigs), inv_sigs);
+
+ if (no_key)
+ tty_printf (ngettext("%d signature not checked due to a missing key\n",
+ "%d signatures not checked due to missing keys\n",
+ no_key), no_key);
+
+ if (oth_err)
+ tty_printf (ngettext("%d signature not checked due to an error\n",
+ "%d signatures not checked due to errors\n",
+ oth_err), oth_err);
+
+ if (mis_selfsig)
+ tty_printf (ngettext("%d user ID without valid self-signature detected\n",
+ "%d user IDs without valid self-signatures detected\n",
+ mis_selfsig), mis_selfsig);
return inv_sigs || no_key || oth_err || mis_selfsig;
}
@@ -856,6 +864,14 @@ sign_uids (ctrl_t ctrl, estream_t fp,
if (primary_pk->expiredate && !selfsig)
{
+ /* Static analyzer note: A claim that PRIMARY_PK might be
+ NULL is not correct because it set from the public key
+ packet which is always the first packet in a keyblock and
+ parsed in the above loop over the keyblock. In case the
+ keyblock has no packets at all and thus the loop was not
+ entered the above count_uids_with_flag would have
+ detected this case. */
+
u32 now = make_timestamp ();
if (primary_pk->expiredate <= now)
@@ -1181,7 +1197,7 @@ change_passphrase (ctrl_t ctrl, kbnode_t keyblock)
}
/* Change the passphrase for all keys. */
- for (any = 0, node = keyblock; node; node = node->next)
+ for (node = keyblock; node; node = node->next)
{
if (node->pkt->pkttype == PKT_PUBLIC_KEY
|| node->pkt->pkttype == PKT_PUBLIC_SUBKEY)
@@ -1352,7 +1368,7 @@ enum cmdids
#endif /*!NO_TRUST_MODELS*/
cmdSHOWPREF,
cmdSETPREF, cmdPREFKS, cmdNOTATION, cmdINVCMD, cmdSHOWPHOTO, cmdUPDTRUST,
- cmdCHKTRUST, cmdADDCARDKEY, cmdKEYTOCARD, cmdBKUPTOCARD, cmdCHECKBKUPKEY,
+ cmdCHKTRUST, cmdADDCARDKEY, cmdKEYTOCARD, cmdBKUPTOCARD,
cmdCLEAN, cmdMINIMIZE, cmdGRIP, cmdNOP
};
@@ -1404,7 +1420,6 @@ static struct
N_("move a key to a smartcard")},
{ "bkuptocard", cmdBKUPTOCARD, KEYEDIT_NEED_SK | KEYEDIT_ONLY_SK,
N_("move a backup key to a smartcard")},
- { "checkbkupkey", cmdCHECKBKUPKEY, KEYEDIT_NEED_SK | KEYEDIT_ONLY_SK, NULL},
#endif /*ENABLE_CARD_SUPPORT */
{ "delkey", cmdDELKEY, KEYEDIT_NOT_SK, N_("delete selected subkeys")},
{ "addrevoker", cmdADDREVOKER, KEYEDIT_NOT_SK | KEYEDIT_NEED_SK,
@@ -1921,24 +1936,28 @@ keyedit_menu (ctrl_t ctrl, const char *username, strlist_t locusr,
break;
case cmdBKUPTOCARD:
- case cmdCHECKBKUPKEY:
- log_debug ("FIXME: This needs to be changed\n");
{
/* Ask for a filename, check whether this is really a
backup key as generated by the card generation, parse
that key and store it on card. */
KBNODE node;
- const char *fname;
+ char *fname;
PACKET *pkt;
IOBUF a;
- fname = arg_string;
- if (!*fname)
+ if (!*arg_string)
{
tty_printf (_("Command expects a filename argument\n"));
break;
}
+ if (*arg_string == DIRSEP_C)
+ fname = xstrdup (arg_string);
+ else if (*arg_string == '~')
+ fname = make_filename (arg_string, NULL);
+ else
+ fname = make_filename (opt.homedir, arg_string, NULL);
+
/* Open that file. */
a = iobuf_open (fname);
if (a && is_secured_file (iobuf_get_fd (a)))
@@ -1947,12 +1966,13 @@ keyedit_menu (ctrl_t ctrl, const char *username, strlist_t locusr,
a = NULL;
gpg_err_set_errno (EPERM);
}
- if (!a)
- {
- tty_printf (_("Can't open '%s': %s\n"),
- fname, strerror (errno));
- break;
- }
+ if (!a)
+ {
+ tty_printf (_("Can't open '%s': %s\n"),
+ fname, strerror (errno));
+ xfree (fname);
+ break;
+ }
/* Parse and check that file. */
pkt = xmalloc (sizeof *pkt);
@@ -1963,49 +1983,34 @@ keyedit_menu (ctrl_t ctrl, const char *username, strlist_t locusr,
if (!err && pkt->pkttype != PKT_SECRET_KEY
&& pkt->pkttype != PKT_SECRET_SUBKEY)
err = GPG_ERR_NO_SECKEY;
- if (err)
- {
- tty_printf (_("Error reading backup key from '%s': %s\n"),
- fname, gpg_strerror (err));
- free_packet (pkt);
- xfree (pkt);
- break;
- }
+ if (err)
+ {
+ tty_printf (_("Error reading backup key from '%s': %s\n"),
+ fname, gpg_strerror (err));
+ xfree (fname);
+ free_packet (pkt);
+ xfree (pkt);
+ break;
+ }
+
+ xfree (fname);
node = new_kbnode (pkt);
- if (cmd == cmdCHECKBKUPKEY)
- {
- /* PKT_public_key *sk = node->pkt->pkt.secret_key; */
- /* switch (is_secret_key_protected (sk)) */
- /* { */
- /* case 0: /\* Not protected. *\/ */
- /* tty_printf (_("This key is not protected.\n")); */
- /* break; */
- /* case -1: */
- /* log_error (_("unknown key protection algorithm\n")); */
- /* break; */
- /* default: */
- /* if (sk->protect.s2k.mode == 1001) */
- /* tty_printf (_("Secret parts of key" */
- /* " are not available.\n")); */
- /* if (sk->protect.s2k.mode == 1002) */
- /* tty_printf (_("Secret parts of key" */
- /* " are stored on-card.\n")); */
- /* else */
- /* check_secret_key (sk, 0); */
- /* } */
- }
- else /* Store it. */
- {
- if (card_store_subkey (node, 0))
- {
- redisplay = 1;
- sec_shadowing = 1;
- }
- }
- release_kbnode (node);
- }
- break;
+ /* Transfer it to gpg-agent which handles secret keys. */
+ err = transfer_secret_keys (ctrl, NULL, node, 1, 1);
+
+ /* Treat the pkt as a public key. */
+ pkt->pkttype = PKT_PUBLIC_KEY;
+
+ /* Ask gpg-agent to store the secret key to card. */
+ if (card_store_subkey (node, 0))
+ {
+ redisplay = 1;
+ sec_shadowing = 1;
+ }
+ release_kbnode (node);
+ }
+ break;
#endif /* ENABLE_CARD_SUPPORT */
@@ -2388,7 +2393,7 @@ keyedit_quick_adduid (ctrl_t ctrl, const char *username, const char *newuid)
kdbhd = keydb_new ();
if (!kdbhd)
{
- err = gpg_error_from_syserror ();
+ /* Note that keydb_new has already used log_error. */
goto leave;
}
@@ -3233,9 +3238,10 @@ show_key_with_all_names (ctrl_t ctrl, estream_t fp,
opt.legacy_list_mode?
((int) keystrlen () + 13):5, "");
/* Ownertrust is only meaningful for the PGP or
- classic trust models */
+ classic trust models, or PGP combined with TOFU */
if (opt.trust_model == TM_PGP
- || opt.trust_model == TM_CLASSIC)
+ || opt.trust_model == TM_CLASSIC
+ || opt.trust_model == TM_TOFU_PGP)
{
int width = 14 - strlen (otrust);
if (width <= 0)
@@ -3718,8 +3724,8 @@ menu_delsig (KBNODE pub_keyblock)
if (changed)
{
commit_kbnode (&pub_keyblock);
- tty_printf (changed == 1 ? _("Deleted %d signature.\n")
- : _("Deleted %d signatures.\n"), changed);
+ tty_printf (ngettext("Deleted %d signature.\n",
+ "Deleted %d signatures.\n", changed), changed);
}
else
tty_printf (_("Nothing deleted.\n"));
@@ -3765,11 +3771,9 @@ menu_clean (KBNODE keyblock, int self_only)
}
else if (sigs)
{
- tty_printf (sigs == 1 ?
- _("User ID \"%s\": %d signature removed\n") :
- _("User ID \"%s\": %d signatures removed\n"),
- user, sigs);
-
+ tty_printf (ngettext("User ID \"%s\": %d signature removed\n",
+ "User ID \"%s\": %d signatures removed\n",
+ sigs), user, sigs);
modified = 1;
}
else
diff --git a/g10/keygen.c b/g10/keygen.c
index a1f449e..0f7a6a0 100644
--- a/g10/keygen.c
+++ b/g10/keygen.c
@@ -141,9 +141,6 @@ static int write_keyblock (iobuf_t out, kbnode_t node);
static gpg_error_t gen_card_key (int algo, int keyno, int is_primary,
kbnode_t pub_root,
u32 *timestamp, u32 expireval);
-static int gen_card_key_with_backup (int algo, int keyno, int is_primary,
- kbnode_t pub_root, u32 timestamp,
- u32 expireval, struct para_data_s *para);
static void
@@ -2009,15 +2006,13 @@ ask_algo (ctrl_t ctrl, int addmode, int *r_subkey_algo, unsigned int *r_usage,
static unsigned
ask_keysize (int algo, unsigned int primary_keysize)
{
- unsigned int nbits, min, def = DEFAULT_STD_KEYSIZE, max=4096;
+ unsigned int nbits;
+ unsigned int min = 1024;
+ unsigned int def = DEFAULT_STD_KEYSIZE;
+ unsigned int max = 4096;
int for_subkey = !!primary_keysize;
int autocomp = 0;
- if(opt.expert)
- min=512;
- else
- min=1024;
-
if (primary_keysize && !opt.expert)
{
/* Deduce the subkey size from the primary key size. */
@@ -2032,9 +2027,11 @@ ask_keysize (int algo, unsigned int primary_keysize)
goto leave;
}
+ /* Deviations from the standard values. */
switch(algo)
{
case PUBKEY_ALGO_DSA:
+ min = opt.expert? 768 : 1024;
def=2048;
max=3072;
break;
@@ -2051,10 +2048,6 @@ ask_keysize (int algo, unsigned int primary_keysize)
def=255;
max=441;
break;
-
- case PUBKEY_ALGO_RSA:
- min=1024;
- break;
}
tty_printf(_("%s keys may be between %u and %u bits long.\n"),
@@ -2249,10 +2242,7 @@ ask_curve (int *algo, int *subkey_algo)
&& curves[idx].fix_curve)
{
if (subkey_algo && *subkey_algo == PUBKEY_ALGO_ECDSA)
- {
- *subkey_algo = PUBKEY_ALGO_EDDSA;
- result = xstrdup ("Ed25519");
- }
+ *subkey_algo = PUBKEY_ALGO_EDDSA;
*algo = PUBKEY_ALGO_EDDSA;
result = xstrdup ("Ed25519");
}
@@ -2543,8 +2533,11 @@ ask_user_id (int mode, int full, KBNODE keyblock)
}
else if( digitp(aname) )
tty_printf(_("Name may not start with a digit\n"));
- else if( strlen(aname) < 5 )
+ else if (*aname && strlen (aname) < 5)
+ {
tty_printf(_("Name must be at least 5 characters long\n"));
+ /* However, we allow an empty name. */
+ }
else
break;
}
@@ -2587,11 +2580,20 @@ ask_user_id (int mode, int full, KBNODE keyblock)
xfree(uid);
uid = p = xmalloc(strlen(aname)+strlen(amail)+strlen(acomment)+12+10);
- p = stpcpy(p, aname );
- if( *acomment )
- p = stpcpy(stpcpy(stpcpy(p," ("), acomment),")");
- if( *amail )
- p = stpcpy(stpcpy(stpcpy(p," <"), amail),">");
+ if (!*aname && *amail && !*acomment && !random_is_faked ())
+ { /* Empty name and comment but with mail address. Use
+ simplified form with only the non-angle-bracketed mail
+ address. */
+ p = stpcpy (p, amail);
+ }
+ else
+ {
+ p = stpcpy (p, aname );
+ if (*acomment)
+ p = stpcpy(stpcpy(stpcpy(p," ("), acomment),")");
+ if (*amail)
+ p = stpcpy(stpcpy(stpcpy(p," <"), amail),">");
+ }
/* Append a warning if the RNG is switched into fake mode. */
if ( random_is_faked () )
@@ -2704,56 +2706,6 @@ ask_user_id (int mode, int full, KBNODE keyblock)
}
-/* MODE 0 - standard
- 1 - Ask for passphrase of the card backup key. */
-#if 0
-static DEK *
-do_ask_passphrase (STRING2KEY **ret_s2k, int mode, int *r_canceled)
-{
- DEK *dek = NULL;
- STRING2KEY *s2k;
- const char *errtext = NULL;
- const char *custdesc = NULL;
-
- tty_printf(_("You need a Passphrase to protect your secret key.\n\n") );
-
- if (mode == 1)
- custdesc = _("Please enter a passphrase to protect the off-card "
- "backup of the new encryption key.");
-
- s2k = xmalloc_secure( sizeof *s2k );
- for(;;) {
- s2k->mode = opt.s2k_mode;
- s2k->hash_algo = S2K_DIGEST_ALGO;
- dek = passphrase_to_dek_ext (NULL, 0, opt.s2k_cipher_algo, s2k, 2,
- errtext, custdesc, NULL, r_canceled);
- if (!dek && *r_canceled) {
- xfree(dek); dek = NULL;
- xfree(s2k); s2k = NULL;
- break;
- }
- else if( !dek ) {
- errtext = N_("passphrase not correctly repeated; try again");
- tty_printf(_("%s.\n"), _(errtext));
- }
- else if( !dek->keylen ) {
- xfree(dek); dek = NULL;
- xfree(s2k); s2k = NULL;
- tty_printf(_(
- "You don't want a passphrase - this is probably a *bad* idea!\n"
- "I will do it anyway. You can change your passphrase at any time,\n"
- "using this program with the option \"--edit-key\".\n\n"));
- break;
- }
- else
- break; /* okay */
- }
- *ret_s2k = s2k;
- return dek;
-}
-#endif /* 0 */
-
-
/* Basic key generation. Here we divert to the actual generation
routines based on the requested algorithm. */
static int
@@ -3179,6 +3131,7 @@ proc_parameter_file (ctrl_t ctrl, struct para_data_s *para, const char *fname,
}
else
{
+ r = get_parameter (para, pKEYSERVER);
log_error("%s:%d: invalid keyserver url\n", fname, r->lnr );
return -1;
}
@@ -3454,7 +3407,7 @@ quickgen_set_para (struct para_data_s *para, int for_subkey,
para = r;
r = xmalloc_clear (sizeof *r + 20);
r->key = for_subkey? pSUBKEYTYPE : pKEYTYPE;
- sprintf (r->u.value, "%d", algo);
+ snprintf (r->u.value, 20, "%d", algo);
r->next = para;
para = r;
@@ -3763,7 +3716,6 @@ generate_keypair (ctrl_t ctrl, int full, const char *fname,
|| algo == PUBKEY_ALGO_ECDH)
{
curve = ask_curve (&algo, NULL);
- nbits = 0;
r = xmalloc_clear (sizeof *r + strlen (curve));
r->key = pKEYCURVE;
strcpy (r->u.value, curve);
@@ -3853,114 +3805,161 @@ generate_keypair (ctrl_t ctrl, int full, const char *fname,
}
-#if 0 /* not required */
-/* Generate a raw key and return it as a secret key packet. The
- function will ask for the passphrase and return a protected as well
- as an unprotected copy of a new secret key packet. 0 is returned
- on success and the caller must then free the returned values. */
-static int
-generate_raw_key (int algo, unsigned int nbits, u32 created_at,
- PKT_secret_key **r_sk_unprotected,
- PKT_secret_key **r_sk_protected)
+/* Create and delete a dummy packet to start off a list of kbnodes. */
+static void
+start_tree(KBNODE *tree)
{
- int rc;
- DEK *dek = NULL;
- STRING2KEY *s2k = NULL;
- PKT_secret_key *sk = NULL;
- int i;
- size_t nskey, npkey;
- gcry_sexp_t s_parms, s_key;
- int canceled;
+ PACKET *pkt;
- npkey = pubkey_get_npkey (algo);
- nskey = pubkey_get_nskey (algo);
- assert (nskey <= PUBKEY_MAX_NSKEY && npkey < nskey);
+ pkt=xmalloc_clear(sizeof(*pkt));
+ pkt->pkttype=PKT_NONE;
+ *tree=new_kbnode(pkt);
+ delete_kbnode(*tree);
+}
- if (nbits < 512)
- {
- nbits = 512;
- log_info (_("keysize invalid; using %u bits\n"), nbits );
- }
- if ((nbits % 32))
+/* Write the *protected* secret key to the file. */
+static gpg_error_t
+card_write_key_to_backup_file (PKT_public_key *sk, const char *backup_dir)
+{
+ gpg_error_t err = 0;
+ int rc;
+ char name_buffer[50];
+ char *fname;
+ IOBUF fp;
+ mode_t oldmask;
+ PACKET *pkt = NULL;
+
+ keyid_from_pk (sk, NULL);
+ snprintf (name_buffer, sizeof name_buffer, "sk_%08lX%08lX.gpg",
+ (ulong)sk->keyid[0], (ulong)sk->keyid[1]);
+
+ fname = make_filename (backup_dir, name_buffer, NULL);
+ /* Note that the umask call is not anymore needed because
+ iobuf_create now takes care of it. However, it does not harm
+ and thus we keep it. */
+ oldmask = umask (077);
+ if (is_secured_filename (fname))
{
- nbits = ((nbits + 31) / 32) * 32;
- log_info(_("keysize rounded up to %u bits\n"), nbits );
+ fp = NULL;
+ gpg_err_set_errno (EPERM);
}
-
- dek = do_ask_passphrase (&s2k, 1, &canceled);
- if (canceled)
+ else
+ fp = iobuf_create (fname, 1);
+ umask (oldmask);
+ if (!fp)
{
- rc = gpg_error (GPG_ERR_CANCELED);
+ err = gpg_error_from_syserror ();
+ log_error (_("can't create backup file '%s': %s\n"), fname, strerror (errno) );
goto leave;
}
- sk = xmalloc_clear (sizeof *sk);
- sk->timestamp = created_at;
- sk->version = 4;
- sk->pubkey_algo = algo;
+ pkt = xcalloc (1, sizeof *pkt);
+ pkt->pkttype = PKT_SECRET_KEY;
+ pkt->pkt.secret_key = sk;
- if ( !is_RSA (algo) )
+ rc = build_packet (fp, pkt);
+ if (rc)
{
- log_error ("only RSA is supported for offline generated keys\n");
- rc = gpg_error (GPG_ERR_NOT_IMPLEMENTED);
- goto leave;
+ log_error ("build packet failed: %s\n", gpg_strerror (rc));
+ iobuf_cancel (fp);
}
- rc = gcry_sexp_build (&s_parms, NULL,
- "(genkey(rsa(nbits %d)))",
- (int)nbits);
+ else
+ {
+ char *fprbuf;
+
+ iobuf_close (fp);
+ iobuf_ioctl (NULL, IOBUF_IOCTL_INVALIDATE_CACHE, 0, (char*)fname);
+ log_info (_("Note: backup of card key saved to '%s'\n"), fname);
+
+ fprbuf = hexfingerprint (sk, NULL, 0);
+ write_status_text_and_buffer (STATUS_BACKUP_KEY_CREATED, fprbuf,
+ fname, strlen (fname), 0);
+ xfree (fprbuf);
+ }
+
+ leave:
+ xfree (pkt);
+ xfree (fname);
+ return err;
+}
+
+
+/* Store key to card and make a backup file in OpenPGP format. */
+static gpg_error_t
+card_store_key_with_backup (ctrl_t ctrl, PKT_public_key *sub_psk,
+ const char *backup_dir)
+{
+ PKT_public_key *sk;
+ gnupg_isotime_t timestamp;
+ gpg_error_t err;
+ char *hexgrip;
+ int rc;
+ struct agent_card_info_s info;
+ gcry_cipher_hd_t cipherhd = NULL;
+ char *cache_nonce = NULL;
+ void *kek = NULL;
+ size_t keklen;
+
+ sk = copy_public_key (NULL, sub_psk);
+ if (!sk)
+ return gpg_error_from_syserror ();
+
+ epoch2isotime (timestamp, (time_t)sk->timestamp);
+ err = hexkeygrip_from_pk (sk, &hexgrip);
+ if (err)
+ return err;
+
+ memset(&info, 0, sizeof (info));
+ rc = agent_scd_getattr ("SERIALNO", &info);
if (rc)
- log_bug ("gcry_sexp_build failed: %s\n", gpg_strerror (rc));
- rc = gcry_pk_genkey (&s_key, s_parms);
- gcry_sexp_release (s_parms);
+ return (gpg_error_t)rc;
+
+ rc = agent_keytocard (hexgrip, 2, 1, info.serialno, timestamp);
+ xfree (info.serialno);
if (rc)
{
- log_error ("gcry_pk_genkey failed: %s\n", gpg_strerror (rc) );
+ err = (gpg_error_t)rc;
goto leave;
}
- rc = key_from_sexp (sk->skey, s_key, "private-key", "nedpqu");
- gcry_sexp_release (s_key);
- if (rc)
+
+ err = agent_keywrap_key (ctrl, 1, &kek, &keklen);
+ if (err)
{
- log_error ("key_from_sexp failed: %s\n", gpg_strerror (rc) );
+ log_error ("error getting the KEK: %s\n", gpg_strerror (err));
goto leave;
}
- for (i=npkey; i < nskey; i++)
- sk->csum += checksum_mpi (sk->skey[i]);
-
- if (r_sk_unprotected)
- *r_sk_unprotected = copy_secret_key (NULL, sk);
-
- rc = genhelp_protect (dek, s2k, sk);
- if (rc)
- goto leave;
-
- if (r_sk_protected)
+ err = gcry_cipher_open (&cipherhd, GCRY_CIPHER_AES128, GCRY_CIPHER_MODE_AESWRAP, 0);
+ if (!err)
+ err = gcry_cipher_setkey (cipherhd, kek, keklen);
+ if (err)
{
- *r_sk_protected = sk;
- sk = NULL;
+ log_error ("error setting up an encryption context: %s\n", gpg_strerror (err));
+ goto leave;
}
- leave:
- if (sk)
- free_secret_key (sk);
- xfree (dek);
- xfree (s2k);
- return rc;
-}
-#endif /* ENABLE_CARD_SUPPORT */
+ err = receive_seckey_from_agent (ctrl, cipherhd, &cache_nonce, hexgrip, sk);
+ if (err)
+ {
+ log_error ("error getting secret key from agent: %s\n", gpg_strerror (err));
+ goto leave;
+ }
-/* Create and delete a dummy packet to start off a list of kbnodes. */
-static void
-start_tree(KBNODE *tree)
-{
- PACKET *pkt;
+ err = card_write_key_to_backup_file (sk, backup_dir);
+ if (err)
+ log_error ("writing card key to backup file: %s\n", gpg_strerror (err));
+ else
+ /* Remove secret key data in agent side. */
+ agent_scd_learn (NULL, 1);
- pkt=xmalloc_clear(sizeof(*pkt));
- pkt->pkttype=PKT_NONE;
- *tree=new_kbnode(pkt);
- delete_kbnode(*tree);
+ leave:
+ xfree (cache_nonce);
+ gcry_cipher_close (cipherhd);
+ xfree (kek);
+ xfree (hexgrip);
+ free_public_key (sk);
+ return err;
}
@@ -4095,7 +4094,8 @@ do_generate_keypair (ctrl_t ctrl, struct para_data_s *para,
if (!err && get_parameter (para, pSUBKEYTYPE))
{
sub_psk = NULL;
- if (!card)
+ s = NULL;
+ if (!card || (s = get_parameter_value (para, pCARDBACKUPKEY)))
{
err = do_create (get_parameter_algo (para, pSUBKEYTYPE, NULL),
get_parameter_uint (para, pSUBKEYLENGTH),
@@ -4103,7 +4103,7 @@ do_generate_keypair (ctrl_t ctrl, struct para_data_s *para,
pub_root,
timestamp,
get_parameter_u32 (para, pSUBKEYEXPIRE), 1,
- outctrl->keygen_flags,
+ s ? KEYGEN_FLAG_NO_PROTECTION : outctrl->keygen_flags,
get_parameter_passphrase (para),
&cache_nonce);
/* Get the pointer to the generated public subkey packet. */
@@ -4115,25 +4115,15 @@ do_generate_keypair (ctrl_t ctrl, struct para_data_s *para,
if (node->pkt->pkttype == PKT_PUBLIC_SUBKEY)
sub_psk = node->pkt->pkt.public_key;
assert (sub_psk);
+
+ if (s)
+ err = card_store_key_with_backup (ctrl, sub_psk, opt.homedir);
}
}
else
{
- if ((s = get_parameter_value (para, pCARDBACKUPKEY)))
- {
- /* A backup of the encryption key has been requested.
- Generate the key in software and import it then to
- the card. Write a backup file. */
- err = gen_card_key_with_backup
- (PUBKEY_ALGO_RSA, 2, 0, pub_root, timestamp,
- get_parameter_u32 (para, pKEYEXPIRE), para);
- }
- else
- {
- err = gen_card_key (PUBKEY_ALGO_RSA, 2, 0, pub_root,
- &timestamp,
- get_parameter_u32 (para, pKEYEXPIRE));
- }
+ err = gen_card_key (PUBKEY_ALGO_RSA, 2, 0, pub_root, &timestamp,
+ get_parameter_u32 (para, pKEYEXPIRE));
}
if (!err)
@@ -4577,259 +4567,3 @@ gen_card_key (int algo, int keyno, int is_primary, kbnode_t pub_root,
return gpg_error (GPG_ERR_NOT_SUPPORTED);
#endif /*!ENABLE_CARD_SUPPORT*/
}
-
-
-
-static int
-gen_card_key_with_backup (int algo, int keyno, int is_primary,
- KBNODE pub_root, u32 timestamp,
- u32 expireval, struct para_data_s *para)
-{
-#if ENABLE_CARD_SUPPORT && 0
- /* FIXME: Move this to gpg-agent. */
- int rc;
- const char *s;
- PACKET *pkt;
- PKT_secret_key *sk, *sk_unprotected = NULL, *sk_protected = NULL;
- PKT_public_key *pk;
- size_t n;
- int i;
- unsigned int nbits;
-
- /* Get the size of the key directly from the card. */
- {
- struct agent_card_info_s info;
-
- memset (&info, 0, sizeof info);
- if (!agent_scd_getattr ("KEY-ATTR", &info)
- && info.key_attr[1].algo)
- nbits = info.key_attr[1].nbits;
- else
- nbits = 1024; /* All pre-v2.0 cards. */
- agent_release_card_info (&info);
- }
-
- /* Create a key of this size in memory. */
- rc = generate_raw_key (algo, nbits, timestamp,
- &sk_unprotected, &sk_protected);
- if (rc)
- return rc;
-
- /* Store the key to the card. */
- rc = save_unprotected_key_to_card (sk_unprotected, keyno);
- if (rc)
- {
- log_error (_("storing key onto card failed: %s\n"), gpg_strerror (rc));
- free_secret_key (sk_unprotected);
- free_secret_key (sk_protected);
- write_status_errcode ("save_key_to_card", rc);
- return rc;
- }
-
- /* Get rid of the secret key parameters and store the serial numer. */
- sk = sk_unprotected;
- n = pubkey_get_nskey (sk->pubkey_algo);
- for (i=pubkey_get_npkey (sk->pubkey_algo); i < n; i++)
- {
- gcry_mpi_release (sk->skey[i]);
- sk->skey[i] = NULL;
- }
- i = pubkey_get_npkey (sk->pubkey_algo);
- sk->skey[i] = gcry_mpi_set_opaque (NULL, xstrdup ("dummydata"), 10*8);
- sk->is_protected = 1;
- sk->protect.s2k.mode = 1002;
- s = get_parameter_value (para, pSERIALNO);
- assert (s);
- for (sk->protect.ivlen=0; sk->protect.ivlen < 16 && *s && s[1];
- sk->protect.ivlen++, s += 2)
- sk->protect.iv[sk->protect.ivlen] = xtoi_2 (s);
-
- /* Now write the *protected* secret key to the file. */
- {
- char name_buffer[50];
- char *fname;
- IOBUF fp;
- mode_t oldmask;
-
- keyid_from_sk (sk, NULL);
- snprintf (name_buffer, sizeof name_buffer, "sk_%08lX%08lX.gpg",
- (ulong)sk->keyid[0], (ulong)sk->keyid[1]);
-
- fname = make_filename (backup_dir, name_buffer, NULL);
- /* Note that the umask call is not anymore needed because
- iobuf_create now takes care of it. However, it does not harm
- and thus we keep it. */
- oldmask = umask (077);
- if (is_secured_filename (fname))
- {
- fp = NULL;
- gpg_err_set_errno (EPERM);
- }
- else
- fp = iobuf_create (fname, 1);
- umask (oldmask);
- if (!fp)
- {
- rc = gpg_error_from_syserror ();
- log_error (_("can't create backup file '%s': %s\n"),
- fname, strerror(errno) );
- xfree (fname);
- free_secret_key (sk_unprotected);
- free_secret_key (sk_protected);
- return rc;
- }
-
- pkt = xcalloc (1, sizeof *pkt);
- pkt->pkttype = PKT_SECRET_KEY;
- pkt->pkt.secret_key = sk_protected;
- sk_protected = NULL;
-
- rc = build_packet (fp, pkt);
- if (rc)
- {
- log_error("build packet failed: %s\n", gpg_strerror (rc));
- iobuf_cancel (fp);
- }
- else
- {
- unsigned char array[MAX_FINGERPRINT_LEN];
- char *fprbuf, *p;
-
- iobuf_close (fp);
- iobuf_ioctl (NULL, IOBUF_IOCTL_INVALIDATE_CACHE, 0, (char*)fname);
- log_info (_("Note: backup of card key saved to '%s'\n"), fname);
-
- fingerprint_from_sk (sk, array, &n);
- p = fprbuf = xmalloc (MAX_FINGERPRINT_LEN*2 + 1 + 1);
- for (i=0; i < n ; i++, p += 2)
- sprintf (p, "%02X", array[i]);
- *p++ = ' ';
- *p = 0;
-
- write_status_text_and_buffer (STATUS_BACKUP_KEY_CREATED,
- fprbuf,
- fname, strlen (fname),
- 0);
- xfree (fprbuf);
- }
- free_packet (pkt);
- xfree (pkt);
- xfree (fname);
- if (rc)
- {
- free_secret_key (sk_unprotected);
- return rc;
- }
- }
-
- /* Create the public key from the secret key. */
- pk = xcalloc (1, sizeof *pk );
- pk->timestamp = sk->timestamp;
- pk->version = sk->version;
- if (expireval)
- pk->expiredate = sk->expiredate = sk->timestamp + expireval;
- pk->pubkey_algo = sk->pubkey_algo;
- n = pubkey_get_npkey (sk->pubkey_algo);
- for (i=0; i < n; i++)
- pk->pkey[i] = mpi_copy (sk->skey[i]);
-
- /* Build packets and add them to the node lists. */
- pkt = xcalloc (1,sizeof *pkt);
- pkt->pkttype = is_primary ? PKT_PUBLIC_KEY : PKT_PUBLIC_SUBKEY;
- pkt->pkt.public_key = pk;
- add_kbnode(pub_root, new_kbnode( pkt ));
-
- pkt = xcalloc (1,sizeof *pkt);
- pkt->pkttype = is_primary ? PKT_SECRET_KEY : PKT_SECRET_SUBKEY;
- pkt->pkt.secret_key = sk;
- add_kbnode(sec_root, new_kbnode( pkt ));
-
- return 0;
-#else
-# if __GCC__ && ENABLE_CARD_SUPPORT
-# warning Card support still missing
-# endif
- (void)algo;
- (void)keyno;
- (void)is_primary;
- (void)pub_root;
- (void)timestamp;
- (void)expireval;
- (void)para;
- return gpg_error (GPG_ERR_NOT_SUPPORTED);
-#endif /*!ENABLE_CARD_SUPPORT*/
-}
-
-
-#if 0
-int
-save_unprotected_key_to_card (PKT_public_key *sk, int keyno)
-{
- int rc;
- unsigned char *rsa_n = NULL;
- unsigned char *rsa_e = NULL;
- unsigned char *rsa_p = NULL;
- unsigned char *rsa_q = NULL;
- size_t rsa_n_len, rsa_e_len, rsa_p_len, rsa_q_len;
- unsigned char *sexp = NULL;
- unsigned char *p;
- char numbuf[55], numbuf2[50];
-
- assert (is_RSA (sk->pubkey_algo));
- assert (!sk->is_protected);
-
- /* Copy the parameters into straight buffers. */
- gcry_mpi_aprint (GCRYMPI_FMT_USG, &rsa_n, &rsa_n_len, sk->skey[0]);
- gcry_mpi_aprint (GCRYMPI_FMT_USG, &rsa_e, &rsa_e_len, sk->skey[1]);
- gcry_mpi_aprint (GCRYMPI_FMT_USG, &rsa_p, &rsa_p_len, sk->skey[3]);
- gcry_mpi_aprint (GCRYMPI_FMT_USG, &rsa_q, &rsa_q_len, sk->skey[4]);
- if (!rsa_n || !rsa_e || !rsa_p || !rsa_q)
- {
- rc = GPG_ERR_INV_ARG;
- goto leave;
- }
-
- /* Put the key into an S-expression. */
- sexp = p = xmalloc_secure (30
- + rsa_n_len + rsa_e_len + rsa_p_len + rsa_q_len
- + 4*sizeof (numbuf) + 25 + sizeof(numbuf) + 20);
-
- p = stpcpy (p,"(11:private-key(3:rsa(1:n");
- sprintf (numbuf, "%u:", (unsigned int)rsa_n_len);
- p = stpcpy (p, numbuf);
- memcpy (p, rsa_n, rsa_n_len);
- p += rsa_n_len;
-
- sprintf (numbuf, ")(1:e%u:", (unsigned int)rsa_e_len);
- p = stpcpy (p, numbuf);
- memcpy (p, rsa_e, rsa_e_len);
- p += rsa_e_len;
-
- sprintf (numbuf, ")(1:p%u:", (unsigned int)rsa_p_len);
- p = stpcpy (p, numbuf);
- memcpy (p, rsa_p, rsa_p_len);
- p += rsa_p_len;
-
- sprintf (numbuf, ")(1:q%u:", (unsigned int)rsa_q_len);
- p = stpcpy (p, numbuf);
- memcpy (p, rsa_q, rsa_q_len);
- p += rsa_q_len;
-
- p = stpcpy (p,"))(10:created-at");
- sprintf (numbuf2, "%lu", (unsigned long)sk->timestamp);
- sprintf (numbuf, "%lu:", (unsigned long)strlen (numbuf2));
- p = stpcpy (stpcpy (stpcpy (p, numbuf), numbuf2), "))");
-
- /* Fixme: Unfortunately we don't have the serialnumber available -
- thus we can't pass it down to the agent. */
- rc = agent_scd_writekey (keyno, NULL, sexp, p - sexp);
-
- leave:
- xfree (sexp);
- xfree (rsa_n);
- xfree (rsa_e);
- xfree (rsa_p);
- xfree (rsa_q);
- return rc;
-}
-#endif /*ENABLE_CARD_SUPPORT*/
diff --git a/g10/keyid.c b/g10/keyid.c
index cb237ef..f684276 100644
--- a/g10/keyid.c
+++ b/g10/keyid.c
@@ -284,7 +284,7 @@ format_keyid (u32 *keyid, int format, char *buffer, int len)
if (format == KF_DEFAULT)
format = opt.keyid_format;
if (format == KF_DEFAULT)
- format = KF_0xLONG;
+ format = KF_SHORT;
switch (format)
{
@@ -324,7 +324,11 @@ format_keyid (u32 *keyid, int format, char *buffer, int len)
size_t
keystrlen(void)
{
- switch(opt.keyid_format)
+ int format = opt.keyid_format;
+ if (format == KF_DEFAULT)
+ format = KF_SHORT;
+
+ switch(format)
{
case KF_SHORT:
return 8;
@@ -879,7 +883,7 @@ keygrip_from_pk (PKT_public_key *pk, unsigned char *array)
}
gcry_sexp_release (s_pkey);
- return 0;
+ return err;
}
diff --git a/g10/keylist.c b/g10/keylist.c
index b2836e8..d71bf4f 100644
--- a/g10/keylist.c
+++ b/g10/keylist.c
@@ -464,25 +464,23 @@ print_signature_stats (struct keylist_context *s)
if (!s->check_sigs)
return; /* Signature checking was not requested. */
- if (s->good_sigs == 1)
- log_info (_("1 good signature\n"));
- else if (s->good_sigs)
- log_info (_("%d good signatures\n"), s->good_sigs);
-
- if (s->inv_sigs == 1)
- log_info (_("1 bad signature\n"));
- else if (s->inv_sigs)
- log_info (_("%d bad signatures\n"), s->inv_sigs);
-
- if (s->no_key == 1)
- log_info (_("1 signature not checked due to a missing key\n"));
- else if (s->no_key)
- log_info (_("%d signatures not checked due to missing keys\n"), s->no_key);
-
- if (s->oth_err == 1)
- log_info (_("1 signature not checked due to an error\n"));
- else if (s->oth_err)
- log_info (_("%d signatures not checked due to errors\n"), s->oth_err);
+ if (s->good_sigs)
+ log_info (ngettext("%d good signature\n",
+ "%d good signatures\n", s->good_sigs), s->good_sigs);
+
+ if (s->inv_sigs)
+ log_info (ngettext("%d bad signature\n",
+ "%d bad signatures\n", s->inv_sigs), s->inv_sigs);
+
+ if (s->no_key)
+ log_info (ngettext("%d signature not checked due to a missing key\n",
+ "%d signatures not checked due to missing keys\n",
+ s->no_key), s->no_key);
+
+ if (s->oth_err)
+ log_info (ngettext("%d signature not checked due to an error\n",
+ "%d signatures not checked due to errors\n",
+ s->oth_err), s->oth_err);
}
@@ -562,7 +560,9 @@ list_all (ctrl_t ctrl, int secret, int mark_secret)
if (rc && gpg_err_code (rc) != GPG_ERR_NOT_FOUND)
log_error ("keydb_search_next failed: %s\n", gpg_strerror (rc));
if (keydb_get_skipped_counter (hd))
- log_info (_("Warning: %lu key(s) skipped due to their large size\n"),
+ log_info (ngettext("Warning: %lu key skipped due to its large size\n",
+ "Warning: %lu keys skipped due to their large sizes\n",
+ keydb_get_skipped_counter (hd)),
keydb_get_skipped_counter (hd));
if (opt.check_sigs && !opt.with_colons)
diff --git a/g10/keyring.c b/g10/keyring.c
index 6ba5202..7c7b355 100644
--- a/g10/keyring.c
+++ b/g10/keyring.c
@@ -36,50 +36,34 @@
#include "options.h"
#include "main.h" /*for check_key_signature()*/
#include "i18n.h"
+#include "../kbx/keybox.h"
-/* off_item is a funny named for an object used to keep track of known
- * keys. The idea was to use the offset to seek to the known keyblock, but
- * this is not possible if more than one process is using the keyring.
- */
-struct off_item {
- struct off_item *next;
- u32 kid[2];
- /*off_t off;*/
-};
-
-typedef struct off_item **OffsetHashTable;
-
-typedef struct keyring_name *KR_NAME;
-struct keyring_name
+typedef struct keyring_resource *KR_RESOURCE;
+struct keyring_resource
{
- struct keyring_name *next;
+ struct keyring_resource *next;
int read_only;
dotlock_t lockhd;
int is_locked;
int did_full_scan;
char fname[1];
};
-typedef struct keyring_name const * CONST_KR_NAME;
-
-static KR_NAME kr_names;
-static int active_handles;
-
-static OffsetHashTable kr_offtbl;
-static int kr_offtbl_ready;
+typedef struct keyring_resource const * CONST_KR_RESOURCE;
+static KR_RESOURCE kr_resources;
struct keyring_handle
{
- CONST_KR_NAME resource;
+ CONST_KR_RESOURCE resource;
struct {
- CONST_KR_NAME kr;
+ CONST_KR_RESOURCE kr;
IOBUF iobuf;
int eof;
int error;
} current;
struct {
- CONST_KR_NAME kr;
+ CONST_KR_RESOURCE kr;
off_t offset;
size_t pk_no;
size_t uid_no;
@@ -91,96 +75,96 @@ struct keyring_handle
} word_match;
};
-
+/* The number of extant handles. */
+static int active_handles;
static int do_copy (int mode, const char *fname, KBNODE root,
off_t start_offset, unsigned int n_packets );
-static struct off_item *
-new_offset_item (void)
-{
- struct off_item *k;
+/* We keep a cache of entries that we have entered in the DB. This
+ includes not only public keys, but also subkeys.
+
+ Note: we'd like to keep the offset of the items that are present,
+ however, this doesn't work, because another concurrent GnuPG
+ process could modify the keyring. */
+struct key_present {
+ struct key_present *next;
+ u32 kid[2];
+};
- k = xmalloc_clear (sizeof *k);
- return k;
-}
+/* For the hash table, we use separate chaining with linked lists.
+ This means that we have an array of N linked lists (buckets), which
+ is indexed by KEYID[1] mod N. Elements present in the keyring will
+ be on the list; elements not present in the keyring will not be on
+ the list.
-#if 0
-static void
-release_offset_items (struct off_item *k)
-{
- struct off_item *k2;
+ Note: since the hash table stores both present and not present
+ information, it cannot be used until we complete a full scan of the
+ keyring. This is indicated by key_present_hash_ready. */
+typedef struct key_present **key_present_hash_t;
+static key_present_hash_t key_present_hash;
+static int key_present_hash_ready;
- for (; k; k = k2)
- {
- k2 = k->next;
- xfree (k);
- }
-}
-#endif
+#define KEY_PRESENT_HASH_BUCKETS 2048
-static OffsetHashTable
-new_offset_hash_table (void)
+/* Allocate a new value for a key present hash table. */
+static struct key_present *
+key_present_value_new (void)
{
- struct off_item **tbl;
+ struct key_present *k;
- tbl = xmalloc_clear (2048 * sizeof *tbl);
- return tbl;
+ k = xmalloc_clear (sizeof *k);
+ return k;
}
-#if 0
-static void
-release_offset_hash_table (OffsetHashTable tbl)
+/* Allocate a new key present hash table. */
+static key_present_hash_t
+key_present_hash_new (void)
{
- int i;
+ struct key_present **tbl;
- if (!tbl)
- return;
- for (i=0; i < 2048; i++)
- release_offset_items (tbl[i]);
- xfree (tbl);
+ tbl = xmalloc_clear (KEY_PRESENT_HASH_BUCKETS * sizeof *tbl);
+ return tbl;
}
-#endif
-static struct off_item *
-lookup_offset_hash_table (OffsetHashTable tbl, u32 *kid)
+/* Return whether the value described by KID if it is in the hash
+ table. Otherwise, return NULL. */
+static struct key_present *
+key_present_hash_lookup (key_present_hash_t tbl, u32 *kid)
{
- struct off_item *k;
+ struct key_present *k;
- for (k = tbl[(kid[1] & 0x07ff)]; k; k = k->next)
+ for (k = tbl[(kid[1] % (KEY_PRESENT_HASH_BUCKETS - 1))]; k; k = k->next)
if (k->kid[0] == kid[0] && k->kid[1] == kid[1])
return k;
return NULL;
}
+/* Add the key to the hash table TBL if it is not already present. */
static void
-update_offset_hash_table (OffsetHashTable tbl, u32 *kid, off_t off)
+key_present_hash_update (key_present_hash_t tbl, u32 *kid)
{
- struct off_item *k;
+ struct key_present *k;
- (void)off;
-
- for (k = tbl[(kid[1] & 0x07ff)]; k; k = k->next)
+ for (k = tbl[(kid[1] % (KEY_PRESENT_HASH_BUCKETS - 1))]; k; k = k->next)
{
if (k->kid[0] == kid[0] && k->kid[1] == kid[1])
- {
- /*k->off = off;*/
- return;
- }
+ return;
}
- k = new_offset_item ();
+ k = key_present_value_new ();
k->kid[0] = kid[0];
k->kid[1] = kid[1];
- /*k->off = off;*/
- k->next = tbl[(kid[1] & 0x07ff)];
- tbl[(kid[1] & 0x07ff)] = k;
+ k->next = tbl[(kid[1] % (KEY_PRESENT_HASH_BUCKETS - 1))];
+ tbl[(kid[1] % (KEY_PRESENT_HASH_BUCKETS - 1))] = k;
}
+/* Add all the keys (public and subkeys) present in the keyblock to
+ the hash TBL. */
static void
-update_offset_hash_table_from_kb (OffsetHashTable tbl, KBNODE node, off_t off)
+key_present_hash_update_from_kb (key_present_hash_t tbl, KBNODE node)
{
for (; node; node = node->next)
{
@@ -189,11 +173,11 @@ update_offset_hash_table_from_kb (OffsetHashTable tbl, KBNODE node, off_t off)
{
u32 aki[2];
keyid_from_pk (node->pkt->pkt.public_key, aki);
- update_offset_hash_table (tbl, aki, off);
+ key_present_hash_update (tbl, aki);
}
}
}
-
+
/*
* Register a filename for plain keyring files. ptr is set to a
* pointer to be used to create a handles etc, or the already-issued
@@ -203,12 +187,13 @@ update_offset_hash_table_from_kb (OffsetHashTable tbl, KBNODE node, off_t off)
int
keyring_register_filename (const char *fname, int read_only, void **ptr)
{
- KR_NAME kr;
+ KR_RESOURCE kr;
if (active_handles)
- BUG (); /* We don't allow that */
+ /* There are open handles. */
+ BUG ();
- for (kr=kr_names; kr; kr = kr->next)
+ for (kr=kr_resources; kr; kr = kr->next)
{
if (same_file_p (kr->fname, fname))
{
@@ -227,12 +212,12 @@ keyring_register_filename (const char *fname, int read_only, void **ptr)
kr->is_locked = 0;
kr->did_full_scan = 0;
/* keep a list of all issued pointers */
- kr->next = kr_names;
- kr_names = kr;
+ kr->next = kr_resources;
+ kr_resources = kr;
/* create the offset table the first time a function here is used */
- if (!kr_offtbl)
- kr_offtbl = new_offset_hash_table ();
+ if (!key_present_hash)
+ key_present_hash = key_present_hash_new ();
*ptr=kr;
@@ -242,7 +227,7 @@ keyring_register_filename (const char *fname, int read_only, void **ptr)
int
keyring_is_writable (void *token)
{
- KR_NAME r = token;
+ KR_RESOURCE r = token;
return r? (r->read_only || !access (r->fname, W_OK)) : 0;
}
@@ -256,7 +241,7 @@ KEYRING_HANDLE
keyring_new (void *token)
{
KEYRING_HANDLE hd;
- KR_NAME resource = token;
+ KR_RESOURCE resource = token;
assert (resource);
@@ -317,14 +302,14 @@ keyring_get_resource_name (KEYRING_HANDLE hd)
int
keyring_lock (KEYRING_HANDLE hd, int yes)
{
- KR_NAME kr;
+ KR_RESOURCE kr;
int rc = 0;
(void)hd;
if (yes) {
/* first make sure the lock handles are created */
- for (kr=kr_names; kr; kr = kr->next) {
+ for (kr=kr_resources; kr; kr = kr->next) {
if (!keyring_is_writable(kr))
continue;
if (!kr->lockhd) {
@@ -339,12 +324,24 @@ keyring_lock (KEYRING_HANDLE hd, int yes)
return rc;
/* and now set the locks */
- for (kr=kr_names; kr; kr = kr->next) {
+ for (kr=kr_resources; kr; kr = kr->next) {
if (!keyring_is_writable(kr))
continue;
if (kr->is_locked)
- ;
- else if (dotlock_take (kr->lockhd, -1) ) {
+ continue;
+
+#ifdef HAVE_W32_SYSTEM
+ /* Under Windows we need to CloseHandle the file before we
+ * try to lock it. This is because another process might
+ * have taken the lock and is using keybox_file_rename to
+ * rename the base file. How if our dotlock_take below is
+ * waiting for the lock but we have the base file still
+ * open, keybox_file_rename will never succeed as we are
+ * in a deadlock. */
+ iobuf_ioctl (NULL, IOBUF_IOCTL_INVALIDATE_CACHE, 0,
+ (char*)kr->fname);
+#endif /*HAVE_W32_SYSTEM*/
+ if (dotlock_take (kr->lockhd, -1) ) {
log_info ("can't lock '%s'\n", kr->fname );
rc = GPG_ERR_GENERAL;
}
@@ -354,12 +351,13 @@ keyring_lock (KEYRING_HANDLE hd, int yes)
}
if (rc || !yes) {
- for (kr=kr_names; kr; kr = kr->next) {
+ for (kr=kr_resources; kr; kr = kr->next) {
if (!keyring_is_writable(kr))
continue;
if (!kr->is_locked)
- ;
- else if (dotlock_release (kr->lockhd))
+ continue;
+
+ if (dotlock_release (kr->lockhd))
log_info ("can't unlock '%s'\n", kr->fname );
else
kr->is_locked = 0;
@@ -588,9 +586,9 @@ keyring_update_keyblock (KEYRING_HANDLE hd, KBNODE kb)
rc = do_copy (3, hd->found.kr->fname, kb,
hd->found.offset, hd->found.n_packets );
if (!rc) {
- if (kr_offtbl)
+ if (key_present_hash)
{
- update_offset_hash_table_from_kb (kr_offtbl, kb, 0);
+ key_present_hash_update_from_kb (key_present_hash, kb);
}
/* better reset the found info */
hd->found.kr = NULL;
@@ -634,9 +632,9 @@ keyring_insert_keyblock (KEYRING_HANDLE hd, KBNODE kb)
/* do the insert */
rc = do_copy (1, fname, kb, 0, 0 );
- if (!rc && kr_offtbl)
+ if (!rc && key_present_hash)
{
- update_offset_hash_table_from_kb (kr_offtbl, kb, 0);
+ key_present_hash_update_from_kb (key_present_hash, kb);
}
return rc;
@@ -981,7 +979,7 @@ keyring_search (KEYRING_HANDLE hd, KEYDB_SEARCH_DESC *desc,
int pk_no, uid_no;
int initial_skip;
int scanned_from_start;
- int use_offtbl;
+ int use_key_present_hash;
PKT_user_id *uid = NULL;
PKT_public_key *pk = NULL;
u32 aki[2];
@@ -1038,13 +1036,13 @@ keyring_search (KEYRING_HANDLE hd, KEYDB_SEARCH_DESC *desc,
return rc;
}
- use_offtbl = !!kr_offtbl;
- if (!use_offtbl)
+ use_key_present_hash = !!key_present_hash;
+ if (!use_key_present_hash)
{
if (DBG_LOOKUP)
log_debug ("%s: no offset table.\n", __func__);
}
- else if (!kr_offtbl_ready)
+ else if (!key_present_hash_ready)
{
if (DBG_LOOKUP)
log_debug ("%s: initializing offset table. (need_keyid: %d => 1)\n",
@@ -1053,12 +1051,12 @@ keyring_search (KEYRING_HANDLE hd, KEYDB_SEARCH_DESC *desc,
}
else if (ndesc == 1 && desc[0].mode == KEYDB_SEARCH_MODE_LONG_KID)
{
- struct off_item *oi;
+ struct key_present *oi;
if (DBG_LOOKUP)
log_debug ("%s: look up by long key id, checking cache\n", __func__);
- oi = lookup_offset_hash_table (kr_offtbl, desc[0].u.kid);
+ oi = key_present_hash_lookup (key_present_hash, desc[0].u.kid);
if (!oi)
{ /* We know that we don't have this key */
if (DBG_LOOKUP)
@@ -1153,8 +1151,10 @@ keyring_search (KEYRING_HANDLE hd, KEYDB_SEARCH_DESC *desc,
if (need_keyid)
keyid_from_pk (pk, aki);
- if (use_offtbl && !kr_offtbl_ready && scanned_from_start)
- update_offset_hash_table (kr_offtbl, aki, main_offset);
+ if (use_key_present_hash
+ && !key_present_hash_ready
+ && scanned_from_start)
+ key_present_hash_update (key_present_hash, aki);
}
else if (pkt.pkttype == PKT_USER_ID)
{
@@ -1244,7 +1244,7 @@ keyring_search (KEYRING_HANDLE hd, KEYDB_SEARCH_DESC *desc,
if (!rc)
{
if (DBG_LOOKUP)
- log_debug ("%s: returing success\n", __func__);
+ log_debug ("%s: returning success\n", __func__);
hd->found.offset = main_offset;
hd->found.kr = hd->current.kr;
hd->found.pk_no = pk? pk_no : 0;
@@ -1258,12 +1258,14 @@ keyring_search (KEYRING_HANDLE hd, KEYDB_SEARCH_DESC *desc,
hd->current.eof = 1;
/* if we scanned all keyrings, we are sure that
* all known key IDs are in our offtbl, mark that. */
- if (use_offtbl && !kr_offtbl_ready && scanned_from_start)
+ if (use_key_present_hash
+ && !key_present_hash_ready
+ && scanned_from_start)
{
- KR_NAME kr;
+ KR_RESOURCE kr;
/* First set the did_full_scan flag for this keyring. */
- for (kr=kr_names; kr; kr = kr->next)
+ for (kr=kr_resources; kr; kr = kr->next)
{
if (hd->resource == kr)
{
@@ -1273,13 +1275,13 @@ keyring_search (KEYRING_HANDLE hd, KEYDB_SEARCH_DESC *desc,
}
/* Then check whether all flags are set and if so, mark the
offtbl ready */
- for (kr=kr_names; kr; kr = kr->next)
+ for (kr=kr_resources; kr; kr = kr->next)
{
if (!kr->did_full_scan)
break;
}
if (!kr)
- kr_offtbl_ready = 1;
+ key_present_hash_ready = 1;
}
}
else
@@ -1300,69 +1302,36 @@ static int
create_tmp_file (const char *template,
char **r_bakfname, char **r_tmpfname, IOBUF *r_fp)
{
- char *bakfname, *tmpfname;
+ gpg_error_t err;
mode_t oldmask;
- *r_bakfname = NULL;
- *r_tmpfname = NULL;
-
-# ifdef USE_ONLY_8DOT3
- /* Here is another Windoze bug?:
- * you can't rename("pubring.gpg.tmp", "pubring.gpg");
- * but rename("pubring.gpg.tmp", "pubring.aaa");
- * works. So we replace .gpg by .bak or .tmp
- */
- if (strlen (template) > 4
- && !strcmp (template+strlen(template)-4, EXTSEP_S GPGEXT_GPG) )
- {
- bakfname = xmalloc (strlen (template) + 1);
- strcpy (bakfname, template);
- strcpy (bakfname+strlen(template)-4, EXTSEP_S "bak");
+ err = keybox_tmp_names (template, 1, r_bakfname, r_tmpfname);
+ if (err)
+ return err;
- tmpfname = xmalloc (strlen( template ) + 1 );
- strcpy (tmpfname,template);
- strcpy (tmpfname+strlen(template)-4, EXTSEP_S "tmp");
+ /* Create the temp file with limited access. Note that the umask
+ call is not anymore needed because iobuf_create now takes care of
+ it. However, it does not harm and thus we keep it. */
+ oldmask = umask (077);
+ if (is_secured_filename (*r_tmpfname))
+ {
+ *r_fp = NULL;
+ gpg_err_set_errno (EPERM);
}
- else
- { /* file does not end with gpg; hmmm */
- bakfname = xmalloc (strlen( template ) + 5);
- strcpy (stpcpy(bakfname, template), EXTSEP_S "bak");
-
- tmpfname = xmalloc (strlen( template ) + 5);
- strcpy (stpcpy(tmpfname, template), EXTSEP_S "tmp");
+ else
+ *r_fp = iobuf_create (*r_tmpfname, 1);
+ umask (oldmask);
+ if (!*r_fp)
+ {
+ err = gpg_error_from_syserror ();
+ log_error (_("can't create '%s': %s\n"), *r_tmpfname, gpg_strerror (err));
+ xfree (*r_tmpfname);
+ *r_tmpfname = NULL;
+ xfree (*r_bakfname);
+ *r_bakfname = NULL;
}
-# else /* Posix file names */
- bakfname = xmalloc (strlen( template ) + 2);
- strcpy (stpcpy (bakfname,template),"~");
-
- tmpfname = xmalloc (strlen( template ) + 5);
- strcpy (stpcpy(tmpfname,template), EXTSEP_S "tmp");
-# endif /* Posix filename */
-
- /* Create the temp file with limited access. Note that the umask
- call is not anymore needed because iobuf_create now takes care
- of it. However, it does not harm and thus we keep it. */
- oldmask=umask(077);
- if (is_secured_filename (tmpfname))
- {
- *r_fp = NULL;
- gpg_err_set_errno (EPERM);
- }
- else
- *r_fp = iobuf_create (tmpfname, 1);
- umask(oldmask);
- if (!*r_fp)
- {
- int rc = gpg_error_from_syserror ();
- log_error(_("can't create '%s': %s\n"), tmpfname, strerror(errno) );
- xfree (tmpfname);
- xfree (bakfname);
- return rc;
- }
- *r_bakfname = bakfname;
- *r_tmpfname = tmpfname;
- return 0;
+ return err;
}
@@ -1381,32 +1350,19 @@ rename_tmp_file (const char *bakfname, const char *tmpfname, const char *fname)
iobuf_ioctl (NULL, IOBUF_IOCTL_INVALIDATE_CACHE, 0, (char*)fname );
/* First make a backup file. */
-#if defined(HAVE_DOSISH_SYSTEM) || defined(__riscos__)
- gnupg_remove (bakfname);
-#endif
- if (rename (fname, bakfname) )
- {
- rc = gpg_error_from_syserror ();
- log_error ("renaming '%s' to '%s' failed: %s\n",
- fname, bakfname, strerror(errno) );
- return rc;
- }
+ rc = keybox_file_rename (fname, bakfname);
+ if (rc)
+ goto fail;
/* then rename the file */
-#if defined(HAVE_DOSISH_SYSTEM) || defined(__riscos__)
- gnupg_remove( fname );
-#endif
- if (rename (tmpfname, fname) )
+ rc = keybox_file_rename (tmpfname, fname);
+ if (rc)
{
- rc = gpg_error_from_syserror ();
- log_error (_("renaming '%s' to '%s' failed: %s\n"),
- tmpfname, fname, strerror(errno) );
register_secured_file (fname);
goto fail;
}
/* Now make sure the file has the same permissions as the original */
-
#ifndef HAVE_DOSISH_SYSTEM
{
struct stat statbuf;
@@ -1521,6 +1477,8 @@ keyring_rebuild_cache (void *token,int noisy)
* the original file is closed */
tmpfp = NULL;
}
+ /* Static analyzer note: BAKFILENAME is never NULL here
+ because it is controlled by LASTRESNAME. */
rc = lastresname? rename_tmp_file (bakfilename, tmpfilename,
lastresname) : 0;
xfree (tmpfilename); tmpfilename = NULL;
@@ -1606,8 +1564,10 @@ keyring_rebuild_cache (void *token,int noisy)
goto leave;
if ( !(++count % 50) && noisy && !opt.quiet)
- log_info(_("%lu keys cached so far (%lu signatures)\n"),
- count, sigcount );
+ log_info (ngettext("%lu keys cached so far (%lu signature)\n",
+ "%lu keys cached so far (%lu signatures)\n",
+ sigcount),
+ count, sigcount);
}
} /* end main loop */
if (rc == -1)
@@ -1617,8 +1577,15 @@ keyring_rebuild_cache (void *token,int noisy)
log_error ("keyring_search failed: %s\n", gpg_strerror (rc));
goto leave;
}
- if(noisy || opt.verbose)
- log_info(_("%lu keys cached (%lu signatures)\n"), count, sigcount );
+
+ if (noisy || opt.verbose)
+ {
+ log_info (ngettext("%lu key cached",
+ "%lu keys cached", count), count);
+ log_printf (ngettext(" (%lu signature)\n",
+ " (%lu signatures)\n", sigcount), sigcount);
+ }
+
if (tmpfp)
{
if (iobuf_close (tmpfp))
@@ -1733,7 +1700,6 @@ do_copy (int mode, const char *fname, KBNODE root,
iobuf_cancel(newfp);
goto leave;
}
- rc = 0;
}
if( mode == 2 || mode == 3 ) { /* delete or update */
@@ -1777,7 +1743,6 @@ do_copy (int mode, const char *fname, KBNODE root,
iobuf_cancel(newfp);
goto leave;
}
- rc = 0;
}
/* close both files */
diff --git a/g10/keyserver-internal.h b/g10/keyserver-internal.h
index 676b4db..6f6f430 100644
--- a/g10/keyserver-internal.h
+++ b/g10/keyserver-internal.h
@@ -31,6 +31,7 @@ struct keyserver_spec *keyserver_match(struct keyserver_spec *spec);
struct keyserver_spec *parse_keyserver_uri (const char *string,
int require_scheme);
struct keyserver_spec *parse_preferred_keyserver(PKT_signature *sig);
+int keyserver_any_configured (ctrl_t ctrl);
int keyserver_export (ctrl_t ctrl, strlist_t users);
int keyserver_import (ctrl_t ctrl, strlist_t users);
int keyserver_import_fprint (ctrl_t ctrl, const byte *fprint,size_t fprint_len,
diff --git a/g10/keyserver.c b/g10/keyserver.c
index cf671c9..e9ccb58 100644
--- a/g10/keyserver.c
+++ b/g10/keyserver.c
@@ -109,8 +109,7 @@ static gpg_error_t keyserver_get (ctrl_t ctrl,
KEYDB_SEARCH_DESC *desc, int ndesc,
struct keyserver_spec *override_keyserver,
unsigned char **r_fpr, size_t *r_fprlen);
-static gpg_error_t keyserver_put (ctrl_t ctrl, strlist_t keyspecs,
- struct keyserver_spec *keyserver);
+static gpg_error_t keyserver_put (ctrl_t ctrl, strlist_t keyspecs);
/* Reasonable guess. The commonly used test key simon.josefsson.org
@@ -1005,7 +1004,7 @@ keyserver_export (ctrl_t ctrl, strlist_t users)
if(sl)
{
- rc = keyserver_put (ctrl, sl, opt.keyserver);
+ rc = keyserver_put (ctrl, sl);
free_strlist(sl);
}
@@ -1132,6 +1131,14 @@ keyserver_import (ctrl_t ctrl, strlist_t users)
}
+/* Return true if any keyserver has been configured. */
+int
+keyserver_any_configured (ctrl_t ctrl)
+{
+ return !gpg_dirmngr_ks_list (ctrl, NULL);
+}
+
+
/* Import all keys that exactly match NAME */
int
keyserver_import_name (ctrl_t ctrl, const char *name,
@@ -1380,7 +1387,12 @@ keyserver_refresh (ctrl_t ctrl, strlist_t users)
opt.keyserver_options.import_options|=IMPORT_FAST;
/* If refresh_add_fake_v3_keyids is on and it's a HKP or MAILTO
- scheme, then enable fake v3 keyid generation. */
+ scheme, then enable fake v3 keyid generation. Note that this
+ works only with a keyserver configured. gpg.conf
+ (i.e. opt.keyserver); however that method of configuring a
+ keyserver is deprecated and in any case it is questionable
+ whether we should keep on supporting these ancient and broken
+ keyservers. */
if((opt.keyserver_options.options&KEYSERVER_ADD_FAKE_V3) && opt.keyserver
&& (ascii_strcasecmp(opt.keyserver->scheme,"hkp")==0 ||
ascii_strcasecmp(opt.keyserver->scheme,"mailto")==0))
@@ -1403,7 +1415,7 @@ keyserver_refresh (ctrl_t ctrl, strlist_t users)
struct keyserver_spec *keyserver=desc[i].skipfncvalue;
if (!opt.quiet)
- log_info (_("refreshing 1 key from %s\n"), keyserver->uri);
+ log_info (_("refreshing %d key from %s\n"), 1, keyserver->uri);
/* We use the keyserver structure we parsed out before.
Note that a preferred keyserver without a scheme://
@@ -1436,10 +1448,9 @@ keyserver_refresh (ctrl_t ctrl, strlist_t users)
{
if (!opt.quiet)
{
- if(count==1)
- log_info(_("refreshing 1 key from %s\n"), tmpuri);
- else
- log_info(_("refreshing %d keys from %s\n"), count, tmpuri);
+ log_info (ngettext("refreshing %d key from %s\n",
+ "refreshing %d keys from %s\n",
+ count), count, tmpuri);
}
xfree (tmpuri);
@@ -1566,7 +1577,7 @@ keyserver_search (ctrl_t ctrl, strlist_t tokens)
static gpg_error_t
keyserver_get_chunk (ctrl_t ctrl, KEYDB_SEARCH_DESC *desc, int ndesc,
int *r_ndesc_used,
- void *stats_handle,
+ import_stats_t stats_handle,
struct keyserver_spec *override_keyserver,
unsigned char **r_fpr, size_t *r_fprlen)
@@ -1749,7 +1760,7 @@ keyserver_get (ctrl_t ctrl, KEYDB_SEARCH_DESC *desc, int ndesc,
unsigned char **r_fpr, size_t *r_fprlen)
{
gpg_error_t err;
- void *stats_handle;
+ import_stats_t stats_handle;
int ndesc_used;
int any_good = 0;
@@ -1776,21 +1787,21 @@ keyserver_get (ctrl_t ctrl, KEYDB_SEARCH_DESC *desc, int ndesc,
}
-/* Send all keys specified by KEYSPECS to the KEYSERVERS. */
+/* Send all keys specified by KEYSPECS to the configured keyserver. */
static gpg_error_t
-keyserver_put (ctrl_t ctrl, strlist_t keyspecs,
- struct keyserver_spec *keyserver)
+keyserver_put (ctrl_t ctrl, strlist_t keyspecs)
{
gpg_error_t err;
strlist_t kspec;
+ char *ksurl;
if (!keyspecs)
return 0; /* Return success if the list is empty. */
- if (!opt.keyserver)
+ if (gpg_dirmngr_ks_list (ctrl, &ksurl))
{
- log_error (_("no keyserver known (use option --keyserver)\n"));
+ log_error (_("no keyserver known\n"));
return gpg_error (GPG_ERR_NO_KEYSERVER);
}
@@ -1808,14 +1819,9 @@ keyserver_put (ctrl_t ctrl, strlist_t keyspecs,
log_error (_("skipped \"%s\": %s\n"), kspec->d, gpg_strerror (err));
else
{
- if (keyserver->host)
- log_info (_("sending key %s to %s server %s\n"),
- keystr (keyblock->pkt->pkt.public_key->keyid),
- keyserver->scheme, keyserver->host);
- else
- log_info (_("sending key %s to %s\n"),
- keystr (keyblock->pkt->pkt.public_key->keyid),
- keyserver->uri);
+ log_info (_("sending key %s to %s\n"),
+ keystr (keyblock->pkt->pkt.public_key->keyid),
+ ksurl?ksurl:"[?]");
err = gpg_dirmngr_ks_put (ctrl, data, datalen, keyblock);
release_kbnode (keyblock);
@@ -1828,6 +1834,7 @@ keyserver_put (ctrl_t ctrl, strlist_t keyspecs,
}
}
+ xfree (ksurl);
return err;
@@ -1858,7 +1865,7 @@ keyserver_fetch (ctrl_t ctrl, strlist_t urilist)
err = gpg_dirmngr_ks_fetch (ctrl, sl->d, &datastream);
if (!err)
{
- void *stats_handle;
+ import_stats_t stats_handle;
stats_handle = import_new_stats_handle();
import_keys_es_stream (ctrl, datastream, stats_handle, NULL, NULL,
@@ -1941,15 +1948,15 @@ keyserver_import_cert (ctrl_t ctrl, const char *name, int dane_mode,
free_keyserver_spec(spec);
}
}
- else if(opt.keyserver)
+ else if (keyserver_any_configured (ctrl))
{
/* If only a fingerprint is provided, try and fetch it from
- our --keyserver */
+ the configured keyserver. */
err = keyserver_import_fprint (ctrl, *fpr,*fpr_len,opt.keyserver);
}
else
- log_info(_("no keyserver known (use option --keyserver)\n"));
+ log_info(_("no keyserver known\n"));
/* Give a better string here? "CERT fingerprint for \"%s\"
found, but no keyserver" " known (use option
diff --git a/g10/main.h b/g10/main.h
index 0c2d1a9..ec24426 100644
--- a/g10/main.h
+++ b/g10/main.h
@@ -89,6 +89,8 @@ void print_pubkey_algo_note (pubkey_algo_t algo);
void print_cipher_algo_note (cipher_algo_t algo);
void print_digest_algo_note (digest_algo_t algo);
void print_digest_rejected_note (enum gcry_md_algos algo);
+void print_reported_error (gpg_error_t err, gpg_err_code_t skip_if_ec);
+void print_further_info (const char *format, ...) GPGRT_ATTR_PRINTF(1,2);
void additional_weak_digest (const char* digestname);
/*-- armor.c --*/
@@ -296,7 +298,6 @@ gpg_error_t generate_subkeypair (ctrl_t ctrl, kbnode_t pub_keyblock);
#ifdef ENABLE_CARD_SUPPORT
gpg_error_t generate_card_subkeypair (kbnode_t pub_keyblock,
int keyno, const char *serialno);
-int save_unprotected_key_to_card (PKT_public_key *sk, int keyno);
#endif
@@ -318,22 +319,27 @@ gcry_mpi_t encode_md_value (PKT_public_key *pk,
gcry_md_hd_t md, int hash_algo );
/*-- import.c --*/
+struct import_stats_s;
+typedef struct import_stats_s *import_stats_t;
typedef gpg_error_t (*import_screener_t)(kbnode_t keyblock, void *arg);
int parse_import_options(char *str,unsigned int *options,int noisy);
void import_keys (ctrl_t ctrl, char **fnames, int nnames,
- void *stats_hd, unsigned int options);
-int import_keys_stream (ctrl_t ctrl, iobuf_t inp, void *stats_hd,
+ import_stats_t stats_hd, unsigned int options);
+int import_keys_stream (ctrl_t ctrl, iobuf_t inp, import_stats_t stats_hd,
unsigned char **fpr,
size_t *fpr_len, unsigned int options);
-int import_keys_es_stream (ctrl_t ctrl, estream_t fp, void *stats_handle,
+int import_keys_es_stream (ctrl_t ctrl, estream_t fp,
+ import_stats_t stats_handle,
unsigned char **fpr, size_t *fpr_len,
unsigned int options,
import_screener_t screener, void *screener_arg);
gpg_error_t import_old_secring (ctrl_t ctrl, const char *fname);
-void *import_new_stats_handle (void);
-void import_release_stats_handle (void *p);
-void import_print_stats (void *hd);
+import_stats_t import_new_stats_handle (void);
+void import_release_stats_handle (import_stats_t hd);
+void import_print_stats (import_stats_t hd);
+gpg_error_t transfer_secret_keys (ctrl_t ctrl, struct import_stats_s *stats,
+ kbnode_t sec_keyblock, int batch, int force);
int collapse_uids( KBNODE *keyblock );
@@ -359,6 +365,12 @@ gpg_error_t export_pubkey_buffer (ctrl_t ctrl, const char *keyspec,
kbnode_t *r_keyblock,
void **r_data, size_t *r_datalen);
+gpg_error_t receive_seckey_from_agent (ctrl_t ctrl, gcry_cipher_hd_t cipherhd,
+ char **cache_nonce_addr, const char *hexgrip,
+ PKT_public_key *pk);
+
+gpg_error_t export_ssh_key (ctrl_t ctrl, const char *userid);
+
/*-- dearmor.c --*/
int dearmor_file( const char *fname );
int enarmor_file( const char *fname );
diff --git a/g10/mainproc.c b/g10/mainproc.c
index 8688325..5e6b40b 100644
--- a/g10/mainproc.c
+++ b/g10/mainproc.c
@@ -1803,8 +1803,8 @@ check_sig_and_print (CTX c, kbnode_t node)
no information from the DNS PKA, this is a third try. */
if (gpg_err_code (rc) == GPG_ERR_NO_PUBKEY
- && opt.keyserver
- && (opt.keyserver_options.options&KEYSERVER_AUTO_KEY_RETRIEVE))
+ && (opt.keyserver_options.options&KEYSERVER_AUTO_KEY_RETRIEVE)
+ && keyserver_any_configured (c->ctrl))
{
int res;
diff --git a/g10/mdfilter.c b/g10/mdfilter.c
index 708bdcd..88b2ee1 100644
--- a/g10/mdfilter.c
+++ b/g10/mdfilter.c
@@ -58,7 +58,7 @@ md_filter( void *opaque, int control,
*ret_len = i;
}
else if( control == IOBUFCTRL_DESC )
- *(char**)buf = "md_filter";
+ mem2str (buf, "md_filter", *ret_len);
return rc;
}
diff --git a/g10/misc.c b/g10/misc.c
index 547944d..bdc4505 100644
--- a/g10/misc.c
+++ b/g10/misc.c
@@ -358,6 +358,52 @@ print_digest_rejected_note (enum gcry_md_algos algo)
}
+/* Print a message
+ * "(reported error: %s)\n
+ * in verbose mode to further explain an error. If the error code has
+ * the value IGNORE_EC no message is printed. A message is also not
+ * printed if ERR is 0. */
+void
+print_reported_error (gpg_error_t err, gpg_err_code_t ignore_ec)
+{
+ if (!opt.verbose)
+ return;
+
+ if (!gpg_err_code (err))
+ ;
+ else if (gpg_err_code (err) == ignore_ec)
+ ;
+ else if (gpg_err_source (err) == GPG_ERR_SOURCE_DEFAULT)
+ log_info (_("(reported error: %s)\n"),
+ gpg_strerror (err));
+ else
+ log_info (_("(reported error: %s <%s>)\n"),
+ gpg_strerror (err), gpg_strsource (err));
+
+}
+
+
+/* Print a message
+ * "(further info: %s)\n
+ * in verbose mode to further explain an error. That message is
+ * intended to help debug a problem and should not be translated.
+ */
+void
+print_further_info (const char *format, ...)
+{
+ va_list arg_ptr;
+
+ if (!opt.verbose)
+ return;
+
+ log_info (_("(further info: "));
+ va_start (arg_ptr, format);
+ log_logv (GPGRT_LOG_CONT, format, arg_ptr);
+ va_end (arg_ptr);
+ log_printf (")\n");
+}
+
+
/* Map OpenPGP algo numbers to those used by Libgcrypt. We need to do
this for algorithms we implemented in Libgcrypt after they become
part of OpenPGP. */
diff --git a/g10/options.h b/g10/options.h
index 0bb2aae..1407b2f 100644
--- a/g10/options.h
+++ b/g10/options.h
@@ -220,13 +220,6 @@ struct
value. */
int limit_card_insert_tries;
-#ifdef ENABLE_CARD_SUPPORT
- /* FIXME: We don't needs this here as it is done in scdaemon. */
- const char *ctapi_driver; /* Library to access the ctAPI. */
- const char *pcsc_driver; /* Library to access the PC/SC system. */
- int disable_ccid; /* Disable the use of the internal CCID driver. */
-#endif /*ENABLE_CARD_SUPPORT*/
-
struct
{
/* If set, require an 0x19 backsig to be present on signatures
diff --git a/g10/options.skel b/g10/options.skel
index e8f1882..87fc627 100644
--- a/g10/options.skel
+++ b/g10/options.skel
@@ -21,17 +21,15 @@
# GnuPG. If the first non white space character of a line is a '#',
# this line is ignored. Empty lines are also ignored.
#
-# See the man page for a list of options.
+# See the gpg man page for a list of options.
-# Uncomment the following option to get rid of the copyright notice
-
-#no-greeting
# If you have more than 1 secret key in your keyring, you may want to
# uncomment the following option and set your preferred keyid.
#default-key 621CC013
+
# If you do not pass a recipient to gpg, it will ask for one. Using
# this option you can encrypt to a default key. Key validation will
# not be done in this case. The second form uses the default key as
@@ -40,37 +38,6 @@
#default-recipient some-user-id
#default-recipient-self
-# By default GnuPG creates version 4 signatures for data files as
-# specified by OpenPGP. Some earlier (PGP 6, PGP 7) versions of PGP
-# require the older version 3 signatures. Setting this option forces
-# GnuPG to create version 3 signatures.
-
-#force-v3-sigs
-
-# Because some mailers change lines starting with "From " to ">From "
-# it is good to handle such lines in a special way when creating
-# cleartext signatures; all other PGP versions do it this way too.
-# To enable full OpenPGP compliance you may want to use this option.
-
-#no-escape-from-lines
-
-# When verifying a signature made from a subkey, ensure that the cross
-# certification "back signature" on the subkey is present and valid.
-# This protects against a subtle attack against subkeys that can sign.
-# Defaults to --no-require-cross-certification. However for new
-# installations it should be enabled.
-
-require-cross-certification
-
-
-# If you do not use the Latin-1 (ISO-8859-1) charset, you should tell
-# GnuPG which is the native character set. Please check the man page
-# for supported character sets. This character set is only used for
-# metadata and not for the actual message which does not undergo any
-# translation. Note that future version of GnuPG will change to UTF-8
-# as default character set.
-
-#charset utf-8
# Group names may be defined like this:
# group mynames = paige 0x12345678 joe patti
@@ -84,16 +51,17 @@ require-cross-certification
#group mynames = paige 0x12345678 joe patti
-# Some old Windows platforms require 8.3 filenames. If your system
-# can handle long filenames, uncomment this.
-#no-mangle-dos-filenames
+# GnuPG can automatically locate and retrieve keys as needed using
+# this option. This happens when encrypting to an email address (in
+# the "user@@example.com" form) and there are no keys matching
+# "user@example.com" in the local keyring. This option takes any
+# number mechanisms which are tried in the given order. The default
+# is "--auto-key-locate local" to search for keys only in the local
+# key database. Uncomment the next line to locate a missing key using
+# two DNS based mechanisms.
-# Lock the file only once for the lifetime of a process. If you do
-# not define this, the lock will be obtained and released every time
-# it is needed - normally this is not needed.
-
-#lock-once
+#auto-key-locate local,pka,dane
# Common options for keyserver functions:
@@ -109,18 +77,6 @@ require-cross-certification
# Can be used more than once to increase the amount
# of information shown.
#
-# use-temp-files = use temporary files instead of a pipe to talk to the
-# keyserver. Some platforms (Win32 for one) always
-# have this on.
-#
-# keep-temp-files = do not delete temporary files after using them
-# (really only useful for debugging)
-#
-# honor-http-proxy = if the keyserver uses HTTP, honor the http_proxy
-# environment variable
-#
-# broken-http-proxy = try to work around a buggy HTTP proxy
-#
# auto-key-retrieve = automatically fetch keys as needed from the keyserver
# when verifying signatures or when importing keys that
# have been revoked by a revocation key that is not
@@ -131,11 +87,13 @@ require-cross-certification
#keyserver-options auto-key-retrieve
+
# Uncomment this line to display photo user IDs in key listings and
# when a signature from a key with a photo is verified.
#show-photos
+
# Use this program to display photo user IDs
#
# %i is expanded to a temporary file that contains the photo.
@@ -166,3 +124,16 @@ require-cross-certification
#
# Use your MIME handler to view photos:
# photo-viewer "metamail -q -d -b -c %T -s 'KeyID 0x%k' -f GnuPG"
+
+
+# Because some mailers change lines starting with "From " to ">From "
+# it is good to handle such lines in a special way when creating
+# cleartext signatures; all other PGP versions do it this way too.
+# To enable full OpenPGP compliance you may want to use this option.
+
+#no-escape-from-lines
+
+
+# Uncomment the following option to get rid of the copyright notice
+
+#no-greeting
diff --git a/g10/packet.h b/g10/packet.h
index 9eb16cf..16524f8 100644
--- a/g10/packet.h
+++ b/g10/packet.h
@@ -298,6 +298,7 @@ typedef struct
unsigned int dont_cache:1; /* Do not cache this key. */
unsigned int backsig:2; /* 0=none, 1=bad, 2=good. */
unsigned int serialno_valid:1;/* SERIALNO below is valid. */
+ unsigned int exact:1; /* Found via exact (!) search. */
} flags;
PKT_user_id *user_id; /* If != NULL: found by that uid. */
struct revocation_key *revkey;
diff --git a/g10/parse-packet.c b/g10/parse-packet.c
index 53b75a6..38cd8c9 100644
--- a/g10/parse-packet.c
+++ b/g10/parse-packet.c
@@ -2313,6 +2313,11 @@ parse_key (IOBUF inp, int pkttype, unsigned long pktlen,
case 3:
for (i = 0; i < 8 && pktlen; i++, pktlen--)
temp[i] = iobuf_get_noeof (inp);
+ if (i < 8)
+ {
+ err = gpg_error (GPG_ERR_INV_PACKET);
+ goto leave;
+ }
memcpy (ski->s2k.salt, temp, 8);
break;
}
@@ -2428,7 +2433,7 @@ parse_key (IOBUF inp, int pkttype, unsigned long pktlen,
err = gpg_error (GPG_ERR_INV_PACKET);
goto leave;
}
- for (i = 0; i < ski->ivlen && pktlen; i++, pktlen--)
+ for (i = 0; i < ski->ivlen; i++, pktlen--)
temp[i] = iobuf_get_noeof (inp);
if (list_mode)
{
@@ -2517,6 +2522,7 @@ parse_key (IOBUF inp, int pkttype, unsigned long pktlen,
}
}
+ /* Note that KEYID below has been initialized above in list_mode. */
if (list_mode)
es_fprintf (listfp, "\tkeyid: %08lX%08lX\n",
(ulong) keyid[0], (ulong) keyid[1]);
@@ -2861,7 +2867,6 @@ parse_plaintext (IOBUF inp, int pkttype, unsigned long pktlen,
pktlen -= 4;
pt->len = pktlen;
pt->buf = inp;
- pktlen = 0;
if (list_mode)
{
diff --git a/g10/pkclist.c b/g10/pkclist.c
index c865660..d9ada59 100644
--- a/g10/pkclist.c
+++ b/g10/pkclist.c
@@ -893,15 +893,12 @@ find_and_check_key (ctrl_t ctrl, const char *name, unsigned int use,
Bit 0 (PK_LIST_ENCRYPT_TO): This is an encrypt-to recipient.
Bit 1 (PK_LIST_HIDDEN) : This is a hidden recipient.
- USE is the desired use for the key - usually PUBKEY_USAGE_ENC.
-
On success a list of keys is stored at the address RET_PK_LIST; the
caller must free this list. On error the value at this address is
not changed.
*/
int
-build_pk_list (ctrl_t ctrl,
- strlist_t rcpts, PK_LIST *ret_pk_list, unsigned int use )
+build_pk_list (ctrl_t ctrl, strlist_t rcpts, PK_LIST *ret_pk_list)
{
PK_LIST pk_list = NULL;
PKT_public_key *pk=NULL;
@@ -917,6 +914,60 @@ build_pk_list (ctrl_t ctrl,
else
remusr = rcpts;
+ /* XXX: Change this function to use get_pubkeys instead of
+ get_pubkey_byname to detect ambiguous key specifications and warn
+ about duplicate keyblocks. For ambiguous key specifications on
+ the command line or provided interactively, prompt the user to
+ select the best key. If a key specification is ambiguous and we
+ are in batch mode, die. */
+
+ if (opt.encrypt_to_default_key)
+ {
+ static int warned;
+
+ const char *default_key = parse_def_secret_key (ctrl);
+ if (default_key)
+ {
+ PK_LIST r = xmalloc_clear (sizeof *r);
+
+ r->pk = xmalloc_clear (sizeof *r->pk);
+ r->pk->req_usage = PUBKEY_USAGE_ENC;
+
+ rc = get_pubkey_byname (ctrl, NULL, r->pk, default_key,
+ NULL, NULL, 0, 1);
+ if (rc)
+ {
+ xfree (r->pk);
+ xfree (r);
+
+ log_error (_("can't encrypt to '%s'\n"), default_key);
+ if (!opt.quiet)
+ log_info (_("(check argument of option '%s')\n"),
+ "--default-key");
+ }
+ else
+ {
+ r->next = pk_list;
+ r->flags = 0;
+ pk_list = r;
+ }
+ }
+ else if (opt.def_secret_key)
+ {
+ if (! warned)
+ log_info (_("option '%s' given, but no valid default keys given\n"),
+ "--encrypt-to-default-key");
+ warned = 1;
+ }
+ else
+ {
+ if (! warned)
+ log_info (_("option '%s' given, but option '%s' not given\n"),
+ "--encrypt-to-default-key", "--default-key");
+ warned = 1;
+ }
+ }
+
/* Check whether there are any recipients in the list and build the
* list of the encrypt-to ones (we always trust them). */
for ( rov = remusr; rov; rov = rov->next )
@@ -938,12 +989,12 @@ build_pk_list (ctrl_t ctrl,
compliance_failure();
}
}
- else if ( (use & PUBKEY_USAGE_ENC) && !opt.no_encrypt_to )
+ else if (!opt.no_encrypt_to)
{
- /* Encryption has been requested and --encrypt-to has not
- been disabled. Check this encrypt-to key. */
+ /* --encrypt-to has not been disabled. Check this
+ encrypt-to key. */
pk = xmalloc_clear( sizeof *pk );
- pk->req_usage = use;
+ pk->req_usage = PUBKEY_USAGE_ENC;
/* We explicitly allow encrypt-to to an disabled key; thus
we pass 1 for the second last argument and 1 as the last
@@ -956,7 +1007,8 @@ build_pk_list (ctrl_t ctrl,
send_status_inv_recp (0, rov->d);
goto fail;
}
- else if ( !(rc=openpgp_pk_test_algo2 (pk->pubkey_algo, use)) )
+ else if ( !(rc=openpgp_pk_test_algo2 (pk->pubkey_algo,
+ PUBKEY_USAGE_ENC)) )
{
/* Skip the actual key if the key is already present
* in the list. Add it to our list if not. */
@@ -1084,11 +1136,12 @@ build_pk_list (ctrl_t ctrl,
/* Get and check key for the current name. */
free_public_key (pk);
pk = xmalloc_clear( sizeof *pk );
- pk->req_usage = use;
+ pk->req_usage = PUBKEY_USAGE_ENC;
rc = get_pubkey_byname (ctrl, NULL, pk, answer, NULL, NULL, 0, 0 );
if (rc)
tty_printf(_("No such user ID.\n"));
- else if ( !(rc=openpgp_pk_test_algo2 (pk->pubkey_algo, use)) )
+ else if ( !(rc=openpgp_pk_test_algo2 (pk->pubkey_algo,
+ PUBKEY_USAGE_ENC)) )
{
if ( have_def_rec )
{
@@ -1157,14 +1210,15 @@ build_pk_list (ctrl_t ctrl,
{
/* We are in batch mode and have only a default recipient. */
pk = xmalloc_clear( sizeof *pk );
- pk->req_usage = use;
+ pk->req_usage = PUBKEY_USAGE_ENC;
/* The default recipient is allowed to be disabled; thus pass 1
as second last argument. We also don't want an AKL. */
rc = get_pubkey_byname (ctrl, NULL, pk, def_rec, NULL, NULL, 1, 1);
if (rc)
log_error(_("unknown default recipient \"%s\"\n"), def_rec );
- else if ( !(rc=openpgp_pk_test_algo2(pk->pubkey_algo, use)) )
+ else if ( !(rc=openpgp_pk_test_algo2(pk->pubkey_algo,
+ PUBKEY_USAGE_ENC)) )
{
/* Mark any_recipients here since the default recipient
would have been used if it wasn't already there. It
@@ -1199,7 +1253,7 @@ build_pk_list (ctrl_t ctrl,
if ( (remusr->flags & PK_LIST_ENCRYPT_TO) )
continue; /* encrypt-to keys are already handled. */
- rc = find_and_check_key (ctrl, remusr->d, use,
+ rc = find_and_check_key (ctrl, remusr->d, PUBKEY_USAGE_ENC,
!!(remusr->flags&PK_LIST_HIDDEN),
&pk_list);
if (rc)
diff --git a/g10/progress.c b/g10/progress.c
index ca20223..f4b4698 100644
--- a/g10/progress.c
+++ b/g10/progress.c
@@ -131,7 +131,7 @@ progress_filter (void *opaque, int control,
release_progress_context (pfx);
}
else if (control == IOBUFCTRL_DESC)
- *(char**)buf = "progress_filter";
+ mem2str (buf, "progress_filter", *ret_len);
return rc;
}
diff --git a/g10/revoke.c b/g10/revoke.c
index ba87f35..a8f7658 100644
--- a/g10/revoke.c
+++ b/g10/revoke.c
@@ -564,14 +564,18 @@ gen_standard_revoke (PKT_public_key *psk, const char *cache_nonce)
(int)len, tmpstr);
xfree (tmpstr);
- es_fprintf (memfp, "%s\n\n%s\n\n:",
+ es_fprintf (memfp, "%s\n\n%s\n\n%s\n\n:",
+ _("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."),
_("Use it to revoke this key in case of a compromise or loss of\n"
"the secret key. However, if the secret key is still accessible,\n"
"it is better to generate a new revocation certificate and give\n"
- "a reason for the revocation."),
+ "a reason for the revocation. For details see the description of\n"
+ "of the gpg command \"--gen-revoke\" in the GnuPG manual."),
_("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 making use of this revocation certificate."));
+ "before importing and publishing this revocation certificate."));
es_putc (0, memfp);
@@ -583,6 +587,9 @@ gen_standard_revoke (PKT_public_key *psk, const char *cache_nonce)
reason.code = 0x00; /* No particular reason. */
reason.desc = NULL;
rc = create_revocation (fname, &reason, psk, NULL, leadin, 3, cache_nonce);
+ if (!rc && !opt.quiet)
+ log_info (_("revocation certificate stored as '%s.rev'\n"), fname);
+
xfree (leadin);
xfree (fname);
diff --git a/g10/server.c b/g10/server.c
index e5539d5..31e35a9 100644
--- a/g10/server.c
+++ b/g10/server.c
@@ -623,7 +623,8 @@ cmd_passwd (assuan_context_t ctx, char *line)
gpg_error_t err;
(void)ctx;
- line = skip_options (line);
+ (void)line;
+ /* line = skip_options (line); */
err = gpg_error (GPG_ERR_NOT_SUPPORTED);
diff --git a/g10/sig-check.c b/g10/sig-check.c
index 75b06e8..292adb9 100644
--- a/g10/sig-check.c
+++ b/g10/sig-check.c
@@ -48,42 +48,43 @@ check_signature (PKT_signature *sig, gcry_md_hd_t digest)
return check_signature2 (sig, digest, NULL, NULL, NULL, NULL);
}
-/* Check a signature.
-
- Looks up the public key that created the signature (SIG->KEYID)
- from the key db. Makes sure that the signature is valid (it was
- not created prior to the key, the public key was created in the
- past, and the signature does not include any unsupported critical
- features), finishes computing the hash of the signature data, and
- checks that the signature verifies the digest. If the key that
- generated the signature is a subkey, this function also verifies
- that there is a valid backsig from the subkey to the primary key.
- Finally, if status fd is enabled and the signature class is 0x00 or
- 0x01, then a STATUS_SIG_ID is emitted on the status fd.
-
- SIG is the signature to check.
-
- DIGEST contains a valid hash context that already includes the
- signed data. This function adds the relevant meta-data from the
- signature packet to compute the final hash. (See Section 5.2 of
- RFC 4880: "The concatenation of the data being signed and the
- signature data from the version number through the hashed subpacket
- data (inclusive) is hashed.")
-
- If R_EXPIREDATE is not NULL, R_EXPIREDATE is set to the key's
- expiry.
- If R_EXPIRED is not NULL, *R_EXPIRED is set to 1 if PK has expired
- (0 otherwise). Note: PK being expired does not cause this function
- to fail.
-
- If R_REVOKED is not NULL, *R_REVOKED is set to 1 if PK has been
- revoked (0 otherwise). Note: PK being revoked does not cause this
- function to fail.
-
- If PK is not NULL, the public key is saved in *PK on success.
-
- Returns 0 on success. An error code otherwise. */
+/* Check a signature.
+ *
+ * Looks up the public key that created the signature (SIG->KEYID)
+ * from the key db. Makes sure that the signature is valid (it was
+ * not created prior to the key, the public key was created in the
+ * past, and the signature does not include any unsupported critical
+ * features), finishes computing the hash of the signature data, and
+ * checks that the signature verifies the digest. If the key that
+ * generated the signature is a subkey, this function also verifies
+ * that there is a valid backsig from the subkey to the primary key.
+ * Finally, if status fd is enabled and the signature class is 0x00 or
+ * 0x01, then a STATUS_SIG_ID is emitted on the status fd.
+ *
+ * SIG is the signature to check.
+ *
+ * DIGEST contains a valid hash context that already includes the
+ * signed data. This function adds the relevant meta-data from the
+ * signature packet to compute the final hash. (See Section 5.2 of
+ * RFC 4880: "The concatenation of the data being signed and the
+ * signature data from the version number through the hashed subpacket
+ * data (inclusive) is hashed.")
+ *
+ * If R_EXPIREDATE is not NULL, R_EXPIREDATE is set to the key's
+ * expiry.
+ *
+ * If R_EXPIRED is not NULL, *R_EXPIRED is set to 1 if PK has expired
+ * (0 otherwise). Note: PK being expired does not cause this function
+ * to fail.
+ *
+ * If R_REVOKED is not NULL, *R_REVOKED is set to 1 if PK has been
+ * revoked (0 otherwise). Note: PK being revoked does not cause this
+ * function to fail.
+ *
+ * If PK is not NULL, the public key is saved in *PK on success.
+ *
+ * Returns 0 on success. An error code otherwise. */
int
check_signature2 (PKT_signature *sig, gcry_md_hd_t digest, u32 *r_expiredate,
int *r_expired, int *r_revoked, PKT_public_key *pk )
@@ -237,22 +238,22 @@ check_signature2 (PKT_signature *sig, gcry_md_hd_t digest, u32 *r_expiredate,
/* The signature SIG was generated with the public key PK. Check
- whether the signature is valid in the following sense:
-
- - Make sure the public key was created before the signature was
- generated.
-
- - Make sure the public key was created in the past
-
- - Check whether PK has expired (set *R_EXPIRED to 1 if so and 0
- otherwise)
-
- - Check whether PK has been revoked (set *R_REVOKED to 1 if so
- and 0 otherwise).
-
- If either of the first two tests fail, returns an error code.
- Otherwise returns 0. (Thus, this function doesn't fail if the
- public key is expired or revoked.) */
+ * whether the signature is valid in the following sense:
+ *
+ * - Make sure the public key was created before the signature was
+ * generated.
+ *
+ * - Make sure the public key was created in the past
+ *
+ * - Check whether PK has expired (set *R_EXPIRED to 1 if so and 0
+ * otherwise)
+ *
+ * - Check whether PK has been revoked (set *R_REVOKED to 1 if so
+ * and 0 otherwise).
+ *
+ * If either of the first two tests fail, returns an error code.
+ * Otherwise returns 0. (Thus, this function doesn't fail if the
+ * public key is expired or revoked.) */
static int
check_signature_metadata_validity (PKT_public_key *pk, PKT_signature *sig,
int *r_expired, int *r_revoked)
@@ -267,11 +268,24 @@ check_signature_metadata_validity (PKT_public_key *pk, PKT_signature *sig,
if( pk->timestamp > sig->timestamp )
{
ulong d = pk->timestamp - sig->timestamp;
- log_info(d==1
- ?_("public key %s is %lu second newer than the signature\n")
- :_("public key %s is %lu seconds newer than the signature\n"),
- keystr_from_pk(pk),d );
- if( !opt.ignore_time_conflict )
+ if ( d < 86400 )
+ {
+ log_info
+ (ngettext
+ ("public key %s is %lu second newer than the signature\n",
+ "public key %s is %lu seconds newer than the signature\n",
+ d), keystr_from_pk (pk), d);
+ }
+ else
+ {
+ d /= 86400;
+ log_info
+ (ngettext
+ ("public key %s is %lu day newer than the signature\n",
+ "public key %s is %lu days newer than the signature\n",
+ d), keystr_from_pk (pk), d);
+ }
+ if (!opt.ignore_time_conflict)
return GPG_ERR_TIME_CONFLICT; /* pubkey newer than signature. */
}
@@ -279,13 +293,24 @@ check_signature_metadata_validity (PKT_public_key *pk, PKT_signature *sig,
if( pk->timestamp > cur_time )
{
ulong d = pk->timestamp - cur_time;
- log_info( d==1
- ? _("key %s was created %lu second"
- " in the future (time warp or clock problem)\n")
- : _("key %s was created %lu seconds"
- " in the future (time warp or clock problem)\n"),
- keystr_from_pk(pk),d );
- if( !opt.ignore_time_conflict )
+ if (d < 86400)
+ {
+ log_info (ngettext("key %s was created %lu second"
+ " in the future (time warp or clock problem)\n",
+ "key %s was created %lu seconds"
+ " in the future (time warp or clock problem)\n",
+ d), keystr_from_pk (pk), d);
+ }
+ else
+ {
+ d /= 86400;
+ log_info (ngettext("key %s was created %lu day"
+ " in the future (time warp or clock problem)\n",
+ "key %s was created %lu days"
+ " in the future (time warp or clock problem)\n",
+ d), keystr_from_pk (pk), d);
+ }
+ if (!opt.ignore_time_conflict)
return GPG_ERR_TIME_CONFLICT;
}
@@ -318,34 +343,34 @@ check_signature_metadata_validity (PKT_public_key *pk, PKT_signature *sig,
/* Finish generating a signature and check it. Concretely: make sure
- that the signature is valid (it was not created prior to the key,
- the public key was created in the past, and the signature does not
- include any unsupported critical features), finish computing the
- digest by adding the relevant data from the signature packet, and
- check that the signature verifies the digest.
-
- DIGEST contains a hash context, which has already hashed the signed
- data. This function adds the relevant meta-data from the signature
- packet to compute the final hash. (See Section 5.2 of RFC 4880:
- "The concatenation of the data being signed and the signature data
- from the version number through the hashed subpacket data
- (inclusive) is hashed.")
-
- SIG is the signature to check.
-
- PK is the public key used to generate the signature.
-
- If R_EXPIRED is not NULL, *R_EXPIRED is set to 1 if PK has expired
- (0 otherwise). Note: PK being expired does not cause this function
- to fail.
-
- If R_REVOKED is not NULL, *R_REVOKED is set to 1 if PK has been
- revoked (0 otherwise). Note: PK being revoked does not cause this
- function to fail.
-
- If RET_PK is not NULL, PK is copied into RET_PK on success.
-
- Returns 0 on success. An error code other. */
+ * that the signature is valid (it was not created prior to the key,
+ * the public key was created in the past, and the signature does not
+ * include any unsupported critical features), finish computing the
+ * digest by adding the relevant data from the signature packet, and
+ * check that the signature verifies the digest.
+ *
+ * DIGEST contains a hash context, which has already hashed the signed
+ * data. This function adds the relevant meta-data from the signature
+ * packet to compute the final hash. (See Section 5.2 of RFC 4880:
+ * "The concatenation of the data being signed and the signature data
+ * from the version number through the hashed subpacket data
+ * (inclusive) is hashed.")
+ *
+ * SIG is the signature to check.
+ *
+ * PK is the public key used to generate the signature.
+ *
+ * If R_EXPIRED is not NULL, *R_EXPIRED is set to 1 if PK has expired
+ * (0 otherwise). Note: PK being expired does not cause this function
+ * to fail.
+ *
+ * If R_REVOKED is not NULL, *R_REVOKED is set to 1 if PK has been
+ * revoked (0 otherwise). Note: PK being revoked does not cause this
+ * function to fail.
+ *
+ * If RET_PK is not NULL, PK is copied into RET_PK on success.
+ *
+ * Returns 0 on success. An error code other. */
static int
check_signature_end (PKT_public_key *pk, PKT_signature *sig,
gcry_md_hd_t digest,
@@ -486,35 +511,36 @@ cache_sig_result ( PKT_signature *sig, int result )
}
}
+
/* SIG is a key revocation signature. Check if this signature was
- generated by any of the public key PK's designated revokers.
-
- PK is the public key that SIG allegedly revokes.
-
- SIG is the revocation signature to check.
-
- This function avoids infinite recursion, which can happen if two
- keys are designed revokers for each other and they revoke each
- other. This is done by observing that if a key A is revoked by key
- B we still consider the revocation to be valid even if B is
- revoked. Thus, we don't need to determine whether B is revoked to
- determine whether A has been revoked by B, we just need to check
- the signature.
-
- Returns 0 if sig is valid (i.e. pk is revoked), non-0 if not
- revoked. We are careful to make sure that GPG_ERR_NO_PUBKEY is
- only returned when a revocation signature is from a valid
- revocation key designated in a revkey subpacket, but the revocation
- key itself isn't present. */
-
-/* XXX: This code will need to be modified if gpg ever becomes
- multi-threaded. Note that this guarantees that a designated
- revocation sig will never be considered valid unless it is actually
- valid, as well as being issued by a revocation key in a valid
- direct signature. Note also that this is written so that a revoked
- revoker can still issue revocations: i.e. If A revokes B, but A is
- revoked, B is still revoked. I'm not completely convinced this is
- the proper behavior, but it matches how PGP does it. -dms */
+ * generated by any of the public key PK's designated revokers.
+ *
+ * PK is the public key that SIG allegedly revokes.
+ *
+ * SIG is the revocation signature to check.
+ *
+ * This function avoids infinite recursion, which can happen if two
+ * keys are designed revokers for each other and they revoke each
+ * other. This is done by observing that if a key A is revoked by key
+ * B we still consider the revocation to be valid even if B is
+ * revoked. Thus, we don't need to determine whether B is revoked to
+ * determine whether A has been revoked by B, we just need to check
+ * the signature.
+ *
+ * Returns 0 if sig is valid (i.e. pk is revoked), non-0 if not
+ * revoked. We are careful to make sure that GPG_ERR_NO_PUBKEY is
+ * only returned when a revocation signature is from a valid
+ * revocation key designated in a revkey subpacket, but the revocation
+ * key itself isn't present.
+ *
+ * XXX: This code will need to be modified if gpg ever becomes
+ * multi-threaded. Note that this guarantees that a designated
+ * revocation sig will never be considered valid unless it is actually
+ * valid, as well as being issued by a revocation key in a valid
+ * direct signature. Note also that this is written so that a revoked
+ * revoker can still issue revocations: i.e. If A revokes B, but A is
+ * revoked, B is still revoked. I'm not completely convinced this is
+ * the proper behavior, but it matches how PGP does it. -dms */
int
check_revocation_keys (PKT_public_key *pk, PKT_signature *sig)
{
@@ -526,29 +552,29 @@ check_revocation_keys (PKT_public_key *pk, PKT_signature *sig)
assert((sig->keyid[0]!=pk->keyid[0]) || (sig->keyid[0]!=pk->keyid[1]));
/* Avoid infinite recursion. Consider the following:
-
- - We want to check if A is revoked.
-
- - C is a designated revoker for B and has revoked B.
-
- - B is a designated revoker for A and has revoked A.
-
- When checking if A is revoked (in merge_selfsigs_main), we
- observe that A has a designed revoker. As such, we call this
- function. This function sees that there is a valid revocation
- signature, which is signed by B. It then calls check_signature()
- to verify that the signature is good. To check the sig, we need
- to lookup B. Looking up B means calling merge_selfsigs_main,
- which checks whether B is revoked, which calls this function to
- see if B was revoked by some key.
-
- In this case, the added level of indirection doesn't hurt. It
- just means a bit more work. However, if C == A, then we'd end up
- in a loop. But, it doesn't make sense to look up C anyways: even
- if B is revoked, we conservatively consider a valid revocation
- signed by B to revoke A. Since this is the only place where this
- type of recursion can occur, we simply cause this function to
- fail if it is entered recursively. */
+ *
+ * - We want to check if A is revoked.
+ *
+ * - C is a designated revoker for B and has revoked B.
+ *
+ * - B is a designated revoker for A and has revoked A.
+ *
+ * When checking if A is revoked (in merge_selfsigs_main), we
+ * observe that A has a designed revoker. As such, we call this
+ * function. This function sees that there is a valid revocation
+ * signature, which is signed by B. It then calls check_signature()
+ * to verify that the signature is good. To check the sig, we need
+ * to lookup B. Looking up B means calling merge_selfsigs_main,
+ * which checks whether B is revoked, which calls this function to
+ * see if B was revoked by some key.
+ *
+ * In this case, the added level of indirection doesn't hurt. It
+ * just means a bit more work. However, if C == A, then we'd end up
+ * in a loop. But, it doesn't make sense to look up C anyways: even
+ * if B is revoked, we conservatively consider a valid revocation
+ * signed by B to revoke A. Since this is the only place where this
+ * type of recursion can occur, we simply cause this function to
+ * fail if it is entered recursively. */
if (busy)
{
/* Return an error (i.e. not revoked), but mark the pk as
@@ -637,202 +663,225 @@ check_backsig (PKT_public_key *main_pk,PKT_public_key *sub_pk,
/* Check that a signature over a key is valid. This is a
- specialization of check_key_signature2 with the unnamed parameters
- passed as NULL. See the documentation for that function for more
- details. */
+ * specialization of check_key_signature2 with the unnamed parameters
+ * passed as NULL. See the documentation for that function for more
+ * details. */
int
check_key_signature (KBNODE root, KBNODE node, int *is_selfsig)
{
return check_key_signature2 (root, node, NULL, NULL, is_selfsig, NULL, NULL);
}
-/* Check that a signature over a key (e.g., a key revocation, key
- binding, user id certification, etc.) is valid. If the function
- detects a self-signature, it uses the public key from the specified
- key block and does not bother looking up the key specified in the
- signature packet.
-
- ROOT is a keyblock.
-
- NODE references a signature packet that appears in the keyblock
- that should be verified.
-
- If CHECK_PK is set, the specified key is sometimes preferred for
- verifying signatures. See the implementation for details.
-
- If RET_PK is not NULL, the public key that successfully verified
- the signature is copied into *RET_PK.
- If IS_SELFSIG is not NULL, *IS_SELFSIG is set to 1 if NODE is a
- self-signature.
-
- If R_EXPIREDATE is not NULL, *R_EXPIREDATE is set to the expiry
- date.
-
- If R_EXPIRED is not NULL, *R_EXPIRED is set to 1 if PK has been
- expired (0 otherwise). Note: PK being revoked does not cause this
- function to fail.
-
-
- If OPT.NO_SIG_CACHE is not set, this function will first check if
- the result of a previous verification is already cached in the
- signature packet's data structure. */
-/* TODO: add r_revoked here as well. It has the same problems as
- r_expiredate and r_expired and the cache. */
+/* Check that a signature over a key (e.g., a key revocation, key
+ * binding, user id certification, etc.) is valid. If the function
+ * detects a self-signature, it uses the public key from the specified
+ * key block and does not bother looking up the key specified in the
+ * signature packet.
+ *
+ * ROOT is a keyblock.
+ *
+ * NODE references a signature packet that appears in the keyblock
+ * that should be verified.
+ *
+ * If CHECK_PK is set, the specified key is sometimes preferred for
+ * verifying signatures. See the implementation for details.
+ *
+ * If RET_PK is not NULL, the public key that successfully verified
+ * the signature is copied into *RET_PK.
+ *
+ * If IS_SELFSIG is not NULL, *IS_SELFSIG is set to 1 if NODE is a
+ * self-signature.
+ *
+ * If R_EXPIREDATE is not NULL, *R_EXPIREDATE is set to the expiry
+ * date.
+ *
+ * If R_EXPIRED is not NULL, *R_EXPIRED is set to 1 if PK has been
+ * expired (0 otherwise). Note: PK being revoked does not cause this
+ * function to fail.
+ *
+ *
+ * If OPT.NO_SIG_CACHE is not set, this function will first check if
+ * the result of a previous verification is already cached in the
+ * signature packet's data structure.
+ *
+ * TODO: add r_revoked here as well. It has the same problems as
+ * r_expiredate and r_expired and the cache. */
int
-check_key_signature2(KBNODE root, KBNODE node, PKT_public_key *check_pk,
- PKT_public_key *ret_pk, int *is_selfsig,
- u32 *r_expiredate, int *r_expired )
+check_key_signature2 (kbnode_t root, kbnode_t node, PKT_public_key *check_pk,
+ PKT_public_key *ret_pk, int *is_selfsig,
+ u32 *r_expiredate, int *r_expired )
{
- gcry_md_hd_t md;
- PKT_public_key *pk;
- PKT_signature *sig;
- int algo;
- int rc;
-
- if( is_selfsig )
- *is_selfsig = 0;
- if( r_expiredate )
- *r_expiredate = 0;
- if( r_expired )
- *r_expired = 0;
- assert( node->pkt->pkttype == PKT_SIGNATURE );
- assert( root->pkt->pkttype == PKT_PUBLIC_KEY );
-
- pk = root->pkt->pkt.public_key;
- sig = node->pkt->pkt.signature;
- algo = sig->digest_algo;
-
- /* Check whether we have cached the result of a previous signature
- check. Note that we may no longer have the pubkey or hash
- needed to verify a sig, but can still use the cached value. A
- cache refresh detects and clears these cases. */
- if ( !opt.no_sig_cache ) {
- if (sig->flags.checked) { /*cached status available*/
- if( is_selfsig ) {
- u32 keyid[2];
+ gcry_md_hd_t md;
+ PKT_public_key *pk;
+ PKT_signature *sig;
+ int algo;
+ int rc;
- keyid_from_pk( pk, keyid );
- if( keyid[0] == sig->keyid[0] && keyid[1] == sig->keyid[1] )
- *is_selfsig = 1;
+ if (is_selfsig)
+ *is_selfsig = 0;
+ if (r_expiredate)
+ *r_expiredate = 0;
+ if (r_expired)
+ *r_expired = 0;
+ assert (node->pkt->pkttype == PKT_SIGNATURE);
+ assert (root->pkt->pkttype == PKT_PUBLIC_KEY);
+
+ pk = root->pkt->pkt.public_key;
+ sig = node->pkt->pkt.signature;
+ algo = sig->digest_algo;
+
+ /* Check whether we have cached the result of a previous signature
+ check. Note that we may no longer have the pubkey or hash
+ needed to verify a sig, but can still use the cached value. A
+ cache refresh detects and clears these cases. */
+ if ( !opt.no_sig_cache )
+ {
+ if (sig->flags.checked) /* Cached status available. */
+ {
+ if (is_selfsig)
+ {
+ u32 keyid[2];
+
+ keyid_from_pk (pk, keyid);
+ if (keyid[0] == sig->keyid[0] && keyid[1] == sig->keyid[1])
+ *is_selfsig = 1;
}
- /* BUG: This is wrong for non-self-sigs.. needs to be the
- actual pk */
- if((rc = check_signature_metadata_validity (pk, sig,
- r_expired, NULL)))
- return rc;
- return sig->flags.valid? 0 : gpg_error (GPG_ERR_BAD_SIGNATURE);
+ /* BUG: This is wrong for non-self-sigs... needs to be the
+ actual pk. */
+ rc = check_signature_metadata_validity (pk, sig, r_expired, NULL);
+ if (rc)
+ return rc;
+ return sig->flags.valid? 0 : gpg_error (GPG_ERR_BAD_SIGNATURE);
}
}
- if( (rc=openpgp_pk_test_algo(sig->pubkey_algo)) )
- return rc;
- if( (rc=openpgp_md_test_algo(algo)) )
- return rc;
-
- if( sig->sig_class == 0x20 ) { /* key revocation */
- u32 keyid[2];
- keyid_from_pk( pk, keyid );
+ rc = openpgp_pk_test_algo(sig->pubkey_algo);
+ if (rc)
+ return rc;
+ rc = openpgp_md_test_algo(algo);
+ if (rc)
+ return rc;
- /* is it a designated revoker? */
- if(keyid[0]!=sig->keyid[0] || keyid[1]!=sig->keyid[1])
- rc=check_revocation_keys(pk,sig);
- else
- {
- if (gcry_md_open (&md, algo, 0 ))
- BUG ();
- hash_public_key( md, pk );
- rc = check_signature_end (pk, sig, md, r_expired, NULL, ret_pk);
- cache_sig_result ( sig, rc );
- gcry_md_close(md);
- }
+ if (sig->sig_class == 0x20) /* key revocation */
+ {
+ u32 keyid[2];
+ keyid_from_pk( pk, keyid );
+
+ /* Is it a designated revoker? */
+ if (keyid[0] != sig->keyid[0] || keyid[1] != sig->keyid[1])
+ rc = check_revocation_keys (pk, sig);
+ else
+ {
+ if (gcry_md_open (&md, algo, 0))
+ BUG ();
+ hash_public_key (md, pk);
+ rc = check_signature_end (pk, sig, md, r_expired, NULL, ret_pk);
+ cache_sig_result (sig, rc);
+ gcry_md_close (md);
+ }
}
- else if( sig->sig_class == 0x28 ) { /* subkey revocation */
- KBNODE snode = find_prev_kbnode( root, node, PKT_PUBLIC_SUBKEY );
-
- if( snode ) {
- if (gcry_md_open (&md, algo, 0))
- BUG ();
- hash_public_key( md, pk );
- hash_public_key( md, snode->pkt->pkt.public_key );
- rc = check_signature_end (pk, sig, md, r_expired, NULL, ret_pk);
- cache_sig_result ( sig, rc );
- gcry_md_close(md);
+ else if (sig->sig_class == 0x28) /* subkey revocation */
+ {
+ kbnode_t snode = find_prev_kbnode (root, node, PKT_PUBLIC_SUBKEY);
+
+ if (snode)
+ {
+ if (gcry_md_open (&md, algo, 0))
+ BUG ();
+ hash_public_key (md, pk);
+ hash_public_key (md, snode->pkt->pkt.public_key);
+ rc = check_signature_end (pk, sig, md, r_expired, NULL, ret_pk);
+ cache_sig_result (sig, rc);
+ gcry_md_close (md);
}
- else
- {
- if (opt.verbose)
- log_info (_("key %s: no subkey for subkey"
- " revocation signature\n"),keystr_from_pk(pk));
- rc = GPG_ERR_SIG_CLASS;
- }
+ else
+ {
+ if (opt.verbose)
+ log_info (_("key %s: no subkey for subkey"
+ " revocation signature\n"), keystr_from_pk(pk));
+ rc = GPG_ERR_SIG_CLASS;
+ }
}
- else if( sig->sig_class == 0x18 ) { /* key binding */
- KBNODE snode = find_prev_kbnode( root, node, PKT_PUBLIC_SUBKEY );
+ else if (sig->sig_class == 0x18) /* key binding */
+ {
+ kbnode_t snode = find_prev_kbnode (root, node, PKT_PUBLIC_SUBKEY);
- if( snode ) {
- if( is_selfsig ) { /* does this make sense????? */
- u32 keyid[2]; /* it should always be a selfsig */
+ if (snode)
+ {
+ if (is_selfsig)
+ {
+ /* Does this make sense? It should always be a
+ selfsig. Yes: We can't be sure about this and we
+ need to be able to indicate that it is a selfsig.
+ FIXME: The question is whether we should reject
+ such a signature if it is not a selfsig. */
+ u32 keyid[2];
- keyid_from_pk( pk, keyid );
- if( keyid[0] == sig->keyid[0] && keyid[1] == sig->keyid[1] )
- *is_selfsig = 1;
- }
+ keyid_from_pk (pk, keyid);
+ if (keyid[0] == sig->keyid[0] && keyid[1] == sig->keyid[1])
+ *is_selfsig = 1;
+ }
if (gcry_md_open (&md, algo, 0))
BUG ();
- hash_public_key( md, pk );
- hash_public_key( md, snode->pkt->pkt.public_key );
+ hash_public_key (md, pk);
+ hash_public_key (md, snode->pkt->pkt.public_key);
rc = check_signature_end (pk, sig, md, r_expired, NULL, ret_pk);
cache_sig_result ( sig, rc );
- gcry_md_close(md);
- }
+ gcry_md_close (md);
+ }
else
{
if (opt.verbose)
log_info(_("key %s: no subkey for subkey"
- " binding signature\n"),keystr_from_pk(pk));
+ " binding signature\n"), keystr_from_pk(pk));
rc = GPG_ERR_SIG_CLASS;
}
- }
- else if( sig->sig_class == 0x1f ) { /* direct key signature */
+ }
+ else if (sig->sig_class == 0x1f) /* direct key signature */
+ {
if (gcry_md_open (&md, algo, 0 ))
BUG ();
hash_public_key( md, pk );
rc = check_signature_end (pk, sig, md, r_expired, NULL, ret_pk);
- cache_sig_result ( sig, rc );
- gcry_md_close(md);
- }
- else { /* all other classes */
- KBNODE unode = find_prev_kbnode( root, node, PKT_USER_ID );
+ cache_sig_result (sig, rc);
+ gcry_md_close (md);
+ }
+ else /* all other classes */
+ {
+ kbnode_t unode = find_prev_kbnode (root, node, PKT_USER_ID);
- if( unode ) {
+ if (unode)
+ {
u32 keyid[2];
- keyid_from_pk( pk, keyid );
- if (gcry_md_open (&md, algo, 0 ))
+ keyid_from_pk (pk, keyid);
+ if (gcry_md_open (&md, algo, 0))
BUG ();
- hash_public_key( md, pk );
- hash_uid_node( unode, md, sig );
- if( keyid[0] == sig->keyid[0] && keyid[1] == sig->keyid[1] )
- /* The primary key is the signing key. */
- {
- if( is_selfsig )
+ hash_public_key (md, pk);
+ hash_uid_node (unode, md, sig);
+ if (keyid[0] == sig->keyid[0] && keyid[1] == sig->keyid[1])
+ { /* The primary key is the signing key. */
+
+ if (is_selfsig)
*is_selfsig = 1;
rc = check_signature_end (pk, sig, md, r_expired, NULL, ret_pk);
}
else if (check_pk)
- /* The caller specified a key. Try that. */
- rc = check_signature_end (check_pk, sig, md,
- r_expired, NULL, ret_pk);
+ { /* The caller specified a key. Try that. */
+
+ rc = check_signature_end (check_pk, sig, md,
+ r_expired, NULL, ret_pk);
+ }
else
- /* Look up the key. XXX: Could it be that the key is
- not is not in this keyblock? */
- rc = check_signature2 (sig, md, r_expiredate, r_expired,
- NULL, ret_pk);
+ { /* Look up the key. */
+ rc = check_signature2 (sig, md, r_expiredate, r_expired,
+ NULL, ret_pk);
+ }
- cache_sig_result ( sig, rc );
- gcry_md_close(md);
- }
+ cache_sig_result (sig, rc);
+ gcry_md_close (md);
+ }
else
{
if (!opt.quiet)
@@ -840,7 +889,7 @@ check_key_signature2(KBNODE root, KBNODE node, PKT_public_key *check_pk,
" of class %02x\n",keystr_from_pk(pk),sig->sig_class);
rc = GPG_ERR_SIG_CLASS;
}
- }
+ }
- return rc;
+ return rc;
}
diff --git a/g10/sign.c b/g10/sign.c
index baa0068..c3ae028 100644
--- a/g10/sign.c
+++ b/g10/sign.c
@@ -235,15 +235,15 @@ do_sign (PKT_public_key *pksk, PKT_signature *sig,
if (pksk->timestamp > sig->timestamp )
{
ulong d = pksk->timestamp - sig->timestamp;
- log_info (d==1 ? _("key has been created %lu second "
- "in future (time warp or clock problem)\n")
- : _("key has been created %lu seconds "
- "in future (time warp or clock problem)\n"), d );
+ log_info (ngettext("key %s was created %lu second"
+ " in the future (time warp or clock problem)\n",
+ "key %s was created %lu seconds"
+ " in the future (time warp or clock problem)\n",
+ d), keystr_from_pk (pksk), d);
if (!opt.ignore_time_conflict)
return gpg_error (GPG_ERR_TIME_CONFLICT);
}
-
print_pubkey_algo_note (pksk->pubkey_algo);
if (!mdalgo)
@@ -601,6 +601,7 @@ write_plaintext_packet (IOBUF out, IOBUF inp, const char *fname, int ptmode)
if (!opt.no_literal) {
PACKET pkt;
+ /* Note that PT has been initialized above in no_literal mode. */
pt->timestamp = make_timestamp ();
pt->mode = ptmode;
pt->len = filesize;
@@ -773,7 +774,7 @@ sign_file (ctrl_t ctrl, strlist_t filenames, int detached, strlist_t locusr,
goto leave;
if (encryptflag
- && (rc=build_pk_list (ctrl, remusr, &pk_list, PUBKEY_USAGE_ENC)))
+ && (rc=build_pk_list (ctrl, remusr, &pk_list)))
goto leave;
/* prepare iobufs */
diff --git a/g10/skclist.c b/g10/skclist.c
index 3d137b2..1eb0633 100644
--- a/g10/skclist.c
+++ b/g10/skclist.c
@@ -120,6 +120,13 @@ build_sk_list (ctrl_t ctrl,
gpg_error_t err;
SK_LIST sk_list = NULL;
+ /* XXX: Change this function to use get_pubkeys instead of
+ getkey_byname to detect ambiguous key specifications and warn
+ about duplicate keyblocks. For ambiguous key specifications on
+ the command line or provided interactively, prompt the user to
+ select the best key. If a key specification is ambiguous and we
+ are in batch mode, die. */
+
if (!locusr) /* No user ids given - use the default key. */
{
PKT_public_key *pk;
diff --git a/g10/tdbio.c b/g10/tdbio.c
index 63ccfae..3cc8bd3 100644
--- a/g10/tdbio.c
+++ b/g10/tdbio.c
@@ -1497,13 +1497,16 @@ tdbio_read_record (ulong recnum, TRUSTREC *rec, int expected)
rec->r.ver.trust_model = *p++;
rec->r.ver.min_cert_level = *p++;
p += 2;
- rec->r.ver.created = buf32_to_ulong(p); p += 4;
- rec->r.ver.nextcheck = buf32_to_ulong(p); p += 4;
+ rec->r.ver.created = buf32_to_ulong(p);
p += 4;
+ rec->r.ver.nextcheck = buf32_to_ulong(p);
p += 4;
- rec->r.ver.firstfree =buf32_to_ulong(p); p += 4;
p += 4;
- rec->r.ver.trusthashtbl =buf32_to_ulong(p); p += 4;
+ p += 4;
+ rec->r.ver.firstfree = buf32_to_ulong(p);
+ p += 4;
+ p += 4;
+ rec->r.ver.trusthashtbl = buf32_to_ulong(p);
if (recnum)
{
log_error( _("%s: version record with recnum %lu\n"), db_name,
@@ -1520,37 +1523,43 @@ tdbio_read_record (ulong recnum, TRUSTREC *rec, int expected)
break;
case RECTYPE_FREE:
- rec->r.free.next = buf32_to_ulong(p); p += 4;
+ rec->r.free.next = buf32_to_ulong(p);
break;
case RECTYPE_HTBL:
for (i=0; i < ITEMS_PER_HTBL_RECORD; i++)
{
- rec->r.htbl.item[i] = buf32_to_ulong(p); p += 4;
+ rec->r.htbl.item[i] = buf32_to_ulong(p);
+ p += 4;
}
break;
case RECTYPE_HLST:
- rec->r.hlst.next = buf32_to_ulong(p); p += 4;
+ rec->r.hlst.next = buf32_to_ulong(p);
+ p += 4;
for (i=0; i < ITEMS_PER_HLST_RECORD; i++)
{
- rec->r.hlst.rnum[i] = buf32_to_ulong(p); p += 4;
+ rec->r.hlst.rnum[i] = buf32_to_ulong(p);
+ p += 4;
}
break;
case RECTYPE_TRUST:
- memcpy (rec->r.trust.fingerprint, p, 20); p+=20;
+ memcpy (rec->r.trust.fingerprint, p, 20);
+ p+=20;
rec->r.trust.ownertrust = *p++;
rec->r.trust.depth = *p++;
rec->r.trust.min_ownertrust = *p++;
p++;
- rec->r.trust.validlist = buf32_to_ulong(p); p += 4;
+ rec->r.trust.validlist = buf32_to_ulong(p);
break;
case RECTYPE_VALID:
- memcpy (rec->r.valid.namehash, p, 20); p+=20;
+ memcpy (rec->r.valid.namehash, p, 20);
+ p+=20;
rec->r.valid.validity = *p++;
- rec->r.valid.next = buf32_to_ulong(p); p += 4;
+ rec->r.valid.next = buf32_to_ulong(p);
+ p += 4;
rec->r.valid.full_count = *p++;
rec->r.valid.marginal_count = *p++;
break;
diff --git a/g10/test-stubs.c b/g10/test-stubs.c
index a1988f0..74b6bf7 100644
--- a/g10/test-stubs.c
+++ b/g10/test-stubs.c
@@ -157,6 +157,13 @@ keyserver_match (struct keyserver_spec *spec)
}
int
+keyserver_any_configured (ctrl_t ctrl)
+{
+ (void)ctrl;
+ return 0;
+}
+
+int
keyserver_import_keyid (u32 *keyid, void *dummy)
{
(void)keyid;
diff --git a/g10/test.c b/g10/test.c
index 59a015c..39d5945 100644
--- a/g10/test.c
+++ b/g10/test.c
@@ -63,11 +63,12 @@ static int verbose;
int expected_result; \
\
tests ++; \
- \
- printf ("%d. Checking %s...", \
- tests, (description) ?: ""); \
- fflush (stdout); \
- \
+ if (verbose) \
+ { \
+ printf ("%d. Checking %s...", \
+ tests, (description) ?: ""); \
+ fflush (stdout); \
+ } \
test_result = (test); \
expected_result = (expected); \
\
diff --git a/g10/textfilter.c b/g10/textfilter.c
index 394d9c3..da303c4 100644
--- a/g10/textfilter.c
+++ b/g10/textfilter.c
@@ -150,7 +150,7 @@ text_filter( void *opaque, int control,
tfx->buffer = NULL;
}
else if( control == IOBUFCTRL_DESC )
- *(char**)buf = "text_filter";
+ mem2str (buf, "text_filter", *ret_len);
return rc;
}
diff --git a/g10/tofu.c b/g10/tofu.c
index b7f61e9..6a88172 100644
--- a/g10/tofu.c
+++ b/g10/tofu.c
@@ -38,12 +38,17 @@
#include "options.h"
#include "mbox-util.h"
#include "i18n.h"
+#include "ttyio.h"
#include "trustdb.h"
#include "mkdir_p.h"
#include "sqlite.h"
#include "tofu.h"
+
+#define CONTROL_L ('L' - 'A' + 1)
+
+
#define DEBUG_TOFU_CACHE 0
#if DEBUG_TOFU_CACHE
static int prepares_saved;
@@ -144,28 +149,16 @@ tofu_cache_dump (struct db *db)
#define TIME_AGO_FUTURE_IGNORE (2 * 60 * 60)
#if 0
# define TIME_AGO_UNIT_SMALL 60
-# define TIME_AGO_UNIT_SMALL_NAME _("minute")
-# define TIME_AGO_UNIT_SMALL_NAME_PLURAL _("minutes")
# define TIME_AGO_MEDIUM_THRESHOLD (60 * TIME_AGO_UNIT_SMALL)
# define TIME_AGO_UNIT_MEDIUM (60 * 60)
-# define TIME_AGO_UNIT_MEDIUM_NAME _("hour")
-# define TIME_AGO_UNIT_MEDIUM_NAME_PLURAL _("hours")
# define TIME_AGO_LARGE_THRESHOLD (24 * 60 * TIME_AGO_UNIT_SMALL)
# define TIME_AGO_UNIT_LARGE (24 * 60 * 60)
-# define TIME_AGO_UNIT_LARGE_NAME _("day")
-# define TIME_AGO_UNIT_LARGE_NAME_PLURAL _("days")
#else
# define TIME_AGO_UNIT_SMALL (24 * 60 * 60)
-# define TIME_AGO_UNIT_SMALL_NAME _("day")
-# define TIME_AGO_UNIT_SMALL_NAME_PLURAL _("days")
# define TIME_AGO_MEDIUM_THRESHOLD (4 * TIME_AGO_UNIT_SMALL)
# define TIME_AGO_UNIT_MEDIUM (7 * 24 * 60 * 60)
-# define TIME_AGO_UNIT_MEDIUM_NAME _("week")
-# define TIME_AGO_UNIT_MEDIUM_NAME_PLURAL _("weeks")
# define TIME_AGO_LARGE_THRESHOLD (28 * TIME_AGO_UNIT_SMALL)
# define TIME_AGO_UNIT_LARGE (30 * 24 * 60 * 60)
-# define TIME_AGO_UNIT_LARGE_NAME _("month")
-# define TIME_AGO_UNIT_LARGE_NAME_PLURAL _("months")
#endif
@@ -268,9 +261,10 @@ begin_transaction (struct db *db, int only_batch)
"savepoint batch;", SQLITE_ARG_END);
if (rc)
{
- log_error
- (_("error beginning %s transaction on TOFU database '%s': %s\n"),
- "batch", *db->name ? db->name : "combined", err);
+ log_error (_("error beginning transaction on TOFU database: %s\n"),
+ err);
+ print_further_info ("batch, database '%s'",
+ *db->name ? db->name : "[combined]");
sqlite3_free (err);
return gpg_error (GPG_ERR_GENERAL);
}
@@ -286,9 +280,10 @@ begin_transaction (struct db *db, int only_batch)
"savepoint inner;", SQLITE_ARG_END);
if (rc)
{
- log_error
- (_("error beginning %s transaction on TOFU database '%s': %s\n"),
- "inner", *db->name ? db->name : "combined", err);
+ log_error (_("error beginning transaction on TOFU database: %s\n"),
+ err);
+ print_further_info ("inner, database '%s'",
+ *db->name ? db->name : "[combined]");
sqlite3_free (err);
return gpg_error (GPG_ERR_GENERAL);
}
@@ -306,6 +301,9 @@ end_transaction (struct db *db, int only_batch)
int rc;
char *err = NULL;
+ if (!db)
+ return 0; /* Shortcut to allow for easier cleanup code. */
+
if ((! batch_update || only_batch == 2) && db->batch_update)
/* The batch transaction is still in open, but we left batch
mode. */
@@ -317,9 +315,10 @@ end_transaction (struct db *db, int only_batch)
"release batch;", SQLITE_ARG_END);
if (rc)
{
- log_error
- (_("error committing %s transaction on TOFU database '%s': %s\n"),
- "batch", *db->name ? db->name : "combined", err);
+ log_error (_("error committing transaction on TOFU database: %s\n"),
+ err);
+ print_further_info ("batch, database '%s'",
+ *db->name ? db->name : "[combined]");
sqlite3_free (err);
return gpg_error (GPG_ERR_GENERAL);
}
@@ -337,9 +336,10 @@ end_transaction (struct db *db, int only_batch)
"release inner;", SQLITE_ARG_END);
if (rc)
{
- log_error
- (_("error committing %s transaction on TOFU database '%s': %s\n"),
- "inner", *db->name ? db->name : "combined", err);
+ log_error (_("error committing transaction on TOFU database: %s\n"),
+ err);
+ print_further_info ("inner, database '%s'",
+ *db->name ? db->name : "[combined]");
sqlite3_free (err);
return gpg_error (GPG_ERR_GENERAL);
}
@@ -353,6 +353,9 @@ rollback_transaction (struct db *db)
int rc;
char *err = NULL;
+ if (!db)
+ return 0; /* Shortcut to allow for easier cleanup code. */
+
if (db->batch_update)
/* Just undo the most recent update; don't revert any progress
made by the batch transaction. */
@@ -363,9 +366,10 @@ rollback_transaction (struct db *db)
if (rc)
{
- log_error
- (_("error rolling back inner transaction on TOFU database '%s': %s\n"),
- *db->name ? db->name : "combined", err);
+ log_error (_("error rolling back transaction on TOFU database: %s\n"),
+ err);
+ print_further_info ("inner, database '%s'",
+ *db->name ? db->name : "[combined]");
sqlite3_free (err);
return gpg_error (GPG_ERR_GENERAL);
}
@@ -444,7 +448,7 @@ version_check_cb (void *cookie, int argc, char **argv, char **azColName)
*version = 1;
else
{
- log_error (_("unsupported TOFU DB version: %s\n"), argv[0]);
+ log_error (_("unsupported TOFU database version: %s\n"), argv[0]);
*version = -1;
}
@@ -481,8 +485,8 @@ initdb (sqlite3 *db, enum db_type type)
get_single_unsigned_long_cb, &count, &err);
if (rc)
{
- log_error (_("error querying TOFU DB's available tables: %s\n"),
- err);
+ log_error (_("error reading TOFU database: %s\n"), err);
+ print_further_info ("query available tables");
sqlite3_free (err);
goto out;
}
@@ -509,16 +513,16 @@ initdb (sqlite3 *db, enum db_type type)
else if (rc)
/* Some error. */
{
- log_error (_("error determining TOFU DB's version: %s\n"), err);
+ log_error (_("error determining TOFU database's version: %s\n"), err);
sqlite3_free (err);
goto out;
}
else
- /* Unexpected success. This can only happen if there are no
- rows. */
- {
- log_error (_("error determining TOFU DB's version: %s\n"),
- "select returned 0, but expected ABORT");
+ {
+ /* Unexpected success. This can only happen if there are no
+ rows. (select returned 0, but expected ABORT.) */
+ log_error (_("error determining TOFU database's version: %s\n"),
+ gpg_strerror (GPG_ERR_NO_DATA));
rc = 1;
goto out;
}
@@ -530,8 +534,8 @@ initdb (sqlite3 *db, enum db_type type)
NULL, NULL, &err);
if (rc)
{
- log_error (_("error initializing TOFU database (%s): %s\n"),
- "version", err);
+ log_error (_("error initializing TOFU database: %s\n"), err);
+ print_further_info ("create version");
sqlite3_free (err);
goto out;
}
@@ -543,37 +547,37 @@ initdb (sqlite3 *db, enum db_type type)
NULL, NULL, &err);
if (rc)
{
- log_error (_("error initializing TOFU database (%s): %s\n"),
- "version, init", err);
+ log_error (_("error initializing TOFU database: %s\n"), err);
+ print_further_info ("insert version");
sqlite3_free (err);
goto out;
}
/* The list of <fingerprint, email> bindings and auxiliary data.
-
- OID is a unique ID identifying this binding (and used by the
- signatures table, see below). Note: OIDs will never be
- reused.
-
- FINGERPRINT: The key's fingerprint.
-
- EMAIL: The normalized email address.
-
- USER_ID: The unmodified user id from which EMAIL was extracted.
-
- TIME: The time this binding was first observed.
-
- POLICY: The trust policy (TOFU_POLICY_BAD, etc. as an integer).
-
- CONFLICT is either NULL or a fingerprint. Assume that we have
- a binding <0xdeadbeef, foo@example.com> and then we observe
- <0xbaddecaf, foo@example.com>. There two bindings conflict
- (they have the same email address). When we observe the
- latter binding, we warn the user about the conflict and ask
- for a policy decision about the new binding. We also change
- the old binding's policy to ask if it was auto. So that we
- know why this occurred, we also set conflict to 0xbaddecaf.
- */
+ *
+ * OID is a unique ID identifying this binding (and used by the
+ * signatures table, see below). Note: OIDs will never be
+ * reused.
+ *
+ * FINGERPRINT: The key's fingerprint.
+ *
+ * EMAIL: The normalized email address.
+ *
+ * USER_ID: The unmodified user id from which EMAIL was extracted.
+ *
+ * TIME: The time this binding was first observed.
+ *
+ * POLICY: The trust policy (TOFU_POLICY_BAD, etc. as an integer).
+ *
+ * CONFLICT is either NULL or a fingerprint. Assume that we have
+ * a binding <0xdeadbeef, foo@example.com> and then we observe
+ * <0xbaddecaf, foo@example.com>. There two bindings conflict
+ * (they have the same email address). When we observe the
+ * latter binding, we warn the user about the conflict and ask
+ * for a policy decision about the new binding. We also change
+ * the old binding's policy to ask if it was auto. So that we
+ * know why this occurred, we also set conflict to 0xbaddecaf.
+ */
if (type == DB_EMAIL || type == DB_COMBINED)
rc = sqlite3_exec_printf
(db, NULL, NULL, &err,
@@ -604,8 +608,8 @@ initdb (sqlite3 *db, enum db_type type)
" on bindings (fingerprint);\n");
if (rc)
{
- log_error (_("error initializing TOFU database (%s): %s\n"),
- "bindings", err);
+ log_error (_("error initializing TOFU database: %s\n"), err);
+ print_further_info ("create bindings");
sqlite3_free (err);
goto out;
}
@@ -634,8 +638,8 @@ initdb (sqlite3 *db, enum db_type type)
NULL, NULL, &err);
if (rc)
{
- log_error (_("error initializing TOFU database (%s): %s\n"),
- "signatures", err);
+ log_error (_("error initializing TOFU database: %s\n"), err);
+ print_further_info ("create signatures");
sqlite3_free (err);
goto out;
}
@@ -647,7 +651,7 @@ initdb (sqlite3 *db, enum db_type type)
rc = sqlite3_exec (db, "rollback;", NULL, NULL, &err);
if (rc)
{
- log_error (_("error aborting transaction on TOFU DB: %s\n"),
+ log_error (_("error rolling back transaction on TOFU database: %s\n"),
err);
sqlite3_free (err);
}
@@ -658,7 +662,7 @@ initdb (sqlite3 *db, enum db_type type)
rc = sqlite3_exec (db, "end transaction;", NULL, NULL, &err);
if (rc)
{
- log_error (_("error committing transaction on TOFU DB: %s\n"),
+ log_error (_("error committing transaction on TOFU database: %s\n"),
err);
sqlite3_free (err);
return 1;
@@ -693,8 +697,8 @@ opendb (char *filename, enum db_type type)
rc = sqlite3_open (filename, &db);
if (rc)
{
- log_error (_("can't open TOFU DB ('%s'): %s\n"),
- filename, sqlite3_errmsg (db));
+ log_error (_("error opening TOFU database '%s': %s\n"),
+ filename, sqlite3_errmsg (db));
/* Even if an error occurs, DB is guaranteed to be valid. */
sqlite3_close (db);
db = NULL;
@@ -756,6 +760,7 @@ getdb (struct dbs *dbs, const char *name, enum db_type type)
char *filename = NULL;
int need_link = 1;
sqlite3 *sqlitedb = NULL;
+ gpg_error_t rc;
assert (dbs);
assert (name);
@@ -827,10 +832,14 @@ getdb (struct dbs *dbs, const char *name, enum db_type type)
char *name_db;
/* Make the directory. */
- if (gnupg_mkdir_p (opt.homedir, "tofu.d", type_str, prefix, NULL) != 0)
+ rc = gnupg_mkdir_p (opt.homedir, "tofu.d", type_str, prefix, NULL);
+ if (rc)
{
- log_error (_("unable to create directory %s/%s/%s/%s"),
- opt.homedir, "tofu.d", type_str, prefix);
+ name_db = xstrconcat (opt.homedir, "tofu.d",
+ type_str, prefix, NULL);
+ log_error (_("can't create directory '%s': %s\n"),
+ name_db, gpg_strerror (rc));
+ xfree (name_db);
goto out;
}
@@ -907,6 +916,8 @@ closedb (struct db *db)
/* Create a new DB meta-handle. Returns NULL on error. */
+/* FIXME: Change to return an error code for better reporting by the
+ caller. */
static struct dbs *
opendbs (void)
{
@@ -948,26 +959,27 @@ opendbs (void)
if (have_tofu_db && have_tofu_d)
{
log_info (_("Warning: Home directory contains both tofu.db"
- " and tofu.d. Using split format for TOFU DB.\n"));
+ " and tofu.d.\n"));
+ log_info (_("Using split format for TOFU database\n"));
opt.tofu_db_format = TOFU_DB_SPLIT;
}
else if (have_tofu_db)
{
opt.tofu_db_format = TOFU_DB_FLAT;
if (DBG_TRUST)
- log_debug ("Using flat format for TOFU DB.\n");
+ log_debug ("Using flat format for TOFU database.\n");
}
else if (have_tofu_d)
{
opt.tofu_db_format = TOFU_DB_SPLIT;
if (DBG_TRUST)
- log_debug ("Using split format for TOFU DB.\n");
+ log_debug ("Using split format for TOFU database.\n");
}
else
{
opt.tofu_db_format = TOFU_DB_FLAT;
if (DBG_TRUST)
- log_debug ("Using flat format for TOFU DB.\n");
+ log_debug ("Using flat format for TOFU database.\n");
}
}
@@ -1076,7 +1088,7 @@ record_binding (struct dbs *dbs, const char *fingerprint, const char *email,
{
char *fingerprint_pp = format_hexfingerprint (fingerprint, NULL, 0);
struct db *db_email = NULL, *db_key = NULL;
- int rc;
+ gpg_error_t rc;
char *err = NULL;
/* policy_old needs to be a long and not an enum tofu_policy,
because we pass it by reference to get_single_long_cb2, which
@@ -1092,7 +1104,10 @@ record_binding (struct dbs *dbs, const char *fingerprint, const char *email,
db_email = getdb (dbs, email, DB_EMAIL);
if (! db_email)
- return gpg_error (GPG_ERR_GENERAL);
+ {
+ rc = gpg_error (GPG_ERR_GENERAL);
+ goto leave;
+ }
if (opt.tofu_db_format == TOFU_DB_SPLIT)
/* In the split format, we need to update two DBs. To keep them
@@ -1103,11 +1118,14 @@ record_binding (struct dbs *dbs, const char *fingerprint, const char *email,
{
db_key = getdb (dbs, fingerprint, DB_KEY);
if (! db_key)
- return gpg_error (GPG_ERR_GENERAL);
+ {
+ rc = gpg_error (GPG_ERR_GENERAL);
+ goto leave;
+ }
rc = begin_transaction (db_email, 0);
if (rc)
- return gpg_error (GPG_ERR_GENERAL);
+ goto leave;
rc = begin_transaction (db_key, 0);
if (rc)
@@ -1117,7 +1135,7 @@ record_binding (struct dbs *dbs, const char *fingerprint, const char *email,
{
rc = begin_transaction (db_email, 1);
if (rc)
- return gpg_error (GPG_ERR_GENERAL);
+ goto leave;
}
@@ -1175,10 +1193,9 @@ record_binding (struct dbs *dbs, const char *fingerprint, const char *email,
SQLITE_ARG_END);
if (rc)
{
- log_error (_("error updating TOFU binding database"
- " (inserting <%s, %s> = %s): %s\n"),
- fingerprint_pp, email, tofu_policy_str (policy),
- err);
+ log_error (_("error updating TOFU database: %s\n"), err);
+ print_further_info (" insert bindings <%s, %s> = %s",
+ fingerprint_pp, email, tofu_policy_str (policy));
sqlite3_free (err);
goto out;
}
@@ -1203,9 +1220,9 @@ record_binding (struct dbs *dbs, const char *fingerprint, const char *email,
SQLITE_ARG_STRING, user_id, SQLITE_ARG_END);
if (rc)
{
- log_error (_("error updating TOFU binding database"
- " (inserting <%s, %s>): %s\n"),
- fingerprint_pp, email, err);
+ log_error (_("error updating TOFU database: %s\n"), err);
+ print_further_info ("insert bindings <%s, %s>",
+ fingerprint_pp, email);
sqlite3_free (err);
goto out;
}
@@ -1217,18 +1234,14 @@ record_binding (struct dbs *dbs, const char *fingerprint, const char *email,
if (opt.tofu_db_format == TOFU_DB_SPLIT)
/* We only need a transaction for the split format. */
{
- int rc2;
+ gpg_error_t rc2;
if (rc)
rc2 = rollback_transaction (db_key);
else
rc2 = end_transaction (db_key, 0);
if (rc2)
- {
- log_error (_("error ending transaction on TOFU database: %s\n"),
- err);
- sqlite3_free (err);
- }
+ sqlite3_free (err);
out_revert_one:
if (rc)
@@ -1236,18 +1249,13 @@ record_binding (struct dbs *dbs, const char *fingerprint, const char *email,
else
rc2 = end_transaction (db_email, 0);
if (rc2)
- {
- log_error (_("error ending transaction on TOFU database: %s\n"),
- err);
- sqlite3_free (err);
- }
+ sqlite3_free (err);
}
+ leave:
xfree (fingerprint_pp);
- if (rc)
- return gpg_error (GPG_ERR_GENERAL);
- return 0;
+ return rc;
}
@@ -1429,30 +1437,6 @@ time_ago_scale (signed long t)
return t / TIME_AGO_UNIT_LARGE;
}
-/* Return the appropriate unit (respecting whether it is plural or
- singular). */
-const char *
-time_ago_unit (signed long t)
-{
- signed long t_scaled = time_ago_scale (t);
-
- if (t < TIME_AGO_UNIT_MEDIUM)
- {
- if (t_scaled == 1)
- return TIME_AGO_UNIT_SMALL_NAME;
- return TIME_AGO_UNIT_SMALL_NAME_PLURAL;
- }
- if (t < TIME_AGO_UNIT_LARGE)
- {
- if (t_scaled == 1)
- return TIME_AGO_UNIT_MEDIUM_NAME;
- return TIME_AGO_UNIT_MEDIUM_NAME_PLURAL;
- }
- if (t_scaled == 1)
- return TIME_AGO_UNIT_LARGE_NAME;
- return TIME_AGO_UNIT_LARGE_NAME_PLURAL;
-}
-
/* Return the policy for the binding <FINGERPRINT, EMAIL> (email has
already been normalized) and any conflict information in *CONFLICT
@@ -1486,9 +1470,8 @@ get_policy (struct dbs *dbs, const char *fingerprint, const char *email,
SQLITE_ARG_END);
if (rc)
{
- log_error (_("error reading from TOFU database"
- " (checking for existing bad bindings): %s\n"),
- err);
+ log_error (_("error reading TOFU database: %s\n"), err);
+ print_further_info ("checking for existing bad bindings");
sqlite3_free (err);
goto out;
}
@@ -1502,10 +1485,11 @@ get_policy (struct dbs *dbs, const char *fingerprint, const char *email,
else if (strlist_length (strlist) != 2)
/* The result has the wrong form. */
{
- log_error (_("error reading from TOFU database"
- " (checking for existing bad bindings):"
- " expected 2 results, got %d\n"),
- strlist_length (strlist));
+ log_error (_("error reading TOFU database: %s\n"),
+ gpg_strerror (GPG_ERR_BAD_DATA));
+ print_further_info ("checking for existing bad bindings:"
+ " expected 2 results, got %d\n",
+ strlist_length (strlist));
goto out;
}
@@ -1515,8 +1499,9 @@ get_policy (struct dbs *dbs, const char *fingerprint, const char *email,
policy = strtol (strlist->d, &tail, 0);
if (errno || *tail != '\0')
{
- log_error (_("error reading from TOFU database: bad value for policy: %s\n"),
- strlist->d);
+ log_error (_("error reading TOFU database: %s\n"),
+ gpg_strerror (GPG_ERR_BAD_DATA));
+ print_further_info ("bad value for policy: %s", strlist->d);
goto out;
}
@@ -1526,8 +1511,9 @@ get_policy (struct dbs *dbs, const char *fingerprint, const char *email,
|| policy == TOFU_POLICY_BAD
|| policy == TOFU_POLICY_ASK))
{
- log_error (_("TOFU DB is corrupted. Invalid value for policy (%d).\n"),
- policy);
+ log_error (_("error reading TOFU database: %s\n"),
+ gpg_strerror (GPG_ERR_DB_CORRUPTED));
+ print_further_info ("invalid value for policy (%d)", policy);
policy = _tofu_GET_POLICY_ERROR;
goto out;
}
@@ -1736,9 +1722,8 @@ get_trust (struct dbs *dbs, const char *fingerprint, const char *email,
SQLITE_ARG_STRING, email, SQLITE_ARG_END);
if (rc)
{
- log_error (_("error reading from TOFU database"
- " (listing fingerprints): %s\n"),
- err);
+ log_error (_("error reading TOFU database: %s\n"), err);
+ print_further_info ("listing fingerprints");
sqlite3_free (err);
goto out;
}
@@ -1833,7 +1818,8 @@ get_trust (struct dbs *dbs, const char *fingerprint, const char *email,
if (policy == TOFU_POLICY_NONE)
{
- es_fprintf (fp, _("The binding %s is NOT known. "), binding);
+ es_fprintf (fp, _("The binding %s is NOT known."), binding);
+ es_fputs (" ", fp);
binding_shown = 1;
}
else if (policy == TOFU_POLICY_ASK
@@ -1845,17 +1831,21 @@ get_trust (struct dbs *dbs, const char *fingerprint, const char *email,
es_fprintf (fp,
_("The key %s raised a conflict with this binding (%s)."
" Since this binding's policy was 'auto', it was "
- "changed to 'ask'. "),
+ "changed to 'ask'."),
conflict_pp, binding);
+ es_fputs (" ", fp);
xfree (conflict_pp);
binding_shown = 1;
}
+ /* TRANSLATORS: The %s%s is replaced by either a fingerprint and a
+ blank or by two empty strings. */
es_fprintf (fp,
_("Please indicate whether you believe the binding %s%s"
"is legitimate (the key belongs to the stated owner) "
- "or a forgery (bad).\n\n"),
+ "or a forgery (bad)."),
binding_shown ? "" : binding,
binding_shown ? "" : " ");
+ es_fputs ("\n\n", fp);
xfree (binding);
@@ -1883,7 +1873,7 @@ get_trust (struct dbs *dbs, const char *fingerprint, const char *email,
SQLITE_ARG_STRING, fingerprint, SQLITE_ARG_END);
if (rc)
{
- log_error (_("error gathering other user ids: %s.\n"), err);
+ log_error (_("error gathering other user IDs: %s\n"), err);
sqlite3_free (err);
err = NULL;
}
@@ -1894,7 +1884,7 @@ get_trust (struct dbs *dbs, const char *fingerprint, const char *email,
{
strlist_t strlist_iter;
- es_fprintf (fp, _("Known user ids associated with this key:\n"));
+ es_fprintf (fp, _("Known user IDs associated with this key:\n"));
for (strlist_iter = other_user_ids;
strlist_iter;
strlist_iter = strlist_iter->next)
@@ -1912,10 +1902,10 @@ get_trust (struct dbs *dbs, const char *fingerprint, const char *email,
else
other_policy = atoi (other_thing);
- es_fprintf (fp, _(" %s (policy: %s)\n"),
- other_user_id,
- tofu_policy_str (other_policy));
- }
+ es_fprintf (fp, " %s (", other_user_id);
+ es_fprintf (fp, _("policy: %s"), tofu_policy_str (other_policy));
+ es_fprintf (fp, ")\n");
+ }
es_fprintf (fp, "\n");
free_strlist (other_user_ids);
@@ -1964,18 +1954,20 @@ get_trust (struct dbs *dbs, const char *fingerprint, const char *email,
{
strlist_t strlist_iter;
- log_error (_("error gathering signature stats: %s.\n"),
- err);
+ log_error (_("error gathering signature stats: %s\n"), err);
sqlite3_free (err);
err = NULL;
- es_fprintf
- (fp, _("The email address (%s) is associated with %d keys:\n"),
- email, bindings_with_this_email_count);
+ es_fprintf (fp, ngettext("The email address \"%s\" is"
+ " associated with %d key:\n",
+ "The email address \"%s\" is"
+ " associated with %d keys:\n",
+ bindings_with_this_email_count),
+ email, bindings_with_this_email_count);
for (strlist_iter = bindings_with_this_email;
strlist_iter;
strlist_iter = strlist_iter->next)
- es_fprintf (fp, _(" %s\n"), strlist_iter->d);
+ es_fprintf (fp, " %s\n", strlist_iter->d);
}
else
{
@@ -1988,8 +1980,9 @@ get_trust (struct dbs *dbs, const char *fingerprint, const char *email,
any messages signed by this key. Add a dummy entry. */
signature_stats_prepend (&stats, fingerprint, TOFU_POLICY_AUTO, 0, 0);
- es_fprintf (fp, _("Statistics for keys with the email '%s':\n"),
- email);
+ es_fprintf
+ (fp, _("Statistics for keys with the email address \"%s\":\n"),
+ email);
for (stats_iter = stats; stats_iter; stats_iter = stats_iter->next)
{
if (! key || strcmp (key, stats_iter->fingerprint) != 0)
@@ -1999,37 +1992,54 @@ get_trust (struct dbs *dbs, const char *fingerprint, const char *email,
key = stats_iter->fingerprint;
this_key = strcmp (key, fingerprint) == 0;
key_pp = format_hexfingerprint (key, NULL, 0);
+ es_fprintf (fp, " %s (", key_pp);
if (this_key)
- es_fprintf (fp, _(" %s (this key):"), key_pp);
+ es_fprintf (fp, _("this key"));
else
- es_fprintf (fp, _(" %s (policy: %s):"),
- key_pp, tofu_policy_str (stats_iter->policy));
+ es_fprintf (fp, _("policy: %s"),
+ tofu_policy_str (stats_iter->policy));
+ es_fputs ("):\n", fp);
xfree (key_pp);
- es_fprintf (fp, "\n");
}
+ es_fputs (" ", fp);
if (stats_iter->time_ago == -1)
- es_fprintf (fp, _(" %ld %s signed in the future.\n"),
- stats_iter->count,
- stats_iter->count == 1
- ? _("message") : _("messages"));
- else if (stats_iter->count == 0)
- es_fprintf (fp, _(" 0 signed messages.\n"));
+ es_fprintf (fp, ngettext("%ld message signed in the future.",
+ "%ld messages signed in the future.",
+ stats_iter->count), stats_iter->count);
else
- es_fprintf (fp, _(" %ld %s signed over the past %ld %s.\n"),
- stats_iter->count,
- stats_iter->count == 1
- ? _("message") : _("messages"),
- time_ago_scale (stats_iter->time_ago),
- time_ago_unit (stats_iter->time_ago));
+ {
+ long t_scaled = time_ago_scale (stats_iter->time_ago);
+
+ /* TANSLATORS: This string is concatenated with one of
+ * the day/week/month strings to form one sentence. */
+ es_fprintf (fp, ngettext("%ld message signed",
+ "%ld messages signed",
+ stats_iter->count), stats_iter->count);
+ if (!stats_iter->count)
+ es_fputs (".", fp);
+ else if (stats_iter->time_ago < TIME_AGO_UNIT_MEDIUM)
+ es_fprintf (fp, ngettext(" over the past %ld day.",
+ " over the past %ld days.",
+ t_scaled), t_scaled);
+ else if (stats_iter->time_ago < TIME_AGO_UNIT_LARGE)
+ es_fprintf (fp, ngettext(" over the past %ld week.",
+ " over the past %ld weeks.",
+ t_scaled), t_scaled);
+ else
+ es_fprintf (fp, ngettext(" over the past %ld month.",
+ " over the past %ld months.",
+ t_scaled), t_scaled);
+ }
+ es_fputs ("\n", fp);
}
}
if (is_conflict)
{
- /* TRANSLATORS: translate the below text. We don't directly
- internationalize that text so that we can tweak it without
- breaking translations. */
+ /* 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. */
char *text = _("TOFU detected a binding conflict");
if (strcmp (text, "TOFU detected a binding conflict") == 0)
/* No translation. Use the English text. */
@@ -2046,34 +2056,42 @@ get_trust (struct dbs *dbs, const char *fingerprint, const char *email,
}
es_fputc ('\n', fp);
- /* 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. */
- choices = _("gG" "aA" "uU" "rR" "bB");
- es_fprintf (fp, _("(G)ood/(A)ccept once/(U)nknown/(R)eject once/(B)ad? "));
/* Add a NUL terminator. */
es_fputc (0, fp);
if (es_fclose_snatch (fp, (void **) &prompt, NULL))
log_fatal ("error snatching memory stream\n");
+ /* I think showing the large message once is sufficient. If we
+ would move it right before the cpr_get many lines will scroll
+ away and the user might not realize that he merely entered a
+ wrong choise (because he does not see that either). As a small
+ benefit we allow C-L to redisplay everything. */
+ tty_printf ("%s", prompt);
while (1)
{
char *response;
+ /* 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. */
+ choices = _("gG" "aA" "uU" "rR" "bB");
if (strlen (choices) != 10)
log_bug ("Bad TOFU conflict translation! Please report.");
- response = cpr_get ("tofu conflict", prompt);
+ response = cpr_get
+ ("tofu.conflict",
+ _("(G)ood, (A)ccept once, (U)nknown, (R)eject once, (B)ad? "));
trim_spaces (response);
cpr_kill_prompt ();
- if (strlen (response) == 1)
+ if (*response == CONTROL_L)
+ tty_printf ("%s", prompt);
+ else if (strlen (response) == 1)
{
char *choice = strchr (choices, *response);
if (choice)
{
int c = ((size_t) choice - (size_t) choices) / 2;
- assert (0 <= c && c <= 4);
switch (c)
{
@@ -2154,6 +2172,14 @@ get_trust (struct dbs *dbs, const char *fingerprint, const char *email,
return trust_level;
}
+
+/* Return a malloced string of the form
+ * "7 months, 1 day, 5 minutes, 0 seconds"
+ * The caller must free that string.
+ *
+ * This is actually a bad hack which may not work correctly with all
+ * languages.
+ */
static char *
time_ago_str (long long int t)
{
@@ -2223,10 +2249,7 @@ time_ago_str (long long int t)
if (years)
{
- if (years > 1)
- es_fprintf (fp, _("%d years"), years);
- else
- es_fprintf (fp, _("%d year"), years);
+ es_fprintf (fp, ngettext("%d year", "%d years", years), years);
count ++;
first = i;
}
@@ -2235,11 +2258,7 @@ time_ago_str (long long int t)
{
if (count)
es_fprintf (fp, ", ");
-
- if (months > 1)
- es_fprintf (fp, _("%d months"), months);
- else
- es_fprintf (fp, _("%d month"), months);
+ es_fprintf (fp, ngettext("%d month", "%d months", months), months);
count ++;
first = i;
}
@@ -2248,11 +2267,7 @@ time_ago_str (long long int t)
{
if (count)
es_fprintf (fp, ", ");
-
- if (days > 1)
- es_fprintf (fp, _("%d days"), days);
- else
- es_fprintf (fp, _("%d day"), days);
+ es_fprintf (fp, ngettext("%d day", "%d days", days), days);
count ++;
first = i;
}
@@ -2261,11 +2276,7 @@ time_ago_str (long long int t)
{
if (count)
es_fprintf (fp, ", ");
-
- if (hours > 1)
- es_fprintf (fp, _("%d hours"), hours);
- else
- es_fprintf (fp, _("%d hour"), hours);
+ es_fprintf (fp, ngettext("%d hour", "%d hours", hours), hours);
count ++;
first = i;
}
@@ -2274,11 +2285,7 @@ time_ago_str (long long int t)
{
if (count)
es_fprintf (fp, ", ");
-
- if (minutes > 1)
- es_fprintf (fp, _("%d minutes"), minutes);
- else
- es_fprintf (fp, _("%d minute"), minutes);
+ es_fprintf (fp, ngettext("%d minute", "%d minutes", minutes), minutes);
count ++;
first = i;
}
@@ -2287,11 +2294,7 @@ time_ago_str (long long int t)
{
if (count)
es_fprintf (fp, ", ");
-
- if (seconds > 1)
- es_fprintf (fp, _("%d seconds"), seconds);
- else
- es_fprintf (fp, _("%d second"), seconds);
+ es_fprintf (fp, ngettext("%d second", "%d seconds", seconds), seconds);
}
es_fputc (0, fp);
@@ -2301,6 +2304,7 @@ time_ago_str (long long int t)
return str;
}
+
static void
show_statistics (struct dbs *dbs, const char *fingerprint,
const char *email, const char *user_id,
@@ -2333,9 +2337,8 @@ show_statistics (struct dbs *dbs, const char *fingerprint,
sig_exclude ? "'" : "");
if (rc)
{
- log_error (_("error reading from TOFU database"
- " (getting statistics): %s\n"),
- err);
+ log_error (_("error reading TOFU database: %s\n"), err);
+ print_further_info ("getting statistics");
sqlite3_free (err);
goto out;
}
@@ -2410,25 +2413,33 @@ show_statistics (struct dbs *dbs, const char *fingerprint,
if (messages == 0)
es_fprintf (fp,
_("Verified 0 messages signed by \"%s\""
- " (key: %s, policy %s)."),
+ " (key: %s, policy: %s)."),
user_id, fingerprint_pp, tofu_policy_str (policy));
else
{
- char *first_seen_ago_str = time_ago_str (first_seen_ago);
+ char *first_seen_ago_str =
+ time_ago_str (first_seen_ago);
char *most_recent_seen_ago_str =
time_ago_str (most_recent_seen_ago);
- es_fprintf (fp,
- _("Verified %ld messages signed by \"%s\""
- " (key: %s, policy: %s) in the past %s."),
+ /* TRANSLATORS: The final %s is replaced by a string like
+ "7 months, 1 day, 5 minutes, 0 seconds". */
+ es_fprintf (fp, ngettext("Verified %ld message signed by \"%s\""
+ " (key: %s, policy: %s) in the past %s.",
+ "Verified %ld messages signed by \"%s\""
+ " (key: %s, policy: %s) in the past %s.",
+ messages),
messages, user_id,
fingerprint_pp, tofu_policy_str (policy),
first_seen_ago_str);
if (messages > 1)
- es_fprintf (fp,
- _(" The most recent message was verified %s ago."),
- most_recent_seen_ago_str);
+ {
+ es_fputs (" ", fp);
+ es_fprintf (fp,
+ _("The most recent message was verified %s ago."),
+ most_recent_seen_ago_str);
+ }
xfree (first_seen_ago_str);
xfree (most_recent_seen_ago_str);
@@ -2459,18 +2470,26 @@ show_statistics (struct dbs *dbs, const char *fingerprint,
/* TRANSLATORS: translate the below text. We don't
directly internationalize that text so that we can
tweak it without breaking translations. */
- text = _("TOFU: few signatures %d %s %s");
- if (strcmp (text, "TOFU: few signatures %d %s %s") == 0)
- text =
- "Warning: if you think you've seen more than %d %s "
- "signed by this key, then this key might be a forgery! "
- "Carefully examine the email address for small variations "
- "(e.g., additional white space). If the key is suspect, "
- "then use '%s' to mark it as being bad.\n";
- tmp = xasprintf
- (text,
- messages, messages == 1 ? _("message") : _("message"),
- set_policy_command);
+ text = ngettext("TOFU: few signatures %d message %s",
+ "TOFU: few signatures %d messages %s", 1);
+ if (strcmp (text, "TOFU: few signatures %d message %s") == 0)
+ {
+ text =
+ (messages == 1?
+ "Warning: if you think you've seen more than %d message "
+ "signed by this key, then this key might be a forgery! "
+ "Carefully examine the email address for small variations "
+ "(e.g., additional white space). If the key is suspect, "
+ "then use '%s' to mark it as being bad.\n"
+ :
+ "Warning: if you think you've seen more than %d messages "
+ "signed by this key, then this key might be a forgery! "
+ "Carefully examine the email address for small variations "
+ "(e.g., additional white space). If the key is suspect, "
+ "then use '%s' to mark it as being bad.\n");
+ }
+
+ tmp = xasprintf (text, messages, set_policy_command);
text = format_text (tmp, 0, 72, 80);
xfree (tmp);
log_info ("%s", text);
@@ -2546,7 +2565,8 @@ tofu_register (PKT_public_key *pk, const char *user_id,
dbs = opendbs ();
if (! dbs)
{
- log_error (_("error opening TOFU DB.\n"));
+ log_error (_("error opening TOFU database: %s\n"),
+ gpg_strerror (GPG_ERR_GENERAL));
goto die;
}
@@ -2579,7 +2599,8 @@ tofu_register (PKT_public_key *pk, const char *user_id,
db = getdb (dbs, email, DB_EMAIL);
if (! db)
{
- log_error (_("error opening TOFU DB.\n"));
+ log_error (_("error opening TOFU database: %s\n"),
+ gpg_strerror (GPG_ERR_GENERAL));
goto die;
}
@@ -2605,9 +2626,8 @@ tofu_register (PKT_public_key *pk, const char *user_id,
SQLITE_ARG_END);
if (rc)
{
- log_error (_("error reading from signatures database"
- " (checking existence): %s\n"),
- err);
+ log_error (_("error reading TOFU database: %s\n"), err);
+ print_further_info ("checking existence");
sqlite3_free (err);
}
else if (c > 1)
@@ -2652,9 +2672,8 @@ tofu_register (PKT_public_key *pk, const char *user_id,
SQLITE_ARG_END);
if (rc)
{
- log_error (_("error updating TOFU DB"
- " (inserting into signatures table): %s\n"),
- err);
+ log_error (_("error updating TOFU database: %s\n"), err);
+ print_further_info ("insert signatures");
sqlite3_free (err);
}
}
@@ -2667,7 +2686,6 @@ tofu_register (PKT_public_key *pk, const char *user_id,
rc = end_transaction (db, 0);
if (rc)
{
- log_error (_("error ending transaction on TOFU database: %s\n"), err);
sqlite3_free (err);
goto die;
}
@@ -2761,7 +2779,8 @@ tofu_get_validity (PKT_public_key *pk, const char *user_id,
dbs = opendbs ();
if (! dbs)
{
- log_error (_("error opening TOFU DB.\n"));
+ log_error (_("error opening TOFU database: %s\n"),
+ gpg_strerror (GPG_ERR_GENERAL));
goto die;
}
@@ -2813,7 +2832,8 @@ tofu_set_policy (kbnode_t kb, enum tofu_policy policy)
dbs = opendbs ();
if (! dbs)
{
- log_error (_("error opening TOFU DB.\n"));
+ log_error (_("error opening TOFU database: %s\n"),
+ gpg_strerror (GPG_ERR_GENERAL));
return gpg_error (GPG_ERR_GENERAL);
}
@@ -2892,7 +2912,8 @@ tofu_get_policy (PKT_public_key *pk, PKT_user_id *user_id,
dbs = opendbs ();
if (! dbs)
{
- log_error (_("error opening TOFU DB.\n"));
+ log_error (_("error opening TOFU database: %s\n"),
+ gpg_strerror (GPG_ERR_GENERAL));
return gpg_error (GPG_ERR_GENERAL);
}
diff --git a/g10/trustdb.c b/g10/trustdb.c
index af839d1..8f2b2cb 100644
--- a/g10/trustdb.c
+++ b/g10/trustdb.c
@@ -724,7 +724,6 @@ tdb_update_ownertrust (PKT_public_key *pk, unsigned int new_trust )
write_record (&rec);
tdb_revalidation_mark ();
do_sync ();
- err = 0;
}
else
{
@@ -782,7 +781,6 @@ update_min_ownertrust (u32 *kid, unsigned int new_trust )
write_record (&rec);
tdb_revalidation_mark ();
do_sync ();
- err = 0;
}
else
{
@@ -858,7 +856,6 @@ update_validity (PKT_public_key *pk, PKT_user_id *uid,
/* No record yet - create a new one. */
size_t dummy;
- err = 0;
memset (&trec, 0, sizeof trec);
trec.recnum = tdbio_new_recnum ();
trec.rectype = RECTYPE_TRUST;
@@ -1044,18 +1041,22 @@ tdb_get_validity_core (PKT_public_key *pk, PKT_user_id *uid,
else
user_id = user_id_node->pkt->pkt.user_id;
+ /* If the user id is revoked or expired, then skip it. */
if (user_id->is_revoked || user_id->is_expired)
- /* If the user id is revoked or expired, then skip it. */
{
- char *s;
- if (user_id->is_revoked && user_id->is_expired)
- s = "revoked and expired";
- else if (user_id->is_revoked)
- s = "revoked";
- else
- s = "expire";
-
- log_info ("TOFU: Ignoring %s user id (%s)\n", s, user_id->name);
+ if (DBG_TRUST)
+ {
+ char *s;
+ if (user_id->is_revoked && user_id->is_expired)
+ s = "revoked and expired";
+ else if (user_id->is_revoked)
+ s = "revoked";
+ else
+ s = "expire";
+
+ log_debug ("TOFU: Ignoring %s user id (%s)\n",
+ s, user_id->name);
+ }
continue;
}
@@ -1845,8 +1846,14 @@ reset_trust_records(void)
}
if (opt.verbose)
- log_info (_("%d keys processed (%d validity counts cleared)\n"),
- count, nreset);
+ {
+ log_info (ngettext("%d key processed",
+ "%d keys processed",
+ count), count);
+ log_printf (ngettext(" (%d validity count cleared)\n",
+ " (%d validity counts cleared)\n",
+ nreset), nreset);
+ }
}
/*
@@ -1955,8 +1962,8 @@ validate_keys (int interactive)
klist = utk_list;
- log_info(_("%d marginal(s) needed, %d complete(s) needed, %s trust model\n"),
- opt.marginals_needed,opt.completes_needed,trust_model_string());
+ log_info ("marginals needed: %d completes needed: %d trust model: %s\n",
+ opt.marginals_needed, opt.completes_needed, trust_model_string ());
for (depth=0; depth < opt.max_cert_depth; depth++)
{
diff --git a/kbx/keybox-defs.h b/kbx/keybox-defs.h
index 8d795ab..6af5448 100644
--- a/kbx/keybox-defs.h
+++ b/kbx/keybox-defs.h
@@ -40,6 +40,8 @@
fixme: Better use the LIBOBJ mechnism. */
#include "../common/types.h"
#include "../common/stringhelp.h"
+#include "../common/dotlock.h"
+#include "../common/logging.h"
#include "keybox.h"
@@ -48,7 +50,6 @@ typedef struct keyboxblob *KEYBOXBLOB;
typedef struct keybox_name *KB_NAME;
-typedef struct keybox_name const *CONST_KB_NAME;
struct keybox_name
{
/* Link to the next resources, so that we can walk all
@@ -58,14 +59,15 @@ struct keybox_name
/* True if this is a keybox with secret keys. */
int secret;
- /*DOTLOCK lockhd;*/
-
/* A table with all the handles accessing this resources.
HANDLE_TABLE_SIZE gives the allocated length of this table unused
entrues are set to NULL. HANDLE_TABLE may be NULL. */
KEYBOX_HANDLE *handle_table;
size_t handle_table_size;
+ /* The lock handle or NULL it not yet initialized. */
+ dotlock_t lockhd;
+
/* Not yet used. */
int is_locked;
@@ -80,14 +82,12 @@ struct keybox_name
struct keybox_found_s
{
KEYBOXBLOB blob;
- off_t offset;
size_t pk_no;
size_t uid_no;
- unsigned int n_packets; /*used for delete and update*/
};
struct keybox_handle {
- CONST_KB_NAME kb;
+ KB_NAME kb;
int secret; /* this is for a secret keybox */
FILE *fp;
int eof;
diff --git a/kbx/keybox-dump.c b/kbx/keybox-dump.c
index 8815a6f..f4e7c98 100644
--- a/kbx/keybox-dump.c
+++ b/kbx/keybox-dump.c
@@ -388,21 +388,21 @@ _keybox_dump_blob (KEYBOXBLOB blob, FILE *fp)
putc ('\n', fp );
}
if (in_range)
- {
- fprintf (fp, "Sig-Expire[%lu-%lu]: [not checked]\n", first, n-1);
- in_range = 0;
- }
+ fprintf (fp, "Sig-Expire[%lu-%lu]: [not checked]\n", first, n-1);
}
fprintf (fp, "Ownertrust: %d\n", p[0] );
fprintf (fp, "All-Validity: %d\n", p[1] );
p += 4;
- n = get32 (p); p += 4;
+ n = get32 (p);
+ p += 4;
fprintf (fp, "Recheck-After: %lu\n", n );
- n = get32 (p ); p += 4;
+ n = get32 (p );
+ p += 4;
fprintf( fp, "Latest-Timestamp: %lu\n", n );
- n = get32 (p ); p += 4;
+ n = get32 (p );
+ p += 4;
fprintf (fp, "Created-At: %lu\n", n );
- n = get32 (p ); p += 4;
+ n = get32 (p );
fprintf (fp, "Reserved-Space: %lu\n", n );
if (n >= 4 && unhashed >= 24)
diff --git a/kbx/keybox-init.c b/kbx/keybox-init.c
index e91911c..3b53cd5 100644
--- a/kbx/keybox-init.c
+++ b/kbx/keybox-init.c
@@ -30,30 +30,37 @@
static KB_NAME kb_names;
-/* Register a filename for plain keybox files. Returns a pointer to
- be used to create a handles and so on. Returns NULL to indicate
- that FNAME has already been registered. */
-void *
-keybox_register_file (const char *fname, int secret)
+/* Register a filename for plain keybox files. Returns 0 on success,
+ * GPG_ERR_EEXIST if it has already been registered, or another error
+ * code. On success or with error code GPG_ERR_EEXIST a token usable
+ * to access the keybox handle is stored at R_TOKEN, NULL is stored
+ * for all other errors. */
+gpg_error_t
+keybox_register_file (const char *fname, int secret, void **r_token)
{
KB_NAME kr;
+ *r_token = NULL;
+
for (kr=kb_names; kr; kr = kr->next)
{
if (same_file_p (kr->fname, fname) )
- return NULL; /* Already registered. */
+ {
+ *r_token = kr;
+ return gpg_error (GPG_ERR_EEXIST); /* Already registered. */
+ }
}
kr = xtrymalloc (sizeof *kr + strlen (fname));
if (!kr)
- return NULL;
+ return gpg_error_from_syserror ();
strcpy (kr->fname, fname);
kr->secret = !!secret;
kr->handle_table = NULL;
kr->handle_table_size = 0;
- /* kr->lockhd = NULL;*/
+ kr->lockhd = NULL;
kr->is_locked = 0;
kr->did_full_scan = 0;
/* keep a list of all issued pointers */
@@ -64,7 +71,8 @@ keybox_register_file (const char *fname, int secret)
/* if (!kb_offtbl) */
/* kb_offtbl = new_offset_hash_table (); */
- return kr;
+ *r_token = kr;
+ return 0;
}
int
@@ -253,17 +261,69 @@ _keybox_close_file (KEYBOX_HANDLE hd)
/*
- * Lock the keybox at handle HD, or unlock if YES is false. Note that
- * we currently ignore the handle and lock all registered keyboxes.
+ * Lock the keybox at handle HD, or unlock if YES is false.
*/
-int
+gpg_error_t
keybox_lock (KEYBOX_HANDLE hd, int yes)
{
- /* FIXME: We need to implement it before we can use it with gpg.
- gpgsm does the locking in its local keydb.c driver; this should
- be changed as well. */
+ gpg_error_t err = 0;
+ KB_NAME kb = hd->kb;
- (void)hd;
- (void)yes;
- return 0;
+ if (!keybox_is_writable (kb))
+ return 0;
+
+ /* Make sure the lock handle has been created. */
+ if (!kb->lockhd)
+ {
+ kb->lockhd = dotlock_create (kb->fname, 0);
+ if (!kb->lockhd)
+ {
+ err = gpg_error_from_syserror ();
+ log_info ("can't allocate lock for '%s'\n", kb->fname );
+ return err;
+ }
+ }
+
+ if (yes) /* Take the lock. */
+ {
+ if (!kb->is_locked)
+ {
+#ifdef HAVE_W32_SYSTEM
+ /* Under Windows we need to close the file before we try
+ * to lock it. This is because another process might have
+ * taken the lock and is using keybox_file_rename to
+ * rename the base file. How if our dotlock_take below is
+ * waiting for the lock but we have the base file still
+ * open, keybox_file_rename will never succeed as we are
+ * in a deadlock. */
+ if (hd->fp)
+ {
+ fclose (hd->fp);
+ hd->fp = NULL;
+ }
+#endif /*HAVE_W32_SYSTEM*/
+ if (dotlock_take (kb->lockhd, -1))
+ {
+ err = gpg_error_from_syserror ();
+ log_info ("can't lock '%s'\n", kb->fname );
+ }
+ else
+ kb->is_locked = 1;
+ }
+ }
+ else /* Release the lock. */
+ {
+ if (kb->is_locked)
+ {
+ if (dotlock_release (kb->lockhd))
+ {
+ err = gpg_error_from_syserror ();
+ log_info ("can't unlock '%s'\n", kb->fname );
+ }
+ else
+ kb->is_locked = 0;
+ }
+ }
+
+ return err;
}
diff --git a/kbx/keybox-openpgp.c b/kbx/keybox-openpgp.c
index a5f602b..a0e4ab9 100644
--- a/kbx/keybox-openpgp.c
+++ b/kbx/keybox-openpgp.c
@@ -71,7 +71,6 @@ next_packet (unsigned char const **bufptr, size_t *buflen,
if ( !(ctb & 0x80) )
return gpg_error (GPG_ERR_INV_PACKET); /* Invalid CTB. */
- pktlen = 0;
if ((ctb & 0x40)) /* New style (OpenPGP) CTB. */
{
pkttype = (ctb & 0x3f);
diff --git a/kbx/keybox-search.c b/kbx/keybox-search.c
index f3cdb8c..681d5c0 100644
--- a/kbx/keybox-search.c
+++ b/kbx/keybox-search.c
@@ -25,8 +25,6 @@
#include <assert.h>
#include <errno.h>
-#include "../common/stringhelp.h" /* ascii_xxxx() */
-
#include "keybox-defs.h"
#include <gcrypt.h>
#include "host2net.h"
@@ -734,7 +732,7 @@ release_sn_array (struct sn_array_s *array, size_t size)
*/
-int
+gpg_error_t
keybox_search_reset (KEYBOX_HANDLE hd)
{
if (!hd)
@@ -762,12 +760,12 @@ keybox_search_reset (KEYBOX_HANDLE hd)
If WANT_BLOBTYPE is not 0 only blobs of this type are considered.
The value at R_SKIPPED is updated by the number of skipped long
records (counts PGP and X.509). */
-int
+gpg_error_t
keybox_search (KEYBOX_HANDLE hd, KEYBOX_SEARCH_DESC *desc, size_t ndesc,
keybox_blobtype_t want_blobtype,
size_t *r_descindex, unsigned long *r_skipped)
{
- int rc;
+ gpg_error_t rc;
size_t n;
int need_words, any_skip;
KEYBOXBLOB blob = NULL;
@@ -1023,7 +1021,7 @@ keybox_search (KEYBOX_HANDLE hd, KEYBOX_SEARCH_DESC *desc, size_t ndesc,
hd->found.pk_no = pk_no;
hd->found.uid_no = uid_no;
}
- else if (rc == -1)
+ else if (rc == -1 || gpg_err_code (rc) == GPG_ERR_EOF)
{
_keybox_release_blob (blob);
hd->eof = 1;
@@ -1190,3 +1188,40 @@ keybox_get_flags (KEYBOX_HANDLE hd, int what, int idx, unsigned int *value)
ec = get_flag_from_image (buffer, length, what, value);
return ec? gpg_error (ec):0;
}
+
+off_t
+keybox_offset (KEYBOX_HANDLE hd)
+{
+ if (!hd->fp)
+ return 0;
+ return ftello (hd->fp);
+}
+
+gpg_error_t
+keybox_seek (KEYBOX_HANDLE hd, off_t offset)
+{
+ int err;
+
+ if (hd->error)
+ return hd->error; /* still in error state */
+
+ if (! hd->fp)
+ {
+ if (offset == 0)
+ /* No need to open the file. An unopened file is effectively at
+ offset 0. */
+ return 0;
+
+ hd->fp = fopen (hd->kb->fname, "rb");
+ if (!hd->fp)
+ {
+ hd->error = gpg_error_from_syserror ();
+ return hd->error;
+ }
+ }
+
+ err = fseeko (hd->fp, offset, SEEK_SET);
+ hd->error = gpg_error_from_errno (err);
+
+ return hd->error;
+}
diff --git a/kbx/keybox-update.c b/kbx/keybox-update.c
index ef3e330..ff65904 100644
--- a/kbx/keybox-update.c
+++ b/kbx/keybox-update.c
@@ -68,88 +68,27 @@ fseeko (FILE * stream, off_t newpos, int whence)
#endif /* !defined(HAVE_FSEEKO) && !defined(fseeko) */
-
static int
create_tmp_file (const char *template,
char **r_bakfname, char **r_tmpfname, FILE **r_fp)
{
- char *bakfname, *tmpfname;
-
- *r_bakfname = NULL;
- *r_tmpfname = NULL;
-
-# ifdef USE_ONLY_8DOT3
- /* Here is another Windoze bug?:
- * you can't rename("pubring.kbx.tmp", "pubring.kbx");
- * but rename("pubring.kbx.tmp", "pubring.aaa");
- * works. So we replace ".kbx" by ".kb_" or ".k__". Note that we
- * can't use ".bak" and ".tmp", because these suffixes are used by
- * gpg and would lead to a sharing violation or data corruption.
- */
- if (strlen (template) > 4
- && !strcmp (template+strlen(template)-4, EXTSEP_S "kbx") )
- {
- bakfname = xtrymalloc (strlen (template) + 1);
- if (!bakfname)
- return gpg_error_from_syserror ();
- strcpy (bakfname, template);
- strcpy (bakfname+strlen(template)-4, EXTSEP_S "kb_");
-
- tmpfname = xtrymalloc (strlen (template) + 1);
- if (!tmpfname)
- {
- gpg_error_t tmperr = gpg_error_from_syserror ();
- xfree (bakfname);
- return tmperr;
- }
- strcpy (tmpfname,template);
- strcpy (tmpfname + strlen (template)-4, EXTSEP_S "k__");
- }
- else
- { /* File does not end with kbx, thus we hope we are working on a
- modern file system and appending a suffix works. */
- bakfname = xtrymalloc ( strlen (template) + 5);
- if (!bakfname)
- return gpg_error_from_syserror ();
- strcpy (stpcpy (bakfname, template), EXTSEP_S "kb_");
+ gpg_error_t err;
- tmpfname = xtrymalloc ( strlen (template) + 5);
- if (!tmpfname)
+ err = keybox_tmp_names (template, 0, r_bakfname, r_tmpfname);
+ if (!err)
+ {
+ *r_fp = fopen (*r_tmpfname, "wb");
+ if (!*r_fp)
{
- gpg_error_t tmperr = gpg_error_from_syserror ();
- xfree (bakfname);
- return tmperr;
+ err = gpg_error_from_syserror ();
+ xfree (*r_tmpfname);
+ *r_tmpfname = NULL;
+ xfree (*r_bakfname);
+ *r_bakfname = NULL;
}
- strcpy (stpcpy (tmpfname, template), EXTSEP_S "k__");
- }
-# else /* Posix file names */
- bakfname = xtrymalloc (strlen (template) + 2);
- if (!bakfname)
- return gpg_error_from_syserror ();
- strcpy (stpcpy (bakfname,template),"~");
-
- tmpfname = xtrymalloc ( strlen (template) + 5);
- if (!tmpfname)
- {
- gpg_error_t tmperr = gpg_error_from_syserror ();
- xfree (bakfname);
- return tmperr;
- }
- strcpy (stpcpy (tmpfname,template), EXTSEP_S "tmp");
-# endif /* Posix filename */
-
- *r_fp = fopen (tmpfname, "wb");
- if (!*r_fp)
- {
- gpg_error_t tmperr = gpg_error_from_syserror ();
- xfree (tmpfname);
- xfree (bakfname);
- return tmperr;
}
- *r_bakfname = bakfname;
- *r_tmpfname = tmpfname;
- return 0;
+ return err;
}
@@ -180,22 +119,15 @@ rename_tmp_file (const char *bakfname, const char *tmpfname,
/* First make a backup file except for secret keyboxes. */
if (!secret)
{
-#if defined(HAVE_DOSISH_SYSTEM) || defined(__riscos__)
- gnupg_remove (bakfname);
-#endif
- if (rename (fname, bakfname) )
- {
- return gpg_error_from_syserror ();
- }
+ rc = keybox_file_rename (fname, bakfname);
+ if (rc)
+ return rc;
}
/* Then rename the file. */
-#if defined(HAVE_DOSISH_SYSTEM) || defined(__riscos__)
- gnupg_remove (fname);
-#endif
- if (rename (tmpfname, fname) )
+ rc = keybox_file_rename (tmpfname, fname);
+ if (rc)
{
- rc = gpg_error_from_syserror ();
if (secret)
{
/* log_info ("WARNING: 2 files with confidential" */
@@ -271,12 +203,11 @@ blob_filecopy (int mode, const char *fname, KEYBOXBLOB blob,
goto leave;
}
- /* Create the new file. */
+ /* Create the new file. On success NEWFP is initialized. */
rc = create_tmp_file (fname, &bakfname, &tmpfname, &newfp);
if (rc)
{
fclose (fp);
- fclose (newfp);
goto leave;
}
diff --git a/kbx/keybox-util.c b/kbx/keybox-util.c
index 9fe9290..13fedb3 100644
--- a/kbx/keybox-util.c
+++ b/kbx/keybox-util.c
@@ -21,6 +21,10 @@
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
+#ifdef HAVE_DOSISH_SYSTEM
+# define WIN32_LEAN_AND_MEAN /* We only need the OS core stuff. */
+# include <windows.h>
+#endif
#include "keybox-defs.h"
@@ -68,3 +72,132 @@ _keybox_free (void *p)
if (p)
free_func (p);
}
+
+
+/* Store the two malloced temporary file names used for keybox updates
+ of file FILENAME at R_BAKNAME and R_TMPNAME. On error an error
+ code is returned and NULL stored at R_BAKNAME and R_TMPNAME. If
+ FOR_KEYRING is true the returned names match those used by GnuPG's
+ keyring code. */
+gpg_error_t
+keybox_tmp_names (const char *filename, int for_keyring,
+ char **r_bakname, char **r_tmpname)
+{
+ gpg_error_t err;
+ char *bak_name, *tmp_name;
+
+ *r_bakname = NULL;
+ *r_tmpname = NULL;
+
+# ifdef USE_ONLY_8DOT3
+ /* Here is another Windoze bug?:
+ * you can't rename("pubring.kbx.tmp", "pubring.kbx");
+ * but rename("pubring.kbx.tmp", "pubring.aaa");
+ * works. So we replace ".kbx" by ".kb_" or ".k__". Note that we
+ * can't use ".bak" and ".tmp", because these suffixes are used by
+ * gpg's keyrings and would lead to a sharing violation or data
+ * corruption. If the name does not end in ".kbx" we assume working
+ * on a modern file system and append the suffix. */
+ {
+ const char *ext = for_keyring? EXTSEP_S GPGEXT_GPG : EXTSEP_S "kbx";
+ const char *b_ext = for_keyring? EXTSEP_S "bak" : EXTSEP_S "kb_";
+ const char *t_ext = for_keyring? EXTSEP_S "tmp" : EXTSEP_S "k__";
+ int repl;
+
+ if (strlen (ext) != 4 || strlen (b_ext) != 4)
+ BUG ();
+ repl = (strlen (filename) > 4
+ && !strcmp (filename + strlen (filename) - 4, ext));
+ bak_name = xtrymalloc (strlen (filename) + (repl?0:4) + 1);
+ if (!bak_name)
+ return gpg_error_from_syserror ();
+ strcpy (bak_name, filename);
+ strcpy (bak_name + strlen (filename) - (repl?4:0), b_ext);
+
+ tmp_name = xtrymalloc (strlen (filename) + (repl?0:4) + 1);
+ if (!tmp_name)
+ {
+ err = gpg_error_from_syserror ();
+ xfree (bak_name);
+ return err;
+ }
+ strcpy (tmp_name, filename);
+ strcpy (tmp_name + strlen (filename) - (repl?4:0), t_ext);
+ }
+# else /* Posix file names */
+ (void)for_keyring;
+ bak_name = xtrymalloc (strlen (filename) + 2);
+ if (!bak_name)
+ return gpg_error_from_syserror ();
+ strcpy (stpcpy (bak_name, filename), "~");
+
+ tmp_name = xtrymalloc (strlen (filename) + 5);
+ if (!tmp_name)
+ {
+ err = gpg_error_from_syserror ();
+ xfree (bak_name);
+ return err;
+ }
+ strcpy (stpcpy (tmp_name,filename), EXTSEP_S "tmp");
+# endif /* Posix filename */
+
+ *r_bakname = bak_name;
+ *r_tmpname = tmp_name;
+ return 0;
+}
+
+
+/* Wrapper for rename(2) to handle Windows peculiarities. */
+gpg_error_t
+keybox_file_rename (const char *oldname, const char *newname)
+{
+ gpg_error_t err = 0;
+
+#ifdef HAVE_DOSISH_SYSTEM
+ int wtime = 0;
+
+ gnupg_remove (newname);
+ again:
+ if (rename (oldname, newname))
+ {
+ if (GetLastError () == ERROR_SHARING_VIOLATION)
+ {
+ /* Another process has the file open. We do not use a lock
+ * for read but instead we wait until the other process has
+ * closed the file. This may take long but that would also
+ * be the case with a dotlock approach for read and write.
+ * Note that we don't need this on Unix due to the inode
+ * concept.
+ *
+ * So let's wait until the rename has worked. The retry
+ * intervals are 50, 100, 200, 400, 800, 50ms, ... */
+ if (!wtime || wtime >= 800)
+ wtime = 50;
+ else
+ wtime *= 2;
+
+ if (wtime >= 800)
+ log_info ("waiting for file '%s' to become accessible ...\n",
+ oldname);
+
+ Sleep (wtime);
+ goto again;
+ }
+ err = gpg_error_from_syserror ();
+ }
+
+#else /* Unix */
+
+#ifdef __riscos__
+ gnupg_remove (newname);
+#endif
+ if (rename (oldname, newname) )
+ err = gpg_error_from_syserror ();
+
+#endif /* Unix */
+
+ if (err)
+ log_error ("renaming '%s' to '%s' failed: %s\n",
+ oldname, newname, gpg_strerror (err));
+ return err;
+}
diff --git a/kbx/keybox.h b/kbx/keybox.h
index 8c31141..bfc3586 100644
--- a/kbx/keybox.h
+++ b/kbx/keybox.h
@@ -64,7 +64,8 @@ typedef enum
/*-- keybox-init.c --*/
-void *keybox_register_file (const char *fname, int secret);
+gpg_error_t keybox_register_file (const char *fname, int secret,
+ void **r_token);
int keybox_is_writable (void *token);
KEYBOX_HANDLE keybox_new_openpgp (void *token, int secret);
@@ -75,7 +76,7 @@ void keybox_pop_found_state (KEYBOX_HANDLE hd);
const char *keybox_get_resource_name (KEYBOX_HANDLE hd);
int keybox_set_ephemeral (KEYBOX_HANDLE hd, int yes);
-int keybox_lock (KEYBOX_HANDLE hd, int yes);
+gpg_error_t keybox_lock (KEYBOX_HANDLE hd, int yes);
/*-- keybox-file.c --*/
/* Fixme: This function does not belong here: Provide a better
@@ -90,11 +91,14 @@ int keybox_get_cert (KEYBOX_HANDLE hd, ksba_cert_t *ret_cert);
#endif /*KEYBOX_WITH_X509*/
int keybox_get_flags (KEYBOX_HANDLE hd, int what, int idx, unsigned int *value);
-int keybox_search_reset (KEYBOX_HANDLE hd);
-int keybox_search (KEYBOX_HANDLE hd, KEYBOX_SEARCH_DESC *desc, size_t ndesc,
- keybox_blobtype_t want_blobtype,
- size_t *r_descindex, unsigned long *r_skipped);
+gpg_error_t keybox_search_reset (KEYBOX_HANDLE hd);
+gpg_error_t keybox_search (KEYBOX_HANDLE hd,
+ KEYBOX_SEARCH_DESC *desc, size_t ndesc,
+ keybox_blobtype_t want_blobtype,
+ size_t *r_descindex, unsigned long *r_skipped);
+off_t keybox_offset (KEYBOX_HANDLE hd);
+gpg_error_t keybox_seek (KEYBOX_HANDLE hd, off_t offset);
/*-- keybox-update.c --*/
gpg_error_t keybox_insert_keyblock (KEYBOX_HANDLE hd,
@@ -128,6 +132,10 @@ void keybox_set_malloc_hooks ( void *(*new_alloc_func)(size_t n),
void *(*new_realloc_func)(void *p, size_t n),
void (*new_free_func)(void*) );
+gpg_error_t keybox_tmp_names (const char *filename, int for_keyring,
+ char **r_bakname, char **r_tmpname);
+gpg_error_t keybox_file_rename (const char *oldname, const char *newname);
+
#ifdef __cplusplus
}
diff --git a/po/POTFILES.in b/po/POTFILES.in
index dc88448..e42cb32 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -70,6 +70,7 @@ g10/skclist.c
g10/tdbdump.c
g10/tdbio.c
g10/textfilter.c
+g10/tofu.c
g10/trustdb.c
g10/trust.c
g10/verify.c
diff --git a/po/ca.po b/po/ca.po
index 8f35c3b..e70ad36 100644
--- a/po/ca.po
+++ b/po/ca.po
@@ -1302,6 +1302,22 @@ msgid "Enter passphrase: "
msgstr "Introduïu la contrasenya: "
#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "error getting version from '%s': %s\n"
+msgstr "error en crear l'anell «%s»: %s\n"
+
+#, c-format
+msgid "server '%s' is older than us (%s < %s)"
+msgstr ""
+
+# FIXME: preferència? jm
+# Ho discutírem en la llista, segur. Deu ser als arxius. ivb
+#, fuzzy, c-format
+#| msgid "WARNING: %s overrides %s\n"
+msgid "WARNING: %s\n"
+msgstr "AVÃS: %s té preferència sobre %s\n"
+
+#, fuzzy, c-format
msgid "OpenPGP card not available: %s\n"
msgstr "la clau secreta no està disponible"
@@ -1816,6 +1832,11 @@ msgid "remove as much as possible from key during export"
msgstr ""
#, fuzzy
+#| msgid "%s: skipped: %s\n"
+msgid " - skipped"
+msgstr "%s: es descarta: %s\n"
+
+#, fuzzy
msgid "exporting secret keys not allowed\n"
msgstr "s'està escrivint la clau secreta a «%s»\n"
@@ -1829,19 +1850,36 @@ msgstr ""
"clau %08lX: la signatura de la subclau és en el lloc equivocat - es "
"descarta\n"
-#, fuzzy
-#| msgid "%s: skipped: %s\n"
-msgid " - skipped"
-msgstr "%s: es descarta: %s\n"
-
msgid "WARNING: nothing exported\n"
msgstr "AVÃS: no s'ha exportat res\n"
+#, fuzzy, c-format
+#| msgid "error creating `%s': %s\n"
+msgid "error creating '%s': %s\n"
+msgstr "error en crear «%s»: %s\n"
+
#, fuzzy
msgid "[User ID not found]"
msgstr "[No s'ha trobat l'id d'usuari]"
#, fuzzy, c-format
+msgid "(check argument of option '%s')\n"
+msgstr "opcions d'importació no vàlides\n"
+
+#, c-format
+msgid "Warning: '%s' should be a long key ID or a fingerprint\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error looking up: %s\n"
+msgstr "error en la lectura de «%s»: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "Warning: %s appears in the keyring %d times\n"
+msgstr "error en crear l'anell «%s»: %s\n"
+
+#, fuzzy, c-format
msgid "automatically retrieved '%s' via %s\n"
msgstr "error en crear «%s»: %s\n"
@@ -1858,14 +1896,19 @@ msgid "secret key \"%s\" not found: %s\n"
msgstr "no s'ha trobat la clau secreta «%s»: %s\n"
#, fuzzy, c-format
-msgid "(check argument of option '%s')\n"
-msgstr "opcions d'importació no vàlides\n"
+#| msgid "|NAME|use NAME as default secret key"
+msgid "Warning: not using '%s' as default key: %s\n"
+msgstr "|NOM|usa NOM com a clau secreta predeterminada"
#, fuzzy, c-format
#| msgid "|NAME|use NAME as default secret key"
-msgid "using \"%s\" as default secret key\n"
+msgid "using \"%s\" as default secret key for signing\n"
msgstr "|NOM|usa NOM com a clau secreta predeterminada"
+#, c-format
+msgid "all values passed to '%s' ignored\n"
+msgstr ""
+
#, fuzzy, c-format
msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
msgstr ""
@@ -2238,28 +2281,6 @@ msgid "Note: old default options file '%s' ignored\n"
msgstr "NOTA: es descarta el fitxer d'opcions predeterminades antic «%s»\n"
#, c-format
-msgid ""
-"Warning: value '%s' for option '%s' should be a long key ID or a "
-"fingerprint\n"
-msgstr ""
-
-#, c-format
-msgid "key specification '%s' is ambiguous\n"
-msgstr ""
-
-#. TRANSLATORS: The %s prints a key specification which
-#. for example has been given at the command line. Two
-#. lines with fingerprints are printed after this message.
-#, c-format
-msgid "'%s' matches at least:\n"
-msgstr ""
-
-#, fuzzy, c-format
-#| msgid "error creating keyring `%s': %s\n"
-msgid "error searching the keyring: %s\n"
-msgstr "error en crear l'anell «%s»: %s\n"
-
-#, c-format
msgid "libgcrypt is too old (need %s, have %s)\n"
msgstr ""
@@ -2469,14 +2490,6 @@ msgid "WARNING: recipients (-r) given without using public key encryption\n"
msgstr ""
"AVÃS: s'han donat destinataris (-r) sense usar xifratge de clau pública\n"
-#, fuzzy, c-format
-msgid "option '%s' given, but no valid default keys given\n"
-msgstr "l'algoritme de dispersió és invàlid «%s»\n"
-
-#, fuzzy, c-format
-msgid "option '%s' given, but option '%s' not given\n"
-msgstr "l'algoritme de dispersió és invàlid «%s»\n"
-
msgid "--store [filename]"
msgstr "--store [nom_del_fitxer]"
@@ -2552,6 +2565,11 @@ msgstr "la recepció des del servidor de claus ha fallat: %s\n"
msgid "key export failed: %s\n"
msgstr "l'exportació de la clau ha fallat: %s\n"
+#, fuzzy, c-format
+#| msgid "key export failed: %s\n"
+msgid "export as ssh key failed: %s\n"
+msgstr "l'exportació de la clau ha fallat: %s\n"
+
#, c-format
msgid "keyserver search failed: %s\n"
msgstr "ha fallat la cerca al servidor de claus: %s\n"
@@ -3056,33 +3074,33 @@ msgstr "[revocació]"
msgid "[self-signature]"
msgstr "[autosignatura]"
-msgid "1 bad signature\n"
-msgstr "1 signatura errònia\n"
-
-#, c-format
-msgid "%d bad signatures\n"
-msgstr "%d signatures errònies\n"
-
-msgid "1 signature not checked due to a missing key\n"
-msgstr "1 signatura no comprovada per falta de clau\n"
-
-#, c-format
-msgid "%d signatures not checked due to missing keys\n"
-msgstr "%d signatures no comprovades per falta de clau\n"
-
-msgid "1 signature not checked due to an error\n"
-msgstr "1 signatura no comprovada a causa d'un error\n"
+#, fuzzy, c-format
+#| msgid "%d bad signatures\n"
+msgid "%d bad signature\n"
+msgid_plural "%d bad signatures\n"
+msgstr[0] "%d signatures errònies\n"
+msgstr[1] "%d signatures errònies\n"
-#, c-format
-msgid "%d signatures not checked due to errors\n"
-msgstr "%d signatures no comprovades a causa d'errors\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to a missing key\n"
+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 signatura no comprovada per falta de clau\n"
+msgstr[1] "1 signatura no comprovada per falta de clau\n"
-msgid "1 user ID without valid self-signature detected\n"
-msgstr "Ha estat detectat 1 ID sense autosignatura vàlida\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to an error\n"
+msgid "%d signature not checked due to an error\n"
+msgid_plural "%d signatures not checked due to errors\n"
+msgstr[0] "1 signatura no comprovada a causa d'un error\n"
+msgstr[1] "1 signatura no comprovada a causa d'un error\n"
-#, c-format
-msgid "%d user IDs without valid self-signatures detected\n"
-msgstr "Han estat detectats %d IDs sense autosignatura vàlida\n"
+#, fuzzy, c-format
+#| msgid "%d user IDs without valid self-signatures detected\n"
+msgid "%d user ID without valid self-signature detected\n"
+msgid_plural "%d user IDs without valid self-signatures detected\n"
+msgstr[0] "Han estat detectats %d IDs sense autosignatura vàlida\n"
+msgstr[1] "Han estat detectats %d IDs sense autosignatura vàlida\n"
#, fuzzy
msgid ""
@@ -3740,14 +3758,12 @@ msgid "Really delete this self-signature? (y/N)"
msgstr "Realment voleu esborrar aquesta autosignatura? (s/N)"
# Werner FIXME: use ngettext. jm
-#, c-format
+#, fuzzy, c-format
+#| msgid "Deleted %d signature.\n"
msgid "Deleted %d signature.\n"
-msgstr "S'ha esborrat %d signatura.\n"
-
-# Werner FIXME: use ngettext. jm
-#, c-format
-msgid "Deleted %d signatures.\n"
-msgstr "S'han esborrat %d signatures.\n"
+msgid_plural "Deleted %d signatures.\n"
+msgstr[0] "S'ha esborrat %d signatura.\n"
+msgstr[1] "S'ha esborrat %d signatura.\n"
msgid "Nothing deleted.\n"
msgstr "No s'hi ha eliminat res.\n"
@@ -3761,11 +3777,9 @@ msgstr "L'ID d'usuari «%s» està revocat."
#, fuzzy, c-format
msgid "User ID \"%s\": %d signature removed\n"
-msgstr "L'ID d'usuari «%s» està revocat."
-
-#, fuzzy, c-format
-msgid "User ID \"%s\": %d signatures removed\n"
-msgstr "L'ID d'usuari «%s» està revocat."
+msgid_plural "User ID \"%s\": %d signatures removed\n"
+msgstr[0] "L'ID d'usuari «%s» està revocat."
+msgstr[1] "L'ID d'usuari «%s» està revocat."
#, fuzzy, c-format
msgid "User ID \"%s\": already minimized\n"
@@ -4311,37 +4325,6 @@ msgid "Please correct the error first\n"
msgstr "Corregiu l'error primer\n"
msgid ""
-"You need a Passphrase to protect your secret key.\n"
-"\n"
-msgstr ""
-"Cal una contrasenya per a protegir la clau secreta.\n"
-"\n"
-
-#, fuzzy
-msgid ""
-"Please enter a passphrase to protect the off-card backup of the new "
-"encryption key."
-msgstr "Introduïu la contrasenya; aquesta ha de ser una frase secreta \n"
-
-msgid "passphrase not correctly repeated; try again"
-msgstr "la contrasenya no s'ha repetit correctament; torneu a intentar-ho"
-
-#, c-format
-msgid "%s.\n"
-msgstr "%s.\n"
-
-msgid ""
-"You don't want a passphrase - this is probably a *bad* idea!\n"
-"I will do it anyway. You can change your passphrase at any time,\n"
-"using this program with the option \"--edit-key\".\n"
-"\n"
-msgstr ""
-"No voleu contrasenya: és una mala idea!\n"
-"Bé. Si voleu canviar-la més endavant,\n"
-"useu aquest programa amb l'opció \"--edit-key\".\n"
-"\n"
-
-msgid ""
"We need to generate a lot of random bytes. It is a good idea to perform\n"
"some other action (type on the keyboard, move the mouse, utilize the\n"
"disks) during the prime generation; this gives the random number\n"
@@ -4388,6 +4371,14 @@ msgid "Key generation canceled.\n"
msgstr "La generació de claus ha estat cancel·lada.\n"
#, fuzzy, c-format
+msgid "can't create backup file '%s': %s\n"
+msgstr "no s'ha pogut crear «%s»: %s\n"
+
+#, c-format
+msgid "Note: backup of card key saved to '%s'\n"
+msgstr ""
+
+#, fuzzy, c-format
#| msgid "writing public key to `%s'\n"
msgid "writing public key to '%s'\n"
msgstr "s'està escrivint la clau pública a «%s»\n"
@@ -4445,18 +4436,6 @@ msgstr "Les parts secretes de la clau primària no estan disponibles.\n"
msgid "Really create? (y/N) "
msgstr "Crear realment? "
-#, fuzzy, c-format
-msgid "storing key onto card failed: %s\n"
-msgstr "no s'ha pogut eliminar el bloc de claus: %s\n"
-
-#, fuzzy, c-format
-msgid "can't create backup file '%s': %s\n"
-msgstr "no s'ha pogut crear «%s»: %s\n"
-
-#, c-format
-msgid "Note: backup of card key saved to '%s'\n"
-msgstr ""
-
msgid "never "
msgstr "mai "
@@ -4475,19 +4454,18 @@ msgstr "Notació de signatura crítica: "
msgid "Signature notation: "
msgstr "Notació de signatura: "
-#, fuzzy
-#| msgid "1 bad signature\n"
-msgid "1 good signature\n"
-msgstr "1 signatura errònia\n"
-
#, fuzzy, c-format
#| msgid "%d bad signatures\n"
-msgid "%d good signatures\n"
-msgstr "%d signatures errònies\n"
+msgid "%d good signature\n"
+msgid_plural "%d good signatures\n"
+msgstr[0] "%d signatures errònies\n"
+msgstr[1] "%d signatures errònies\n"
#, c-format
-msgid "Warning: %lu key(s) skipped due to their large size\n"
-msgstr ""
+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] ""
msgid "Keyring"
msgstr "Anell"
@@ -4518,20 +4496,28 @@ msgid " Card serial no. ="
msgstr ""
#, fuzzy, c-format
-msgid "renaming '%s' to '%s' failed: %s\n"
-msgstr "no s'ha pogut crear l'armadura: %s\n"
-
-#, fuzzy, c-format
msgid "caching keyring '%s'\n"
msgstr "s'està comprovant l'anell «%s»\n"
#, fuzzy, c-format
-msgid "%lu keys cached so far (%lu signatures)\n"
-msgstr "s'han comprovat %lu claus (%lu signatures)\n"
+msgid "%lu keys cached so far (%lu signature)\n"
+msgid_plural "%lu keys cached so far (%lu signatures)\n"
+msgstr[0] "s'han comprovat %lu claus (%lu signatures)\n"
+msgstr[1] "s'han comprovat %lu claus (%lu signatures)\n"
+
+#, fuzzy, c-format
+#| msgid "\t%lu keys updated\n"
+msgid "%lu key cached"
+msgid_plural "%lu keys cached"
+msgstr[0] "\t%lu clau actualitzades\n"
+msgstr[1] "\t%lu clau actualitzades\n"
#, fuzzy, c-format
-msgid "%lu keys cached (%lu signatures)\n"
-msgstr "s'han comprovat %lu claus (%lu signatures)\n"
+#| msgid "1 bad signature\n"
+msgid " (%lu signature)\n"
+msgid_plural " (%lu signatures)\n"
+msgstr[0] "1 signatura errònia\n"
+msgstr[1] "1 signatura errònia\n"
# Fitxer indi fins final. Hau! ivb
# Grrr. Com em tracten els esclaus ja... jm
@@ -4577,18 +4563,16 @@ msgid "\"%s\" not a key ID: skipping\n"
msgstr "%s: no és un ID vàlid\n"
#, fuzzy, c-format
-msgid "refreshing 1 key from %s\n"
-msgstr "s'està sol·licitant la clau %08lX de %s\n"
+msgid "refreshing %d key from %s\n"
+msgid_plural "refreshing %d keys from %s\n"
+msgstr[0] "s'està sol·licitant la clau %08lX de %s\n"
+msgstr[1] "s'està sol·licitant la clau %08lX de %s\n"
#, fuzzy, c-format
msgid "WARNING: unable to refresh key %s via %s: %s\n"
msgstr "AVÃS: no s'ha pogut eliminar el fitxer temporal (%s) «%s»: %s\n"
#, fuzzy, c-format
-msgid "refreshing %d keys from %s\n"
-msgstr "s'està sol·licitant la clau %08lX de %s\n"
-
-#, fuzzy, c-format
msgid "key \"%s\" not found on keyserver\n"
msgstr "no s'ha trobat la clau «%s»: %s\n"
@@ -4607,9 +4591,10 @@ msgstr "s'està sol·licitant la clau %08lX de %s\n"
msgid "requesting key %s from %s\n"
msgstr "s'està sol·licitant la clau %08lX de %s\n"
-#, fuzzy, c-format
-msgid "sending key %s to %s server %s\n"
-msgstr "s'està cercant «%s» al servidor HKP %s\n"
+# «del servidor», «en el servidor»? ivb
+#, fuzzy
+msgid "no keyserver known\n"
+msgstr "error de servidor de claus"
#, fuzzy, c-format
msgid "sending key %s to %s\n"
@@ -4836,6 +4821,17 @@ msgstr "AVÃS: %s és una opció desaconsellada.\n"
msgid "Note: signatures using the %s algorithm are rejected\n"
msgstr "signatura %s, algorisme de resum %s\n"
+#, fuzzy, c-format
+msgid "(reported error: %s)\n"
+msgstr "error de lectura: %s\n"
+
+#, fuzzy, c-format
+msgid "(reported error: %s <%s>)\n"
+msgstr "error de lectura: %s\n"
+
+msgid "(further info: "
+msgstr ""
+
#, c-format
msgid "%s:%d: deprecated option \"%s\"\n"
msgstr "%s:%d: l'opció «%s» està desaconsellada.\n"
@@ -5266,6 +5262,19 @@ msgstr "%s: es descarta: la clau pública està desactivada\n"
msgid "%s: skipped: public key already present\n"
msgstr "%s: es descarta: la clau pública ja està present\n"
+#, fuzzy, c-format
+#| msgid "can't connect to `%s': %s\n"
+msgid "can't encrypt to '%s'\n"
+msgstr "no s'ha pogut connectar amb «%s»: %s\n"
+
+#, fuzzy, c-format
+msgid "option '%s' given, but no valid default keys given\n"
+msgstr "l'algoritme de dispersió és invàlid «%s»\n"
+
+#, fuzzy, c-format
+msgid "option '%s' given, but option '%s' not given\n"
+msgstr "l'algoritme de dispersió és invàlid «%s»\n"
+
msgid "You did not specify a user ID. (you may use \"-r\")\n"
msgstr "No heu especificat un ID d'usuari. (podeu usar «-r»)\n"
@@ -5309,11 +5318,6 @@ msgstr "clau %08lX: sense ID\n"
msgid "data not saved; use option \"--output\" to save it\n"
msgstr "les dades no s'han desat; useu l'opció \"--output\" per desar-les\n"
-#, fuzzy, c-format
-#| msgid "error creating `%s': %s\n"
-msgid "error creating '%s': %s\n"
-msgstr "error en crear «%s»: %s\n"
-
# Indi? ivb
# Em pense que no. jm
msgid "Detached signature.\n"
@@ -5408,19 +5412,31 @@ msgid "This is a revocation certificate for the OpenPGP key:"
msgstr "Voleu crear un certificat de revocació per a aquesta clau? "
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 ""
+
+msgid ""
"Use it to revoke this key in case of a compromise or loss of\n"
"the secret key. However, if the secret key is still accessible,\n"
"it is better to generate a new revocation certificate and give\n"
-"a reason for the revocation."
+"a reason for the revocation. For details see the description of\n"
+"of the gpg command \"--gen-revoke\" in the GnuPG manual."
msgstr ""
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 making use of this revocation certificate."
+"before importing and publishing this revocation certificate."
msgstr ""
#, fuzzy, c-format
+#| msgid "Revocation certificate created.\n"
+msgid "revocation certificate stored as '%s.rev'\n"
+msgstr "S'ha creat el certificat de revocació.\n"
+
+#, fuzzy, c-format
msgid "secret key \"%s\" not found\n"
msgstr "no s'ha trobat la clau secreta «%s»: %s\n"
@@ -5431,6 +5447,11 @@ msgstr "no s'ha trobat la clau secreta «%s»: %s\n"
msgid "'%s' matches multiple secret keys:\n"
msgstr ""
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "error searching the keyring: %s\n"
+msgstr "error en crear l'anell «%s»: %s\n"
+
#, fuzzy
msgid "Create a revocation certificate for this key? (y/N) "
msgstr "Voleu crear un certificat de revocació per a aquesta clau? "
@@ -5514,26 +5535,39 @@ msgstr ""
#, fuzzy, c-format
msgid "public key %s is %lu second newer than the signature\n"
-msgstr "la clau pública %08lX és %lu segons anterior a la signatura\n"
+msgid_plural "public key %s is %lu seconds newer than the signature\n"
+msgstr[0] "la clau pública %08lX és %lu segons anterior a la signatura\n"
+msgstr[1] "la clau pública %08lX és %lu segons anterior a la signatura\n"
#, fuzzy, c-format
-msgid "public key %s is %lu seconds newer than the signature\n"
-msgstr "la clau pública %08lX és %lu segons anterior a la signatura\n"
+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 clau pública %08lX és %lu segons anterior a la signatura\n"
+msgstr[1] "la clau pública %08lX és %lu segons anterior a la signatura\n"
# Werner FIXME: Use ngettext. jm
#, fuzzy, c-format
msgid ""
"key %s was created %lu second in the future (time warp or clock problem)\n"
-msgstr ""
+msgid_plural ""
+"key %s was created %lu seconds in the future (time warp or clock problem)\n"
+msgstr[0] ""
+"la clau s'ha creat %lu segon en el futur (salt en el temps o problemes\n"
+"amb el rellotge)\n"
+msgstr[1] ""
"la clau s'ha creat %lu segon en el futur (salt en el temps o problemes\n"
"amb el rellotge)\n"
-# Werner FIXME: use ngettext. jm
+# Werner FIXME: Use ngettext. jm
#, fuzzy, c-format
-msgid ""
-"key %s was created %lu seconds in the future (time warp or clock problem)\n"
-msgstr ""
-"la clau s'ha creat %lu segons en el futur (salt en el temps o problemes\n"
+msgid "key %s was created %lu day in the future (time warp or clock problem)\n"
+msgid_plural ""
+"key %s was created %lu days in the future (time warp or clock problem)\n"
+msgstr[0] ""
+"la clau s'ha creat %lu segon en el futur (salt en el temps o problemes\n"
+"amb el rellotge)\n"
+msgstr[1] ""
+"la clau s'ha creat %lu segon en el futur (salt en el temps o problemes\n"
"amb el rellotge)\n"
#, fuzzy, c-format
@@ -5776,6 +5810,242 @@ msgid "input line longer than %d characters\n"
msgstr "la línia d'entrada és superior a %d caràcters\n"
#, fuzzy, c-format
+msgid "error beginning transaction on TOFU database: %s\n"
+msgstr "error mentre s'enviava a «%s»: %s\n"
+
+#, c-format
+msgid "error committing transaction on TOFU database: %s\n"
+msgstr ""
+
+#, c-format
+msgid "error rolling back transaction on TOFU database: %s\n"
+msgstr ""
+
+# Suportats? ivb
+# A Softcatalà diuen molt «implementat». jm
+# Precissament acabem de parlar d'«implementat a la llista del GNOME
+# i s'ha dit que és erroni, igual que «suportat» :) Les alternatives
+# encara no m'agraden massa... jm
+#, fuzzy, c-format
+msgid "unsupported TOFU database version: %s\n"
+msgstr ""
+"\n"
+"Algoritmes suportats:\n"
+
+#, fuzzy, c-format
+msgid "error reading TOFU database: %s\n"
+msgstr "error mentre s'enviava a «%s»: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error writing secret keyring `%s': %s\n"
+msgid "error determining TOFU database's version: %s\n"
+msgstr "s'ha produït un error mentre s'escrivia l'anell secret «%s»: %s\n"
+
+#, fuzzy, c-format
+#| msgid "%s: error writing dir record: %s\n"
+msgid "error initializing TOFU database: %s\n"
+msgstr "%s: error en escriure el registre de directoris: %s\n"
+
+#, fuzzy, c-format
+msgid "error opening TOFU database '%s': %s\n"
+msgstr "error en la lectura de «%s»: %s\n"
+
+msgid "Warning: Home directory contains both tofu.db and tofu.d.\n"
+msgstr ""
+
+msgid "Using split format for TOFU database\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error updating TOFU database: %s\n"
+msgstr "error mentre s'enviava a «%s»: %s\n"
+
+#, fuzzy, c-format
+msgid "public key %s not found: %s\n"
+msgstr "no s'ha trobat la clau pública %08lX: %s\n"
+
+#, fuzzy, c-format
+msgid "error setting TOFU binding's trust level to %s\n"
+msgstr "error en la lectura de «%s»: %s\n"
+
+#, c-format
+msgid "The binding %s is NOT known."
+msgstr ""
+
+#, c-format
+msgid ""
+"The key %s raised a conflict with this binding (%s). Since this binding's "
+"policy was 'auto', it was changed to 'ask'."
+msgstr ""
+
+#, c-format
+msgid ""
+"Please indicate whether you believe the binding %s%sis legitimate (the key "
+"belongs to the stated owner) or a forgery (bad)."
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error gathering other user IDs: %s\n"
+msgstr "error en crear «%s»: %s\n"
+
+msgid "Known user IDs associated with this key:\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "Policy: "
+msgid "policy: %s"
+msgstr "Política: "
+
+#, fuzzy, c-format
+msgid "error gathering signature stats: %s\n"
+msgstr "error en crear «%s»: %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] ""
+msgstr[1] ""
+
+#, c-format
+msgid "Statistics for keys with the email address \"%s\":\n"
+msgstr ""
+
+#, fuzzy
+#| msgid "list keys"
+msgid "this key"
+msgstr "llista claus"
+
+#, c-format
+msgid "%ld message signed in the future."
+msgid_plural "%ld messages signed in the future."
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+msgid "%ld message signed"
+msgid_plural "%ld messages signed"
+msgstr[0] "|algo [fitxers]|imprimeix resums de missatges"
+msgstr[1] "|algo [fitxers]|imprimeix resums de missatges"
+
+#, c-format
+msgid " over the past %ld day."
+msgid_plural " over the past %ld days."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid " over the past %ld week."
+msgid_plural " over the past %ld weeks."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid " over the past %ld month."
+msgid_plural " over the past %ld months."
+msgstr[0] ""
+msgstr[1] ""
+
+#. 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 ""
+
+#. 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 ""
+
+msgid "(G)ood, (A)ccept once, (U)nknown, (R)eject once, (B)ad? "
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error changing TOFU policy: %s\n"
+msgstr "error en la creació de la contrasenya: %s\n"
+
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "Have never verified a message signed by key %s!\n"
+msgstr ""
+
+#, c-format
+msgid "Failed to collect signature statistics for \"%s\" (key %s)\n"
+msgstr ""
+
+#, c-format
+msgid "Verified 0 messages signed by \"%s\" (key: %s, policy: %s)."
+msgstr ""
+
+#. TRANSLATORS: The final %s is replaced by a string like
+#. "7 months, 1 day, 5 minutes, 0 seconds".
+#, c-format
+msgid ""
+"Verified %ld message signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgid_plural ""
+"Verified %ld messages signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "The most recent message was verified %s ago."
+msgstr ""
+
+msgid "Warning: we've have yet to see a message signed by this key!\n"
+msgstr ""
+
+msgid "Warning: we've only seen a single message signed by this key!\n"
+msgstr ""
+
+#. TRANSLATORS: translate the below text. We don't
+#. directly internationalize that text so that we can
+#. tweak it without breaking translations.
+#, c-format
+msgid "TOFU: few signatures %d message %s"
+msgid_plural "TOFU: few signatures %d messages %s"
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+msgid "error opening TOFU database: %s\n"
+msgstr "error mentre s'enviava a «%s»: %s\n"
+
+#, fuzzy, c-format
#| msgid "`%s' is not a valid long keyID\n"
msgid "'%s' is not a valid long keyID\n"
msgstr "«%s» no és un ID de clau llarg vàlid\n"
@@ -5841,19 +6111,24 @@ msgstr ""
"no és necessària una comprovació de la base de dades de confiança\n"
"\n"
-#, fuzzy, c-format
-msgid "public key %s not found: %s\n"
-msgstr "no s'ha trobat la clau pública %08lX: %s\n"
-
msgid "please do a --check-trustdb\n"
msgstr "si us plau, feu un --check-trustdb\n"
msgid "checking the trustdb\n"
msgstr "s'està comprovant la base de dades de confiança\n"
-#, c-format
-msgid "%d keys processed (%d validity counts cleared)\n"
-msgstr "s'han processat %d claus (s'han netejat %d comptes de validesa)\n"
+#, fuzzy, c-format
+msgid "%d key processed"
+msgid_plural "%d keys processed"
+msgstr[0] "fins ara s'han processat %lu claus\n"
+msgstr[1] "fins ara s'han processat %lu claus\n"
+
+#, fuzzy, c-format
+#| msgid "%d keys processed (%d validity counts cleared)\n"
+msgid " (%d validity count cleared)\n"
+msgid_plural " (%d validity counts cleared)\n"
+msgstr[0] "s'han processat %d claus (s'han netejat %d comptes de validesa)\n"
+msgstr[1] "s'han processat %d claus (s'han netejat %d comptes de validesa)\n"
msgid "no ultimately trusted keys found\n"
msgstr "no s'han trobat claus amb confiança absoluta\n"
@@ -5864,10 +6139,6 @@ msgstr ""
"no s'ha trobat la clau pública de la clau amb confiança absoluta %08lX\n"
#, c-format
-msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
-msgstr ""
-
-#, c-format
msgid ""
"depth: %d valid: %3d signed: %3d trust: %d-, %dq, %dn, %dm, %df, %du\n"
msgstr ""
@@ -6067,8 +6338,11 @@ msgid "card is permanently locked!\n"
msgstr ""
#, c-format
-msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
-msgstr ""
+msgid "%d Admin PIN attempt remaining before card is permanently locked\n"
+msgid_plural ""
+"%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr[0] ""
+msgstr[1] ""
#. TRANSLATORS: Do not translate the "|A|" prefix but keep it at
#. the start of the string. Use %%0A to force a linefeed.
@@ -6159,8 +6433,10 @@ msgid "generating key failed\n"
msgstr "La generació de claus ha fallat: %s\n"
#, fuzzy, c-format
-msgid "key generation completed (%d seconds)\n"
-msgstr "La generació de claus ha fallat: %s\n"
+msgid "key generation completed (%d second)\n"
+msgid_plural "key generation completed (%d seconds)\n"
+msgstr[0] "La generació de claus ha fallat: %s\n"
+msgstr[1] "La generació de claus ha fallat: %s\n"
msgid "invalid structure of OpenPGP card (DO 0x93)\n"
msgstr ""
@@ -8404,6 +8680,9 @@ msgstr "|N|usa el mode de contrasenya especificat"
msgid "do not allow the reuse of old passphrases"
msgstr "error en la creació de la contrasenya: %s\n"
+msgid "|N|set the Pinentry timeout to N seconds"
+msgstr ""
+
msgid "|NAME|use NAME as default secret key"
msgstr "|NOM|usa NOM com a clau secreta predeterminada"
@@ -8700,6 +8979,91 @@ msgid ""
"Check a passphrase given on stdin against the patternfile\n"
msgstr ""
+#~ msgid "%d signatures not checked due to missing keys\n"
+#~ msgstr "%d signatures no comprovades per falta de clau\n"
+
+#~ msgid "%d signatures not checked due to errors\n"
+#~ msgstr "%d signatures no comprovades a causa d'errors\n"
+
+#~ msgid "1 user ID without valid self-signature detected\n"
+#~ msgstr "Ha estat detectat 1 ID sense autosignatura vàlida\n"
+
+# Werner FIXME: use ngettext. jm
+#~ msgid "Deleted %d signatures.\n"
+#~ msgstr "S'han esborrat %d signatures.\n"
+
+#, fuzzy
+#~ msgid "User ID \"%s\": %d signatures removed\n"
+#~ msgstr "L'ID d'usuari «%s» està revocat."
+
+#~ msgid ""
+#~ "You need a Passphrase to protect your secret key.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Cal una contrasenya per a protegir la clau secreta.\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "Please enter a passphrase to protect the off-card backup of the new "
+#~ "encryption key."
+#~ msgstr "Introduïu la contrasenya; aquesta ha de ser una frase secreta \n"
+
+#~ msgid "passphrase not correctly repeated; try again"
+#~ msgstr "la contrasenya no s'ha repetit correctament; torneu a intentar-ho"
+
+#~ msgid "%s.\n"
+#~ msgstr "%s.\n"
+
+#~ msgid ""
+#~ "You don't want a passphrase - this is probably a *bad* idea!\n"
+#~ "I will do it anyway. You can change your passphrase at any time,\n"
+#~ "using this program with the option \"--edit-key\".\n"
+#~ "\n"
+#~ msgstr ""
+#~ "No voleu contrasenya: és una mala idea!\n"
+#~ "Bé. Si voleu canviar-la més endavant,\n"
+#~ "useu aquest programa amb l'opció \"--edit-key\".\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid "storing key onto card failed: %s\n"
+#~ msgstr "no s'ha pogut eliminar el bloc de claus: %s\n"
+
+#, fuzzy
+#~| msgid "1 bad signature\n"
+#~ msgid "1 good signature\n"
+#~ msgstr "1 signatura errònia\n"
+
+#, fuzzy
+#~ msgid "renaming '%s' to '%s' failed: %s\n"
+#~ msgstr "no s'ha pogut crear l'armadura: %s\n"
+
+#, fuzzy
+#~ msgid "%lu keys cached (%lu signatures)\n"
+#~ msgstr "s'han comprovat %lu claus (%lu signatures)\n"
+
+#, fuzzy
+#~ msgid "refreshing 1 key from %s\n"
+#~ msgstr "s'està sol·licitant la clau %08lX de %s\n"
+
+#, fuzzy
+#~ msgid "sending key %s to %s server %s\n"
+#~ msgstr "s'està cercant «%s» al servidor HKP %s\n"
+
+#, fuzzy
+#~ msgid "public key %s is %lu seconds newer than the signature\n"
+#~ msgstr "la clau pública %08lX és %lu segons anterior a la signatura\n"
+
+# Werner FIXME: use ngettext. jm
+#, fuzzy
+#~ msgid ""
+#~ "key %s was created %lu seconds in the future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "la clau s'ha creat %lu segons en el futur (salt en el temps o problemes\n"
+#~ "amb el rellotge)\n"
+
#, fuzzy
#~| msgid "can't open the keyring"
#~ msgid "Failed to open the keyring DB.\n"
@@ -8964,11 +9328,6 @@ msgstr ""
# «del servidor», «en el servidor»? ivb
#, fuzzy
-#~ msgid "no keyserver action!\n"
-#~ msgstr "error de servidor de claus"
-
-# «del servidor», «en el servidor»? ivb
-#, fuzzy
#~ msgid "keyserver timed out\n"
#~ msgstr "error de servidor de claus"
@@ -10073,9 +10432,6 @@ msgstr ""
#~ msgid " signed by %08lX at %s%s\n"
#~ msgstr " signat per %08lX el %s%s\n"
-#~ msgid "Policy: "
-#~ msgstr "Política: "
-
#~ msgid "Experimental algorithms should not be used!\n"
#~ msgstr "No hauríeu d'usar algoritmes experimentals!\n"
@@ -10426,9 +10782,6 @@ msgstr ""
#~ msgid "\t%lu due to new pubkeys\n"
#~ msgstr "\\t%lu degut a noves claus públiques\n"
-#~ msgid "\t%lu keys updated\n"
-#~ msgstr "\t%lu clau actualitzades\n"
-
#~ msgid "Ooops, no keys\n"
#~ msgstr "Ooops, no hi ha claus\n"
diff --git a/po/cs.po b/po/cs.po
index 06f7662..6ebfe07 100644
--- a/po/cs.po
+++ b/po/cs.po
@@ -3,7 +3,7 @@
# 2005 Free Software Foundation, Inc.
# Magda Procházková <magda@math.muni.cz> 2001,
# Roman Pavlik <rp@tns.cz> 2001, 2002, 2003, 2004, 2005.
-# Petr Pisar <petr.pisar@atlas.cz>, 2009, 2010, 2011, 2013, 2014.
+# Petr Pisar <petr.pisar@atlas.cz>, 2009, 2010, 2011, 2013, 2014, 2015.
#
# A "%%0A" is used by Pinentry to insert a line break. The double percent
# sign is actually needed because it is also a printf format string. If you
@@ -33,11 +33,11 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: gnupg2 2.1.0\n"
+"Project-Id-Version: gnupg2 2.1.10\n"
"Report-Msgid-Bugs-To: translations@gnupg.org\n"
-"PO-Revision-Date: 2014-11-16 16:22+0100\n"
+"PO-Revision-Date: 2015-12-07 20:45+0100\n"
"Last-Translator: Petr Pisar <petr.pisar@atlas.cz>\n"
-"Language-Team: Czech <translations.cs@gnupg.cz>\n"
+"Language-Team: Czech <gnupg-i18n@gnupg.org>\n"
"Language: cs\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -60,36 +60,26 @@ msgstr "|pinentry-label|_OK"
msgid "|pinentry-label|_Cancel"
msgstr "|pinentry-label|_Zrušit"
-#, fuzzy
-#| msgid "|pinentry-label|_OK"
msgid "|pinentry-label|_Yes"
-msgstr "|pinentry-label|_OK"
+msgstr "|pinentry-label|_Ano"
-#, fuzzy
-#| msgid "|pinentry-label|_OK"
msgid "|pinentry-label|_No"
-msgstr "|pinentry-label|_OK"
+msgstr "|pinentry-label|_Ne"
msgid "|pinentry-label|PIN:"
msgstr "|pinentry-label|PIN:"
-#, fuzzy
-#| msgid "|pinentry-label|_Cancel"
msgid "|pinentry-label|_Save in password manager"
-msgstr "|pinentry-label|_Zrušit"
+msgstr "|pinentry-label|_Uložit do správce hesel"
-#, fuzzy
-#| msgid "Do you really want to permanently delete the OpenPGP secret key:"
msgid "Do you really want to make your passphrase visible on the screen?"
-msgstr "Opravdu chcete trvale smazat tajný klÃ­Ä OpenPGP:"
+msgstr "Opravdu chcete uÄinit heslo na obrazovce viditelným?"
msgid "|pinentry-tt|Make passphrase visible"
-msgstr ""
+msgstr "|pinentry-tt|Zviditelnit heslo"
-#, fuzzy
-#| msgid "invalid passphrase"
msgid "|pinentry-tt|Hide passphrase"
-msgstr "nesprávné heslo"
+msgstr "|pinentry-tt|Skrýt heslo"
#. TRANSLATORS: This string is displayed by Pinentry as the label
#. for the quality bar.
@@ -120,7 +110,7 @@ msgstr ""
"Prosím, zadejte vaÅ¡e heslo, aby pro tuto relaci mohl být odemknut tajný klíÄ"
msgid "PIN:"
-msgstr ""
+msgstr "PIN:"
msgid "Passphrase:"
msgstr "Heslo:"
@@ -314,8 +304,7 @@ msgstr[1] "Heslo by mÄ›lo obsahovat alespoň %u Äíslice nebo %%0Azvláštní z
msgstr[2] ""
"Heslo by mÄ›lo obsahovat alespoň %u Äíslic nebo %%0Azvláštních znaků."
-#, fuzzy, c-format
-#| msgid "A 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 ""
"Heslo by nemÄ›lo být známým slovem nebo se shodovat%%0As urÄitým vzorem."
@@ -376,10 +365,8 @@ msgstr "|PROGRAM|použít PROGRAM jako SCdaemon program"
msgid "do not use the SCdaemon"
msgstr "nepoužívat SCdémona"
-#, fuzzy
-#| msgid "|NAME|connect to host NAME"
msgid "|NAME|accept some commands via NAME"
-msgstr "|NÃZEV|pÅ™ipojí se ke strojí NÃZEV"
+msgstr "|NÃZEV|pÅ™ijímat nÄ›které příkazy pÅ™es NÃZEV"
msgid "ignore requests to change the TTY"
msgstr "ignorovat požadavky na změnu TTY"
@@ -393,10 +380,8 @@ msgstr "|N|zahodit zapamatované PINy po N sekundách"
msgid "do not use the PIN cache when signing"
msgstr "nepoužívat paměť PINů na podepisování"
-#, fuzzy
-#| msgid "do not allow the reuse of old passphrases"
msgid "disallow the use of an external password cache"
-msgstr "nedovolit opakovat stará hesla"
+msgstr "nedovolit použít vnější úložiště na hesla"
msgid "disallow clients to mark keys as \"trusted\""
msgstr "nedovolit klientům oznaÄovat klíÄe za „důvÄ›ryhodné“"
@@ -405,10 +390,10 @@ msgid "allow presetting passphrase"
msgstr "umožnit přednastavení hesla"
msgid "allow caller to override the pinentry"
-msgstr ""
+msgstr "umožnit volajícímu přebít pinentry"
msgid "allow passphrase to be prompted through Emacs"
-msgstr ""
+msgstr "umožnit zadání hesla skrze Emacs"
msgid "enable ssh support"
msgstr "zapnout podporu pro OpenSSH"
@@ -422,7 +407,7 @@ msgstr "zapnout podporu pro PuTTY"
msgid "Please report bugs to <@EMAIL@>.\n"
msgstr ""
"Chyby v programu, prosím, oznamujte (anglicky) na <@EMAIL@>,\n"
-"pÅ™ipomínky k pÅ™ekladu hlaste (Äesky) na <translations.cs@gnupg.cz>.\n"
+"připomínky k překladu hlaste na <gnupg-i18n@gnupg.org>.\n"
msgid "Usage: @GPG_AGENT@ [options] (-h for help)"
msgstr "Použití: @GPG_AGENT@ [volby] (-h pro nápovědu)"
@@ -688,12 +673,12 @@ msgstr "Změnit heslo"
msgid "I'll change it later"
msgstr "Změním jej později"
-#, 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 "Opravdu chcete smazat vybrané klíÄe? (a/N) "
+msgstr ""
+"Opravdu chcete smazat klÃ­Ä urÄený pomocí keygripu%%0A %s%%0A %%C%%0A?"
msgid "Delete key"
msgstr "Smazat klíÄ"
@@ -850,7 +835,7 @@ msgstr "VAROVÃNÃ: „%s%s“ je zastaralý parametr – neúÄinkuje\n"
#, c-format
msgid "unknown debug flag '%s' ignored\n"
-msgstr ""
+msgstr "neznámý ladicí příznak „%s“ se ignoruje\n"
#, c-format
msgid "no running gpg-agent - starting '%s'\n"
@@ -863,10 +848,8 @@ msgstr "Äeká se na agenta… (%d s)\n"
msgid "connection to agent established\n"
msgstr "spojení na agenta ustanoveno\n"
-#, fuzzy
-#| msgid "connection to agent established\n"
msgid "connection to agent is in restricted mode\n"
-msgstr "spojení na agenta ustanoveno\n"
+msgstr "spojení na agenta je v omezeném režimu\n"
#, c-format
msgid "no running Dirmngr - starting '%s'\n"
@@ -1214,6 +1197,20 @@ msgstr "předání dotazu %s klientovi se nezdařilo\n"
msgid "Enter passphrase: "
msgstr "Vložte heslo: "
+#, fuzzy, c-format
+#| msgid "error creating keyring '%s': %s\n"
+msgid "error getting version from '%s': %s\n"
+msgstr "chyba pÅ™i vytváření souboru klíÄů (keyring) „%s“: %s\n"
+
+#, c-format
+msgid "server '%s' is older than us (%s < %s)"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "WARNING: "
+msgid "WARNING: %s\n"
+msgstr "VAROVÃNÃ: "
+
#, c-format
msgid "OpenPGP card not available: %s\n"
msgstr "OpenPGP karta není dostupná: %s\n"
@@ -1418,23 +1415,18 @@ msgstr "Prosím vyberte místo pro uchování klíÄe:\n"
msgid "KEYTOCARD failed: %s\n"
msgstr "Volání KEYTOCARD selhalo: %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 "Tento příkaz není v módů %s dovolený.\n"
+msgstr "Tento příkaz není touto kartou podporován\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 "Poznámka: na kartÄ› jsou již klíÄe uloženy!\n"
+msgstr "Poznámka: Tento příkaz zniÄí vÅ¡echny klíÄe uložené na kartÄ›!\n"
-#, fuzzy
-#| msgid "Continue? (Y/n) "
msgid "Continue? (y/N) "
-msgstr "PokraÄovat (A/n) "
+msgstr "PokraÄovat (a/N) "
+# The code expects non-localized "yes"
msgid "Really do a factory reset? (enter \"yes\") "
-msgstr ""
+msgstr "Opravdu obnovit tovární nastavení (zadejte „yes“) "
msgid "quit this menu"
msgstr "ukonÄit toto menu"
@@ -1485,7 +1477,7 @@ msgid "unblock the PIN using a Reset Code"
msgstr "odblokovat PIN pomocí resetaÄního kódu"
msgid "destroy all keys and data"
-msgstr ""
+msgstr "zniÄit vÅ¡echny klíÄe a data"
msgid "gpg/card> "
msgstr "gpg/karta> "
@@ -1517,10 +1509,9 @@ msgstr "klÃ­Ä â€ž%s“ nenalezen: %s\n"
msgid "error reading keyblock: %s\n"
msgstr "chyba pÅ™i Ätení bloku klíÄe: %s\n"
-#, fuzzy, c-format
-#| msgid "key \"%s\" not found: %s\n"
+#, c-format
msgid "key \"%s\" not found\n"
-msgstr "klÃ­Ä â€ž%s“ nenalezen: %s\n"
+msgstr "klÃ­Ä â€ž%s“ nenalezen\n"
msgid "(unless you specify the key by fingerprint)\n"
msgstr "(dokud neurÄíte klÃ­Ä jeho otiskem)\n"
@@ -1685,6 +1676,9 @@ msgstr "odstranit nepoužitelné Äásti z klíÄe pÅ™i exportu"
msgid "remove as much as possible from key during export"
msgstr "odstranit pÅ™i exportu z klíÄe vÅ¡e, co lze"
+msgid " - skipped"
+msgstr " – pÅ™eskoÄeno"
+
msgid "exporting secret keys not allowed\n"
msgstr "exportování tajného klíÄe není povoleno\n"
@@ -1696,16 +1690,40 @@ msgstr "klÃ­Ä %s: PGP 2.x klíÄ – pÅ™eskoÄeno\n"
msgid "key %s: key material on-card - skipped\n"
msgstr "klÃ­Ä %s: tÄ›lo klíÄe je na kartě – pÅ™eskoÄeno\n"
-msgid " - skipped"
-msgstr " – pÅ™eskoÄeno"
-
msgid "WARNING: nothing exported\n"
msgstr "VAROVÃNÃ: nebylo nic vyexportováno\n"
+#, c-format
+msgid "error creating '%s': %s\n"
+msgstr "chyba při vytváření „%s“: %s\n"
+
msgid "[User ID not found]"
msgstr "[ID uživatele nenalezeno]"
#, c-format
+msgid "(check argument of option '%s')\n"
+msgstr "(zkontrolujte argument volby „%s“)\n"
+
+#, fuzzy, c-format
+#| msgid ""
+#| "Warning: value '%s' for option '%s' should be a long key ID or a "
+#| "fingerprint\n"
+msgid "Warning: '%s' should be a long key ID or a fingerprint\n"
+msgstr ""
+"Pozor: hodnota „%s“ volby „%s“ by měla být\n"
+"dlouhý identifikátor klíÄe nebo jeho otisk\n"
+
+#, fuzzy, c-format
+#| msgid "error closing %s: %s\n"
+msgid "error looking up: %s\n"
+msgstr "chyba při zavírání chyba %s: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error searching the keyring: %s\n"
+msgid "Warning: %s appears in the keyring %d times\n"
+msgstr "chyba pÅ™i prohledávání souboru klíÄů (keyring): %s\n"
+
+#, c-format
msgid "automatically retrieved '%s' via %s\n"
msgstr "„%s“ automaticky získáno přes %s\n"
@@ -1721,14 +1739,18 @@ msgid "secret key \"%s\" not found: %s\n"
msgstr "tajný klÃ­Ä â€ž%s“ nenalezen: %s\n"
#, fuzzy, c-format
-#| msgid "missing argument for option \"%.50s\"\n"
-msgid "(check argument of option '%s')\n"
-msgstr "postrádám argument u volby „%.50s“\n"
+#| msgid "using \"%s\" as default secret key\n"
+msgid "Warning: not using '%s' as default key: %s\n"
+msgstr "jako výchozí tajný klÃ­Ä se použije „%s“\n"
#, fuzzy, c-format
-#| msgid "|NAME|use NAME as default secret key"
-msgid "using \"%s\" as default secret key\n"
-msgstr "|NÃZEV|použít NÃZEV jako implicitní tajný klíÄ"
+#| msgid "using \"%s\" as default secret key\n"
+msgid "using \"%s\" as default secret key for signing\n"
+msgstr "jako výchozí tajný klÃ­Ä se použije „%s“\n"
+
+#, c-format
+msgid "all values passed to '%s' ignored\n"
+msgstr ""
# c-format
#, c-format
@@ -1781,10 +1803,8 @@ msgstr "vytvoÅ™it nový pár klíÄů"
msgid "quickly generate a new key pair"
msgstr "rychle vytvoÅ™it nový pár klíÄů"
-#, fuzzy
-#| msgid "quickly generate a new key pair"
msgid "quickly add a new user-id"
-msgstr "rychle vytvoÅ™it nový pár klíÄů"
+msgstr "rychle přidat novou identitu uživatele"
msgid "full featured key pair generation"
msgstr "komplexní vytvoÅ™ení páru klíÄů"
@@ -1854,6 +1874,8 @@ msgstr "pracovat v režimu serveru"
msgid "|VALUE|set the TOFU policy for a key (good, unknown, bad, ask, auto)"
msgstr ""
+"|HODNOTA|nastavit TOFU politiku klíÄi (good [dobrý], unknown [neznámý], bad "
+"[špatný], ask [zeptat se], auto)"
msgid "create ascii armored output"
msgstr "vytvoř výstup zakódovaný pomocí ASCII"
@@ -2055,52 +2077,25 @@ msgstr "ukazovat název souboru s klíÄi pÅ™i výpisu klíÄů"
msgid "show expiration dates during signature listings"
msgstr "ukazovat data expirace během výpisu podpisů"
-#, fuzzy
-#| msgid "Available keys:\n"
msgid "available TOFU policies:\n"
-msgstr "Dostupné klíÄe:\n"
+msgstr "dostupné politiky TOFU:\n"
-#, fuzzy, c-format
-#| msgid "unknown option '%s'\n"
+#, c-format
msgid "unknown TOFU policy '%s'\n"
-msgstr "neznámá volba „%s“\n"
+msgstr "neznámá TOFU politika „%s“\n"
msgid "(use \"help\" to list choices)\n"
-msgstr ""
+msgstr "(možnosti lze vypsat příkazem „help“)\n"
-#, fuzzy, c-format
-#| msgid "unknown command '%s'\n"
+#, c-format
msgid "unknown TOFU DB format '%s'\n"
-msgstr "neznámý příkaz „%s“\n"
+msgstr "neznámý formát „%s“ databáze TOFU\n"
#, c-format
msgid "Note: old default options file '%s' ignored\n"
msgstr "Poznámka: starý implicitní soubor s možnostmi „%s“ ignorován\n"
#, c-format
-msgid ""
-"Warning: value '%s' for option '%s' should be a long key ID or a "
-"fingerprint\n"
-msgstr ""
-
-#, fuzzy, c-format
-#| msgid "option \"%.50s\" is ambiguous\n"
-msgid "key specification '%s' is ambiguous\n"
-msgstr "volba „%.50s“ není jednoznaÄná\n"
-
-#. TRANSLATORS: The %s prints a key specification which
-#. for example has been given at the command line. Two
-#. lines with fingerprints are printed after this message.
-#, c-format
-msgid "'%s' matches at least:\n"
-msgstr ""
-
-#, fuzzy, c-format
-#| msgid "error creating keyring '%s': %s\n"
-msgid "error searching the keyring: %s\n"
-msgstr "chyba pÅ™i vytváření souboru klíÄů (keyring) „%s“: %s\n"
-
-#, c-format
msgid "libgcrypt is too old (need %s, have %s)\n"
msgstr "libgcrypt je příliš stará (potřebuji %s, mám %s)\n"
@@ -2297,16 +2292,6 @@ msgid "WARNING: recipients (-r) given without using public key encryption\n"
msgstr ""
"VAROVÃNÃ: specifikován adresát (-r) bez použití Å¡ifrování s veÅ™ejným klíÄem\n"
-#, fuzzy, c-format
-#| msgid "line %d: invalid date given\n"
-msgid "option '%s' given, but no valid default keys given\n"
-msgstr "řádek %d: zadáno neplatné datum\n"
-
-#, fuzzy, c-format
-#| msgid "line %d: invalid date given\n"
-msgid "option '%s' given, but option '%s' not given\n"
-msgstr "řádek %d: zadáno neplatné datum\n"
-
msgid "--store [filename]"
msgstr "--store [jméno souboru]"
@@ -2356,13 +2341,13 @@ msgid "--decrypt [filename]"
msgstr "--decrypt [jméno souboru]"
msgid "--sign-key user-id"
-msgstr "--sign-key id uživatele"
+msgstr "--sign-key id_uživatele"
msgid "--lsign-key user-id"
-msgstr "--lsign-key id uživatele"
+msgstr "--lsign-key id_uživatele"
msgid "--edit-key user-id [commands]"
-msgstr "--edit-key id uživatele [příkazy]"
+msgstr "--edit-key id_uživatele [příkazy]"
msgid "--passwd <user-id>"
msgstr "--passwd <id-uživatele>"
@@ -2379,6 +2364,11 @@ msgstr "získání dat z serveru klíÄů se nezdaÅ™ilo: %s\n"
msgid "key export failed: %s\n"
msgstr "export klíÄe se nepodaÅ™il: %s\n"
+#, fuzzy, c-format
+#| msgid "key export failed: %s\n"
+msgid "export as ssh key failed: %s\n"
+msgstr "export klíÄe se nepodaÅ™il: %s\n"
+
#, c-format
msgid "keyserver search failed: %s\n"
msgstr "hledání na serveru klíÄů se nezdaÅ™ilo: %s\n"
@@ -2399,20 +2389,19 @@ msgstr "kódování do ASCII formátu selhalo: %s\n"
msgid "invalid hash algorithm '%s'\n"
msgstr "neplatný hashovací algoritmus „%s“\n"
-#, fuzzy, c-format
-#| msgid "error loading certificate '%s': %s\n"
+#, c-format
msgid "error parsing key specification '%s': %s\n"
-msgstr "chyba při zavádění certifikátu „%s“: %s\n"
+msgstr "chyba pÅ™i rozboru názvu klíÄe „%s“: %s\n"
#, c-format
msgid "'%s' does not appear to be a valid key ID, fingerprint or keygrip\n"
-msgstr ""
+msgstr "„%s“ nevypadá jako platné ID klíÄe, otisk klíÄe nebo keygrip\n"
msgid "[filename]"
msgstr "[jméno souboru]"
msgid "Go ahead and type your message ...\n"
-msgstr "ZaÄnÄ›te psát svou zprávu ...\n"
+msgstr "ZaÄnÄ›te psát svou zprávu…\n"
msgid "the given certification policy URL is invalid\n"
msgstr "zadané URL pro certifikaÄní politiku je neplatné\n"
@@ -2455,10 +2444,8 @@ msgstr "importovat podpisy, které jsou oznaÄeny jen jako místní"
msgid "repair damage from the pks keyserver during import"
msgstr "opravit poškození vzniklá při importu z PKS serveru"
-#, fuzzy
-#| msgid "do not update the trustdb after import"
msgid "do not clear the ownertrust values during import"
-msgstr "neaktualizovat databázi důvěry po importu"
+msgstr "nemazat údaje o důvěře během importu"
msgid "do not update the trustdb after import"
msgstr "neaktualizovat databázi důvěry po importu"
@@ -2484,66 +2471,65 @@ msgstr "%lu klíÄe byly doposud zpracovány\n"
msgid "Total number processed: %lu\n"
msgstr "Celkový poÄet zpracovaných klíÄů: %lu\n"
-#, fuzzy, c-format
-#| msgid " skipped new keys: %lu\n"
+#, c-format
msgid " skipped PGP-2 keys: %lu\n"
-msgstr " pÅ™eskoÄeny nové klíÄe: %lu\n"
+msgstr " pÅ™eskoÄeny klíÄe PGP2: %lu\n"
#, c-format
msgid " skipped new keys: %lu\n"
-msgstr " pÅ™eskoÄeny nové klíÄe: %lu\n"
+msgstr " pÅ™eskoÄeny nové klíÄe: %lu\n"
#, c-format
msgid " w/o user IDs: %lu\n"
-msgstr " bez ID uživatele: %lu\n"
+msgstr " bez ID uživatele: %lu\n"
#, c-format
msgid " imported: %lu"
-msgstr " importováno: %lu"
+msgstr " importováno: %lu"
#, c-format
msgid " unchanged: %lu\n"
-msgstr " beze změn: %lu\n"
+msgstr " beze změn: %lu\n"
#, c-format
msgid " new user IDs: %lu\n"
-msgstr " nové ID uživatelů: %lu\n"
+msgstr " nové ID uživatelů: %lu\n"
#, c-format
msgid " new subkeys: %lu\n"
-msgstr " nové podklíÄe: %lu\n"
+msgstr " nové podklíÄe: %lu\n"
#, c-format
msgid " new signatures: %lu\n"
-msgstr " nové podpisy: %lu\n"
+msgstr " nové podpisy: %lu\n"
#, c-format
msgid " new key revocations: %lu\n"
-msgstr " nové revokace klíÄů: %lu\n"
+msgstr " nové revokace klíÄů: %lu\n"
#, c-format
msgid " secret keys read: %lu\n"
-msgstr " pÅ™eÄtené tajné klíÄe: %lu\n"
+msgstr " pÅ™eÄtené tajné klíÄe: %lu\n"
#, c-format
msgid " secret keys imported: %lu\n"
-msgstr " importované tajné klíÄe: %lu\n"
+msgstr " importované tajné klíÄe: %lu\n"
#, c-format
msgid " secret keys unchanged: %lu\n"
-msgstr " tajné klíÄe nezmÄ›nÄ›ny: %lu\n"
+msgstr " tajné klíÄe nezmÄ›nÄ›ny: %lu\n"
#, c-format
msgid " not imported: %lu\n"
-msgstr " neimportováno: %lu\n"
+msgstr " neimportováno: %lu\n"
#, c-format
msgid " signatures cleaned: %lu\n"
-msgstr " odstraněné podpisy: %lu\n"
+msgstr " odstraněné podpisy: %lu\n"
#, c-format
msgid " user IDs cleaned: %lu\n"
-msgstr " odstraněné uživatelské ID: %lu\n"
+msgstr " odstraněné uživatelské ID: %lu\n"
#, c-format
msgid ""
@@ -2719,7 +2705,7 @@ msgstr "klÃ­Ä %s: tajný klÃ­Ä s neplatnou Å¡ifrou %d – pÅ™eskoÄeno\n"
#. created again.
#, c-format
msgid "To migrate '%s', with each smartcard, run: %s\n"
-msgstr ""
+msgstr "Pro migraci „%s“ u každé karty spusťte: %s\n"
#, c-format
msgid "key %s: no public key - can't apply revocation certificate\n"
@@ -2847,10 +2833,9 @@ msgstr "soubor klíÄů (keyring) „%s“ vytvoÅ™en\n"
msgid "keyblock resource '%s': %s\n"
msgstr "zdroj bloku klíÄe „%s“: %s\n"
-#, fuzzy, c-format
-#| msgid "error opening '%s': %s\n"
+#, c-format
msgid "error opening key DB: %s\n"
-msgstr "chyba při otevírání „%s“: %s\n"
+msgstr "chyba pÅ™i otevírání databáze klíÄů: %s\n"
#, c-format
msgid "failed to rebuild keyring cache: %s\n"
@@ -2862,33 +2847,40 @@ msgstr "[revokace]"
msgid "[self-signature]"
msgstr "[podpis klíÄe jím samým]"
-msgid "1 bad signature\n"
-msgstr "1 špatný podpis\n"
-
-#, c-format
-msgid "%d bad signatures\n"
-msgstr "%d špatných podpisů\n"
-
-msgid "1 signature not checked due to a missing key\n"
-msgstr "1 podpis neověřen, protože chybí klíÄ\n"
-
-#, c-format
-msgid "%d signatures not checked due to missing keys\n"
-msgstr "%d podpisů neověřených, protože chybí klíÄ\n"
-
-msgid "1 signature not checked due to an error\n"
-msgstr "1 podpis neověřen, protože vznikla chyba\n"
+#, fuzzy, c-format
+#| msgid "%d bad signatures\n"
+msgid "%d bad signature\n"
+msgid_plural "%d bad signatures\n"
+msgstr[0] "%d špatných podpisů\n"
+msgstr[1] "%d špatných podpisů\n"
+msgstr[2] "%d špatných podpisů\n"
-#, c-format
-msgid "%d signatures not checked due to errors\n"
-msgstr "%d podpisů neověřených, protože vznikly chyby\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to a missing key\n"
+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 podpis neověřen, protože chybí klíÄ\n"
+msgstr[1] "1 podpis neověřen, protože chybí klíÄ\n"
+msgstr[2] "1 podpis neověřen, protože chybí klíÄ\n"
-msgid "1 user ID without valid self-signature detected\n"
-msgstr "objeven 1 identifikátor uživatele bez platného podpisu jím samým\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to an error\n"
+msgid "%d signature not checked due to an error\n"
+msgid_plural "%d signatures not checked due to errors\n"
+msgstr[0] "1 podpis neověřen, protože vznikla chyba\n"
+msgstr[1] "1 podpis neověřen, protože vznikla chyba\n"
+msgstr[2] "1 podpis neověřen, protože vznikla chyba\n"
-#, c-format
-msgid "%d user IDs without valid self-signatures detected\n"
-msgstr "objeveno %d identifikátorů uživatele bez platného podpisu jím samým\n"
+#, fuzzy, c-format
+#| msgid "%d user IDs without valid self-signatures detected\n"
+msgid "%d user ID without valid self-signature detected\n"
+msgid_plural "%d user IDs without valid self-signatures detected\n"
+msgstr[0] ""
+"objeveno %d identifikátorů uživatele bez platného podpisu jím samým\n"
+msgstr[1] ""
+"objeveno %d identifikátorů uživatele bez platného podpisu jím samým\n"
+msgstr[2] ""
+"objeveno %d identifikátorů uživatele bez platného podpisu jím samým\n"
msgid ""
"Please decide how far you trust this user to correctly verify other users' "
@@ -2898,7 +2890,7 @@ msgid ""
msgstr ""
"Prosím rozhodněte, nakolik důvěřujete tomuto uživateli, že správně\n"
"verifikuje klíÄe jiných uživatelů (prohlédnutím cestovních pasů,\n"
-"kontrolou otisků z různých zdrojů...)?\n"
+"kontrolou otisků z různých zdrojů…)?\n"
"\n"
#, c-format
@@ -2925,7 +2917,7 @@ msgstr ""
#, c-format
msgid "Skipping user ID \"%s\", which is not a text ID.\n"
-msgstr ""
+msgstr "Přeskakuje se ID uživatele „%s“, což není textové ID.\n"
#, c-format
msgid "User ID \"%s\" is revoked."
@@ -3097,10 +3089,8 @@ msgstr "uložit a ukonÄit"
msgid "show key fingerprint"
msgstr "vypsat otisk klíÄe"
-#, fuzzy
-#| msgid "Enter the keygrip: "
msgid "show the keygrip"
-msgstr "Vložte keygrip: "
+msgstr "ukázat keygrip"
msgid "list key and user IDs"
msgstr "vypsat seznam klíÄů a id uživatelů"
@@ -3230,10 +3220,8 @@ msgstr "KlÃ­Ä revokován."
msgid "Really sign all user IDs? (y/N) "
msgstr "Opravdu podepsat všechny id uživatele? (a/N) "
-#, fuzzy
-#| msgid "Really sign all user IDs? (y/N) "
msgid "Really sign all text user IDs? (y/N) "
-msgstr "Opravdu podepsat všechny id uživatele? (a/N) "
+msgstr "Opravdu podepsat všechna textová ID uživatele? (a/N) "
msgid "Hint: Select the user IDs to sign\n"
msgstr "Nápověda: Vyberte id uživatele k podepsání\n"
@@ -3251,7 +3239,7 @@ msgstr "Musíte vybrat alespoň jeden id uživatele.\n"
#, c-format
msgid "(Use the '%s' command.)\n"
-msgstr ""
+msgstr "(Použijte příkaz „%s“.)\n"
msgid "You can't delete the last user ID!\n"
msgstr "Nemůžete smazat poslední id uživatele!\n"
@@ -3465,13 +3453,13 @@ msgstr "Smazat tento neznámý podpis? (a/N/u)"
msgid "Really delete this self-signature? (y/N)"
msgstr "Opravdu smazat tento podpis podepsaný sebou samým? (a/N)"
-#, c-format
+#, fuzzy, c-format
+#| msgid "Deleted %d signature.\n"
msgid "Deleted %d signature.\n"
-msgstr "Smazán %d podpis.\n"
-
-#, c-format
-msgid "Deleted %d signatures.\n"
-msgstr "Smazáno %d podpisů.\n"
+msgid_plural "Deleted %d signatures.\n"
+msgstr[0] "Smazán %d podpis.\n"
+msgstr[1] "Smazán %d podpis.\n"
+msgstr[2] "Smazán %d podpis.\n"
msgid "Nothing deleted.\n"
msgstr "Nic nebylo smazáno.\n"
@@ -3483,13 +3471,13 @@ msgstr "neplatný"
msgid "User ID \"%s\" compacted: %s\n"
msgstr "Uživatelské ID „%s“ směstnáno: %s\n"
-#, c-format
+#, fuzzy, c-format
+#| msgid "User ID \"%s\": %d signature removed\n"
msgid "User ID \"%s\": %d signature removed\n"
-msgstr "Uživatelské ID „%s“: %d podpisů odstraněno\n"
-
-#, c-format
-msgid "User ID \"%s\": %d signatures removed\n"
-msgstr "Uživatelské ID „%s“: %d podpisů odstraněno\n"
+msgid_plural "User ID \"%s\": %d signatures removed\n"
+msgstr[0] "Uživatelské ID „%s“: %d podpisů odstraněno\n"
+msgstr[1] "Uživatelské ID „%s“: %d podpisů odstraněno\n"
+msgstr[2] "Uživatelské ID „%s“: %d podpisů odstraněno\n"
#, c-format
msgid "User ID \"%s\": already minimized\n"
@@ -3530,13 +3518,10 @@ msgid ""
"Are you sure you want to appoint this key as a designated revoker? (y/N) "
msgstr "Jste si jistí, že tento klÃ­Ä chcete pověřit revokací? (a/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 "Jste si jistí, že tento klÃ­Ä chcete pověřit revokací? (a/N) "
+msgstr "Jste si jistí, že chcete zmÄ›nit dobu expirace více podklíÄům? (a/N) "
msgid "Changing expiration time for a subkey.\n"
msgstr "MÄ›ním dobu expirace podklíÄe.\n"
@@ -3585,10 +3570,9 @@ msgstr "Neexistuje identifikátor uživatele s indexem %d\n"
msgid "No user ID with hash %s\n"
msgstr "Neexistuje uživatelské ID s hashem %s\n"
-#, fuzzy, c-format
-#| msgid "No subkey with index %d\n"
+#, c-format
msgid "No subkey with key ID '%s'.\n"
-msgstr "Neexistuje podklÃ­Ä s indexem %d\n"
+msgstr "Neexistuje podklÃ­Ä s ID klíÄe „%s“.\n"
#, c-format
msgid "No subkey with index %d\n"
@@ -3934,7 +3918,7 @@ msgstr "Neplatný znak ve jméně\n"
#, c-format
msgid "The characters '%s' and '%s' may not appear in name\n"
-msgstr ""
+msgstr "Znaky „%s“ a „%s“ se ve jméně nesmí objevit\n"
msgid "Name may not start with a digit\n"
msgstr "Jméno nemůže zaÄínat Äíslicí\n"
@@ -4003,38 +3987,6 @@ msgid "Please correct the error first\n"
msgstr "Nejdřív, prosím, opravte chybu\n"
msgid ""
-"You need a Passphrase to protect your secret key.\n"
-"\n"
-msgstr ""
-"Pro ochranu VaÅ¡eho tajného klíÄe musíte zadat heslo.\n"
-"\n"
-
-msgid ""
-"Please enter a passphrase to protect the off-card backup of the new "
-"encryption key."
-msgstr ""
-"Prosím, zadejte heslo, kterým ochráníte zálohu mimo kartu nového šifrovacího "
-"klíÄe."
-
-msgid "passphrase not correctly repeated; try again"
-msgstr "heslo není zopakováno správně; zkuste to znovu"
-
-#, c-format
-msgid "%s.\n"
-msgstr "%s.\n"
-
-msgid ""
-"You don't want a passphrase - this is probably a *bad* idea!\n"
-"I will do it anyway. You can change your passphrase at any time,\n"
-"using this program with the option \"--edit-key\".\n"
-"\n"
-msgstr ""
-"Nechcete heslo – to *není* dobrý nápad!\n"
-"DobÅ™e, budu pokraÄovat bez hesla. Kdykoliv můžete heslo zmÄ›nit použitím\n"
-"tohoto programu s parametrem „--edit-key“.\n"
-"\n"
-
-msgid ""
"We need to generate a lot of random bytes. It is a good idea to perform\n"
"some other action (type on the keyboard, move the mouse, utilize the\n"
"disks) during the prime generation; this gives the random number\n"
@@ -4081,6 +4033,14 @@ msgid "Key generation canceled.\n"
msgstr "Vytváření klíÄe bylo zruÅ¡eno.\n"
#, c-format
+msgid "can't create backup file '%s': %s\n"
+msgstr "záložní soubor „%s“ nelze vytvořit: %s\n"
+
+#, c-format
+msgid "Note: backup of card key saved to '%s'\n"
+msgstr "Poznámka: záloha klíÄe z karty uložena do „%s“\n"
+
+#, c-format
msgid "writing public key to '%s'\n"
msgstr "veÅ™ejný klÃ­Ä se zapisuje do „%s“\n"
@@ -4128,18 +4088,6 @@ msgstr "Tajná Äást primárního klíÄe jsou uloženy na kartÄ›.\n"
msgid "Really create? (y/N) "
msgstr "Opravdu vytvořit? (a/N) "
-#, c-format
-msgid "storing key onto card failed: %s\n"
-msgstr "uložení klíÄe na kartu se nezdaÅ™ilo: %s\n"
-
-#, c-format
-msgid "can't create backup file '%s': %s\n"
-msgstr "záložní soubor „%s“ nelze vytvořit: %s\n"
-
-#, c-format
-msgid "Note: backup of card key saved to '%s'\n"
-msgstr "Poznámka: záloha klíÄe z karty uložena do „%s“\n"
-
msgid "never "
msgstr "nikdy "
@@ -4158,19 +4106,21 @@ msgstr "Kritická podepisovací notace: "
msgid "Signature notation: "
msgstr "Podepisovací notace: "
-#, fuzzy
-#| msgid "1 bad signature\n"
-msgid "1 good signature\n"
-msgstr "1 špatný podpis\n"
-
#, fuzzy, c-format
-#| msgid "%d bad signatures\n"
-msgid "%d good signatures\n"
-msgstr "%d špatných podpisů\n"
+#| msgid "%d good signatures\n"
+msgid "%d good signature\n"
+msgid_plural "%d good signatures\n"
+msgstr[0] "%d dobrých podpisů\n"
+msgstr[1] "%d dobrých podpisů\n"
+msgstr[2] "%d dobrých podpisů\n"
-#, c-format
-msgid "Warning: %lu key(s) skipped due to their large size\n"
-msgstr "Pozor: %lu klíÄ(ů) pÅ™eskoÄen(o) kvůli jejich příliÅ¡né velikosti\n"
+#, fuzzy, c-format
+#| msgid "Warning: %lu key(s) skipped due to their large size\n"
+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] "Pozor: %lu klíÄ(ů) pÅ™eskoÄen(o) kvůli jejich příliÅ¡né velikosti\n"
+msgstr[1] "Pozor: %lu klíÄ(ů) pÅ™eskoÄen(o) kvůli jejich příliÅ¡né velikosti\n"
+msgstr[2] "Pozor: %lu klíÄ(ů) pÅ™eskoÄen(o) kvůli jejich příliÅ¡né velikosti\n"
msgid "Keyring"
msgstr "Soubor klíÄů (keyring)"
@@ -4200,27 +4150,39 @@ msgid " Card serial no. ="
msgstr " Sériové Äíslo karty ="
#, c-format
-msgid "renaming '%s' to '%s' failed: %s\n"
-msgstr "přejmenování „%s“ na „%s“ se nezdařilo: %s\n"
-
-#, c-format
msgid "caching keyring '%s'\n"
msgstr "zapamatovává se soubor klíÄů „%s“\n"
-#, c-format
-msgid "%lu keys cached so far (%lu signatures)\n"
-msgstr "%lu klíÄů již uloženo v keÅ¡i (%lu podpisů)\n"
+#, fuzzy, c-format
+#| msgid "%lu keys cached so far (%lu signatures)\n"
+msgid "%lu keys cached so far (%lu signature)\n"
+msgid_plural "%lu keys cached so far (%lu signatures)\n"
+msgstr[0] "%lu klíÄů již uloženo v keÅ¡i (%lu podpisů)\n"
+msgstr[1] "%lu klíÄů již uloženo v keÅ¡i (%lu podpisů)\n"
+msgstr[2] "%lu klíÄů již uloženo v keÅ¡i (%lu podpisů)\n"
-#, c-format
-msgid "%lu keys cached (%lu signatures)\n"
-msgstr "%lu klíÄů uloženo v keÅ¡i (%lu podpisů)\n"
+#, fuzzy, c-format
+#| msgid "flush the cache"
+msgid "%lu key cached"
+msgid_plural "%lu keys cached"
+msgstr[0] "vyprázdní keš"
+msgstr[1] "vyprázdní keš"
+msgstr[2] "vyprázdní keš"
+
+#, fuzzy, c-format
+#| msgid "1 bad signature\n"
+msgid " (%lu signature)\n"
+msgid_plural " (%lu signatures)\n"
+msgstr[0] "1 špatný podpis\n"
+msgstr[1] "1 špatný podpis\n"
+msgstr[2] "1 špatný podpis\n"
#, c-format
msgid "%s: keyring created\n"
msgstr "%s: soubor klíÄů (keyring) vytvoÅ™en\n"
msgid "override proxy options set for dirmngr"
-msgstr ""
+msgstr "přebít nastavení proxy pro dirmngr"
msgid "include revoked keys in search results"
msgstr "zahrnout do výsledku hledání odvolané klíÄe"
@@ -4229,7 +4191,7 @@ msgid "include subkeys when searching by key ID"
msgstr "zahrnout podklíÄe, když se hledá podle ID klíÄe"
msgid "override timeout options set for dirmngr"
-msgstr ""
+msgstr "pÅ™ebít nastavení Äasového limitu pro dirmngr"
msgid "automatically retrieve keys when verifying signatures"
msgstr "automaticky získávat klíÄe pÅ™i ověřování podpisů"
@@ -4254,19 +4216,19 @@ msgstr "neplatný protokol serveru klíÄů (naÅ¡e %d!=obsluha %d)\n"
msgid "\"%s\" not a key ID: skipping\n"
msgstr "„%s“ není ID klíÄe: pÅ™eskoÄeno\n"
-#, c-format
-msgid "refreshing 1 key from %s\n"
-msgstr "aktualizuji 1 klÃ­Ä z %s\n"
+#, fuzzy, c-format
+#| msgid "refreshing %d keys from %s\n"
+msgid "refreshing %d key from %s\n"
+msgid_plural "refreshing %d keys from %s\n"
+msgstr[0] "aktualizuji %d klíÄů z %s\n"
+msgstr[1] "aktualizuji %d klíÄů z %s\n"
+msgstr[2] "aktualizuji %d klíÄů z %s\n"
#, c-format
msgid "WARNING: unable to refresh key %s via %s: %s\n"
msgstr "VAROVÃNÃ: nelze aktualizovat klÃ­Ä %s prostÅ™ednictvím %s: %s\n"
#, c-format
-msgid "refreshing %d keys from %s\n"
-msgstr "aktualizuji %d klíÄů z %s\n"
-
-#, c-format
msgid "key \"%s\" not found on keyserver\n"
msgstr "klÃ­Ä â€ž%s“ nebyl na serveru klíÄů nalezen\n"
@@ -4284,9 +4246,10 @@ msgstr "požaduji klÃ­Ä %s ze %s server %s\n"
msgid "requesting key %s from %s\n"
msgstr "požaduji klÃ­Ä %s z %s\n"
-#, c-format
-msgid "sending key %s to %s server %s\n"
-msgstr "posílám klÃ­Ä %s na %s server %s\n"
+#, fuzzy
+#| msgid "no keyserver action!\n"
+msgid "no keyserver known\n"
+msgstr "žádná operace se serverem klíÄů!\n"
#, c-format
msgid "sending key %s to %s\n"
@@ -4453,7 +4416,7 @@ msgstr ", algoritmus klíÄe"
#, c-format
msgid "WARNING: not a detached signature; file '%s' was NOT verified!\n"
-msgstr ""
+msgstr "POZOR: nejedná se o oddělený podpis. Soubor „%s“ NEBYL ověřen!\n"
#, c-format
msgid "Can't check signature: %s\n"
@@ -4504,6 +4467,19 @@ msgstr "VAROVÃNÃ: vyžádaný algoritmus %s není doporuÄen\n"
msgid "Note: signatures using the %s algorithm are rejected\n"
msgstr "Poznámka: podpisy používající algoritmus %s jsou zamítány\n"
+#, fuzzy, c-format
+#| msgid "%s:%u: read error: %s\n"
+msgid "(reported error: %s)\n"
+msgstr "%s:%u: chyba Ätení: %s\n"
+
+#, fuzzy, c-format
+#| msgid "read error in '%s': %s\n"
+msgid "(reported error: %s <%s>)\n"
+msgstr "chyba pÅ™i Ätení v „%s“: %s\n"
+
+msgid "(further info: "
+msgstr ""
+
#, c-format
msgid "%s:%d: deprecated option \"%s\"\n"
msgstr "%s:%d: použití parametru „%s“ se nedoporuÄuje\n"
@@ -4553,10 +4529,9 @@ msgstr ""
"U veÅ™ejného klíÄe ECDSA se oÄekává, že v kódování SEC bude délka násobkem 8 "
"bitů\n"
-#, fuzzy, c-format
-#| msgid "Unknown signature type '%s'\n"
+#, c-format
msgid "unknown weak digest '%s'\n"
-msgstr "Neznámý typ podpisu „%s“\n"
+msgstr "neznámý slabý hashovací algoritmus „%s“\n"
#, c-format
msgid "File '%s' exists. "
@@ -4893,6 +4868,19 @@ msgstr "%s: pÅ™eskoÄeno: veÅ™ejný klÃ­Ä je neplatný (disabled)\n"
msgid "%s: skipped: public key already present\n"
msgstr "%s: pÅ™eskoÄeno: veÅ™ejný klÃ­Ä je již obsažen v databázi\n"
+#, fuzzy, c-format
+#| msgid "can't connect to '%s': %s\n"
+msgid "can't encrypt to '%s'\n"
+msgstr "nelze se připojit k „%s“: %s\n"
+
+#, c-format
+msgid "option '%s' given, but no valid default keys given\n"
+msgstr "zadána volba „%s“, ale nezadány žádné platné výchozí klíÄe\n"
+
+#, c-format
+msgid "option '%s' given, but option '%s' not given\n"
+msgstr "zadána volba „%s“, ale chybí volba „%s“\n"
+
msgid "You did not specify a user ID. (you may use \"-r\")\n"
msgstr ""
"Nespecifikoval jste identifikátor uživatele (user ID). Můžete použít \"-r\"\n"
@@ -4938,10 +4926,6 @@ msgid "data not saved; use option \"--output\" to save it\n"
msgstr ""
"data nebyla uložena; k jejich uložení použijte parametr příkazu „--output“\n"
-#, c-format
-msgid "error creating '%s': %s\n"
-msgstr "chyba při vytváření „%s“: %s\n"
-
msgid "Detached signature.\n"
msgstr "Podpis oddělený od dokumentu.\n"
@@ -5001,10 +4985,8 @@ msgstr "Revokován:\n"
msgid "(This is a sensitive revocation key)\n"
msgstr "(Toto je citlivý revokaÄní klíÄ)\n"
-#, fuzzy
-#| msgid "Secret key is available.\n"
msgid "Secret key is not available.\n"
-msgstr "Tajný klÃ­Ä je dostupný.\n"
+msgstr "Tajný klÃ­Ä není dostupný.\n"
msgid "Create a designated revocation certificate for this key? (y/N) "
msgstr "VytvoÅ™it pro tento klÃ­Ä pověřený revokaÄní certifikát? (a/N)"
@@ -5027,35 +5009,61 @@ msgid "This is a revocation certificate for the OpenPGP key:"
msgstr "Toto je revokaÄní certifikát pro OpenPGP klíÄ:"
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 ""
+
+#, fuzzy
+#| msgid ""
+#| "Use it to revoke this key in case of a compromise or loss of\n"
+#| "the secret key. However, if the secret key is still accessible,\n"
+#| "it is better to generate a new revocation certificate and give\n"
+#| "a reason for the revocation."
+msgid ""
"Use it to revoke this key in case of a compromise or loss of\n"
"the secret key. However, if the secret key is still accessible,\n"
"it is better to generate a new revocation certificate and give\n"
-"a reason for the revocation."
+"a reason for the revocation. For details see the description of\n"
+"of the gpg command \"--gen-revoke\" in the GnuPG manual."
msgstr ""
"Použijte jej pro odvolání tohoto klíÄe v případÄ› zneužití nebo ztráty\n"
"soukromého klíÄe. AvÅ¡ak bude-li soukromý klÃ­Ä stále přístupný, bude\n"
"lepší vytvoÅ™it nový revokaÄní certifikát s vysvÄ›tlením odvolání."
+#, fuzzy
+#| 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 making use of this revocation certificate."
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 making use of this revocation certificate."
+"before importing and publishing this revocation certificate."
msgstr ""
"Aby se zabránilo nechtÄ›nému použití tohoto souboru, pÅ™ed 5 pomlÄek byla\n"
"vložena dvojteÄka. PÅ™ed použitím tohoto revokaÄního certifikátu odstraňte\n"
"tuto dvojteÄku textovým editorem."
#, fuzzy, c-format
-#| msgid "secret key \"%s\" not found: %s\n"
+#| msgid "Revocation certificate created.\n"
+msgid "revocation certificate stored as '%s.rev'\n"
+msgstr "RevokaÄní certifikát vytvoÅ™en.\n"
+
+#, c-format
msgid "secret key \"%s\" not found\n"
-msgstr "tajný klÃ­Ä â€ž%s“ nenalezen: %s\n"
+msgstr "tajný klÃ­Ä â€ž%s“ nenalezen\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“ odpovídá více tajným klíÄům:\n"
+
+#, c-format
+msgid "error searching the keyring: %s\n"
+msgstr "chyba pÅ™i prohledávání souboru klíÄů (keyring): %s\n"
msgid "Create a revocation certificate for this key? (y/N) "
msgstr "VytvoÅ™it pro tento klÃ­Ä revokaÄní certifikát? (a/N) "
@@ -5133,25 +5141,52 @@ msgstr "více informací naleznete na adrese %s\n"
msgid "WARNING: signing subkey %s has an invalid cross-certification\n"
msgstr "VAROVÃNÃ: podepisovací podklÃ­Ä %s má neplatnou křížovou certifikaci\n"
-#, c-format
+#, fuzzy, c-format
+#| msgid "public key %s is %lu second newer than the signature\n"
msgid "public key %s is %lu second newer than the signature\n"
-msgstr "veÅ™ejný klÃ­Ä %s je o %lu sekund novÄ›jší než podpis\n"
+msgid_plural "public key %s is %lu seconds newer than the signature\n"
+msgstr[0] "veÅ™ejný klÃ­Ä %s je o %lu sekund novÄ›jší než podpis\n"
+msgstr[1] "veÅ™ejný klÃ­Ä %s je o %lu sekund novÄ›jší než podpis\n"
+msgstr[2] "veÅ™ejný klÃ­Ä %s je o %lu sekund novÄ›jší než podpis\n"
-#, c-format
-msgid "public key %s is %lu seconds newer than the signature\n"
-msgstr "veÅ™ejný klÃ­Ä %s je o %lu sekund novÄ›jší než podpis\n"
+#, fuzzy, c-format
+#| msgid "public key %s is %lu second newer than the signature\n"
+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] "veÅ™ejný klÃ­Ä %s je o %lu sekund novÄ›jší než podpis\n"
+msgstr[1] "veÅ™ejný klÃ­Ä %s je o %lu sekund novÄ›jší než podpis\n"
+msgstr[2] "veÅ™ejný klÃ­Ä %s je o %lu sekund novÄ›jší než podpis\n"
-#, c-format
+#, fuzzy, c-format
+#| msgid ""
+#| "key %s was created %lu second in the future (time warp or clock problem)\n"
msgid ""
"key %s was created %lu second in the future (time warp or clock problem)\n"
-msgstr ""
+msgid_plural ""
+"key %s was created %lu seconds in the future (time warp or clock problem)\n"
+msgstr[0] ""
+"klÃ­Ä %s byl vytvoÅ™en %lu sekund v budoucnosti (doÅ¡lo ke zmÄ›nÄ› Äasu nebo\n"
+"je problém se systémovým Äasem)\n"
+msgstr[1] ""
+"klÃ­Ä %s byl vytvoÅ™en %lu sekund v budoucnosti (doÅ¡lo ke zmÄ›nÄ› Äasu nebo\n"
+"je problém se systémovým Äasem)\n"
+msgstr[2] ""
"klÃ­Ä %s byl vytvoÅ™en %lu sekund v budoucnosti (doÅ¡lo ke zmÄ›nÄ› Äasu nebo\n"
"je problém se systémovým Äasem)\n"
-#, c-format
-msgid ""
-"key %s was created %lu seconds in the future (time warp or clock problem)\n"
-msgstr ""
+#, fuzzy, c-format
+#| msgid ""
+#| "key %s was created %lu second in the future (time warp or clock problem)\n"
+msgid "key %s was created %lu day in the future (time warp or clock problem)\n"
+msgid_plural ""
+"key %s was created %lu days in the future (time warp or clock problem)\n"
+msgstr[0] ""
+"klÃ­Ä %s byl vytvoÅ™en %lu sekund v budoucnosti (doÅ¡lo ke zmÄ›nÄ› Äasu nebo\n"
+"je problém se systémovým Äasem)\n"
+msgstr[1] ""
+"klÃ­Ä %s byl vytvoÅ™en %lu sekund v budoucnosti (doÅ¡lo ke zmÄ›nÄ› Äasu nebo\n"
+"je problém se systémovým Äasem)\n"
+msgstr[2] ""
"klÃ­Ä %s byl vytvoÅ™en %lu sekund v budoucnosti (doÅ¡lo ke zmÄ›nÄ› Äasu nebo\n"
"je problém se systémovým Äasem)\n"
@@ -5382,6 +5417,260 @@ msgstr "nemohu pracovat s řádky delšími než %d znaků\n"
msgid "input line longer than %d characters\n"
msgstr "vstupní řádek je delší než %d znaků\n"
+#, fuzzy, c-format
+#| msgid "error sending standard options: %s\n"
+msgid "error beginning transaction on TOFU database: %s\n"
+msgstr "chyba při odesílání standardního parametru: %s\n"
+
+#, c-format
+msgid "error committing transaction on TOFU database: %s\n"
+msgstr ""
+
+#, c-format
+msgid "error rolling back transaction on TOFU database: %s\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "unsupported algorithm: %s"
+msgid "unsupported TOFU database version: %s\n"
+msgstr "nepodporovaný algoritmus: %s"
+
+#, fuzzy, c-format
+#| msgid "error sending data: %s\n"
+msgid "error reading TOFU database: %s\n"
+msgstr "chyba při odesílání dat: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error writing base64 encoding: %s\n"
+msgid "error determining TOFU database's version: %s\n"
+msgstr "chyba při zápisu kódování base64: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error initializing reader object: %s\n"
+msgid "error initializing TOFU database: %s\n"
+msgstr "chyba pÅ™i inicializaci Ätecího objektu: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error opening '%s': %s\n"
+msgid "error opening TOFU database '%s': %s\n"
+msgstr "chyba při otevírání „%s“: %s\n"
+
+msgid "Warning: Home directory contains both tofu.db and tofu.d.\n"
+msgstr ""
+
+msgid "Using split format for TOFU database\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "error sending data: %s\n"
+msgid "error updating TOFU database: %s\n"
+msgstr "chyba při odesílání dat: %s\n"
+
+#, c-format
+msgid "public key %s not found: %s\n"
+msgstr "veÅ™ejný klÃ­Ä %s nebyl nalezen: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error setting OCSP target: %s\n"
+msgid "error setting TOFU binding's trust level to %s\n"
+msgstr "chyba při nastavování cíle OCSP: %s\n"
+
+#, c-format
+msgid "The binding %s is NOT known."
+msgstr ""
+
+#, c-format
+msgid ""
+"The key %s raised a conflict with this binding (%s). Since this binding's "
+"policy was 'auto', it was changed to 'ask'."
+msgstr ""
+
+#, c-format
+msgid ""
+"Please indicate whether you believe the binding %s%sis legitimate (the key "
+"belongs to the stated owner) or a forgery (bad)."
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "error getting responder ID: %s\n"
+msgid "error gathering other user IDs: %s\n"
+msgstr "chyba pÅ™i zjiÅ¡Å¥ování ID odpovídaÄe: %s\n"
+
+msgid "Known user IDs associated with this key:\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "validity: %s"
+msgid "policy: %s"
+msgstr "platnost: %s"
+
+#, fuzzy, c-format
+#| msgid "error getting stored flags: %s\n"
+msgid "error gathering signature stats: %s\n"
+msgstr "chyba při získání uložených příznaků: %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] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, c-format
+msgid "Statistics for keys with the email address \"%s\":\n"
+msgstr ""
+
+#, fuzzy
+#| msgid "list keys"
+msgid "this key"
+msgstr "vypsat seznam klíÄů"
+
+#, c-format
+msgid "%ld message signed in the future."
+msgid_plural "%ld messages signed in the future."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, fuzzy, c-format
+#| msgid "print message digests"
+msgid "%ld message signed"
+msgid_plural "%ld messages signed"
+msgstr[0] "vypsat hash zprávy"
+msgstr[1] "vypsat hash zprávy"
+msgstr[2] "vypsat hash zprávy"
+
+#, c-format
+msgid " over the past %ld day."
+msgid_plural " over the past %ld days."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, c-format
+msgid " over the past %ld week."
+msgid_plural " over the past %ld weeks."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, c-format
+msgid " over the past %ld month."
+msgid_plural " over the past %ld months."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#. 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 ""
+
+#. 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 ""
+
+msgid "(G)ood, (A)ccept once, (U)nknown, (R)eject once, (B)ad? "
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "error creating a pipe: %s\n"
+msgid "error changing TOFU policy: %s\n"
+msgstr "chyba při vytváření roury: %s\n"
+
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, c-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, c-format
+msgid "Have never verified a message signed by key %s!\n"
+msgstr ""
+
+#, c-format
+msgid "Failed to collect signature statistics for \"%s\" (key %s)\n"
+msgstr ""
+
+#, c-format
+msgid "Verified 0 messages signed by \"%s\" (key: %s, policy: %s)."
+msgstr ""
+
+#. TRANSLATORS: The final %s is replaced by a string like
+#. "7 months, 1 day, 5 minutes, 0 seconds".
+#, c-format
+msgid ""
+"Verified %ld message signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgid_plural ""
+"Verified %ld messages signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, c-format
+msgid "The most recent message was verified %s ago."
+msgstr ""
+
+msgid "Warning: we've have yet to see a message signed by this key!\n"
+msgstr ""
+
+msgid "Warning: we've only seen a single message signed by this key!\n"
+msgstr ""
+
+#. TRANSLATORS: translate the below text. We don't
+#. directly internationalize that text so that we can
+#. tweak it without breaking translations.
+#, c-format
+msgid "TOFU: few signatures %d message %s"
+msgid_plural "TOFU: few signatures %d messages %s"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, fuzzy, c-format
+#| msgid "error sending data: %s\n"
+msgid "error opening TOFU database: %s\n"
+msgstr "chyba při odesílání dat: %s\n"
+
#, c-format
msgid "'%s' is not a valid long keyID\n"
msgstr "„%s“ není platný dlouhý keyID\n"
@@ -5440,19 +5729,27 @@ msgstr "není nutné kontrolovat databázi důvěry s modelem „%s“\n"
msgid "no need for a trustdb update with '%s' trust model\n"
msgstr "není nutné aktualizovat databázi důvěry s modelem „%s“\n"
-#, c-format
-msgid "public key %s not found: %s\n"
-msgstr "veÅ™ejný klÃ­Ä %s nebyl nalezen: %s\n"
-
msgid "please do a --check-trustdb\n"
msgstr "prosím proveÄte --check-trustdb\n"
msgid "checking the trustdb\n"
msgstr "kontroluji databázi důvěry\n"
-#, c-format
-msgid "%d keys processed (%d validity counts cleared)\n"
-msgstr "zpracováno %d klíÄů (%d validit vymazáno)\n"
+#, fuzzy, c-format
+#| msgid "%lu keys processed so far\n"
+msgid "%d key processed"
+msgid_plural "%d keys processed"
+msgstr[0] "%lu klíÄe byly doposud zpracovány\n"
+msgstr[1] "%lu klíÄe byly doposud zpracovány\n"
+msgstr[2] "%lu klíÄe byly doposud zpracovány\n"
+
+#, fuzzy, c-format
+#| msgid "%d keys processed (%d validity counts cleared)\n"
+msgid " (%d validity count cleared)\n"
+msgid_plural " (%d validity counts cleared)\n"
+msgstr[0] "zpracováno %d klíÄů (%d validit vymazáno)\n"
+msgstr[1] "zpracováno %d klíÄů (%d validit vymazáno)\n"
+msgstr[2] "zpracováno %d klíÄů (%d validit vymazáno)\n"
msgid "no ultimately trusted keys found\n"
msgstr "žádný absolutnÄ› důvÄ›ryhodný klÃ­Ä nebyl nalezen\n"
@@ -5462,10 +5759,6 @@ msgid "public key of ultimately trusted key %s not found\n"
msgstr "veÅ™ejný klÃ­Ä k absolutnÄ› důvÄ›ryhodnému klíÄi %s nebyl nalezen\n"
#, c-format
-msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
-msgstr "požadováno %d ÄásteÄné důvÄ›ry a %d úplné důvÄ›ry, model %s\n"
-
-#, c-format
msgid ""
"depth: %d valid: %3d signed: %3d trust: %d-, %dq, %dn, %dm, %df, %du\n"
msgstr ""
@@ -5499,11 +5792,8 @@ msgstr "absolutní"
#. It gets passed to atoi() so everything after the number is
#. essentially a comment and need not be translated. Either key and
#. uid are both NULL, or neither are NULL.
-#, fuzzy
-#| msgid "10 translator see trustdb.c:uid_trust_string_fixed"
msgid "10 translator see trust.c:uid_trust_string_fixed"
-msgstr ""
-"14 fixní délka na kterou se překládá see trustdb.c:uid_trust_string_fixed"
+msgstr "14 překladateli, podívej se na trustdb.c:uid_trust_string_fixed"
msgid "[ revoked]"
msgstr "[ revokován ]"
@@ -5670,9 +5960,16 @@ msgstr "chyba při získání CHV z karty\n"
msgid "card is permanently locked!\n"
msgstr "karta je trvale uzamÄena!\n"
-#, c-format
-msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
-msgstr ""
+#, fuzzy, c-format
+#| msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
+msgid "%d Admin PIN attempt remaining before card is permanently locked\n"
+msgid_plural ""
+"%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr[0] ""
+"Do trvalého uzamÄení karty zůstává %d pokusů o zadání PINu administrátora\n"
+msgstr[1] ""
+"Do trvalého uzamÄení karty zůstává %d pokusů o zadání PINu administrátora\n"
+msgstr[2] ""
"Do trvalého uzamÄení karty zůstává %d pokusů o zadání PINu administrátora\n"
#. TRANSLATORS: Do not translate the "|A|" prefix but keep it at
@@ -5741,10 +6038,8 @@ msgstr "schází RSA prime %s nebo nemá velikost %d bitů\n"
msgid "failed to store the key: %s\n"
msgstr "nelze uložit klíÄ: %s\n"
-#, fuzzy
-#| msgid "unsupported URI"
msgid "unsupported curve\n"
-msgstr "toto URI není podporováno"
+msgstr "nepodporovaná křivka\n"
msgid "please wait while key is being generated ...\n"
msgstr "prosím poÄkejte než bude klÃ­Ä vygenerován…\n"
@@ -5752,9 +6047,13 @@ msgstr "prosím poÄkejte než bude klÃ­Ä vygenerován…\n"
msgid "generating key failed\n"
msgstr "generování klíÄe se nezdaÅ™ilo\n"
-#, c-format
-msgid "key generation completed (%d seconds)\n"
-msgstr "generování klíÄe dokonÄeno (%d sekund)\n"
+#, fuzzy, c-format
+#| msgid "key generation completed (%d seconds)\n"
+msgid "key generation completed (%d second)\n"
+msgid_plural "key generation completed (%d seconds)\n"
+msgstr[0] "generování klíÄe dokonÄeno (%d sekund)\n"
+msgstr[1] "generování klíÄe dokonÄeno (%d sekund)\n"
+msgstr[2] "generování klíÄe dokonÄeno (%d sekund)\n"
msgid "invalid structure of OpenPGP card (DO 0x93)\n"
msgstr "neplatná struktura OpenPGP karty (DO 0x93)\n"
@@ -5846,10 +6145,8 @@ msgstr "obsluha pro deskriptor %d ukonÄena\n"
msgid "invalid radix64 character %02x skipped\n"
msgstr "neplatný radix64 znak %02x byl pÅ™eskoÄen\n"
-#, fuzzy
-#| msgid "no gpg-agent running in this session\n"
msgid "no dirmngr running in this session\n"
-msgstr "v této relaci neběží žádný gpg-agent\n"
+msgstr "v této relaci neběží žádný dirmngr\n"
#, c-format
msgid "validation model requested by certificate: %s"
@@ -7066,10 +7363,8 @@ msgid "error retrieving '%s': http status %u\n"
msgstr "chyba při získávání „%s“: status HTTP je %u\n"
# Poslední argument je název protokolu
-#, fuzzy
-#| msgid "CRL access not possible due to disabled %s\n"
msgid "CRL access not possible due to Tor mode\n"
-msgstr "Přístup k CRL není možný kvůli vypnutému %s\n"
+msgstr "Přístup k CRL není možný kvůli režimu Tor\n"
#, c-format
msgid "certificate search not possible due to disabled %s\n"
@@ -7257,7 +7552,7 @@ msgid "|FILE|use the CA certificates in FILE for HKP over TLS"
msgstr "|SOUBOR|pro HKP přes TLS použije certifikáty CA ze SOUBORU"
msgid "route all network traffic via Tor"
-msgstr ""
+msgstr "směrovat veškerý síťový provoz skrz Tor"
msgid ""
"@\n"
@@ -7550,10 +7845,8 @@ msgstr "chyba pÅ™i Ätení z odpovídaÄe: %s\n"
msgid "response from server too large; limit is %d bytes\n"
msgstr "odpovÄ›Ä serveru je příliÅ¡ velká, limit je %d bajtů\n"
-#, fuzzy
-#| msgid "OCSP request not possible due to disabled HTTP\n"
msgid "OCSP request not possible due to Tor mode\n"
-msgstr "OCSP dotaz není možný, protože HTTP je zakázáno\n"
+msgstr "OCSP dotaz není možný kvůli režimu Tor\n"
msgid "OCSP request not possible due to disabled HTTP\n"
msgstr "OCSP dotaz není možný, protože HTTP je zakázáno\n"
@@ -7869,6 +8162,11 @@ msgstr "|N|omezit platnost hesla na N dnů"
msgid "do not allow the reuse of old passphrases"
msgstr "nedovolit opakovat stará hesla"
+#, fuzzy
+#| msgid "|N|set LDAP timeout to N seconds"
+msgid "|N|set the Pinentry timeout to N seconds"
+msgstr "|N|nastaví Äasový limit pro LDAP na N sekund"
+
msgid "|NAME|use NAME as default secret key"
msgstr "|NÃZEV|použít NÃZEV jako implicitní tajný klíÄ"
@@ -7905,10 +8203,8 @@ msgstr "Volby ovlivňující podobu výstupu"
msgid "Options controlling the interactivity and enforcement"
msgstr "Volby ovlivňující interaktivitu a vymáhání"
-#, fuzzy
-#| msgid "Options controlling the security"
msgid "Options controlling the use of Tor"
-msgstr "Volby ovlivňující bezpeÄnost"
+msgstr "Volby ovlivňující použití Toru"
msgid "Configuration for HTTP servers"
msgstr "Nastavení HTTP serverů"
@@ -7938,7 +8234,7 @@ msgid "GPG for S/MIME"
msgstr "GPG pro S/MIME"
msgid "Key Acquirer"
-msgstr ""
+msgstr "StahovaÄ klíÄů"
msgid "PIN and Passphrase Entry"
msgstr "Zadávání kódu PIN a hesla"
@@ -8158,61 +8454,109 @@ msgstr ""
"Syntaxe: gpg-check-pattern [volby] soubor_se_vzorem\n"
"Prověří heslo zadané na vstupu proti souboru se vzory\n"
-#~ msgid "cleared passphrase cached with ID: %s\n"
-#~ msgstr "vymazané heslo zapamatované pro ID: %s\n"
+#~ msgid "key specification '%s' is ambiguous\n"
+#~ msgstr "výbÄ›r klíÄe pomocí „%s“ není jednoznaÄné\n"
-#, fuzzy
-#~| msgid "can't open the keyring"
-#~ msgid "Failed to open the keyring DB.\n"
-#~ msgstr "nemohu otevřít soubor klíÄů"
+#~ msgid "'%s' matches at least:\n"
+#~ msgstr "„%s“ odpovídá přinejmenším:\n"
-#, fuzzy
-#~| msgid "failed to open '%s': %s\n"
-#~ msgid "Failed to parse '%s'.\n"
-#~ msgstr "„%s“ nebylo možné otevřít: %s\n"
+#~ msgid "%d signatures not checked due to missing keys\n"
+#~ msgstr "%d podpisů neověřených, protože chybí klíÄ\n"
-#, fuzzy
-#~| msgid "invalid value\n"
-#~ msgid "invalid value '%s'\n"
-#~ msgstr "neplatná hodnota\n"
+#~ msgid "%d signatures not checked due to errors\n"
+#~ msgstr "%d podpisů neověřených, protože vznikly chyby\n"
-#, fuzzy
-#~| msgid "error reading secret keyblock \"%s\": %s\n"
-#~ msgid "error looking up secret key \"%s\": %s\n"
-#~ msgstr "chyba pÅ™i Ätení bloku tajného klíÄe „%s“: %s\n"
+#~ msgid "1 user ID without valid self-signature detected\n"
+#~ msgstr "objeven 1 identifikátor uživatele bez platného podpisu jím samým\n"
-#~ msgid "Please select at most one subkey.\n"
-#~ msgstr "Prosím, vyberte nejvýše jeden podklíÄ.\n"
+#~ msgid "Deleted %d signatures.\n"
+#~ msgstr "Smazáno %d podpisů.\n"
-#~ msgid "apparently no running dirmngr\n"
-#~ msgstr "dirmngr zjevně neběží\n"
+#~ msgid "User ID \"%s\": %d signatures removed\n"
+#~ msgstr "Uživatelské ID „%s“: %d podpisů odstraněno\n"
-#~ msgid "no running dirmngr - starting one\n"
-#~ msgstr "žádný dirmngr neběží – jeden bude spuštěn\n"
+#~ msgid ""
+#~ "You need a Passphrase to protect your secret key.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Pro ochranu VaÅ¡eho tajného klíÄe musíte zadat heslo.\n"
+#~ "\n"
-#~ msgid "malformed %s environment variable\n"
-#~ msgstr "špatně utvořená proměnná prostředí %s\n"
+#~ msgid ""
+#~ "Please enter a passphrase to protect the off-card backup of the new "
+#~ "encryption key."
+#~ msgstr ""
+#~ "Prosím, zadejte heslo, kterým ochráníte zálohu mimo kartu nového "
+#~ "Å¡ifrovacího klíÄe."
-#~ msgid "dirmngr protocol version %d is not supported\n"
-#~ msgstr "verze %d protokolu dirmngr není podporována\n"
+#~ msgid "passphrase not correctly repeated; try again"
+#~ msgstr "heslo není zopakováno správně; zkuste to znovu"
-#~ msgid "can't connect to the dirmngr - trying fall back\n"
-#~ msgstr "k dirmngr se nelze připojit – zkusí se náhradní postup\n"
+#~ msgid "%s.\n"
+#~ msgstr "%s.\n"
+
+#~ msgid ""
+#~ "You don't want a passphrase - this is probably a *bad* idea!\n"
+#~ "I will do it anyway. You can change your passphrase at any time,\n"
+#~ "using this program with the option \"--edit-key\".\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Nechcete heslo – to *není* dobrý nápad!\n"
+#~ "DobÅ™e, budu pokraÄovat bez hesla. Kdykoliv můžete heslo zmÄ›nit použitím\n"
+#~ "tohoto programu s parametrem „--edit-key“.\n"
+#~ "\n"
+
+#~ msgid "storing key onto card failed: %s\n"
+#~ msgstr "uložení klíÄe na kartu se nezdaÅ™ilo: %s\n"
+
+#~ msgid "1 good signature\n"
+#~ msgstr "1 dobrý podpis\n"
+
+#~ msgid "renaming '%s' to '%s' failed: %s\n"
+#~ msgstr "přejmenování „%s“ na „%s“ se nezdařilo: %s\n"
+
+#~ msgid "%lu keys cached (%lu signatures)\n"
+#~ msgstr "%lu klíÄů uloženo v keÅ¡i (%lu podpisů)\n"
+
+#~ msgid "refreshing 1 key from %s\n"
+#~ msgstr "aktualizuji 1 klÃ­Ä z %s\n"
+
+#~ msgid "sending key %s to %s server %s\n"
+#~ msgstr "posílám klÃ­Ä %s na %s server %s\n"
+
+#~ msgid "public key %s is %lu seconds newer than the signature\n"
+#~ msgstr "veÅ™ejný klÃ­Ä %s je o %lu sekund novÄ›jší než podpis\n"
+
+#~ msgid ""
+#~ "key %s was created %lu seconds in the future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "klÃ­Ä %s byl vytvoÅ™en %lu sekund v budoucnosti (doÅ¡lo ke zmÄ›nÄ› Äasu nebo\n"
+#~ "je problém se systémovým Äasem)\n"
+
+#~ msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
+#~ msgstr "požadováno %d ÄásteÄné důvÄ›ry a %d úplné důvÄ›ry, model %s\n"
+
+#~ msgid "Passphrase"
+#~ msgstr "Heslo"
+
+#~ msgid "name of socket too long\n"
+#~ msgstr "název socketu je příliš dlouhý\n"
+
+#~ msgid "gpg-agent is not available in this session\n"
+#~ msgstr "gpg-agent není v tomto sezení dostupný\n"
#~ msgid "export keys in an S-expression based format"
#~ msgstr "exportovat klíÄe ve formátu postaveném na S-výrazech"
-#~ msgid "Directory Manager"
-#~ msgstr "Správce adresářů"
-
#~ msgid "toggle between the secret and public key listings"
#~ msgstr "pÅ™epnout mezi výpisem seznamu tajných a veÅ™ejných klíÄů"
#~ msgid "Please use the command \"toggle\" first.\n"
#~ msgstr "Prosím, nejdříve použijte příkaz „toggle“ (přepnout).\n"
-#~ msgid "Passphrase"
-#~ msgstr "Heslo"
+#~ msgid "Please select at most one subkey.\n"
+#~ msgstr "Prosím, vyberte nejvýše jeden podklíÄ.\n"
#~ msgid "use temporary files to pass data to keyserver helpers"
#~ msgstr "používat doÄasné soubory na pÅ™enos dat k modulům pro servery klíÄů"
@@ -8224,15 +8568,30 @@ msgstr ""
#~ msgstr ""
#~ "VAROVÃNÃ: volba „%s“ pro server klíÄů není na této platformÄ› úÄinná\n"
-#~ msgid "name of socket too long\n"
-#~ msgstr "název socketu je příliš dlouhý\n"
-
-#~ msgid "gpg-agent is not available in this session\n"
-#~ msgstr "gpg-agent není v tomto sezení dostupný\n"
+#~ msgid "cleared passphrase cached with ID: %s\n"
+#~ msgstr "vymazané heslo zapamatované pro ID: %s\n"
#~ msgid "invalid root packet detected in proc_tree()\n"
#~ msgstr "nalezen neplatný kořenový paket v proc_tree()\n"
+#~ msgid "apparently no running dirmngr\n"
+#~ msgstr "dirmngr zjevně neběží\n"
+
+#~ msgid "no running dirmngr - starting one\n"
+#~ msgstr "žádný dirmngr neběží – jeden bude spuštěn\n"
+
+#~ msgid "malformed %s environment variable\n"
+#~ msgstr "špatně utvořená proměnná prostředí %s\n"
+
+#~ msgid "dirmngr protocol version %d is not supported\n"
+#~ msgstr "verze %d protokolu dirmngr není podporována\n"
+
+#~ msgid "can't connect to the dirmngr - trying fall back\n"
+#~ msgstr "k dirmngr se nelze připojit – zkusí se náhradní postup\n"
+
+#~ msgid "Directory Manager"
+#~ msgstr "Správce adresářů"
+
#~ msgid "error creating socket: %s\n"
#~ msgstr "chyba při vytváření socketu: %s\n"
@@ -8751,6 +9110,9 @@ msgstr ""
#~ msgid "Do you really want to do this? (y/N) "
#~ msgstr "Opravdu to chcete udělat? (a/N) "
+#~ msgid "error reading secret keyblock \"%s\": %s\n"
+#~ msgstr "chyba pÅ™i Ätení bloku tajného klíÄe „%s“: %s\n"
+
#~ msgid "update secret failed: %s\n"
#~ msgstr "aktualizace tajného klíÄe selhala: %s\n"
@@ -8796,9 +9158,6 @@ msgstr ""
#~ msgid "searching for \"%s\" from %s\n"
#~ msgstr "vyhledávám „%s“ na serveru %s\n"
-#~ msgid "no keyserver action!\n"
-#~ msgstr "žádná operace se serverem klíÄů!\n"
-
#~ msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n"
#~ msgstr "VAROVÃNÃ: obsluha serveru klíÄů z jiné verze GnuPG (%s)\n"
@@ -8922,16 +9281,6 @@ msgstr ""
#~ msgid "the trustdb is corrupted; please run \"gpg --fix-trustdb\".\n"
#~ msgstr "databáze důvěry je poškozena; prosím spusťte „gpg --fix-trustdb“.\n"
-#~ msgid "Please report bugs to <gnupg-bugs@gnu.org>.\n"
-#~ msgstr ""
-#~ "Chyby oznamte (anglicky), prosím, na adresu <gnupg-bugs@gnu.org>.\n"
-#~ "PÅ™ipomínky k pÅ™ekladu (Äesky) <translations.cs@gnupg.cz>.\n"
-
-#~ msgid "Please report bugs to "
-#~ msgstr ""
-#~ "PÅ™ipomínky k pÅ™ekladu hlaste (Äesky) na <translations.cs@gnupg.cz>,\n"
-#~ "chyby v programu (anglicky) na "
-
#~ msgid "DSA keypair will have %u bits.\n"
#~ msgstr "Pár DSA klíÄů DSA dlouhý %u bitů.\n"
@@ -9405,6 +9754,9 @@ msgstr ""
#~ msgid "checksum error"
#~ msgstr "chyba kontrolního souÄtu"
+#~ msgid "can't open the keyring"
+#~ msgstr "nemohu otevřít soubor klíÄů"
+
#~ msgid "invalid packet"
#~ msgstr "neplatný paket"
@@ -9498,9 +9850,6 @@ msgstr ""
#~ msgid "ERROR: "
#~ msgstr "CHYBA: "
-#~ msgid "WARNING: "
-#~ msgstr "VAROVÃNÃ: "
-
#~ msgid "... this is a bug (%s:%d:%s)\n"
#~ msgstr "... toto je chyba v programu (%s:%d:%s)\n"
diff --git a/po/da.po b/po/da.po
index dc74dff..4e2680a 100644
--- a/po/da.po
+++ b/po/da.po
@@ -1277,6 +1277,20 @@ msgstr "kunne ikke proxy %s-forespørgsel til klient\n"
msgid "Enter passphrase: "
msgstr "Indtast adgangsfrase\n"
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "error getting version from '%s': %s\n"
+msgstr "fejl ved oprettelse af nøglering »%s«: %s\n"
+
+#, c-format
+msgid "server '%s' is older than us (%s < %s)"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "WARNING: %s overrides %s\n"
+msgid "WARNING: %s\n"
+msgstr "ADVARSEL: %s overskriver %s\n"
+
#, c-format
msgid "OpenPGP card not available: %s\n"
msgstr "OpenPGP-kort er ikke tilgængeligt: %s\n"
@@ -1773,6 +1787,11 @@ msgstr "fjern nøgledele der ikke kan bruges under eksport"
msgid "remove as much as possible from key during export"
msgstr "fjern så meget som muligt fra nøglen under eksport"
+#, fuzzy
+#| msgid "%s: skipped: %s\n"
+msgid " - skipped"
+msgstr "%s: udelod: %s\n"
+
msgid "exporting secret keys not allowed\n"
msgstr "eksport af hemmelige nøgler er ikke tilladt\n"
@@ -1784,18 +1803,37 @@ msgstr "nøgle %s: nøgle i PGP 2.x-stil - udeladt\n"
msgid "key %s: key material on-card - skipped\n"
msgstr "nøgle %s: nøglemateriale på kort - udeladt\n"
-#, fuzzy
-#| msgid "%s: skipped: %s\n"
-msgid " - skipped"
-msgstr "%s: udelod: %s\n"
-
msgid "WARNING: nothing exported\n"
msgstr "ADVARSEL: intet blev eksporteret\n"
+#, fuzzy, c-format
+#| msgid "error creating `%s': %s\n"
+msgid "error creating '%s': %s\n"
+msgstr "fejl ved oprettelse af »%s«: %s\n"
+
msgid "[User ID not found]"
msgstr "[Bruger-id blev ikke fundet]"
#, fuzzy, c-format
+#| msgid "missing argument for option \"%.50s\"\n"
+msgid "(check argument of option '%s')\n"
+msgstr "manglende parameter for indstilling »%.50s«\n"
+
+#, c-format
+msgid "Warning: '%s' should be a long key ID or a fingerprint\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "error closing %s: %s\n"
+msgid "error looking up: %s\n"
+msgstr "fejl ved lukning af %s: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "Warning: %s appears in the keyring %d times\n"
+msgstr "fejl ved oprettelse af nøglering »%s«: %s\n"
+
+#, fuzzy, c-format
#| msgid "automatically retrieved `%s' via %s\n"
msgid "automatically retrieved '%s' via %s\n"
msgstr "hentede automatisk »%s« via %s\n"
@@ -1813,16 +1851,20 @@ msgid "secret key \"%s\" not found: %s\n"
msgstr "hemmelig nøgle »%s« blev ikke fundet: %s\n"
#, fuzzy, c-format
-#| msgid "missing argument for option \"%.50s\"\n"
-msgid "(check argument of option '%s')\n"
-msgstr "manglende parameter for indstilling »%.50s«\n"
+#| msgid "|NAME|use NAME as default secret key"
+msgid "Warning: not using '%s' as default key: %s\n"
+msgstr "|NAME|brug NAVN som hemmelig standardnøgle"
#, fuzzy, c-format
#| msgid "|NAME|use NAME as default secret key"
-msgid "using \"%s\" as default secret key\n"
+msgid "using \"%s\" as default secret key for signing\n"
msgstr "|NAME|brug NAVN som hemmelig standardnøgle"
#, c-format
+msgid "all values passed to '%s' ignored\n"
+msgstr ""
+
+#, c-format
msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
msgstr "Ugyldig nøgle %s gjort gyldig med --allow-non-selfsigned-uid\n"
@@ -2191,29 +2233,6 @@ msgid "Note: old default options file '%s' ignored\n"
msgstr "BEMÆRK: Gammel standardfil for tilvalg »%s« blev ignoreret\n"
#, c-format
-msgid ""
-"Warning: value '%s' for option '%s' should be a long key ID or a "
-"fingerprint\n"
-msgstr ""
-
-#, fuzzy, c-format
-#| msgid "option \"%.50s\" is ambiguous\n"
-msgid "key specification '%s' is ambiguous\n"
-msgstr "tilvalg »%.50s« er tvetydigt\n"
-
-#. TRANSLATORS: The %s prints a key specification which
-#. for example has been given at the command line. Two
-#. lines with fingerprints are printed after this message.
-#, c-format
-msgid "'%s' matches at least:\n"
-msgstr ""
-
-#, fuzzy, c-format
-#| msgid "error creating keyring `%s': %s\n"
-msgid "error searching the keyring: %s\n"
-msgstr "fejl ved oprettelse af nøglering »%s«: %s\n"
-
-#, c-format
msgid "libgcrypt is too old (need %s, have %s)\n"
msgstr "libgcrypt er for gammel (kræver %s, har %s)\n"
@@ -2415,16 +2434,6 @@ msgid "WARNING: recipients (-r) given without using public key encryption\n"
msgstr ""
"ADVARSEL: modtagere (-r) angivet uden brug af offentlig nøglekryptering\n"
-#, fuzzy, c-format
-#| msgid "line %d: invalid algorithm\n"
-msgid "option '%s' given, but no valid default keys given\n"
-msgstr "linje %d: ugyldig algoritme\n"
-
-#, fuzzy, c-format
-#| msgid "line %d: invalid algorithm\n"
-msgid "option '%s' given, but option '%s' not given\n"
-msgstr "linje %d: ugyldig algoritme\n"
-
msgid "--store [filename]"
msgstr "--store [filnavn]"
@@ -2498,6 +2507,11 @@ msgstr "nøgleserver modtag mislykkedes: %s\n"
msgid "key export failed: %s\n"
msgstr "nøgleeksport mislykkedes: %s\n"
+#, fuzzy, c-format
+#| msgid "key export failed: %s\n"
+msgid "export as ssh key failed: %s\n"
+msgstr "nøgleeksport mislykkedes: %s\n"
+
#, c-format
msgid "keyserver search failed: %s\n"
msgstr "nøgleserver søg mislykkedes: %s\n"
@@ -2996,33 +3010,33 @@ msgstr "[tilbagekald]"
msgid "[self-signature]"
msgstr "[egenunderskrift]"
-msgid "1 bad signature\n"
-msgstr "1 ugyldig underskrift\n"
-
-#, c-format
-msgid "%d bad signatures\n"
-msgstr "%d ugyldige underskrifter\n"
-
-msgid "1 signature not checked due to a missing key\n"
-msgstr "1 underskrift er ikke kontrolleret på grund af en manglende nøgle\n"
-
-#, c-format
-msgid "%d signatures not checked due to missing keys\n"
-msgstr "%d underskrifter er ikke kontrolleret på grund af manglende nøgler\n"
-
-msgid "1 signature not checked due to an error\n"
-msgstr "1 underskrift er ikke kontrolleret på grund af en fejl\n"
+#, fuzzy, c-format
+#| msgid "%d bad signatures\n"
+msgid "%d bad signature\n"
+msgid_plural "%d bad signatures\n"
+msgstr[0] "%d ugyldige underskrifter\n"
+msgstr[1] "%d ugyldige underskrifter\n"
-#, c-format
-msgid "%d signatures not checked due to errors\n"
-msgstr "%d underskrifter er ikke kontrolleret på grund af fejl\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to a missing key\n"
+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 underskrift er ikke kontrolleret på grund af en manglende nøgle\n"
+msgstr[1] "1 underskrift er ikke kontrolleret på grund af en manglende nøgle\n"
-msgid "1 user ID without valid self-signature detected\n"
-msgstr "1 bruger-id uden gyldig egenunderskrift detekteret\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to an error\n"
+msgid "%d signature not checked due to an error\n"
+msgid_plural "%d signatures not checked due to errors\n"
+msgstr[0] "1 underskrift er ikke kontrolleret på grund af en fejl\n"
+msgstr[1] "1 underskrift er ikke kontrolleret på grund af en fejl\n"
-#, c-format
-msgid "%d user IDs without valid self-signatures detected\n"
-msgstr "%d bruger-id'er uden gyldige egenunderskrifter detekteret\n"
+#, fuzzy, c-format
+#| msgid "%d user IDs without valid self-signatures detected\n"
+msgid "%d user ID without valid self-signature detected\n"
+msgid_plural "%d user IDs without valid self-signatures detected\n"
+msgstr[0] "%d bruger-id'er uden gyldige egenunderskrifter detekteret\n"
+msgstr[1] "%d bruger-id'er uden gyldige egenunderskrifter detekteret\n"
msgid ""
"Please decide how far you trust this user to correctly verify other users' "
@@ -3633,13 +3647,12 @@ msgstr "Slet denne ukendte underskrift? (j/n/a)"
msgid "Really delete this self-signature? (y/N)"
msgstr "Virkelig slette denne egenunderskrift? (j/N)"
-#, c-format
+#, fuzzy, c-format
+#| msgid "Deleted %d signature.\n"
msgid "Deleted %d signature.\n"
-msgstr "Slettede %d underskrift.\n"
-
-#, c-format
-msgid "Deleted %d signatures.\n"
-msgstr "Slettede %d underskrifter.\n"
+msgid_plural "Deleted %d signatures.\n"
+msgstr[0] "Slettede %d underskrift.\n"
+msgstr[1] "Slettede %d underskrift.\n"
msgid "Nothing deleted.\n"
msgstr "Intet slettet.\n"
@@ -3651,13 +3664,12 @@ msgstr "ugyldig"
msgid "User ID \"%s\" compacted: %s\n"
msgstr "Bruger-id »%s« komprimeret: %s\n"
-#, c-format
+#, fuzzy, c-format
+#| msgid "User ID \"%s\": %d signature removed\n"
msgid "User ID \"%s\": %d signature removed\n"
-msgstr "Bruger-id »%s«: %d underskrift fjernet\n"
-
-#, c-format
-msgid "User ID \"%s\": %d signatures removed\n"
-msgstr "Bruger-id »%s«: %d underskrifter fjernet\n"
+msgid_plural "User ID \"%s\": %d signatures removed\n"
+msgstr[0] "Bruger-id »%s«: %d underskrift fjernet\n"
+msgstr[1] "Bruger-id »%s«: %d underskrift fjernet\n"
#, c-format
msgid "User ID \"%s\": already minimized\n"
@@ -4195,38 +4207,6 @@ msgid "Please correct the error first\n"
msgstr "Ret venligst fejlen først\n"
msgid ""
-"You need a Passphrase to protect your secret key.\n"
-"\n"
-msgstr ""
-"Du skal bruge en adgangsfrase til at beskytte din hemmelige nøgle.\n"
-"\n"
-
-msgid ""
-"Please enter a passphrase to protect the off-card backup of the new "
-"encryption key."
-msgstr ""
-"Indtast venligst en adgangsfrase til at beskytte sikkerhedskopien fortaget "
-"uden for kortet af den nye krypteringsnøgle."
-
-msgid "passphrase not correctly repeated; try again"
-msgstr "adgangsfrasen er ikke korrekt gentaget; prøv igen"
-
-#, c-format
-msgid "%s.\n"
-msgstr "%s.\n"
-
-msgid ""
-"You don't want a passphrase - this is probably a *bad* idea!\n"
-"I will do it anyway. You can change your passphrase at any time,\n"
-"using this program with the option \"--edit-key\".\n"
-"\n"
-msgstr ""
-"Du ønsker ikke en adgangsfrase - dette er en *dårlig* ide!\n"
-"Jeg giver dig en alligevel. Du kan ændre din adgangsfrase på\n"
-"ethvert tidspunkt ved at bruge dette program med tilvalget\n"
-"»--edit-key«.\n"
-
-msgid ""
"We need to generate a lot of random bytes. It is a good idea to perform\n"
"some other action (type on the keyboard, move the mouse, utilize the\n"
"disks) during the prime generation; this gives the random number\n"
@@ -4274,6 +4254,16 @@ msgid "Key generation canceled.\n"
msgstr "Nøgleoprettelse annulleret.\n"
#, fuzzy, c-format
+#| msgid "can't create backup file `%s': %s\n"
+msgid "can't create backup file '%s': %s\n"
+msgstr "kan ikke oprette sikkerhedskopifil »%s«: %s\n"
+
+#, fuzzy, c-format
+#| msgid "NOTE: backup of card key saved to `%s'\n"
+msgid "Note: backup of card key saved to '%s'\n"
+msgstr "BEMÆRK: sikkerhedskopi af kortnøgle gemt på »%s«\n"
+
+#, fuzzy, c-format
#| msgid "writing public key to `%s'\n"
msgid "writing public key to '%s'\n"
msgstr "skriver offentlig nøgle til »%s«\n"
@@ -4326,20 +4316,6 @@ msgstr "Hemmelige dele for primær nøgle gemmes på kortet.\n"
msgid "Really create? (y/N) "
msgstr "Vil du virkelig oprette? (j/N) "
-#, c-format
-msgid "storing key onto card failed: %s\n"
-msgstr "lagring af nøgle på kort mislykkedes: %s\n"
-
-#, fuzzy, c-format
-#| msgid "can't create backup file `%s': %s\n"
-msgid "can't create backup file '%s': %s\n"
-msgstr "kan ikke oprette sikkerhedskopifil »%s«: %s\n"
-
-#, fuzzy, c-format
-#| msgid "NOTE: backup of card key saved to `%s'\n"
-msgid "Note: backup of card key saved to '%s'\n"
-msgstr "BEMÆRK: sikkerhedskopi af kortnøgle gemt på »%s«\n"
-
msgid "never "
msgstr "aldrig "
@@ -4358,19 +4334,18 @@ msgstr "Kritisk underskriftnotation: "
msgid "Signature notation: "
msgstr "Underskriftsnotation: "
-#, fuzzy
-#| msgid "1 bad signature\n"
-msgid "1 good signature\n"
-msgstr "1 ugyldig underskrift\n"
-
#, fuzzy, c-format
#| msgid "%d bad signatures\n"
-msgid "%d good signatures\n"
-msgstr "%d ugyldige underskrifter\n"
+msgid "%d good signature\n"
+msgid_plural "%d good signatures\n"
+msgstr[0] "%d ugyldige underskrifter\n"
+msgstr[1] "%d ugyldige underskrifter\n"
#, c-format
-msgid "Warning: %lu key(s) skipped due to their large size\n"
-msgstr ""
+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] ""
msgid "Keyring"
msgstr "Nøglering"
@@ -4400,22 +4375,29 @@ msgid " Card serial no. ="
msgstr " Serielnr. for kort ="
#, fuzzy, c-format
-#| msgid "renaming `%s' to `%s' failed: %s\n"
-msgid "renaming '%s' to '%s' failed: %s\n"
-msgstr "omdøbelse af »%s« til »%s« mislykkedes: %s\n"
-
-#, fuzzy, c-format
#| msgid "caching keyring `%s'\n"
msgid "caching keyring '%s'\n"
msgstr "mellemlagrer nøglering »%s«\n"
-#, c-format
-msgid "%lu keys cached so far (%lu signatures)\n"
-msgstr "%lu nøgler mellemlagret indtil nu (%lu underskrifter)\n"
+#, fuzzy, c-format
+#| msgid "%lu keys cached so far (%lu signatures)\n"
+msgid "%lu keys cached so far (%lu signature)\n"
+msgid_plural "%lu keys cached so far (%lu signatures)\n"
+msgstr[0] "%lu nøgler mellemlagret indtil nu (%lu underskrifter)\n"
+msgstr[1] "%lu nøgler mellemlagret indtil nu (%lu underskrifter)\n"
#, c-format
-msgid "%lu keys cached (%lu signatures)\n"
-msgstr "%lu nøgler mellemlagret (%lu underskrifter)\n"
+msgid "%lu key cached"
+msgid_plural "%lu keys cached"
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+#| msgid "1 bad signature\n"
+msgid " (%lu signature)\n"
+msgid_plural " (%lu signatures)\n"
+msgstr[0] "1 ugyldig underskrift\n"
+msgstr[1] "1 ugyldig underskrift\n"
#, c-format
msgid "%s: keyring created\n"
@@ -4456,19 +4438,18 @@ msgstr "ugyldig nøgleserverprotokol (os %d!=håndtag %d)\n"
msgid "\"%s\" not a key ID: skipping\n"
msgstr "»%s« er ikke et nøgle-id: udelader\n"
-#, c-format
-msgid "refreshing 1 key from %s\n"
-msgstr "opdaterer 1 nøgle fra %s\n"
+#, fuzzy, c-format
+#| msgid "refreshing %d keys from %s\n"
+msgid "refreshing %d key from %s\n"
+msgid_plural "refreshing %d keys from %s\n"
+msgstr[0] "opdaterer %d nøgler fra %s\n"
+msgstr[1] "opdaterer %d nøgler fra %s\n"
#, c-format
msgid "WARNING: unable to refresh key %s via %s: %s\n"
msgstr "ADVARSEL: Kan ikke opdatere nøgle %s via %s: %s\n"
#, c-format
-msgid "refreshing %d keys from %s\n"
-msgstr "opdaterer %d nøgler fra %s\n"
-
-#, c-format
msgid "key \"%s\" not found on keyserver\n"
msgstr "nøgle »%s« blev ikke fundet på nøgleserver\n"
@@ -4486,9 +4467,10 @@ msgstr "anmoder om nøgle %s fra %s server %s\n"
msgid "requesting key %s from %s\n"
msgstr "anmoder om nøgle %s fra %s\n"
-#, c-format
-msgid "sending key %s to %s server %s\n"
-msgstr "sender nøgle %s til %s server %s\n"
+#, fuzzy
+#| msgid "no keyserver action!\n"
+msgid "no keyserver known\n"
+msgstr "ingen nøgleserverhandling!\n"
#, c-format
msgid "sending key %s to %s\n"
@@ -4709,6 +4691,19 @@ msgstr "ADVARSEL: sammendragsalgoritme %s er forældet\n"
msgid "Note: signatures using the %s algorithm are rejected\n"
msgstr "%s underskrift, sammendragsalgoritme %s\n"
+#, fuzzy, c-format
+#| msgid "read error in `%s': %s\n"
+msgid "(reported error: %s)\n"
+msgstr "læsefejl i »%s«: %s\n"
+
+#, fuzzy, c-format
+#| msgid "read error in `%s': %s\n"
+msgid "(reported error: %s <%s>)\n"
+msgstr "læsefejl i »%s«: %s\n"
+
+msgid "(further info: "
+msgstr ""
+
#, c-format
msgid "%s:%d: deprecated option \"%s\"\n"
msgstr "%s:%d: forældet indstilling »%s«\n"
@@ -5133,6 +5128,21 @@ msgstr "%s: udelod: offentlig nøgle er slået fra\n"
msgid "%s: skipped: public key already present\n"
msgstr "%s: udelod: offentlig nøgle er allerede til stede\n"
+#, fuzzy, c-format
+#| msgid "can't connect to `%s': %s\n"
+msgid "can't encrypt to '%s'\n"
+msgstr "kan ikke forbinde til »%s«: %s\n"
+
+#, fuzzy, c-format
+#| msgid "line %d: invalid algorithm\n"
+msgid "option '%s' given, but no valid default keys given\n"
+msgstr "linje %d: ugyldig algoritme\n"
+
+#, fuzzy, c-format
+#| msgid "line %d: invalid algorithm\n"
+msgid "option '%s' given, but option '%s' not given\n"
+msgstr "linje %d: ugyldig algoritme\n"
+
msgid "You did not specify a user ID. (you may use \"-r\")\n"
msgstr "Du angav ikke et bruger-id. (du kan bruge »-r«)\n"
@@ -5176,11 +5186,6 @@ msgstr "Bemærk: nøgle %s har ingen præference for %s\n"
msgid "data not saved; use option \"--output\" to save it\n"
msgstr "data ej gemt; brug tilvalg »--output« for at gemme\n"
-#, fuzzy, c-format
-#| msgid "error creating `%s': %s\n"
-msgid "error creating '%s': %s\n"
-msgstr "fejl ved oprettelse af »%s«: %s\n"
-
msgid "Detached signature.\n"
msgstr "Frakoblet underskrift.\n"
@@ -5272,19 +5277,31 @@ msgid "This is a revocation certificate for the OpenPGP key:"
msgstr "Opret et tilbagekaldscertifikat for denne nøgle? (j/N) "
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 ""
+
+msgid ""
"Use it to revoke this key in case of a compromise or loss of\n"
"the secret key. However, if the secret key is still accessible,\n"
"it is better to generate a new revocation certificate and give\n"
-"a reason for the revocation."
+"a reason for the revocation. For details see the description of\n"
+"of the gpg command \"--gen-revoke\" in the GnuPG manual."
msgstr ""
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 making use of this revocation certificate."
+"before importing and publishing this revocation certificate."
msgstr ""
#, fuzzy, c-format
+#| msgid "Revocation certificate created.\n"
+msgid "revocation certificate stored as '%s.rev'\n"
+msgstr "Tilbagekaldscertifikat oprettet.\n"
+
+#, fuzzy, c-format
#| msgid "secret key \"%s\" not found: %s\n"
msgid "secret key \"%s\" not found\n"
msgstr "hemmelig nøgle »%s« blev ikke fundet: %s\n"
@@ -5296,6 +5313,11 @@ msgstr "hemmelig nøgle »%s« blev ikke fundet: %s\n"
msgid "'%s' matches multiple secret keys:\n"
msgstr ""
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "error searching the keyring: %s\n"
+msgstr "fejl ved oprettelse af nøglering »%s«: %s\n"
+
msgid "Create a revocation certificate for this key? (y/N) "
msgstr "Opret et tilbagekaldscertifikat for denne nøgle? (j/N) "
@@ -5373,27 +5395,46 @@ msgid "WARNING: signing subkey %s has an invalid cross-certification\n"
msgstr ""
"ADVARSEL: underskriftsundernøgle %s har en ugyldig krydscertificering\n"
-#, c-format
+#, fuzzy, c-format
+#| msgid "public key %s is %lu second newer than the signature\n"
msgid "public key %s is %lu second newer than the signature\n"
-msgstr "offentlig nøgle %s er %lu sekund nyere end underskrift\n"
+msgid_plural "public key %s is %lu seconds newer than the signature\n"
+msgstr[0] "offentlig nøgle %s er %lu sekund nyere end underskrift\n"
+msgstr[1] "offentlig nøgle %s er %lu sekund nyere end underskrift\n"
-#, c-format
-msgid "public key %s is %lu seconds newer than the signature\n"
-msgstr "offentlig nøgle %s er %lu sekunder nyere end underskrift\n"
+#, fuzzy, c-format
+#| msgid "public key %s is %lu second newer than the signature\n"
+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] "offentlig nøgle %s er %lu sekund nyere end underskrift\n"
+msgstr[1] "offentlig nøgle %s er %lu sekund nyere end underskrift\n"
-#, c-format
+#, fuzzy, c-format
+#| msgid ""
+#| "key %s was created %lu second in the future (time warp or clock problem)\n"
msgid ""
"key %s was created %lu second in the future (time warp or clock problem)\n"
-msgstr ""
+msgid_plural ""
+"key %s was created %lu seconds in the future (time warp or clock problem)\n"
+msgstr[0] ""
+"nøgle %s blev oprettet %lu sekund inde i fremtiden (tidsforskydning eller et "
+"problem med uret)\n"
+msgstr[1] ""
"nøgle %s blev oprettet %lu sekund inde i fremtiden (tidsforskydning eller et "
"problem med uret)\n"
-#, c-format
-msgid ""
-"key %s was created %lu seconds in the future (time warp or clock problem)\n"
-msgstr ""
-"nøgle %s blev oprettet %lu sekunder inde i fremtiden (tidsforskydning eller "
-"et problem med uret)\n"
+#, fuzzy, c-format
+#| msgid ""
+#| "key %s was created %lu second in the future (time warp or clock problem)\n"
+msgid "key %s was created %lu day in the future (time warp or clock problem)\n"
+msgid_plural ""
+"key %s was created %lu days in the future (time warp or clock problem)\n"
+msgstr[0] ""
+"nøgle %s blev oprettet %lu sekund inde i fremtiden (tidsforskydning eller et "
+"problem med uret)\n"
+msgstr[1] ""
+"nøgle %s blev oprettet %lu sekund inde i fremtiden (tidsforskydning eller et "
+"problem med uret)\n"
#, fuzzy, c-format
#| msgid "NOTE: signature key %s expired %s\n"
@@ -5630,6 +5671,246 @@ msgid "input line longer than %d characters\n"
msgstr "inddatalinje er længere end %d tegn\n"
#, fuzzy, c-format
+#| msgid "error sending standard options: %s\n"
+msgid "error beginning transaction on TOFU database: %s\n"
+msgstr "fejl under afsendelse af standardtilvalg: %s\n"
+
+#, c-format
+msgid "error committing transaction on TOFU database: %s\n"
+msgstr ""
+
+#, c-format
+msgid "error rolling back transaction on TOFU database: %s\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "unsupported algorithm: %s"
+msgid "unsupported TOFU database version: %s\n"
+msgstr "ikke understøttet algoritme: %s"
+
+#, fuzzy, c-format
+#| msgid "error sending %s command: %s\n"
+msgid "error reading TOFU database: %s\n"
+msgstr "fejl under afsendelse af %s-kommando: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error writing secret keyring `%s': %s\n"
+msgid "error determining TOFU database's version: %s\n"
+msgstr "fejl ved skrivning af hemmelig nøglering »%s«: %s\n"
+
+#, fuzzy, c-format
+#| msgid "%s: error writing dir record: %s\n"
+msgid "error initializing TOFU database: %s\n"
+msgstr "%s: fejl ved skrivning af mappepost: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error opening `%s': %s\n"
+msgid "error opening TOFU database '%s': %s\n"
+msgstr "fejl ved åbning af »%s«: %s\n"
+
+msgid "Warning: Home directory contains both tofu.db and tofu.d.\n"
+msgstr ""
+
+msgid "Using split format for TOFU database\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "error sending %s command: %s\n"
+msgid "error updating TOFU database: %s\n"
+msgstr "fejl under afsendelse af %s-kommando: %s\n"
+
+#, c-format
+msgid "public key %s not found: %s\n"
+msgstr "offentlig nøgle %s blev ikke fundet: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error storing flags: %s\n"
+msgid "error setting TOFU binding's trust level to %s\n"
+msgstr "fejl ved lagring af flag: %s\n"
+
+#, c-format
+msgid "The binding %s is NOT known."
+msgstr ""
+
+#, c-format
+msgid ""
+"The key %s raised a conflict with this binding (%s). Since this binding's "
+"policy was 'auto', it was changed to 'ask'."
+msgstr ""
+
+#, c-format
+msgid ""
+"Please indicate whether you believe the binding %s%sis legitimate (the key "
+"belongs to the stated owner) or a forgery (bad)."
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "error getting new PIN: %s\n"
+msgid "error gathering other user IDs: %s\n"
+msgstr "fejl ved indhentelse af ny PIN: %s\n"
+
+msgid "Known user IDs associated with this key:\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "validity: %s"
+msgid "policy: %s"
+msgstr "validitet: %s"
+
+#, fuzzy, c-format
+#| msgid "error getting stored flags: %s\n"
+msgid "error gathering signature stats: %s\n"
+msgstr "fejl ved indhentelse af gemte flag: %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] ""
+msgstr[1] ""
+
+#, c-format
+msgid "Statistics for keys with the email address \"%s\":\n"
+msgstr ""
+
+#, fuzzy
+#| msgid "list keys"
+msgid "this key"
+msgstr "vis nøgler"
+
+#, c-format
+msgid "%ld message signed in the future."
+msgid_plural "%ld messages signed in the future."
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+#| msgid "print message digests"
+msgid "%ld message signed"
+msgid_plural "%ld messages signed"
+msgstr[0] "vis beskedsammendrag"
+msgstr[1] "vis beskedsammendrag"
+
+#, c-format
+msgid " over the past %ld day."
+msgid_plural " over the past %ld days."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid " over the past %ld week."
+msgid_plural " over the past %ld weeks."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid " over the past %ld month."
+msgid_plural " over the past %ld months."
+msgstr[0] ""
+msgstr[1] ""
+
+#. 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 ""
+
+#. 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 ""
+
+msgid "(G)ood, (A)ccept once, (U)nknown, (R)eject once, (B)ad? "
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "error creating a pipe: %s\n"
+msgid "error changing TOFU policy: %s\n"
+msgstr "fejl ved oprettelse af datakanal: %s\n"
+
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "Have never verified a message signed by key %s!\n"
+msgstr ""
+
+#, c-format
+msgid "Failed to collect signature statistics for \"%s\" (key %s)\n"
+msgstr ""
+
+#, c-format
+msgid "Verified 0 messages signed by \"%s\" (key: %s, policy: %s)."
+msgstr ""
+
+#. TRANSLATORS: The final %s is replaced by a string like
+#. "7 months, 1 day, 5 minutes, 0 seconds".
+#, c-format
+msgid ""
+"Verified %ld message signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgid_plural ""
+"Verified %ld messages signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "The most recent message was verified %s ago."
+msgstr ""
+
+msgid "Warning: we've have yet to see a message signed by this key!\n"
+msgstr ""
+
+msgid "Warning: we've only seen a single message signed by this key!\n"
+msgstr ""
+
+#. TRANSLATORS: translate the below text. We don't
+#. directly internationalize that text so that we can
+#. tweak it without breaking translations.
+#, c-format
+msgid "TOFU: few signatures %d message %s"
+msgid_plural "TOFU: few signatures %d messages %s"
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+#| msgid "error sending %s command: %s\n"
+msgid "error opening TOFU database: %s\n"
+msgstr "fejl under afsendelse af %s-kommando: %s\n"
+
+#, fuzzy, c-format
#| msgid "`%s' is not a valid long keyID\n"
msgid "'%s' is not a valid long keyID\n"
msgstr "»%s« er ikke et gyldigt nøgle-id\n"
@@ -5692,19 +5973,25 @@ msgid "no need for a trustdb update with '%s' trust model\n"
msgstr ""
"intet behov for en opdatering af trustdb med troværdighedsmodellen »%s«\n"
-#, c-format
-msgid "public key %s not found: %s\n"
-msgstr "offentlig nøgle %s blev ikke fundet: %s\n"
-
msgid "please do a --check-trustdb\n"
msgstr "udfør venligst en --check-trustdb\n"
msgid "checking the trustdb\n"
msgstr "kontrollerer trustdb\n"
-#, c-format
-msgid "%d keys processed (%d validity counts cleared)\n"
-msgstr "%d nøgler behandlet (%d validiteter ryddet)\n"
+#, fuzzy, c-format
+#| msgid "%lu keys processed so far\n"
+msgid "%d key processed"
+msgid_plural "%d keys processed"
+msgstr[0] " %lu-nøgler behandlet\n"
+msgstr[1] " %lu-nøgler behandlet\n"
+
+#, fuzzy, c-format
+#| msgid "%d keys processed (%d validity counts cleared)\n"
+msgid " (%d validity count cleared)\n"
+msgid_plural " (%d validity counts cleared)\n"
+msgstr[0] "%d nøgler behandlet (%d validiteter ryddet)\n"
+msgstr[1] "%d nøgler behandlet (%d validiteter ryddet)\n"
msgid "no ultimately trusted keys found\n"
msgstr "ingen ultimativ troværdige nøgler fundet\n"
@@ -5714,10 +6001,6 @@ msgid "public key of ultimately trusted key %s not found\n"
msgstr "offentlig nøgle for ultimativ troværdig nøgle %s blev ikke fundet\n"
#, c-format
-msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
-msgstr "%d marginaler krævet, %d færdiggjorte krævet, %s troværdighedsmodel\n"
-
-#, c-format
msgid ""
"depth: %d valid: %3d signed: %3d trust: %d-, %dq, %dn, %dm, %df, %du\n"
msgstr ""
@@ -5923,9 +6206,13 @@ msgstr "fejl ved indhentelse af CHV-status fra kort\n"
msgid "card is permanently locked!\n"
msgstr "kort er permanent låst!\n"
-#, c-format
-msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
-msgstr "%d PIN-forsøg for administrator før kort permanent låses\n"
+#, fuzzy, c-format
+#| msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
+msgid "%d Admin PIN attempt remaining before card is permanently locked\n"
+msgid_plural ""
+"%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr[0] "%d PIN-forsøg for administrator før kort permanent låses\n"
+msgstr[1] "%d PIN-forsøg for administrator før kort permanent låses\n"
#. TRANSLATORS: Do not translate the "|A|" prefix but keep it at
#. the start of the string. Use %%0A to force a linefeed.
@@ -6004,9 +6291,12 @@ msgstr "vent venligst mens nøglen bliver oprettet ...\n"
msgid "generating key failed\n"
msgstr "oprettelse af nøgle mislykkedes\n"
-#, c-format
-msgid "key generation completed (%d seconds)\n"
-msgstr "nøgleoprettelse færdig (%d sekunder)\n"
+#, fuzzy, c-format
+#| msgid "key generation completed (%d seconds)\n"
+msgid "key generation completed (%d second)\n"
+msgid_plural "key generation completed (%d seconds)\n"
+msgstr[0] "nøgleoprettelse færdig (%d sekunder)\n"
+msgstr[1] "nøgleoprettelse færdig (%d sekunder)\n"
msgid "invalid structure of OpenPGP card (DO 0x93)\n"
msgstr "ugyldig struktur for OpenPGP-kort (DO 0x93)\n"
@@ -8392,6 +8682,11 @@ msgstr "|N|giv adgangsfrasen udløb efter N dage"
msgid "do not allow the reuse of old passphrases"
msgstr "tillad ikke genbrug af gamle adgangsfraser"
+#, fuzzy
+#| msgid "|N|set maximum PIN cache lifetime to N seconds"
+msgid "|N|set the Pinentry timeout to N seconds"
+msgstr "|N|angive maksimal livsforløb for PIN-mellemlager til N sekunder"
+
msgid "|NAME|use NAME as default secret key"
msgstr "|NAME|brug NAVN som hemmelig standardnøgle"
@@ -8700,6 +8995,94 @@ msgstr ""
"Syntaks: gpg-check-pattern [tilvalg] mønsterfil\n"
"Kontroller en adgangsfrase angivet på stdin mod mønsterfilen\n"
+#, fuzzy
+#~| msgid "option \"%.50s\" is ambiguous\n"
+#~ msgid "key specification '%s' is ambiguous\n"
+#~ msgstr "tilvalg »%.50s« er tvetydigt\n"
+
+#~ msgid "%d signatures not checked due to missing keys\n"
+#~ msgstr ""
+#~ "%d underskrifter er ikke kontrolleret på grund af manglende nøgler\n"
+
+#~ msgid "%d signatures not checked due to errors\n"
+#~ msgstr "%d underskrifter er ikke kontrolleret på grund af fejl\n"
+
+#~ msgid "1 user ID without valid self-signature detected\n"
+#~ msgstr "1 bruger-id uden gyldig egenunderskrift detekteret\n"
+
+#~ msgid "Deleted %d signatures.\n"
+#~ msgstr "Slettede %d underskrifter.\n"
+
+#~ msgid "User ID \"%s\": %d signatures removed\n"
+#~ msgstr "Bruger-id »%s«: %d underskrifter fjernet\n"
+
+#~ msgid ""
+#~ "You need a Passphrase to protect your secret key.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Du skal bruge en adgangsfrase til at beskytte din hemmelige nøgle.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Please enter a passphrase to protect the off-card backup of the new "
+#~ "encryption key."
+#~ msgstr ""
+#~ "Indtast venligst en adgangsfrase til at beskytte sikkerhedskopien "
+#~ "fortaget uden for kortet af den nye krypteringsnøgle."
+
+#~ msgid "passphrase not correctly repeated; try again"
+#~ msgstr "adgangsfrasen er ikke korrekt gentaget; prøv igen"
+
+#~ msgid "%s.\n"
+#~ msgstr "%s.\n"
+
+#~ msgid ""
+#~ "You don't want a passphrase - this is probably a *bad* idea!\n"
+#~ "I will do it anyway. You can change your passphrase at any time,\n"
+#~ "using this program with the option \"--edit-key\".\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Du ønsker ikke en adgangsfrase - dette er en *dårlig* ide!\n"
+#~ "Jeg giver dig en alligevel. Du kan ændre din adgangsfrase på\n"
+#~ "ethvert tidspunkt ved at bruge dette program med tilvalget\n"
+#~ "»--edit-key«.\n"
+
+#~ msgid "storing key onto card failed: %s\n"
+#~ msgstr "lagring af nøgle på kort mislykkedes: %s\n"
+
+#, fuzzy
+#~| msgid "1 bad signature\n"
+#~ msgid "1 good signature\n"
+#~ msgstr "1 ugyldig underskrift\n"
+
+#, fuzzy
+#~| msgid "renaming `%s' to `%s' failed: %s\n"
+#~ msgid "renaming '%s' to '%s' failed: %s\n"
+#~ msgstr "omdøbelse af »%s« til »%s« mislykkedes: %s\n"
+
+#~ msgid "%lu keys cached (%lu signatures)\n"
+#~ msgstr "%lu nøgler mellemlagret (%lu underskrifter)\n"
+
+#~ msgid "refreshing 1 key from %s\n"
+#~ msgstr "opdaterer 1 nøgle fra %s\n"
+
+#~ msgid "sending key %s to %s server %s\n"
+#~ msgstr "sender nøgle %s til %s server %s\n"
+
+#~ msgid "public key %s is %lu seconds newer than the signature\n"
+#~ msgstr "offentlig nøgle %s er %lu sekunder nyere end underskrift\n"
+
+#~ msgid ""
+#~ "key %s was created %lu seconds in the future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "nøgle %s blev oprettet %lu sekunder inde i fremtiden (tidsforskydning "
+#~ "eller et problem med uret)\n"
+
+#~ msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
+#~ msgstr ""
+#~ "%d marginaler krævet, %d færdiggjorte krævet, %s troværdighedsmodel\n"
+
#~ msgid "cleared passphrase cached with ID: %s\n"
#~ msgstr "ryddet adgangsfrase mellemlagret med id: %s\n"
@@ -8957,9 +9340,6 @@ msgstr ""
#~ msgid "searching for \"%s\" from %s\n"
#~ msgstr "søger efter »%s« fra %s\n"
-#~ msgid "no keyserver action!\n"
-#~ msgstr "ingen nøgleserverhandling!\n"
-
#~ msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n"
#~ msgstr ""
#~ "ADVARSEL: nøgleserverhåndtering fra en anden version af GnuPG (%s)\n"
diff --git a/po/de.po b/po/de.po
index 7d3e301..3dad2a2 100644
--- a/po/de.po
+++ b/po/de.po
@@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gnupg-2.1.0\n"
"Report-Msgid-Bugs-To: translations@gnupg.org\n"
-"PO-Revision-Date: 2015-12-03 17:23+0100\n"
+"PO-Revision-Date: 2016-01-26 13:18+0100\n"
"Last-Translator: Werner Koch <wk@gnupg.org>\n"
"Language-Team: German <de@li.org>\n"
"Language: de\n"
@@ -1197,6 +1197,18 @@ msgid "Enter passphrase: "
msgstr "Geben Sie die Passphrase ein: "
#, c-format
+msgid "error getting version from '%s': %s\n"
+msgstr "Fehler beim Holen der Version von '%s': %s\n"
+
+#, c-format
+msgid "server '%s' is older than us (%s < %s)"
+msgstr "Der Server '%s' is älter als wir selbst (Version %s < %s)"
+
+#, c-format
+msgid "WARNING: %s\n"
+msgstr "WARNUNG: %s\n"
+
+#, c-format
msgid "OpenPGP card not available: %s\n"
msgstr "OpenPGP Karte ist nicht vorhanden: %s\n"
@@ -1675,6 +1687,9 @@ msgstr "Unbrauchbare Teile des Schlüssel während des Exports entfernen"
msgid "remove as much as possible from key during export"
msgstr "Während des Exports soviel wie möglich vom Schlüssel entfernen"
+msgid " - skipped"
+msgstr " - übersprungen"
+
msgid "exporting secret keys not allowed\n"
msgstr "Exportieren geheimer Schlüssel ist nicht erlaubt\n"
@@ -1686,16 +1701,34 @@ msgstr "Schlüssel %s: PGP 2.x-artiger Schlüssel - übersprungen\n"
msgid "key %s: key material on-card - skipped\n"
msgstr "Schlüssel %s: Schlüsselmaterial ist auf einer Karte - übersprungen\n"
-msgid " - skipped"
-msgstr " - übersprungen"
-
msgid "WARNING: nothing exported\n"
msgstr "WARNUNG: Nichts exportiert\n"
+#, c-format
+msgid "error creating '%s': %s\n"
+msgstr "Fehler beim Erstellen von `%s': %s\n"
+
msgid "[User ID not found]"
msgstr "[User-ID nicht gefunden]"
#, c-format
+msgid "(check argument of option '%s')\n"
+msgstr "(Prüfe das Argument der Option '%s')\n"
+
+#, c-format
+msgid "Warning: '%s' should be a long key ID or a fingerprint\n"
+msgstr ""
+"WARNUNG: '%s' sollte eine lange Schlüssel-ID oder ein Fingerabdruck sein\n"
+
+#, c-format
+msgid "error looking up: %s\n"
+msgstr "Fehler beim Nachschlagen von: %s\n"
+
+#, c-format
+msgid "Warning: %s appears in the keyring %d times\n"
+msgstr "WARNUNG: %s ist %d mal im Schlüsselbund vorhanden\n"
+
+#, c-format
msgid "automatically retrieved '%s' via %s\n"
msgstr "`%s' automatisch via %s geholt\n"
@@ -1711,12 +1744,18 @@ msgid "secret key \"%s\" not found: %s\n"
msgstr "Geheimer Schlüssel \"%s\" nicht gefunden: %s\n"
#, c-format
-msgid "(check argument of option '%s')\n"
-msgstr "(Prüfe das Argument der Option '%s')\n"
+msgid "Warning: not using '%s' as default key: %s\n"
+msgstr ""
+"WARNUNG: \"%s\" wird nicht als voreingestellter geheimer Schlüssel benutzt: "
+"%s\n"
#, c-format
-msgid "using \"%s\" as default secret key\n"
-msgstr "\"%s\" wird als voreingestellter geheimer Schlüssel benutzt\n"
+msgid "using \"%s\" as default secret key for signing\n"
+msgstr "\"%s\" wird als voreingestellter geheimer Signaturschlüssel benutzt\n"
+
+#, c-format
+msgid "all values passed to '%s' ignored\n"
+msgstr "Alle für '%s' angegebenen Werte wurden ignoriert\n"
#, c-format
msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
@@ -2059,29 +2098,6 @@ msgid "Note: old default options file '%s' ignored\n"
msgstr "Hinweis: Alte voreingestellte Optionendatei '%s' wurde ignoriert\n"
#, c-format
-msgid ""
-"Warning: value '%s' for option '%s' should be a long key ID or a "
-"fingerprint\n"
-msgstr ""
-"WARNUNG: Der Wert '%s' der Option '%s' sollte eine lange Schlüssel-ID\n"
-"oder ein Fingerabdruck sein\n"
-
-#, c-format
-msgid "key specification '%s' is ambiguous\n"
-msgstr "Schlüsselangabe '%s' ist mehrdeutig\n"
-
-#. TRANSLATORS: The %s prints a key specification which
-#. for example has been given at the command line. Two
-#. lines with fingerprints are printed after this message.
-#, c-format
-msgid "'%s' matches at least:\n"
-msgstr "'%s' paßt mindest auf:\n"
-
-#, c-format
-msgid "error searching the keyring: %s\n"
-msgstr "Fehler beim Suchen im Schlüsselbund: %s\n"
-
-#, c-format
msgid "libgcrypt is too old (need %s, have %s)\n"
msgstr ""
"Die Bibliothek \"libgcrypt\" ist zu alt (benötigt wird %s, vorhanden ist "
@@ -2281,14 +2297,6 @@ msgid "WARNING: recipients (-r) given without using public key encryption\n"
msgstr ""
"WARNUNG: Empfänger (-r) angegeben ohne Verwendung von Public-Key-Verfahren\n"
-#, c-format
-msgid "option '%s' given, but no valid default keys given\n"
-msgstr "Option '%s' ohne gültige Standardschlüssel angegeben\n"
-
-#, c-format
-msgid "option '%s' given, but option '%s' not given\n"
-msgstr "Option '%s' ohne Verwendung der Option '%s' angegeben\n"
-
msgid "--store [filename]"
msgstr "--store [Dateiname]"
@@ -2366,6 +2374,10 @@ msgid "key export failed: %s\n"
msgstr "Schlüsselexport fehlgeschlagen: %s\n"
#, c-format
+msgid "export as ssh key failed: %s\n"
+msgstr "Schlüsselexport im SSH Format fehlgeschlagen: %s\n"
+
+#, c-format
msgid "keyserver search failed: %s\n"
msgstr "Suche auf dem Schlüsselserver fehlgeschlagen: %s\n"
@@ -2855,33 +2867,29 @@ msgstr "[Widerruf]"
msgid "[self-signature]"
msgstr "[Eigenbeglaubigung]"
-msgid "1 bad signature\n"
-msgstr "1 falsche Beglaubigung\n"
-
#, c-format
-msgid "%d bad signatures\n"
-msgstr "%d falsche Beglaubigungen\n"
-
-msgid "1 signature not checked due to a missing key\n"
-msgstr "1 Beglaubigung wegen fehlendem Schlüssel nicht geprüft\n"
+msgid "%d bad signature\n"
+msgid_plural "%d bad signatures\n"
+msgstr[0] "%d falsche Beglaubigung\n"
+msgstr[1] "%d falsche Beglaubigungen\n"
#, c-format
-msgid "%d signatures not checked due to missing keys\n"
-msgstr "%d Beglaubigungen wegen fehlenden Schlüsseln nicht geprüft\n"
-
-msgid "1 signature not checked due to an error\n"
-msgstr "1 Beglaubigung aufgrund von Fehler nicht geprüft\n"
+msgid "%d signature not checked due to a missing key\n"
+msgid_plural "%d signatures not checked due to missing keys\n"
+msgstr[0] "%d Beglaubigung wegen fehlendem Schlüssel nicht geprüft\n"
+msgstr[1] "%d Beglaubigungen wegen fehlender Schlüssel nicht geprüft\n"
#, c-format
-msgid "%d signatures not checked due to errors\n"
-msgstr "%d Beglaubigungen aufgrund von Fehlern nicht geprüft\n"
-
-msgid "1 user ID without valid self-signature detected\n"
-msgstr "Eine User-ID ohne gültige Eigenbeglaubigung entdeckt\n"
+msgid "%d signature not checked due to an error\n"
+msgid_plural "%d signatures not checked due to errors\n"
+msgstr[0] "%d Beglaubigung aufgrund eines Fehlers nicht geprüft\n"
+msgstr[1] "%d Beglaubigungen aufgrund von Fehlern nicht geprüft\n"
#, c-format
-msgid "%d user IDs without valid self-signatures detected\n"
-msgstr "%d User-IDs ohne gültige Eigenbeglaubigung entdeckt\n"
+msgid "%d user ID without valid self-signature detected\n"
+msgid_plural "%d user IDs without valid self-signatures detected\n"
+msgstr[0] "%d User-ID ohne gültige Eigenbeglaubigung entdeckt\n"
+msgstr[1] "%d User-IDs ohne gültige Eigenbeglaubigungen entdeckt\n"
msgid ""
"Please decide how far you trust this user to correctly verify other users' "
@@ -3472,11 +3480,9 @@ msgstr "Eigenbeglaubigung wirklich entfernen? (j/N)"
#, c-format
msgid "Deleted %d signature.\n"
-msgstr "%d Beglaubigungen entfernt.\n"
-
-#, c-format
-msgid "Deleted %d signatures.\n"
-msgstr "%d Beglaubigungen entfernt.\n"
+msgid_plural "Deleted %d signatures.\n"
+msgstr[0] "%d Beglaubigung entfernt.\n"
+msgstr[1] "%d Beglaubigungen entfernt.\n"
msgid "Nothing deleted.\n"
msgstr "Nichts entfernt.\n"
@@ -3490,11 +3496,9 @@ msgstr "User-ID \"%s\" bereits verkleinert: %s\n"
#, c-format
msgid "User ID \"%s\": %d signature removed\n"
-msgstr "User-ID \"%s\": %d Signatur entfernt\n"
-
-#, c-format
-msgid "User ID \"%s\": %d signatures removed\n"
-msgstr "User-ID \"%s\": %d Signaturen entfernt\n"
+msgid_plural "User ID \"%s\": %d signatures removed\n"
+msgstr[0] "User-ID \"%s\": %d Signatur entfernt\n"
+msgstr[1] "User-ID \"%s\": %d Signaturen entfernt\n"
#, c-format
msgid "User ID \"%s\": already minimized\n"
@@ -4013,39 +4017,6 @@ msgid "Please correct the error first\n"
msgstr "Bitte beseitigen Sie zuerst den Fehler\n"
msgid ""
-"You need a Passphrase to protect your secret key.\n"
-"\n"
-msgstr ""
-"Sie benötigen eine Passphrase, um den geheimen Schlüssel zu schützen.\n"
-"\n"
-
-msgid ""
-"Please enter a passphrase to protect the off-card backup of the new "
-"encryption key."
-msgstr ""
-"Bitte geben Sie die Passphrase ein, um die Sicherheitskopie des neuen "
-"Verschlüsselungsschlüssel der Karte zu schützen."
-
-msgid "passphrase not correctly repeated; try again"
-msgstr "Passphrase wurde nicht richtig wiederholt; noch einmal versuchen"
-
-#, c-format
-msgid "%s.\n"
-msgstr "%s.\n"
-
-msgid ""
-"You don't want a passphrase - this is probably a *bad* idea!\n"
-"I will do it anyway. You can change your passphrase at any time,\n"
-"using this program with the option \"--edit-key\".\n"
-"\n"
-msgstr ""
-"Sie möchten keine Passphrase - Dies ist *nicht* zu empfehlen!\n"
-"Es ist trotzdem möglich. Sie können Ihre Passphrase jederzeit\n"
-"ändern, indem sie dieses Programm mit dem Befehl \"--edit-key\"\n"
-"aufrufen.\n"
-"\n"
-
-msgid ""
"We need to generate a lot of random bytes. It is a good idea to perform\n"
"some other action (type on the keyboard, move the mouse, utilize the\n"
"disks) during the prime generation; this gives the random number\n"
@@ -4090,6 +4061,14 @@ msgid "Key generation canceled.\n"
msgstr "Schlüsselerzeugung abgebrochen.\n"
#, c-format
+msgid "can't create backup file '%s': %s\n"
+msgstr "Sicherungsdatei '%s' kann nicht erzeugt werden: %s\n"
+
+#, c-format
+msgid "Note: backup of card key saved to '%s'\n"
+msgstr "Hinweis: Sicherung des Kartenschlüssels wurde auf `%s' gespeichert\n"
+
+#, c-format
msgid "writing public key to '%s'\n"
msgstr "schreiben des öffentlichen Schlüssels nach '%s'\n"
@@ -4138,18 +4117,6 @@ msgstr "Geheime Teile des Hauptschlüssels sind auf der Karte gespeichert.\n"
msgid "Really create? (y/N) "
msgstr "Wirklich erzeugen? (j/N) "
-#, c-format
-msgid "storing key onto card failed: %s\n"
-msgstr "Speicher des Schlüssels auf der Karte schlug fehl: %s\n"
-
-#, c-format
-msgid "can't create backup file '%s': %s\n"
-msgstr "Sicherungsdatei '%s' kann nicht erzeugt werden: %s\n"
-
-#, c-format
-msgid "Note: backup of card key saved to '%s'\n"
-msgstr "Hinweis: Sicherung des Kartenschlüssels wurde auf `%s' gespeichert\n"
-
msgid "never "
msgstr "niemals "
@@ -4168,16 +4135,17 @@ msgstr "Entscheidender Beglaubigungs-\"Notation\": "
msgid "Signature notation: "
msgstr "Beglaubigungs-\"Notation\": "
-msgid "1 good signature\n"
-msgstr "1 korrekte Signatur\n"
-
#, c-format
-msgid "%d good signatures\n"
-msgstr "%d korrekte Signaturen\n"
+msgid "%d good signature\n"
+msgid_plural "%d good signatures\n"
+msgstr[0] "%d korrekte Signatur\n"
+msgstr[1] "%d korrekte Signaturen\n"
#, c-format
-msgid "Warning: %lu key(s) skipped due to their large size\n"
-msgstr "WARNUNG: %lu Schlüssel übersprungen, da sie zu groß sind\n"
+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] "WARNUNG: %lu Schlüssel übersprungen, da er zu groß ist\n"
+msgstr[1] "WARNUNG: %lu Schlüssel übersprungen, da sie zu groß sind\n"
msgid "Keyring"
msgstr "Schlüsselbund"
@@ -4207,20 +4175,26 @@ msgid " Card serial no. ="
msgstr " Kartenseriennr. ="
#, c-format
-msgid "renaming '%s' to '%s' failed: %s\n"
-msgstr "umbenennen von `%s' nach `%s' schlug fehl: %s\n"
-
-#, c-format
msgid "caching keyring '%s'\n"
msgstr "Puffern des Schlüsselbundes `%s'\n"
#, c-format
-msgid "%lu keys cached so far (%lu signatures)\n"
-msgstr "%lu Schlüssel bislang gepuffert (%lu Beglaubigungen)\n"
+msgid "%lu keys cached so far (%lu signature)\n"
+msgid_plural "%lu keys cached so far (%lu signatures)\n"
+msgstr[0] "%lu Schlüssel bislang gepuffert (%lu Beglaubigung)\n"
+msgstr[1] "%lu Schlüssel bislang gepuffert (%lu Beglaubigungen)\n"
+
+#, c-format
+msgid "%lu key cached"
+msgid_plural "%lu keys cached"
+msgstr[0] "%lu Schlüssel gepuffert"
+msgstr[1] "%lu Schlüssel gepuffert"
#, c-format
-msgid "%lu keys cached (%lu signatures)\n"
-msgstr "%lu Schlüssel gepuffert (%lu Beglaubigungen)\n"
+msgid " (%lu signature)\n"
+msgid_plural " (%lu signatures)\n"
+msgstr[0] " (%lu Beglaubigung)\n"
+msgstr[1] " (%lu Beglaubigungen)\n"
#, c-format
msgid "%s: keyring created\n"
@@ -4263,18 +4237,16 @@ msgid "\"%s\" not a key ID: skipping\n"
msgstr "\"%s\" ist keine Schlüssel-ID: überspringe\n"
#, c-format
-msgid "refreshing 1 key from %s\n"
-msgstr "ein Schlüssel wird per %s aktualisiert\n"
+msgid "refreshing %d key from %s\n"
+msgid_plural "refreshing %d keys from %s\n"
+msgstr[0] "%d Schlüssel wird per %s aktualisiert\n"
+msgstr[1] "%d Schlüssel werden per %s aktualisiert\n"
#, c-format
msgid "WARNING: unable to refresh key %s via %s: %s\n"
msgstr "WARNUNG: Schlüssel %s kann per %s nicht aktualisiert werden: %s\n"
#, c-format
-msgid "refreshing %d keys from %s\n"
-msgstr "%d Schlüssel werden per %s aktualisiert\n"
-
-#, c-format
msgid "key \"%s\" not found on keyserver\n"
msgstr "Schlüssel \"%s\" wurde auf dem Schlüsselserver nicht gefunden\n"
@@ -4292,9 +4264,8 @@ msgstr "fordere Schlüssel %s von %s-Server %s an\n"
msgid "requesting key %s from %s\n"
msgstr "fordere Schlüssel %s von %s an\n"
-#, c-format
-msgid "sending key %s to %s server %s\n"
-msgstr "sende Schlüssel %s auf den %s-Server %s\n"
+msgid "no keyserver known\n"
+msgstr "Kein Schlüsselserver bekannt\n"
#, c-format
msgid "sending key %s to %s\n"
@@ -4515,6 +4486,17 @@ msgid "Note: signatures using the %s algorithm are rejected\n"
msgstr "Hinweis: %s basierte Signaturen werden zurückgewiesen.\n"
#, c-format
+msgid "(reported error: %s)\n"
+msgstr "(gemeldeter Fehler: %s)\n"
+
+#, c-format
+msgid "(reported error: %s <%s>)\n"
+msgstr "(gemeldeter Fehler: %s <%s>)\n"
+
+msgid "(further info: "
+msgstr "(weitere Infos: "
+
+#, c-format
msgid "%s:%d: deprecated option \"%s\"\n"
msgstr "%s:%d: mißbilligte Option \"%s\".\n"
@@ -4934,6 +4916,18 @@ msgstr "%s: übersprungen: öffentlicher Schlüssel ist abgeschaltet\n"
msgid "%s: skipped: public key already present\n"
msgstr "%s: übersprungen: öffentlicher Schlüssel bereits vorhanden\n"
+#, c-format
+msgid "can't encrypt to '%s'\n"
+msgstr "Verschlüsseln an '%s' ist nicht möglich\n"
+
+#, c-format
+msgid "option '%s' given, but no valid default keys given\n"
+msgstr "Option '%s' ohne gültige Standardschlüssel angegeben\n"
+
+#, c-format
+msgid "option '%s' given, but option '%s' not given\n"
+msgstr "Option '%s' ohne Verwendung der Option '%s' angegeben\n"
+
msgid "You did not specify a user ID. (you may use \"-r\")\n"
msgstr ""
"Sie haben keine User-ID angegeben (Sie können die Option \"-r\" verwenden).\n"
@@ -4980,10 +4974,6 @@ msgid "data not saved; use option \"--output\" to save it\n"
msgstr ""
"Daten wurden nicht gespeichert; verwenden Sie dafür die Option \"--output\"\n"
-#, c-format
-msgid "error creating '%s': %s\n"
-msgstr "Fehler beim Erstellen von `%s': %s\n"
-
msgid "Detached signature.\n"
msgstr "Abgetrennte Beglaubigungen.\n"
@@ -5070,26 +5060,42 @@ msgid "This is a revocation certificate for the OpenPGP key:"
msgstr "Dies ist ein Widerrufszertifikat für den OpenPGP Schlüssel:"
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 ""
+"Ein Widerrufszertifikat ist eine Art von Notausschalter der öffentlich\n"
+"verlautbart, daß ein Schlüssel nicht mehr benutzt werden soll. Es ist\n"
+"nicht möglich, ein einmal veröffentlichtes Widerrufszertifikat wieder\n"
+"zurückzuziehen."
+
+msgid ""
"Use it to revoke this key in case of a compromise or loss of\n"
"the secret key. However, if the secret key is still accessible,\n"
"it is better to generate a new revocation certificate and give\n"
-"a reason for the revocation."
+"a reason for the revocation. For details see the description of\n"
+"of the gpg command \"--gen-revoke\" in the GnuPG manual."
msgstr ""
"Benutzen Sie es, um einen Schlüssel zu widerrufen, falls der private\n"
"Schlüssel verloren wurde oder kompromittiert ist. Falls jedoch auf\n"
"den privaten Schlüssel noch zugegriffen werden kann, so ist es besser,\n"
"ein neues Widerrufszertifikat zu erzeugen, um den Grund des Widerrufs\n"
-"mit angeben zu können."
+"mit angeben zu können. Weitere Informationen finden Sie im GnuPG\n"
+"Handbuch unter der Beschreibung des gpg Kommandos \"--gen-revoke\"."
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 making use of this revocation certificate."
+"before importing and publishing this revocation certificate."
msgstr ""
"Um eine versehentliche Aktivierung des Widerrufszertifikats zu\n"
"vermeiden, wurde ein Doppelpunkt direkt vor den 5 Spiegelstrichen\n"
"unten eingefügt. Vor dem Import dieses Widerrufszertifikats\n"
-"entfernen Sie bitte dieses Doppelpunkt mittels eines Texteditors."
+"entfernen Sie bitte diesen Doppelpunkt mittels eines Texteditors."
+
+#, c-format
+msgid "revocation certificate stored as '%s.rev'\n"
+msgstr "Widerrufzertifikat wurde als '%s.rev' gespeichert.\n"
#, c-format
msgid "secret key \"%s\" not found\n"
@@ -5102,6 +5108,10 @@ msgstr "Geheimer Schlüssel \"%s\" nicht gefunden\n"
msgid "'%s' matches multiple secret keys:\n"
msgstr "'%s' trifft auf mehrere geheime Schlüssel zu:\n"
+#, c-format
+msgid "error searching the keyring: %s\n"
+msgstr "Fehler beim Suchen im Schlüsselbund: %s\n"
+
msgid "Create a revocation certificate for this key? (y/N) "
msgstr "Ein Widerrufszertifikat für diesen Schlüssel erzeugen? (j/N) "
@@ -5184,24 +5194,38 @@ msgstr "WARNUNG: Signaturunterschlüssel %s hat eine ungültige Rücksignatur\n"
#, c-format
msgid "public key %s is %lu second newer than the signature\n"
-msgstr "Öffentlicher Schlüssel %s ist %lu Sekunden jünger als die Signatur\n"
+msgid_plural "public key %s is %lu seconds newer than the signature\n"
+msgstr[0] "Öffentlicher Schlüssel %s ist %lu Sekunde jünger als die Signatur\n"
+msgstr[1] ""
+"Öffentlicher Schlüssel %s ist %lu Sekunden jünger als die Signatur\n"
#, c-format
-msgid "public key %s is %lu seconds newer than the signature\n"
-msgstr "Öffentlicher Schlüssel %s ist %lu Sekunden jünger als die Signatur\n"
+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] "Öffentlicher Schlüssel %s ist %lu Tag jünger als die Signatur\n"
+msgstr[1] "Öffentlicher Schlüssel %s ist %lu Tage jünger als die Signatur\n"
#, c-format
msgid ""
"key %s was created %lu second in the future (time warp or clock problem)\n"
-msgstr ""
+msgid_plural ""
+"key %s was created %lu seconds in the future (time warp or clock problem)\n"
+msgstr[0] ""
+"Schlüssel %s wurde %lu Sekunde in der Zukunft erzeugt (Zeitreise oder "
+"Uhrenproblem)\n"
+msgstr[1] ""
"Schlüssel %s wurde %lu Sekunden in der Zukunft erzeugt (Zeitreise oder "
"Uhrenproblem)\n"
#, c-format
-msgid ""
-"key %s was created %lu seconds in the future (time warp or clock problem)\n"
-msgstr ""
-"Schlüssel %s wurde %lu Sekunden in der Zukunft erzeugt (Zeitreise oder "
+msgid "key %s was created %lu day in the future (time warp or clock problem)\n"
+msgid_plural ""
+"key %s was created %lu days in the future (time warp or clock problem)\n"
+msgstr[0] ""
+"Schlüssel %s wurde %lu Tag in der Zukunft erzeugt (Zeitreise oder "
+"Uhrenproblem)\n"
+msgstr[1] ""
+"Schlüssel %s wurde %lu Tage in der Zukunft erzeugt (Zeitreise oder "
"Uhrenproblem)\n"
#, c-format
@@ -5436,6 +5460,267 @@ msgid "input line longer than %d characters\n"
msgstr "Eingabezeile ist länger als %d Zeichen\n"
#, c-format
+msgid "error beginning transaction on TOFU database: %s\n"
+msgstr "Fehler beim Starten einer Transaktion auf der TOFU Datenbank: %s\n"
+
+#, c-format
+msgid "error committing transaction on TOFU database: %s\n"
+msgstr "Fehler beim Committen einer Transaktion auf der TOFU Datenbank: %s\n"
+
+#, c-format
+msgid "error rolling back transaction on TOFU database: %s\n"
+msgstr ""
+"Fehler beim Zurückrollen einer Transaktion auf der TOFU Datenbank: %s\n"
+
+#, c-format
+msgid "unsupported TOFU database version: %s\n"
+msgstr "Nicht unterstützte TOFU Datenbank Version: %s\n"
+
+#, c-format
+msgid "error reading TOFU database: %s\n"
+msgstr "Fehler beim Lesen der TOFU Datenbank: %s\n"
+
+#, c-format
+msgid "error determining TOFU database's version: %s\n"
+msgstr "Fehler beim Feststellen der TOFU Datenbank Version: %s\n"
+
+#, c-format
+msgid "error initializing TOFU database: %s\n"
+msgstr "Fehler beim Initialisieren der TOFU Datenbank: %s\n"
+
+#, c-format
+msgid "error opening TOFU database '%s': %s\n"
+msgstr "Fehler beim Öffner der TOFU Datenbank '%s': %s\n"
+
+msgid "Warning: Home directory contains both tofu.db and tofu.d.\n"
+msgstr ""
+"WARNUNG: Das Home-Verzeichnis hat sowohl 'tofu.db' als auch 'tofu.d'.\n"
+
+msgid "Using split format for TOFU database\n"
+msgstr "Das \"Split\" Format wird für die TOFU Datenbank benutzt\n"
+
+#, c-format
+msgid "error updating TOFU database: %s\n"
+msgstr "Fehler beim Schreiben der TOFU Datenbank: %s\n"
+
+#, c-format
+msgid "public key %s not found: %s\n"
+msgstr "Öffentlicher Schlüssel %s nicht gefunden: %s\n"
+
+#, c-format
+msgid "error setting TOFU binding's trust level to %s\n"
+msgstr "Fehler beim Setzen der TOFU Binding Vertrauensstufe auf %s\n"
+
+#, c-format
+msgid "The binding %s is NOT known."
+msgstr "Die Bindung %s ist NICHT bekannt."
+
+#, c-format
+msgid ""
+"The key %s raised a conflict with this binding (%s). Since this binding's "
+"policy was 'auto', it was changed to 'ask'."
+msgstr ""
+"Der Schlüssel %s steht im Konflikt mit der Bindung (%s). Die Richtlinie "
+"dieser Bindung wurde deswegen von 'auto' auf 'ask' geändert."
+
+#, c-format
+msgid ""
+"Please indicate whether you believe the binding %s%sis legitimate (the key "
+"belongs to the stated owner) or a forgery (bad)."
+msgstr ""
+"Bitte geben Sie Ihre Einschätzung, ob die Bindung %s%s legitim (der "
+"Schlüssel gehört dem angegebenen Besitzer) oder eine Fälschung (ungültig) "
+"ist."
+
+#, c-format
+msgid "error gathering other user IDs: %s\n"
+msgstr "Fehler beim Einsammeln der übrigen User-IDs: %s\n"
+
+msgid "Known user IDs associated with this key:\n"
+msgstr "Bekannte, mit diesem Schlüssel assozierte, User-IDs:\n"
+
+#, c-format
+msgid "policy: %s"
+msgstr "Richtlinie: %s"
+
+#, c-format
+msgid "error gathering signature stats: %s\n"
+msgstr "Fehler beim Einsammeln der Signaturstatistik: %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] "Die Email-Adresse \"%s\" ist mit einem Schlüssel assoziert:\n"
+msgstr[1] "Die Email-Adresse \"%s\" ist mit %d Schlüsseln assoziert:\n"
+
+#, c-format
+msgid "Statistics for keys with the email address \"%s\":\n"
+msgstr "Statistik für Schlüssel mit der Email-Adresse \"%s\":\n"
+
+msgid "this key"
+msgstr "dieser Schlüssel"
+
+#, c-format
+msgid "%ld message signed in the future."
+msgid_plural "%ld messages signed in the future."
+msgstr[0] "%ld Nachricht in der Zukunft signiert."
+msgstr[1] "%ld Nachrichten in der Zukunf signiert."
+
+#, c-format
+msgid "%ld message signed"
+msgid_plural "%ld messages signed"
+msgstr[0] "%ld Nachricht signiert"
+msgstr[1] "%ld Nachrichten signiert"
+
+#, c-format
+msgid " over the past %ld day."
+msgid_plural " over the past %ld days."
+msgstr[0] " innerhalb des letzten Tages."
+msgstr[1] " innerhalb der letzten %ld Tage."
+
+#, c-format
+msgid " over the past %ld week."
+msgid_plural " over the past %ld weeks."
+msgstr[0] " innerhalb der letzten Woche."
+msgstr[1] " innerhalb der letzten %ld Wochen."
+
+#, c-format
+msgid " over the past %ld month."
+msgid_plural " over the past %ld months."
+msgstr[0] " innerhalb des letzten Monats."
+msgstr[1] " innerhalb der letzten %ld Monate."
+
+#. 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 ""
+"Normalerweise ist lediglich ein Schlüssel mit einer Email-Adresse "
+"assoziiert. Es kann allerdings vorkommen, daß Leute einen neuen Schlüssel "
+"erzeugen, wenn ihr alter Schlüssel zu alt ist oder wenn sie glauben, er "
+"könnte kompromittiert sein. Es kann allerdings auch sein, daß ein neuer "
+"Schlüssel einen Man-in-the-Middle Angriff aufzeigt! Bevor Sie diesen neuen "
+"Schlüssel akzeptieren, sollten sie die Person, auf einem anderen Weg, fragen "
+"ob der neue Schlüssel legitim ist."
+
+#. 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 "gGaAuUlLfF"
+
+msgid "(G)ood, (A)ccept once, (U)nknown, (R)eject once, (B)ad? "
+msgstr "(G)ut, einmal (A)kzeptieren, (U)nbekannt, einmal ab(L)ehnen, (F)alsch?"
+
+#, c-format
+msgid "error changing TOFU policy: %s\n"
+msgstr "Fehler beim Ändern der TOFU Richtlinie: %s\n"
+
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "%d Jahr"
+msgstr[1] "%d Jahre"
+
+#, c-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] "%d Monat"
+msgstr[1] "%d Monate"
+
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d Tag"
+msgstr[1] "%d Tage"
+
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d Stunde"
+msgstr[1] "%d Stunden"
+
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d Minute"
+msgstr[1] "%d Minuten"
+
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d Sekunde"
+msgstr[1] "%d Sekunden"
+
+#, c-format
+msgid "Have never verified a message signed by key %s!\n"
+msgstr "Es wurde noch keine Nachricht mit dem Schlüssel %s überprüft!\n"
+
+#, c-format
+msgid "Failed to collect signature statistics for \"%s\" (key %s)\n"
+msgstr ""
+"Signaturstatistiken für \"%s\" (Schlüssel %s) konnten nicht gesammelt "
+"werden\n"
+
+#, c-format
+msgid "Verified 0 messages signed by \"%s\" (key: %s, policy: %s)."
+msgstr ""
+"Keine von \"%s\" signierten Nachrichten überprüft (Schl.: %s, Richtl.: %s)."
+
+#. TRANSLATORS: The final %s is replaced by a string like
+#. "7 months, 1 day, 5 minutes, 0 seconds".
+#, c-format
+msgid ""
+"Verified %ld message signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgid_plural ""
+"Verified %ld messages signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgstr[0] ""
+"%ld von \"%s\" (Schl.: %s, Richtl.: %s) signierte Nachricht in den letzten "
+"%s überprüft."
+msgstr[1] ""
+"%ld von \"%s\" (Schl.: %s, Richtl.: %s) signierte Nachrichten in den letzten "
+"%s überprüft."
+
+#, c-format
+msgid "The most recent message was verified %s ago."
+msgstr "Die neueste Nachricht wurde vor %s überprüft."
+
+msgid "Warning: we've have yet to see a message signed by this key!\n"
+msgstr ""
+"WARNUNG: Wir müssen noch eine mit diesem Schlüssel signierte Nachricht "
+"sehen.\n"
+
+msgid "Warning: we've only seen a single message signed by this key!\n"
+msgstr ""
+"WARNUNG: Wir haben nur eine einzige mit diesem Schlüssel signierte Nachricht "
+"gesehen.\n"
+
+#. TRANSLATORS: translate the below text. We don't
+#. directly internationalize that text so that we can
+#. tweak it without breaking translations.
+#, c-format
+msgid "TOFU: few signatures %d message %s"
+msgid_plural "TOFU: few signatures %d messages %s"
+msgstr[0] ""
+"WARNUNG: Falls sie glauben, mehr als %d mit diesem Schlüssel signierte\n"
+"Nachricht erhalten zu haben, so kann es sich bei diesem Schlüssel um\n"
+"eine Fälschung handeln! Prüfen Sie die Email-Adresse genau auf kleine\n"
+"Variationen (z.B. zusätzliche Leerzeichen). Falls Ihnen der Schlüssel\n"
+"suspekt erscheint, so benutzen Sie '%s' um den Schlüssel als Fälschung\n"
+"zu markieren."
+msgstr[1] ""
+"WARNUNG: Falls sie glauben, mehr als %d mit diesem Schlüssel signierte\n"
+"Nachrichten erhalten zu haben, so kann es sich bei diesem Schlüssel um\n"
+"eine Fälschung handeln! Prüfen Sie die Email-Adresse genau auf kleine\n"
+"Variationen (z.B. zusätzliche Leerzeichen). Falls Ihnen der Schlüssel\n"
+"suspekt erscheint, so benutzen Sie '%s' um den Schlüssel als Fälschung\n"
+"zu markieren."
+
+#, c-format
+msgid "error opening TOFU database: %s\n"
+msgstr "Fehler beim Öffnen der TOFU Datenbank: %s\n"
+
+#, c-format
msgid "'%s' is not a valid long keyID\n"
msgstr "'%s' ist keine gültige lange Schlüssel-ID\n"
@@ -5498,20 +5783,24 @@ msgstr "\"Trust-DB\"-Überprüfung ist beim `%s'-Vertrauensmodell nicht nötig\n
msgid "no need for a trustdb update with '%s' trust model\n"
msgstr "\"Trust-DB\"-Änderung ist beim `%s'-Vertrauensmodell nicht nötig\n"
-#, c-format
-msgid "public key %s not found: %s\n"
-msgstr "Öffentlicher Schlüssel %s nicht gefunden: %s\n"
-
msgid "please do a --check-trustdb\n"
msgstr "Bitte ein --check-trustdb durchführen\n"
msgid "checking the trustdb\n"
msgstr "\"Trust-DB\" wird überprüft\n"
+#, c-format
+msgid "%d key processed"
+msgid_plural "%d keys processed"
+msgstr[0] "%d Schlüssel bislang bearbeitet"
+msgstr[1] "%d Schlüssel bislang bearbeitet"
+
# translated by wk
#, c-format
-msgid "%d keys processed (%d validity counts cleared)\n"
-msgstr "%d Schlüssel verarbeitet (%d Validity Zähler gelöscht)\n"
+msgid " (%d validity count cleared)\n"
+msgid_plural " (%d validity counts cleared)\n"
+msgstr[0] " (%d Validity Zähler gelöscht)\n"
+msgstr[1] " (%d Validity Zähler gelöscht)\n"
msgid "no ultimately trusted keys found\n"
msgstr "keine ultimativ vertrauenswürdigen Schlüssel gefunden\n"
@@ -5521,10 +5810,6 @@ msgid "public key of ultimately trusted key %s not found\n"
msgstr "öff. Schlüssel des ultimativ vertrauten Schlüssel %s nicht gefunden\n"
#, c-format
-msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
-msgstr "%d marginal-needed, %d complete-needed, %s Vertrauensmodell\n"
-
-#, c-format
msgid ""
"depth: %d valid: %3d signed: %3d trust: %d-, %dq, %dn, %dm, %df, %du\n"
msgstr ""
@@ -5731,8 +6016,11 @@ msgid "card is permanently locked!\n"
msgstr "Karte ist dauerhaft gesperrt!\n"
#, c-format
-msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
-msgstr "Noch %d Admin-PIN-Versuche, bis die Karte dauerhaft gesperrt ist\n"
+msgid "%d Admin PIN attempt remaining before card is permanently locked\n"
+msgid_plural ""
+"%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr[0] "Noch %d Admin-PIN-Versuch, bis die Karte dauerhaft gesperrt ist\n"
+msgstr[1] "Noch %d Admin-PIN-Versuche, bis die Karte dauerhaft gesperrt ist\n"
#. TRANSLATORS: Do not translate the "|A|" prefix but keep it at
#. the start of the string. Use %%0A to force a linefeed.
@@ -5810,8 +6098,10 @@ msgid "generating key failed\n"
msgstr "Schlüsselerzeugung fehlgeschlagen\n"
#, c-format
-msgid "key generation completed (%d seconds)\n"
-msgstr "Schlüsselerzeugung abgeschlossen (%d Sekunden)\n"
+msgid "key generation completed (%d second)\n"
+msgid_plural "key generation completed (%d seconds)\n"
+msgstr[0] "Schlüsselerzeugung abgeschlossen (%d Sekunde)\n"
+msgstr[1] "Schlüsselerzeugung abgeschlossen (%d Sekunden)\n"
msgid "invalid structure of OpenPGP card (DO 0x93)\n"
msgstr "Ungültige Struktur der OpenPGP-Karte (DO 0x93)\n"
@@ -7963,6 +8253,9 @@ msgstr "|N|Lasse die Passphrase nach N Tagen verfallen"
msgid "do not allow the reuse of old passphrases"
msgstr "Verbiete die Wiedernutzung alter Passphrases."
+msgid "|N|set the Pinentry timeout to N seconds"
+msgstr "|N|Setze die Pinentry Zeitüberschreitung auf N Sekunden"
+
msgid "|NAME|use NAME as default secret key"
msgstr "|NAME|NAME als voreingestellten Schlüssel benutzen"
@@ -8252,27 +8545,167 @@ msgstr ""
"Syntax: gpg-check-pattern [optionen] Musterdatei\n"
"Die von stdin gelesene Passphrase gegen die Musterdatei prüfen\n"
-#~ msgid "cleared passphrase cached with ID: %s\n"
-#~ msgstr "Passphrase aus dem Cache gelöscht. Cache ID: %s\n"
+#~ msgid "sending key %s to %s server %s\n"
+#~ msgstr "sende Schlüssel %s auf den %s-Server %s\n"
+
+#~ msgid "error commiting transaction on TOFU database: %s\n"
+#~ msgstr ""
+#~ "Fehler beim Committen einer Transaktion auf der TOFU Datenbank: %s\n"
+
+#, fuzzy
+#~| msgid "error binding socket to '%s': %s\n"
+#~ msgid "error beginning %s transaction on TOFU database '%s': %s\n"
+#~ msgstr "Der Socket kann nicht an `%s' gebunden werden: %s\n"
+
+#, fuzzy
+#~| msgid "error retrieving '%s' via %s: %s\n"
+#~ msgid "error querying TOFU DB's available tables: %s\n"
+#~ msgstr "Fehler beim automatischen holen von `%s' über `%s': %s\n"
+
+#, fuzzy
+#~| msgid "error reading nonce on fd %d: %s\n"
+#~ msgid "error aborting transaction on TOFU DB: %s\n"
+#~ msgstr "Fehler beim Lesen der \"Nonce\" von FD %d: %s\n"
+
+#, fuzzy
+#~| msgid "error getting version from '%s': %s\n"
+#~ msgid "error committing transaction on TOFU DB: %s\n"
+#~ msgstr "Fehler beim Holen der Version von '%s': %s\n"
+
+#, fuzzy
+#~| msgid "can't open '%s': %s\n"
+#~ msgid "can't open TOFU DB ('%s'): %s\n"
+#~ msgstr "'%s' kann nicht geöffnet werden: %s\n"
+
+#, fuzzy
+#~| msgid "can't create directory '%s': %s\n"
+#~ msgid "unable to create directory %s/%s/%s/%s"
+#~ msgstr "Verzeichnis `%s' kann nicht erzeugt werden: %s\n"
+
+#, fuzzy
+#~| msgid "error reading from responder: %s\n"
+#~ msgid "error reading from TOFU database: bad value for policy: %s\n"
+#~ msgstr "Fehler beim Lesen vom Responder: %s\n"
#, fuzzy
-#~ msgid "Failed to open the keyring DB.\n"
-#~ msgstr "Fehler beim Öffnen der Schlüsseldatenbank.\n"
+#~| msgid "error reading from responder: %s\n"
+#~ msgid "error reading from TOFU database (listing fingerprints): %s\n"
+#~ msgstr "Fehler beim Lesen vom Responder: %s\n"
#, fuzzy
+#~| msgid "error opening key DB: %s\n"
+#~ msgid "error opening TOFU DB.\n"
+#~ msgstr "Fehler beim Öffnen der Schlüsseldatenbank: %s\n"
+
+#, fuzzy
+#~| msgid "key %s: %s\n"
+#~ msgid " %s\n"
+#~ msgstr "Schlüssel %s: %s\n"
+
+#, fuzzy
+#~| msgid " s = skip this key\n"
+#~ msgid " %s (this key):"
+#~ msgstr " s = diesen Schlüssel überspringen\n"
+
+#~ msgid "key specification '%s' is ambiguous\n"
+#~ msgstr "Schlüsselangabe '%s' ist mehrdeutig\n"
+
+#~ msgid "'%s' matches at least:\n"
+#~ msgstr "'%s' paßt mindest auf:\n"
+
+#~ msgid "%d signatures not checked due to missing keys\n"
+#~ msgstr "%d Beglaubigungen wegen fehlenden Schlüsseln nicht geprüft\n"
+
+#~ msgid "%d signatures not checked due to errors\n"
+#~ msgstr "%d Beglaubigungen aufgrund von Fehlern nicht geprüft\n"
+
+#~ msgid "1 user ID without valid self-signature detected\n"
+#~ msgstr "Eine User-ID ohne gültige Eigenbeglaubigung entdeckt\n"
+
+#~ msgid "Deleted %d signatures.\n"
+#~ msgstr "%d Beglaubigungen entfernt.\n"
+
+#~ msgid "User ID \"%s\": %d signatures removed\n"
+#~ msgstr "User-ID \"%s\": %d Signaturen entfernt\n"
+
+#~ msgid ""
+#~ "You need a Passphrase to protect your secret key.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Sie benötigen eine Passphrase, um den geheimen Schlüssel zu schützen.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Please enter a passphrase to protect the off-card backup of the new "
+#~ "encryption key."
+#~ msgstr ""
+#~ "Bitte geben Sie die Passphrase ein, um die Sicherheitskopie des neuen "
+#~ "Verschlüsselungsschlüssel der Karte zu schützen."
+
+#~ msgid "passphrase not correctly repeated; try again"
+#~ msgstr "Passphrase wurde nicht richtig wiederholt; noch einmal versuchen"
+
+#~ msgid "%s.\n"
+#~ msgstr "%s.\n"
+
+#~ msgid ""
+#~ "You don't want a passphrase - this is probably a *bad* idea!\n"
+#~ "I will do it anyway. You can change your passphrase at any time,\n"
+#~ "using this program with the option \"--edit-key\".\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Sie möchten keine Passphrase - Dies ist *nicht* zu empfehlen!\n"
+#~ "Es ist trotzdem möglich. Sie können Ihre Passphrase jederzeit\n"
+#~ "ändern, indem sie dieses Programm mit dem Befehl \"--edit-key\"\n"
+#~ "aufrufen.\n"
+#~ "\n"
+
+#~ msgid "storing key onto card failed: %s\n"
+#~ msgstr "Speicher des Schlüssels auf der Karte schlug fehl: %s\n"
+
+#~ msgid "1 good signature\n"
+#~ msgstr "1 korrekte Signatur\n"
+
+#~ msgid "renaming '%s' to '%s' failed: %s\n"
+#~ msgstr "umbenennen von `%s' nach `%s' schlug fehl: %s\n"
+
+#~ msgid "%lu keys cached (%lu signatures)\n"
+#~ msgstr "%lu Schlüssel gepuffert (%lu Beglaubigungen)\n"
+
+#~ msgid "refreshing 1 key from %s\n"
+#~ msgstr "ein Schlüssel wird per %s aktualisiert\n"
+
+#~ msgid "public key %s is %lu seconds newer than the signature\n"
+#~ msgstr ""
+#~ "Öffentlicher Schlüssel %s ist %lu Sekunden jünger als die Signatur\n"
+
+#~ msgid ""
+#~ "key %s was created %lu seconds in the future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "Schlüssel %s wurde %lu Sekunden in der Zukunft erzeugt (Zeitreise oder "
+#~ "Uhrenproblem)\n"
+
+#~ msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
+#~ msgstr "%d marginal-needed, %d complete-needed, %s Vertrauensmodell\n"
+
+#~ msgid "cleared passphrase cached with ID: %s\n"
+#~ msgstr "Passphrase aus dem Cache gelöscht. Cache ID: %s\n"
+
+#~ msgid "Failed to open the keyring DB\n"
+#~ msgstr "Fehler beim Öffnen der Schlüsseldatenbank\n"
+
#~| msgid "failed to open '%s': %s\n"
#~ msgid "Failed to parse '%s'.\n"
-#~ msgstr "Datei `%s' kann nicht geöffnet werden: %s\n"
+#~ msgstr "Datei `%s' kann nicht gescannt werden\n"
-#, fuzzy
#~| msgid "invalid value\n"
#~ msgid "invalid value '%s'\n"
-#~ msgstr "Ungültiger Wert.\n"
+#~ msgstr "Ungültiger Wert '%s'\n"
-#, fuzzy
#~| msgid "error reading secret keyblock \"%s\": %s\n"
#~ msgid "error looking up secret key \"%s\": %s\n"
-#~ msgstr "Fehler beim Lesen des geheimen Schlüsselblocks \"%s\": %s\n"
+#~ msgstr "Fehler beim Nachschlagen der geheimen Schlüssels \"%s\": %s\n"
#~ msgid "Please select at most one subkey.\n"
#~ msgstr "Bitte wählen Sie höchstens einen Unterschlüssel aus.\n"
@@ -8507,9 +8940,6 @@ msgstr ""
#~ msgid "searching for \"%s\" from %s\n"
#~ msgstr "suche nach \"%s\" auf %s\n"
-#~ msgid "no keyserver action!\n"
-#~ msgstr "Kein Schlüsselserver-Vorgang\n"
-
#~ msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n"
#~ msgstr ""
#~ "WARNUNG: Die Schlüsselserver-Handhabungsroutine stammt von einer anderen "
diff --git a/po/el.po b/po/el.po
index 6c79f4c..ed66200 100644
--- a/po/el.po
+++ b/po/el.po
@@ -1241,6 +1241,20 @@ msgid "Enter passphrase: "
msgstr "ÐëçêôñïëïãÞóôå ôç öñÜóç êëåéäß: "
#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "error getting version from '%s': %s\n"
+msgstr "áäõíáìßá äçìéïõñãßáò ôçò êëåéäïèÞêçò `%s': %s\n"
+
+#, c-format
+msgid "server '%s' is older than us (%s < %s)"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "WARNING: %s overrides %s\n"
+msgid "WARNING: %s\n"
+msgstr "ÐÑÏÅÉÄÏÐÏÉÇÓÇ: ôï %s ðáñáêÜìðôåé ôï %s\n"
+
+#, fuzzy, c-format
msgid "OpenPGP card not available: %s\n"
msgstr "ôï ìõóôéêü êëåéäß äåí åßíáé äéáèÝóéìï"
@@ -1751,6 +1765,11 @@ msgid "remove as much as possible from key during export"
msgstr ""
#, fuzzy
+#| msgid "%s: skipped: %s\n"
+msgid " - skipped"
+msgstr "%s: ðáñáëåßöèçêå: %s\n"
+
+#, fuzzy
msgid "exporting secret keys not allowed\n"
msgstr "åããñáöÞ ôïõ ìõóôéêïý êëåéäéïý óôï `%s'\n"
@@ -1763,19 +1782,36 @@ msgid "key %s: key material on-card - skipped\n"
msgstr ""
"êëåéäß %08lX: ç õðïãñáöÞ ôïõ õðïêëåéäéïý óå ëÜèïò óçìåßï - ðáñáëåßöèçêå\n"
-#, fuzzy
-#| msgid "%s: skipped: %s\n"
-msgid " - skipped"
-msgstr "%s: ðáñáëåßöèçêå: %s\n"
-
msgid "WARNING: nothing exported\n"
msgstr "ÐÑÏÅÉÄÏÐÏÉÇÓÇ: äåí Ýãéíå êáììßá åîáãùãÞ\n"
+#, fuzzy, c-format
+#| msgid "error creating `%s': %s\n"
+msgid "error creating '%s': %s\n"
+msgstr "óöÜëìá êáôÜ ôç äçìéïõñãßá ôïõ `%s': %s\n"
+
#, fuzzy
msgid "[User ID not found]"
msgstr "[User id äåí âñÝèçêå]"
#, fuzzy, c-format
+msgid "(check argument of option '%s')\n"
+msgstr "ìç Ýãêõñåò åðéëïãÝò åéãáãùãÞò\n"
+
+#, c-format
+msgid "Warning: '%s' should be a long key ID or a fingerprint\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error looking up: %s\n"
+msgstr "óöÜëìá êáôÜ ôçí áíÜãíùóç ôïõ `%s': %s\n"
+
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "Warning: %s appears in the keyring %d times\n"
+msgstr "áäõíáìßá äçìéïõñãßáò ôçò êëåéäïèÞêçò `%s': %s\n"
+
+#, fuzzy, c-format
msgid "automatically retrieved '%s' via %s\n"
msgstr "óöÜëìá êáôÜ ôç äçìéïõñãßá ôïõ `%s': %s\n"
@@ -1792,14 +1828,19 @@ msgid "secret key \"%s\" not found: %s\n"
msgstr "ôï ìõóôéêü êëåéäß `%s' äå âñÝèçêå: %s\n"
#, fuzzy, c-format
-msgid "(check argument of option '%s')\n"
-msgstr "ìç Ýãêõñåò åðéëïãÝò åéãáãùãÞò\n"
+#| msgid "|NAME|use NAME as default secret key"
+msgid "Warning: not using '%s' as default key: %s\n"
+msgstr "|ÏÍÏÌÁ|÷ñÞóç ÏÍÏÌÁôïò óáí ðñïêáèïñéóìÝíï ìõóôéêü êëåéäß"
#, fuzzy, c-format
#| msgid "|NAME|use NAME as default secret key"
-msgid "using \"%s\" as default secret key\n"
+msgid "using \"%s\" as default secret key for signing\n"
msgstr "|ÏÍÏÌÁ|÷ñÞóç ÏÍÏÌÁôïò óáí ðñïêáèïñéóìÝíï ìõóôéêü êëåéäß"
+#, c-format
+msgid "all values passed to '%s' ignored\n"
+msgstr ""
+
#, fuzzy, c-format
msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
msgstr ""
@@ -2161,28 +2202,6 @@ msgid "Note: old default options file '%s' ignored\n"
msgstr "ÓÇÌÅÉÙÓÇ: áãíïÞèçêå ôï ðáëéü áñ÷åßï ðñïêáèïñéóìÝíùí åðéëïãþí `%s'\n"
#, c-format
-msgid ""
-"Warning: value '%s' for option '%s' should be a long key ID or a "
-"fingerprint\n"
-msgstr ""
-
-#, c-format
-msgid "key specification '%s' is ambiguous\n"
-msgstr ""
-
-#. TRANSLATORS: The %s prints a key specification which
-#. for example has been given at the command line. Two
-#. lines with fingerprints are printed after this message.
-#, c-format
-msgid "'%s' matches at least:\n"
-msgstr ""
-
-#, fuzzy, c-format
-#| msgid "error creating keyring `%s': %s\n"
-msgid "error searching the keyring: %s\n"
-msgstr "áäõíáìßá äçìéïõñãßáò ôçò êëåéäïèÞêçò `%s': %s\n"
-
-#, c-format
msgid "libgcrypt is too old (need %s, have %s)\n"
msgstr ""
@@ -2393,14 +2412,6 @@ msgstr ""
"ÐÑÏÅÉÄÏÐÏÉÇÓÇ: äþèçêáí ðáñáëÞðôåò (-r) ÷þñéò ÷ñÞóç êñõðôïãñÜöçóçò\n"
"äçìïóßïõ êëåéäéïý\n"
-#, fuzzy, c-format
-msgid "option '%s' given, but no valid default keys given\n"
-msgstr "ìç Ýãêõñïò áëãüñéèìïò hash `%s'\n"
-
-#, fuzzy, c-format
-msgid "option '%s' given, but option '%s' not given\n"
-msgstr "ìç Ýãêõñïò áëãüñéèìïò hash `%s'\n"
-
msgid "--store [filename]"
msgstr "--store [üíïìá áñ÷åßïõ]"
@@ -2476,6 +2487,11 @@ msgstr "keyserver ëÞøç áðÝôõ÷å: %s\n"
msgid "key export failed: %s\n"
msgstr "åîáãùãÞ êëåéäéïý áðÝôõ÷å: %s\n"
+#, fuzzy, c-format
+#| msgid "key export failed: %s\n"
+msgid "export as ssh key failed: %s\n"
+msgstr "åîáãùãÞ êëåéäéïý áðÝôõ÷å: %s\n"
+
#, c-format
msgid "keyserver search failed: %s\n"
msgstr "keyserver áíáæÞôçóç áðÝôõ÷å: %s\n"
@@ -2972,33 +2988,33 @@ msgstr "[áíÜêëçóç]"
msgid "[self-signature]"
msgstr "[éäéï-õðïãñáöÞ]"
-msgid "1 bad signature\n"
-msgstr "1 êáêÞ õðïãñáöÞ\n"
-
-#, c-format
-msgid "%d bad signatures\n"
-msgstr "%d êáêÝò õðïãñáöÝò\n"
-
-msgid "1 signature not checked due to a missing key\n"
-msgstr "1 õðïãñáöÞ äåí åëÝã÷èçêå ëüãù ÷áìÝíïõ êëåéäéïý\n"
-
-#, c-format
-msgid "%d signatures not checked due to missing keys\n"
-msgstr "%d õðïãñáöÝò äåí åëÝã÷èçêáí ëüãù ÷áìÝíùí êëåéäéþí\n"
-
-msgid "1 signature not checked due to an error\n"
-msgstr "1 õðïãñáöÞ äåí åëÝã÷èçêå ëüãï åíüò óöÜëìáôïò\n"
+#, fuzzy, c-format
+#| msgid "%d bad signatures\n"
+msgid "%d bad signature\n"
+msgid_plural "%d bad signatures\n"
+msgstr[0] "%d êáêÝò õðïãñáöÝò\n"
+msgstr[1] "%d êáêÝò õðïãñáöÝò\n"
-#, c-format
-msgid "%d signatures not checked due to errors\n"
-msgstr "%d õðïãñáöÝò äåí åëÝã÷èçêáí ëüãù óöáëìÜôùí\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to a missing key\n"
+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 õðïãñáöÞ äåí åëÝã÷èçêå ëüãù ÷áìÝíïõ êëåéäéïý\n"
+msgstr[1] "1 õðïãñáöÞ äåí åëÝã÷èçêå ëüãù ÷áìÝíïõ êëåéäéïý\n"
-msgid "1 user ID without valid self-signature detected\n"
-msgstr "1 user ID áíé÷íåýôçêå ÷ùñßò Ýãêõñç éäéï-õðïãñáöÞ\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to an error\n"
+msgid "%d signature not checked due to an error\n"
+msgid_plural "%d signatures not checked due to errors\n"
+msgstr[0] "1 õðïãñáöÞ äåí åëÝã÷èçêå ëüãï åíüò óöÜëìáôïò\n"
+msgstr[1] "1 õðïãñáöÞ äåí åëÝã÷èçêå ëüãï åíüò óöÜëìáôïò\n"
-#, c-format
-msgid "%d user IDs without valid self-signatures detected\n"
-msgstr "%d user ID áíé÷íåýèçêáí ÷ùñßò Ýãêõñåò éäéï-õðïãñáöÝò\n"
+#, fuzzy, c-format
+#| msgid "%d user IDs without valid self-signatures detected\n"
+msgid "%d user ID without valid self-signature detected\n"
+msgid_plural "%d user IDs without valid self-signatures detected\n"
+msgstr[0] "%d user ID áíé÷íåýèçêáí ÷ùñßò Ýãêõñåò éäéï-õðïãñáöÝò\n"
+msgstr[1] "%d user ID áíé÷íåýèçêáí ÷ùñßò Ýãêõñåò éäéï-õðïãñáöÝò\n"
#, fuzzy
msgid ""
@@ -3639,13 +3655,12 @@ msgstr "ÄéáãñáöÞ áõôÞò ôçò Üãíùóôçò õðïãñáöÞò; (y/N/q)"
msgid "Really delete this self-signature? (y/N)"
msgstr "Óßãïõñá íá äéáãñáöåß áõôÞ ç éäéï-õðïãñáöÞ; (y/N)"
-#, c-format
+#, fuzzy, c-format
+#| msgid "Deleted %d signature.\n"
msgid "Deleted %d signature.\n"
-msgstr "ÄéáãñÜöôçêå %d õðïãñáöÞ.\n"
-
-#, c-format
-msgid "Deleted %d signatures.\n"
-msgstr "ÄéáãñÜöçêáí %d õðïãñáöÝò.\n"
+msgid_plural "Deleted %d signatures.\n"
+msgstr[0] "ÄéáãñÜöôçêå %d õðïãñáöÞ.\n"
+msgstr[1] "ÄéáãñÜöôçêå %d õðïãñáöÞ.\n"
msgid "Nothing deleted.\n"
msgstr "Ôßðïôá äåí äéáãñÜöôçêå.\n"
@@ -3660,11 +3675,9 @@ msgstr "Ôï user ID \"%s\" áíáêáëåßôå."
#, fuzzy, c-format
msgid "User ID \"%s\": %d signature removed\n"
-msgstr "Ôï user ID \"%s\" áíáêáëåßôå."
-
-#, fuzzy, c-format
-msgid "User ID \"%s\": %d signatures removed\n"
-msgstr "Ôï user ID \"%s\" áíáêáëåßôå."
+msgid_plural "User ID \"%s\": %d signatures removed\n"
+msgstr[0] "Ôï user ID \"%s\" áíáêáëåßôå."
+msgstr[1] "Ôï user ID \"%s\" áíáêáëåßôå."
#, fuzzy, c-format
msgid "User ID \"%s\": already minimized\n"
@@ -4210,37 +4223,6 @@ msgid "Please correct the error first\n"
msgstr "Ðáñáêáëþ, äéïñèþóôå ðñþôá ôï óöÜëìá\n"
msgid ""
-"You need a Passphrase to protect your secret key.\n"
-"\n"
-msgstr ""
-"×ñåéÜæåóôå ìéá ÖñÜóç êëåéäß ãéá íá ðñïóôáôåýóåôå ôï ìõóôéêü êëåéäß.\n"
-"\n"
-
-#, fuzzy
-msgid ""
-"Please enter a passphrase to protect the off-card backup of the new "
-"encryption key."
-msgstr "ÐëçêôñïëïãÞóôå ôç öñÜóç êëåéäß· áõôÞ åßíáé ìéá ìõóôéêÞ ðñüôáóç \n"
-
-msgid "passphrase not correctly repeated; try again"
-msgstr "ç öñÜóç êëåéäß äåí åðáíáëÞöèçêå óùóôÜ. ÄïêéìÜóôå îáíÜ"
-
-#, c-format
-msgid "%s.\n"
-msgstr "%s.\n"
-
-msgid ""
-"You don't want a passphrase - this is probably a *bad* idea!\n"
-"I will do it anyway. You can change your passphrase at any time,\n"
-"using this program with the option \"--edit-key\".\n"
-"\n"
-msgstr ""
-"Äåí ÷ñåéÜæåóôå ìéá öñÜóç êëåéäß - áõôü åßíáé ìÜëëïí ìéá *êáêÞ* éäÝá!\n"
-"Èá óõíå÷ßóù üðùò êáé íá Ý÷åé. Ìðïñåßôå íá áëëÜîåôå ôç öñÜóç óáò\n"
-"üðïôå èÝëåôå, ìå ôçí åðéëïãÞ \"--edit-key\".\n"
-"\n"
-
-msgid ""
"We need to generate a lot of random bytes. It is a good idea to perform\n"
"some other action (type on the keyboard, move the mouse, utilize the\n"
"disks) during the prime generation; this gives the random number\n"
@@ -4285,6 +4267,14 @@ msgid "Key generation canceled.\n"
msgstr "Ç äçìéïõñãßá êëåéäéïý áíáâëÞèçêå.\n"
#, fuzzy, c-format
+msgid "can't create backup file '%s': %s\n"
+msgstr "áäõíáìßá äçìéïõñãßáò ôïõ `%s': %s\n"
+
+#, fuzzy, c-format
+msgid "Note: backup of card key saved to '%s'\n"
+msgstr "ÓÇÌÅÉÙÓÇ: ôï ìõóôéêü êëåéäß %08lX Ýëçîå óôéò %s\n"
+
+#, fuzzy, c-format
#| msgid "writing public key to `%s'\n"
msgid "writing public key to '%s'\n"
msgstr "åããñáöÞ ôïõ äçìïóßïõ êëåéäéïý óôï `%s'\n"
@@ -4343,18 +4333,6 @@ msgstr "ÌõóôéêÜ ôìÞìáôá ôïõ êýñéïõ êëåéäéïý äåí åßíáé äéáèÝóéìá.\n"
msgid "Really create? (y/N) "
msgstr "Óßãïõñá íá äçìéïõñãçèåß; "
-#, fuzzy, c-format
-msgid "storing key onto card failed: %s\n"
-msgstr "äéáãñáöÞ block êëåéäéþí áðÝôõ÷å: %s\n"
-
-#, fuzzy, c-format
-msgid "can't create backup file '%s': %s\n"
-msgstr "áäõíáìßá äçìéïõñãßáò ôïõ `%s': %s\n"
-
-#, fuzzy, c-format
-msgid "Note: backup of card key saved to '%s'\n"
-msgstr "ÓÇÌÅÉÙÓÇ: ôï ìõóôéêü êëåéäß %08lX Ýëçîå óôéò %s\n"
-
msgid "never "
msgstr "ðïôÝ "
@@ -4373,19 +4351,18 @@ msgstr "Óçìåßùóç êñßóéìçò õðïãñáöÞò: "
msgid "Signature notation: "
msgstr "Óçìåßùóç õðïãñáöÞò: "
-#, fuzzy
-#| msgid "1 bad signature\n"
-msgid "1 good signature\n"
-msgstr "1 êáêÞ õðïãñáöÞ\n"
-
#, fuzzy, c-format
#| msgid "%d bad signatures\n"
-msgid "%d good signatures\n"
-msgstr "%d êáêÝò õðïãñáöÝò\n"
+msgid "%d good signature\n"
+msgid_plural "%d good signatures\n"
+msgstr[0] "%d êáêÝò õðïãñáöÝò\n"
+msgstr[1] "%d êáêÝò õðïãñáöÝò\n"
#, c-format
-msgid "Warning: %lu key(s) skipped due to their large size\n"
-msgstr ""
+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] ""
msgid "Keyring"
msgstr "ÊëåéäïèÞêç"
@@ -4416,20 +4393,27 @@ msgid " Card serial no. ="
msgstr ""
#, fuzzy, c-format
-msgid "renaming '%s' to '%s' failed: %s\n"
-msgstr "èùñÜêéóç áðÝôõ÷å: %s\n"
-
-#, fuzzy, c-format
msgid "caching keyring '%s'\n"
msgstr "Ýëåã÷ïò êëåéäïèÞêçò `%s'\n"
#, fuzzy, c-format
-msgid "%lu keys cached so far (%lu signatures)\n"
-msgstr "%lu êëåéäéÜ Ý÷ïõí åëåã÷èåß (%lu õðïãñáöÝò)\n"
+msgid "%lu keys cached so far (%lu signature)\n"
+msgid_plural "%lu keys cached so far (%lu signatures)\n"
+msgstr[0] "%lu êëåéäéÜ Ý÷ïõí åëåã÷èåß (%lu õðïãñáöÝò)\n"
+msgstr[1] "%lu êëåéäéÜ Ý÷ïõí åëåã÷èåß (%lu õðïãñáöÝò)\n"
+
+#, c-format
+msgid "%lu key cached"
+msgid_plural "%lu keys cached"
+msgstr[0] ""
+msgstr[1] ""
#, fuzzy, c-format
-msgid "%lu keys cached (%lu signatures)\n"
-msgstr "%lu êëåéäéÜ Ý÷ïõí åëåã÷èåß (%lu õðïãñáöÝò)\n"
+#| msgid "1 bad signature\n"
+msgid " (%lu signature)\n"
+msgid_plural " (%lu signatures)\n"
+msgstr[0] "1 êáêÞ õðïãñáöÞ\n"
+msgstr[1] "1 êáêÞ õðïãñáöÞ\n"
#, c-format
msgid "%s: keyring created\n"
@@ -4473,18 +4457,16 @@ msgid "\"%s\" not a key ID: skipping\n"
msgstr ""
#, fuzzy, c-format
-msgid "refreshing 1 key from %s\n"
-msgstr "áßôçóç êëåéäéïý %08lX áðü ôï %s\n"
+msgid "refreshing %d key from %s\n"
+msgid_plural "refreshing %d keys from %s\n"
+msgstr[0] "áßôçóç êëåéäéïý %08lX áðü ôï %s\n"
+msgstr[1] "áßôçóç êëåéäéïý %08lX áðü ôï %s\n"
#, fuzzy, c-format
msgid "WARNING: unable to refresh key %s via %s: %s\n"
msgstr "ÐÑÏÅÉÄÏÐÏÉÇÓÇ: áäõíáìßá äéáãñáöÞò tempfile (%s) `%s': %s\n"
#, fuzzy, c-format
-msgid "refreshing %d keys from %s\n"
-msgstr "áßôçóç êëåéäéïý %08lX áðü ôï %s\n"
-
-#, fuzzy, c-format
msgid "key \"%s\" not found on keyserver\n"
msgstr "ôï êëåéäß '%s' äå âñÝèçêå: %s\n"
@@ -4503,9 +4485,9 @@ msgstr "áßôçóç êëåéäéïý %08lX áðü ôï %s\n"
msgid "requesting key %s from %s\n"
msgstr "áßôçóç êëåéäéïý %08lX áðü ôï %s\n"
-#, fuzzy, c-format
-msgid "sending key %s to %s server %s\n"
-msgstr "áíáæÞôçóç ôïõ \"%s\" áðü ôï HKP äéáêïìéóôÞ %s\n"
+#, fuzzy
+msgid "no keyserver known\n"
+msgstr "ìç Ýãêõñåò åðéëïãÝò åîáãùãÞò\n"
#, fuzzy, c-format
msgid "sending key %s to %s\n"
@@ -4733,6 +4715,17 @@ msgstr ""
msgid "Note: signatures using the %s algorithm are rejected\n"
msgstr "%s õðïãñáöÞ, áëãüñéèìïò ðåñßëçøçò %s\n"
+#, fuzzy, c-format
+msgid "(reported error: %s)\n"
+msgstr "óöÜëìá áíÜãíùóçò: %s\n"
+
+#, fuzzy, c-format
+msgid "(reported error: %s <%s>)\n"
+msgstr "óöÜëìá áíÜãíùóçò: %s\n"
+
+msgid "(further info: "
+msgstr ""
+
#, c-format
msgid "%s:%d: deprecated option \"%s\"\n"
msgstr "%s:%d: ìç óõíåéóôþìåíç åðéëïãÞ \"%s\"\n"
@@ -5146,6 +5139,19 @@ msgstr "%s: ðáñáëåßöèçêå: ôï äçìüóéï êëåéäß Ý÷åé áðåíåñãïðïéçèåß.\n"
msgid "%s: skipped: public key already present\n"
msgstr "%s: ðáñáëåßöèçêå: äçìüóéï êëåéäß åßíáé Þäç ðáñüí\n"
+#, fuzzy, c-format
+#| msgid "can't connect to `%s': %s\n"
+msgid "can't encrypt to '%s'\n"
+msgstr "áäõíáìßá óýíäåóçò óôï `%s': %s\n"
+
+#, fuzzy, c-format
+msgid "option '%s' given, but no valid default keys given\n"
+msgstr "ìç Ýãêõñïò áëãüñéèìïò hash `%s'\n"
+
+#, fuzzy, c-format
+msgid "option '%s' given, but option '%s' not given\n"
+msgstr "ìç Ýãêõñïò áëãüñéèìïò hash `%s'\n"
+
msgid "You did not specify a user ID. (you may use \"-r\")\n"
msgstr "Äåí ïñßóôçêå Ýíá user ID. (÷ñçóéìïðïéåßóôå ôï \"-r\")\n"
@@ -5190,11 +5196,6 @@ msgstr "êëåéäß %08lX: äåí õðÜñ÷åé áõôü ôï user ID\n"
msgid "data not saved; use option \"--output\" to save it\n"
msgstr "äåäïìÝíá äåí áðïèçêåýôçêáí. ÁðïèÞêåõóç ìå ôçí åðéëïãÞ \"--output\"\n"
-#, fuzzy, c-format
-#| msgid "error creating `%s': %s\n"
-msgid "error creating '%s': %s\n"
-msgstr "óöÜëìá êáôÜ ôç äçìéïõñãßá ôïõ `%s': %s\n"
-
msgid "Detached signature.\n"
msgstr "ÁðïêïììÝíç õðïãñáöÞ.\n"
@@ -5285,19 +5286,31 @@ msgid "This is a revocation certificate for the OpenPGP key:"
msgstr "Äçìéïõñãßá åíüò ðéóôïðïéçôéêïý áíÜêëçóçò ãéá áõôü ôï êëåéäß; "
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 ""
+
+msgid ""
"Use it to revoke this key in case of a compromise or loss of\n"
"the secret key. However, if the secret key is still accessible,\n"
"it is better to generate a new revocation certificate and give\n"
-"a reason for the revocation."
+"a reason for the revocation. For details see the description of\n"
+"of the gpg command \"--gen-revoke\" in the GnuPG manual."
msgstr ""
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 making use of this revocation certificate."
+"before importing and publishing this revocation certificate."
msgstr ""
#, fuzzy, c-format
+#| msgid "Revocation certificate created.\n"
+msgid "revocation certificate stored as '%s.rev'\n"
+msgstr "Ðéóôïðïéçôéêü áíÜêëçóçò äçìéïõñãÞèçêå.\n"
+
+#, fuzzy, c-format
msgid "secret key \"%s\" not found\n"
msgstr "ôï ìõóôéêü êëåéäß `%s' äå âñÝèçêå: %s\n"
@@ -5308,6 +5321,11 @@ msgstr "ôï ìõóôéêü êëåéäß `%s' äå âñÝèçêå: %s\n"
msgid "'%s' matches multiple secret keys:\n"
msgstr ""
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "error searching the keyring: %s\n"
+msgstr "áäõíáìßá äçìéïõñãßáò ôçò êëåéäïèÞêçò `%s': %s\n"
+
#, fuzzy
msgid "Create a revocation certificate for this key? (y/N) "
msgstr "Äçìéïõñãßá åíüò ðéóôïðïéçôéêïý áíÜêëçóçò ãéá áõôü ôï êëåéäß; "
@@ -5392,26 +5410,41 @@ msgstr ""
#, fuzzy, c-format
msgid "public key %s is %lu second newer than the signature\n"
-msgstr ""
+msgid_plural "public key %s is %lu seconds newer than the signature\n"
+msgstr[0] ""
+"ôï äçìüóéï êëåéäß %08lX åßíáé %lu äåõôåñüëåðôï íåüôåñï áðü ôçí õðïãñáöÞ\n"
+msgstr[1] ""
"ôï äçìüóéï êëåéäß %08lX åßíáé %lu äåõôåñüëåðôï íåüôåñï áðü ôçí õðïãñáöÞ\n"
#, fuzzy, c-format
-msgid "public key %s is %lu seconds newer than the signature\n"
-msgstr ""
-"ôï äçìüóéï êëåéäß %08lX åßíáé %lu äåõôåñüëåðôá íåüôåñï áðü ôçí õðïãñáöÞ\n"
+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] ""
+"ôï äçìüóéï êëåéäß %08lX åßíáé %lu äåõôåñüëåðôï íåüôåñï áðü ôçí õðïãñáöÞ\n"
+msgstr[1] ""
+"ôï äçìüóéï êëåéäß %08lX åßíáé %lu äåõôåñüëåðôï íåüôåñï áðü ôçí õðïãñáöÞ\n"
#, fuzzy, c-format
msgid ""
"key %s was created %lu second in the future (time warp or clock problem)\n"
-msgstr ""
+msgid_plural ""
+"key %s was created %lu seconds in the future (time warp or clock problem)\n"
+msgstr[0] ""
+"ôï êëåéäß äçìéïõñãÞèçêå %lu äåõôåñüëåðôï óôï ìÝëëïí (÷ñïíïäßíç Þ\n"
+"áðëþò ðñüâëçìá óôï ñïëüé)\n"
+msgstr[1] ""
"ôï êëåéäß äçìéïõñãÞèçêå %lu äåõôåñüëåðôï óôï ìÝëëïí (÷ñïíïäßíç Þ\n"
"áðëþò ðñüâëçìá óôï ñïëüé)\n"
#, fuzzy, c-format
-msgid ""
-"key %s was created %lu seconds in the future (time warp or clock problem)\n"
-msgstr ""
-"ôï êëåéäß äçìéïõñãÞèçêå %lu äåõôåñüëåðôá óôï ìÝëëïí (÷ñïíïäßíç Þ\n"
+msgid "key %s was created %lu day in the future (time warp or clock problem)\n"
+msgid_plural ""
+"key %s was created %lu days in the future (time warp or clock problem)\n"
+msgstr[0] ""
+"ôï êëåéäß äçìéïõñãÞèçêå %lu äåõôåñüëåðôï óôï ìÝëëïí (÷ñïíïäßíç Þ\n"
+"áðëþò ðñüâëçìá óôï ñïëüé)\n"
+msgstr[1] ""
+"ôï êëåéäß äçìéïõñãÞèçêå %lu äåõôåñüëåðôï óôï ìÝëëïí (÷ñïíïäßíç Þ\n"
"áðëþò ðñüâëçìá óôï ñïëüé)\n"
#, fuzzy, c-format
@@ -5647,6 +5680,237 @@ msgid "input line longer than %d characters\n"
msgstr "ãñáììÞ åéóüäïõ ìåãáëýôåñç áðü %d ÷áñáêôÞñåò\n"
#, fuzzy, c-format
+msgid "error beginning transaction on TOFU database: %s\n"
+msgstr "óöÜëìá óôç áðïóôïëÞ ðñïò ôï `%s': %s\n"
+
+#, c-format
+msgid "error committing transaction on TOFU database: %s\n"
+msgstr ""
+
+#, c-format
+msgid "error rolling back transaction on TOFU database: %s\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "unsupported TOFU database version: %s\n"
+msgstr ""
+"\n"
+"Õðïóôçñéæüìåíïé áëãüñéèìïé:\n"
+
+#, fuzzy, c-format
+msgid "error reading TOFU database: %s\n"
+msgstr "óöÜëìá óôç áðïóôïëÞ ðñïò ôï `%s': %s\n"
+
+#, fuzzy, c-format
+#| msgid "error writing secret keyring `%s': %s\n"
+msgid "error determining TOFU database's version: %s\n"
+msgstr "áäõíáìßá åããñáöÞò ìõóôéêÞò êëåéäïèÞêçò `%s': %s\n"
+
+#, fuzzy, c-format
+#| msgid "%s: error writing dir record: %s\n"
+msgid "error initializing TOFU database: %s\n"
+msgstr "%s: óöÜëìá óôçí åããñáöÞ ôçò åããñáöÞò dir : %s\n"
+
+#, fuzzy, c-format
+msgid "error opening TOFU database '%s': %s\n"
+msgstr "óöÜëìá êáôÜ ôçí áíÜãíùóç ôïõ `%s': %s\n"
+
+msgid "Warning: Home directory contains both tofu.db and tofu.d.\n"
+msgstr ""
+
+msgid "Using split format for TOFU database\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error updating TOFU database: %s\n"
+msgstr "óöÜëìá óôç áðïóôïëÞ ðñïò ôï `%s': %s\n"
+
+#, fuzzy, c-format
+msgid "public key %s not found: %s\n"
+msgstr "ôï äçìüóéï êëåéäß %08lX äåí âñÝèçêå: %s\n"
+
+#, fuzzy, c-format
+msgid "error setting TOFU binding's trust level to %s\n"
+msgstr "óöÜëìá êáôÜ ôçí áíÜãíùóç ôïõ `%s': %s\n"
+
+#, c-format
+msgid "The binding %s is NOT known."
+msgstr ""
+
+#, c-format
+msgid ""
+"The key %s raised a conflict with this binding (%s). Since this binding's "
+"policy was 'auto', it was changed to 'ask'."
+msgstr ""
+
+#, c-format
+msgid ""
+"Please indicate whether you believe the binding %s%sis legitimate (the key "
+"belongs to the stated owner) or a forgery (bad)."
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error gathering other user IDs: %s\n"
+msgstr "óöÜëìá óôç äçìéïõñãßá ôçò öñÜóçò êëåéäß: %s\n"
+
+msgid "Known user IDs associated with this key:\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "Policy: "
+msgid "policy: %s"
+msgstr "ÐïëéôéêÞ: "
+
+#, fuzzy, c-format
+msgid "error gathering signature stats: %s\n"
+msgstr "óöÜëìá óôç äçìéïõñãßá ôçò öñÜóçò êëåéäß: %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] ""
+msgstr[1] ""
+
+#, c-format
+msgid "Statistics for keys with the email address \"%s\":\n"
+msgstr ""
+
+#, fuzzy
+#| msgid "list keys"
+msgid "this key"
+msgstr "áðåéêüíéóç ôçò ëßóôáò êëåéäéþí"
+
+#, c-format
+msgid "%ld message signed in the future."
+msgid_plural "%ld messages signed in the future."
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+msgid "%ld message signed"
+msgid_plural "%ld messages signed"
+msgstr[0] "|áëãüñ [áñ÷åßá]| áðåéêüíéóç ðåñéëÞøåùí ôùí ìçíõìÜôùí"
+msgstr[1] "|áëãüñ [áñ÷åßá]| áðåéêüíéóç ðåñéëÞøåùí ôùí ìçíõìÜôùí"
+
+#, c-format
+msgid " over the past %ld day."
+msgid_plural " over the past %ld days."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid " over the past %ld week."
+msgid_plural " over the past %ld weeks."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid " over the past %ld month."
+msgid_plural " over the past %ld months."
+msgstr[0] ""
+msgstr[1] ""
+
+#. 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 ""
+
+#. 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 ""
+
+msgid "(G)ood, (A)ccept once, (U)nknown, (R)eject once, (B)ad? "
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error changing TOFU policy: %s\n"
+msgstr "óöÜëìá óôç äçìéïõñãßá ôçò öñÜóçò êëåéäß: %s\n"
+
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "Have never verified a message signed by key %s!\n"
+msgstr ""
+
+#, c-format
+msgid "Failed to collect signature statistics for \"%s\" (key %s)\n"
+msgstr ""
+
+#, c-format
+msgid "Verified 0 messages signed by \"%s\" (key: %s, policy: %s)."
+msgstr ""
+
+#. TRANSLATORS: The final %s is replaced by a string like
+#. "7 months, 1 day, 5 minutes, 0 seconds".
+#, c-format
+msgid ""
+"Verified %ld message signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgid_plural ""
+"Verified %ld messages signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "The most recent message was verified %s ago."
+msgstr ""
+
+msgid "Warning: we've have yet to see a message signed by this key!\n"
+msgstr ""
+
+msgid "Warning: we've only seen a single message signed by this key!\n"
+msgstr ""
+
+#. TRANSLATORS: translate the below text. We don't
+#. directly internationalize that text so that we can
+#. tweak it without breaking translations.
+#, c-format
+msgid "TOFU: few signatures %d message %s"
+msgid_plural "TOFU: few signatures %d messages %s"
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+msgid "error opening TOFU database: %s\n"
+msgstr "óöÜëìá óôç áðïóôïëÞ ðñïò ôï `%s': %s\n"
+
+#, fuzzy, c-format
#| msgid "`%s' is not a valid long keyID\n"
msgid "'%s' is not a valid long keyID\n"
msgstr "`%s' äåí åßíáé Ýãêõñï ìáêñý keyID\n"
@@ -5706,19 +5970,24 @@ msgstr "äåí õðÜñ÷åé áíÜãêç ãéá Ýëåã÷ï ôçò trustdb\n"
msgid "no need for a trustdb update with '%s' trust model\n"
msgstr "äåí õðÜñ÷åé áíÜãêç ãéá Ýëåã÷ï ôçò trustdb\n"
-#, fuzzy, c-format
-msgid "public key %s not found: %s\n"
-msgstr "ôï äçìüóéï êëåéäß %08lX äåí âñÝèçêå: %s\n"
-
msgid "please do a --check-trustdb\n"
msgstr "ðáñáêáëþ êÜíôå Ýíá --check-trustdb\n"
msgid "checking the trustdb\n"
msgstr "Ýëåã÷ïò ôçò trustdb\n"
-#, c-format
-msgid "%d keys processed (%d validity counts cleared)\n"
-msgstr "%d êëåéäéÜ åðåîåñãÜóôçêáí (%d ìåôñÞóåéò åããõñüôçôáò ðÝñáóáí)\n"
+#, fuzzy, c-format
+msgid "%d key processed"
+msgid_plural "%d keys processed"
+msgstr[0] "%lu êëåéäéÜ Ý÷ïõí ìÝ÷ñé ôþñá åðåîåñãáóôåß\n"
+msgstr[1] "%lu êëåéäéÜ Ý÷ïõí ìÝ÷ñé ôþñá åðåîåñãáóôåß\n"
+
+#, fuzzy, c-format
+#| msgid "%d keys processed (%d validity counts cleared)\n"
+msgid " (%d validity count cleared)\n"
+msgid_plural " (%d validity counts cleared)\n"
+msgstr[0] "%d êëåéäéÜ åðåîåñãÜóôçêáí (%d ìåôñÞóåéò åããõñüôçôáò ðÝñáóáí)\n"
+msgstr[1] "%d êëåéäéÜ åðåîåñãÜóôçêáí (%d ìåôñÞóåéò åããõñüôçôáò ðÝñáóáí)\n"
msgid "no ultimately trusted keys found\n"
msgstr "äå âñÝèçêáí áðüëõôá åìðéóôåýóéìá êëåéäéÜ\n"
@@ -5729,10 +5998,6 @@ msgstr ""
"äå âñÝèçêå ôï äçìüóéï êëåéäß ôïõ áðüëõôá åìðéóôåýóéìïõ êëåéäéïý %08lX\n"
#, c-format
-msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
-msgstr ""
-
-#, c-format
msgid ""
"depth: %d valid: %3d signed: %3d trust: %d-, %dq, %dn, %dm, %df, %du\n"
msgstr ""
@@ -5931,8 +6196,11 @@ msgid "card is permanently locked!\n"
msgstr ""
#, c-format
-msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
-msgstr ""
+msgid "%d Admin PIN attempt remaining before card is permanently locked\n"
+msgid_plural ""
+"%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr[0] ""
+msgstr[1] ""
#. TRANSLATORS: Do not translate the "|A|" prefix but keep it at
#. the start of the string. Use %%0A to force a linefeed.
@@ -6022,8 +6290,10 @@ msgid "generating key failed\n"
msgstr "äéáãñáöÞ block êëåéäéþí áðÝôõ÷å: %s\n"
#, fuzzy, c-format
-msgid "key generation completed (%d seconds)\n"
-msgstr "Ç äçìéïõñãßá êëåéäéïý áðÝôõ÷å: %s\n"
+msgid "key generation completed (%d second)\n"
+msgid_plural "key generation completed (%d seconds)\n"
+msgstr[0] "Ç äçìéïõñãßá êëåéäéïý áðÝôõ÷å: %s\n"
+msgstr[1] "Ç äçìéïõñãßá êëåéäéïý áðÝôõ÷å: %s\n"
msgid "invalid structure of OpenPGP card (DO 0x93)\n"
msgstr ""
@@ -8226,6 +8496,9 @@ msgstr "|N|÷ñÞóç ôçò êáôÜóôáóçò öñÜóçò êëåéäß N"
msgid "do not allow the reuse of old passphrases"
msgstr "óöÜëìá óôç äçìéïõñãßá ôçò öñÜóçò êëåéäß: %s\n"
+msgid "|N|set the Pinentry timeout to N seconds"
+msgstr ""
+
msgid "|NAME|use NAME as default secret key"
msgstr "|ÏÍÏÌÁ|÷ñÞóç ÏÍÏÌÁôïò óáí ðñïêáèïñéóìÝíï ìõóôéêü êëåéäß"
@@ -8522,6 +8795,90 @@ msgid ""
"Check a passphrase given on stdin against the patternfile\n"
msgstr ""
+#~ msgid "%d signatures not checked due to missing keys\n"
+#~ msgstr "%d õðïãñáöÝò äåí åëÝã÷èçêáí ëüãù ÷áìÝíùí êëåéäéþí\n"
+
+#~ msgid "%d signatures not checked due to errors\n"
+#~ msgstr "%d õðïãñáöÝò äåí åëÝã÷èçêáí ëüãù óöáëìÜôùí\n"
+
+#~ msgid "1 user ID without valid self-signature detected\n"
+#~ msgstr "1 user ID áíé÷íåýôçêå ÷ùñßò Ýãêõñç éäéï-õðïãñáöÞ\n"
+
+#~ msgid "Deleted %d signatures.\n"
+#~ msgstr "ÄéáãñÜöçêáí %d õðïãñáöÝò.\n"
+
+#, fuzzy
+#~ msgid "User ID \"%s\": %d signatures removed\n"
+#~ msgstr "Ôï user ID \"%s\" áíáêáëåßôå."
+
+#~ msgid ""
+#~ "You need a Passphrase to protect your secret key.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "×ñåéÜæåóôå ìéá ÖñÜóç êëåéäß ãéá íá ðñïóôáôåýóåôå ôï ìõóôéêü êëåéäß.\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "Please enter a passphrase to protect the off-card backup of the new "
+#~ "encryption key."
+#~ msgstr "ÐëçêôñïëïãÞóôå ôç öñÜóç êëåéäß· áõôÞ åßíáé ìéá ìõóôéêÞ ðñüôáóç \n"
+
+#~ msgid "passphrase not correctly repeated; try again"
+#~ msgstr "ç öñÜóç êëåéäß äåí åðáíáëÞöèçêå óùóôÜ. ÄïêéìÜóôå îáíÜ"
+
+#~ msgid "%s.\n"
+#~ msgstr "%s.\n"
+
+#~ msgid ""
+#~ "You don't want a passphrase - this is probably a *bad* idea!\n"
+#~ "I will do it anyway. You can change your passphrase at any time,\n"
+#~ "using this program with the option \"--edit-key\".\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Äåí ÷ñåéÜæåóôå ìéá öñÜóç êëåéäß - áõôü åßíáé ìÜëëïí ìéá *êáêÞ* éäÝá!\n"
+#~ "Èá óõíå÷ßóù üðùò êáé íá Ý÷åé. Ìðïñåßôå íá áëëÜîåôå ôç öñÜóç óáò\n"
+#~ "üðïôå èÝëåôå, ìå ôçí åðéëïãÞ \"--edit-key\".\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid "storing key onto card failed: %s\n"
+#~ msgstr "äéáãñáöÞ block êëåéäéþí áðÝôõ÷å: %s\n"
+
+#, fuzzy
+#~| msgid "1 bad signature\n"
+#~ msgid "1 good signature\n"
+#~ msgstr "1 êáêÞ õðïãñáöÞ\n"
+
+#, fuzzy
+#~ msgid "renaming '%s' to '%s' failed: %s\n"
+#~ msgstr "èùñÜêéóç áðÝôõ÷å: %s\n"
+
+#, fuzzy
+#~ msgid "%lu keys cached (%lu signatures)\n"
+#~ msgstr "%lu êëåéäéÜ Ý÷ïõí åëåã÷èåß (%lu õðïãñáöÝò)\n"
+
+#, fuzzy
+#~ msgid "refreshing 1 key from %s\n"
+#~ msgstr "áßôçóç êëåéäéïý %08lX áðü ôï %s\n"
+
+#, fuzzy
+#~ msgid "sending key %s to %s server %s\n"
+#~ msgstr "áíáæÞôçóç ôïõ \"%s\" áðü ôï HKP äéáêïìéóôÞ %s\n"
+
+#, fuzzy
+#~ msgid "public key %s is %lu seconds newer than the signature\n"
+#~ msgstr ""
+#~ "ôï äçìüóéï êëåéäß %08lX åßíáé %lu äåõôåñüëåðôá íåüôåñï áðü ôçí õðïãñáöÞ\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "key %s was created %lu seconds in the future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "ôï êëåéäß äçìéïõñãÞèçêå %lu äåõôåñüëåðôá óôï ìÝëëïí (÷ñïíïäßíç Þ\n"
+#~ "áðëþò ðñüâëçìá óôï ñïëüé)\n"
+
#, fuzzy
#~| msgid "can't open the keyring"
#~ msgid "Failed to open the keyring DB.\n"
@@ -8782,10 +9139,6 @@ msgstr ""
#~ msgstr "áíáæÞôçóç ôïõ \"%s\" áðü ôï HKP äéáêïìéóôÞ %s\n"
#, fuzzy
-#~ msgid "no keyserver action!\n"
-#~ msgstr "ìç Ýãêõñåò åðéëïãÝò åîáãùãÞò\n"
-
-#, fuzzy
#~ msgid "keyserver timed out\n"
#~ msgstr "óöÜëìá äéáêïìéóôÞ êëåéäéþí"
@@ -9992,9 +10345,6 @@ msgstr ""
#~ msgid "%s%c %4u%c/%08lX created: %s expires: %s"
#~ msgstr "%s%c %4u%c/%08lX äçìéïõñãßá: %s ëÞîç: %s"
-#~ msgid "Policy: "
-#~ msgstr "ÐïëéôéêÞ: "
-
#~ msgid "can't get key from keyserver: %s\n"
#~ msgstr "áäõíáìßá ëÞøçò ôïõ êëåéäéïý áðü ôï äéáêïìéóôÞ: %s\n"
diff --git a/po/eo.po b/po/eo.po
index 5439825..f6e30db 100644
--- a/po/eo.po
+++ b/po/eo.po
@@ -1248,6 +1248,20 @@ msgid "Enter passphrase: "
msgstr "Donu pasfrazon: "
#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "error getting version from '%s': %s\n"
+msgstr "eraro dum kreado de þlosilaro '%s': %s\n"
+
+#, c-format
+msgid "server '%s' is older than us (%s < %s)"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "WARNING: %s overrides %s\n"
+msgid "WARNING: %s\n"
+msgstr "AVERTO: %s nuligas %s\n"
+
+#, fuzzy, c-format
msgid "OpenPGP card not available: %s\n"
msgstr "sekreta þlosilo ne havebla"
@@ -1742,6 +1756,11 @@ msgid "remove as much as possible from key during export"
msgstr ""
#, fuzzy
+#| msgid "%s: skipped: %s\n"
+msgid " - skipped"
+msgstr "%s: ignorita: %s\n"
+
+#, fuzzy
msgid "exporting secret keys not allowed\n"
msgstr "skribas sekretan þlosilon al '%s'\n"
@@ -1753,19 +1772,36 @@ msgstr "þlosilo %08lX: PGP-2.x-stila þlosilo - ignorita\n"
msgid "key %s: key material on-card - skipped\n"
msgstr "þlosilo %08lX: revokatestilo en maløusta loko - ignorita\n"
-#, fuzzy
-#| msgid "%s: skipped: %s\n"
-msgid " - skipped"
-msgstr "%s: ignorita: %s\n"
-
msgid "WARNING: nothing exported\n"
msgstr "AVERTO: nenio estis eksportita\n"
+#, fuzzy, c-format
+#| msgid "error creating `%s': %s\n"
+msgid "error creating '%s': %s\n"
+msgstr "eraro dum kreado de '%s': %s\n"
+
#, fuzzy
msgid "[User ID not found]"
msgstr "[Uzantidentigilo ne trovita]"
#, fuzzy, c-format
+msgid "(check argument of option '%s')\n"
+msgstr "nevalida kiraso"
+
+#, c-format
+msgid "Warning: '%s' should be a long key ID or a fingerprint\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error looking up: %s\n"
+msgstr "eraro dum legado de '%s': %s\n"
+
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "Warning: %s appears in the keyring %d times\n"
+msgstr "eraro dum kreado de þlosilaro '%s': %s\n"
+
+#, fuzzy, c-format
msgid "automatically retrieved '%s' via %s\n"
msgstr "eraro dum kreado de '%s': %s\n"
@@ -1782,14 +1818,19 @@ msgid "secret key \"%s\" not found: %s\n"
msgstr "þlosilo '%s' ne trovita: %s\n"
#, fuzzy, c-format
-msgid "(check argument of option '%s')\n"
-msgstr "nevalida kiraso"
+#| msgid "|NAME|use NAME as default secret key"
+msgid "Warning: not using '%s' as default key: %s\n"
+msgstr "|NOMO|uzi NOMOn kiel la implicitan sekretan þlosilon"
#, fuzzy, c-format
#| msgid "|NAME|use NAME as default secret key"
-msgid "using \"%s\" as default secret key\n"
+msgid "using \"%s\" as default secret key for signing\n"
msgstr "|NOMO|uzi NOMOn kiel la implicitan sekretan þlosilon"
+#, c-format
+msgid "all values passed to '%s' ignored\n"
+msgstr ""
+
#, fuzzy, c-format
msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
msgstr "Nevalida þlosilo %08lX validigita per --always-trust\n"
@@ -2147,28 +2188,6 @@ msgid "Note: old default options file '%s' ignored\n"
msgstr "NOTO: mankas implicita opcio-dosiero '%s'\n"
#, c-format
-msgid ""
-"Warning: value '%s' for option '%s' should be a long key ID or a "
-"fingerprint\n"
-msgstr ""
-
-#, c-format
-msgid "key specification '%s' is ambiguous\n"
-msgstr ""
-
-#. TRANSLATORS: The %s prints a key specification which
-#. for example has been given at the command line. Two
-#. lines with fingerprints are printed after this message.
-#, c-format
-msgid "'%s' matches at least:\n"
-msgstr ""
-
-#, fuzzy, c-format
-#| msgid "error creating keyring `%s': %s\n"
-msgid "error searching the keyring: %s\n"
-msgstr "eraro dum kreado de þlosilaro '%s': %s\n"
-
-#, c-format
msgid "libgcrypt is too old (need %s, have %s)\n"
msgstr ""
@@ -2382,14 +2401,6 @@ msgstr "malsukcesis doni komencajn valorojn al fido-datenaro: %s\n"
msgid "WARNING: recipients (-r) given without using public key encryption\n"
msgstr ""
-#, fuzzy, c-format
-msgid "option '%s' given, but no valid default keys given\n"
-msgstr "nevalida kompendi-metodo '%s'\n"
-
-#, fuzzy, c-format
-msgid "option '%s' given, but option '%s' not given\n"
-msgstr "nevalida kompendi-metodo '%s'\n"
-
msgid "--store [filename]"
msgstr "--store [dosiero]"
@@ -2466,6 +2477,10 @@ msgid "key export failed: %s\n"
msgstr "Kreado de þlosiloj malsukcesis: %s\n"
#, fuzzy, c-format
+msgid "export as ssh key failed: %s\n"
+msgstr "Kreado de þlosiloj malsukcesis: %s\n"
+
+#, fuzzy, c-format
msgid "keyserver search failed: %s\n"
msgstr "get_dir_record: search_record malsukcesis: %s\n"
@@ -2951,33 +2966,33 @@ msgstr "[revoko]"
msgid "[self-signature]"
msgstr "[mem-subskribo]"
-msgid "1 bad signature\n"
-msgstr "1 malbona subskribo\n"
-
-#, c-format
-msgid "%d bad signatures\n"
-msgstr "%d malbonaj subskriboj\n"
-
-msgid "1 signature not checked due to a missing key\n"
-msgstr "1 subskribo ne kontrolita pro manko de þlosilo\n"
-
-#, c-format
-msgid "%d signatures not checked due to missing keys\n"
-msgstr "%d subskriboj ne kontrolitaj pro manko de þlosiloj\n"
-
-msgid "1 signature not checked due to an error\n"
-msgstr "1 subskribo ne kontrolita pro eraro\n"
+#, fuzzy, c-format
+#| msgid "%d bad signatures\n"
+msgid "%d bad signature\n"
+msgid_plural "%d bad signatures\n"
+msgstr[0] "%d malbonaj subskriboj\n"
+msgstr[1] "%d malbonaj subskriboj\n"
-#, c-format
-msgid "%d signatures not checked due to errors\n"
-msgstr "%d subskriboj ne kontrolitaj pro eraroj\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to a missing key\n"
+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 subskribo ne kontrolita pro manko de þlosilo\n"
+msgstr[1] "1 subskribo ne kontrolita pro manko de þlosilo\n"
-msgid "1 user ID without valid self-signature detected\n"
-msgstr "1 uzantidentigilo sen valida mem-subskribo estis trovita\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to an error\n"
+msgid "%d signature not checked due to an error\n"
+msgid_plural "%d signatures not checked due to errors\n"
+msgstr[0] "1 subskribo ne kontrolita pro eraro\n"
+msgstr[1] "1 subskribo ne kontrolita pro eraro\n"
-#, c-format
-msgid "%d user IDs without valid self-signatures detected\n"
-msgstr "%d uzantidentigiloj sen valida mem-subskribo estis trovitaj\n"
+#, fuzzy, c-format
+#| msgid "%d user IDs without valid self-signatures detected\n"
+msgid "%d user ID without valid self-signature detected\n"
+msgid_plural "%d user IDs without valid self-signatures detected\n"
+msgstr[0] "%d uzantidentigiloj sen valida mem-subskribo estis trovitaj\n"
+msgstr[1] "%d uzantidentigiloj sen valida mem-subskribo estis trovitaj\n"
#, fuzzy
msgid ""
@@ -3627,13 +3642,12 @@ msgstr "Æu forviþi æi tiun nekonatan subskribon? (j/N/f)"
msgid "Really delete this self-signature? (y/N)"
msgstr "Æu vere forviþi æi tiun mem-subskribon? (j/N)"
-#, c-format
+#, fuzzy, c-format
+#| msgid "Deleted %d signature.\n"
msgid "Deleted %d signature.\n"
-msgstr "Forviþis %d subskribon.\n"
-
-#, c-format
-msgid "Deleted %d signatures.\n"
-msgstr "Forviþis %d subskribojn.\n"
+msgid_plural "Deleted %d signatures.\n"
+msgstr[0] "Forviþis %d subskribon.\n"
+msgstr[1] "Forviþis %d subskribon.\n"
msgid "Nothing deleted.\n"
msgstr "Nenio estis forviþita.\n"
@@ -3647,11 +3661,9 @@ msgstr "Uzantidentigilo \"%s\" estas revokita.\n"
#, fuzzy, c-format
msgid "User ID \"%s\": %d signature removed\n"
-msgstr "Uzantidentigilo \"%s\" estas revokita.\n"
-
-#, fuzzy, c-format
-msgid "User ID \"%s\": %d signatures removed\n"
-msgstr "Uzantidentigilo \"%s\" estas revokita.\n"
+msgid_plural "User ID \"%s\": %d signatures removed\n"
+msgstr[0] "Uzantidentigilo \"%s\" estas revokita.\n"
+msgstr[1] "Uzantidentigilo \"%s\" estas revokita.\n"
#, fuzzy, c-format
msgid "User ID \"%s\": already minimized\n"
@@ -4189,37 +4201,6 @@ msgid "Please correct the error first\n"
msgstr "Bonvolu korekti la eraron unue\n"
msgid ""
-"You need a Passphrase to protect your secret key.\n"
-"\n"
-msgstr ""
-"Vi bezonas pasfrazon por protekti vian sekretan þlosilon.\n"
-"\n"
-
-#, fuzzy
-msgid ""
-"Please enter a passphrase to protect the off-card backup of the new "
-"encryption key."
-msgstr "Bonvolu doni la pasfrazon; tio estas sekreta frazo \n"
-
-msgid "passphrase not correctly repeated; try again"
-msgstr "la pasfrazo ne estis øuste ripetita; provu denove"
-
-#, c-format
-msgid "%s.\n"
-msgstr "%s.\n"
-
-msgid ""
-"You don't want a passphrase - this is probably a *bad* idea!\n"
-"I will do it anyway. You can change your passphrase at any time,\n"
-"using this program with the option \"--edit-key\".\n"
-"\n"
-msgstr ""
-"Vi ne deziras pasfrazon; tio verþajne estas *malbona* ideo!\n"
-"Mi tamen faros tiel. Vi povos æiam ajn þanøi vian pasfrazon,\n"
-"uzante æi tiun programon kun la opcio \"--edit-key\".\n"
-"\n"
-
-msgid ""
"We need to generate a lot of random bytes. It is a good idea to perform\n"
"some other action (type on the keyboard, move the mouse, utilize the\n"
"disks) during the prime generation; this gives the random number\n"
@@ -4264,6 +4245,14 @@ msgid "Key generation canceled.\n"
msgstr "Kreado de þlosiloj nuligita.\n"
#, fuzzy, c-format
+msgid "can't create backup file '%s': %s\n"
+msgstr "ne povas krei '%s': %s\n"
+
+#, fuzzy, c-format
+msgid "Note: backup of card key saved to '%s'\n"
+msgstr "NOTO: sekreta þlosilo %08lX eksvalidiøis je %s\n"
+
+#, fuzzy, c-format
#| msgid "writing public key to `%s'\n"
msgid "writing public key to '%s'\n"
msgstr "skribas publikan þlosilon al '%s'\n"
@@ -4318,18 +4307,6 @@ msgstr "Sekretaj partoj de æefa þlosilo ne estas disponataj.\n"
msgid "Really create? (y/N) "
msgstr "Æu vere krei? "
-#, fuzzy, c-format
-msgid "storing key onto card failed: %s\n"
-msgstr "forviþo de þlosilbloko malsukcesis: %s\n"
-
-#, fuzzy, c-format
-msgid "can't create backup file '%s': %s\n"
-msgstr "ne povas krei '%s': %s\n"
-
-#, fuzzy, c-format
-msgid "Note: backup of card key saved to '%s'\n"
-msgstr "NOTO: sekreta þlosilo %08lX eksvalidiøis je %s\n"
-
msgid "never "
msgstr ""
@@ -4350,19 +4327,18 @@ msgstr "Subskribo-notacio: "
msgid "Signature notation: "
msgstr "Subskribo-notacio: "
-#, fuzzy
-#| msgid "1 bad signature\n"
-msgid "1 good signature\n"
-msgstr "1 malbona subskribo\n"
-
#, fuzzy, c-format
#| msgid "%d bad signatures\n"
-msgid "%d good signatures\n"
-msgstr "%d malbonaj subskriboj\n"
+msgid "%d good signature\n"
+msgid_plural "%d good signatures\n"
+msgstr[0] "%d malbonaj subskriboj\n"
+msgstr[1] "%d malbonaj subskriboj\n"
#, c-format
-msgid "Warning: %lu key(s) skipped due to their large size\n"
-msgstr ""
+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] ""
msgid "Keyring"
msgstr "Þlosilaro"
@@ -4397,20 +4373,28 @@ msgid " Card serial no. ="
msgstr ""
#, fuzzy, c-format
-msgid "renaming '%s' to '%s' failed: %s\n"
-msgstr "enkirasigo malsukcesis: %s\n"
-
-#, fuzzy, c-format
msgid "caching keyring '%s'\n"
msgstr "kontrolas þlosilaron '%s'\n"
#, fuzzy, c-format
-msgid "%lu keys cached so far (%lu signatures)\n"
-msgstr "%lu þlosiloj kontrolitaj (%lu subskriboj)\n"
+msgid "%lu keys cached so far (%lu signature)\n"
+msgid_plural "%lu keys cached so far (%lu signatures)\n"
+msgstr[0] "%lu þlosiloj kontrolitaj (%lu subskriboj)\n"
+msgstr[1] "%lu þlosiloj kontrolitaj (%lu subskriboj)\n"
#, fuzzy, c-format
-msgid "%lu keys cached (%lu signatures)\n"
-msgstr "%lu þlosiloj kontrolitaj (%lu subskriboj)\n"
+#| msgid "\t%lu keys updated\n"
+msgid "%lu key cached"
+msgid_plural "%lu keys cached"
+msgstr[0] "\t%lu þlosiloj aktualigitaj\n"
+msgstr[1] "\t%lu þlosiloj aktualigitaj\n"
+
+#, fuzzy, c-format
+#| msgid "1 bad signature\n"
+msgid " (%lu signature)\n"
+msgid_plural " (%lu signatures)\n"
+msgstr[0] "1 malbona subskribo\n"
+msgstr[1] "1 malbona subskribo\n"
#, c-format
msgid "%s: keyring created\n"
@@ -4454,18 +4438,16 @@ msgid "\"%s\" not a key ID: skipping\n"
msgstr "%s: ne valida þlosilidentigilo\n"
#, fuzzy, c-format
-msgid "refreshing 1 key from %s\n"
-msgstr "petas la þlosilon %08lX de HKP-þlosilservilo %s ...\n"
+msgid "refreshing %d key from %s\n"
+msgid_plural "refreshing %d keys from %s\n"
+msgstr[0] "petas la þlosilon %08lX de HKP-þlosilservilo %s ...\n"
+msgstr[1] "petas la þlosilon %08lX de HKP-þlosilservilo %s ...\n"
#, fuzzy, c-format
msgid "WARNING: unable to refresh key %s via %s: %s\n"
msgstr "Averto: malsekura posedeco sur %s \"%s\"\n"
#, fuzzy, c-format
-msgid "refreshing %d keys from %s\n"
-msgstr "petas la þlosilon %08lX de HKP-þlosilservilo %s ...\n"
-
-#, fuzzy, c-format
msgid "key \"%s\" not found on keyserver\n"
msgstr "þlosilo '%s' ne trovita: %s\n"
@@ -4484,9 +4466,9 @@ msgstr "petas la þlosilon %08lX de HKP-þlosilservilo %s ...\n"
msgid "requesting key %s from %s\n"
msgstr "petas la þlosilon %08lX de HKP-þlosilservilo %s ...\n"
-#, fuzzy, c-format
-msgid "sending key %s to %s server %s\n"
-msgstr "seræas pri \"%s\" æe HKP-servilo %s\n"
+#, fuzzy
+msgid "no keyserver known\n"
+msgstr "nevalida þlosilaro"
#, fuzzy, c-format
msgid "sending key %s to %s\n"
@@ -4711,6 +4693,17 @@ msgid "Note: signatures using the %s algorithm are rejected\n"
msgstr "%s-subskribo de: %s\n"
#, fuzzy, c-format
+msgid "(reported error: %s)\n"
+msgstr "kiraso: %s\n"
+
+#, fuzzy, c-format
+msgid "(reported error: %s <%s>)\n"
+msgstr "kiraso: %s\n"
+
+msgid "(further info: "
+msgstr ""
+
+#, fuzzy, c-format
msgid "%s:%d: deprecated option \"%s\"\n"
msgstr "AVERTO: '%s' estas malplena dosiero\n"
@@ -5115,6 +5108,19 @@ msgstr "%s: ignorita: publika þlosilo estas malþaltita\n"
msgid "%s: skipped: public key already present\n"
msgstr "%s: ignorita: publika þlosilo jam æeestas\n"
+#, fuzzy, c-format
+#| msgid "can't connect to `%s': %s\n"
+msgid "can't encrypt to '%s'\n"
+msgstr "ne povas konektiøi al '%s': %s\n"
+
+#, fuzzy, c-format
+msgid "option '%s' given, but no valid default keys given\n"
+msgstr "nevalida kompendi-metodo '%s'\n"
+
+#, fuzzy, c-format
+msgid "option '%s' given, but option '%s' not given\n"
+msgstr "nevalida kompendi-metodo '%s'\n"
+
msgid "You did not specify a user ID. (you may use \"-r\")\n"
msgstr "Vi ne specifis uzantidentigilon. (Vi povas uzi \"-r\")\n"
@@ -5158,11 +5164,6 @@ msgstr "þlosilo %08lX: mankas uzantidentigilo\n"
msgid "data not saved; use option \"--output\" to save it\n"
msgstr "datenoj ne savitaj; uzu la opcion \"--output\" por savi ilin\n"
-#, fuzzy, c-format
-#| msgid "error creating `%s': %s\n"
-msgid "error creating '%s': %s\n"
-msgstr "eraro dum kreado de '%s': %s\n"
-
msgid "Detached signature.\n"
msgstr "Aparta subskribo.\n"
@@ -5253,19 +5254,30 @@ msgid "This is a revocation certificate for the OpenPGP key:"
msgstr "Æu krei revokatestilon por æi tiu subskribo? (j/N)"
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 ""
+
+msgid ""
"Use it to revoke this key in case of a compromise or loss of\n"
"the secret key. However, if the secret key is still accessible,\n"
"it is better to generate a new revocation certificate and give\n"
-"a reason for the revocation."
+"a reason for the revocation. For details see the description of\n"
+"of the gpg command \"--gen-revoke\" in the GnuPG manual."
msgstr ""
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 making use of this revocation certificate."
+"before importing and publishing this revocation certificate."
msgstr ""
#, fuzzy, c-format
+msgid "revocation certificate stored as '%s.rev'\n"
+msgstr "þlosilo %08lX: revokatestilo aldonita\n"
+
+#, fuzzy, c-format
msgid "secret key \"%s\" not found\n"
msgstr "þlosilo '%s' ne trovita: %s\n"
@@ -5276,6 +5288,11 @@ msgstr "þlosilo '%s' ne trovita: %s\n"
msgid "'%s' matches multiple secret keys:\n"
msgstr ""
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "error searching the keyring: %s\n"
+msgstr "eraro dum kreado de þlosilaro '%s': %s\n"
+
#, fuzzy
msgid "Create a revocation certificate for this key? (y/N) "
msgstr "Æu krei revokatestilon por æi tiu subskribo? (j/N)"
@@ -5351,24 +5368,37 @@ msgstr ""
#, fuzzy, c-format
msgid "public key %s is %lu second newer than the signature\n"
-msgstr "la publika þlosilo estas %lu sekundon pli nova ol la subskribo\n"
+msgid_plural "public key %s is %lu seconds newer than the signature\n"
+msgstr[0] "la publika þlosilo estas %lu sekundon pli nova ol la subskribo\n"
+msgstr[1] "la publika þlosilo estas %lu sekundon pli nova ol la subskribo\n"
#, fuzzy, c-format
-msgid "public key %s is %lu seconds newer than the signature\n"
-msgstr "la publika þlosilo estas %lu sekundojn pli nova ol la subskribo\n"
+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 publika þlosilo estas %lu sekundon pli nova ol la subskribo\n"
+msgstr[1] "la publika þlosilo estas %lu sekundon pli nova ol la subskribo\n"
#, fuzzy, c-format
msgid ""
"key %s was created %lu second in the future (time warp or clock problem)\n"
-msgstr ""
+msgid_plural ""
+"key %s was created %lu seconds in the future (time warp or clock problem)\n"
+msgstr[0] ""
+"þlosilo estis kreita %lu sekundon en la estonteco (tempotordo aý "
+"horloøeraro)\n"
+msgstr[1] ""
"þlosilo estis kreita %lu sekundon en la estonteco (tempotordo aý "
"horloøeraro)\n"
#, fuzzy, c-format
-msgid ""
-"key %s was created %lu seconds in the future (time warp or clock problem)\n"
-msgstr ""
-"þlosilo estis kreita %lu sekundojn en la estonteco (tempotordo aý "
+msgid "key %s was created %lu day in the future (time warp or clock problem)\n"
+msgid_plural ""
+"key %s was created %lu days in the future (time warp or clock problem)\n"
+msgstr[0] ""
+"þlosilo estis kreita %lu sekundon en la estonteco (tempotordo aý "
+"horloøeraro)\n"
+msgstr[1] ""
+"þlosilo estis kreita %lu sekundon en la estonteco (tempotordo aý "
"horloøeraro)\n"
#, fuzzy, c-format
@@ -5599,6 +5629,237 @@ msgid "input line longer than %d characters\n"
msgstr "enigata linio pli longa ol %d signojn\n"
#, fuzzy, c-format
+msgid "error beginning transaction on TOFU database: %s\n"
+msgstr "eraro dum sendo al '%s': %s\n"
+
+#, c-format
+msgid "error committing transaction on TOFU database: %s\n"
+msgstr ""
+
+#, c-format
+msgid "error rolling back transaction on TOFU database: %s\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "unsupported TOFU database version: %s\n"
+msgstr ""
+"\n"
+"Realigitaj metodoj:\n"
+
+#, fuzzy, c-format
+msgid "error reading TOFU database: %s\n"
+msgstr "eraro dum sendo al '%s': %s\n"
+
+#, fuzzy, c-format
+#| msgid "error writing secret keyring `%s': %s\n"
+msgid "error determining TOFU database's version: %s\n"
+msgstr "eraro dum skribado de sekreta þlosilaro '%s': %s\n"
+
+#, fuzzy, c-format
+#| msgid "%s: error writing dir record: %s\n"
+msgid "error initializing TOFU database: %s\n"
+msgstr "%s: eraro dum skribo de dosieruja registro: %s\n"
+
+#, fuzzy, c-format
+msgid "error opening TOFU database '%s': %s\n"
+msgstr "eraro dum legado de '%s': %s\n"
+
+msgid "Warning: Home directory contains both tofu.db and tofu.d.\n"
+msgstr ""
+
+msgid "Using split format for TOFU database\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error updating TOFU database: %s\n"
+msgstr "eraro dum sendo al '%s': %s\n"
+
+#, fuzzy, c-format
+msgid "public key %s not found: %s\n"
+msgstr "publika þlosilo %08lX ne trovita: %s\n"
+
+#, fuzzy, c-format
+msgid "error setting TOFU binding's trust level to %s\n"
+msgstr "eraro dum legado de '%s': %s\n"
+
+#, c-format
+msgid "The binding %s is NOT known."
+msgstr ""
+
+#, c-format
+msgid ""
+"The key %s raised a conflict with this binding (%s). Since this binding's "
+"policy was 'auto', it was changed to 'ask'."
+msgstr ""
+
+#, c-format
+msgid ""
+"Please indicate whether you believe the binding %s%sis legitimate (the key "
+"belongs to the stated owner) or a forgery (bad)."
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error gathering other user IDs: %s\n"
+msgstr "eraro dum kreado de pasfrazo: %s\n"
+
+msgid "Known user IDs associated with this key:\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "Policy: "
+msgid "policy: %s"
+msgstr "Gvidlinio: "
+
+#, fuzzy, c-format
+msgid "error gathering signature stats: %s\n"
+msgstr "eraro dum kreado de pasfrazo: %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] ""
+msgstr[1] ""
+
+#, c-format
+msgid "Statistics for keys with the email address \"%s\":\n"
+msgstr ""
+
+#, fuzzy
+#| msgid "list keys"
+msgid "this key"
+msgstr "listigi þlosilojn"
+
+#, c-format
+msgid "%ld message signed in the future."
+msgid_plural "%ld messages signed in the future."
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+msgid "%ld message signed"
+msgid_plural "%ld messages signed"
+msgstr[0] "|metodo [dosieroj]|presi mesaøo-kompendiojn"
+msgstr[1] "|metodo [dosieroj]|presi mesaøo-kompendiojn"
+
+#, c-format
+msgid " over the past %ld day."
+msgid_plural " over the past %ld days."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid " over the past %ld week."
+msgid_plural " over the past %ld weeks."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid " over the past %ld month."
+msgid_plural " over the past %ld months."
+msgstr[0] ""
+msgstr[1] ""
+
+#. 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 ""
+
+#. 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 ""
+
+msgid "(G)ood, (A)ccept once, (U)nknown, (R)eject once, (B)ad? "
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error changing TOFU policy: %s\n"
+msgstr "eraro dum kreado de pasfrazo: %s\n"
+
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "Have never verified a message signed by key %s!\n"
+msgstr ""
+
+#, c-format
+msgid "Failed to collect signature statistics for \"%s\" (key %s)\n"
+msgstr ""
+
+#, c-format
+msgid "Verified 0 messages signed by \"%s\" (key: %s, policy: %s)."
+msgstr ""
+
+#. TRANSLATORS: The final %s is replaced by a string like
+#. "7 months, 1 day, 5 minutes, 0 seconds".
+#, c-format
+msgid ""
+"Verified %ld message signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgid_plural ""
+"Verified %ld messages signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "The most recent message was verified %s ago."
+msgstr ""
+
+msgid "Warning: we've have yet to see a message signed by this key!\n"
+msgstr ""
+
+msgid "Warning: we've only seen a single message signed by this key!\n"
+msgstr ""
+
+#. TRANSLATORS: translate the below text. We don't
+#. directly internationalize that text so that we can
+#. tweak it without breaking translations.
+#, c-format
+msgid "TOFU: few signatures %d message %s"
+msgid_plural "TOFU: few signatures %d messages %s"
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+msgid "error opening TOFU database: %s\n"
+msgstr "eraro dum sendo al '%s': %s\n"
+
+#, fuzzy, c-format
#| msgid "`%s' is not a valid long keyID\n"
msgid "'%s' is not a valid long keyID\n"
msgstr "'%s' ne estas valida longa þlosilidentigilo\n"
@@ -5656,19 +5917,23 @@ msgstr "kontrolo de fido-datenaro ne estas bezonata\n"
msgid "no need for a trustdb update with '%s' trust model\n"
msgstr "kontrolo de fido-datenaro ne estas bezonata\n"
-#, fuzzy, c-format
-msgid "public key %s not found: %s\n"
-msgstr "publika þlosilo %08lX ne trovita: %s\n"
-
msgid "please do a --check-trustdb\n"
msgstr ""
msgid "checking the trustdb\n"
msgstr "kontrolas la fido-datenaron\n"
+#, fuzzy, c-format
+msgid "%d key processed"
+msgid_plural "%d keys processed"
+msgstr[0] "%lu þlosiloj jam traktitaj\n"
+msgstr[1] "%lu þlosiloj jam traktitaj\n"
+
#, c-format
-msgid "%d keys processed (%d validity counts cleared)\n"
-msgstr ""
+msgid " (%d validity count cleared)\n"
+msgid_plural " (%d validity counts cleared)\n"
+msgstr[0] ""
+msgstr[1] ""
#, fuzzy
msgid "no ultimately trusted keys found\n"
@@ -5679,10 +5944,6 @@ msgid "public key of ultimately trusted key %s not found\n"
msgstr "publika þlosilo de absolute fidata þlosilo %08lX ne trovita\n"
#, c-format
-msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
-msgstr ""
-
-#, c-format
msgid ""
"depth: %d valid: %3d signed: %3d trust: %d-, %dq, %dn, %dm, %df, %du\n"
msgstr ""
@@ -5880,8 +6141,11 @@ msgid "card is permanently locked!\n"
msgstr ""
#, c-format
-msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
-msgstr ""
+msgid "%d Admin PIN attempt remaining before card is permanently locked\n"
+msgid_plural ""
+"%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr[0] ""
+msgstr[1] ""
#. TRANSLATORS: Do not translate the "|A|" prefix but keep it at
#. the start of the string. Use %%0A to force a linefeed.
@@ -5971,8 +6235,10 @@ msgid "generating key failed\n"
msgstr "forviþo de þlosilbloko malsukcesis: %s\n"
#, fuzzy, c-format
-msgid "key generation completed (%d seconds)\n"
-msgstr "Kreado de þlosiloj malsukcesis: %s\n"
+msgid "key generation completed (%d second)\n"
+msgid_plural "key generation completed (%d seconds)\n"
+msgstr[0] "Kreado de þlosiloj malsukcesis: %s\n"
+msgstr[1] "Kreado de þlosiloj malsukcesis: %s\n"
msgid "invalid structure of OpenPGP card (DO 0x93)\n"
msgstr ""
@@ -8177,6 +8443,9 @@ msgstr "|N|uzi pasfraz-reøimon N"
msgid "do not allow the reuse of old passphrases"
msgstr "eraro dum kreado de pasfrazo: %s\n"
+msgid "|N|set the Pinentry timeout to N seconds"
+msgstr ""
+
msgid "|NAME|use NAME as default secret key"
msgstr "|NOMO|uzi NOMOn kiel la implicitan sekretan þlosilon"
@@ -8472,6 +8741,89 @@ msgid ""
"Check a passphrase given on stdin against the patternfile\n"
msgstr ""
+#~ msgid "%d signatures not checked due to missing keys\n"
+#~ msgstr "%d subskriboj ne kontrolitaj pro manko de þlosiloj\n"
+
+#~ msgid "%d signatures not checked due to errors\n"
+#~ msgstr "%d subskriboj ne kontrolitaj pro eraroj\n"
+
+#~ msgid "1 user ID without valid self-signature detected\n"
+#~ msgstr "1 uzantidentigilo sen valida mem-subskribo estis trovita\n"
+
+#~ msgid "Deleted %d signatures.\n"
+#~ msgstr "Forviþis %d subskribojn.\n"
+
+#, fuzzy
+#~ msgid "User ID \"%s\": %d signatures removed\n"
+#~ msgstr "Uzantidentigilo \"%s\" estas revokita.\n"
+
+#~ msgid ""
+#~ "You need a Passphrase to protect your secret key.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Vi bezonas pasfrazon por protekti vian sekretan þlosilon.\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "Please enter a passphrase to protect the off-card backup of the new "
+#~ "encryption key."
+#~ msgstr "Bonvolu doni la pasfrazon; tio estas sekreta frazo \n"
+
+#~ msgid "passphrase not correctly repeated; try again"
+#~ msgstr "la pasfrazo ne estis øuste ripetita; provu denove"
+
+#~ msgid "%s.\n"
+#~ msgstr "%s.\n"
+
+#~ msgid ""
+#~ "You don't want a passphrase - this is probably a *bad* idea!\n"
+#~ "I will do it anyway. You can change your passphrase at any time,\n"
+#~ "using this program with the option \"--edit-key\".\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Vi ne deziras pasfrazon; tio verþajne estas *malbona* ideo!\n"
+#~ "Mi tamen faros tiel. Vi povos æiam ajn þanøi vian pasfrazon,\n"
+#~ "uzante æi tiun programon kun la opcio \"--edit-key\".\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid "storing key onto card failed: %s\n"
+#~ msgstr "forviþo de þlosilbloko malsukcesis: %s\n"
+
+#, fuzzy
+#~| msgid "1 bad signature\n"
+#~ msgid "1 good signature\n"
+#~ msgstr "1 malbona subskribo\n"
+
+#, fuzzy
+#~ msgid "renaming '%s' to '%s' failed: %s\n"
+#~ msgstr "enkirasigo malsukcesis: %s\n"
+
+#, fuzzy
+#~ msgid "%lu keys cached (%lu signatures)\n"
+#~ msgstr "%lu þlosiloj kontrolitaj (%lu subskriboj)\n"
+
+#, fuzzy
+#~ msgid "refreshing 1 key from %s\n"
+#~ msgstr "petas la þlosilon %08lX de HKP-þlosilservilo %s ...\n"
+
+#, fuzzy
+#~ msgid "sending key %s to %s server %s\n"
+#~ msgstr "seræas pri \"%s\" æe HKP-servilo %s\n"
+
+#, fuzzy
+#~ msgid "public key %s is %lu seconds newer than the signature\n"
+#~ msgstr "la publika þlosilo estas %lu sekundojn pli nova ol la subskribo\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "key %s was created %lu seconds in the future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "þlosilo estis kreita %lu sekundojn en la estonteco (tempotordo aý "
+#~ "horloøeraro)\n"
+
#, fuzzy
#~| msgid "can't open the keyring"
#~ msgid "Failed to open the keyring DB.\n"
@@ -8705,10 +9057,6 @@ msgstr ""
#~ msgstr "seræas pri \"%s\" æe HKP-servilo %s\n"
#, fuzzy
-#~ msgid "no keyserver action!\n"
-#~ msgstr "nevalida þlosilaro"
-
-#, fuzzy
#~ msgid "keyserver timed out\n"
#~ msgstr "þlosilservila eraro"
@@ -9814,9 +10162,6 @@ msgstr ""
#~ msgid "%s%c %4u%c/%08lX created: %s expires: %s"
#~ msgstr "%s%c %4u%c/%08lX kreita: %s eksvalidiøos: %s"
-#~ msgid "Policy: "
-#~ msgstr "Gvidlinio: "
-
#~ msgid "can't get key from keyserver: %s\n"
#~ msgstr "ne povas akiri þlosilon de þlosilservilo: %s\n"
@@ -10095,9 +10440,6 @@ msgstr ""
#~ msgid "\t%lu due to new pubkeys\n"
#~ msgstr "\t%lu pro novaj publikaj þlosiloj\n"
-#~ msgid "\t%lu keys updated\n"
-#~ msgstr "\t%lu þlosiloj aktualigitaj\n"
-
#~ msgid "Ooops, no keys\n"
#~ msgstr "Hu, mankas þlosiloj\n"
diff --git a/po/es.po b/po/es.po
index 532323b..d1915dc 100644
--- a/po/es.po
+++ b/po/es.po
@@ -1295,6 +1295,20 @@ msgstr "fallo al hacer la petición proxy %s al cliente\n"
msgid "Enter passphrase: "
msgstr "Introduzca frase contraseña: "
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "error getting version from '%s': %s\n"
+msgstr "error escribiendo anillo `%s': %s\n"
+
+#, c-format
+msgid "server '%s' is older than us (%s < %s)"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "WARNING: "
+msgid "WARNING: %s\n"
+msgstr "ATENCION: "
+
#, c-format
msgid "OpenPGP card not available: %s\n"
msgstr "tarjeta OpenPGP no disponible: %s\n"
@@ -1792,6 +1806,11 @@ msgstr "borrar partes inutilizables de la clave al exportar"
msgid "remove as much as possible from key during export"
msgstr "borrar tanto como sea posible de la clave al exportar"
+#, fuzzy
+#| msgid "%s: skipped: %s\n"
+msgid " - skipped"
+msgstr "%s: omitido: %s\n"
+
msgid "exporting secret keys not allowed\n"
msgstr "no se permite exportar claves secretas\n"
@@ -1803,18 +1822,37 @@ msgstr "clave %s: clave estilo PGP 2.x - omitida\n"
msgid "key %s: key material on-card - skipped\n"
msgstr "clave %s: material de la clave en la tarjeta - omitida\n"
-#, fuzzy
-#| msgid "%s: skipped: %s\n"
-msgid " - skipped"
-msgstr "%s: omitido: %s\n"
-
msgid "WARNING: nothing exported\n"
msgstr "ATENCIÓN: no se ha exportado nada\n"
+#, fuzzy, c-format
+#| msgid "error creating `%s': %s\n"
+msgid "error creating '%s': %s\n"
+msgstr "error creando `%s': %s\n"
+
msgid "[User ID not found]"
msgstr "[ID de usuario no encontrado]"
#, fuzzy, c-format
+#| msgid "missing argument for option \"%.50s\"\n"
+msgid "(check argument of option '%s')\n"
+msgstr "falta parámetro para la opción \"%.50s\"\n"
+
+#, c-format
+msgid "Warning: '%s' should be a long key ID or a fingerprint\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "error closing %s: %s\n"
+msgid "error looking up: %s\n"
+msgstr "error cerrando %s: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "Warning: %s appears in the keyring %d times\n"
+msgstr "error escribiendo anillo `%s': %s\n"
+
+#, fuzzy, c-format
#| msgid "automatically retrieved `%s' via %s\n"
msgid "automatically retrieved '%s' via %s\n"
msgstr "recuperado automáticamente `%s' vía %s\n"
@@ -1832,16 +1870,20 @@ msgid "secret key \"%s\" not found: %s\n"
msgstr "clave secreta \"%s\" no encontrada: %s\n"
#, fuzzy, c-format
-#| msgid "missing argument for option \"%.50s\"\n"
-msgid "(check argument of option '%s')\n"
-msgstr "falta parámetro para la opción \"%.50s\"\n"
+#| msgid "|NAME|use NAME as default secret key"
+msgid "Warning: not using '%s' as default key: %s\n"
+msgstr "|NOMBRE|usa NOMBRE como clave secreta por defecto"
#, fuzzy, c-format
#| msgid "|NAME|use NAME as default secret key"
-msgid "using \"%s\" as default secret key\n"
+msgid "using \"%s\" as default secret key for signing\n"
msgstr "|NOMBRE|usa NOMBRE como clave secreta por defecto"
#, c-format
+msgid "all values passed to '%s' ignored\n"
+msgstr ""
+
+#, c-format
msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
msgstr "Clave %s inválida hecha válida mediante --allow-non-selfsigned-uid\n"
@@ -2217,29 +2259,6 @@ msgid "Note: old default options file '%s' ignored\n"
msgstr "NOTA: se ignora el antiguo fichero de opciones predefinidas `%s'\n"
#, c-format
-msgid ""
-"Warning: value '%s' for option '%s' should be a long key ID or a "
-"fingerprint\n"
-msgstr ""
-
-#, fuzzy, c-format
-#| msgid "option \"%.50s\" is ambiguous\n"
-msgid "key specification '%s' is ambiguous\n"
-msgstr "la opción \"%.50s\" es ambigua\n"
-
-#. TRANSLATORS: The %s prints a key specification which
-#. for example has been given at the command line. Two
-#. lines with fingerprints are printed after this message.
-#, c-format
-msgid "'%s' matches at least:\n"
-msgstr ""
-
-#, fuzzy, c-format
-#| msgid "error creating keyring `%s': %s\n"
-msgid "error searching the keyring: %s\n"
-msgstr "error escribiendo anillo `%s': %s\n"
-
-#, c-format
msgid "libgcrypt is too old (need %s, have %s)\n"
msgstr "libgcrypt demasiado antigua (necesito %s, tengo %s)\n"
@@ -2440,16 +2459,6 @@ 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 "line %d: invalid algorithm\n"
-msgid "option '%s' given, but no valid default keys given\n"
-msgstr "línea %d: algoritmo inválido\n"
-
-#, fuzzy, c-format
-#| msgid "line %d: invalid algorithm\n"
-msgid "option '%s' given, but option '%s' not given\n"
-msgstr "línea %d: algoritmo inválido\n"
-
msgid "--store [filename]"
msgstr "--store [nombre_fichero]"
@@ -2523,6 +2532,11 @@ 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"
+msgid "export as ssh key failed: %s\n"
+msgstr "exportación de clave fallida: %s\n"
+
#, c-format
msgid "keyserver search failed: %s\n"
msgstr "búsqueda del servidor de claves fallida: %s\n"
@@ -3025,33 +3039,33 @@ msgstr "[revocación]"
msgid "[self-signature]"
msgstr "[autofirma]"
-msgid "1 bad signature\n"
-msgstr "1 firma incorrecta\n"
-
-#, c-format
-msgid "%d bad signatures\n"
-msgstr "%d firmas incorrectas\n"
-
-msgid "1 signature not checked due to a missing key\n"
-msgstr "1 firma no comprobada por falta de clave\n"
-
-#, c-format
-msgid "%d signatures not checked due to missing keys\n"
-msgstr "%d firmas no comprobadas por falta de clave\n"
-
-msgid "1 signature not checked due to an error\n"
-msgstr "1 firma no comprobada por causa de un error\n"
+#, fuzzy, c-format
+#| msgid "%d bad signatures\n"
+msgid "%d bad signature\n"
+msgid_plural "%d bad signatures\n"
+msgstr[0] "%d firmas incorrectas\n"
+msgstr[1] "%d firmas incorrectas\n"
-#, c-format
-msgid "%d signatures not checked due to errors\n"
-msgstr "%d firmas no comprobadas por errores\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to a missing key\n"
+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"
-msgid "1 user ID without valid self-signature detected\n"
-msgstr "Detectado 1 identificador de usuario sin autofirma válida\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to an error\n"
+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"
-#, c-format
-msgid "%d user IDs without valid self-signatures detected\n"
-msgstr "Detectados %d identificadores de usuario sin autofirma válida\n"
+#, fuzzy, c-format
+#| msgid "%d user IDs without valid self-signatures detected\n"
+msgid "%d user ID without valid self-signature detected\n"
+msgid_plural "%d user IDs without valid self-signatures detected\n"
+msgstr[0] "Detectados %d identificadores de usuario sin autofirma válida\n"
+msgstr[1] "Detectados %d identificadores de usuario sin autofirma válida\n"
msgid ""
"Please decide how far you trust this user to correctly verify other users' "
@@ -3644,13 +3658,12 @@ msgstr "¿Borrar esta firma desconocida? (s/N/q)"
msgid "Really delete this self-signature? (y/N)"
msgstr "¿Borrar realmente esta autofirma? (s/N)"
-#, c-format
+#, fuzzy, c-format
+#| msgid "Deleted %d signature.\n"
msgid "Deleted %d signature.\n"
-msgstr "%d firmas borradas.\n"
-
-#, c-format
-msgid "Deleted %d signatures.\n"
-msgstr "%d firmas borradas\n"
+msgid_plural "Deleted %d signatures.\n"
+msgstr[0] "%d firmas borradas.\n"
+msgstr[1] "%d firmas borradas.\n"
msgid "Nothing deleted.\n"
msgstr "No se borró nada\n"
@@ -3662,13 +3675,12 @@ msgstr "inválida"
msgid "User ID \"%s\" compacted: %s\n"
msgstr "ID de usuario \"%s\" compactado: %s\n"
-#, c-format
+#, fuzzy, c-format
+#| msgid "User ID \"%s\": %d signature removed\n"
msgid "User ID \"%s\": %d signature removed\n"
-msgstr "ID de usuario \"%s\": %d firma borrada\n"
-
-#, c-format
-msgid "User ID \"%s\": %d signatures removed\n"
-msgstr "ID de usuario \"%s\": %d firmas borradas\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"
#, c-format
msgid "User ID \"%s\": already minimized\n"
@@ -4194,38 +4206,6 @@ msgid "Please correct the error first\n"
msgstr "Por favor corrija primero el error.\n"
msgid ""
-"You need a Passphrase to protect your secret key.\n"
-"\n"
-msgstr ""
-"Necesita una frase contraseña para proteger su clave secreta.\n"
-"\n"
-
-msgid ""
-"Please enter a passphrase to protect the off-card backup of the new "
-"encryption key."
-msgstr ""
-"Introduzca la frase contraseña para proteger la copia de seguridadde la "
-"clave externamente a la tarjeta."
-
-msgid "passphrase not correctly repeated; try again"
-msgstr "frase contraseña repetida incorrectamente; inténtelo de nuevo"
-
-#, c-format
-msgid "%s.\n"
-msgstr "%s.\n"
-
-msgid ""
-"You don't want a passphrase - this is probably a *bad* idea!\n"
-"I will do it anyway. You can change your passphrase at any time,\n"
-"using this program with the option \"--edit-key\".\n"
-"\n"
-msgstr ""
-"No ha especificado contraseña. Esto es probablemente una *mala* idea.\n"
-"Si más tarde quiere añadir una, puede hacerlo usando este programa con\n"
-"la opción \"--edit-key\".\n"
-"\n"
-
-msgid ""
"We need to generate a lot of random bytes. It is a good idea to perform\n"
"some other action (type on the keyboard, move the mouse, utilize the\n"
"disks) during the prime generation; this gives the random number\n"
@@ -4274,6 +4254,16 @@ msgid "Key generation canceled.\n"
msgstr "Creación de claves cancelada.\n"
#, fuzzy, c-format
+#| msgid "can't create backup file `%s': %s\n"
+msgid "can't create backup file '%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"
+msgid "Note: backup of card key saved to '%s'\n"
+msgstr "NOTA: copia de seguridad de la clave guardada en `%s'\n"
+
+#, fuzzy, c-format
#| msgid "writing public key to `%s'\n"
msgid "writing public key to '%s'\n"
msgstr "escribiendo clave pública en `%s'\n"
@@ -4325,20 +4315,6 @@ msgstr "Las partes secretas de la clave primaria se guardan en la tarjeta.\n"
msgid "Really create? (y/N) "
msgstr "¿Crear de verdad? (s/N) "
-#, c-format
-msgid "storing key onto card failed: %s\n"
-msgstr "almacenado de clave en la tarjeta fallido: %s\n"
-
-#, fuzzy, c-format
-#| msgid "can't create backup file `%s': %s\n"
-msgid "can't create backup file '%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"
-msgid "Note: backup of card key saved to '%s'\n"
-msgstr "NOTA: copia de seguridad de la clave guardada en `%s'\n"
-
msgid "never "
msgstr "nunca "
@@ -4357,19 +4333,18 @@ msgstr "Notación de firmas críticas: "
msgid "Signature notation: "
msgstr "Notación de firma: "
-#, fuzzy
-#| msgid "1 bad signature\n"
-msgid "1 good signature\n"
-msgstr "1 firma incorrecta\n"
-
#, fuzzy, c-format
#| msgid "%d bad signatures\n"
-msgid "%d good signatures\n"
-msgstr "%d firmas incorrectas\n"
+msgid "%d good signature\n"
+msgid_plural "%d good signatures\n"
+msgstr[0] "%d firmas incorrectas\n"
+msgstr[1] "%d firmas incorrectas\n"
#, c-format
-msgid "Warning: %lu key(s) skipped due to their large size\n"
-msgstr ""
+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] ""
msgid "Keyring"
msgstr "Anillo de claves"
@@ -4399,22 +4374,30 @@ msgid " Card serial no. ="
msgstr " Número de serie de la tarjeta ="
#, fuzzy, c-format
-#| msgid "renaming `%s' to `%s' failed: %s\n"
-msgid "renaming '%s' to '%s' failed: %s\n"
-msgstr "renombrando `%s' en `%s' fallo: %s\n"
-
-#, fuzzy, c-format
#| msgid "caching keyring `%s'\n"
msgid "caching keyring '%s'\n"
msgstr "memorizando anillo `%s'\n"
-#, c-format
-msgid "%lu keys cached so far (%lu signatures)\n"
-msgstr "%lu claves memorizadas hasta ahora (%lu firmas)\n"
+#, fuzzy, c-format
+#| msgid "%lu keys cached so far (%lu signatures)\n"
+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[1] "%lu claves memorizadas hasta ahora (%lu firmas)\n"
-#, c-format
-msgid "%lu keys cached (%lu signatures)\n"
-msgstr "%lu claves memorizadas (%lu firmas)\n"
+#, fuzzy, c-format
+#| msgid "\t%lu keys updated\n"
+msgid "%lu key cached"
+msgid_plural "%lu keys cached"
+msgstr[0] "\t%lu claves actualizadas\n"
+msgstr[1] "\t%lu claves actualizadas\n"
+
+#, fuzzy, c-format
+#| msgid "1 bad signature\n"
+msgid " (%lu signature)\n"
+msgid_plural " (%lu signatures)\n"
+msgstr[0] "1 firma incorrecta\n"
+msgstr[1] "1 firma incorrecta\n"
#, c-format
msgid "%s: keyring created\n"
@@ -4455,19 +4438,18 @@ 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"
-#, c-format
-msgid "refreshing 1 key from %s\n"
-msgstr "renovando 1 clave de %s\n"
+#, fuzzy, c-format
+#| msgid "refreshing %d keys from %s\n"
+msgid "refreshing %d key from %s\n"
+msgid_plural "refreshing %d keys from %s\n"
+msgstr[0] "renovando %d claves desde %s\n"
+msgstr[1] "renovando %d claves desde %s\n"
#, c-format
msgid "WARNING: unable to refresh key %s via %s: %s\n"
msgstr "AVISO: no se puede renovar la clave %s a traves de %s: %s\n"
#, c-format
-msgid "refreshing %d keys from %s\n"
-msgstr "renovando %d claves desde %s\n"
-
-#, c-format
msgid "key \"%s\" not found on keyserver\n"
msgstr "clave \"%s\" no encontrada en el servidor\n"
@@ -4485,9 +4467,10 @@ msgstr "solicitando clave %s de %s servidor %s\n"
msgid "requesting key %s from %s\n"
msgstr "solicitando clave %s de %s\n"
-#, c-format
-msgid "sending key %s to %s server %s\n"
-msgstr "enviando clave %s a %s servidor %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"
#, c-format
msgid "sending key %s to %s\n"
@@ -4706,6 +4689,19 @@ msgstr "AVISO: el algoritmo de resumen %s está obsoleto\n"
msgid "Note: signatures using the %s algorithm are rejected\n"
msgstr "firma %s, algoritmo de resumen %s\n"
+#, fuzzy, c-format
+#| msgid "read error in `%s': %s\n"
+msgid "(reported error: %s)\n"
+msgstr "error de lectura `%s': %s\n"
+
+#, fuzzy, c-format
+#| msgid "read error in `%s': %s\n"
+msgid "(reported error: %s <%s>)\n"
+msgstr "error de lectura `%s': %s\n"
+
+msgid "(further info: "
+msgstr ""
+
#, c-format
msgid "%s:%d: deprecated option \"%s\"\n"
msgstr "%s:%d: opción obsoleta \"%s\"\n"
@@ -5124,6 +5120,21 @@ 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"
+msgid "can't encrypt to '%s'\n"
+msgstr "no se puede conectar con `%s': %s\n"
+
+#, fuzzy, c-format
+#| msgid "line %d: invalid algorithm\n"
+msgid "option '%s' given, but no valid default keys given\n"
+msgstr "línea %d: algoritmo inválido\n"
+
+#, fuzzy, c-format
+#| msgid "line %d: invalid algorithm\n"
+msgid "option '%s' given, but option '%s' not given\n"
+msgstr "línea %d: algoritmo inválido\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"
@@ -5167,11 +5178,6 @@ msgstr "Nota: clave %s no tiene preferencias para %s\n"
msgid "data not saved; use option \"--output\" to save it\n"
msgstr "datos no grabados; use la opción \"--output\" para grabarlos\n"
-#, fuzzy, c-format
-#| msgid "error creating `%s': %s\n"
-msgid "error creating '%s': %s\n"
-msgstr "error creando `%s': %s\n"
-
msgid "Detached signature.\n"
msgstr "Firma separada.\n"
@@ -5263,19 +5269,31 @@ msgid "This is a revocation certificate for the OpenPGP key:"
msgstr "¿Crear un certificado de revocación para esta clave? (s/N) "
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 ""
+
+msgid ""
"Use it to revoke this key in case of a compromise or loss of\n"
"the secret key. However, if the secret key is still accessible,\n"
"it is better to generate a new revocation certificate and give\n"
-"a reason for the revocation."
+"a reason for the revocation. For details see the description of\n"
+"of the gpg command \"--gen-revoke\" in the GnuPG manual."
msgstr ""
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 making use of this revocation certificate."
+"before importing and publishing this revocation certificate."
msgstr ""
#, fuzzy, c-format
+#| msgid "Revocation certificate created.\n"
+msgid "revocation certificate stored as '%s.rev'\n"
+msgstr "Certificado de revocación creado.\n"
+
+#, fuzzy, c-format
#| msgid "secret key \"%s\" not found: %s\n"
msgid "secret key \"%s\" not found\n"
msgstr "clave secreta \"%s\" no encontrada: %s\n"
@@ -5287,6 +5305,11 @@ msgstr "clave secreta \"%s\" no encontrada: %s\n"
msgid "'%s' matches multiple secret keys:\n"
msgstr ""
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "error searching the keyring: %s\n"
+msgstr "error escribiendo anillo `%s': %s\n"
+
msgid "Create a revocation certificate for this key? (y/N) "
msgstr "¿Crear un certificado de revocación para esta clave? (s/N) "
@@ -5366,26 +5389,45 @@ 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"
-#, c-format
+#, fuzzy, c-format
+#| msgid "public key %s is %lu second newer than the signature\n"
msgid "public key %s is %lu second newer than the signature\n"
-msgstr "la clave pública %s es %lu segundos más nueva que la firma\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[1] "la clave pública %s es %lu segundos más nueva que la firma\n"
-#, c-format
-msgid "public key %s is %lu seconds newer than the signature\n"
-msgstr "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"
+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"
-#, c-format
+#, fuzzy, c-format
+#| msgid ""
+#| "key %s was created %lu second in the future (time warp or clock problem)\n"
msgid ""
"key %s was created %lu second in the future (time warp or clock problem)\n"
-msgstr ""
+msgid_plural ""
+"key %s was created %lu seconds in the future (time warp or clock problem)\n"
+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"
"o problemas con el reloj)\n"
-#, c-format
-msgid ""
-"key %s was created %lu seconds in the future (time warp or clock problem)\n"
-msgstr ""
-"la clave %s fue creada %lu segundos en el futuro (salto en el tiempo\n"
+#, fuzzy, c-format
+#| msgid ""
+#| "key %s was created %lu second in the future (time warp or clock problem)\n"
+msgid "key %s was created %lu day in the future (time warp or clock problem)\n"
+msgid_plural ""
+"key %s was created %lu days in the future (time warp or clock problem)\n"
+msgstr[0] ""
+"la 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"
"o problemas con el reloj)\n"
#, fuzzy, c-format
@@ -5622,6 +5664,247 @@ 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"
+msgid "error beginning transaction on TOFU database: %s\n"
+msgstr "error enviando opciones estándar: %s\n"
+
+#, c-format
+msgid "error committing transaction on TOFU database: %s\n"
+msgstr ""
+
+#, c-format
+msgid "error rolling back transaction on TOFU database: %s\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "unsupported algorithm: %s"
+msgid "unsupported TOFU database version: %s\n"
+msgstr "algoritmo no disponible: %s"
+
+#, fuzzy, c-format
+#| msgid "error sending %s command: %s\n"
+msgid "error reading TOFU database: %s\n"
+msgstr "error enviando orden %s: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error writing secret keyring `%s': %s\n"
+msgid "error determining TOFU database's version: %s\n"
+msgstr "error escribiendo anillo privado `%s': %s\n"
+
+#, fuzzy, c-format
+#| msgid "%s: error writing dir record: %s\n"
+msgid "error initializing TOFU database: %s\n"
+msgstr "%s: error escribiendo registro de directorio: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error opening `%s': %s\n"
+msgid "error opening TOFU database '%s': %s\n"
+msgstr "error abriendo `%s': %s\n"
+
+msgid "Warning: Home directory contains both tofu.db and tofu.d.\n"
+msgstr ""
+
+msgid "Using split format for TOFU database\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "error sending %s command: %s\n"
+msgid "error updating TOFU database: %s\n"
+msgstr "error enviando orden %s: %s\n"
+
+#, c-format
+msgid "public key %s not found: %s\n"
+msgstr "clave pública %s no encontrada: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error storing flags: %s\n"
+msgid "error setting TOFU binding's trust level to %s\n"
+msgstr "error almacenando parámetros: %s\n"
+
+#, c-format
+msgid "The binding %s is NOT known."
+msgstr ""
+
+#, c-format
+msgid ""
+"The key %s raised a conflict with this binding (%s). Since this binding's "
+"policy was 'auto', it was changed to 'ask'."
+msgstr ""
+
+#, c-format
+msgid ""
+"Please indicate whether you believe the binding %s%sis legitimate (the key "
+"belongs to the stated owner) or a forgery (bad)."
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "error getting new PIN: %s\n"
+msgid "error gathering other user IDs: %s\n"
+msgstr "error obteniendo nuevo PIN: %s\n"
+
+msgid "Known user IDs associated with this key:\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "Policy: "
+msgid "policy: %s"
+msgstr "Política: "
+
+#, fuzzy, c-format
+#| msgid "error getting stored flags: %s\n"
+msgid "error gathering signature stats: %s\n"
+msgstr "error obteniendo parámetros almacenados: %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] ""
+msgstr[1] ""
+
+#, c-format
+msgid "Statistics for keys with the email address \"%s\":\n"
+msgstr ""
+
+#, fuzzy
+#| msgid "list keys"
+msgid "this key"
+msgstr "lista claves"
+
+#, c-format
+msgid "%ld message signed in the future."
+msgid_plural "%ld messages signed in the future."
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+#| msgid "print message digests"
+msgid "%ld message signed"
+msgid_plural "%ld messages signed"
+msgstr[0] "imprime resúmenes de mensaje"
+msgstr[1] "imprime resúmenes de mensaje"
+
+#, c-format
+msgid " over the past %ld day."
+msgid_plural " over the past %ld days."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid " over the past %ld week."
+msgid_plural " over the past %ld weeks."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid " over the past %ld month."
+msgid_plural " over the past %ld months."
+msgstr[0] ""
+msgstr[1] ""
+
+#. 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 ""
+
+#. 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 ""
+
+msgid "(G)ood, (A)ccept once, (U)nknown, (R)eject once, (B)ad? "
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "error creating a pipe: %s\n"
+msgid "error changing TOFU policy: %s\n"
+msgstr "error creando tubería: %s\n"
+
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+#| msgid "second"
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "segundo"
+msgstr[1] "segundo"
+
+#, c-format
+msgid "Have never verified a message signed by key %s!\n"
+msgstr ""
+
+#, c-format
+msgid "Failed to collect signature statistics for \"%s\" (key %s)\n"
+msgstr ""
+
+#, c-format
+msgid "Verified 0 messages signed by \"%s\" (key: %s, policy: %s)."
+msgstr ""
+
+#. TRANSLATORS: The final %s is replaced by a string like
+#. "7 months, 1 day, 5 minutes, 0 seconds".
+#, c-format
+msgid ""
+"Verified %ld message signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgid_plural ""
+"Verified %ld messages signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "The most recent message was verified %s ago."
+msgstr ""
+
+msgid "Warning: we've have yet to see a message signed by this key!\n"
+msgstr ""
+
+msgid "Warning: we've only seen a single message signed by this key!\n"
+msgstr ""
+
+#. TRANSLATORS: translate the below text. We don't
+#. directly internationalize that text so that we can
+#. tweak it without breaking translations.
+#, c-format
+msgid "TOFU: few signatures %d message %s"
+msgid_plural "TOFU: few signatures %d messages %s"
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+#| msgid "error sending %s command: %s\n"
+msgid "error opening TOFU database: %s\n"
+msgstr "error enviando orden %s: %s\n"
+
+#, fuzzy, c-format
#| msgid "`%s' is not a valid long keyID\n"
msgid "'%s' is not a valid long keyID\n"
msgstr "'%s' no es un identificador largo de clave válido\n"
@@ -5686,19 +5969,25 @@ msgstr ""
"no es necesario comprobar la base de datos de confianza\n"
"con el modelo `%s'\n"
-#, c-format
-msgid "public key %s not found: %s\n"
-msgstr "clave pública %s no encontrada: %s\n"
-
msgid "please do a --check-trustdb\n"
msgstr "por favor haga un --check-trustdb\n"
msgid "checking the trustdb\n"
msgstr "comprobando base de datos de confianza\n"
-#, c-format
-msgid "%d keys processed (%d validity counts cleared)\n"
-msgstr "%d claves procesadas (%d validaciones superadas)\n"
+#, fuzzy, c-format
+#| msgid "%lu keys processed so far\n"
+msgid "%d key processed"
+msgid_plural "%d keys processed"
+msgstr[0] "%lu claves procesadas hasta ahora\n"
+msgstr[1] "%lu claves procesadas hasta ahora\n"
+
+#, fuzzy, c-format
+#| msgid "%d keys processed (%d validity counts cleared)\n"
+msgid " (%d validity count cleared)\n"
+msgid_plural " (%d validity counts cleared)\n"
+msgstr[0] "%d claves procesadas (%d validaciones superadas)\n"
+msgstr[1] "%d claves procesadas (%d validaciones superadas)\n"
msgid "no ultimately trusted keys found\n"
msgstr "no se encuentran claves absolutamente fiables\n"
@@ -5708,12 +5997,6 @@ msgid "public key of ultimately trusted key %s not found\n"
msgstr "clave pública de la clave absolutamente fiable %s no encontrada\n"
#, c-format
-msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
-msgstr ""
-"%d dudosa(s) necesarias, %d completa(s) necesarias,\n"
-"modelo de confianza %s\n"
-
-#, c-format
msgid ""
"depth: %d valid: %3d signed: %3d trust: %d-, %dq, %dn, %dm, %df, %du\n"
msgstr ""
@@ -5919,9 +6202,15 @@ msgstr "error recuperando el estatus CHV de la tarjeta\n"
msgid "card is permanently locked!\n"
msgstr "¡la tarjeta está bloqueada permanentemente!\n"
-#, c-format
-msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
-msgstr ""
+#, fuzzy, c-format
+#| msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
+msgid "%d Admin PIN attempt remaining before card is permanently locked\n"
+msgid_plural ""
+"%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr[0] ""
+"%d intentos quedan para PIN de administrador antes de "
+"bloquearpermanentemente la clave\n"
+msgstr[1] ""
"%d intentos quedan para PIN de administrador antes de "
"bloquearpermanentemente la clave\n"
@@ -6006,9 +6295,12 @@ msgstr "por favor, espere mientras se genera la clave ...\n"
msgid "generating key failed\n"
msgstr "la generación de la clave falló\n"
-#, c-format
-msgid "key generation completed (%d seconds)\n"
-msgstr "generación de clave completada (%d segundos)\n"
+#, fuzzy, c-format
+#| msgid "key generation completed (%d seconds)\n"
+msgid "key generation completed (%d second)\n"
+msgid_plural "key generation completed (%d seconds)\n"
+msgstr[0] "generación de clave completada (%d segundos)\n"
+msgstr[1] "generación de clave completada (%d segundos)\n"
msgid "invalid structure of OpenPGP card (DO 0x93)\n"
msgstr "estructura de la tarjeta OpenPGP inválida (DO 0x93)\n"
@@ -8416,6 +8708,11 @@ msgstr "|N|frase contraseña caduca tras N días"
msgid "do not allow the reuse of old passphrases"
msgstr "no permite reusar antiguas frases contraseña"
+#, fuzzy
+#| msgid "|N|set maximum PIN cache lifetime to N seconds"
+msgid "|N|set the Pinentry timeout to N seconds"
+msgstr "|N|establecer vida máxima del caché de PIN en N segundos"
+
msgid "|NAME|use NAME as default secret key"
msgstr "|NOMBRE|usa NOMBRE como clave secreta por defecto"
@@ -8739,6 +9036,94 @@ msgstr ""
"Compara frase contraseña dada en entrada estándar con un fichero de "
"patrones\n"
+#, fuzzy
+#~| msgid "option \"%.50s\" is ambiguous\n"
+#~ msgid "key specification '%s' is ambiguous\n"
+#~ msgstr "la opción \"%.50s\" es ambigua\n"
+
+#~ msgid "%d signatures not checked due to missing keys\n"
+#~ msgstr "%d firmas no comprobadas por falta de clave\n"
+
+#~ msgid "%d signatures not checked due to errors\n"
+#~ msgstr "%d firmas no comprobadas por errores\n"
+
+#~ msgid "1 user ID without valid self-signature detected\n"
+#~ msgstr "Detectado 1 identificador de usuario sin autofirma válida\n"
+
+#~ msgid "Deleted %d signatures.\n"
+#~ msgstr "%d firmas borradas\n"
+
+#~ msgid "User ID \"%s\": %d signatures removed\n"
+#~ msgstr "ID de usuario \"%s\": %d firmas borradas\n"
+
+#~ msgid ""
+#~ "You need a Passphrase to protect your secret key.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Necesita una frase contraseña para proteger su clave secreta.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Please enter a passphrase to protect the off-card backup of the new "
+#~ "encryption key."
+#~ msgstr ""
+#~ "Introduzca la frase contraseña para proteger la copia de seguridadde la "
+#~ "clave externamente a la tarjeta."
+
+#~ msgid "passphrase not correctly repeated; try again"
+#~ msgstr "frase contraseña repetida incorrectamente; inténtelo de nuevo"
+
+#~ msgid "%s.\n"
+#~ msgstr "%s.\n"
+
+#~ msgid ""
+#~ "You don't want a passphrase - this is probably a *bad* idea!\n"
+#~ "I will do it anyway. You can change your passphrase at any time,\n"
+#~ "using this program with the option \"--edit-key\".\n"
+#~ "\n"
+#~ msgstr ""
+#~ "No ha especificado contraseña. Esto es probablemente una *mala* idea.\n"
+#~ "Si más tarde quiere añadir una, puede hacerlo usando este programa con\n"
+#~ "la opción \"--edit-key\".\n"
+#~ "\n"
+
+#~ msgid "storing key onto card failed: %s\n"
+#~ msgstr "almacenado de clave en la tarjeta fallido: %s\n"
+
+#, fuzzy
+#~| msgid "1 bad signature\n"
+#~ msgid "1 good signature\n"
+#~ msgstr "1 firma incorrecta\n"
+
+#, fuzzy
+#~| msgid "renaming `%s' to `%s' failed: %s\n"
+#~ msgid "renaming '%s' to '%s' failed: %s\n"
+#~ msgstr "renombrando `%s' en `%s' fallo: %s\n"
+
+#~ msgid "%lu keys cached (%lu signatures)\n"
+#~ msgstr "%lu claves memorizadas (%lu firmas)\n"
+
+#~ msgid "refreshing 1 key from %s\n"
+#~ msgstr "renovando 1 clave de %s\n"
+
+#~ msgid "sending key %s to %s server %s\n"
+#~ msgstr "enviando clave %s a %s servidor %s\n"
+
+#~ msgid "public key %s is %lu seconds newer than the signature\n"
+#~ msgstr "la clave pública %s es %lu segundos más nueva que la firma\n"
+
+#~ msgid ""
+#~ "key %s was created %lu seconds in the future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "la clave %s fue creada %lu segundos en el futuro (salto en el tiempo\n"
+#~ "o problemas con el reloj)\n"
+
+#~ msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
+#~ msgstr ""
+#~ "%d dudosa(s) necesarias, %d completa(s) necesarias,\n"
+#~ "modelo de confianza %s\n"
+
#~ msgid "cleared passphrase cached with ID: %s\n"
#~ msgstr "borrada frase de paso en caché con ID: %s\n"
@@ -9019,9 +9404,6 @@ msgstr ""
#~ msgid "searching for \"%s\" from %s\n"
#~ msgstr "buscando \"%s\" de %s\n"
-#~ msgid "no keyserver action!\n"
-#~ msgstr "¡no se solicita ninguna acción al servidor de claves!\n"
-
#~ msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n"
#~ msgstr ""
#~ "AVISO: el manejo de claves procede de una versión diferente de GnuPG "
@@ -9794,9 +10176,6 @@ msgstr ""
#~ msgid "ERROR: "
#~ msgstr "ERROR: "
-#~ msgid "WARNING: "
-#~ msgstr "ATENCION: "
-
# bicho :-)
# ¿Error simplemente?
# Uf, preferiría bug, si leo "error" voy a pensar en otra cosa distinta...
@@ -10188,9 +10567,6 @@ msgstr ""
#~ msgid " signed by %08lX at %s%s\n"
#~ msgstr " firmada por %08lX el %s%s\n"
-#~ msgid "Policy: "
-#~ msgstr "Política: "
-
#~ msgid "Experimental algorithms should not be used!\n"
#~ msgstr "¡No se deberían usar algoritmos experimentales!\n"
@@ -10546,9 +10922,6 @@ msgstr ""
#~ msgid "\t%lu due to new pubkeys\n"
#~ msgstr "\t%lu debido a las nuevas claves públicas\n"
-#~ msgid "\t%lu keys updated\n"
-#~ msgstr "\t%lu claves actualizadas\n"
-
#~ msgid "Ooops, no keys\n"
#~ msgstr "Oh oh, no hay claves\n"
@@ -10734,8 +11107,5 @@ msgstr ""
#~ msgid "did not use primary key for insert_trust_record()\n"
#~ msgstr "no se usó clave primaria para insert_trust_record()\n"
-#~ msgid "second"
-#~ msgstr "segundo"
-
#~ msgid "seconds"
#~ msgstr "segundos"
diff --git a/po/et.po b/po/et.po
index 3a883d6..49df7cc 100644
--- a/po/et.po
+++ b/po/et.po
@@ -1238,6 +1238,20 @@ msgid "Enter passphrase: "
msgstr "Sisestage parool: "
#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "error getting version from '%s': %s\n"
+msgstr "viga võtmehoidla `%s' loomisel: %s\n"
+
+#, c-format
+msgid "server '%s' is older than us (%s < %s)"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "WARNING: %s overrides %s\n"
+msgid "WARNING: %s\n"
+msgstr "HOIATUS: %s määrab üle %s\n"
+
+#, fuzzy, c-format
msgid "OpenPGP card not available: %s\n"
msgstr "salajane võti ei ole kättesaadav"
@@ -1744,6 +1758,11 @@ msgid "remove as much as possible from key during export"
msgstr ""
#, fuzzy
+#| msgid "%s: skipped: %s\n"
+msgid " - skipped"
+msgstr "%s: jätsin vahele: %s\n"
+
+#, fuzzy
msgid "exporting secret keys not allowed\n"
msgstr "kirjutan salajase võtme faili `%s'\n"
@@ -1755,19 +1774,36 @@ msgstr "võti %08lX: PGP 2.x stiilis võti - jätsin vahele\n"
msgid "key %s: key material on-card - skipped\n"
msgstr "võti %08lX: alamvõtme allkiri on vales kohas - jätan vahele\n"
-#, fuzzy
-#| msgid "%s: skipped: %s\n"
-msgid " - skipped"
-msgstr "%s: jätsin vahele: %s\n"
-
msgid "WARNING: nothing exported\n"
msgstr "HOIATUS: midagi ei eksporditud\n"
+#, fuzzy, c-format
+#| msgid "error creating `%s': %s\n"
+msgid "error creating '%s': %s\n"
+msgstr "viga `%s' loomisel: %s\n"
+
#, fuzzy
msgid "[User ID not found]"
msgstr "[Kasutaja id puudub]"
#, fuzzy, c-format
+msgid "(check argument of option '%s')\n"
+msgstr "vigased impordi võtmed\n"
+
+#, c-format
+msgid "Warning: '%s' should be a long key ID or a fingerprint\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error looking up: %s\n"
+msgstr "viga `%s' lugemisel: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "Warning: %s appears in the keyring %d times\n"
+msgstr "viga võtmehoidla `%s' loomisel: %s\n"
+
+#, fuzzy, c-format
msgid "automatically retrieved '%s' via %s\n"
msgstr "viga `%s' loomisel: %s\n"
@@ -1784,14 +1820,19 @@ msgid "secret key \"%s\" not found: %s\n"
msgstr "salajast võtit `%s' ei leitud: %s\n"
#, fuzzy, c-format
-msgid "(check argument of option '%s')\n"
-msgstr "vigased impordi võtmed\n"
+#| msgid "|NAME|use NAME as default secret key"
+msgid "Warning: not using '%s' as default key: %s\n"
+msgstr "|NIMI|kasuta NIME vaikimisi salajase võtmena"
#, fuzzy, c-format
#| msgid "|NAME|use NAME as default secret key"
-msgid "using \"%s\" as default secret key\n"
+msgid "using \"%s\" as default secret key for signing\n"
msgstr "|NIMI|kasuta NIME vaikimisi salajase võtmena"
+#, c-format
+msgid "all values passed to '%s' ignored\n"
+msgstr ""
+
#, fuzzy, c-format
msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
msgstr ""
@@ -2151,28 +2192,6 @@ msgid "Note: old default options file '%s' ignored\n"
msgstr "MÄRKUS: ignoreerin vana vaikimisi võtmete faili `%s'\n"
#, c-format
-msgid ""
-"Warning: value '%s' for option '%s' should be a long key ID or a "
-"fingerprint\n"
-msgstr ""
-
-#, c-format
-msgid "key specification '%s' is ambiguous\n"
-msgstr ""
-
-#. TRANSLATORS: The %s prints a key specification which
-#. for example has been given at the command line. Two
-#. lines with fingerprints are printed after this message.
-#, c-format
-msgid "'%s' matches at least:\n"
-msgstr ""
-
-#, fuzzy, c-format
-#| msgid "error creating keyring `%s': %s\n"
-msgid "error searching the keyring: %s\n"
-msgstr "viga võtmehoidla `%s' loomisel: %s\n"
-
-#, c-format
msgid "libgcrypt is too old (need %s, have %s)\n"
msgstr ""
@@ -2378,14 +2397,6 @@ msgid "WARNING: recipients (-r) given without using public key encryption\n"
msgstr ""
"HOIATUS: määrati saajad (-r) aga ei kasutata avaliku võtme krüptograafiat\n"
-#, fuzzy, c-format
-msgid "option '%s' given, but no valid default keys given\n"
-msgstr "vigane räsialgoritm `%s'\n"
-
-#, fuzzy, c-format
-msgid "option '%s' given, but option '%s' not given\n"
-msgstr "vigane räsialgoritm `%s'\n"
-
msgid "--store [filename]"
msgstr "--store [failinimi]"
@@ -2461,6 +2472,11 @@ msgstr "võtmeserverilt lugemine ebaõnnestus: %s\n"
msgid "key export failed: %s\n"
msgstr "võtme eksport ebaõnnestus: %s\n"
+#, fuzzy, c-format
+#| msgid "key export failed: %s\n"
+msgid "export as ssh key failed: %s\n"
+msgstr "võtme eksport ebaõnnestus: %s\n"
+
#, c-format
msgid "keyserver search failed: %s\n"
msgstr "võtmeserveri otsing ebaõnnestus: %s\n"
@@ -2951,33 +2967,33 @@ msgstr "[tühistamine]"
msgid "[self-signature]"
msgstr "[iseenda allkiri]"
-msgid "1 bad signature\n"
-msgstr "1 halb allkiri\n"
-
-#, c-format
-msgid "%d bad signatures\n"
-msgstr "%d halba allkirja\n"
-
-msgid "1 signature not checked due to a missing key\n"
-msgstr "1 allkiri jäi testimata, kuna võti puudub\n"
-
-#, c-format
-msgid "%d signatures not checked due to missing keys\n"
-msgstr "%d allkirja jäi testimata, kuna võtmed puuduvad\n"
-
-msgid "1 signature not checked due to an error\n"
-msgstr "1 allkiri jäi vea tõttu kontrollimata\n"
+#, fuzzy, c-format
+#| msgid "%d bad signatures\n"
+msgid "%d bad signature\n"
+msgid_plural "%d bad signatures\n"
+msgstr[0] "%d halba allkirja\n"
+msgstr[1] "%d halba allkirja\n"
-#, c-format
-msgid "%d signatures not checked due to errors\n"
-msgstr "%d allkirja jäi vigade tõttu kontrollimata\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to a missing key\n"
+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 allkiri jäi testimata, kuna võti puudub\n"
+msgstr[1] "1 allkiri jäi testimata, kuna võti puudub\n"
-msgid "1 user ID without valid self-signature detected\n"
-msgstr "tuvastasin ühe kehtiva iseenda allkirjata kasutaja ID\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to an error\n"
+msgid "%d signature not checked due to an error\n"
+msgid_plural "%d signatures not checked due to errors\n"
+msgstr[0] "1 allkiri jäi vea tõttu kontrollimata\n"
+msgstr[1] "1 allkiri jäi vea tõttu kontrollimata\n"
-#, c-format
-msgid "%d user IDs without valid self-signatures detected\n"
-msgstr "tuvastasin %d kehtiva iseenda allkirjata kasutaja IDd\n"
+#, fuzzy, c-format
+#| msgid "%d user IDs without valid self-signatures detected\n"
+msgid "%d user ID without valid self-signature detected\n"
+msgid_plural "%d user IDs without valid self-signatures detected\n"
+msgstr[0] "tuvastasin %d kehtiva iseenda allkirjata kasutaja IDd\n"
+msgstr[1] "tuvastasin %d kehtiva iseenda allkirjata kasutaja IDd\n"
#, fuzzy
msgid ""
@@ -3612,13 +3628,12 @@ msgstr "Kustutan selle tundmatu allkirja? (j/E/v)"
msgid "Really delete this self-signature? (y/N)"
msgstr "Kas tõesti kustutan selle iseenda allkirja? (j/E)"
-#, c-format
+#, fuzzy, c-format
+#| msgid "Deleted %d signature.\n"
msgid "Deleted %d signature.\n"
-msgstr "Kustutatud %d allkiri.\n"
-
-#, c-format
-msgid "Deleted %d signatures.\n"
-msgstr "Kustutatud %d allkirja.\n"
+msgid_plural "Deleted %d signatures.\n"
+msgstr[0] "Kustutatud %d allkiri.\n"
+msgstr[1] "Kustutatud %d allkiri.\n"
msgid "Nothing deleted.\n"
msgstr "Midagi ei kustutatud.\n"
@@ -3633,11 +3648,9 @@ msgstr "Kasutaja ID \"%s\" on tühistatud."
#, fuzzy, c-format
msgid "User ID \"%s\": %d signature removed\n"
-msgstr "Kasutaja ID \"%s\" on tühistatud."
-
-#, fuzzy, c-format
-msgid "User ID \"%s\": %d signatures removed\n"
-msgstr "Kasutaja ID \"%s\" on tühistatud."
+msgid_plural "User ID \"%s\": %d signatures removed\n"
+msgstr[0] "Kasutaja ID \"%s\" on tühistatud."
+msgstr[1] "Kasutaja ID \"%s\" on tühistatud."
#, fuzzy, c-format
msgid "User ID \"%s\": already minimized\n"
@@ -4170,37 +4183,6 @@ msgid "Please correct the error first\n"
msgstr "Palun parandage kõigepealt viga\n"
msgid ""
-"You need a Passphrase to protect your secret key.\n"
-"\n"
-msgstr ""
-"Te vajate oma salajase võtme kaitsmiseks parooli.\n"
-"\n"
-
-#, fuzzy
-msgid ""
-"Please enter a passphrase to protect the off-card backup of the new "
-"encryption key."
-msgstr "Palun sisestage parool; see on salajane tekst \n"
-
-msgid "passphrase not correctly repeated; try again"
-msgstr "parooli ei korratud õieti; proovige uuesti"
-
-#, c-format
-msgid "%s.\n"
-msgstr "%s.\n"
-
-msgid ""
-"You don't want a passphrase - this is probably a *bad* idea!\n"
-"I will do it anyway. You can change your passphrase at any time,\n"
-"using this program with the option \"--edit-key\".\n"
-"\n"
-msgstr ""
-"Te ei soovi parooli - see on tõenäoliselt *halb* idee!\n"
-"Ma siiski täidan teie soovi. Te saate oma parooli alati muuta,\n"
-"kasutades seda programmi võtmega \"--edit-key\".\n"
-"\n"
-
-msgid ""
"We need to generate a lot of random bytes. It is a good idea to perform\n"
"some other action (type on the keyboard, move the mouse, utilize the\n"
"disks) during the prime generation; this gives the random number\n"
@@ -4245,6 +4227,14 @@ msgid "Key generation canceled.\n"
msgstr "Võtme genereerimine katkestati.\n"
#, fuzzy, c-format
+msgid "can't create backup file '%s': %s\n"
+msgstr "`%s' ei õnnestu luua: %s\n"
+
+#, fuzzy, c-format
+msgid "Note: backup of card key saved to '%s'\n"
+msgstr "MÄRKUS: salajane võti %08lX aegus %s\n"
+
+#, fuzzy, c-format
#| msgid "writing public key to `%s'\n"
msgid "writing public key to '%s'\n"
msgstr "kirjutan avaliku võtme faili `%s'\n"
@@ -4296,18 +4286,6 @@ msgstr "Primaarse võtme salajased komponendid ei ole kättesaadavad.\n"
msgid "Really create? (y/N) "
msgstr "Loon tõesti? "
-#, fuzzy, c-format
-msgid "storing key onto card failed: %s\n"
-msgstr "võtmebloki kustutamine ebaõnnestus: %s\n"
-
-#, fuzzy, c-format
-msgid "can't create backup file '%s': %s\n"
-msgstr "`%s' ei õnnestu luua: %s\n"
-
-#, fuzzy, c-format
-msgid "Note: backup of card key saved to '%s'\n"
-msgstr "MÄRKUS: salajane võti %08lX aegus %s\n"
-
msgid "never "
msgstr "mitte kunagi"
@@ -4326,19 +4304,18 @@ msgstr "Kriitiline allkirja noteerimine: "
msgid "Signature notation: "
msgstr "Allkirja noteerimine: "
-#, fuzzy
-#| msgid "1 bad signature\n"
-msgid "1 good signature\n"
-msgstr "1 halb allkiri\n"
-
#, fuzzy, c-format
#| msgid "%d bad signatures\n"
-msgid "%d good signatures\n"
-msgstr "%d halba allkirja\n"
+msgid "%d good signature\n"
+msgid_plural "%d good signatures\n"
+msgstr[0] "%d halba allkirja\n"
+msgstr[1] "%d halba allkirja\n"
#, c-format
-msgid "Warning: %lu key(s) skipped due to their large size\n"
-msgstr ""
+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] ""
msgid "Keyring"
msgstr "Võtmehoidla"
@@ -4369,20 +4346,27 @@ msgid " Card serial no. ="
msgstr ""
#, fuzzy, c-format
-msgid "renaming '%s' to '%s' failed: %s\n"
-msgstr "pakendamine ebaõnnestus: %s\n"
-
-#, fuzzy, c-format
msgid "caching keyring '%s'\n"
msgstr "kontrollin võtmehoidlat `%s'\n"
#, fuzzy, c-format
-msgid "%lu keys cached so far (%lu signatures)\n"
-msgstr "kontrollitud %lu võtit (%lu allkirja)\n"
+msgid "%lu keys cached so far (%lu signature)\n"
+msgid_plural "%lu keys cached so far (%lu signatures)\n"
+msgstr[0] "kontrollitud %lu võtit (%lu allkirja)\n"
+msgstr[1] "kontrollitud %lu võtit (%lu allkirja)\n"
+
+#, c-format
+msgid "%lu key cached"
+msgid_plural "%lu keys cached"
+msgstr[0] ""
+msgstr[1] ""
#, fuzzy, c-format
-msgid "%lu keys cached (%lu signatures)\n"
-msgstr "kontrollitud %lu võtit (%lu allkirja)\n"
+#| msgid "1 bad signature\n"
+msgid " (%lu signature)\n"
+msgid_plural " (%lu signatures)\n"
+msgstr[0] "1 halb allkiri\n"
+msgstr[1] "1 halb allkiri\n"
#, c-format
msgid "%s: keyring created\n"
@@ -4426,18 +4410,16 @@ msgid "\"%s\" not a key ID: skipping\n"
msgstr ""
#, fuzzy, c-format
-msgid "refreshing 1 key from %s\n"
-msgstr "küsin võtit %08lX võtmeserverist %s\n"
+msgid "refreshing %d key from %s\n"
+msgid_plural "refreshing %d keys from %s\n"
+msgstr[0] "küsin võtit %08lX võtmeserverist %s\n"
+msgstr[1] "küsin võtit %08lX võtmeserverist %s\n"
#, fuzzy, c-format
msgid "WARNING: unable to refresh key %s via %s: %s\n"
msgstr "HOIATUS: ei saa kustutada ajutist faili (%s) `%s': %s\n"
#, fuzzy, c-format
-msgid "refreshing %d keys from %s\n"
-msgstr "küsin võtit %08lX võtmeserverist %s\n"
-
-#, fuzzy, c-format
msgid "key \"%s\" not found on keyserver\n"
msgstr "võtit '%s' ei leitud: %s\n"
@@ -4456,9 +4438,9 @@ msgstr "küsin võtit %08lX võtmeserverist %s\n"
msgid "requesting key %s from %s\n"
msgstr "küsin võtit %08lX võtmeserverist %s\n"
-#, fuzzy, c-format
-msgid "sending key %s to %s server %s\n"
-msgstr "otsin \"%s\" HKP serverist %s\n"
+#, fuzzy
+msgid "no keyserver known\n"
+msgstr "vigased ekspordi võtmed\n"
#, fuzzy, c-format
msgid "sending key %s to %s\n"
@@ -4681,6 +4663,17 @@ msgstr ""
msgid "Note: signatures using the %s algorithm are rejected\n"
msgstr "%s allkiri, sõnumilühendi algoritm %s\n"
+#, fuzzy, c-format
+msgid "(reported error: %s)\n"
+msgstr "viga lugemisel: %s\n"
+
+#, fuzzy, c-format
+msgid "(reported error: %s <%s>)\n"
+msgstr "viga lugemisel: %s\n"
+
+msgid "(further info: "
+msgstr ""
+
#, c-format
msgid "%s:%d: deprecated option \"%s\"\n"
msgstr "%s:%d: ebasoovitav võti \"%s\"\n"
@@ -5086,6 +5079,19 @@ msgstr "%s: jätsin vahele: avalik võti on blokeeritud\n"
msgid "%s: skipped: public key already present\n"
msgstr "%s: jätsin vahele: avalik võti on juba olemas\n"
+#, fuzzy, c-format
+#| msgid "can't connect to `%s': %s\n"
+msgid "can't encrypt to '%s'\n"
+msgstr "ei õnnestu luua ühendust serveriga `%s': %s\n"
+
+#, fuzzy, c-format
+msgid "option '%s' given, but no valid default keys given\n"
+msgstr "vigane räsialgoritm `%s'\n"
+
+#, fuzzy, c-format
+msgid "option '%s' given, but option '%s' not given\n"
+msgstr "vigane räsialgoritm `%s'\n"
+
msgid "You did not specify a user ID. (you may use \"-r\")\n"
msgstr "Te ei määranud kasutaja IDd. (võite kasutada võtit \"-r\")\n"
@@ -5129,11 +5135,6 @@ msgstr "võti %08lX: kasutaja ID puudub\n"
msgid "data not saved; use option \"--output\" to save it\n"
msgstr "andmeid ei salvestatud; salvestamiseks kasutage võtit \"--output\"\n"
-#, fuzzy, c-format
-#| msgid "error creating `%s': %s\n"
-msgid "error creating '%s': %s\n"
-msgstr "viga `%s' loomisel: %s\n"
-
msgid "Detached signature.\n"
msgstr "Eraldiseisev allkiri.\n"
@@ -5226,19 +5227,31 @@ msgid "This is a revocation certificate for the OpenPGP key:"
msgstr "Loon sellele võtmele tühistamise sertifikaadi? "
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 ""
+
+msgid ""
"Use it to revoke this key in case of a compromise or loss of\n"
"the secret key. However, if the secret key is still accessible,\n"
"it is better to generate a new revocation certificate and give\n"
-"a reason for the revocation."
+"a reason for the revocation. For details see the description of\n"
+"of the gpg command \"--gen-revoke\" in the GnuPG manual."
msgstr ""
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 making use of this revocation certificate."
+"before importing and publishing this revocation certificate."
msgstr ""
#, fuzzy, c-format
+#| msgid "Revocation certificate created.\n"
+msgid "revocation certificate stored as '%s.rev'\n"
+msgstr "Tühistamise sertifikaat on loodud.\n"
+
+#, fuzzy, c-format
msgid "secret key \"%s\" not found\n"
msgstr "salajast võtit `%s' ei leitud: %s\n"
@@ -5249,6 +5262,11 @@ msgstr "salajast võtit `%s' ei leitud: %s\n"
msgid "'%s' matches multiple secret keys:\n"
msgstr ""
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "error searching the keyring: %s\n"
+msgstr "viga võtmehoidla `%s' loomisel: %s\n"
+
#, fuzzy
msgid "Create a revocation certificate for this key? (y/N) "
msgstr "Loon sellele võtmele tühistamise sertifikaadi? "
@@ -5331,21 +5349,30 @@ msgstr "HOIATUS: allkirjastamise alamvõtmel %08lX on vigane rist-sertifikaat\n"
#, fuzzy, c-format
msgid "public key %s is %lu second newer than the signature\n"
-msgstr "avalik võti %08lX on %lu sekund uuem, kui allkiri\n"
+msgid_plural "public key %s is %lu seconds newer than the signature\n"
+msgstr[0] "avalik võti %08lX on %lu sekund uuem, kui allkiri\n"
+msgstr[1] "avalik võti %08lX on %lu sekund uuem, kui allkiri\n"
#, fuzzy, c-format
-msgid "public key %s is %lu seconds newer than the signature\n"
-msgstr "avalik võti %08lX on %lu sekundit uuem, kui allkiri\n"
+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] "avalik võti %08lX on %lu sekund uuem, kui allkiri\n"
+msgstr[1] "avalik võti %08lX on %lu sekund uuem, kui allkiri\n"
#, fuzzy, c-format
msgid ""
"key %s was created %lu second in the future (time warp or clock problem)\n"
-msgstr "võti loodi %lu sekund tulevikus (ajahüpe või kella probleem)\n"
+msgid_plural ""
+"key %s was created %lu seconds in the future (time warp or clock problem)\n"
+msgstr[0] "võti loodi %lu sekund tulevikus (ajahüpe või kella probleem)\n"
+msgstr[1] "võti loodi %lu sekund tulevikus (ajahüpe või kella probleem)\n"
#, fuzzy, c-format
-msgid ""
-"key %s was created %lu seconds in the future (time warp or clock problem)\n"
-msgstr "võti loodi %lu sekundit tulevikus (ajahüpe või kella probleem)\n"
+msgid "key %s was created %lu day in the future (time warp or clock problem)\n"
+msgid_plural ""
+"key %s was created %lu days in the future (time warp or clock problem)\n"
+msgstr[0] "võti loodi %lu sekund tulevikus (ajahüpe või kella probleem)\n"
+msgstr[1] "võti loodi %lu sekund tulevikus (ajahüpe või kella probleem)\n"
#, fuzzy, c-format
msgid "Note: signature key %s expired %s\n"
@@ -5578,6 +5605,237 @@ msgid "input line longer than %d characters\n"
msgstr "sisendrida on pikem, kui %d sümbolit\n"
#, fuzzy, c-format
+msgid "error beginning transaction on TOFU database: %s\n"
+msgstr "viga teate saatmisel serverile `%s': %s\n"
+
+#, c-format
+msgid "error committing transaction on TOFU database: %s\n"
+msgstr ""
+
+#, c-format
+msgid "error rolling back transaction on TOFU database: %s\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "unsupported TOFU database version: %s\n"
+msgstr ""
+"\n"
+"Toetatud algoritmid:\n"
+
+#, fuzzy, c-format
+msgid "error reading TOFU database: %s\n"
+msgstr "viga teate saatmisel serverile `%s': %s\n"
+
+#, fuzzy, c-format
+#| msgid "error writing secret keyring `%s': %s\n"
+msgid "error determining TOFU database's version: %s\n"
+msgstr "viga salajase võtme võtmehoidlasse `%s' kirjutamisel: %s\n"
+
+#, fuzzy, c-format
+#| msgid "%s: error writing dir record: %s\n"
+msgid "error initializing TOFU database: %s\n"
+msgstr "%s: viga kataloogikirje kirjutamisel: %s\n"
+
+#, fuzzy, c-format
+msgid "error opening TOFU database '%s': %s\n"
+msgstr "viga `%s' lugemisel: %s\n"
+
+msgid "Warning: Home directory contains both tofu.db and tofu.d.\n"
+msgstr ""
+
+msgid "Using split format for TOFU database\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error updating TOFU database: %s\n"
+msgstr "viga teate saatmisel serverile `%s': %s\n"
+
+#, fuzzy, c-format
+msgid "public key %s not found: %s\n"
+msgstr "ei leia avalikku võtit %08lX: %s\n"
+
+#, fuzzy, c-format
+msgid "error setting TOFU binding's trust level to %s\n"
+msgstr "viga `%s' lugemisel: %s\n"
+
+#, c-format
+msgid "The binding %s is NOT known."
+msgstr ""
+
+#, c-format
+msgid ""
+"The key %s raised a conflict with this binding (%s). Since this binding's "
+"policy was 'auto', it was changed to 'ask'."
+msgstr ""
+
+#, c-format
+msgid ""
+"Please indicate whether you believe the binding %s%sis legitimate (the key "
+"belongs to the stated owner) or a forgery (bad)."
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error gathering other user IDs: %s\n"
+msgstr "viga parooli loomisel: %s\n"
+
+msgid "Known user IDs associated with this key:\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "Policy: "
+msgid "policy: %s"
+msgstr "Poliis: "
+
+#, fuzzy, c-format
+msgid "error gathering signature stats: %s\n"
+msgstr "viga parooli loomisel: %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] ""
+msgstr[1] ""
+
+#, c-format
+msgid "Statistics for keys with the email address \"%s\":\n"
+msgstr ""
+
+#, fuzzy
+#| msgid "list keys"
+msgid "this key"
+msgstr "näita võtmeid"
+
+#, c-format
+msgid "%ld message signed in the future."
+msgid_plural "%ld messages signed in the future."
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+msgid "%ld message signed"
+msgid_plural "%ld messages signed"
+msgstr[0] "|algo [failid]|trüki teatelühendid"
+msgstr[1] "|algo [failid]|trüki teatelühendid"
+
+#, c-format
+msgid " over the past %ld day."
+msgid_plural " over the past %ld days."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid " over the past %ld week."
+msgid_plural " over the past %ld weeks."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid " over the past %ld month."
+msgid_plural " over the past %ld months."
+msgstr[0] ""
+msgstr[1] ""
+
+#. 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 ""
+
+#. 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 ""
+
+msgid "(G)ood, (A)ccept once, (U)nknown, (R)eject once, (B)ad? "
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error changing TOFU policy: %s\n"
+msgstr "viga parooli loomisel: %s\n"
+
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "Have never verified a message signed by key %s!\n"
+msgstr ""
+
+#, c-format
+msgid "Failed to collect signature statistics for \"%s\" (key %s)\n"
+msgstr ""
+
+#, c-format
+msgid "Verified 0 messages signed by \"%s\" (key: %s, policy: %s)."
+msgstr ""
+
+#. TRANSLATORS: The final %s is replaced by a string like
+#. "7 months, 1 day, 5 minutes, 0 seconds".
+#, c-format
+msgid ""
+"Verified %ld message signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgid_plural ""
+"Verified %ld messages signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "The most recent message was verified %s ago."
+msgstr ""
+
+msgid "Warning: we've have yet to see a message signed by this key!\n"
+msgstr ""
+
+msgid "Warning: we've only seen a single message signed by this key!\n"
+msgstr ""
+
+#. TRANSLATORS: translate the below text. We don't
+#. directly internationalize that text so that we can
+#. tweak it without breaking translations.
+#, c-format
+msgid "TOFU: few signatures %d message %s"
+msgid_plural "TOFU: few signatures %d messages %s"
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+msgid "error opening TOFU database: %s\n"
+msgstr "viga teate saatmisel serverile `%s': %s\n"
+
+#, fuzzy, c-format
#| msgid "`%s' is not a valid long keyID\n"
msgid "'%s' is not a valid long keyID\n"
msgstr "`%s' ei ole kehtiv pikk võtmeID\n"
@@ -5635,19 +5893,24 @@ msgstr "trustdb kontrolliks puudub vajadus\n"
msgid "no need for a trustdb update with '%s' trust model\n"
msgstr "trustdb kontrolliks puudub vajadus\n"
-#, fuzzy, c-format
-msgid "public key %s not found: %s\n"
-msgstr "ei leia avalikku võtit %08lX: %s\n"
-
msgid "please do a --check-trustdb\n"
msgstr "palun tehke --check-trustdb\n"
msgid "checking the trustdb\n"
msgstr "kontrollin trustdb faili\n"
-#, c-format
-msgid "%d keys processed (%d validity counts cleared)\n"
-msgstr "%d võtit töödeldud (%d kehtivust puhastatud)\n"
+#, fuzzy, c-format
+msgid "%d key processed"
+msgid_plural "%d keys processed"
+msgstr[0] "%lu võtit on seni töödeldud\n"
+msgstr[1] "%lu võtit on seni töödeldud\n"
+
+#, fuzzy, c-format
+#| msgid "%d keys processed (%d validity counts cleared)\n"
+msgid " (%d validity count cleared)\n"
+msgid_plural " (%d validity counts cleared)\n"
+msgstr[0] "%d võtit töödeldud (%d kehtivust puhastatud)\n"
+msgstr[1] "%d võtit töödeldud (%d kehtivust puhastatud)\n"
msgid "no ultimately trusted keys found\n"
msgstr "absoluutselt usaldatavaid võtmeid pole\n"
@@ -5657,10 +5920,6 @@ msgid "public key of ultimately trusted key %s not found\n"
msgstr "puudub absoluutselt usaldatava võtme %08lX avalik võti\n"
#, c-format
-msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
-msgstr ""
-
-#, c-format
msgid ""
"depth: %d valid: %3d signed: %3d trust: %d-, %dq, %dn, %dm, %df, %du\n"
msgstr ""
@@ -5859,8 +6118,11 @@ msgid "card is permanently locked!\n"
msgstr ""
#, c-format
-msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
-msgstr ""
+msgid "%d Admin PIN attempt remaining before card is permanently locked\n"
+msgid_plural ""
+"%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr[0] ""
+msgstr[1] ""
#. TRANSLATORS: Do not translate the "|A|" prefix but keep it at
#. the start of the string. Use %%0A to force a linefeed.
@@ -5950,8 +6212,10 @@ msgid "generating key failed\n"
msgstr "võtmebloki kustutamine ebaõnnestus: %s\n"
#, fuzzy, c-format
-msgid "key generation completed (%d seconds)\n"
-msgstr "Võtme genereerimine ebaõnnestus: %s\n"
+msgid "key generation completed (%d second)\n"
+msgid_plural "key generation completed (%d seconds)\n"
+msgstr[0] "Võtme genereerimine ebaõnnestus: %s\n"
+msgstr[1] "Võtme genereerimine ebaõnnestus: %s\n"
msgid "invalid structure of OpenPGP card (DO 0x93)\n"
msgstr ""
@@ -8149,6 +8413,9 @@ msgstr "|N|kasuta parooli moodi N"
msgid "do not allow the reuse of old passphrases"
msgstr "viga parooli loomisel: %s\n"
+msgid "|N|set the Pinentry timeout to N seconds"
+msgstr ""
+
msgid "|NAME|use NAME as default secret key"
msgstr "|NIMI|kasuta NIME vaikimisi salajase võtmena"
@@ -8445,6 +8712,87 @@ msgid ""
"Check a passphrase given on stdin against the patternfile\n"
msgstr ""
+#~ msgid "%d signatures not checked due to missing keys\n"
+#~ msgstr "%d allkirja jäi testimata, kuna võtmed puuduvad\n"
+
+#~ msgid "%d signatures not checked due to errors\n"
+#~ msgstr "%d allkirja jäi vigade tõttu kontrollimata\n"
+
+#~ msgid "1 user ID without valid self-signature detected\n"
+#~ msgstr "tuvastasin ühe kehtiva iseenda allkirjata kasutaja ID\n"
+
+#~ msgid "Deleted %d signatures.\n"
+#~ msgstr "Kustutatud %d allkirja.\n"
+
+#, fuzzy
+#~ msgid "User ID \"%s\": %d signatures removed\n"
+#~ msgstr "Kasutaja ID \"%s\" on tühistatud."
+
+#~ msgid ""
+#~ "You need a Passphrase to protect your secret key.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Te vajate oma salajase võtme kaitsmiseks parooli.\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "Please enter a passphrase to protect the off-card backup of the new "
+#~ "encryption key."
+#~ msgstr "Palun sisestage parool; see on salajane tekst \n"
+
+#~ msgid "passphrase not correctly repeated; try again"
+#~ msgstr "parooli ei korratud õieti; proovige uuesti"
+
+#~ msgid "%s.\n"
+#~ msgstr "%s.\n"
+
+#~ msgid ""
+#~ "You don't want a passphrase - this is probably a *bad* idea!\n"
+#~ "I will do it anyway. You can change your passphrase at any time,\n"
+#~ "using this program with the option \"--edit-key\".\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Te ei soovi parooli - see on tõenäoliselt *halb* idee!\n"
+#~ "Ma siiski täidan teie soovi. Te saate oma parooli alati muuta,\n"
+#~ "kasutades seda programmi võtmega \"--edit-key\".\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid "storing key onto card failed: %s\n"
+#~ msgstr "võtmebloki kustutamine ebaõnnestus: %s\n"
+
+#, fuzzy
+#~| msgid "1 bad signature\n"
+#~ msgid "1 good signature\n"
+#~ msgstr "1 halb allkiri\n"
+
+#, fuzzy
+#~ msgid "renaming '%s' to '%s' failed: %s\n"
+#~ msgstr "pakendamine ebaõnnestus: %s\n"
+
+#, fuzzy
+#~ msgid "%lu keys cached (%lu signatures)\n"
+#~ msgstr "kontrollitud %lu võtit (%lu allkirja)\n"
+
+#, fuzzy
+#~ msgid "refreshing 1 key from %s\n"
+#~ msgstr "küsin võtit %08lX võtmeserverist %s\n"
+
+#, fuzzy
+#~ msgid "sending key %s to %s server %s\n"
+#~ msgstr "otsin \"%s\" HKP serverist %s\n"
+
+#, fuzzy
+#~ msgid "public key %s is %lu seconds newer than the signature\n"
+#~ msgstr "avalik võti %08lX on %lu sekundit uuem, kui allkiri\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "key %s was created %lu seconds in the future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr "võti loodi %lu sekundit tulevikus (ajahüpe või kella probleem)\n"
+
#, fuzzy
#~| msgid "can't open the keyring"
#~ msgid "Failed to open the keyring DB.\n"
@@ -8694,10 +9042,6 @@ msgstr ""
#~ msgstr "otsin \"%s\" HKP serverist %s\n"
#, fuzzy
-#~ msgid "no keyserver action!\n"
-#~ msgstr "vigased ekspordi võtmed\n"
-
-#, fuzzy
#~ msgid "keyserver timed out\n"
#~ msgstr "võtmeserveri viga"
@@ -9866,9 +10210,6 @@ msgstr ""
#~ msgid "%s%c %4u%c/%08lX created: %s expires: %s"
#~ msgstr "%s%c %4u%c/%08lX loodud: %s aegub: %s"
-#~ msgid "Policy: "
-#~ msgstr "Poliis: "
-
#~ msgid "can't get key from keyserver: %s\n"
#~ msgstr "võtmeserverist ei saa võtit: %s\n"
diff --git a/po/fi.po b/po/fi.po
index c3a6688..681d891 100644
--- a/po/fi.po
+++ b/po/fi.po
@@ -1257,6 +1257,20 @@ msgid "Enter passphrase: "
msgstr "Syötä salasana: "
#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "error getting version from '%s': %s\n"
+msgstr "virhe luotaessa avainrengasta \"%s\": %s\n"
+
+#, c-format
+msgid "server '%s' is older than us (%s < %s)"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "WARNING: %s overrides %s\n"
+msgid "WARNING: %s\n"
+msgstr "VAROITUS: %s korvaa %s:n\n"
+
+#, fuzzy, c-format
msgid "OpenPGP card not available: %s\n"
msgstr "salaista avainta ei löydy"
@@ -1759,6 +1773,11 @@ msgid "remove as much as possible from key during export"
msgstr ""
#, fuzzy
+#| msgid "%s: skipped: %s\n"
+msgid " - skipped"
+msgstr "%s: ohitettu: %s\n"
+
+#, fuzzy
msgid "exporting secret keys not allowed\n"
msgstr "kirjoitan salaisen avaimen kohteeseen \"%s\"\n"
@@ -1770,19 +1789,36 @@ msgstr "avain %08lX: PGP 2.x -muodon avain - ohitetaan\n"
msgid "key %s: key material on-card - skipped\n"
msgstr "avain %08lX: aliavaimen allekirjoitus väärässä paikassa - ohitetaan\n"
-#, fuzzy
-#| msgid "%s: skipped: %s\n"
-msgid " - skipped"
-msgstr "%s: ohitettu: %s\n"
-
msgid "WARNING: nothing exported\n"
msgstr "VAROITUS: mitään ei viety\n"
+#, fuzzy, c-format
+#| msgid "error creating `%s': %s\n"
+msgid "error creating '%s': %s\n"
+msgstr "virhe luotaessa \"%s\": %s\n"
+
#, fuzzy
msgid "[User ID not found]"
msgstr "[Käyttäjätunnusta ei löytynyt]"
#, fuzzy, c-format
+msgid "(check argument of option '%s')\n"
+msgstr "virheelliset tuontivalitsimet\n"
+
+#, c-format
+msgid "Warning: '%s' should be a long key ID or a fingerprint\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error looking up: %s\n"
+msgstr "virhe luettaessa tiedostoa \"%s\": %s\n"
+
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "Warning: %s appears in the keyring %d times\n"
+msgstr "virhe luotaessa avainrengasta \"%s\": %s\n"
+
+#, fuzzy, c-format
msgid "automatically retrieved '%s' via %s\n"
msgstr "virhe luotaessa \"%s\": %s\n"
@@ -1799,14 +1835,19 @@ msgid "secret key \"%s\" not found: %s\n"
msgstr "salaista avainta \"%s\" ei löydy: %s\n"
#, fuzzy, c-format
-msgid "(check argument of option '%s')\n"
-msgstr "virheelliset tuontivalitsimet\n"
+#| msgid "|NAME|use NAME as default secret key"
+msgid "Warning: not using '%s' as default key: %s\n"
+msgstr "|NIMI|käytä oletusarvoisesti salaista avainta NIMI"
#, fuzzy, c-format
#| msgid "|NAME|use NAME as default secret key"
-msgid "using \"%s\" as default secret key\n"
+msgid "using \"%s\" as default secret key for signing\n"
msgstr "|NIMI|käytä oletusarvoisesti salaista avainta NIMI"
+#, c-format
+msgid "all values passed to '%s' ignored\n"
+msgstr ""
+
#, fuzzy, c-format
msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
msgstr ""
@@ -2166,28 +2207,6 @@ msgid "Note: old default options file '%s' ignored\n"
msgstr "HUOM: Vanhat oletusarvoiset asetukset löytyvät tiedostosta \"%s\"\n"
#, c-format
-msgid ""
-"Warning: value '%s' for option '%s' should be a long key ID or a "
-"fingerprint\n"
-msgstr ""
-
-#, c-format
-msgid "key specification '%s' is ambiguous\n"
-msgstr ""
-
-#. TRANSLATORS: The %s prints a key specification which
-#. for example has been given at the command line. Two
-#. lines with fingerprints are printed after this message.
-#, c-format
-msgid "'%s' matches at least:\n"
-msgstr ""
-
-#, fuzzy, c-format
-#| msgid "error creating keyring `%s': %s\n"
-msgid "error searching the keyring: %s\n"
-msgstr "virhe luotaessa avainrengasta \"%s\": %s\n"
-
-#, c-format
msgid "libgcrypt is too old (need %s, have %s)\n"
msgstr ""
@@ -2394,14 +2413,6 @@ msgid "WARNING: recipients (-r) given without using public key encryption\n"
msgstr ""
"VAROITUS: vastaanottajia (-r) annettu käyttämättä julkisen avaimen salausta\n"
-#, fuzzy, c-format
-msgid "option '%s' given, but no valid default keys given\n"
-msgstr "virheellinen tiivistealgoritmi \"%s\"\n"
-
-#, fuzzy, c-format
-msgid "option '%s' given, but option '%s' not given\n"
-msgstr "virheellinen tiivistealgoritmi \"%s\"\n"
-
msgid "--store [filename]"
msgstr "--store [tiedostonimi]"
@@ -2477,6 +2488,11 @@ msgstr "avainpalvelimelta vastaanotto epäonnistui: %s\n"
msgid "key export failed: %s\n"
msgstr "avaimen vienti epäonnistui: %s\n"
+#, fuzzy, c-format
+#| msgid "key export failed: %s\n"
+msgid "export as ssh key failed: %s\n"
+msgstr "avaimen vienti epäonnistui: %s\n"
+
#, c-format
msgid "keyserver search failed: %s\n"
msgstr "avainpalvelimelta etsiminen epäonnistui: %s\n"
@@ -2970,33 +2986,34 @@ msgstr "[mitätöinti]"
msgid "[self-signature]"
msgstr "[oma-allekirjoitus]"
-msgid "1 bad signature\n"
-msgstr "1 väärä allekirjoitus\n"
-
-#, c-format
-msgid "%d bad signatures\n"
-msgstr "%d väärää allekirjoitusta\n"
-
-msgid "1 signature not checked due to a missing key\n"
-msgstr "1 allekirjoitus jätetty tarkistamatta puuttuvan avaimen vuoksi\n"
-
-#, c-format
-msgid "%d signatures not checked due to missing keys\n"
-msgstr "%d allekirjoitusta jätetty tarkistamatta puuttuvien avainten vuoksi\n"
-
-msgid "1 signature not checked due to an error\n"
-msgstr "1 allekirjoitus jätetty tarkistamatta virheen vuoksi\n"
+#, fuzzy, c-format
+#| msgid "%d bad signatures\n"
+msgid "%d bad signature\n"
+msgid_plural "%d bad signatures\n"
+msgstr[0] "%d väärää allekirjoitusta\n"
+msgstr[1] "%d väärää allekirjoitusta\n"
-#, c-format
-msgid "%d signatures not checked due to errors\n"
-msgstr "%d allekirjoitusta jätetty tarkistamatta virheiden vuoksi\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to a missing key\n"
+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 allekirjoitus jätetty tarkistamatta puuttuvan avaimen vuoksi\n"
+msgstr[1] "1 allekirjoitus jätetty tarkistamatta puuttuvan avaimen vuoksi\n"
-msgid "1 user ID without valid self-signature detected\n"
-msgstr "havaittiin 1 käyttäjätunnus ilman voimassaolevaa oma-allekirjoitusta\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to an error\n"
+msgid "%d signature not checked due to an error\n"
+msgid_plural "%d signatures not checked due to errors\n"
+msgstr[0] "1 allekirjoitus jätetty tarkistamatta virheen vuoksi\n"
+msgstr[1] "1 allekirjoitus jätetty tarkistamatta virheen vuoksi\n"
-#, c-format
-msgid "%d user IDs without valid self-signatures detected\n"
-msgstr ""
+#, fuzzy, c-format
+#| msgid "%d user IDs without valid self-signatures detected\n"
+msgid "%d user ID without valid self-signature detected\n"
+msgid_plural "%d user IDs without valid self-signatures detected\n"
+msgstr[0] ""
+"havaittiin %d käyttäjätunnusta ilman voimassaolevaa oma-allekirjoitusta\n"
+msgstr[1] ""
"havaittiin %d käyttäjätunnusta ilman voimassaolevaa oma-allekirjoitusta\n"
#, fuzzy
@@ -3633,13 +3650,12 @@ msgstr "Poistetaanko tämä tuntematon allekirjoitus? (k/E/l)"
msgid "Really delete this self-signature? (y/N)"
msgstr "Varmastiko poista oma-allekirjoitus? (k/E)"
-#, c-format
+#, fuzzy, c-format
+#| msgid "Deleted %d signature.\n"
msgid "Deleted %d signature.\n"
-msgstr "%d allekirjoitus poistettu.\n"
-
-#, c-format
-msgid "Deleted %d signatures.\n"
-msgstr "%d allekirjoitusta poistettu.\n"
+msgid_plural "Deleted %d signatures.\n"
+msgstr[0] "%d allekirjoitus poistettu.\n"
+msgstr[1] "%d allekirjoitus poistettu.\n"
msgid "Nothing deleted.\n"
msgstr "Mitään ei poistettu.\n"
@@ -3654,11 +3670,9 @@ msgstr "Käyttäjätunnus \"%s\" on mitätöity."
#, fuzzy, c-format
msgid "User ID \"%s\": %d signature removed\n"
-msgstr "Käyttäjätunnus \"%s\" on mitätöity."
-
-#, fuzzy, c-format
-msgid "User ID \"%s\": %d signatures removed\n"
-msgstr "Käyttäjätunnus \"%s\" on mitätöity."
+msgid_plural "User ID \"%s\": %d signatures removed\n"
+msgstr[0] "Käyttäjätunnus \"%s\" on mitätöity."
+msgstr[1] "Käyttäjätunnus \"%s\" on mitätöity."
#, fuzzy, c-format
msgid "User ID \"%s\": already minimized\n"
@@ -4198,37 +4212,6 @@ msgid "Please correct the error first\n"
msgstr "Ole hyvä ja korjaa ensin virhe\n"
msgid ""
-"You need a Passphrase to protect your secret key.\n"
-"\n"
-msgstr ""
-"Tarvitset salasanan suojaamaan salaista avaintasi.\n"
-"\n"
-
-#, fuzzy
-msgid ""
-"Please enter a passphrase to protect the off-card backup of the new "
-"encryption key."
-msgstr "Ole hyvä ja syötä salasana, tämän on salainen lause \n"
-
-msgid "passphrase not correctly repeated; try again"
-msgstr "salasanaa ei toistettu oikein, yritä uudestaan."
-
-#, c-format
-msgid "%s.\n"
-msgstr "%s.\n"
-
-msgid ""
-"You don't want a passphrase - this is probably a *bad* idea!\n"
-"I will do it anyway. You can change your passphrase at any time,\n"
-"using this program with the option \"--edit-key\".\n"
-"\n"
-msgstr ""
-"Et halunnut salasanaa - tämä on luultavasti *huono* ajatus!\n"
-"Jatketaan silti. Voit vaihtaa salasanaa milloin tahansa\n"
-"tämän ohjelman valitsimella \"--edit-key\".\n"
-"\n"
-
-msgid ""
"We need to generate a lot of random bytes. It is a good idea to perform\n"
"some other action (type on the keyboard, move the mouse, utilize the\n"
"disks) during the prime generation; this gives the random number\n"
@@ -4273,6 +4256,14 @@ msgid "Key generation canceled.\n"
msgstr "Avaimen luonti keskeytetty.\n"
#, fuzzy, c-format
+msgid "can't create backup file '%s': %s\n"
+msgstr "tiedostoa \"%s\" ei voi luoda: %s\n"
+
+#, fuzzy, c-format
+msgid "Note: backup of card key saved to '%s'\n"
+msgstr "HUOM: salainen avain %08lX vanheni %s\n"
+
+#, fuzzy, c-format
#| msgid "writing public key to `%s'\n"
msgid "writing public key to '%s'\n"
msgstr "kirjoitan julkisen avaimen kohteeseen \"%s\"\n"
@@ -4327,18 +4318,6 @@ msgstr "Ensisijaisen avaimen salaiset osat eivät ole saatavilla.\n"
msgid "Really create? (y/N) "
msgstr "Haluatko varmasti luoda? "
-#, fuzzy, c-format
-msgid "storing key onto card failed: %s\n"
-msgstr "avainlohkojen poisto epäonnistui: %s\n"
-
-#, fuzzy, c-format
-msgid "can't create backup file '%s': %s\n"
-msgstr "tiedostoa \"%s\" ei voi luoda: %s\n"
-
-#, fuzzy, c-format
-msgid "Note: backup of card key saved to '%s'\n"
-msgstr "HUOM: salainen avain %08lX vanheni %s\n"
-
msgid "never "
msgstr "ei koskaan"
@@ -4357,19 +4336,18 @@ msgstr "Kriittinen allekirjoitusnotaatio: "
msgid "Signature notation: "
msgstr "Allekirjoitusnotaatio: "
-#, fuzzy
-#| msgid "1 bad signature\n"
-msgid "1 good signature\n"
-msgstr "1 väärä allekirjoitus\n"
-
#, fuzzy, c-format
#| msgid "%d bad signatures\n"
-msgid "%d good signatures\n"
-msgstr "%d väärää allekirjoitusta\n"
+msgid "%d good signature\n"
+msgid_plural "%d good signatures\n"
+msgstr[0] "%d väärää allekirjoitusta\n"
+msgstr[1] "%d väärää allekirjoitusta\n"
#, c-format
-msgid "Warning: %lu key(s) skipped due to their large size\n"
-msgstr ""
+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] ""
msgid "Keyring"
msgstr "Avainrengas"
@@ -4400,20 +4378,27 @@ msgid " Card serial no. ="
msgstr ""
#, fuzzy, c-format
-msgid "renaming '%s' to '%s' failed: %s\n"
-msgstr "ascii-koodaaminen epäonnistui: %s\n"
-
-#, fuzzy, c-format
msgid "caching keyring '%s'\n"
msgstr "tarkistetaan avainrengasta \"%s\"\n"
#, fuzzy, c-format
-msgid "%lu keys cached so far (%lu signatures)\n"
-msgstr "käsiteltiin %lu avainta (%lu allekirjoitusta)\n"
+msgid "%lu keys cached so far (%lu signature)\n"
+msgid_plural "%lu keys cached so far (%lu signatures)\n"
+msgstr[0] "käsiteltiin %lu avainta (%lu allekirjoitusta)\n"
+msgstr[1] "käsiteltiin %lu avainta (%lu allekirjoitusta)\n"
+
+#, c-format
+msgid "%lu key cached"
+msgid_plural "%lu keys cached"
+msgstr[0] ""
+msgstr[1] ""
#, fuzzy, c-format
-msgid "%lu keys cached (%lu signatures)\n"
-msgstr "käsiteltiin %lu avainta (%lu allekirjoitusta)\n"
+#| msgid "1 bad signature\n"
+msgid " (%lu signature)\n"
+msgid_plural " (%lu signatures)\n"
+msgstr[0] "1 väärä allekirjoitus\n"
+msgstr[1] "1 väärä allekirjoitus\n"
#, c-format
msgid "%s: keyring created\n"
@@ -4457,18 +4442,16 @@ msgid "\"%s\" not a key ID: skipping\n"
msgstr ""
#, fuzzy, c-format
-msgid "refreshing 1 key from %s\n"
-msgstr "pyydetään avainta %08lX kohteesta %s\n"
+msgid "refreshing %d key from %s\n"
+msgid_plural "refreshing %d keys from %s\n"
+msgstr[0] "pyydetään avainta %08lX kohteesta %s\n"
+msgstr[1] "pyydetään avainta %08lX kohteesta %s\n"
#, fuzzy, c-format
msgid "WARNING: unable to refresh key %s via %s: %s\n"
msgstr "VAROITUS: tilapäistiedostoa (%s) \"%s\" ei voi poistaa: %s\n"
#, fuzzy, c-format
-msgid "refreshing %d keys from %s\n"
-msgstr "pyydetään avainta %08lX kohteesta %s\n"
-
-#, fuzzy, c-format
msgid "key \"%s\" not found on keyserver\n"
msgstr "avainta \"%s\" ei löydy: %s\n"
@@ -4487,9 +4470,9 @@ msgstr "pyydetään avainta %08lX kohteesta %s\n"
msgid "requesting key %s from %s\n"
msgstr "pyydetään avainta %08lX kohteesta %s\n"
-#, fuzzy, c-format
-msgid "sending key %s to %s server %s\n"
-msgstr "etsitään \"%s\" HKP-palvelimelta %s\n"
+#, fuzzy
+msgid "no keyserver known\n"
+msgstr "virheelliset vientivalitsimet\n"
#, fuzzy, c-format
msgid "sending key %s to %s\n"
@@ -4720,6 +4703,17 @@ msgstr ""
msgid "Note: signatures using the %s algorithm are rejected\n"
msgstr "%sallekirjoitus, tiivistealgoritmi %s\n"
+#, fuzzy, c-format
+msgid "(reported error: %s)\n"
+msgstr "lukuvirhe: %s\n"
+
+#, fuzzy, c-format
+msgid "(reported error: %s <%s>)\n"
+msgstr "lukuvirhe: %s\n"
+
+msgid "(further info: "
+msgstr ""
+
#, c-format
msgid "%s:%d: deprecated option \"%s\"\n"
msgstr "%s:%d: paheksuttava valitsin \"%s\"\n"
@@ -5134,6 +5128,19 @@ msgstr "%s ohitettu: julkinen avain on poistettu käytöstä\n"
msgid "%s: skipped: public key already present\n"
msgstr "%s: ohitettu: julkinen avain on jo olemassa\n"
+#, fuzzy, c-format
+#| msgid "can't connect to `%s': %s\n"
+msgid "can't encrypt to '%s'\n"
+msgstr "yhteys kohteeseen \"%s\" ei onnistu: %s\n"
+
+#, fuzzy, c-format
+msgid "option '%s' given, but no valid default keys given\n"
+msgstr "virheellinen tiivistealgoritmi \"%s\"\n"
+
+#, fuzzy, c-format
+msgid "option '%s' given, but option '%s' not given\n"
+msgstr "virheellinen tiivistealgoritmi \"%s\"\n"
+
msgid "You did not specify a user ID. (you may use \"-r\")\n"
msgstr "Et määritellyt käyttäjätunnusta. (voit käyttää valitsinta \"-r\")\n"
@@ -5178,11 +5185,6 @@ msgid "data not saved; use option \"--output\" to save it\n"
msgstr ""
"dataa ei ole tallennettu, käytä valitsinta \"--output\" tallentaaksesi\n"
-#, fuzzy, c-format
-#| msgid "error creating `%s': %s\n"
-msgid "error creating '%s': %s\n"
-msgstr "virhe luotaessa \"%s\": %s\n"
-
msgid "Detached signature.\n"
msgstr "Erillinen allekirjoitus.\n"
@@ -5273,19 +5275,31 @@ msgid "This is a revocation certificate for the OpenPGP key:"
msgstr "Luo tälle avaimelle mitätöintivarmenne? "
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 ""
+
+msgid ""
"Use it to revoke this key in case of a compromise or loss of\n"
"the secret key. However, if the secret key is still accessible,\n"
"it is better to generate a new revocation certificate and give\n"
-"a reason for the revocation."
+"a reason for the revocation. For details see the description of\n"
+"of the gpg command \"--gen-revoke\" in the GnuPG manual."
msgstr ""
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 making use of this revocation certificate."
+"before importing and publishing this revocation certificate."
msgstr ""
#, fuzzy, c-format
+#| msgid "Revocation certificate created.\n"
+msgid "revocation certificate stored as '%s.rev'\n"
+msgstr "Mitätöintivarmenne luotu.\n"
+
+#, fuzzy, c-format
msgid "secret key \"%s\" not found\n"
msgstr "salaista avainta \"%s\" ei löydy: %s\n"
@@ -5296,6 +5310,11 @@ msgstr "salaista avainta \"%s\" ei löydy: %s\n"
msgid "'%s' matches multiple secret keys:\n"
msgstr ""
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "error searching the keyring: %s\n"
+msgstr "virhe luotaessa avainrengasta \"%s\": %s\n"
+
#, fuzzy
msgid "Create a revocation certificate for this key? (y/N) "
msgstr "Luo tälle avaimelle mitätöintivarmenne? "
@@ -5378,24 +5397,37 @@ msgstr ""
#, fuzzy, c-format
msgid "public key %s is %lu second newer than the signature\n"
-msgstr "julkinen avain %08lX on %lu sekuntia uudempi kuin allekirjoitus\n"
+msgid_plural "public key %s is %lu seconds newer than the signature\n"
+msgstr[0] "julkinen avain %08lX on %lu sekuntia uudempi kuin allekirjoitus\n"
+msgstr[1] "julkinen avain %08lX on %lu sekuntia uudempi kuin allekirjoitus\n"
#, fuzzy, c-format
-msgid "public key %s is %lu seconds newer than the signature\n"
-msgstr "julkinen avain %08lX on %lu sekuntia uudempi kuin allekirjoitus\n"
+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] "julkinen avain %08lX on %lu sekuntia uudempi kuin allekirjoitus\n"
+msgstr[1] "julkinen avain %08lX on %lu sekuntia uudempi kuin allekirjoitus\n"
#, fuzzy, c-format
msgid ""
"key %s was created %lu second in the future (time warp or clock problem)\n"
-msgstr ""
+msgid_plural ""
+"key %s was created %lu seconds in the future (time warp or clock problem)\n"
+msgstr[0] ""
+"avain on luotu %lu sekunti tulevaisuudessa (on tapahtunut aikahyppy tai\n"
+"kellon kanssa on ongelmia)\n"
+msgstr[1] ""
"avain on luotu %lu sekunti tulevaisuudessa (on tapahtunut aikahyppy tai\n"
"kellon kanssa on ongelmia)\n"
#, fuzzy, c-format
-msgid ""
-"key %s was created %lu seconds in the future (time warp or clock problem)\n"
-msgstr ""
-"avain on luotu %lu sekuntia tulevaisuudessa (on tapahtunut aikahyppy tai\n"
+msgid "key %s was created %lu day in the future (time warp or clock problem)\n"
+msgid_plural ""
+"key %s was created %lu days in the future (time warp or clock problem)\n"
+msgstr[0] ""
+"avain on luotu %lu sekunti tulevaisuudessa (on tapahtunut aikahyppy tai\n"
+"kellon kanssa on ongelmia)\n"
+msgstr[1] ""
+"avain on luotu %lu sekunti tulevaisuudessa (on tapahtunut aikahyppy tai\n"
"kellon kanssa on ongelmia)\n"
#, fuzzy, c-format
@@ -5632,6 +5664,237 @@ msgid "input line longer than %d characters\n"
msgstr "syöterivi on yli %d merkkiä pitkä\n"
#, fuzzy, c-format
+msgid "error beginning transaction on TOFU database: %s\n"
+msgstr "virhe lähettäessä kohteeseen \"%s\": %s\n"
+
+#, c-format
+msgid "error committing transaction on TOFU database: %s\n"
+msgstr ""
+
+#, c-format
+msgid "error rolling back transaction on TOFU database: %s\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "unsupported TOFU database version: %s\n"
+msgstr ""
+"\n"
+"Tuetut algoritmit:\n"
+
+#, fuzzy, c-format
+msgid "error reading TOFU database: %s\n"
+msgstr "virhe lähettäessä kohteeseen \"%s\": %s\n"
+
+#, fuzzy, c-format
+#| msgid "error writing secret keyring `%s': %s\n"
+msgid "error determining TOFU database's version: %s\n"
+msgstr "virhe kirjoitettaessa salaiseen avainrenkaaseen \"%s\": %s\n"
+
+#, fuzzy, c-format
+#| msgid "%s: error writing dir record: %s\n"
+msgid "error initializing TOFU database: %s\n"
+msgstr "%s: virhe kirjoitettaessa hakemistotietuetta: %s\n"
+
+#, fuzzy, c-format
+msgid "error opening TOFU database '%s': %s\n"
+msgstr "virhe luettaessa tiedostoa \"%s\": %s\n"
+
+msgid "Warning: Home directory contains both tofu.db and tofu.d.\n"
+msgstr ""
+
+msgid "Using split format for TOFU database\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error updating TOFU database: %s\n"
+msgstr "virhe lähettäessä kohteeseen \"%s\": %s\n"
+
+#, fuzzy, c-format
+msgid "public key %s not found: %s\n"
+msgstr "julkista avainta %08lX ei löydy: %s\n"
+
+#, fuzzy, c-format
+msgid "error setting TOFU binding's trust level to %s\n"
+msgstr "virhe luettaessa tiedostoa \"%s\": %s\n"
+
+#, c-format
+msgid "The binding %s is NOT known."
+msgstr ""
+
+#, c-format
+msgid ""
+"The key %s raised a conflict with this binding (%s). Since this binding's "
+"policy was 'auto', it was changed to 'ask'."
+msgstr ""
+
+#, c-format
+msgid ""
+"Please indicate whether you believe the binding %s%sis legitimate (the key "
+"belongs to the stated owner) or a forgery (bad)."
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error gathering other user IDs: %s\n"
+msgstr "virhe luotaessa salasanaa: %s\n"
+
+msgid "Known user IDs associated with this key:\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "Policy: "
+msgid "policy: %s"
+msgstr "Käytäntö: "
+
+#, fuzzy, c-format
+msgid "error gathering signature stats: %s\n"
+msgstr "virhe luotaessa salasanaa: %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] ""
+msgstr[1] ""
+
+#, c-format
+msgid "Statistics for keys with the email address \"%s\":\n"
+msgstr ""
+
+#, fuzzy
+#| msgid "list keys"
+msgid "this key"
+msgstr "näytä avaimet"
+
+#, c-format
+msgid "%ld message signed in the future."
+msgid_plural "%ld messages signed in the future."
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+msgid "%ld message signed"
+msgid_plural "%ld messages signed"
+msgstr[0] "|algo [tiedostot]|tulosta viestien tiivisteet"
+msgstr[1] "|algo [tiedostot]|tulosta viestien tiivisteet"
+
+#, c-format
+msgid " over the past %ld day."
+msgid_plural " over the past %ld days."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid " over the past %ld week."
+msgid_plural " over the past %ld weeks."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid " over the past %ld month."
+msgid_plural " over the past %ld months."
+msgstr[0] ""
+msgstr[1] ""
+
+#. 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 ""
+
+#. 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 ""
+
+msgid "(G)ood, (A)ccept once, (U)nknown, (R)eject once, (B)ad? "
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error changing TOFU policy: %s\n"
+msgstr "virhe luotaessa salasanaa: %s\n"
+
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "Have never verified a message signed by key %s!\n"
+msgstr ""
+
+#, c-format
+msgid "Failed to collect signature statistics for \"%s\" (key %s)\n"
+msgstr ""
+
+#, c-format
+msgid "Verified 0 messages signed by \"%s\" (key: %s, policy: %s)."
+msgstr ""
+
+#. TRANSLATORS: The final %s is replaced by a string like
+#. "7 months, 1 day, 5 minutes, 0 seconds".
+#, c-format
+msgid ""
+"Verified %ld message signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgid_plural ""
+"Verified %ld messages signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "The most recent message was verified %s ago."
+msgstr ""
+
+msgid "Warning: we've have yet to see a message signed by this key!\n"
+msgstr ""
+
+msgid "Warning: we've only seen a single message signed by this key!\n"
+msgstr ""
+
+#. TRANSLATORS: translate the below text. We don't
+#. directly internationalize that text so that we can
+#. tweak it without breaking translations.
+#, c-format
+msgid "TOFU: few signatures %d message %s"
+msgid_plural "TOFU: few signatures %d messages %s"
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+msgid "error opening TOFU database: %s\n"
+msgstr "virhe lähettäessä kohteeseen \"%s\": %s\n"
+
+#, fuzzy, c-format
#| msgid "`%s' is not a valid long keyID\n"
msgid "'%s' is not a valid long keyID\n"
msgstr "\"%s\" ei kelpaa pitkänä avaintunnuksena\n"
@@ -5690,19 +5953,24 @@ msgstr "trustdb:n tarkistusta ei tarvita\n"
msgid "no need for a trustdb update with '%s' trust model\n"
msgstr "trustdb:n tarkistusta ei tarvita\n"
-#, fuzzy, c-format
-msgid "public key %s not found: %s\n"
-msgstr "julkista avainta %08lX ei löydy: %s\n"
-
msgid "please do a --check-trustdb\n"
msgstr "tee --check-trustdb, kiitos\n"
msgid "checking the trustdb\n"
msgstr "tarkistetaan trustdb:tä\n"
-#, c-format
-msgid "%d keys processed (%d validity counts cleared)\n"
-msgstr "%d avainta käsitelty (%d kelpoisuuslaskuria tyhjätty)\n"
+#, fuzzy, c-format
+msgid "%d key processed"
+msgid_plural "%d keys processed"
+msgstr[0] "tähän mennessä käsitelty %lu avainta\n"
+msgstr[1] "tähän mennessä käsitelty %lu avainta\n"
+
+#, fuzzy, c-format
+#| msgid "%d keys processed (%d validity counts cleared)\n"
+msgid " (%d validity count cleared)\n"
+msgid_plural " (%d validity counts cleared)\n"
+msgstr[0] "%d avainta käsitelty (%d kelpoisuuslaskuria tyhjätty)\n"
+msgstr[1] "%d avainta käsitelty (%d kelpoisuuslaskuria tyhjätty)\n"
msgid "no ultimately trusted keys found\n"
msgstr "ehdottomasti luotettavia avaimia ei löytynyt\n"
@@ -5712,10 +5980,6 @@ msgid "public key of ultimately trusted key %s not found\n"
msgstr "ehdottomasti luotettu julkinen avain %08lX ei löytynyt\n"
#, c-format
-msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
-msgstr ""
-
-#, c-format
msgid ""
"depth: %d valid: %3d signed: %3d trust: %d-, %dq, %dn, %dm, %df, %du\n"
msgstr ""
@@ -5914,8 +6178,11 @@ msgid "card is permanently locked!\n"
msgstr ""
#, c-format
-msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
-msgstr ""
+msgid "%d Admin PIN attempt remaining before card is permanently locked\n"
+msgid_plural ""
+"%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr[0] ""
+msgstr[1] ""
#. TRANSLATORS: Do not translate the "|A|" prefix but keep it at
#. the start of the string. Use %%0A to force a linefeed.
@@ -6005,8 +6272,10 @@ msgid "generating key failed\n"
msgstr "avainlohkojen poisto epäonnistui: %s\n"
#, fuzzy, c-format
-msgid "key generation completed (%d seconds)\n"
-msgstr "Avaimen luonti epäonnistui: %s\n"
+msgid "key generation completed (%d second)\n"
+msgid_plural "key generation completed (%d seconds)\n"
+msgstr[0] "Avaimen luonti epäonnistui: %s\n"
+msgstr[1] "Avaimen luonti epäonnistui: %s\n"
msgid "invalid structure of OpenPGP card (DO 0x93)\n"
msgstr ""
@@ -8208,6 +8477,9 @@ msgstr "|N|käytä salasanoissa toimintatapaa N"
msgid "do not allow the reuse of old passphrases"
msgstr "virhe luotaessa salasanaa: %s\n"
+msgid "|N|set the Pinentry timeout to N seconds"
+msgstr ""
+
msgid "|NAME|use NAME as default secret key"
msgstr "|NIMI|käytä oletusarvoisesti salaista avainta NIMI"
@@ -8504,6 +8776,91 @@ msgid ""
"Check a passphrase given on stdin against the patternfile\n"
msgstr ""
+#~ msgid "%d signatures not checked due to missing keys\n"
+#~ msgstr ""
+#~ "%d allekirjoitusta jätetty tarkistamatta puuttuvien avainten vuoksi\n"
+
+#~ msgid "%d signatures not checked due to errors\n"
+#~ msgstr "%d allekirjoitusta jätetty tarkistamatta virheiden vuoksi\n"
+
+#~ msgid "1 user ID without valid self-signature detected\n"
+#~ msgstr ""
+#~ "havaittiin 1 käyttäjätunnus ilman voimassaolevaa oma-allekirjoitusta\n"
+
+#~ msgid "Deleted %d signatures.\n"
+#~ msgstr "%d allekirjoitusta poistettu.\n"
+
+#, fuzzy
+#~ msgid "User ID \"%s\": %d signatures removed\n"
+#~ msgstr "Käyttäjätunnus \"%s\" on mitätöity."
+
+#~ msgid ""
+#~ "You need a Passphrase to protect your secret key.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Tarvitset salasanan suojaamaan salaista avaintasi.\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "Please enter a passphrase to protect the off-card backup of the new "
+#~ "encryption key."
+#~ msgstr "Ole hyvä ja syötä salasana, tämän on salainen lause \n"
+
+#~ msgid "passphrase not correctly repeated; try again"
+#~ msgstr "salasanaa ei toistettu oikein, yritä uudestaan."
+
+#~ msgid "%s.\n"
+#~ msgstr "%s.\n"
+
+#~ msgid ""
+#~ "You don't want a passphrase - this is probably a *bad* idea!\n"
+#~ "I will do it anyway. You can change your passphrase at any time,\n"
+#~ "using this program with the option \"--edit-key\".\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Et halunnut salasanaa - tämä on luultavasti *huono* ajatus!\n"
+#~ "Jatketaan silti. Voit vaihtaa salasanaa milloin tahansa\n"
+#~ "tämän ohjelman valitsimella \"--edit-key\".\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid "storing key onto card failed: %s\n"
+#~ msgstr "avainlohkojen poisto epäonnistui: %s\n"
+
+#, fuzzy
+#~| msgid "1 bad signature\n"
+#~ msgid "1 good signature\n"
+#~ msgstr "1 väärä allekirjoitus\n"
+
+#, fuzzy
+#~ msgid "renaming '%s' to '%s' failed: %s\n"
+#~ msgstr "ascii-koodaaminen epäonnistui: %s\n"
+
+#, fuzzy
+#~ msgid "%lu keys cached (%lu signatures)\n"
+#~ msgstr "käsiteltiin %lu avainta (%lu allekirjoitusta)\n"
+
+#, fuzzy
+#~ msgid "refreshing 1 key from %s\n"
+#~ msgstr "pyydetään avainta %08lX kohteesta %s\n"
+
+#, fuzzy
+#~ msgid "sending key %s to %s server %s\n"
+#~ msgstr "etsitään \"%s\" HKP-palvelimelta %s\n"
+
+#, fuzzy
+#~ msgid "public key %s is %lu seconds newer than the signature\n"
+#~ msgstr "julkinen avain %08lX on %lu sekuntia uudempi kuin allekirjoitus\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "key %s was created %lu seconds in the future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "avain on luotu %lu sekuntia tulevaisuudessa (on tapahtunut aikahyppy tai\n"
+#~ "kellon kanssa on ongelmia)\n"
+
#, fuzzy
#~| msgid "can't open the keyring"
#~ msgid "Failed to open the keyring DB.\n"
@@ -8760,10 +9117,6 @@ msgstr ""
#~ msgstr "etsitään \"%s\" HKP-palvelimelta %s\n"
#, fuzzy
-#~ msgid "no keyserver action!\n"
-#~ msgstr "virheelliset vientivalitsimet\n"
-
-#, fuzzy
#~ msgid "keyserver timed out\n"
#~ msgstr "avainpalvelinvirhe"
@@ -9961,9 +10314,6 @@ msgstr ""
#~ msgid "%s%c %4u%c/%08lX created: %s expires: %s"
#~ msgstr "%s%c %4u%c/%08lX luotu: %s vanhenee: %s"
-#~ msgid "Policy: "
-#~ msgstr "Käytäntö: "
-
#~ msgid "can't get key from keyserver: %s\n"
#~ msgstr "avainpalvelimelta ei saa avainta: %s\n"
diff --git a/po/fr.po b/po/fr.po
index 079a06d..b5fce4f 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -1208,6 +1208,20 @@ msgstr "échec de transfert de la demande %s au client\n"
msgid "Enter passphrase: "
msgstr "Entrez la phrase secrète : "
+#, fuzzy, c-format
+#| msgid "error creating keyring '%s': %s\n"
+msgid "error getting version from '%s': %s\n"
+msgstr "erreur de création du porte-clefs « %s » : %s\n"
+
+#, c-format
+msgid "server '%s' is older than us (%s < %s)"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "WARNING: "
+msgid "WARNING: %s\n"
+msgstr "Attention : "
+
#, c-format
msgid "OpenPGP card not available: %s\n"
msgstr "la carte OpenPGP n'est pas disponible : %s\n"
@@ -1693,6 +1707,9 @@ msgstr "supprimer les parties inutilisables de la clef pendant l'exportation"
msgid "remove as much as possible from key during export"
msgstr "supprimer autant que possible de la clef pendant l'exportation"
+msgid " - skipped"
+msgstr " — ignoré"
+
msgid "exporting secret keys not allowed\n"
msgstr "il est interdit d'exporter les clefs secrètes\n"
@@ -1704,15 +1721,35 @@ msgstr "clef %s : clef de type PGP 2.x — ignorée\n"
msgid "key %s: key material on-card - skipped\n"
msgstr "clef %s : matériel de clef sur la carte — ignorée\n"
-msgid " - skipped"
-msgstr " — ignoré"
-
msgid "WARNING: nothing exported\n"
msgstr "Attention : rien n'a été exporté\n"
+#, c-format
+msgid "error creating '%s': %s\n"
+msgstr "erreur de création de « %s » : %s\n"
+
msgid "[User ID not found]"
msgstr "[identité introuvable]"
+#, fuzzy, c-format
+#| msgid "missing argument for option \"%.50s\"\n"
+msgid "(check argument of option '%s')\n"
+msgstr "argument manquant pour l'option « %.50s »\n"
+
+#, c-format
+msgid "Warning: '%s' should be a long key ID or a fingerprint\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "error closing %s: %s\n"
+msgid "error looking up: %s\n"
+msgstr "erreur de fermeture de %s : %s\n"
+
+#, fuzzy, c-format
+#| msgid "error creating keyring '%s': %s\n"
+msgid "Warning: %s appears in the keyring %d times\n"
+msgstr "erreur de création du porte-clefs « %s » : %s\n"
+
#, c-format
msgid "automatically retrieved '%s' via %s\n"
msgstr "« %s » automatiquement récupéré par %s\n"
@@ -1729,16 +1766,20 @@ msgid "secret key \"%s\" not found: %s\n"
msgstr "clef secrète « %s » introuvable : %s\n"
#, fuzzy, c-format
-#| msgid "missing argument for option \"%.50s\"\n"
-msgid "(check argument of option '%s')\n"
-msgstr "argument manquant pour l'option « %.50s »\n"
+#| msgid "|NAME|use NAME as default secret key"
+msgid "Warning: not using '%s' as default key: %s\n"
+msgstr "|NOM|utiliser le NOM comme clef secrète par défaut"
#, fuzzy, c-format
#| msgid "|NAME|use NAME as default secret key"
-msgid "using \"%s\" as default secret key\n"
+msgid "using \"%s\" as default secret key for signing\n"
msgstr "|NOM|utiliser le NOM comme clef secrète par défaut"
#, c-format
+msgid "all values passed to '%s' ignored\n"
+msgstr ""
+
+#, c-format
msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
msgstr ""
"La clef incorrecte %s a été rendue valable par\n"
@@ -2102,29 +2143,6 @@ msgid "Note: old default options file '%s' ignored\n"
msgstr "Remarque : l'ancien fichier d'options par défaut « %s » a été ignoré\n"
#, c-format
-msgid ""
-"Warning: value '%s' for option '%s' should be a long key ID or a "
-"fingerprint\n"
-msgstr ""
-
-#, fuzzy, c-format
-#| msgid "option \"%.50s\" is ambiguous\n"
-msgid "key specification '%s' is ambiguous\n"
-msgstr "l'option « %.50s » est ambiguë\n"
-
-#. TRANSLATORS: The %s prints a key specification which
-#. for example has been given at the command line. Two
-#. lines with fingerprints are printed after this message.
-#, c-format
-msgid "'%s' matches at least:\n"
-msgstr ""
-
-#, fuzzy, c-format
-#| msgid "error creating keyring '%s': %s\n"
-msgid "error searching the keyring: %s\n"
-msgstr "erreur de création du porte-clefs « %s » : %s\n"
-
-#, c-format
msgid "libgcrypt is too old (need %s, have %s)\n"
msgstr "libgcrypt est trop ancienne (nécessaire : %s, utilisé : %s)\n"
@@ -2321,16 +2339,6 @@ msgstr ""
"Attention : les destinataires (-r) indiqués n'utilisent pas\n"
" de clef publique pour le chiffrement\n"
-#, fuzzy, c-format
-#| msgid "line %d: invalid date given\n"
-msgid "option '%s' given, but no valid default keys given\n"
-msgstr "ligne %d : date donnée incorrect\n"
-
-#, fuzzy, c-format
-#| msgid "line %d: invalid date given\n"
-msgid "option '%s' given, but option '%s' not given\n"
-msgstr "ligne %d : date donnée incorrect\n"
-
msgid "--store [filename]"
msgstr "--store [fichier]"
@@ -2403,6 +2411,11 @@ msgstr "échec de réception depuis le serveur de clefs : %s\n"
msgid "key export failed: %s\n"
msgstr "échec d'exportation de la clef : %s\n"
+#, fuzzy, c-format
+#| msgid "key export failed: %s\n"
+msgid "export as ssh key failed: %s\n"
+msgstr "échec d'exportation de la clef : %s\n"
+
#, c-format
msgid "keyserver search failed: %s\n"
msgstr "échec de recherche au sein du serveur de clefs : %s\n"
@@ -2889,33 +2902,33 @@ msgstr "[révocation]"
msgid "[self-signature]"
msgstr "[autosignature]"
-msgid "1 bad signature\n"
-msgstr "1 mauvaise signature\n"
-
-#, c-format
-msgid "%d bad signatures\n"
-msgstr "%d mauvaises signatures\n"
-
-msgid "1 signature not checked due to a missing key\n"
-msgstr "1 signature non vérifiée à cause d'une clef manquante\n"
-
-#, c-format
-msgid "%d signatures not checked due to missing keys\n"
-msgstr "%d signatures non vérifiées à cause de clefs manquantes\n"
-
-msgid "1 signature not checked due to an error\n"
-msgstr "1 signature non vérifiée à cause d'une erreur\n"
+#, fuzzy, c-format
+#| msgid "%d bad signatures\n"
+msgid "%d bad signature\n"
+msgid_plural "%d bad signatures\n"
+msgstr[0] "%d mauvaises signatures\n"
+msgstr[1] "%d mauvaises signatures\n"
-#, c-format
-msgid "%d signatures not checked due to errors\n"
-msgstr "%d signatures non vérifiées à cause d'erreurs\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to a missing key\n"
+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 signature non vérifiée à cause d'une clef manquante\n"
+msgstr[1] "1 signature non vérifiée à cause d'une clef manquante\n"
-msgid "1 user ID without valid self-signature detected\n"
-msgstr "1 identité sans autosignature valable détecté\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to an error\n"
+msgid "%d signature not checked due to an error\n"
+msgid_plural "%d signatures not checked due to errors\n"
+msgstr[0] "1 signature non vérifiée à cause d'une erreur\n"
+msgstr[1] "1 signature non vérifiée à cause d'une erreur\n"
-#, c-format
-msgid "%d user IDs without valid self-signatures detected\n"
-msgstr "%d identités sans autosignature valable détecté\n"
+#, fuzzy, c-format
+#| msgid "%d user IDs without valid self-signatures detected\n"
+msgid "%d user ID without valid self-signature detected\n"
+msgid_plural "%d user IDs without valid self-signatures detected\n"
+msgstr[0] "%d identités sans autosignature valable détecté\n"
+msgstr[1] "%d identités sans autosignature valable détecté\n"
msgid ""
"Please decide how far you trust this user to correctly verify other users' "
@@ -3501,13 +3514,12 @@ msgstr "Supprimer cette signature inconnue ? (o/N/q)"
msgid "Really delete this self-signature? (y/N)"
msgstr "Faut-il vraiment supprimer cette autosignature ? (o/N)"
-#, c-format
+#, fuzzy, c-format
+#| msgid "Deleted %d signature.\n"
msgid "Deleted %d signature.\n"
-msgstr "%d signature supprimée.\n"
-
-#, c-format
-msgid "Deleted %d signatures.\n"
-msgstr "%d signatures supprimées\n"
+msgid_plural "Deleted %d signatures.\n"
+msgstr[0] "%d signature supprimée.\n"
+msgstr[1] "%d signature supprimée.\n"
msgid "Nothing deleted.\n"
msgstr "Rien n'a été supprimé.\n"
@@ -3519,13 +3531,12 @@ msgstr "incorrecte"
msgid "User ID \"%s\" compacted: %s\n"
msgstr "Identité « %s » compactée : %s\n"
-#, c-format
+#, fuzzy, c-format
+#| msgid "User ID \"%s\": %d signature removed\n"
msgid "User ID \"%s\": %d signature removed\n"
-msgstr "Identité « %s » : %d signature supprimée\n"
-
-#, c-format
-msgid "User ID \"%s\": %d signatures removed\n"
-msgstr "Identité « %s » : %d signatures supprimées\n"
+msgid_plural "User ID \"%s\": %d signatures removed\n"
+msgstr[0] "Identité « %s » : %d signature supprimée\n"
+msgstr[1] "Identité « %s » : %d signature supprimée\n"
#, c-format
msgid "User ID \"%s\": already minimized\n"
@@ -4058,39 +4069,6 @@ msgid "Please correct the error first\n"
msgstr "Veuillez d'abord corriger l'erreur\n"
msgid ""
-"You need a Passphrase to protect your secret key.\n"
-"\n"
-msgstr ""
-"Une phrase secrète est nécessaire pour protéger votre clef secrète.\n"
-"\n"
-
-msgid ""
-"Please enter a passphrase to protect the off-card backup of the new "
-"encryption key."
-msgstr ""
-"Veuillez entrer une phrase secrète pour protéger la sauvegarde hors carte de "
-"la nouvelle clef de chiffrement."
-
-msgid "passphrase not correctly repeated; try again"
-msgstr ""
-"la phrase secrète n'a pas été correctement répétée ; veuillez réessayer"
-
-#, c-format
-msgid "%s.\n"
-msgstr "%s.\n"
-
-msgid ""
-"You don't want a passphrase - this is probably a *bad* idea!\n"
-"I will do it anyway. You can change your passphrase at any time,\n"
-"using this program with the option \"--edit-key\".\n"
-"\n"
-msgstr ""
-"Vous ne voulez pas de phrase secrète — c'est sans doute une *mauvaise*\n"
-"idée. C'est possible quand même. Vous pouvez modifier la phrase secrète\n"
-"à tout moment en utilisant ce programme avec l'option « --edit-key ».\n"
-"\n"
-
-msgid ""
"We need to generate a lot of random bytes. It is a good idea to perform\n"
"some other action (type on the keyboard, move the mouse, utilize the\n"
"disks) during the prime generation; this gives the random number\n"
@@ -4138,6 +4116,14 @@ msgid "Key generation canceled.\n"
msgstr "La génération de clef a été annulée.\n"
#, c-format
+msgid "can't create backup file '%s': %s\n"
+msgstr "impossible de créer le fichier de sauvegarde « %s » : %s\n"
+
+#, c-format
+msgid "Note: backup of card key saved to '%s'\n"
+msgstr "Remarque : sauvegarde de la clef de la carte dans « %s »\n"
+
+#, c-format
msgid "writing public key to '%s'\n"
msgstr "écriture de la clef publique dans « %s »\n"
@@ -4189,18 +4175,6 @@ msgstr ""
msgid "Really create? (y/N) "
msgstr "Faut-il vraiment la créer ? (o/N) "
-#, c-format
-msgid "storing key onto card failed: %s\n"
-msgstr "impossible de stocker la clef sur la carte : %s\n"
-
-#, c-format
-msgid "can't create backup file '%s': %s\n"
-msgstr "impossible de créer le fichier de sauvegarde « %s » : %s\n"
-
-#, c-format
-msgid "Note: backup of card key saved to '%s'\n"
-msgstr "Remarque : sauvegarde de la clef de la carte dans « %s »\n"
-
msgid "never "
msgstr "jamais "
@@ -4219,19 +4193,19 @@ msgstr "Notation de signature critique : "
msgid "Signature notation: "
msgstr "Notation de signature : "
-#, fuzzy
-#| msgid "1 bad signature\n"
-msgid "1 good signature\n"
-msgstr "1 mauvaise signature\n"
-
#, fuzzy, c-format
#| msgid "%d bad signatures\n"
-msgid "%d good signatures\n"
-msgstr "%d mauvaises signatures\n"
+msgid "%d good signature\n"
+msgid_plural "%d good signatures\n"
+msgstr[0] "%d mauvaises signatures\n"
+msgstr[1] "%d mauvaises signatures\n"
-#, c-format
-msgid "Warning: %lu key(s) skipped due to their large size\n"
-msgstr "Attention : %lu clefs ignorées en raison de leur grande taille\n"
+#, fuzzy, c-format
+#| msgid "Warning: %lu key(s) skipped due to their large size\n"
+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] "Attention : %lu clefs ignorées en raison de leur grande taille\n"
+msgstr[1] "Attention : %lu clefs ignorées en raison de leur grande taille\n"
msgid "Keyring"
msgstr "Porte-clefs"
@@ -4261,20 +4235,29 @@ msgid " Card serial no. ="
msgstr " Nº de série de carte ="
#, c-format
-msgid "renaming '%s' to '%s' failed: %s\n"
-msgstr "impossible de renommer « %s » en « %s » : %s\n"
-
-#, c-format
msgid "caching keyring '%s'\n"
msgstr "mise en cache du porte-clefs « %s »\n"
-#, c-format
-msgid "%lu keys cached so far (%lu signatures)\n"
-msgstr "%lu clefs mises en cache pour l'instant (%lu signatures)\n"
+#, fuzzy, c-format
+#| msgid "%lu keys cached so far (%lu signatures)\n"
+msgid "%lu keys cached so far (%lu signature)\n"
+msgid_plural "%lu keys cached so far (%lu signatures)\n"
+msgstr[0] "%lu clefs mises en cache pour l'instant (%lu signatures)\n"
+msgstr[1] "%lu clefs mises en cache pour l'instant (%lu signatures)\n"
-#, c-format
-msgid "%lu keys cached (%lu signatures)\n"
-msgstr "%lu clefs mises en cache (%lu signatures)\n"
+#, fuzzy, c-format
+#| msgid "flush the cache"
+msgid "%lu key cached"
+msgid_plural "%lu keys cached"
+msgstr[0] "vider le cache"
+msgstr[1] "vider le cache"
+
+#, fuzzy, c-format
+#| msgid "1 bad signature\n"
+msgid " (%lu signature)\n"
+msgid_plural " (%lu signatures)\n"
+msgstr[0] "1 mauvaise signature\n"
+msgstr[1] "1 mauvaise signature\n"
#, c-format
msgid "%s: keyring created\n"
@@ -4317,9 +4300,12 @@ msgstr "protocole de serveur de clefs incorrect (nous %d!=gestionnaire %d)\n"
msgid "\"%s\" not a key ID: skipping\n"
msgstr "« %s » n'est pas un identifiant de clef : ignoré\n"
-#, c-format
-msgid "refreshing 1 key from %s\n"
-msgstr "rafraîchissement d'une clef à partir de %s\n"
+#, fuzzy, c-format
+#| msgid "refreshing %d keys from %s\n"
+msgid "refreshing %d key from %s\n"
+msgid_plural "refreshing %d keys from %s\n"
+msgstr[0] "rafraîchissement de %d clefs à partir de %s\n"
+msgstr[1] "rafraîchissement de %d clefs à partir de %s\n"
#, c-format
msgid "WARNING: unable to refresh key %s via %s: %s\n"
@@ -4328,10 +4314,6 @@ msgstr ""
" avec %s : %s\n"
#, c-format
-msgid "refreshing %d keys from %s\n"
-msgstr "rafraîchissement de %d clefs à partir de %s\n"
-
-#, c-format
msgid "key \"%s\" not found on keyserver\n"
msgstr "clef « %s » introuvable sur le serveur de clefs\n"
@@ -4349,9 +4331,10 @@ msgstr "demande de la clef %s sur le serveur %s %s\n"
msgid "requesting key %s from %s\n"
msgstr "requête de la clef %s sur %s\n"
-#, c-format
-msgid "sending key %s to %s server %s\n"
-msgstr "envoi de la clef %s au serveur %s %s\n"
+#, fuzzy
+#| msgid "no keyserver action!\n"
+msgid "no keyserver known\n"
+msgstr "pas d'action pour le serveur de clefs.\n"
#, c-format
msgid "sending key %s to %s\n"
@@ -4571,6 +4554,19 @@ msgstr "Attention : l'algorithme de hachage %s est déconseillé\n"
msgid "Note: signatures using the %s algorithm are rejected\n"
msgstr "Remarque : les signatures utilisant l’algorithme %s sont rejetées\n"
+#, fuzzy, c-format
+#| msgid "%s:%u: read error: %s\n"
+msgid "(reported error: %s)\n"
+msgstr "%s : %u : erreur de lecture : %s\n"
+
+#, fuzzy, c-format
+#| msgid "read error in '%s': %s\n"
+msgid "(reported error: %s <%s>)\n"
+msgstr "erreur de lecture dans « %s » : %s\n"
+
+msgid "(further info: "
+msgstr ""
+
#, c-format
msgid "%s:%d: deprecated option \"%s\"\n"
msgstr "%s : %d : option « %s » déconseillée\n"
@@ -4991,6 +4987,21 @@ msgstr "%s : ignoré : la clef publique est désactivée\n"
msgid "%s: skipped: public key already present\n"
msgstr "%s : ignoré : clef publique déjà présente\n"
+#, fuzzy, c-format
+#| msgid "can't connect to '%s': %s\n"
+msgid "can't encrypt to '%s'\n"
+msgstr "impossible de se connecter à « %s » : %s\n"
+
+#, fuzzy, c-format
+#| msgid "line %d: invalid date given\n"
+msgid "option '%s' given, but no valid default keys given\n"
+msgstr "ligne %d : date donnée incorrect\n"
+
+#, fuzzy, c-format
+#| msgid "line %d: invalid date given\n"
+msgid "option '%s' given, but option '%s' not given\n"
+msgstr "ligne %d : date donnée incorrect\n"
+
msgid "You did not specify a user ID. (you may use \"-r\")\n"
msgstr "Vous n'avez pas indiqué d'identité (vous pouvez utiliser « -r »).\n"
@@ -5037,10 +5048,6 @@ msgstr ""
"les données ne sont pas enregistrées ; utilisez l'option « --output » pour\n"
"les enregistrer\n"
-#, c-format
-msgid "error creating '%s': %s\n"
-msgstr "erreur de création de « %s » : %s\n"
-
msgid "Detached signature.\n"
msgstr "Signature détachée.\n"
@@ -5130,20 +5137,38 @@ msgid "This is a revocation certificate for the OpenPGP key:"
msgstr "Ceci est un certificat de révocation pour la clef 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 ""
+
+#, fuzzy
+#| msgid ""
+#| "Use it to revoke this key in case of a compromise or loss of\n"
+#| "the secret key. However, if the secret key is still accessible,\n"
+#| "it is better to generate a new revocation certificate and give\n"
+#| "a reason for the revocation."
+msgid ""
"Use it to revoke this key in case of a compromise or loss of\n"
"the secret key. However, if the secret key is still accessible,\n"
"it is better to generate a new revocation certificate and give\n"
-"a reason for the revocation."
+"a reason for the revocation. For details see the description of\n"
+"of the gpg command \"--gen-revoke\" in the GnuPG manual."
msgstr ""
"Utilisez-le pour révoquer cette clef en cas de compromis ou de\n"
"perte de la clef secrète. Cependant, si la clef secrète est\n"
"encore accessible, créer un nouveau certificat de révocation\n"
"est préférable afin d’indiquer la cause de révocation."
+#, fuzzy
+#| 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 making use of this revocation certificate."
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 making use of this revocation certificate."
+"before importing and publishing this revocation certificate."
msgstr ""
"Pour éviter une utilisation accidentelle de ce fichier, un\n"
"deux-points a été inséré avant les cinq tirets suivants.\n"
@@ -5151,6 +5176,11 @@ msgstr ""
"d’utiliser ce certificat de révocation."
#, fuzzy, c-format
+#| msgid "Revocation certificate created.\n"
+msgid "revocation certificate stored as '%s.rev'\n"
+msgstr "Certificat de révocation créé.\n"
+
+#, fuzzy, c-format
#| msgid "secret key \"%s\" not found: %s\n"
msgid "secret key \"%s\" not found\n"
msgstr "clef secrète « %s » introuvable : %s\n"
@@ -5162,6 +5192,11 @@ msgstr "clef secrète « %s » introuvable : %s\n"
msgid "'%s' matches multiple secret keys:\n"
msgstr ""
+#, fuzzy, c-format
+#| msgid "error creating keyring '%s': %s\n"
+msgid "error searching the keyring: %s\n"
+msgstr "erreur de création du porte-clefs « %s » : %s\n"
+
msgid "Create a revocation certificate for this key? (y/N) "
msgstr "Faut-il créer un certificat de révocation pour cette clef ? (o/N) "
@@ -5244,27 +5279,49 @@ msgid "WARNING: signing subkey %s has an invalid cross-certification\n"
msgstr ""
"Attention : la sous-clef de signature %s a un certificat croisé incorrect\n"
-#, c-format
+#, fuzzy, c-format
+#| msgid "public key %s is %lu second newer than the signature\n"
msgid "public key %s is %lu second newer than the signature\n"
-msgstr "la clef publique %s est plus récente de %lu seconde que la signature\n"
+msgid_plural "public key %s is %lu seconds newer than the signature\n"
+msgstr[0] ""
+"la clef publique %s est plus récente de %lu seconde que la signature\n"
+msgstr[1] ""
+"la clef publique %s est plus récente de %lu seconde que la signature\n"
-#, c-format
-msgid "public key %s is %lu seconds newer than the signature\n"
-msgstr ""
-"la clef publique %s est plus récente de %lu secondes que la signature\n"
+#, fuzzy, c-format
+#| msgid "public key %s is %lu second newer than the signature\n"
+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 clef publique %s est plus récente de %lu seconde que la signature\n"
+msgstr[1] ""
+"la clef publique %s est plus récente de %lu seconde que la signature\n"
-#, c-format
+#, fuzzy, c-format
+#| msgid ""
+#| "key %s was created %lu second in the future (time warp or clock problem)\n"
msgid ""
"key %s was created %lu second in the future (time warp or clock problem)\n"
-msgstr ""
+msgid_plural ""
+"key %s was created %lu seconds in the future (time warp or clock problem)\n"
+msgstr[0] ""
+"la clef %s a été créée %lu seconde dans le futur\n"
+"(faille temporelle ou problème d'horloge)\n"
+msgstr[1] ""
"la clef %s a été créée %lu seconde dans le futur\n"
"(faille temporelle ou problème d'horloge)\n"
-#, c-format
-msgid ""
-"key %s was created %lu seconds in the future (time warp or clock problem)\n"
-msgstr ""
-"la clef %s a été créée %lu secondes dans le futur\n"
+#, fuzzy, c-format
+#| msgid ""
+#| "key %s was created %lu second in the future (time warp or clock problem)\n"
+msgid "key %s was created %lu day in the future (time warp or clock problem)\n"
+msgid_plural ""
+"key %s was created %lu days in the future (time warp or clock problem)\n"
+msgstr[0] ""
+"la clef %s a été créée %lu seconde dans le futur\n"
+"(faille temporelle ou problème d'horloge)\n"
+msgstr[1] ""
+"la clef %s a été créée %lu seconde dans le futur\n"
"(faille temporelle ou problème d'horloge)\n"
#, c-format
@@ -5499,6 +5556,246 @@ msgstr "impossible de traiter les lignes plus longues que %d caractères\n"
msgid "input line longer than %d characters\n"
msgstr "la ligne d'entrée est plus longue que %d caractères\n"
+#, fuzzy, c-format
+#| msgid "error sending standard options: %s\n"
+msgid "error beginning transaction on TOFU database: %s\n"
+msgstr "erreur d'envoi d'options standards : %s\n"
+
+#, c-format
+msgid "error committing transaction on TOFU database: %s\n"
+msgstr ""
+
+#, c-format
+msgid "error rolling back transaction on TOFU database: %s\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "unsupported algorithm: %s"
+msgid "unsupported TOFU database version: %s\n"
+msgstr "algorithme non pris en charge : %s"
+
+#, fuzzy, c-format
+#| msgid "error sending data: %s\n"
+msgid "error reading TOFU database: %s\n"
+msgstr "erreur d'envoi de données : %s\n"
+
+#, fuzzy, c-format
+#| msgid "error writing base64 encoding: %s\n"
+msgid "error determining TOFU database's version: %s\n"
+msgstr "erreur d'écriture en encodage base64 : %s\n"
+
+#, fuzzy, c-format
+#| msgid "error initializing reader object: %s\n"
+msgid "error initializing TOFU database: %s\n"
+msgstr "erreur d'initialisation de l'objet lecteur : %s\n"
+
+#, fuzzy, c-format
+#| msgid "error opening '%s': %s\n"
+msgid "error opening TOFU database '%s': %s\n"
+msgstr "erreur d'ouverture de « %s » : %s\n"
+
+msgid "Warning: Home directory contains both tofu.db and tofu.d.\n"
+msgstr ""
+
+msgid "Using split format for TOFU database\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "error sending data: %s\n"
+msgid "error updating TOFU database: %s\n"
+msgstr "erreur d'envoi de données : %s\n"
+
+#, c-format
+msgid "public key %s not found: %s\n"
+msgstr "clef publique %s introuvable : %s\n"
+
+#, fuzzy, c-format
+#| msgid "error setting OCSP target: %s\n"
+msgid "error setting TOFU binding's trust level to %s\n"
+msgstr "erreur de configuration de la cible OCSP : %s\n"
+
+#, c-format
+msgid "The binding %s is NOT known."
+msgstr ""
+
+#, c-format
+msgid ""
+"The key %s raised a conflict with this binding (%s). Since this binding's "
+"policy was 'auto', it was changed to 'ask'."
+msgstr ""
+
+#, c-format
+msgid ""
+"Please indicate whether you believe the binding %s%sis legitimate (the key "
+"belongs to the stated owner) or a forgery (bad)."
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "error getting responder ID: %s\n"
+msgid "error gathering other user IDs: %s\n"
+msgstr "erreur de lecture de l'identifiant de répondeur : %s\n"
+
+msgid "Known user IDs associated with this key:\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "validity: %s"
+msgid "policy: %s"
+msgstr "validité : %s"
+
+#, fuzzy, c-format
+#| msgid "error getting stored flags: %s\n"
+msgid "error gathering signature stats: %s\n"
+msgstr "erreur de lecture des options stockées : %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] ""
+msgstr[1] ""
+
+#, c-format
+msgid "Statistics for keys with the email address \"%s\":\n"
+msgstr ""
+
+#, fuzzy
+#| msgid "list keys"
+msgid "this key"
+msgstr "afficher les clefs"
+
+#, c-format
+msgid "%ld message signed in the future."
+msgid_plural "%ld messages signed in the future."
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+#| msgid "print message digests"
+msgid "%ld message signed"
+msgid_plural "%ld messages signed"
+msgstr[0] "indiquer les fonctions de hachage"
+msgstr[1] "indiquer les fonctions de hachage"
+
+#, c-format
+msgid " over the past %ld day."
+msgid_plural " over the past %ld days."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid " over the past %ld week."
+msgid_plural " over the past %ld weeks."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid " over the past %ld month."
+msgid_plural " over the past %ld months."
+msgstr[0] ""
+msgstr[1] ""
+
+#. 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 ""
+
+#. 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 ""
+
+msgid "(G)ood, (A)ccept once, (U)nknown, (R)eject once, (B)ad? "
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "error creating a pipe: %s\n"
+msgid "error changing TOFU policy: %s\n"
+msgstr "erreur de création d'un tube : %s\n"
+
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "Have never verified a message signed by key %s!\n"
+msgstr ""
+
+#, c-format
+msgid "Failed to collect signature statistics for \"%s\" (key %s)\n"
+msgstr ""
+
+#, c-format
+msgid "Verified 0 messages signed by \"%s\" (key: %s, policy: %s)."
+msgstr ""
+
+#. TRANSLATORS: The final %s is replaced by a string like
+#. "7 months, 1 day, 5 minutes, 0 seconds".
+#, c-format
+msgid ""
+"Verified %ld message signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgid_plural ""
+"Verified %ld messages signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "The most recent message was verified %s ago."
+msgstr ""
+
+msgid "Warning: we've have yet to see a message signed by this key!\n"
+msgstr ""
+
+msgid "Warning: we've only seen a single message signed by this key!\n"
+msgstr ""
+
+#. TRANSLATORS: translate the below text. We don't
+#. directly internationalize that text so that we can
+#. tweak it without breaking translations.
+#, c-format
+msgid "TOFU: few signatures %d message %s"
+msgid_plural "TOFU: few signatures %d messages %s"
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+#| msgid "error sending data: %s\n"
+msgid "error opening TOFU database: %s\n"
+msgstr "erreur d'envoi de données : %s\n"
+
#, c-format
msgid "'%s' is not a valid long keyID\n"
msgstr "« %s » n'est pas un identifiant valable de clef longue\n"
@@ -5564,19 +5861,25 @@ msgstr ""
"inutile de mettre à jour la base de confiance avec le modèle de\n"
" confiance « %s »\n"
-#, c-format
-msgid "public key %s not found: %s\n"
-msgstr "clef publique %s introuvable : %s\n"
-
msgid "please do a --check-trustdb\n"
msgstr "veuillez faire un --check-trustdb\n"
msgid "checking the trustdb\n"
msgstr "vérification de la base de confiance\n"
-#, c-format
-msgid "%d keys processed (%d validity counts cleared)\n"
-msgstr "%d clefs traitées (%d comptes de validité réinitialisés)\n"
+#, fuzzy, c-format
+#| msgid "%lu keys processed so far\n"
+msgid "%d key processed"
+msgid_plural "%d keys processed"
+msgstr[0] "%lu clefs traitées jusqu'à présent\n"
+msgstr[1] "%lu clefs traitées jusqu'à présent\n"
+
+#, fuzzy, c-format
+#| msgid "%d keys processed (%d validity counts cleared)\n"
+msgid " (%d validity count cleared)\n"
+msgid_plural " (%d validity counts cleared)\n"
+msgstr[0] "%d clefs traitées (%d comptes de validité réinitialisés)\n"
+msgstr[1] "%d clefs traitées (%d comptes de validité réinitialisés)\n"
msgid "no ultimately trusted keys found\n"
msgstr "aucune clef de confiance ultime n'a été trouvée\n"
@@ -5586,12 +5889,6 @@ msgid "public key of ultimately trusted key %s not found\n"
msgstr "la clef publique de la clef de confiance ultime %s est introuvable\n"
#, c-format
-msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
-msgstr ""
-"%d marginale(s) nécessaire(s), %d complète(s) nécessaire(s),\n"
-" modèle de confiance %s\n"
-
-#, c-format
msgid ""
"depth: %d valid: %3d signed: %3d trust: %d-, %dq, %dn, %dm, %df, %du\n"
msgstr ""
@@ -5802,9 +6099,15 @@ msgstr "erreur de récupération de l'état CHV de la carte\n"
msgid "card is permanently locked!\n"
msgstr "la carte est irrémédiablement bloquée.\n"
-#, c-format
-msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
-msgstr ""
+#, fuzzy, c-format
+#| msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
+msgid "%d Admin PIN attempt remaining before card is permanently locked\n"
+msgid_plural ""
+"%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr[0] ""
+"il reste %d tentatives de code personnel d'administration\n"
+"avant que la carte ne soit irrémédiablement bloquée\n"
+msgstr[1] ""
"il reste %d tentatives de code personnel d'administration\n"
"avant que la carte ne soit irrémédiablement bloquée\n"
@@ -5893,9 +6196,12 @@ msgstr "veuillez patienter pendant la génération de la clef…\n"
msgid "generating key failed\n"
msgstr "échec de génération de la clef\n"
-#, c-format
-msgid "key generation completed (%d seconds)\n"
-msgstr "la génération de clef est terminé (%d secondes)\n"
+#, fuzzy, c-format
+#| msgid "key generation completed (%d seconds)\n"
+msgid "key generation completed (%d second)\n"
+msgid_plural "key generation completed (%d seconds)\n"
+msgstr[0] "la génération de clef est terminé (%d secondes)\n"
+msgstr[1] "la génération de clef est terminé (%d secondes)\n"
msgid "invalid structure of OpenPGP card (DO 0x93)\n"
msgstr "structure de carte OpenPGP incorrecte (DO 0x93)\n"
@@ -8096,6 +8402,11 @@ msgstr "|N|la phrase secrète expire après N jours"
msgid "do not allow the reuse of old passphrases"
msgstr "ne pas autoriser la réutilisation d'anciennes phrases secrètes"
+#, fuzzy
+#| msgid "|N|set LDAP timeout to N seconds"
+msgid "|N|set the Pinentry timeout to N seconds"
+msgstr "|N|définir le temps d'expiration de LDAP à N secondes"
+
msgid "|NAME|use NAME as default secret key"
msgstr "|NOM|utiliser le NOM comme clef secrète par défaut"
@@ -8386,6 +8697,94 @@ msgstr ""
"Vérifier une phrase secrète donnée sur l'entrée standard par rapport à "
"ficmotif\n"
+#, fuzzy
+#~| msgid "option \"%.50s\" is ambiguous\n"
+#~ msgid "key specification '%s' is ambiguous\n"
+#~ msgstr "l'option « %.50s » est ambiguë\n"
+
+#~ msgid "%d signatures not checked due to missing keys\n"
+#~ msgstr "%d signatures non vérifiées à cause de clefs manquantes\n"
+
+#~ msgid "%d signatures not checked due to errors\n"
+#~ msgstr "%d signatures non vérifiées à cause d'erreurs\n"
+
+#~ msgid "1 user ID without valid self-signature detected\n"
+#~ msgstr "1 identité sans autosignature valable détecté\n"
+
+#~ msgid "Deleted %d signatures.\n"
+#~ msgstr "%d signatures supprimées\n"
+
+#~ msgid "User ID \"%s\": %d signatures removed\n"
+#~ msgstr "Identité « %s » : %d signatures supprimées\n"
+
+#~ msgid ""
+#~ "You need a Passphrase to protect your secret key.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Une phrase secrète est nécessaire pour protéger votre clef secrète.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Please enter a passphrase to protect the off-card backup of the new "
+#~ "encryption key."
+#~ msgstr ""
+#~ "Veuillez entrer une phrase secrète pour protéger la sauvegarde hors carte "
+#~ "de la nouvelle clef de chiffrement."
+
+#~ msgid "passphrase not correctly repeated; try again"
+#~ msgstr ""
+#~ "la phrase secrète n'a pas été correctement répétée ; veuillez réessayer"
+
+#~ msgid "%s.\n"
+#~ msgstr "%s.\n"
+
+#~ msgid ""
+#~ "You don't want a passphrase - this is probably a *bad* idea!\n"
+#~ "I will do it anyway. You can change your passphrase at any time,\n"
+#~ "using this program with the option \"--edit-key\".\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Vous ne voulez pas de phrase secrète — c'est sans doute une *mauvaise*\n"
+#~ "idée. C'est possible quand même. Vous pouvez modifier la phrase secrète\n"
+#~ "à tout moment en utilisant ce programme avec l'option « --edit-key ».\n"
+#~ "\n"
+
+#~ msgid "storing key onto card failed: %s\n"
+#~ msgstr "impossible de stocker la clef sur la carte : %s\n"
+
+#, fuzzy
+#~| msgid "1 bad signature\n"
+#~ msgid "1 good signature\n"
+#~ msgstr "1 mauvaise signature\n"
+
+#~ msgid "renaming '%s' to '%s' failed: %s\n"
+#~ msgstr "impossible de renommer « %s » en « %s » : %s\n"
+
+#~ msgid "%lu keys cached (%lu signatures)\n"
+#~ msgstr "%lu clefs mises en cache (%lu signatures)\n"
+
+#~ msgid "refreshing 1 key from %s\n"
+#~ msgstr "rafraîchissement d'une clef à partir de %s\n"
+
+#~ msgid "sending key %s to %s server %s\n"
+#~ msgstr "envoi de la clef %s au serveur %s %s\n"
+
+#~ msgid "public key %s is %lu seconds newer than the signature\n"
+#~ msgstr ""
+#~ "la clef publique %s est plus récente de %lu secondes que la signature\n"
+
+#~ msgid ""
+#~ "key %s was created %lu seconds in the future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "la clef %s a été créée %lu secondes dans le futur\n"
+#~ "(faille temporelle ou problème d'horloge)\n"
+
+#~ msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
+#~ msgstr ""
+#~ "%d marginale(s) nécessaire(s), %d complète(s) nécessaire(s),\n"
+#~ " modèle de confiance %s\n"
+
#~ msgid "cleared passphrase cached with ID: %s\n"
#~ msgstr "phrase secrète effacée mise en cache avec l'identifiant : %s\n"
@@ -8755,9 +9154,6 @@ msgstr ""
#~ msgid "searching for \"%s\" from %s\n"
#~ msgstr "recherche de « %s » sur %s\n"
-#~ msgid "no keyserver action!\n"
-#~ msgstr "pas d'action pour le serveur de clefs.\n"
-
#~ msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n"
#~ msgstr ""
#~ "Attention : le gestionnaire de serveurs de clefs provient d'une\n"
@@ -9388,9 +9784,6 @@ msgstr ""
#~ msgid "ERROR: "
#~ msgstr "Erreur : "
-#~ msgid "WARNING: "
-#~ msgstr "Attention : "
-
#~ msgid "... this is a bug (%s:%d:%s)\n"
#~ msgstr "… c'est un bogue (%s : %d : %s)\n"
diff --git a/po/gl.po b/po/gl.po
index f797ee2..49ba220 100644
--- a/po/gl.po
+++ b/po/gl.po
@@ -1247,6 +1247,20 @@ msgid "Enter passphrase: "
msgstr "Introduza o contrasinal: "
#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "error getting version from '%s': %s\n"
+msgstr "erro ao crea-lo chaveiro `%s': %s\n"
+
+#, c-format
+msgid "server '%s' is older than us (%s < %s)"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "WARNING: %s overrides %s\n"
+msgid "WARNING: %s\n"
+msgstr "AVISO: %s fai que se ignore %s\n"
+
+#, fuzzy, c-format
msgid "OpenPGP card not available: %s\n"
msgstr "a chave secreta non está dispoñible"
@@ -1753,6 +1767,11 @@ msgid "remove as much as possible from key during export"
msgstr ""
#, fuzzy
+#| msgid "%s: skipped: %s\n"
+msgid " - skipped"
+msgstr "%s: omitido: %s\n"
+
+#, fuzzy
msgid "exporting secret keys not allowed\n"
msgstr "gravando a chave secreta en `%s'\n"
@@ -1764,19 +1783,36 @@ msgstr "chave %08lX: chave estilo PGP 2.x - omitida\n"
msgid "key %s: key material on-card - skipped\n"
msgstr "chave %08lX: sinatura da sub-chave nun lugar incorrecto - omitida\n"
-#, fuzzy
-#| msgid "%s: skipped: %s\n"
-msgid " - skipped"
-msgstr "%s: omitido: %s\n"
-
msgid "WARNING: nothing exported\n"
msgstr "AVISO: non se exportou nada\n"
+#, fuzzy, c-format
+#| msgid "error creating `%s': %s\n"
+msgid "error creating '%s': %s\n"
+msgstr "erro ao crear `%s': %s\n"
+
#, fuzzy
msgid "[User ID not found]"
msgstr "[Non se atopou o id de usuario]"
#, fuzzy, c-format
+msgid "(check argument of option '%s')\n"
+msgstr "opcións de importación non válidas\n"
+
+#, c-format
+msgid "Warning: '%s' should be a long key ID or a fingerprint\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error looking up: %s\n"
+msgstr "erro lendo `%s': %s\n"
+
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "Warning: %s appears in the keyring %d times\n"
+msgstr "erro ao crea-lo chaveiro `%s': %s\n"
+
+#, fuzzy, c-format
msgid "automatically retrieved '%s' via %s\n"
msgstr "erro ao crear `%s': %s\n"
@@ -1793,14 +1829,19 @@ msgid "secret key \"%s\" not found: %s\n"
msgstr "non se atopou a chave secreta `%s': %s\n"
#, fuzzy, c-format
-msgid "(check argument of option '%s')\n"
-msgstr "opcións de importación non válidas\n"
+#| msgid "|NAME|use NAME as default secret key"
+msgid "Warning: not using '%s' as default key: %s\n"
+msgstr "|NOME|empregar NOME coma chave secreta por defecto"
#, fuzzy, c-format
#| msgid "|NAME|use NAME as default secret key"
-msgid "using \"%s\" as default secret key\n"
+msgid "using \"%s\" as default secret key for signing\n"
msgstr "|NOME|empregar NOME coma chave secreta por defecto"
+#, c-format
+msgid "all values passed to '%s' ignored\n"
+msgstr ""
+
#, fuzzy, c-format
msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
msgstr ""
@@ -2159,28 +2200,6 @@ msgid "Note: old default options file '%s' ignored\n"
msgstr "NOTA: ignórase o antigo ficheiro de opcións por defecto `%s'\n"
#, c-format
-msgid ""
-"Warning: value '%s' for option '%s' should be a long key ID or a "
-"fingerprint\n"
-msgstr ""
-
-#, c-format
-msgid "key specification '%s' is ambiguous\n"
-msgstr ""
-
-#. TRANSLATORS: The %s prints a key specification which
-#. for example has been given at the command line. Two
-#. lines with fingerprints are printed after this message.
-#, c-format
-msgid "'%s' matches at least:\n"
-msgstr ""
-
-#, fuzzy, c-format
-#| msgid "error creating keyring `%s': %s\n"
-msgid "error searching the keyring: %s\n"
-msgstr "erro ao crea-lo chaveiro `%s': %s\n"
-
-#, c-format
msgid "libgcrypt is too old (need %s, have %s)\n"
msgstr ""
@@ -2388,14 +2407,6 @@ msgid "WARNING: recipients (-r) given without using public key encryption\n"
msgstr ""
"AVISO: deronse destinatarios (-r) sen empregar cifrado de chave pública\n"
-#, fuzzy, c-format
-msgid "option '%s' given, but no valid default keys given\n"
-msgstr "algoritmo de hash non válido `%s'\n"
-
-#, fuzzy, c-format
-msgid "option '%s' given, but option '%s' not given\n"
-msgstr "algoritmo de hash non válido `%s'\n"
-
msgid "--store [filename]"
msgstr "--store [ficheiro]"
@@ -2471,6 +2482,11 @@ msgstr "a recepción do servidor de chaves fallou: %s\n"
msgid "key export failed: %s\n"
msgstr "a exportación da chave fallou: %s\n"
+#, fuzzy, c-format
+#| msgid "key export failed: %s\n"
+msgid "export as ssh key failed: %s\n"
+msgstr "a exportación da chave fallou: %s\n"
+
#, c-format
msgid "keyserver search failed: %s\n"
msgstr "a busca no servidor de chaves fallou fallou: %s\n"
@@ -2972,33 +2988,33 @@ msgstr "[revocación]"
msgid "[self-signature]"
msgstr "[auto-sinatura]"
-msgid "1 bad signature\n"
-msgstr "1 sinatura errónea\n"
-
-#, c-format
-msgid "%d bad signatures\n"
-msgstr "%d sinaturas erróneas\n"
-
-msgid "1 signature not checked due to a missing key\n"
-msgstr "1 sinatura non verificada debido a unha chave que falta\n"
-
-#, c-format
-msgid "%d signatures not checked due to missing keys\n"
-msgstr "%d sinaturas non verificadas debido a chaves que faltan\n"
-
-msgid "1 signature not checked due to an error\n"
-msgstr "1 sinatura non verificada debido a un erro\n"
+#, fuzzy, c-format
+#| msgid "%d bad signatures\n"
+msgid "%d bad signature\n"
+msgid_plural "%d bad signatures\n"
+msgstr[0] "%d sinaturas erróneas\n"
+msgstr[1] "%d sinaturas erróneas\n"
-#, c-format
-msgid "%d signatures not checked due to errors\n"
-msgstr "%d sinaturas non verificadas debido a erros\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to a missing key\n"
+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 sinatura non verificada debido a unha chave que falta\n"
+msgstr[1] "1 sinatura non verificada debido a unha chave que falta\n"
-msgid "1 user ID without valid self-signature detected\n"
-msgstr "detectado 1 ID de usuario sin auto-sinatura válida\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to an error\n"
+msgid "%d signature not checked due to an error\n"
+msgid_plural "%d signatures not checked due to errors\n"
+msgstr[0] "1 sinatura non verificada debido a un erro\n"
+msgstr[1] "1 sinatura non verificada debido a un erro\n"
-#, c-format
-msgid "%d user IDs without valid self-signatures detected\n"
-msgstr "detectados %d IDs de usuario sin auto-sinatura válida\n"
+#, fuzzy, c-format
+#| msgid "%d user IDs without valid self-signatures detected\n"
+msgid "%d user ID without valid self-signature detected\n"
+msgid_plural "%d user IDs without valid self-signatures detected\n"
+msgstr[0] "detectados %d IDs de usuario sin auto-sinatura válida\n"
+msgstr[1] "detectados %d IDs de usuario sin auto-sinatura válida\n"
#, fuzzy
msgid ""
@@ -3640,13 +3656,12 @@ msgstr "¿Borrar esta sinatura descoñecida? (s/N/q)"
msgid "Really delete this self-signature? (y/N)"
msgstr "¿Realmente quere borrar esta auto-sinatura? (s/N)"
-#, c-format
+#, fuzzy, c-format
+#| msgid "Deleted %d signature.\n"
msgid "Deleted %d signature.\n"
-msgstr "Borrada %d sinatura.\n"
-
-#, c-format
-msgid "Deleted %d signatures.\n"
-msgstr "Borradas %d sinaturas.\n"
+msgid_plural "Deleted %d signatures.\n"
+msgstr[0] "Borrada %d sinatura.\n"
+msgstr[1] "Borrada %d sinatura.\n"
msgid "Nothing deleted.\n"
msgstr "Non se borrou nada.\n"
@@ -3661,11 +3676,9 @@ msgstr "O ID de usuario \"%s\" está revocado."
#, fuzzy, c-format
msgid "User ID \"%s\": %d signature removed\n"
-msgstr "O ID de usuario \"%s\" está revocado."
-
-#, fuzzy, c-format
-msgid "User ID \"%s\": %d signatures removed\n"
-msgstr "O ID de usuario \"%s\" está revocado."
+msgid_plural "User ID \"%s\": %d signatures removed\n"
+msgstr[0] "O ID de usuario \"%s\" está revocado."
+msgstr[1] "O ID de usuario \"%s\" está revocado."
#, fuzzy, c-format
msgid "User ID \"%s\": already minimized\n"
@@ -4209,37 +4222,6 @@ msgid "Please correct the error first\n"
msgstr "Por favor, corrixa antes o erro\n"
msgid ""
-"You need a Passphrase to protect your secret key.\n"
-"\n"
-msgstr ""
-"Necesita un contrasinal para protexe-la súa chave secreta.\n"
-"\n"
-
-#, fuzzy
-msgid ""
-"Please enter a passphrase to protect the off-card backup of the new "
-"encryption key."
-msgstr "Por favor, introduza o contrasinal; esta é unha frase secreta \n"
-
-msgid "passphrase not correctly repeated; try again"
-msgstr "o contrasinal non se repetiu correctamente; ténteo de novo"
-
-#, c-format
-msgid "%s.\n"
-msgstr "%s.\n"
-
-msgid ""
-"You don't want a passphrase - this is probably a *bad* idea!\n"
-"I will do it anyway. You can change your passphrase at any time,\n"
-"using this program with the option \"--edit-key\".\n"
-"\n"
-msgstr ""
-"Non quere empregar un contrasinal - ¡é unha idea *moi* mala!\n"
-"Hase facer así de tódolos xeitos; pode cambia-lo contrasinal en calquera\n"
-"momento, empregando este programa coa opción \"--edit-key\".\n"
-"\n"
-
-msgid ""
"We need to generate a lot of random bytes. It is a good idea to perform\n"
"some other action (type on the keyboard, move the mouse, utilize the\n"
"disks) during the prime generation; this gives the random number\n"
@@ -4286,6 +4268,14 @@ msgid "Key generation canceled.\n"
msgstr "Cancelouse a xeración de chaves.\n"
#, fuzzy, c-format
+msgid "can't create backup file '%s': %s\n"
+msgstr "non se pode crear `%s': %s\n"
+
+#, fuzzy, c-format
+msgid "Note: backup of card key saved to '%s'\n"
+msgstr "NOTA: a chave secreta %08lX caducou o %s\n"
+
+#, fuzzy, c-format
#| msgid "writing public key to `%s'\n"
msgid "writing public key to '%s'\n"
msgstr "gravando a chave pública en `%s'\n"
@@ -4341,18 +4331,6 @@ msgstr "as partes secretas da chave primaria non están dispoñibles.\n"
msgid "Really create? (y/N) "
msgstr "¿Crear realmente? "
-#, fuzzy, c-format
-msgid "storing key onto card failed: %s\n"
-msgstr "fallou o borrado do bloque de chaves: %s\n"
-
-#, fuzzy, c-format
-msgid "can't create backup file '%s': %s\n"
-msgstr "non se pode crear `%s': %s\n"
-
-#, fuzzy, c-format
-msgid "Note: backup of card key saved to '%s'\n"
-msgstr "NOTA: a chave secreta %08lX caducou o %s\n"
-
msgid "never "
msgstr "nunca "
@@ -4371,19 +4349,18 @@ msgstr "Notación de sinaturas críticas: "
msgid "Signature notation: "
msgstr "Notación de sinaturas: "
-#, fuzzy
-#| msgid "1 bad signature\n"
-msgid "1 good signature\n"
-msgstr "1 sinatura errónea\n"
-
#, fuzzy, c-format
#| msgid "%d bad signatures\n"
-msgid "%d good signatures\n"
-msgstr "%d sinaturas erróneas\n"
+msgid "%d good signature\n"
+msgid_plural "%d good signatures\n"
+msgstr[0] "%d sinaturas erróneas\n"
+msgstr[1] "%d sinaturas erróneas\n"
#, c-format
-msgid "Warning: %lu key(s) skipped due to their large size\n"
-msgstr ""
+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] ""
msgid "Keyring"
msgstr "Chaveiro"
@@ -4414,20 +4391,28 @@ msgid " Card serial no. ="
msgstr ""
#, fuzzy, c-format
-msgid "renaming '%s' to '%s' failed: %s\n"
-msgstr "non se puido poñe-la armadura: %s\n"
-
-#, fuzzy, c-format
msgid "caching keyring '%s'\n"
msgstr "comprobando o chaveiro `%s'\n"
#, fuzzy, c-format
-msgid "%lu keys cached so far (%lu signatures)\n"
-msgstr "%lu chaves comprobadas (%lu sinaturas)\n"
+msgid "%lu keys cached so far (%lu signature)\n"
+msgid_plural "%lu keys cached so far (%lu signatures)\n"
+msgstr[0] "%lu chaves comprobadas (%lu sinaturas)\n"
+msgstr[1] "%lu chaves comprobadas (%lu sinaturas)\n"
#, fuzzy, c-format
-msgid "%lu keys cached (%lu signatures)\n"
-msgstr "%lu chaves comprobadas (%lu sinaturas)\n"
+#| msgid "\t%lu keys updated\n"
+msgid "%lu key cached"
+msgid_plural "%lu keys cached"
+msgstr[0] "\t%lu chaves actualizadas\n"
+msgstr[1] "\t%lu chaves actualizadas\n"
+
+#, fuzzy, c-format
+#| msgid "1 bad signature\n"
+msgid " (%lu signature)\n"
+msgid_plural " (%lu signatures)\n"
+msgstr[0] "1 sinatura errónea\n"
+msgstr[1] "1 sinatura errónea\n"
#, c-format
msgid "%s: keyring created\n"
@@ -4471,18 +4456,16 @@ msgid "\"%s\" not a key ID: skipping\n"
msgstr "%s: non é un ID de chave válido\n"
#, fuzzy, c-format
-msgid "refreshing 1 key from %s\n"
-msgstr "solicitando a chave %08lX de %s\n"
+msgid "refreshing %d key from %s\n"
+msgid_plural "refreshing %d keys from %s\n"
+msgstr[0] "solicitando a chave %08lX de %s\n"
+msgstr[1] "solicitando a chave %08lX de %s\n"
#, fuzzy, c-format
msgid "WARNING: unable to refresh key %s via %s: %s\n"
msgstr "AVISO: non se puido borra-lo ficheiro temporal (%s) `%s': %s\n"
#, fuzzy, c-format
-msgid "refreshing %d keys from %s\n"
-msgstr "solicitando a chave %08lX de %s\n"
-
-#, fuzzy, c-format
msgid "key \"%s\" not found on keyserver\n"
msgstr "non se atopou a chave `%s': %s\n"
@@ -4502,9 +4485,9 @@ msgstr "solicitando a chave %08lX de %s\n"
msgid "requesting key %s from %s\n"
msgstr "solicitando a chave %08lX de %s\n"
-#, fuzzy, c-format
-msgid "sending key %s to %s server %s\n"
-msgstr "buscando \"%s\" no servidor HKP %s\n"
+#, fuzzy
+msgid "no keyserver known\n"
+msgstr "opcións de exportación non válidas\n"
#, fuzzy, c-format
msgid "sending key %s to %s\n"
@@ -4730,6 +4713,17 @@ msgstr ""
msgid "Note: signatures using the %s algorithm are rejected\n"
msgstr "Sinatura %s, algoritmo de resumo %s\n"
+#, fuzzy, c-format
+msgid "(reported error: %s)\n"
+msgstr "erro de lectura: %s\n"
+
+#, fuzzy, c-format
+msgid "(reported error: %s <%s>)\n"
+msgstr "erro de lectura: %s\n"
+
+msgid "(further info: "
+msgstr ""
+
#, c-format
msgid "%s:%d: deprecated option \"%s\"\n"
msgstr "%s:%d: opción a extinguir \"%s\"\n"
@@ -5141,6 +5135,19 @@ msgstr "%s: omitido: a chave pública está desactivada\n"
msgid "%s: skipped: public key already present\n"
msgstr "%s: omitido: a chave pública xa está presente\n"
+#, fuzzy, c-format
+#| msgid "can't connect to `%s': %s\n"
+msgid "can't encrypt to '%s'\n"
+msgstr "non se puido conectar a `%s': %s\n"
+
+#, fuzzy, c-format
+msgid "option '%s' given, but no valid default keys given\n"
+msgstr "algoritmo de hash non válido `%s'\n"
+
+#, fuzzy, c-format
+msgid "option '%s' given, but option '%s' not given\n"
+msgstr "algoritmo de hash non válido `%s'\n"
+
msgid "You did not specify a user ID. (you may use \"-r\")\n"
msgstr "Non especificou un ID de usuario. (pode empregar \"-r\")\n"
@@ -5185,11 +5192,6 @@ msgstr "chave %08lX: non hai ID de usuario\n"
msgid "data not saved; use option \"--output\" to save it\n"
msgstr "os datos non foron gardados; use a opción \"--output\" para gardalos\n"
-#, fuzzy, c-format
-#| msgid "error creating `%s': %s\n"
-msgid "error creating '%s': %s\n"
-msgstr "erro ao crear `%s': %s\n"
-
msgid "Detached signature.\n"
msgstr "Sinatura non adxunta.\n"
@@ -5280,19 +5282,31 @@ msgid "This is a revocation certificate for the OpenPGP key:"
msgstr "¿Crear un certificado de revocación para esta sinatura? "
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 ""
+
+msgid ""
"Use it to revoke this key in case of a compromise or loss of\n"
"the secret key. However, if the secret key is still accessible,\n"
"it is better to generate a new revocation certificate and give\n"
-"a reason for the revocation."
+"a reason for the revocation. For details see the description of\n"
+"of the gpg command \"--gen-revoke\" in the GnuPG manual."
msgstr ""
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 making use of this revocation certificate."
+"before importing and publishing this revocation certificate."
msgstr ""
#, fuzzy, c-format
+#| msgid "Revocation certificate created.\n"
+msgid "revocation certificate stored as '%s.rev'\n"
+msgstr "Creouse o certificado de revocación.\n"
+
+#, fuzzy, c-format
msgid "secret key \"%s\" not found\n"
msgstr "non se atopou a chave secreta `%s': %s\n"
@@ -5303,6 +5317,11 @@ msgstr "non se atopou a chave secreta `%s': %s\n"
msgid "'%s' matches multiple secret keys:\n"
msgstr ""
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "error searching the keyring: %s\n"
+msgstr "erro ao crea-lo chaveiro `%s': %s\n"
+
#, fuzzy
msgid "Create a revocation certificate for this key? (y/N) "
msgstr "¿Crear un certificado de revocación para esta sinatura? "
@@ -5384,24 +5403,37 @@ msgstr ""
#, fuzzy, c-format
msgid "public key %s is %lu second newer than the signature\n"
-msgstr "a chave pública %08lX é %lu segundo máis nova cá sinatura\n"
+msgid_plural "public key %s is %lu seconds newer than the signature\n"
+msgstr[0] "a chave pública %08lX é %lu segundo máis nova cá sinatura\n"
+msgstr[1] "a chave pública %08lX é %lu segundo máis nova cá sinatura\n"
#, fuzzy, c-format
-msgid "public key %s is %lu seconds newer than the signature\n"
-msgstr "a chave pública %08lX é %lu segundos máis nova cá sinatura\n"
+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] "a chave pública %08lX é %lu segundo máis nova cá sinatura\n"
+msgstr[1] "a chave pública %08lX é %lu segundo máis nova cá sinatura\n"
#, fuzzy, c-format
msgid ""
"key %s was created %lu second in the future (time warp or clock problem)\n"
-msgstr ""
+msgid_plural ""
+"key %s was created %lu seconds in the future (time warp or clock problem)\n"
+msgstr[0] ""
+"creouse a chave %lu segundo no futuro (salto no tempo ou problemas co "
+"reloxo)\n"
+msgstr[1] ""
"creouse a chave %lu segundo no futuro (salto no tempo ou problemas co "
"reloxo)\n"
#, fuzzy, c-format
-msgid ""
-"key %s was created %lu seconds in the future (time warp or clock problem)\n"
-msgstr ""
-"creouse a chave %lu segundos no futuro (salto no tempo ou problemas co "
+msgid "key %s was created %lu day in the future (time warp or clock problem)\n"
+msgid_plural ""
+"key %s was created %lu days in the future (time warp or clock problem)\n"
+msgstr[0] ""
+"creouse a chave %lu segundo no futuro (salto no tempo ou problemas co "
+"reloxo)\n"
+msgstr[1] ""
+"creouse a chave %lu segundo no futuro (salto no tempo ou problemas co "
"reloxo)\n"
#, fuzzy, c-format
@@ -5637,6 +5669,237 @@ msgid "input line longer than %d characters\n"
msgstr "a liña de entrada contén máis de %d caracteres\n"
#, fuzzy, c-format
+msgid "error beginning transaction on TOFU database: %s\n"
+msgstr "erro ao enviar a `%s': %s\n"
+
+#, c-format
+msgid "error committing transaction on TOFU database: %s\n"
+msgstr ""
+
+#, c-format
+msgid "error rolling back transaction on TOFU database: %s\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "unsupported TOFU database version: %s\n"
+msgstr ""
+"\n"
+"Algoritmos soportados:\n"
+
+#, fuzzy, c-format
+msgid "error reading TOFU database: %s\n"
+msgstr "erro ao enviar a `%s': %s\n"
+
+#, fuzzy, c-format
+#| msgid "error writing secret keyring `%s': %s\n"
+msgid "error determining TOFU database's version: %s\n"
+msgstr "erro escribindo no chaveiro secreto `%s': %s\n"
+
+#, fuzzy, c-format
+#| msgid "%s: error writing dir record: %s\n"
+msgid "error initializing TOFU database: %s\n"
+msgstr "%s: erro ao escribi-lo rexistro de directorios: %s\n"
+
+#, fuzzy, c-format
+msgid "error opening TOFU database '%s': %s\n"
+msgstr "erro lendo `%s': %s\n"
+
+msgid "Warning: Home directory contains both tofu.db and tofu.d.\n"
+msgstr ""
+
+msgid "Using split format for TOFU database\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error updating TOFU database: %s\n"
+msgstr "erro ao enviar a `%s': %s\n"
+
+#, fuzzy, c-format
+msgid "public key %s not found: %s\n"
+msgstr "non se atopou a chave pública %08lX: %s\n"
+
+#, fuzzy, c-format
+msgid "error setting TOFU binding's trust level to %s\n"
+msgstr "erro lendo `%s': %s\n"
+
+#, c-format
+msgid "The binding %s is NOT known."
+msgstr ""
+
+#, c-format
+msgid ""
+"The key %s raised a conflict with this binding (%s). Since this binding's "
+"policy was 'auto', it was changed to 'ask'."
+msgstr ""
+
+#, c-format
+msgid ""
+"Please indicate whether you believe the binding %s%sis legitimate (the key "
+"belongs to the stated owner) or a forgery (bad)."
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error gathering other user IDs: %s\n"
+msgstr "erro ao crea-lo contrasinal: %s\n"
+
+msgid "Known user IDs associated with this key:\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "Policy: "
+msgid "policy: %s"
+msgstr "Normativa: "
+
+#, fuzzy, c-format
+msgid "error gathering signature stats: %s\n"
+msgstr "erro ao crea-lo contrasinal: %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] ""
+msgstr[1] ""
+
+#, c-format
+msgid "Statistics for keys with the email address \"%s\":\n"
+msgstr ""
+
+#, fuzzy
+#| msgid "list keys"
+msgid "this key"
+msgstr "ve-la lista de chaves"
+
+#, c-format
+msgid "%ld message signed in the future."
+msgid_plural "%ld messages signed in the future."
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+msgid "%ld message signed"
+msgid_plural "%ld messages signed"
+msgstr[0] "|algo [ficheiros]|visualizar resumos de mensaxes"
+msgstr[1] "|algo [ficheiros]|visualizar resumos de mensaxes"
+
+#, c-format
+msgid " over the past %ld day."
+msgid_plural " over the past %ld days."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid " over the past %ld week."
+msgid_plural " over the past %ld weeks."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid " over the past %ld month."
+msgid_plural " over the past %ld months."
+msgstr[0] ""
+msgstr[1] ""
+
+#. 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 ""
+
+#. 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 ""
+
+msgid "(G)ood, (A)ccept once, (U)nknown, (R)eject once, (B)ad? "
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error changing TOFU policy: %s\n"
+msgstr "erro ao crea-lo contrasinal: %s\n"
+
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "Have never verified a message signed by key %s!\n"
+msgstr ""
+
+#, c-format
+msgid "Failed to collect signature statistics for \"%s\" (key %s)\n"
+msgstr ""
+
+#, c-format
+msgid "Verified 0 messages signed by \"%s\" (key: %s, policy: %s)."
+msgstr ""
+
+#. TRANSLATORS: The final %s is replaced by a string like
+#. "7 months, 1 day, 5 minutes, 0 seconds".
+#, c-format
+msgid ""
+"Verified %ld message signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgid_plural ""
+"Verified %ld messages signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "The most recent message was verified %s ago."
+msgstr ""
+
+msgid "Warning: we've have yet to see a message signed by this key!\n"
+msgstr ""
+
+msgid "Warning: we've only seen a single message signed by this key!\n"
+msgstr ""
+
+#. TRANSLATORS: translate the below text. We don't
+#. directly internationalize that text so that we can
+#. tweak it without breaking translations.
+#, c-format
+msgid "TOFU: few signatures %d message %s"
+msgid_plural "TOFU: few signatures %d messages %s"
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+msgid "error opening TOFU database: %s\n"
+msgstr "erro ao enviar a `%s': %s\n"
+
+#, fuzzy, c-format
#| msgid "`%s' is not a valid long keyID\n"
msgid "'%s' is not a valid long keyID\n"
msgstr "`%s' non é un ID longo de chave válido\n"
@@ -5695,19 +5958,24 @@ msgstr "non se precisa comproba-la base de datos de confianza\n"
msgid "no need for a trustdb update with '%s' trust model\n"
msgstr "non se precisa comproba-la base de datos de confianza\n"
-#, fuzzy, c-format
-msgid "public key %s not found: %s\n"
-msgstr "non se atopou a chave pública %08lX: %s\n"
-
msgid "please do a --check-trustdb\n"
msgstr "por favor, execute con --check-trustdb\n"
msgid "checking the trustdb\n"
msgstr "comprobando a base de datos de confianza\n"
-#, c-format
-msgid "%d keys processed (%d validity counts cleared)\n"
-msgstr "procesáronse %d chaves (marcáronse %d contas de validez)\n"
+#, fuzzy, c-format
+msgid "%d key processed"
+msgid_plural "%d keys processed"
+msgstr[0] "%lu chaves procesadas hasta polo momento\n"
+msgstr[1] "%lu chaves procesadas hasta polo momento\n"
+
+#, fuzzy, c-format
+#| msgid "%d keys processed (%d validity counts cleared)\n"
+msgid " (%d validity count cleared)\n"
+msgid_plural " (%d validity counts cleared)\n"
+msgstr[0] "procesáronse %d chaves (marcáronse %d contas de validez)\n"
+msgstr[1] "procesáronse %d chaves (marcáronse %d contas de validez)\n"
msgid "no ultimately trusted keys found\n"
msgstr "non se atoparon chaves de confianza absoluta\n"
@@ -5717,10 +5985,6 @@ msgid "public key of ultimately trusted key %s not found\n"
msgstr "non se atopou a chave pública da clave de confianza absoluta %08lX\n"
#, c-format
-msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
-msgstr ""
-
-#, c-format
msgid ""
"depth: %d valid: %3d signed: %3d trust: %d-, %dq, %dn, %dm, %df, %du\n"
msgstr ""
@@ -5920,8 +6184,11 @@ msgid "card is permanently locked!\n"
msgstr ""
#, c-format
-msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
-msgstr ""
+msgid "%d Admin PIN attempt remaining before card is permanently locked\n"
+msgid_plural ""
+"%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr[0] ""
+msgstr[1] ""
#. TRANSLATORS: Do not translate the "|A|" prefix but keep it at
#. the start of the string. Use %%0A to force a linefeed.
@@ -6011,8 +6278,10 @@ msgid "generating key failed\n"
msgstr "fallou o borrado do bloque de chaves: %s\n"
#, fuzzy, c-format
-msgid "key generation completed (%d seconds)\n"
-msgstr "A xeración da chave fallou: %s\n"
+msgid "key generation completed (%d second)\n"
+msgid_plural "key generation completed (%d seconds)\n"
+msgstr[0] "A xeración da chave fallou: %s\n"
+msgstr[1] "A xeración da chave fallou: %s\n"
msgid "invalid structure of OpenPGP card (DO 0x93)\n"
msgstr ""
@@ -8231,6 +8500,9 @@ msgstr "|N|emprega-lo modo de contrasinal N"
msgid "do not allow the reuse of old passphrases"
msgstr "erro ao crea-lo contrasinal: %s\n"
+msgid "|N|set the Pinentry timeout to N seconds"
+msgstr ""
+
msgid "|NAME|use NAME as default secret key"
msgstr "|NOME|empregar NOME coma chave secreta por defecto"
@@ -8529,6 +8801,89 @@ msgid ""
"Check a passphrase given on stdin against the patternfile\n"
msgstr ""
+#~ msgid "%d signatures not checked due to missing keys\n"
+#~ msgstr "%d sinaturas non verificadas debido a chaves que faltan\n"
+
+#~ msgid "%d signatures not checked due to errors\n"
+#~ msgstr "%d sinaturas non verificadas debido a erros\n"
+
+#~ msgid "1 user ID without valid self-signature detected\n"
+#~ msgstr "detectado 1 ID de usuario sin auto-sinatura válida\n"
+
+#~ msgid "Deleted %d signatures.\n"
+#~ msgstr "Borradas %d sinaturas.\n"
+
+#, fuzzy
+#~ msgid "User ID \"%s\": %d signatures removed\n"
+#~ msgstr "O ID de usuario \"%s\" está revocado."
+
+#~ msgid ""
+#~ "You need a Passphrase to protect your secret key.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Necesita un contrasinal para protexe-la súa chave secreta.\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "Please enter a passphrase to protect the off-card backup of the new "
+#~ "encryption key."
+#~ msgstr "Por favor, introduza o contrasinal; esta é unha frase secreta \n"
+
+#~ msgid "passphrase not correctly repeated; try again"
+#~ msgstr "o contrasinal non se repetiu correctamente; ténteo de novo"
+
+#~ msgid "%s.\n"
+#~ msgstr "%s.\n"
+
+#~ msgid ""
+#~ "You don't want a passphrase - this is probably a *bad* idea!\n"
+#~ "I will do it anyway. You can change your passphrase at any time,\n"
+#~ "using this program with the option \"--edit-key\".\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Non quere empregar un contrasinal - ¡é unha idea *moi* mala!\n"
+#~ "Hase facer así de tódolos xeitos; pode cambia-lo contrasinal en calquera\n"
+#~ "momento, empregando este programa coa opción \"--edit-key\".\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid "storing key onto card failed: %s\n"
+#~ msgstr "fallou o borrado do bloque de chaves: %s\n"
+
+#, fuzzy
+#~| msgid "1 bad signature\n"
+#~ msgid "1 good signature\n"
+#~ msgstr "1 sinatura errónea\n"
+
+#, fuzzy
+#~ msgid "renaming '%s' to '%s' failed: %s\n"
+#~ msgstr "non se puido poñe-la armadura: %s\n"
+
+#, fuzzy
+#~ msgid "%lu keys cached (%lu signatures)\n"
+#~ msgstr "%lu chaves comprobadas (%lu sinaturas)\n"
+
+#, fuzzy
+#~ msgid "refreshing 1 key from %s\n"
+#~ msgstr "solicitando a chave %08lX de %s\n"
+
+#, fuzzy
+#~ msgid "sending key %s to %s server %s\n"
+#~ msgstr "buscando \"%s\" no servidor HKP %s\n"
+
+#, fuzzy
+#~ msgid "public key %s is %lu seconds newer than the signature\n"
+#~ msgstr "a chave pública %08lX é %lu segundos máis nova cá sinatura\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "key %s was created %lu seconds in the future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "creouse a chave %lu segundos no futuro (salto no tempo ou problemas co "
+#~ "reloxo)\n"
+
#, fuzzy
#~| msgid "can't open the keyring"
#~ msgid "Failed to open the keyring DB.\n"
@@ -8784,10 +9139,6 @@ msgstr ""
#~ msgstr "buscando \"%s\" no servidor HKP %s\n"
#, fuzzy
-#~ msgid "no keyserver action!\n"
-#~ msgstr "opcións de exportación non válidas\n"
-
-#, fuzzy
#~ msgid "keyserver timed out\n"
#~ msgstr "erro do servidor de chaves"
@@ -9989,9 +10340,6 @@ msgstr ""
#~ msgid "%s%c %4u%c/%08lX created: %s expires: %s"
#~ msgstr "%s%c %4u%c/%08lX creada: %s caduca: %s"
-#~ msgid "Policy: "
-#~ msgstr "Normativa: "
-
#~ msgid "can't get key from keyserver: %s\n"
#~ msgstr "non se pode obte-la chave do servidor de chaves: %s\n"
@@ -10317,9 +10665,6 @@ msgstr ""
#~ msgid "\t%lu due to new pubkeys\n"
#~ msgstr "\t%lu debidos a novas chaves públicas\n"
-#~ msgid "\t%lu keys updated\n"
-#~ msgstr "\t%lu chaves actualizadas\n"
-
#~ msgid "Ooops, no keys\n"
#~ msgstr "Ooops, non hai chaves\n"
diff --git a/po/hu.po b/po/hu.po
index 053e6e6..20846d2 100644
--- a/po/hu.po
+++ b/po/hu.po
@@ -1238,6 +1238,20 @@ msgid "Enter passphrase: "
msgstr "Írja be a jelszót: "
#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "error getting version from '%s': %s\n"
+msgstr "Hiba a(z) \"%s\" kulcskarika létrehozásakor: %s\n"
+
+#, c-format
+msgid "server '%s' is older than us (%s < %s)"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "WARNING: %s overrides %s\n"
+msgid "WARNING: %s\n"
+msgstr "FIGYELEM: %s hatástalanítja %s-t!\n"
+
+#, fuzzy, c-format
msgid "OpenPGP card not available: %s\n"
msgstr "titkos kulcs nem áll rendelkezésre"
@@ -1740,6 +1754,11 @@ msgid "remove as much as possible from key during export"
msgstr ""
#, fuzzy
+#| msgid "%s: skipped: %s\n"
+msgid " - skipped"
+msgstr "%s: kihagyva: %s\n"
+
+#, fuzzy
msgid "exporting secret keys not allowed\n"
msgstr "Írom a titkos kulcsot a %s állományba.\n"
@@ -1751,19 +1770,36 @@ msgstr "%08lX kulcs: PGP 2.x stílusú kulcs - kihagytam.\n"
msgid "key %s: key material on-card - skipped\n"
msgstr "%08lX kulcs: Alkulcsaláírás rossz helyen - kihagytam.\n"
-#, fuzzy
-#| msgid "%s: skipped: %s\n"
-msgid " - skipped"
-msgstr "%s: kihagyva: %s\n"
-
msgid "WARNING: nothing exported\n"
msgstr "FIGYELEM: Semmit sem exportáltam.\n"
+#, fuzzy, c-format
+#| msgid "error creating `%s': %s\n"
+msgid "error creating '%s': %s\n"
+msgstr "Hiba \"%s\" létrehozásakor: %s\n"
+
#, fuzzy
msgid "[User ID not found]"
msgstr "[ismeretlen kulcs]"
#, fuzzy, c-format
+msgid "(check argument of option '%s')\n"
+msgstr "Érvénytelen import opciók!\n"
+
+#, c-format
+msgid "Warning: '%s' should be a long key ID or a fingerprint\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error looking up: %s\n"
+msgstr "Hiba \"%s\" olvasásakor: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "Warning: %s appears in the keyring %d times\n"
+msgstr "Hiba a(z) \"%s\" kulcskarika létrehozásakor: %s\n"
+
+#, fuzzy, c-format
msgid "automatically retrieved '%s' via %s\n"
msgstr "Hiba \"%s\" létrehozásakor: %s\n"
@@ -1780,14 +1816,19 @@ msgid "secret key \"%s\" not found: %s\n"
msgstr "\"%s\" titkos kulcs nem található: %s\n"
#, fuzzy, c-format
-msgid "(check argument of option '%s')\n"
-msgstr "Érvénytelen import opciók!\n"
+#| msgid "|NAME|use NAME as default secret key"
+msgid "Warning: not using '%s' as default key: %s\n"
+msgstr "|NÉV|NÉV használata alapértelmezett titkos kulcsként"
#, fuzzy, c-format
#| msgid "|NAME|use NAME as default secret key"
-msgid "using \"%s\" as default secret key\n"
+msgid "using \"%s\" as default secret key for signing\n"
msgstr "|NÉV|NÉV használata alapértelmezett titkos kulcsként"
+#, c-format
+msgid "all values passed to '%s' ignored\n"
+msgstr ""
+
#, fuzzy, c-format
msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
msgstr ""
@@ -2147,28 +2188,6 @@ msgid "Note: old default options file '%s' ignored\n"
msgstr "MEGJEGYZÉS: Figyelmen kívül hagytam a régi opciókat (%s).\n"
#, c-format
-msgid ""
-"Warning: value '%s' for option '%s' should be a long key ID or a "
-"fingerprint\n"
-msgstr ""
-
-#, c-format
-msgid "key specification '%s' is ambiguous\n"
-msgstr ""
-
-#. TRANSLATORS: The %s prints a key specification which
-#. for example has been given at the command line. Two
-#. lines with fingerprints are printed after this message.
-#, c-format
-msgid "'%s' matches at least:\n"
-msgstr ""
-
-#, fuzzy, c-format
-#| msgid "error creating keyring `%s': %s\n"
-msgid "error searching the keyring: %s\n"
-msgstr "Hiba a(z) \"%s\" kulcskarika létrehozásakor: %s\n"
-
-#, c-format
msgid "libgcrypt is too old (need %s, have %s)\n"
msgstr ""
@@ -2376,14 +2395,6 @@ msgid "WARNING: recipients (-r) given without using public key encryption\n"
msgstr ""
"FIGYELEM: Címzett megadva (-r), de nincs nyilvános kulcsú titkosítás!\n"
-#, fuzzy, c-format
-msgid "option '%s' given, but no valid default keys given\n"
-msgstr "Érvénytelen kivonatoló algoritmus: %s\n"
-
-#, fuzzy, c-format
-msgid "option '%s' given, but option '%s' not given\n"
-msgstr "Érvénytelen kivonatoló algoritmus: %s\n"
-
msgid "--store [filename]"
msgstr "--store [fájlnév]"
@@ -2459,6 +2470,11 @@ msgstr "Vétel a kulcsszerverrõl sikertelen: %s\n"
msgid "key export failed: %s\n"
msgstr "Kulcsexportálás sikertelen: %s\n"
+#, fuzzy, c-format
+#| msgid "key export failed: %s\n"
+msgid "export as ssh key failed: %s\n"
+msgstr "Kulcsexportálás sikertelen: %s\n"
+
#, c-format
msgid "keyserver search failed: %s\n"
msgstr "Keresés a kulcsszerveren sikertelen: %s\n"
@@ -2952,33 +2968,33 @@ msgstr "[visszavonás]"
msgid "[self-signature]"
msgstr "[önaláírás]"
-msgid "1 bad signature\n"
-msgstr "1 rossz aláírás.\n"
-
-#, c-format
-msgid "%d bad signatures\n"
-msgstr "%d rossz aláírás.\n"
-
-msgid "1 signature not checked due to a missing key\n"
-msgstr "1 aláírást nem ellenõriztem hiányzó kulcs miatt.\n"
-
-#, c-format
-msgid "%d signatures not checked due to missing keys\n"
-msgstr "%d aláírást nem ellenõriztem hiányzó kulcs miatt.\n"
-
-msgid "1 signature not checked due to an error\n"
-msgstr "1 aláírást nem ellenõriztem hiba miatt.\n"
+#, fuzzy, c-format
+#| msgid "%d bad signatures\n"
+msgid "%d bad signature\n"
+msgid_plural "%d bad signatures\n"
+msgstr[0] "%d rossz aláírás.\n"
+msgstr[1] "%d rossz aláírás.\n"
-#, c-format
-msgid "%d signatures not checked due to errors\n"
-msgstr "%d aláírást nem ellenõriztem hiba miatt.\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to a missing key\n"
+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 aláírást nem ellenõriztem hiányzó kulcs miatt.\n"
+msgstr[1] "1 aláírást nem ellenõriztem hiányzó kulcs miatt.\n"
-msgid "1 user ID without valid self-signature detected\n"
-msgstr "1 felhasználóazonosítót találtam érvényes önaláírás nélkül.\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to an error\n"
+msgid "%d signature not checked due to an error\n"
+msgid_plural "%d signatures not checked due to errors\n"
+msgstr[0] "1 aláírást nem ellenõriztem hiba miatt.\n"
+msgstr[1] "1 aláírást nem ellenõriztem hiba miatt.\n"
-#, c-format
-msgid "%d user IDs without valid self-signatures detected\n"
-msgstr "%d felhasználóazonosítót találtam érvényes önaláírás nélkül.\n"
+#, fuzzy, c-format
+#| msgid "%d user IDs without valid self-signatures detected\n"
+msgid "%d user ID without valid self-signature detected\n"
+msgid_plural "%d user IDs without valid self-signatures detected\n"
+msgstr[0] "%d felhasználóazonosítót találtam érvényes önaláírás nélkül.\n"
+msgstr[1] "%d felhasználóazonosítót találtam érvényes önaláírás nélkül.\n"
#, fuzzy
msgid ""
@@ -3612,13 +3628,12 @@ msgstr "Törli ezt az ismeretlen aláírást? (i/N/k)"
msgid "Really delete this self-signature? (y/N)"
msgstr "Valóban törli ezt az önaláírást? (i/N)"
-#, c-format
+#, fuzzy, c-format
+#| msgid "Deleted %d signature.\n"
msgid "Deleted %d signature.\n"
-msgstr "Töröltem %d aláírást.\n"
-
-#, c-format
-msgid "Deleted %d signatures.\n"
-msgstr "Töröltem %d aláírást.\n"
+msgid_plural "Deleted %d signatures.\n"
+msgstr[0] "Töröltem %d aláírást.\n"
+msgstr[1] "Töröltem %d aláírást.\n"
msgid "Nothing deleted.\n"
msgstr "Nem töröltem semmit.\n"
@@ -3633,11 +3648,9 @@ msgstr "\"%s\" felhasználói azonosítót visszavonták."
#, fuzzy, c-format
msgid "User ID \"%s\": %d signature removed\n"
-msgstr "\"%s\" felhasználói azonosítót visszavonták."
-
-#, fuzzy, c-format
-msgid "User ID \"%s\": %d signatures removed\n"
-msgstr "\"%s\" felhasználói azonosítót visszavonták."
+msgid_plural "User ID \"%s\": %d signatures removed\n"
+msgstr[0] "\"%s\" felhasználói azonosítót visszavonták."
+msgstr[1] "\"%s\" felhasználói azonosítót visszavonták."
#, fuzzy, c-format
msgid "User ID \"%s\": already minimized\n"
@@ -4175,37 +4188,6 @@ msgid "Please correct the error first\n"
msgstr "Kérem, elõbb javítsa ki a hibát!\n"
msgid ""
-"You need a Passphrase to protect your secret key.\n"
-"\n"
-msgstr ""
-"Most szükség van egy jelszóra (vagy mondatra), amely a titkos kulcsát védi.\n"
-"\n"
-
-#, fuzzy
-msgid ""
-"Please enter a passphrase to protect the off-card backup of the new "
-"encryption key."
-msgstr "Kérem, adja meg a jelszót! Ezt egy titkos mondat. \n"
-
-msgid "passphrase not correctly repeated; try again"
-msgstr "Nem ismételte meg helyesen a jelszót! Próbálja újra!"
-
-#, c-format
-msgid "%s.\n"
-msgstr "%s.\n"
-
-msgid ""
-"You don't want a passphrase - this is probably a *bad* idea!\n"
-"I will do it anyway. You can change your passphrase at any time,\n"
-"using this program with the option \"--edit-key\".\n"
-"\n"
-msgstr ""
-"Ön nem akar jelszót. Ez valószínûleg egy *rossz* ötlet!\n"
-"De azért megcsinálom. Bármikor megváltoztathatja a jelszavát\n"
-"az \"--edit-key\" opcióval.\n"
-"\n"
-
-msgid ""
"We need to generate a lot of random bytes. It is a good idea to perform\n"
"some other action (type on the keyboard, move the mouse, utilize the\n"
"disks) during the prime generation; this gives the random number\n"
@@ -4252,6 +4234,14 @@ msgid "Key generation canceled.\n"
msgstr "Kulcs létrehozása megszakítva.\n"
#, fuzzy, c-format
+msgid "can't create backup file '%s': %s\n"
+msgstr "Nem tudom létrehozni a(z) \"%s\" állományt: %s.\n"
+
+#, fuzzy, c-format
+msgid "Note: backup of card key saved to '%s'\n"
+msgstr "MEGJEGYZÉS: %08lX titkos kulcs %s-kor lejárt.\n"
+
+#, fuzzy, c-format
#| msgid "writing public key to `%s'\n"
msgid "writing public key to '%s'\n"
msgstr "Írom a kulcsot a %s állományba.\n"
@@ -4306,18 +4296,6 @@ msgstr "Az elsõdleges kulcs titkos részei nem elérhetõk.\n"
msgid "Really create? (y/N) "
msgstr "Valóban létrehozzam? "
-#, fuzzy, c-format
-msgid "storing key onto card failed: %s\n"
-msgstr "A kulcsblokk törlése sikertelen: %s.\n"
-
-#, fuzzy, c-format
-msgid "can't create backup file '%s': %s\n"
-msgstr "Nem tudom létrehozni a(z) \"%s\" állományt: %s.\n"
-
-#, fuzzy, c-format
-msgid "Note: backup of card key saved to '%s'\n"
-msgstr "MEGJEGYZÉS: %08lX titkos kulcs %s-kor lejárt.\n"
-
msgid "never "
msgstr "soha "
@@ -4336,19 +4314,18 @@ msgstr "Kritikus aláírás-jelölés: "
msgid "Signature notation: "
msgstr "Aláírás-jelölés: "
-#, fuzzy
-#| msgid "1 bad signature\n"
-msgid "1 good signature\n"
-msgstr "1 rossz aláírás.\n"
-
#, fuzzy, c-format
#| msgid "%d bad signatures\n"
-msgid "%d good signatures\n"
-msgstr "%d rossz aláírás.\n"
+msgid "%d good signature\n"
+msgid_plural "%d good signatures\n"
+msgstr[0] "%d rossz aláírás.\n"
+msgstr[1] "%d rossz aláírás.\n"
#, c-format
-msgid "Warning: %lu key(s) skipped due to their large size\n"
-msgstr ""
+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] ""
msgid "Keyring"
msgstr "Kulcskarika"
@@ -4379,20 +4356,27 @@ msgid " Card serial no. ="
msgstr ""
#, fuzzy, c-format
-msgid "renaming '%s' to '%s' failed: %s\n"
-msgstr "Páncélozás nem sikerült: %s\n"
-
-#, fuzzy, c-format
msgid "caching keyring '%s'\n"
msgstr "Ellenõrzöm a(z) \"%s\" kulcskarikát.\n"
#, fuzzy, c-format
-msgid "%lu keys cached so far (%lu signatures)\n"
-msgstr "%lu kulcsot ellenõriztem (%lu aláírással).\n"
+msgid "%lu keys cached so far (%lu signature)\n"
+msgid_plural "%lu keys cached so far (%lu signatures)\n"
+msgstr[0] "%lu kulcsot ellenõriztem (%lu aláírással).\n"
+msgstr[1] "%lu kulcsot ellenõriztem (%lu aláírással).\n"
+
+#, c-format
+msgid "%lu key cached"
+msgid_plural "%lu keys cached"
+msgstr[0] ""
+msgstr[1] ""
#, fuzzy, c-format
-msgid "%lu keys cached (%lu signatures)\n"
-msgstr "%lu kulcsot ellenõriztem (%lu aláírással).\n"
+#| msgid "1 bad signature\n"
+msgid " (%lu signature)\n"
+msgid_plural " (%lu signatures)\n"
+msgstr[0] "1 rossz aláírás.\n"
+msgstr[1] "1 rossz aláírás.\n"
#, c-format
msgid "%s: keyring created\n"
@@ -4436,8 +4420,10 @@ msgid "\"%s\" not a key ID: skipping\n"
msgstr ""
#, fuzzy, c-format
-msgid "refreshing 1 key from %s\n"
-msgstr "Lekérem a %08lX kulcsot a %s kulcsszerverrõl.\n"
+msgid "refreshing %d key from %s\n"
+msgid_plural "refreshing %d keys from %s\n"
+msgstr[0] "Lekérem a %08lX kulcsot a %s kulcsszerverrõl.\n"
+msgstr[1] "Lekérem a %08lX kulcsot a %s kulcsszerverrõl.\n"
#, fuzzy, c-format
msgid "WARNING: unable to refresh key %s via %s: %s\n"
@@ -4445,10 +4431,6 @@ msgstr ""
"FIGYELEM: Nem tudom törölni az (\"%s\") átmeneti állományt: \"%s\": %s.\n"
#, fuzzy, c-format
-msgid "refreshing %d keys from %s\n"
-msgstr "Lekérem a %08lX kulcsot a %s kulcsszerverrõl.\n"
-
-#, fuzzy, c-format
msgid "key \"%s\" not found on keyserver\n"
msgstr "\"%s\" kulcs nem található: %s\n"
@@ -4467,9 +4449,9 @@ msgstr "Lekérem a %08lX kulcsot a %s kulcsszerverrõl.\n"
msgid "requesting key %s from %s\n"
msgstr "Lekérem a %08lX kulcsot a %s kulcsszerverrõl.\n"
-#, fuzzy, c-format
-msgid "sending key %s to %s server %s\n"
-msgstr "Keresem \"%s\"-t a %s HKP szerveren.\n"
+#, fuzzy
+msgid "no keyserver known\n"
+msgstr "Érvénytelen export opciók!\n"
#, fuzzy, c-format
msgid "sending key %s to %s\n"
@@ -4698,6 +4680,17 @@ msgstr ""
msgid "Note: signatures using the %s algorithm are rejected\n"
msgstr "%s aláírás, %s kivonatoló algoritmus.\n"
+#, fuzzy, c-format
+msgid "(reported error: %s)\n"
+msgstr "Olvasási hiba: %s.\n"
+
+#, fuzzy, c-format
+msgid "(reported error: %s <%s>)\n"
+msgstr "Olvasási hiba: %s.\n"
+
+msgid "(further info: "
+msgstr ""
+
#, c-format
msgid "%s:%d: deprecated option \"%s\"\n"
msgstr "%s:%d: Elavult opció: \"%s\"\n"
@@ -5109,6 +5102,19 @@ msgstr "%s: Kihagyva: Nyilvános kulcs nincs engedélyezve.\n"
msgid "%s: skipped: public key already present\n"
msgstr "%s: kihagyva: nyilvános kulcs már szerepel\n"
+#, fuzzy, c-format
+#| msgid "can't connect to `%s': %s\n"
+msgid "can't encrypt to '%s'\n"
+msgstr "Nem tudok kapcsolódni \"%s\" objektumhoz: %s\n"
+
+#, fuzzy, c-format
+msgid "option '%s' given, but no valid default keys given\n"
+msgstr "Érvénytelen kivonatoló algoritmus: %s\n"
+
+#, fuzzy, c-format
+msgid "option '%s' given, but option '%s' not given\n"
+msgstr "Érvénytelen kivonatoló algoritmus: %s\n"
+
msgid "You did not specify a user ID. (you may use \"-r\")\n"
msgstr ""
"Nem adott meg felhasználói azonosítót! (Használhatja a \"-r\" opciót.)\n"
@@ -5155,11 +5161,6 @@ msgid "data not saved; use option \"--output\" to save it\n"
msgstr ""
"Az adatot nem mentettem el. Használja az \"--output\" opciót a mentéshez!\n"
-#, fuzzy, c-format
-#| msgid "error creating `%s': %s\n"
-msgid "error creating '%s': %s\n"
-msgstr "Hiba \"%s\" létrehozásakor: %s\n"
-
msgid "Detached signature.\n"
msgstr "Különálló aláírás.\n"
@@ -5250,19 +5251,31 @@ msgid "This is a revocation certificate for the OpenPGP key:"
msgstr "Csináljunk egy visszavonó igazolást ehhez a kulcshoz? "
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 ""
+
+msgid ""
"Use it to revoke this key in case of a compromise or loss of\n"
"the secret key. However, if the secret key is still accessible,\n"
"it is better to generate a new revocation certificate and give\n"
-"a reason for the revocation."
+"a reason for the revocation. For details see the description of\n"
+"of the gpg command \"--gen-revoke\" in the GnuPG manual."
msgstr ""
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 making use of this revocation certificate."
+"before importing and publishing this revocation certificate."
msgstr ""
#, fuzzy, c-format
+#| msgid "Revocation certificate created.\n"
+msgid "revocation certificate stored as '%s.rev'\n"
+msgstr "Visszavonó igazolás létrehozva.\n"
+
+#, fuzzy, c-format
msgid "secret key \"%s\" not found\n"
msgstr "\"%s\" titkos kulcs nem található: %s\n"
@@ -5273,6 +5286,11 @@ msgstr "\"%s\" titkos kulcs nem található: %s\n"
msgid "'%s' matches multiple secret keys:\n"
msgstr ""
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "error searching the keyring: %s\n"
+msgstr "Hiba a(z) \"%s\" kulcskarika létrehozásakor: %s\n"
+
#, fuzzy
msgid "Create a revocation certificate for this key? (y/N) "
msgstr "Csináljunk egy visszavonó igazolást ehhez a kulcshoz? "
@@ -5352,22 +5370,33 @@ msgstr "FIGYELEM: %08lX aláíró alkulcson érvénytelen kereszthitelesítés van.\n"
#, fuzzy, c-format
msgid "public key %s is %lu second newer than the signature\n"
-msgstr "A(z) %08lX nyilvános kulcs %lu másodperccel újabb az aláírásnál!\n"
+msgid_plural "public key %s is %lu seconds newer than the signature\n"
+msgstr[0] "A(z) %08lX nyilvános kulcs %lu másodperccel újabb az aláírásnál!\n"
+msgstr[1] "A(z) %08lX nyilvános kulcs %lu másodperccel újabb az aláírásnál!\n"
#, fuzzy, c-format
-msgid "public key %s is %lu seconds newer than the signature\n"
-msgstr "A(z) %08lX nyilvános kulcs %lu másodperccel újabb az aláírásnál!\n"
+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] "A(z) %08lX nyilvános kulcs %lu másodperccel újabb az aláírásnál!\n"
+msgstr[1] "A(z) %08lX nyilvános kulcs %lu másodperccel újabb az aláírásnál!\n"
#, fuzzy, c-format
msgid ""
"key %s was created %lu second in the future (time warp or clock problem)\n"
-msgstr ""
+msgid_plural ""
+"key %s was created %lu seconds in the future (time warp or clock problem)\n"
+msgstr[0] ""
+"A kulcs %lu másodperccel a jövõben készült. (Idõugrás vagy óraprobléma.)\n"
+msgstr[1] ""
"A kulcs %lu másodperccel a jövõben készült. (Idõugrás vagy óraprobléma.)\n"
#, fuzzy, c-format
-msgid ""
-"key %s was created %lu seconds in the future (time warp or clock problem)\n"
-msgstr ""
+msgid "key %s was created %lu day in the future (time warp or clock problem)\n"
+msgid_plural ""
+"key %s was created %lu days in the future (time warp or clock problem)\n"
+msgstr[0] ""
+"A kulcs %lu másodperccel a jövõben készült. (Idõugrás vagy óraprobléma.)\n"
+msgstr[1] ""
"A kulcs %lu másodperccel a jövõben készült. (Idõugrás vagy óraprobléma.)\n"
#, fuzzy, c-format
@@ -5607,6 +5636,237 @@ msgid "input line longer than %d characters\n"
msgstr "A bemeneti sor hosszabb, mint %d karakter.\n"
#, fuzzy, c-format
+msgid "error beginning transaction on TOFU database: %s\n"
+msgstr "Hiba %s-ra/-re küldéskor: %s\n"
+
+#, c-format
+msgid "error committing transaction on TOFU database: %s\n"
+msgstr ""
+
+#, c-format
+msgid "error rolling back transaction on TOFU database: %s\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "unsupported TOFU database version: %s\n"
+msgstr ""
+"\n"
+"Támogatott algoritmusok:\n"
+
+#, fuzzy, c-format
+msgid "error reading TOFU database: %s\n"
+msgstr "Hiba %s-ra/-re küldéskor: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error writing secret keyring `%s': %s\n"
+msgid "error determining TOFU database's version: %s\n"
+msgstr "Hiba a(z) \"%s\" titkoskulcs-karika írásakor: %s.\n"
+
+#, fuzzy, c-format
+#| msgid "%s: error writing dir record: %s\n"
+msgid "error initializing TOFU database: %s\n"
+msgstr "%s: Hiba könyvtárrekord írásakor: %s.\n"
+
+#, fuzzy, c-format
+msgid "error opening TOFU database '%s': %s\n"
+msgstr "Hiba \"%s\" olvasásakor: %s\n"
+
+msgid "Warning: Home directory contains both tofu.db and tofu.d.\n"
+msgstr ""
+
+msgid "Using split format for TOFU database\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error updating TOFU database: %s\n"
+msgstr "Hiba %s-ra/-re küldéskor: %s\n"
+
+#, fuzzy, c-format
+msgid "public key %s not found: %s\n"
+msgstr "A(z) %08lX nyilvános kulcsot nem találom: %s.\n"
+
+#, fuzzy, c-format
+msgid "error setting TOFU binding's trust level to %s\n"
+msgstr "Hiba \"%s\" olvasásakor: %s\n"
+
+#, c-format
+msgid "The binding %s is NOT known."
+msgstr ""
+
+#, c-format
+msgid ""
+"The key %s raised a conflict with this binding (%s). Since this binding's "
+"policy was 'auto', it was changed to 'ask'."
+msgstr ""
+
+#, c-format
+msgid ""
+"Please indicate whether you believe the binding %s%sis legitimate (the key "
+"belongs to the stated owner) or a forgery (bad)."
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error gathering other user IDs: %s\n"
+msgstr "Hiba a jelszó létrehozásakor: %s.\n"
+
+msgid "Known user IDs associated with this key:\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "Policy: "
+msgid "policy: %s"
+msgstr "Eljárásmód: "
+
+#, fuzzy, c-format
+msgid "error gathering signature stats: %s\n"
+msgstr "Hiba a jelszó létrehozásakor: %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] ""
+msgstr[1] ""
+
+#, c-format
+msgid "Statistics for keys with the email address \"%s\":\n"
+msgstr ""
+
+#, fuzzy
+#| msgid "list keys"
+msgid "this key"
+msgstr "kulcsok listázása"
+
+#, c-format
+msgid "%ld message signed in the future."
+msgid_plural "%ld messages signed in the future."
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+msgid "%ld message signed"
+msgid_plural "%ld messages signed"
+msgstr[0] "|algo [fájlok]|üzenet kivonatának kiírása"
+msgstr[1] "|algo [fájlok]|üzenet kivonatának kiírása"
+
+#, c-format
+msgid " over the past %ld day."
+msgid_plural " over the past %ld days."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid " over the past %ld week."
+msgid_plural " over the past %ld weeks."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid " over the past %ld month."
+msgid_plural " over the past %ld months."
+msgstr[0] ""
+msgstr[1] ""
+
+#. 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 ""
+
+#. 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 ""
+
+msgid "(G)ood, (A)ccept once, (U)nknown, (R)eject once, (B)ad? "
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error changing TOFU policy: %s\n"
+msgstr "Hiba a jelszó létrehozásakor: %s.\n"
+
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "Have never verified a message signed by key %s!\n"
+msgstr ""
+
+#, c-format
+msgid "Failed to collect signature statistics for \"%s\" (key %s)\n"
+msgstr ""
+
+#, c-format
+msgid "Verified 0 messages signed by \"%s\" (key: %s, policy: %s)."
+msgstr ""
+
+#. TRANSLATORS: The final %s is replaced by a string like
+#. "7 months, 1 day, 5 minutes, 0 seconds".
+#, c-format
+msgid ""
+"Verified %ld message signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgid_plural ""
+"Verified %ld messages signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "The most recent message was verified %s ago."
+msgstr ""
+
+msgid "Warning: we've have yet to see a message signed by this key!\n"
+msgstr ""
+
+msgid "Warning: we've only seen a single message signed by this key!\n"
+msgstr ""
+
+#. TRANSLATORS: translate the below text. We don't
+#. directly internationalize that text so that we can
+#. tweak it without breaking translations.
+#, c-format
+msgid "TOFU: few signatures %d message %s"
+msgid_plural "TOFU: few signatures %d messages %s"
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+msgid "error opening TOFU database: %s\n"
+msgstr "Hiba %s-ra/-re küldéskor: %s\n"
+
+#, fuzzy, c-format
#| msgid "`%s' is not a valid long keyID\n"
msgid "'%s' is not a valid long keyID\n"
msgstr "\"%s\" nem egy érvényes hosszú kulcsazonosító.\n"
@@ -5665,19 +5925,24 @@ msgstr "Nincs szükség a bizalmi adatbázis ellenõrzésére.\n"
msgid "no need for a trustdb update with '%s' trust model\n"
msgstr "Nincs szükség a bizalmi adatbázis ellenõrzésére.\n"
-#, fuzzy, c-format
-msgid "public key %s not found: %s\n"
-msgstr "A(z) %08lX nyilvános kulcsot nem találom: %s.\n"
-
msgid "please do a --check-trustdb\n"
msgstr "Kérem, hajtson végre egy --check-trustdb parancsot!\n"
msgid "checking the trustdb\n"
msgstr "Ellenõrzöm a bizalmi adatbázist.\n"
-#, c-format
-msgid "%d keys processed (%d validity counts cleared)\n"
-msgstr "%d kulcsot feldolgoztam (%d érvényességszámlálót töröltem)\n"
+#, fuzzy, c-format
+msgid "%d key processed"
+msgid_plural "%d keys processed"
+msgstr[0] "Eddig %lu kulcsot dolgoztam fel.\n"
+msgstr[1] "Eddig %lu kulcsot dolgoztam fel.\n"
+
+#, fuzzy, c-format
+#| msgid "%d keys processed (%d validity counts cleared)\n"
+msgid " (%d validity count cleared)\n"
+msgid_plural " (%d validity counts cleared)\n"
+msgstr[0] "%d kulcsot feldolgoztam (%d érvényességszámlálót töröltem)\n"
+msgstr[1] "%d kulcsot feldolgoztam (%d érvényességszámlálót töröltem)\n"
msgid "no ultimately trusted keys found\n"
msgstr "Nem találtam alapvetõen megbízható kulcsot.\n"
@@ -5687,10 +5952,6 @@ msgid "public key of ultimately trusted key %s not found\n"
msgstr "Nem találom az alapvetõen megbízható %08lX kulcs nyilvános kulcsát!\n"
#, c-format
-msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
-msgstr ""
-
-#, c-format
msgid ""
"depth: %d valid: %3d signed: %3d trust: %d-, %dq, %dn, %dm, %df, %du\n"
msgstr ""
@@ -5889,8 +6150,11 @@ msgid "card is permanently locked!\n"
msgstr ""
#, c-format
-msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
-msgstr ""
+msgid "%d Admin PIN attempt remaining before card is permanently locked\n"
+msgid_plural ""
+"%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr[0] ""
+msgstr[1] ""
#. TRANSLATORS: Do not translate the "|A|" prefix but keep it at
#. the start of the string. Use %%0A to force a linefeed.
@@ -5980,8 +6244,10 @@ msgid "generating key failed\n"
msgstr "A kulcsblokk törlése sikertelen: %s.\n"
#, fuzzy, c-format
-msgid "key generation completed (%d seconds)\n"
-msgstr "Kulcsgenerálás sikertelen: %s\n"
+msgid "key generation completed (%d second)\n"
+msgid_plural "key generation completed (%d seconds)\n"
+msgstr[0] "Kulcsgenerálás sikertelen: %s\n"
+msgstr[1] "Kulcsgenerálás sikertelen: %s\n"
msgid "invalid structure of OpenPGP card (DO 0x93)\n"
msgstr ""
@@ -8180,6 +8446,9 @@ msgstr "|N|N. sorszámú jelszómód használata"
msgid "do not allow the reuse of old passphrases"
msgstr "Hiba a jelszó létrehozásakor: %s.\n"
+msgid "|N|set the Pinentry timeout to N seconds"
+msgstr ""
+
msgid "|NAME|use NAME as default secret key"
msgstr "|NÉV|NÉV használata alapértelmezett titkos kulcsként"
@@ -8476,6 +8745,89 @@ msgid ""
"Check a passphrase given on stdin against the patternfile\n"
msgstr ""
+#~ msgid "%d signatures not checked due to missing keys\n"
+#~ msgstr "%d aláírást nem ellenõriztem hiányzó kulcs miatt.\n"
+
+#~ msgid "%d signatures not checked due to errors\n"
+#~ msgstr "%d aláírást nem ellenõriztem hiba miatt.\n"
+
+#~ msgid "1 user ID without valid self-signature detected\n"
+#~ msgstr "1 felhasználóazonosítót találtam érvényes önaláírás nélkül.\n"
+
+#~ msgid "Deleted %d signatures.\n"
+#~ msgstr "Töröltem %d aláírást.\n"
+
+#, fuzzy
+#~ msgid "User ID \"%s\": %d signatures removed\n"
+#~ msgstr "\"%s\" felhasználói azonosítót visszavonták."
+
+#~ msgid ""
+#~ "You need a Passphrase to protect your secret key.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Most szükség van egy jelszóra (vagy mondatra), amely a titkos kulcsát "
+#~ "védi.\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "Please enter a passphrase to protect the off-card backup of the new "
+#~ "encryption key."
+#~ msgstr "Kérem, adja meg a jelszót! Ezt egy titkos mondat. \n"
+
+#~ msgid "passphrase not correctly repeated; try again"
+#~ msgstr "Nem ismételte meg helyesen a jelszót! Próbálja újra!"
+
+#~ msgid "%s.\n"
+#~ msgstr "%s.\n"
+
+#~ msgid ""
+#~ "You don't want a passphrase - this is probably a *bad* idea!\n"
+#~ "I will do it anyway. You can change your passphrase at any time,\n"
+#~ "using this program with the option \"--edit-key\".\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Ön nem akar jelszót. Ez valószínûleg egy *rossz* ötlet!\n"
+#~ "De azért megcsinálom. Bármikor megváltoztathatja a jelszavát\n"
+#~ "az \"--edit-key\" opcióval.\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid "storing key onto card failed: %s\n"
+#~ msgstr "A kulcsblokk törlése sikertelen: %s.\n"
+
+#, fuzzy
+#~| msgid "1 bad signature\n"
+#~ msgid "1 good signature\n"
+#~ msgstr "1 rossz aláírás.\n"
+
+#, fuzzy
+#~ msgid "renaming '%s' to '%s' failed: %s\n"
+#~ msgstr "Páncélozás nem sikerült: %s\n"
+
+#, fuzzy
+#~ msgid "%lu keys cached (%lu signatures)\n"
+#~ msgstr "%lu kulcsot ellenõriztem (%lu aláírással).\n"
+
+#, fuzzy
+#~ msgid "refreshing 1 key from %s\n"
+#~ msgstr "Lekérem a %08lX kulcsot a %s kulcsszerverrõl.\n"
+
+#, fuzzy
+#~ msgid "sending key %s to %s server %s\n"
+#~ msgstr "Keresem \"%s\"-t a %s HKP szerveren.\n"
+
+#, fuzzy
+#~ msgid "public key %s is %lu seconds newer than the signature\n"
+#~ msgstr "A(z) %08lX nyilvános kulcs %lu másodperccel újabb az aláírásnál!\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "key %s was created %lu seconds in the future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "A kulcs %lu másodperccel a jövõben készült. (Idõugrás vagy óraprobléma.)\n"
+
#, fuzzy
#~| msgid "can't open the keyring"
#~ msgid "Failed to open the keyring DB.\n"
@@ -8731,10 +9083,6 @@ msgstr ""
#~ msgstr "Keresem \"%s\"-t a %s HKP szerveren.\n"
#, fuzzy
-#~ msgid "no keyserver action!\n"
-#~ msgstr "Érvénytelen export opciók!\n"
-
-#, fuzzy
#~ msgid "keyserver timed out\n"
#~ msgstr "kulcsszerverhiba"
@@ -9926,9 +10274,6 @@ msgstr ""
#~ msgid "%s%c %4u%c/%08lX created: %s expires: %s"
#~ msgstr "%s%c %4u%c/%08lX létrehozva: %s lejár: %s"
-#~ msgid "Policy: "
-#~ msgstr "Eljárásmód: "
-
#~ msgid "can't get key from keyserver: %s\n"
#~ msgstr "Nem tudom lehívni a kulcsot a %s kulcsszerverrõl.\n"
diff --git a/po/id.po b/po/id.po
index 2632e69..679bd20 100644
--- a/po/id.po
+++ b/po/id.po
@@ -1244,6 +1244,20 @@ msgid "Enter passphrase: "
msgstr "Masukkan passphrase: "
#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "error getting version from '%s': %s\n"
+msgstr "kesalahan menulis keyring `%s': %s\n"
+
+#, c-format
+msgid "server '%s' is older than us (%s < %s)"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "WARNING: %s overrides %s\n"
+msgid "WARNING: %s\n"
+msgstr "PERINGATAN: %s menimpa %s\n"
+
+#, fuzzy, c-format
msgid "OpenPGP card not available: %s\n"
msgstr "kunci rahasia tidak tersedia"
@@ -1745,6 +1759,11 @@ msgid "remove as much as possible from key during export"
msgstr ""
#, fuzzy
+#| msgid "%s: skipped: %s\n"
+msgid " - skipped"
+msgstr "%s: dilewati: %s\n"
+
+#, fuzzy
msgid "exporting secret keys not allowed\n"
msgstr "menulis kunci rahasia ke `%s'\n"
@@ -1756,19 +1775,36 @@ msgstr "kunci %08lX: kunci gaya PGP 2.x - dilewati\n"
msgid "key %s: key material on-card - skipped\n"
msgstr "kunci %08lX: signature subkey di tempat yang salah - dilewati\n"
-#, fuzzy
-#| msgid "%s: skipped: %s\n"
-msgid " - skipped"
-msgstr "%s: dilewati: %s\n"
-
msgid "WARNING: nothing exported\n"
msgstr "PERINGATAN: tidak ada yang diekspor\n"
+#, fuzzy, c-format
+#| msgid "error creating `%s': %s\n"
+msgid "error creating '%s': %s\n"
+msgstr "kesalahan penciptaan : `%s': %s\n"
+
#, fuzzy
msgid "[User ID not found]"
msgstr "[User id tidak ditemukan]"
#, fuzzy, c-format
+msgid "(check argument of option '%s')\n"
+msgstr "opsi impor tidak valid\n"
+
+#, c-format
+msgid "Warning: '%s' should be a long key ID or a fingerprint\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error looking up: %s\n"
+msgstr "kesalahan membaca `%s': %s\n"
+
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "Warning: %s appears in the keyring %d times\n"
+msgstr "kesalahan menulis keyring `%s': %s\n"
+
+#, fuzzy, c-format
msgid "automatically retrieved '%s' via %s\n"
msgstr "kesalahan penciptaan : `%s': %s\n"
@@ -1785,14 +1821,19 @@ msgid "secret key \"%s\" not found: %s\n"
msgstr "kunci rahasia `%s' tidak ditemukan: %s\n"
#, fuzzy, c-format
-msgid "(check argument of option '%s')\n"
-msgstr "opsi impor tidak valid\n"
+#| msgid "|NAME|use NAME as default secret key"
+msgid "Warning: not using '%s' as default key: %s\n"
+msgstr "|NAMA|gunakan NAMA sebagai kunci rahasia baku"
#, fuzzy, c-format
#| msgid "|NAME|use NAME as default secret key"
-msgid "using \"%s\" as default secret key\n"
+msgid "using \"%s\" as default secret key for signing\n"
msgstr "|NAMA|gunakan NAMA sebagai kunci rahasia baku"
+#, c-format
+msgid "all values passed to '%s' ignored\n"
+msgstr ""
+
#, fuzzy, c-format
msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
msgstr "kunci tidak valid %08lX dibuat valid oleh --allow-non-selfsigned-uid\n"
@@ -2150,28 +2191,6 @@ msgid "Note: old default options file '%s' ignored\n"
msgstr "CATATAN: file pilihan baku lama `%s' diabaikan\n"
#, c-format
-msgid ""
-"Warning: value '%s' for option '%s' should be a long key ID or a "
-"fingerprint\n"
-msgstr ""
-
-#, c-format
-msgid "key specification '%s' is ambiguous\n"
-msgstr ""
-
-#. TRANSLATORS: The %s prints a key specification which
-#. for example has been given at the command line. Two
-#. lines with fingerprints are printed after this message.
-#, c-format
-msgid "'%s' matches at least:\n"
-msgstr ""
-
-#, fuzzy, c-format
-#| msgid "error creating keyring `%s': %s\n"
-msgid "error searching the keyring: %s\n"
-msgstr "kesalahan menulis keyring `%s': %s\n"
-
-#, c-format
msgid "libgcrypt is too old (need %s, have %s)\n"
msgstr ""
@@ -2381,14 +2400,6 @@ msgstr ""
"Peringatan: penerima yang disebutkan (-r) tanpa menggunakan enkripsi public "
"key \n"
-#, fuzzy, c-format
-msgid "option '%s' given, but no valid default keys given\n"
-msgstr "algoritma hash tidak valid `%s'\n"
-
-#, fuzzy, c-format
-msgid "option '%s' given, but option '%s' not given\n"
-msgstr "algoritma hash tidak valid `%s'\n"
-
msgid "--store [filename]"
msgstr "--store [namafile]"
@@ -2464,6 +2475,11 @@ msgstr "Penerimaan keyserver gagal: %s\n"
msgid "key export failed: %s\n"
msgstr "Ekspor kunci gagal: %s\n"
+#, fuzzy, c-format
+#| msgid "key export failed: %s\n"
+msgid "export as ssh key failed: %s\n"
+msgstr "Ekspor kunci gagal: %s\n"
+
#, c-format
msgid "keyserver search failed: %s\n"
msgstr "Pencarian keyserver gagal: %s\n"
@@ -2954,33 +2970,33 @@ msgstr "[pembatalan]"
msgid "[self-signature]"
msgstr "[self-signature]"
-msgid "1 bad signature\n"
-msgstr "1 signature yang buruk\n"
-
-#, c-format
-msgid "%d bad signatures\n"
-msgstr "%d signature yang buruk\n"
-
-msgid "1 signature not checked due to a missing key\n"
-msgstr "1 signature tidak diperiksa karena tidak ada kunci\n"
-
-#, c-format
-msgid "%d signatures not checked due to missing keys\n"
-msgstr "%d signature tidak diperiksa karena tidak ada kunci\n"
-
-msgid "1 signature not checked due to an error\n"
-msgstr "1 signature tidak diperiksa karena kesalahan\n"
+#, fuzzy, c-format
+#| msgid "%d bad signatures\n"
+msgid "%d bad signature\n"
+msgid_plural "%d bad signatures\n"
+msgstr[0] "%d signature yang buruk\n"
+msgstr[1] "%d signature yang buruk\n"
-#, c-format
-msgid "%d signatures not checked due to errors\n"
-msgstr "%d signature tidak diperiksa karena ada kesalahan\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to a missing key\n"
+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 signature tidak diperiksa karena tidak ada kunci\n"
+msgstr[1] "1 signature tidak diperiksa karena tidak ada kunci\n"
-msgid "1 user ID without valid self-signature detected\n"
-msgstr "terdeteksi 1 ID user tanpa self-signature yang valid\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to an error\n"
+msgid "%d signature not checked due to an error\n"
+msgid_plural "%d signatures not checked due to errors\n"
+msgstr[0] "1 signature tidak diperiksa karena kesalahan\n"
+msgstr[1] "1 signature tidak diperiksa karena kesalahan\n"
-#, c-format
-msgid "%d user IDs without valid self-signatures detected\n"
-msgstr "terdeteksi ID %d user tanpa self-signature yang valid\n"
+#, fuzzy, c-format
+#| msgid "%d user IDs without valid self-signatures detected\n"
+msgid "%d user ID without valid self-signature detected\n"
+msgid_plural "%d user IDs without valid self-signatures detected\n"
+msgstr[0] "terdeteksi ID %d user tanpa self-signature yang valid\n"
+msgstr[1] "terdeteksi ID %d user tanpa self-signature yang valid\n"
#, fuzzy
msgid ""
@@ -3617,13 +3633,12 @@ msgstr "Hapus signature tidak dikenal ini? (y/T/q)"
msgid "Really delete this self-signature? (y/N)"
msgstr "Yakin ingin menghapus self-signature ini? (y/T)"
-#, c-format
+#, fuzzy, c-format
+#| msgid "Deleted %d signature.\n"
msgid "Deleted %d signature.\n"
-msgstr "Menghapus %d signature.\n"
-
-#, c-format
-msgid "Deleted %d signatures.\n"
-msgstr "Menghapus %d signature.\n"
+msgid_plural "Deleted %d signatures.\n"
+msgstr[0] "Menghapus %d signature.\n"
+msgstr[1] "Menghapus %d signature.\n"
msgid "Nothing deleted.\n"
msgstr "Tidak ada yang dihapus.\n"
@@ -3638,11 +3653,9 @@ msgstr "User ID \"%s\" dibatalkan."
#, fuzzy, c-format
msgid "User ID \"%s\": %d signature removed\n"
-msgstr "User ID \"%s\" dibatalkan."
-
-#, fuzzy, c-format
-msgid "User ID \"%s\": %d signatures removed\n"
-msgstr "User ID \"%s\" dibatalkan."
+msgid_plural "User ID \"%s\": %d signatures removed\n"
+msgstr[0] "User ID \"%s\" dibatalkan."
+msgstr[1] "User ID \"%s\" dibatalkan."
#, fuzzy, c-format
msgid "User ID \"%s\": already minimized\n"
@@ -4180,38 +4193,6 @@ msgid "Please correct the error first\n"
msgstr "Silakan perbaiki kesalahan ini dulu\n"
msgid ""
-"You need a Passphrase to protect your secret key.\n"
-"\n"
-msgstr ""
-"Anda perlu sebuah passphrase untuk melindungi kunci rahasia anda.\n"
-"\n"
-
-#, fuzzy
-msgid ""
-"Please enter a passphrase to protect the off-card backup of the new "
-"encryption key."
-msgstr "Silakan masukkan passphrase; ini kalimat rahasia\n"
-
-msgid "passphrase not correctly repeated; try again"
-msgstr "passphrase tidak diulang dengan benar; coba lagi"
-
-#, c-format
-msgid "%s.\n"
-msgstr "%s.\n"
-
-msgid ""
-"You don't want a passphrase - this is probably a *bad* idea!\n"
-"I will do it anyway. You can change your passphrase at any time,\n"
-"using this program with the option \"--edit-key\".\n"
-"\n"
-msgstr ""
-"Anda tidak ingin sebuah passphrase - ini mungkin ide yang *buruk*!\n"
-"Namun saya akan tetap lakukan. Anda dapat merubah passphrase anda setiap "
-"saat,\n"
-"menggunakan program ini dengan pilihan \"--edit-key\".\n"
-"\n"
-
-msgid ""
"We need to generate a lot of random bytes. It is a good idea to perform\n"
"some other action (type on the keyboard, move the mouse, utilize the\n"
"disks) during the prime generation; this gives the random number\n"
@@ -4258,6 +4239,14 @@ msgid "Key generation canceled.\n"
msgstr "Pembuatan kunci dibatalkan.\n"
#, fuzzy, c-format
+msgid "can't create backup file '%s': %s\n"
+msgstr "tidak dapat membuat %s: %s\n"
+
+#, fuzzy, c-format
+msgid "Note: backup of card key saved to '%s'\n"
+msgstr "CATATAN: kunci pribadi %08lX berakhir pada %s\n"
+
+#, fuzzy, c-format
#| msgid "writing public key to `%s'\n"
msgid "writing public key to '%s'\n"
msgstr "menulis kunci publik ke `%s'\n"
@@ -4311,18 +4300,6 @@ msgstr "Bagian rahasia kunci primer tidak tersedia.\n"
msgid "Really create? (y/N) "
msgstr "Ingin diciptakan? "
-#, fuzzy, c-format
-msgid "storing key onto card failed: %s\n"
-msgstr "gagal menghapus keyblok: %s\n"
-
-#, fuzzy, c-format
-msgid "can't create backup file '%s': %s\n"
-msgstr "tidak dapat membuat %s: %s\n"
-
-#, fuzzy, c-format
-msgid "Note: backup of card key saved to '%s'\n"
-msgstr "CATATAN: kunci pribadi %08lX berakhir pada %s\n"
-
msgid "never "
msgstr "tidak pernah..."
@@ -4341,19 +4318,18 @@ msgstr "Notasi signature kritis: "
msgid "Signature notation: "
msgstr "Notasi signature: "
-#, fuzzy
-#| msgid "1 bad signature\n"
-msgid "1 good signature\n"
-msgstr "1 signature yang buruk\n"
-
#, fuzzy, c-format
#| msgid "%d bad signatures\n"
-msgid "%d good signatures\n"
-msgstr "%d signature yang buruk\n"
+msgid "%d good signature\n"
+msgid_plural "%d good signatures\n"
+msgstr[0] "%d signature yang buruk\n"
+msgstr[1] "%d signature yang buruk\n"
#, c-format
-msgid "Warning: %lu key(s) skipped due to their large size\n"
-msgstr ""
+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] ""
msgid "Keyring"
msgstr "Keyring"
@@ -4384,20 +4360,27 @@ msgid " Card serial no. ="
msgstr ""
#, fuzzy, c-format
-msgid "renaming '%s' to '%s' failed: %s\n"
-msgstr "gagal enarmoring: %s\n"
-
-#, fuzzy, c-format
msgid "caching keyring '%s'\n"
msgstr "memeriksa keyring `%s'\n"
#, fuzzy, c-format
-msgid "%lu keys cached so far (%lu signatures)\n"
-msgstr "%lu kunci telah diperiksa (%lu signature)\n"
+msgid "%lu keys cached so far (%lu signature)\n"
+msgid_plural "%lu keys cached so far (%lu signatures)\n"
+msgstr[0] "%lu kunci telah diperiksa (%lu signature)\n"
+msgstr[1] "%lu kunci telah diperiksa (%lu signature)\n"
+
+#, c-format
+msgid "%lu key cached"
+msgid_plural "%lu keys cached"
+msgstr[0] ""
+msgstr[1] ""
#, fuzzy, c-format
-msgid "%lu keys cached (%lu signatures)\n"
-msgstr "%lu kunci telah diperiksa (%lu signature)\n"
+#| msgid "1 bad signature\n"
+msgid " (%lu signature)\n"
+msgid_plural " (%lu signatures)\n"
+msgstr[0] "1 signature yang buruk\n"
+msgstr[1] "1 signature yang buruk\n"
#, c-format
msgid "%s: keyring created\n"
@@ -4441,18 +4424,16 @@ msgid "\"%s\" not a key ID: skipping\n"
msgstr ""
#, fuzzy, c-format
-msgid "refreshing 1 key from %s\n"
-msgstr "meminta kunci %08lX dari %s\n"
+msgid "refreshing %d key from %s\n"
+msgid_plural "refreshing %d keys from %s\n"
+msgstr[0] "meminta kunci %08lX dari %s\n"
+msgstr[1] "meminta kunci %08lX dari %s\n"
#, fuzzy, c-format
msgid "WARNING: unable to refresh key %s via %s: %s\n"
msgstr "PERINGATAN: tidak dapat menghapus file temp (%s) `%s': %s\n"
#, fuzzy, c-format
-msgid "refreshing %d keys from %s\n"
-msgstr "meminta kunci %08lX dari %s\n"
-
-#, fuzzy, c-format
msgid "key \"%s\" not found on keyserver\n"
msgstr "kunci '%s' tidak ditemukan: %s\n"
@@ -4471,9 +4452,9 @@ msgstr "meminta kunci %08lX dari %s\n"
msgid "requesting key %s from %s\n"
msgstr "meminta kunci %08lX dari %s\n"
-#, fuzzy, c-format
-msgid "sending key %s to %s server %s\n"
-msgstr "mencari \"%s\" dari server HKP %s\n"
+#, fuzzy
+msgid "no keyserver known\n"
+msgstr "opsi ekspor tidak valid\n"
#, fuzzy, c-format
msgid "sending key %s to %s\n"
@@ -4695,6 +4676,17 @@ msgstr "memaksa algoritma digest %s (%d) melanggar preferensi penerima\n"
msgid "Note: signatures using the %s algorithm are rejected\n"
msgstr "%s signature, algoritma digest %s\n"
+#, fuzzy, c-format
+msgid "(reported error: %s)\n"
+msgstr "kesalahan pembacaan: %s\n"
+
+#, fuzzy, c-format
+msgid "(reported error: %s <%s>)\n"
+msgstr "kesalahan pembacaan: %s\n"
+
+msgid "(further info: "
+msgstr ""
+
#, c-format
msgid "%s:%d: deprecated option \"%s\"\n"
msgstr "%s:%d: opsi tidak digunakan lagi \"%s\"\n"
@@ -5103,6 +5095,19 @@ msgstr "%s: dilewati: kunci publik dimatikan\n"
msgid "%s: skipped: public key already present\n"
msgstr "%s: dilewati: kunci publik telah ada\n"
+#, fuzzy, c-format
+#| msgid "can't connect to `%s': %s\n"
+msgid "can't encrypt to '%s'\n"
+msgstr "tidak dapat terkoneksi ke `%s': %s\n"
+
+#, fuzzy, c-format
+msgid "option '%s' given, but no valid default keys given\n"
+msgstr "algoritma hash tidak valid `%s'\n"
+
+#, fuzzy, c-format
+msgid "option '%s' given, but option '%s' not given\n"
+msgstr "algoritma hash tidak valid `%s'\n"
+
msgid "You did not specify a user ID. (you may use \"-r\")\n"
msgstr "Anda tidak menspesifikasikan ID user. (anda dapat gunakan \"-r\")\n"
@@ -5146,11 +5151,6 @@ msgstr "kunci %08lX: tidak ada ID user\n"
msgid "data not saved; use option \"--output\" to save it\n"
msgstr "data tidak disimpan; gunakan pilihan \"--output\" untuk menyimpannya\n"
-#, fuzzy, c-format
-#| msgid "error creating `%s': %s\n"
-msgid "error creating '%s': %s\n"
-msgstr "kesalahan penciptaan : `%s': %s\n"
-
msgid "Detached signature.\n"
msgstr "Menghapus signature.\n"
@@ -5241,19 +5241,31 @@ msgid "This is a revocation certificate for the OpenPGP key:"
msgstr "Buat sertifikat pembatalan untuk kunci ini?"
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 ""
+
+msgid ""
"Use it to revoke this key in case of a compromise or loss of\n"
"the secret key. However, if the secret key is still accessible,\n"
"it is better to generate a new revocation certificate and give\n"
-"a reason for the revocation."
+"a reason for the revocation. For details see the description of\n"
+"of the gpg command \"--gen-revoke\" in the GnuPG manual."
msgstr ""
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 making use of this revocation certificate."
+"before importing and publishing this revocation certificate."
msgstr ""
#, fuzzy, c-format
+#| msgid "Revocation certificate created.\n"
+msgid "revocation certificate stored as '%s.rev'\n"
+msgstr "Sertifikat pembatalan tercipta.\n"
+
+#, fuzzy, c-format
msgid "secret key \"%s\" not found\n"
msgstr "kunci rahasia `%s' tidak ditemukan: %s\n"
@@ -5264,6 +5276,11 @@ msgstr "kunci rahasia `%s' tidak ditemukan: %s\n"
msgid "'%s' matches multiple secret keys:\n"
msgstr ""
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "error searching the keyring: %s\n"
+msgstr "kesalahan menulis keyring `%s': %s\n"
+
#, fuzzy
msgid "Create a revocation certificate for this key? (y/N) "
msgstr "Buat sertifikat pembatalan untuk kunci ini?"
@@ -5347,22 +5364,33 @@ msgstr ""
#, fuzzy, c-format
msgid "public key %s is %lu second newer than the signature\n"
-msgstr "kunci publik %08lX adalah %lu detik lebih baru daripada signature\n"
+msgid_plural "public key %s is %lu seconds newer than the signature\n"
+msgstr[0] "kunci publik %08lX adalah %lu detik lebih baru daripada signature\n"
+msgstr[1] "kunci publik %08lX adalah %lu detik lebih baru daripada signature\n"
#, fuzzy, c-format
-msgid "public key %s is %lu seconds newer than the signature\n"
-msgstr "kunci publik %08lX adalah %lu detik lebih baru daripada signature\n"
+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] "kunci publik %08lX adalah %lu detik lebih baru daripada signature\n"
+msgstr[1] "kunci publik %08lX adalah %lu detik lebih baru daripada signature\n"
#, fuzzy, c-format
msgid ""
"key %s was created %lu second in the future (time warp or clock problem)\n"
-msgstr ""
+msgid_plural ""
+"key %s was created %lu seconds in the future (time warp or clock problem)\n"
+msgstr[0] ""
+"kunci telah diciptakan dalam %lu detik mendatang (masalah waktu atau jam)\n"
+msgstr[1] ""
"kunci telah diciptakan dalam %lu detik mendatang (masalah waktu atau jam)\n"
#, fuzzy, c-format
-msgid ""
-"key %s was created %lu seconds in the future (time warp or clock problem)\n"
-msgstr ""
+msgid "key %s was created %lu day in the future (time warp or clock problem)\n"
+msgid_plural ""
+"key %s was created %lu days in the future (time warp or clock problem)\n"
+msgstr[0] ""
+"kunci telah diciptakan dalam %lu detik mendatang (masalah waktu atau jam)\n"
+msgstr[1] ""
"kunci telah diciptakan dalam %lu detik mendatang (masalah waktu atau jam)\n"
#, fuzzy, c-format
@@ -5598,6 +5626,237 @@ msgid "input line longer than %d characters\n"
msgstr "baris input lebih dari %d karakter\n"
#, fuzzy, c-format
+msgid "error beginning transaction on TOFU database: %s\n"
+msgstr "kesalahan mengirim ke `%s': %s\n"
+
+#, c-format
+msgid "error committing transaction on TOFU database: %s\n"
+msgstr ""
+
+#, c-format
+msgid "error rolling back transaction on TOFU database: %s\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "unsupported TOFU database version: %s\n"
+msgstr ""
+"\n"
+"Algoritma yang didukung:\n"
+
+#, fuzzy, c-format
+msgid "error reading TOFU database: %s\n"
+msgstr "kesalahan mengirim ke `%s': %s\n"
+
+#, fuzzy, c-format
+#| msgid "error writing secret keyring `%s': %s\n"
+msgid "error determining TOFU database's version: %s\n"
+msgstr "kesalahan menulis keyring rahasia `%s': %s\n"
+
+#, fuzzy, c-format
+#| msgid "%s: error writing dir record: %s\n"
+msgid "error initializing TOFU database: %s\n"
+msgstr "%s: kesalahan menulis dir record: %s\n"
+
+#, fuzzy, c-format
+msgid "error opening TOFU database '%s': %s\n"
+msgstr "kesalahan membaca `%s': %s\n"
+
+msgid "Warning: Home directory contains both tofu.db and tofu.d.\n"
+msgstr ""
+
+msgid "Using split format for TOFU database\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error updating TOFU database: %s\n"
+msgstr "kesalahan mengirim ke `%s': %s\n"
+
+#, fuzzy, c-format
+msgid "public key %s not found: %s\n"
+msgstr "kunci publik %08lX tidak ditemukan: %s\n"
+
+#, fuzzy, c-format
+msgid "error setting TOFU binding's trust level to %s\n"
+msgstr "kesalahan membaca `%s': %s\n"
+
+#, c-format
+msgid "The binding %s is NOT known."
+msgstr ""
+
+#, c-format
+msgid ""
+"The key %s raised a conflict with this binding (%s). Since this binding's "
+"policy was 'auto', it was changed to 'ask'."
+msgstr ""
+
+#, c-format
+msgid ""
+"Please indicate whether you believe the binding %s%sis legitimate (the key "
+"belongs to the stated owner) or a forgery (bad)."
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error gathering other user IDs: %s\n"
+msgstr "kesalahan penciptaan passphrase: %s\n"
+
+msgid "Known user IDs associated with this key:\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "Policy: "
+msgid "policy: %s"
+msgstr "Kebijakan: "
+
+#, fuzzy, c-format
+msgid "error gathering signature stats: %s\n"
+msgstr "kesalahan penciptaan passphrase: %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] ""
+msgstr[1] ""
+
+#, c-format
+msgid "Statistics for keys with the email address \"%s\":\n"
+msgstr ""
+
+#, fuzzy
+#| msgid "list keys"
+msgid "this key"
+msgstr "tampilkan kunci"
+
+#, c-format
+msgid "%ld message signed in the future."
+msgid_plural "%ld messages signed in the future."
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+msgid "%ld message signed"
+msgid_plural "%ld messages signed"
+msgstr[0] "|algo [file]|cetak digest pesan"
+msgstr[1] "|algo [file]|cetak digest pesan"
+
+#, c-format
+msgid " over the past %ld day."
+msgid_plural " over the past %ld days."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid " over the past %ld week."
+msgid_plural " over the past %ld weeks."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid " over the past %ld month."
+msgid_plural " over the past %ld months."
+msgstr[0] ""
+msgstr[1] ""
+
+#. 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 ""
+
+#. 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 ""
+
+msgid "(G)ood, (A)ccept once, (U)nknown, (R)eject once, (B)ad? "
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error changing TOFU policy: %s\n"
+msgstr "kesalahan penciptaan passphrase: %s\n"
+
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "Have never verified a message signed by key %s!\n"
+msgstr ""
+
+#, c-format
+msgid "Failed to collect signature statistics for \"%s\" (key %s)\n"
+msgstr ""
+
+#, c-format
+msgid "Verified 0 messages signed by \"%s\" (key: %s, policy: %s)."
+msgstr ""
+
+#. TRANSLATORS: The final %s is replaced by a string like
+#. "7 months, 1 day, 5 minutes, 0 seconds".
+#, c-format
+msgid ""
+"Verified %ld message signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgid_plural ""
+"Verified %ld messages signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "The most recent message was verified %s ago."
+msgstr ""
+
+msgid "Warning: we've have yet to see a message signed by this key!\n"
+msgstr ""
+
+msgid "Warning: we've only seen a single message signed by this key!\n"
+msgstr ""
+
+#. TRANSLATORS: translate the below text. We don't
+#. directly internationalize that text so that we can
+#. tweak it without breaking translations.
+#, c-format
+msgid "TOFU: few signatures %d message %s"
+msgid_plural "TOFU: few signatures %d messages %s"
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+msgid "error opening TOFU database: %s\n"
+msgstr "kesalahan mengirim ke `%s': %s\n"
+
+#, fuzzy, c-format
#| msgid "`%s' is not a valid long keyID\n"
msgid "'%s' is not a valid long keyID\n"
msgstr "'%s' bukanlah keyID panjang yang valid\n"
@@ -5655,19 +5914,24 @@ msgstr "tidak perlu memeriksa trustdb\n"
msgid "no need for a trustdb update with '%s' trust model\n"
msgstr "tidak perlu memeriksa trustdb\n"
-#, fuzzy, c-format
-msgid "public key %s not found: %s\n"
-msgstr "kunci publik %08lX tidak ditemukan: %s\n"
-
msgid "please do a --check-trustdb\n"
msgstr "lakukanlah --check-trustdb\n"
msgid "checking the trustdb\n"
msgstr "memeriksa trustdb\n"
-#, c-format
-msgid "%d keys processed (%d validity counts cleared)\n"
-msgstr "%d kunci diproses (%d hitungan validitas dihapus)\n"
+#, fuzzy, c-format
+msgid "%d key processed"
+msgid_plural "%d keys processed"
+msgstr[0] "%lu kunci telah diproses\n"
+msgstr[1] "%lu kunci telah diproses\n"
+
+#, fuzzy, c-format
+#| msgid "%d keys processed (%d validity counts cleared)\n"
+msgid " (%d validity count cleared)\n"
+msgid_plural " (%d validity counts cleared)\n"
+msgstr[0] "%d kunci diproses (%d hitungan validitas dihapus)\n"
+msgstr[1] "%d kunci diproses (%d hitungan validitas dihapus)\n"
msgid "no ultimately trusted keys found\n"
msgstr "tidak ditemukan kunci yang benar-benar terpercaya\n"
@@ -5677,10 +5941,6 @@ msgid "public key of ultimately trusted key %s not found\n"
msgstr "kunci publik yang sangat terpercaya %08lX tidak ditemukan\n"
#, c-format
-msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
-msgstr ""
-
-#, c-format
msgid ""
"depth: %d valid: %3d signed: %3d trust: %d-, %dq, %dn, %dm, %df, %du\n"
msgstr ""
@@ -5879,8 +6139,11 @@ msgid "card is permanently locked!\n"
msgstr ""
#, c-format
-msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
-msgstr ""
+msgid "%d Admin PIN attempt remaining before card is permanently locked\n"
+msgid_plural ""
+"%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr[0] ""
+msgstr[1] ""
#. TRANSLATORS: Do not translate the "|A|" prefix but keep it at
#. the start of the string. Use %%0A to force a linefeed.
@@ -5970,8 +6233,10 @@ msgid "generating key failed\n"
msgstr "gagal menghapus keyblok: %s\n"
#, fuzzy, c-format
-msgid "key generation completed (%d seconds)\n"
-msgstr "Pembuatan kunci gagal: %s\n"
+msgid "key generation completed (%d second)\n"
+msgid_plural "key generation completed (%d seconds)\n"
+msgstr[0] "Pembuatan kunci gagal: %s\n"
+msgstr[1] "Pembuatan kunci gagal: %s\n"
msgid "invalid structure of OpenPGP card (DO 0x93)\n"
msgstr ""
@@ -8170,6 +8435,9 @@ msgstr "|N|gunakan passphrase mode N"
msgid "do not allow the reuse of old passphrases"
msgstr "kesalahan penciptaan passphrase: %s\n"
+msgid "|N|set the Pinentry timeout to N seconds"
+msgstr ""
+
msgid "|NAME|use NAME as default secret key"
msgstr "|NAMA|gunakan NAMA sebagai kunci rahasia baku"
@@ -8466,6 +8734,90 @@ msgid ""
"Check a passphrase given on stdin against the patternfile\n"
msgstr ""
+#~ msgid "%d signatures not checked due to missing keys\n"
+#~ msgstr "%d signature tidak diperiksa karena tidak ada kunci\n"
+
+#~ msgid "%d signatures not checked due to errors\n"
+#~ msgstr "%d signature tidak diperiksa karena ada kesalahan\n"
+
+#~ msgid "1 user ID without valid self-signature detected\n"
+#~ msgstr "terdeteksi 1 ID user tanpa self-signature yang valid\n"
+
+#~ msgid "Deleted %d signatures.\n"
+#~ msgstr "Menghapus %d signature.\n"
+
+#, fuzzy
+#~ msgid "User ID \"%s\": %d signatures removed\n"
+#~ msgstr "User ID \"%s\" dibatalkan."
+
+#~ msgid ""
+#~ "You need a Passphrase to protect your secret key.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Anda perlu sebuah passphrase untuk melindungi kunci rahasia anda.\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "Please enter a passphrase to protect the off-card backup of the new "
+#~ "encryption key."
+#~ msgstr "Silakan masukkan passphrase; ini kalimat rahasia\n"
+
+#~ msgid "passphrase not correctly repeated; try again"
+#~ msgstr "passphrase tidak diulang dengan benar; coba lagi"
+
+#~ msgid "%s.\n"
+#~ msgstr "%s.\n"
+
+#~ msgid ""
+#~ "You don't want a passphrase - this is probably a *bad* idea!\n"
+#~ "I will do it anyway. You can change your passphrase at any time,\n"
+#~ "using this program with the option \"--edit-key\".\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Anda tidak ingin sebuah passphrase - ini mungkin ide yang *buruk*!\n"
+#~ "Namun saya akan tetap lakukan. Anda dapat merubah passphrase anda setiap "
+#~ "saat,\n"
+#~ "menggunakan program ini dengan pilihan \"--edit-key\".\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid "storing key onto card failed: %s\n"
+#~ msgstr "gagal menghapus keyblok: %s\n"
+
+#, fuzzy
+#~| msgid "1 bad signature\n"
+#~ msgid "1 good signature\n"
+#~ msgstr "1 signature yang buruk\n"
+
+#, fuzzy
+#~ msgid "renaming '%s' to '%s' failed: %s\n"
+#~ msgstr "gagal enarmoring: %s\n"
+
+#, fuzzy
+#~ msgid "%lu keys cached (%lu signatures)\n"
+#~ msgstr "%lu kunci telah diperiksa (%lu signature)\n"
+
+#, fuzzy
+#~ msgid "refreshing 1 key from %s\n"
+#~ msgstr "meminta kunci %08lX dari %s\n"
+
+#, fuzzy
+#~ msgid "sending key %s to %s server %s\n"
+#~ msgstr "mencari \"%s\" dari server HKP %s\n"
+
+#, fuzzy
+#~ msgid "public key %s is %lu seconds newer than the signature\n"
+#~ msgstr "kunci publik %08lX adalah %lu detik lebih baru daripada signature\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "key %s was created %lu seconds in the future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "kunci telah diciptakan dalam %lu detik mendatang (masalah waktu atau "
+#~ "jam)\n"
+
#, fuzzy
#~| msgid "can't open the keyring"
#~ msgid "Failed to open the keyring DB.\n"
@@ -8726,10 +9078,6 @@ msgstr ""
#~ msgstr "mencari \"%s\" dari server HKP %s\n"
#, fuzzy
-#~ msgid "no keyserver action!\n"
-#~ msgstr "opsi ekspor tidak valid\n"
-
-#, fuzzy
#~ msgid "keyserver timed out\n"
#~ msgstr "kesalahan keyserver"
@@ -9919,9 +10267,6 @@ msgstr ""
#~ msgid "%s%c %4u%c/%08lX created: %s expires: %s"
#~ msgstr "%s%c %4u%c/%08lX diciptakan: %s berakhir: %s"
-#~ msgid "Policy: "
-#~ msgstr "Kebijakan: "
-
#~ msgid "can't get key from keyserver: %s\n"
#~ msgstr "tidak dapat memperoleh kunci keyserver: %s\n"
diff --git a/po/it.po b/po/it.po
index bde95bb..573f0f3 100644
--- a/po/it.po
+++ b/po/it.po
@@ -1241,6 +1241,20 @@ msgid "Enter passphrase: "
msgstr "Inserisci la passphrase: "
#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "error getting version from '%s': %s\n"
+msgstr "errore creando il portachiavi `%s': %s\n"
+
+#, c-format
+msgid "server '%s' is older than us (%s < %s)"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "WARNING: %s overrides %s\n"
+msgid "WARNING: %s\n"
+msgstr "ATTENZIONE: %s ha la precedenza su %s\n"
+
+#, fuzzy, c-format
msgid "OpenPGP card not available: %s\n"
msgstr "la chiave segreta non è disponibile"
@@ -1752,6 +1766,11 @@ msgid "remove as much as possible from key during export"
msgstr ""
#, fuzzy
+#| msgid "%s: skipped: %s\n"
+msgid " - skipped"
+msgstr "%s: saltata: %s\n"
+
+#, fuzzy
msgid "exporting secret keys not allowed\n"
msgstr "scrittura della chiave segreta in `%s'\n"
@@ -1763,19 +1782,36 @@ msgstr "chiave %08lX: chiave in stile PGP 2.x - saltata\n"
msgid "key %s: key material on-card - skipped\n"
msgstr "chiave %08lX: firma della subchiave nel posto sbagliato - saltata\n"
-#, fuzzy
-#| msgid "%s: skipped: %s\n"
-msgid " - skipped"
-msgstr "%s: saltata: %s\n"
-
msgid "WARNING: nothing exported\n"
msgstr "ATTENZIONE: non è stato esportato nulla\n"
+#, fuzzy, c-format
+#| msgid "error creating `%s': %s\n"
+msgid "error creating '%s': %s\n"
+msgstr "errore creando `%s': %s\n"
+
#, fuzzy
msgid "[User ID not found]"
msgstr "[User ID non trovato]"
#, fuzzy, c-format
+msgid "(check argument of option '%s')\n"
+msgstr "opzioni di importazione non valide\n"
+
+#, c-format
+msgid "Warning: '%s' should be a long key ID or a fingerprint\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error looking up: %s\n"
+msgstr "errore leggendo `%s': %s\n"
+
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "Warning: %s appears in the keyring %d times\n"
+msgstr "errore creando il portachiavi `%s': %s\n"
+
+#, fuzzy, c-format
msgid "automatically retrieved '%s' via %s\n"
msgstr "errore creando `%s': %s\n"
@@ -1792,14 +1828,19 @@ msgid "secret key \"%s\" not found: %s\n"
msgstr "chiave segreta `%s' non trovata: %s\n"
#, fuzzy, c-format
-msgid "(check argument of option '%s')\n"
-msgstr "opzioni di importazione non valide\n"
+#| msgid "|NAME|use NAME as default secret key"
+msgid "Warning: not using '%s' as default key: %s\n"
+msgstr "|NOME|usa NOME come chiave segreta predefinita"
#, fuzzy, c-format
#| msgid "|NAME|use NAME as default secret key"
-msgid "using \"%s\" as default secret key\n"
+msgid "using \"%s\" as default secret key for signing\n"
msgstr "|NOME|usa NOME come chiave segreta predefinita"
+#, c-format
+msgid "all values passed to '%s' ignored\n"
+msgstr ""
+
#, fuzzy, c-format
msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
msgstr "Chiave %08lX non valida resa valida da --allow-non-selfsigned-uid\n"
@@ -2158,28 +2199,6 @@ msgstr ""
"NOTA: il vecchio file `%s' con le opzioni predefinite è stato ignorato\n"
#, c-format
-msgid ""
-"Warning: value '%s' for option '%s' should be a long key ID or a "
-"fingerprint\n"
-msgstr ""
-
-#, c-format
-msgid "key specification '%s' is ambiguous\n"
-msgstr ""
-
-#. TRANSLATORS: The %s prints a key specification which
-#. for example has been given at the command line. Two
-#. lines with fingerprints are printed after this message.
-#, c-format
-msgid "'%s' matches at least:\n"
-msgstr ""
-
-#, fuzzy, c-format
-#| msgid "error creating keyring `%s': %s\n"
-msgid "error searching the keyring: %s\n"
-msgstr "errore creando il portachiavi `%s': %s\n"
-
-#, c-format
msgid "libgcrypt is too old (need %s, have %s)\n"
msgstr ""
@@ -2387,14 +2406,6 @@ msgstr ""
"ATTENZIONE: sono stati indicati dei destinatari (-r) senza usare la\n"
"crittografia a chiave pubblica\n"
-#, fuzzy, c-format
-msgid "option '%s' given, but no valid default keys given\n"
-msgstr "algoritmo di hash non valido `%s'\n"
-
-#, fuzzy, c-format
-msgid "option '%s' given, but option '%s' not given\n"
-msgstr "algoritmo di hash non valido `%s'\n"
-
msgid "--store [filename]"
msgstr "--store [nomefile]"
@@ -2470,6 +2481,11 @@ msgstr "ricezione dal keyserver fallita: %s\n"
msgid "key export failed: %s\n"
msgstr "esportazione della chiave fallita: %s\n"
+#, fuzzy, c-format
+#| msgid "key export failed: %s\n"
+msgid "export as ssh key failed: %s\n"
+msgstr "esportazione della chiave fallita: %s\n"
+
#, c-format
msgid "keyserver search failed: %s\n"
msgstr "ricerca nel keyserver fallita: %s\n"
@@ -2963,33 +2979,33 @@ msgstr "[revoca]"
msgid "[self-signature]"
msgstr "[autofirma]"
-msgid "1 bad signature\n"
-msgstr "una firma non corretta\n"
-
-#, c-format
-msgid "%d bad signatures\n"
-msgstr "%d firme non corrette\n"
-
-msgid "1 signature not checked due to a missing key\n"
-msgstr "una firma non controllata per mancanza della chiave\n"
-
-#, c-format
-msgid "%d signatures not checked due to missing keys\n"
-msgstr "%d firme non controllate per mancanza delle chiavi\n"
-
-msgid "1 signature not checked due to an error\n"
-msgstr "una firma non controllata a causa di un errore\n"
+#, fuzzy, c-format
+#| msgid "%d bad signatures\n"
+msgid "%d bad signature\n"
+msgid_plural "%d bad signatures\n"
+msgstr[0] "%d firme non corrette\n"
+msgstr[1] "%d firme non corrette\n"
-#, c-format
-msgid "%d signatures not checked due to errors\n"
-msgstr "%d firme non controllate a causa di errori\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to a missing key\n"
+msgid "%d signature not checked due to a missing key\n"
+msgid_plural "%d signatures not checked due to missing keys\n"
+msgstr[0] "una firma non controllata per mancanza della chiave\n"
+msgstr[1] "una firma non controllata per mancanza della chiave\n"
-msgid "1 user ID without valid self-signature detected\n"
-msgstr "Trovato un user ID senza autofirma valida\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to an error\n"
+msgid "%d signature not checked due to an error\n"
+msgid_plural "%d signatures not checked due to errors\n"
+msgstr[0] "una firma non controllata a causa di un errore\n"
+msgstr[1] "una firma non controllata a causa di un errore\n"
-#, c-format
-msgid "%d user IDs without valid self-signatures detected\n"
-msgstr "Trovati %d user ID senza autofirme valide\n"
+#, fuzzy, c-format
+#| msgid "%d user IDs without valid self-signatures detected\n"
+msgid "%d user ID without valid self-signature detected\n"
+msgid_plural "%d user IDs without valid self-signatures detected\n"
+msgstr[0] "Trovati %d user ID senza autofirme valide\n"
+msgstr[1] "Trovati %d user ID senza autofirme valide\n"
#, fuzzy
msgid ""
@@ -3626,13 +3642,12 @@ msgstr "Cancellare questa firma sconosciuta? (s/N/q)"
msgid "Really delete this self-signature? (y/N)"
msgstr "Cancellare davvero questa autofirma? (s/N)"
-#, c-format
+#, fuzzy, c-format
+#| msgid "Deleted %d signature.\n"
msgid "Deleted %d signature.\n"
-msgstr "Cancellata %d firma.\n"
-
-#, c-format
-msgid "Deleted %d signatures.\n"
-msgstr "Cancellate %d firme.\n"
+msgid_plural "Deleted %d signatures.\n"
+msgstr[0] "Cancellata %d firma.\n"
+msgstr[1] "Cancellata %d firma.\n"
msgid "Nothing deleted.\n"
msgstr "Non è stato cancellato nulla.\n"
@@ -3647,11 +3662,9 @@ msgstr "L'user ID \"%s\" è stato revocato."
#, fuzzy, c-format
msgid "User ID \"%s\": %d signature removed\n"
-msgstr "L'user ID \"%s\" è stato revocato."
-
-#, fuzzy, c-format
-msgid "User ID \"%s\": %d signatures removed\n"
-msgstr "L'user ID \"%s\" è stato revocato."
+msgid_plural "User ID \"%s\": %d signatures removed\n"
+msgstr[0] "L'user ID \"%s\" è stato revocato."
+msgstr[1] "L'user ID \"%s\" è stato revocato."
#, fuzzy, c-format
msgid "User ID \"%s\": already minimized\n"
@@ -4197,37 +4210,6 @@ msgid "Please correct the error first\n"
msgstr "Per favore correggi prima l'errore\n"
msgid ""
-"You need a Passphrase to protect your secret key.\n"
-"\n"
-msgstr ""
-"Ti serve una passphrase per proteggere la tua chiave segreta.\n"
-"\n"
-
-#, fuzzy
-msgid ""
-"Please enter a passphrase to protect the off-card backup of the new "
-"encryption key."
-msgstr "Inserisci la passphrase, cioè una frase segreta \n"
-
-msgid "passphrase not correctly repeated; try again"
-msgstr "passphrase non ripetuta correttamente; prova ancora"
-
-#, c-format
-msgid "%s.\n"
-msgstr "%s.\n"
-
-msgid ""
-"You don't want a passphrase - this is probably a *bad* idea!\n"
-"I will do it anyway. You can change your passphrase at any time,\n"
-"using this program with the option \"--edit-key\".\n"
-"\n"
-msgstr ""
-"Non hai specificato una passphrase - questa è probabilmente una *cattiva*\n"
-"idea! Lo farò io comunque. Puoi cambiarla in ogni momento, usando questo\n"
-"programma con l'opzione \"--edit-key\".\n"
-"\n"
-
-msgid ""
"We need to generate a lot of random bytes. It is a good idea to perform\n"
"some other action (type on the keyboard, move the mouse, utilize the\n"
"disks) during the prime generation; this gives the random number\n"
@@ -4272,6 +4254,14 @@ msgid "Key generation canceled.\n"
msgstr "Generazione della chiave annullata.\n"
#, fuzzy, c-format
+msgid "can't create backup file '%s': %s\n"
+msgstr "impossibile creare `%s': %s\n"
+
+#, fuzzy, c-format
+msgid "Note: backup of card key saved to '%s'\n"
+msgstr "NOTA: chiave %08lX scaduta il %s\n"
+
+#, fuzzy, c-format
#| msgid "writing public key to `%s'\n"
msgid "writing public key to '%s'\n"
msgstr "scrittura della chiave pubblica in `%s'\n"
@@ -4327,18 +4317,6 @@ msgstr "Parti della chiave segreta non sono disponibili.\n"
msgid "Really create? (y/N) "
msgstr "Crea davvero? "
-#, fuzzy, c-format
-msgid "storing key onto card failed: %s\n"
-msgstr "cancellazione del keyblock fallita: %s\n"
-
-#, fuzzy, c-format
-msgid "can't create backup file '%s': %s\n"
-msgstr "impossibile creare `%s': %s\n"
-
-#, fuzzy, c-format
-msgid "Note: backup of card key saved to '%s'\n"
-msgstr "NOTA: chiave %08lX scaduta il %s\n"
-
msgid "never "
msgstr "mai "
@@ -4357,19 +4335,18 @@ msgstr "Annotazione critica della firma: "
msgid "Signature notation: "
msgstr "Annotazione della firma: "
-#, fuzzy
-#| msgid "1 bad signature\n"
-msgid "1 good signature\n"
-msgstr "una firma non corretta\n"
-
#, fuzzy, c-format
#| msgid "%d bad signatures\n"
-msgid "%d good signatures\n"
-msgstr "%d firme non corrette\n"
+msgid "%d good signature\n"
+msgid_plural "%d good signatures\n"
+msgstr[0] "%d firme non corrette\n"
+msgstr[1] "%d firme non corrette\n"
#, c-format
-msgid "Warning: %lu key(s) skipped due to their large size\n"
-msgstr ""
+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] ""
msgid "Keyring"
msgstr "Portachiavi"
@@ -4400,20 +4377,27 @@ msgid " Card serial no. ="
msgstr ""
#, fuzzy, c-format
-msgid "renaming '%s' to '%s' failed: %s\n"
-msgstr "creazione dell'armatura fallita: %s\n"
-
-#, fuzzy, c-format
msgid "caching keyring '%s'\n"
msgstr "controllo il portachiavi `%s'\n"
#, fuzzy, c-format
-msgid "%lu keys cached so far (%lu signatures)\n"
-msgstr "Sono state controllate %lu chiavi (%lu firme)\n"
+msgid "%lu keys cached so far (%lu signature)\n"
+msgid_plural "%lu keys cached so far (%lu signatures)\n"
+msgstr[0] "Sono state controllate %lu chiavi (%lu firme)\n"
+msgstr[1] "Sono state controllate %lu chiavi (%lu firme)\n"
+
+#, c-format
+msgid "%lu key cached"
+msgid_plural "%lu keys cached"
+msgstr[0] ""
+msgstr[1] ""
#, fuzzy, c-format
-msgid "%lu keys cached (%lu signatures)\n"
-msgstr "Sono state controllate %lu chiavi (%lu firme)\n"
+#| msgid "1 bad signature\n"
+msgid " (%lu signature)\n"
+msgid_plural " (%lu signatures)\n"
+msgstr[0] "una firma non corretta\n"
+msgstr[1] "una firma non corretta\n"
#, c-format
msgid "%s: keyring created\n"
@@ -4457,18 +4441,16 @@ msgid "\"%s\" not a key ID: skipping\n"
msgstr ""
#, fuzzy, c-format
-msgid "refreshing 1 key from %s\n"
-msgstr "richiedo la chiave %08lX a %s\n"
+msgid "refreshing %d key from %s\n"
+msgid_plural "refreshing %d keys from %s\n"
+msgstr[0] "richiedo la chiave %08lX a %s\n"
+msgstr[1] "richiedo la chiave %08lX a %s\n"
#, fuzzy, c-format
msgid "WARNING: unable to refresh key %s via %s: %s\n"
msgstr "ATTENZIONE: impossibile cancellare il file temporaneo (%s) `%s': %s\n"
#, fuzzy, c-format
-msgid "refreshing %d keys from %s\n"
-msgstr "richiedo la chiave %08lX a %s\n"
-
-#, fuzzy, c-format
msgid "key \"%s\" not found on keyserver\n"
msgstr "chiave `%s' non trovata: %s\n"
@@ -4487,9 +4469,9 @@ msgstr "richiedo la chiave %08lX a %s\n"
msgid "requesting key %s from %s\n"
msgstr "richiedo la chiave %08lX a %s\n"
-#, fuzzy, c-format
-msgid "sending key %s to %s server %s\n"
-msgstr "cerco \"%s\" sul server HKP %s\n"
+#, fuzzy
+msgid "no keyserver known\n"
+msgstr "opzioni di esportazione non valide\n"
#, fuzzy, c-format
msgid "sending key %s to %s\n"
@@ -4713,6 +4695,17 @@ msgstr ""
msgid "Note: signatures using the %s algorithm are rejected\n"
msgstr "Firma %s, algoritmo di digest %s\n"
+#, fuzzy, c-format
+msgid "(reported error: %s)\n"
+msgstr "errore di lettura: %s\n"
+
+#, fuzzy, c-format
+msgid "(reported error: %s <%s>)\n"
+msgstr "errore di lettura: %s\n"
+
+msgid "(further info: "
+msgstr ""
+
#, c-format
msgid "%s:%d: deprecated option \"%s\"\n"
msgstr "%s:%d \"%s\" è una opzione deprecata\n"
@@ -5128,6 +5121,19 @@ msgstr "%s: saltata: chiave pubblica disabilitata\n"
msgid "%s: skipped: public key already present\n"
msgstr "%s: saltata: chiave pubblica già presente\n"
+#, fuzzy, c-format
+#| msgid "can't connect to `%s': %s\n"
+msgid "can't encrypt to '%s'\n"
+msgstr "impossibile connettersi a `%s': %s\n"
+
+#, fuzzy, c-format
+msgid "option '%s' given, but no valid default keys given\n"
+msgstr "algoritmo di hash non valido `%s'\n"
+
+#, fuzzy, c-format
+msgid "option '%s' given, but option '%s' not given\n"
+msgstr "algoritmo di hash non valido `%s'\n"
+
msgid "You did not specify a user ID. (you may use \"-r\")\n"
msgstr "Non hai specificato un user ID. (puoi usare \"-r\")\n"
@@ -5172,11 +5178,6 @@ msgid "data not saved; use option \"--output\" to save it\n"
msgstr ""
"i dati non sono stati salvati; usa l'opzione \"--output\" per salvarli\n"
-#, fuzzy, c-format
-#| msgid "error creating `%s': %s\n"
-msgid "error creating '%s': %s\n"
-msgstr "errore creando `%s': %s\n"
-
msgid "Detached signature.\n"
msgstr "Firma separata.\n"
@@ -5268,19 +5269,31 @@ msgid "This is a revocation certificate for the OpenPGP key:"
msgstr "Creare un certificato di revoca per questa chiave? "
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 ""
+
+msgid ""
"Use it to revoke this key in case of a compromise or loss of\n"
"the secret key. However, if the secret key is still accessible,\n"
"it is better to generate a new revocation certificate and give\n"
-"a reason for the revocation."
+"a reason for the revocation. For details see the description of\n"
+"of the gpg command \"--gen-revoke\" in the GnuPG manual."
msgstr ""
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 making use of this revocation certificate."
+"before importing and publishing this revocation certificate."
msgstr ""
#, fuzzy, c-format
+#| msgid "Revocation certificate created.\n"
+msgid "revocation certificate stored as '%s.rev'\n"
+msgstr "Certificato di revoca creato.\n"
+
+#, fuzzy, c-format
msgid "secret key \"%s\" not found\n"
msgstr "chiave segreta `%s' non trovata: %s\n"
@@ -5291,6 +5304,11 @@ msgstr "chiave segreta `%s' non trovata: %s\n"
msgid "'%s' matches multiple secret keys:\n"
msgstr ""
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "error searching the keyring: %s\n"
+msgstr "errore creando il portachiavi `%s': %s\n"
+
#, fuzzy
msgid "Create a revocation certificate for this key? (y/N) "
msgstr "Creare un certificato di revoca per questa chiave? "
@@ -5376,24 +5394,37 @@ msgstr ""
#, fuzzy, c-format
msgid "public key %s is %lu second newer than the signature\n"
-msgstr "la chiave pubblica %08lX è più recente della firma di %lu secondo\n"
+msgid_plural "public key %s is %lu seconds newer than the signature\n"
+msgstr[0] "la chiave pubblica %08lX è più recente della firma di %lu secondo\n"
+msgstr[1] "la chiave pubblica %08lX è più recente della firma di %lu secondo\n"
#, fuzzy, c-format
-msgid "public key %s is %lu seconds newer than the signature\n"
-msgstr "la chiave pubblica %08lX è più recente della firma di %lu secondi\n"
+msgid "public key %s is %lu day newer than the signature\n"
+msgid_plural "public key %s is %lu days newer than the signature\n"
+msgstr[0] "la chiave pubblica %08lX è più recente della firma di %lu secondo\n"
+msgstr[1] "la chiave pubblica %08lX è più recente della firma di %lu secondo\n"
#, fuzzy, c-format
msgid ""
"key %s was created %lu second in the future (time warp or clock problem)\n"
-msgstr ""
+msgid_plural ""
+"key %s was created %lu seconds in the future (time warp or clock problem)\n"
+msgstr[0] ""
+"la chiave è stata creata %lu secondo nel futuro (salto nel tempo o problema\n"
+"con l'orologio)\n"
+msgstr[1] ""
"la chiave è stata creata %lu secondo nel futuro (salto nel tempo o problema\n"
"con l'orologio)\n"
#, fuzzy, c-format
-msgid ""
-"key %s was created %lu seconds in the future (time warp or clock problem)\n"
-msgstr ""
-"la chiave è stata creata %lu secondi nel futuro (salto nel tempo o problema\n"
+msgid "key %s was created %lu day in the future (time warp or clock problem)\n"
+msgid_plural ""
+"key %s was created %lu days in the future (time warp or clock problem)\n"
+msgstr[0] ""
+"la chiave è stata creata %lu secondo nel futuro (salto nel tempo o problema\n"
+"con l'orologio)\n"
+msgstr[1] ""
+"la chiave è stata creata %lu secondo nel futuro (salto nel tempo o problema\n"
"con l'orologio)\n"
#, fuzzy, c-format
@@ -5636,6 +5667,237 @@ msgid "input line longer than %d characters\n"
msgstr "linea di input più lunga di %d caratteri\n"
#, fuzzy, c-format
+msgid "error beginning transaction on TOFU database: %s\n"
+msgstr "errore leggendo `%s': %s\n"
+
+#, c-format
+msgid "error committing transaction on TOFU database: %s\n"
+msgstr ""
+
+#, c-format
+msgid "error rolling back transaction on TOFU database: %s\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "unsupported TOFU database version: %s\n"
+msgstr ""
+"\n"
+"Algoritmi gestiti:\n"
+
+#, fuzzy, c-format
+msgid "error reading TOFU database: %s\n"
+msgstr "errore leggendo `%s': %s\n"
+
+#, fuzzy, c-format
+#| msgid "error writing secret keyring `%s': %s\n"
+msgid "error determining TOFU database's version: %s\n"
+msgstr "errore scrivendo il portachiavi segreto `%s': %s\n"
+
+#, fuzzy, c-format
+#| msgid "%s: error writing dir record: %s\n"
+msgid "error initializing TOFU database: %s\n"
+msgstr "%s: errore durante la scrittura del dir record: %s\n"
+
+#, fuzzy, c-format
+msgid "error opening TOFU database '%s': %s\n"
+msgstr "errore leggendo `%s': %s\n"
+
+msgid "Warning: Home directory contains both tofu.db and tofu.d.\n"
+msgstr ""
+
+msgid "Using split format for TOFU database\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error updating TOFU database: %s\n"
+msgstr "errore leggendo `%s': %s\n"
+
+#, fuzzy, c-format
+msgid "public key %s not found: %s\n"
+msgstr "chiave pubblica %08lX non trovata: %s\n"
+
+#, fuzzy, c-format
+msgid "error setting TOFU binding's trust level to %s\n"
+msgstr "errore leggendo `%s': %s\n"
+
+#, c-format
+msgid "The binding %s is NOT known."
+msgstr ""
+
+#, c-format
+msgid ""
+"The key %s raised a conflict with this binding (%s). Since this binding's "
+"policy was 'auto', it was changed to 'ask'."
+msgstr ""
+
+#, c-format
+msgid ""
+"Please indicate whether you believe the binding %s%sis legitimate (the key "
+"belongs to the stated owner) or a forgery (bad)."
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error gathering other user IDs: %s\n"
+msgstr "errore nella creazione della passhprase: %s\n"
+
+msgid "Known user IDs associated with this key:\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "Policy: "
+msgid "policy: %s"
+msgstr "Policy: "
+
+#, fuzzy, c-format
+msgid "error gathering signature stats: %s\n"
+msgstr "errore nella creazione della passhprase: %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] ""
+msgstr[1] ""
+
+#, c-format
+msgid "Statistics for keys with the email address \"%s\":\n"
+msgstr ""
+
+#, fuzzy
+#| msgid "list keys"
+msgid "this key"
+msgstr "elenca le chiavi"
+
+#, c-format
+msgid "%ld message signed in the future."
+msgid_plural "%ld messages signed in the future."
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+msgid "%ld message signed"
+msgid_plural "%ld messages signed"
+msgstr[0] "|algo [files]|stampa tutti i message digests"
+msgstr[1] "|algo [files]|stampa tutti i message digests"
+
+#, c-format
+msgid " over the past %ld day."
+msgid_plural " over the past %ld days."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid " over the past %ld week."
+msgid_plural " over the past %ld weeks."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid " over the past %ld month."
+msgid_plural " over the past %ld months."
+msgstr[0] ""
+msgstr[1] ""
+
+#. 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 ""
+
+#. 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 ""
+
+msgid "(G)ood, (A)ccept once, (U)nknown, (R)eject once, (B)ad? "
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error changing TOFU policy: %s\n"
+msgstr "errore nella creazione della passhprase: %s\n"
+
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "Have never verified a message signed by key %s!\n"
+msgstr ""
+
+#, c-format
+msgid "Failed to collect signature statistics for \"%s\" (key %s)\n"
+msgstr ""
+
+#, c-format
+msgid "Verified 0 messages signed by \"%s\" (key: %s, policy: %s)."
+msgstr ""
+
+#. TRANSLATORS: The final %s is replaced by a string like
+#. "7 months, 1 day, 5 minutes, 0 seconds".
+#, c-format
+msgid ""
+"Verified %ld message signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgid_plural ""
+"Verified %ld messages signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "The most recent message was verified %s ago."
+msgstr ""
+
+msgid "Warning: we've have yet to see a message signed by this key!\n"
+msgstr ""
+
+msgid "Warning: we've only seen a single message signed by this key!\n"
+msgstr ""
+
+#. TRANSLATORS: translate the below text. We don't
+#. directly internationalize that text so that we can
+#. tweak it without breaking translations.
+#, c-format
+msgid "TOFU: few signatures %d message %s"
+msgid_plural "TOFU: few signatures %d messages %s"
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+msgid "error opening TOFU database: %s\n"
+msgstr "errore leggendo `%s': %s\n"
+
+#, fuzzy, c-format
#| msgid "`%s' is not a valid long keyID\n"
msgid "'%s' is not a valid long keyID\n"
msgstr "`%s' non è un key ID lungo valido\n"
@@ -5694,19 +5956,24 @@ msgstr "non è necessario un controllo del trustdb\n"
msgid "no need for a trustdb update with '%s' trust model\n"
msgstr "non è necessario un controllo del trustdb\n"
-#, fuzzy, c-format
-msgid "public key %s not found: %s\n"
-msgstr "chiave pubblica %08lX non trovata: %s\n"
-
msgid "please do a --check-trustdb\n"
msgstr "per favore usa --check-trustdb\n"
msgid "checking the trustdb\n"
msgstr "controllo il trustdb\n"
-#, c-format
-msgid "%d keys processed (%d validity counts cleared)\n"
-msgstr "%d chiavi processate (%d conteggi di validità azzerati)\n"
+#, fuzzy, c-format
+msgid "%d key processed"
+msgid_plural "%d keys processed"
+msgstr[0] "Per ora sono state esaminate %lu chiavi\n"
+msgstr[1] "Per ora sono state esaminate %lu chiavi\n"
+
+#, fuzzy, c-format
+#| msgid "%d keys processed (%d validity counts cleared)\n"
+msgid " (%d validity count cleared)\n"
+msgid_plural " (%d validity counts cleared)\n"
+msgstr[0] "%d chiavi processate (%d conteggi di validità azzerati)\n"
+msgstr[1] "%d chiavi processate (%d conteggi di validità azzerati)\n"
msgid "no ultimately trusted keys found\n"
msgstr "non è stata trovata alcuna chiave definitivamente affidabile\n"
@@ -5716,10 +5983,6 @@ msgid "public key of ultimately trusted key %s not found\n"
msgstr "chiave pubblica definitivamente affidabile %08lX non trovata\n"
#, c-format
-msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
-msgstr ""
-
-#, c-format
msgid ""
"depth: %d valid: %3d signed: %3d trust: %d-, %dq, %dn, %dm, %df, %du\n"
msgstr ""
@@ -5918,8 +6181,11 @@ msgid "card is permanently locked!\n"
msgstr ""
#, c-format
-msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
-msgstr ""
+msgid "%d Admin PIN attempt remaining before card is permanently locked\n"
+msgid_plural ""
+"%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr[0] ""
+msgstr[1] ""
#. TRANSLATORS: Do not translate the "|A|" prefix but keep it at
#. the start of the string. Use %%0A to force a linefeed.
@@ -6009,8 +6275,10 @@ msgid "generating key failed\n"
msgstr "cancellazione del keyblock fallita: %s\n"
#, fuzzy, c-format
-msgid "key generation completed (%d seconds)\n"
-msgstr "Generazione della chiave fallita: %s\n"
+msgid "key generation completed (%d second)\n"
+msgid_plural "key generation completed (%d seconds)\n"
+msgstr[0] "Generazione della chiave fallita: %s\n"
+msgstr[1] "Generazione della chiave fallita: %s\n"
msgid "invalid structure of OpenPGP card (DO 0x93)\n"
msgstr ""
@@ -8211,6 +8479,9 @@ msgstr "|N|usa il modo N per la passphrase"
msgid "do not allow the reuse of old passphrases"
msgstr "errore nella creazione della passhprase: %s\n"
+msgid "|N|set the Pinentry timeout to N seconds"
+msgstr ""
+
msgid "|NAME|use NAME as default secret key"
msgstr "|NOME|usa NOME come chiave segreta predefinita"
@@ -8507,6 +8778,91 @@ msgid ""
"Check a passphrase given on stdin against the patternfile\n"
msgstr ""
+#~ msgid "%d signatures not checked due to missing keys\n"
+#~ msgstr "%d firme non controllate per mancanza delle chiavi\n"
+
+#~ msgid "%d signatures not checked due to errors\n"
+#~ msgstr "%d firme non controllate a causa di errori\n"
+
+#~ msgid "1 user ID without valid self-signature detected\n"
+#~ msgstr "Trovato un user ID senza autofirma valida\n"
+
+#~ msgid "Deleted %d signatures.\n"
+#~ msgstr "Cancellate %d firme.\n"
+
+#, fuzzy
+#~ msgid "User ID \"%s\": %d signatures removed\n"
+#~ msgstr "L'user ID \"%s\" è stato revocato."
+
+#~ msgid ""
+#~ "You need a Passphrase to protect your secret key.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Ti serve una passphrase per proteggere la tua chiave segreta.\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "Please enter a passphrase to protect the off-card backup of the new "
+#~ "encryption key."
+#~ msgstr "Inserisci la passphrase, cioè una frase segreta \n"
+
+#~ msgid "passphrase not correctly repeated; try again"
+#~ msgstr "passphrase non ripetuta correttamente; prova ancora"
+
+#~ msgid "%s.\n"
+#~ msgstr "%s.\n"
+
+#~ msgid ""
+#~ "You don't want a passphrase - this is probably a *bad* idea!\n"
+#~ "I will do it anyway. You can change your passphrase at any time,\n"
+#~ "using this program with the option \"--edit-key\".\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Non hai specificato una passphrase - questa è probabilmente una "
+#~ "*cattiva*\n"
+#~ "idea! Lo farò io comunque. Puoi cambiarla in ogni momento, usando questo\n"
+#~ "programma con l'opzione \"--edit-key\".\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid "storing key onto card failed: %s\n"
+#~ msgstr "cancellazione del keyblock fallita: %s\n"
+
+#, fuzzy
+#~| msgid "1 bad signature\n"
+#~ msgid "1 good signature\n"
+#~ msgstr "una firma non corretta\n"
+
+#, fuzzy
+#~ msgid "renaming '%s' to '%s' failed: %s\n"
+#~ msgstr "creazione dell'armatura fallita: %s\n"
+
+#, fuzzy
+#~ msgid "%lu keys cached (%lu signatures)\n"
+#~ msgstr "Sono state controllate %lu chiavi (%lu firme)\n"
+
+#, fuzzy
+#~ msgid "refreshing 1 key from %s\n"
+#~ msgstr "richiedo la chiave %08lX a %s\n"
+
+#, fuzzy
+#~ msgid "sending key %s to %s server %s\n"
+#~ msgstr "cerco \"%s\" sul server HKP %s\n"
+
+#, fuzzy
+#~ msgid "public key %s is %lu seconds newer than the signature\n"
+#~ msgstr "la chiave pubblica %08lX è più recente della firma di %lu secondi\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "key %s was created %lu seconds in the future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "la chiave è stata creata %lu secondi nel futuro (salto nel tempo o "
+#~ "problema\n"
+#~ "con l'orologio)\n"
+
#, fuzzy
#~| msgid "can't open the keyring"
#~ msgid "Failed to open the keyring DB.\n"
@@ -8767,10 +9123,6 @@ msgstr ""
#~ msgstr "cerco \"%s\" sul server HKP %s\n"
#, fuzzy
-#~ msgid "no keyserver action!\n"
-#~ msgstr "opzioni di esportazione non valide\n"
-
-#, fuzzy
#~ msgid "keyserver timed out\n"
#~ msgstr "errore del keyserver"
@@ -9981,9 +10333,6 @@ msgstr ""
#~ msgid "%s%c %4u%c/%08lX created: %s expires: %s"
#~ msgstr "%s%c %4u%c/%08lX creata: %s scade: %s"
-#~ msgid "Policy: "
-#~ msgstr "Policy: "
-
#~ msgid "can't get key from keyserver: %s\n"
#~ msgstr "impossibile scaricare la chiave dal keyserver: %s\n"
diff --git a/po/ja.po b/po/ja.po
index c8e685c..d78cca2 100644
--- a/po/ja.po
+++ b/po/ja.po
@@ -8,9 +8,9 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: gnupg 2.1.9\n"
+"Project-Id-Version: gnupg 2.1.10\n"
"Report-Msgid-Bugs-To: translations@gnupg.org\n"
-"PO-Revision-Date: 2015-10-13 11:32+0900\n"
+"PO-Revision-Date: 2015-12-21 21:21+0900\n"
"Last-Translator: NIIBE Yutaka <gniibe@fsij.org>\n"
"Language-Team: none\n"
"Language: ja\n"
@@ -925,7 +925,7 @@ msgid "Signature available"
msgstr "ç½²åãŒåˆ©ç”¨å¯èƒ½ã§ã™"
msgid "Parsing data succeeded"
-msgstr "データã®ãƒ‘ーズã«æˆåŠŸã—ã¾ã—ãŸ"
+msgstr "データã®æ§‹æ–‡è§£æžã«æˆåŠŸã—ã¾ã—ãŸ"
#, c-format
msgid "bad data hash algorithm: %s"
@@ -1165,6 +1165,20 @@ msgstr "プロキシ%sã®ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã¸ã®å•ã„åˆã‚ã›ãŒå¤±æ•—ã—ã¾ã
msgid "Enter passphrase: "
msgstr "パスフレーズを入力: "
+#, fuzzy, c-format
+#| msgid "error creating keyring '%s': %s\n"
+msgid "error getting version from '%s': %s\n"
+msgstr "éµãƒªãƒ³ã‚°'%s'ã®ä½œæˆã‚¨ãƒ©ãƒ¼: %s\n"
+
+#, c-format
+msgid "server '%s' is older than us (%s < %s)"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "WARNING: %s overrides %s\n"
+msgid "WARNING: %s\n"
+msgstr "*警告*: %sã¯%sより優先\n"
+
#, c-format
msgid "OpenPGP card not available: %s\n"
msgstr "OpenPGPカードãŒåˆ©ç”¨ã§ãã¾ã›ã‚“: %s\n"
@@ -1461,10 +1475,9 @@ msgstr "éµ\"%s\"ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“: %s\n"
msgid "error reading keyblock: %s\n"
msgstr "éµãƒ–ロックã®èª­ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼: %s\n"
-#, fuzzy, c-format
-#| msgid "key \"%s\" not found: %s\n"
+#, c-format
msgid "key \"%s\" not found\n"
-msgstr "éµ\"%s\"ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“: %s\n"
+msgstr "éµ\"%s\"ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“\n"
msgid "(unless you specify the key by fingerprint)\n"
msgstr "(フィンガー・プリントã§éµã‚’指定ã—ã¦ãªã„é™ã‚Š)\n"
@@ -1486,7 +1499,7 @@ msgid "key"
msgstr "éµ"
msgid "subkey"
-msgstr "サブéµ: "
+msgstr "副éµ: "
#, c-format
msgid "deleting keyblock failed: %s\n"
@@ -1623,6 +1636,9 @@ msgstr "エクスãƒãƒ¼ãƒˆã®éš›ã€åˆ©ç”¨ã§ããªã„部分を除去ã™ã‚‹"
msgid "remove as much as possible from key during export"
msgstr "エクスãƒãƒ¼ãƒˆã®éš›ã€ã§ãã‚‹ã ã‘除去ã™ã‚‹"
+msgid " - skipped"
+msgstr " - スキップã•ã‚Œã¾ã—ãŸ"
+
msgid "exporting secret keys not allowed\n"
msgstr "秘密éµã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã¯èªã‚られã¾ã›ã‚“\n"
@@ -1634,16 +1650,40 @@ msgstr "éµ%s: PGP 2.xå½¢å¼ã®éµã§ã™ - スキップã—ã¾ã™\n"
msgid "key %s: key material on-card - skipped\n"
msgstr "éµ%s: éµã¯ã‚«ãƒ¼ãƒ‰ä¸Šã«ã‚ã‚Šã¾ã™ - スキップã—ã¾ã™\n"
-msgid " - skipped"
-msgstr " - スキップã•ã‚Œã¾ã—ãŸ"
-
msgid "WARNING: nothing exported\n"
msgstr "*警告*: 何もエクスãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“\n"
+#, c-format
+msgid "error creating '%s': %s\n"
+msgstr "'%s'ã®ä½œæˆã‚¨ãƒ©ãƒ¼: %s\n"
+
msgid "[User ID not found]"
msgstr "[ユーザIDãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“]"
#, c-format
+msgid "(check argument of option '%s')\n"
+msgstr "(オプション'%s'ã®å¼•æ•°ã‚’確èªãã ã•ã„)\n"
+
+#, fuzzy, c-format
+#| msgid ""
+#| "Warning: value '%s' for option '%s' should be a long key ID or a "
+#| "fingerprint\n"
+msgid "Warning: '%s' should be a long key ID or a fingerprint\n"
+msgstr ""
+"警告: 値'%s'(オプション'%s'ã«å¯¾ã™ã‚‹)ã¯é•·ã„éµIDã‹ãƒ•ã‚£ãƒ³ã‚¬ãƒ¼ãƒ—リントã§ã‚ã‚‹ã¹ã"
+"ã§ã™ã€‚\n"
+
+#, fuzzy, c-format
+#| msgid "error closing %s: %s\n"
+msgid "error looking up: %s\n"
+msgstr "'%s'ã§ã‚¯ãƒ­ãƒ¼ã‚ºã®ã‚¨ãƒ©ãƒ¼: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error searching the keyring: %s\n"
+msgid "Warning: %s appears in the keyring %d times\n"
+msgstr "éµãƒªãƒ³ã‚°æŽ¢ç´¢ã‚¨ãƒ©ãƒ¼: %s\n"
+
+#, c-format
msgid "automatically retrieved '%s' via %s\n"
msgstr "'%s'ã‚’ %s ã‹ã‚‰è‡ªå‹•å–å¾—\n"
@@ -1659,14 +1699,18 @@ msgid "secret key \"%s\" not found: %s\n"
msgstr "秘密éµ\"%s\"ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“: %s\n"
#, fuzzy, c-format
-#| msgid "missing argument for option \"%.50s\"\n"
-msgid "(check argument of option '%s')\n"
-msgstr "オプション\"%.50s\"ã«å¼•æ•°ãŒã‚ã‚Šã¾ã›ã‚“\n"
+#| msgid "using \"%s\" as default secret key\n"
+msgid "Warning: not using '%s' as default key: %s\n"
+msgstr "デフォルトã®ç§˜å¯†éµã¨ã—ã¦\"%s\"を用ã„ã¾ã™\n"
#, fuzzy, c-format
-#| msgid "|NAME|use NAME as default secret key"
-msgid "using \"%s\" as default secret key\n"
-msgstr "|NAME|デフォルトã®ç§˜å¯†éµã¨ã—ã¦NAMEを用ã„ã‚‹"
+#| msgid "using \"%s\" as default secret key\n"
+msgid "using \"%s\" as default secret key for signing\n"
+msgstr "デフォルトã®ç§˜å¯†éµã¨ã—ã¦\"%s\"を用ã„ã¾ã™\n"
+
+#, c-format
+msgid "all values passed to '%s' ignored\n"
+msgstr ""
#, c-format
msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
@@ -1788,7 +1832,7 @@ msgid "run in server mode"
msgstr "サーãƒãƒ»ãƒ¢ãƒ¼ãƒ‰ã§å®Ÿè¡Œ"
msgid "|VALUE|set the TOFU policy for a key (good, unknown, bad, ask, auto)"
-msgstr ""
+msgstr "|VALUE|TOFUãƒãƒªã‚·ãƒ¼ã‚’éµã«è¨­å®šã™ã‚‹(good, unknown, bad, ask, auto)"
msgid "create ascii armored output"
msgstr "ASCIIå½¢å¼ã®å¤–装を作æˆ"
@@ -1977,52 +2021,25 @@ msgstr "éµã®ä¸€è¦§ã«éµãƒªãƒ³ã‚°ã®åå‰ã‚’表示ã™ã‚‹"
msgid "show expiration dates during signature listings"
msgstr "ç½²åã®ä¸€è¦§æ™‚ã«æœ‰åŠ¹æœŸé™ã®æ—¥ä»˜ã‚’表示ã™ã‚‹"
-#, fuzzy
-#| msgid "Available keys:\n"
msgid "available TOFU policies:\n"
-msgstr "利用å¯èƒ½ãªéµ:\n"
+msgstr "利用å¯èƒ½ãªTOFUãƒãƒªã‚·ãƒ¼:\n"
-#, fuzzy, c-format
-#| msgid "unknown option '%s'\n"
+#, c-format
msgid "unknown TOFU policy '%s'\n"
-msgstr "ä¸æ˜Žã®ã‚ªãƒ—ション'%s'\n"
+msgstr "ä¸æ˜Žã®TOFUãƒãƒªã‚·ãƒ¼'%s'\n"
msgid "(use \"help\" to list choices)\n"
-msgstr ""
+msgstr "(é¸æŠžè‚¢ã®ä¸€è¦§ã«ã¯\"help\"を使ã£ã¦ãã ã•ã„)\n"
-#, fuzzy, c-format
-#| msgid "unknown command '%s'\n"
+#, c-format
msgid "unknown TOFU DB format '%s'\n"
-msgstr "ä¸æ˜Žã®ã‚³ãƒžãƒ³ãƒ‰'%s'\n"
+msgstr "ä¸æ˜Žã®TOFU DBフォーマット'%s'\n"
#, c-format
msgid "Note: old default options file '%s' ignored\n"
msgstr "*注æ„*: 以å‰ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã ã£ãŸã‚ªãƒ—ション・ファイル'%s'ã¯ã€ç„¡è¦–ã•ã‚Œã¾ã™\n"
#, c-format
-msgid ""
-"Warning: value '%s' for option '%s' should be a long key ID or a "
-"fingerprint\n"
-msgstr ""
-
-#, fuzzy, c-format
-#| msgid "option \"%.50s\" is ambiguous\n"
-msgid "key specification '%s' is ambiguous\n"
-msgstr "オプション\"%.50s\"ã¯ã‚ã„ã¾ã„ã§ã™\n"
-
-#. TRANSLATORS: The %s prints a key specification which
-#. for example has been given at the command line. Two
-#. lines with fingerprints are printed after this message.
-#, c-format
-msgid "'%s' matches at least:\n"
-msgstr ""
-
-#, fuzzy, c-format
-#| msgid "error creating keyring '%s': %s\n"
-msgid "error searching the keyring: %s\n"
-msgstr "éµãƒªãƒ³ã‚°'%s'ã®ä½œæˆã‚¨ãƒ©ãƒ¼: %s\n"
-
-#, c-format
msgid "libgcrypt is too old (need %s, have %s)\n"
msgstr "libgcrypt ãŒå¤ã™ãŽã¾ã™ (å¿…è¦ %s, ç¾åœ¨ %s)\n"
@@ -2214,16 +2231,6 @@ msgstr "信用データベースã®åˆæœŸåŒ–ã«å¤±æ•—ã—ã¾ã—ãŸ: %s\n"
msgid "WARNING: recipients (-r) given without using public key encryption\n"
msgstr "*警告*: 公開éµæš—å·ã‚’使ã‚ãšã«ã€å—å–人 (-r) を指定ã—ã¦ã„ã¾ã™\n"
-#, fuzzy, c-format
-#| msgid "line %d: invalid date given\n"
-msgid "option '%s' given, but no valid default keys given\n"
-msgstr "è¡Œ %d: 無効ãªæ—¥ä»˜ãŒä¸Žãˆã‚‰ã‚Œã¾ã—ãŸ\n"
-
-#, fuzzy, c-format
-#| msgid "line %d: invalid date given\n"
-msgid "option '%s' given, but option '%s' not given\n"
-msgstr "è¡Œ %d: 無効ãªæ—¥ä»˜ãŒä¸Žãˆã‚‰ã‚Œã¾ã—ãŸ\n"
-
msgid "--store [filename]"
msgstr "--store [ファイルå]"
@@ -2296,6 +2303,11 @@ msgstr "éµã‚µãƒ¼ãƒã‹ã‚‰ã®å—ä¿¡ã«å¤±æ•—ã—ã¾ã—ãŸ: %s\n"
msgid "key export failed: %s\n"
msgstr "éµã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã«å¤±æ•—ã—ã¾ã—ãŸ: %s\n"
+#, fuzzy, c-format
+#| msgid "key export failed: %s\n"
+msgid "export as ssh key failed: %s\n"
+msgstr "éµã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã«å¤±æ•—ã—ã¾ã—ãŸ: %s\n"
+
#, c-format
msgid "keyserver search failed: %s\n"
msgstr "éµã‚µãƒ¼ãƒã®æ¤œç´¢ã«å¤±æ•—ã—ã¾ã—ãŸ: %s\n"
@@ -2316,14 +2328,13 @@ msgstr "外装ã«å¤±æ•—ã—ã¾ã—ãŸ: %s\n"
msgid "invalid hash algorithm '%s'\n"
msgstr "無効ãªãƒãƒƒã‚·ãƒ¥ãƒ»ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ '%s'ã§ã™\n"
-#, fuzzy, c-format
-#| msgid "error loading certificate '%s': %s\n"
+#, c-format
msgid "error parsing key specification '%s': %s\n"
-msgstr "証明書'%s'ã®èª­ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼: %s\n"
+msgstr "éµæŒ‡å®š'%s'ã®æ§‹æ–‡è§£æžã‚¨ãƒ©ãƒ¼: %s\n"
#, c-format
msgid "'%s' does not appear to be a valid key ID, fingerprint or keygrip\n"
-msgstr ""
+msgstr "'%s'ã¯æœ‰åŠ¹ãªéµID, フィンガープリントã€keygripã§ã¯ãªã„よã†ã§ã™ã€‚\n"
msgid "[filename]"
msgstr "[ファイルå]"
@@ -2630,7 +2641,7 @@ msgstr "éµ%s: 無効ãªæš—å·æ–¹å¼%dã®ç§˜å¯†éµã§ã™ - スキップã—ã¾ã™
#. created again.
#, c-format
msgid "To migrate '%s', with each smartcard, run: %s\n"
-msgstr ""
+msgstr "'%s'ã®ç§»è¡Œã«ã¯ã€ã‚¹ãƒžãƒ¼ãƒ‰ã‚«ãƒ¼ãƒ‰ãã‚Œãžã‚Œã§ã€ä»¥ä¸‹ã‚’実行ã—ã¦ãã ã•ã„: %s\n"
#, c-format
msgid "key %s: no public key - can't apply revocation certificate\n"
@@ -2756,10 +2767,9 @@ msgstr "éµãƒªãƒ³ã‚°'%s'ãŒã§ãã¾ã—ãŸ\n"
msgid "keyblock resource '%s': %s\n"
msgstr "keyblock リソース'%s': %s\n"
-#, fuzzy, c-format
-#| msgid "error opening '%s': %s\n"
+#, c-format
msgid "error opening key DB: %s\n"
-msgstr "'%s'ã‚’é–‹ãéš›ã€ã‚¨ãƒ©ãƒ¼: %s\n"
+msgstr "éµDBã‚’é–‹ãéš›ã®ã‚¨ãƒ©ãƒ¼: %s\n"
#, c-format
msgid "failed to rebuild keyring cache: %s\n"
@@ -2771,33 +2781,29 @@ msgstr "[失効]"
msgid "[self-signature]"
msgstr "[自己署å]"
-msgid "1 bad signature\n"
-msgstr "ä¸æ­£ãªç½²å1個\n"
-
-#, c-format
-msgid "%d bad signatures\n"
-msgstr "ä¸æ­£ãªç½²å%d個\n"
-
-msgid "1 signature not checked due to a missing key\n"
-msgstr "éµãŒãªã„ãŸã‚1個ã®ç½²åを検査ã—ã¾ã›ã‚“\n"
-
-#, c-format
-msgid "%d signatures not checked due to missing keys\n"
-msgstr "éµãŒãªã„ãŸã‚%d個ã®ç½²åを検査ã—ã¾ã›ã‚“\n"
-
-msgid "1 signature not checked due to an error\n"
-msgstr "エラーã®ãŸã‚1個ã®ç½²åを検査ã—ã¾ã›ã‚“\n"
+#, fuzzy, c-format
+#| msgid "%d bad signatures\n"
+msgid "%d bad signature\n"
+msgid_plural "%d bad signatures\n"
+msgstr[0] "ä¸æ­£ãªç½²å%d個\n"
-#, c-format
-msgid "%d signatures not checked due to errors\n"
-msgstr "エラーã®ãŸã‚%d個ã®ç½²åを検査ã—ã¾ã›ã‚“\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to a missing key\n"
+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個ã®ç½²åを検査ã—ã¾ã›ã‚“\n"
-msgid "1 user ID without valid self-signature detected\n"
-msgstr "有効ãªè‡ªå·±ç½²åã®ãªã„ユーザIDã‚’1個検出\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to an error\n"
+msgid "%d signature not checked due to an error\n"
+msgid_plural "%d signatures not checked due to errors\n"
+msgstr[0] "エラーã®ãŸã‚1個ã®ç½²åを検査ã—ã¾ã›ã‚“\n"
-#, c-format
-msgid "%d user IDs without valid self-signatures detected\n"
-msgstr "有効ãªè‡ªå·±ç½²åã®ãªã„ユーザIDã‚’%d個検出\n"
+#, fuzzy, c-format
+#| msgid "%d user IDs without valid self-signatures detected\n"
+msgid "%d user ID without valid self-signature detected\n"
+msgid_plural "%d user IDs without valid self-signatures detected\n"
+msgstr[0] "有効ãªè‡ªå·±ç½²åã®ãªã„ユーザIDã‚’%d個検出\n"
msgid ""
"Please decide how far you trust this user to correctly verify other users' "
@@ -2830,7 +2836,7 @@ msgstr "ç½²åを制é™ã™ã‚‹ãƒ‰ãƒ¡ã‚¤ãƒ³ã‚’入力ã™ã‚‹ã‹ã€ç©ºè¡Œã‚’入力ã—
#, c-format
msgid "Skipping user ID \"%s\", which is not a text ID.\n"
-msgstr ""
+msgstr "ユーザID\"%s\"をスキップã—ã¾ã™ã€ãƒ†ã‚­ã‚¹ãƒˆã®IDã§ã¯ã‚ã‚Šã¾ã›ã‚“。\n"
#, c-format
msgid "User ID \"%s\" is revoked."
@@ -3108,7 +3114,7 @@ msgid "compact unusable user IDs and remove all signatures from key"
msgstr "使ãˆãªã„ユーザIDをコンパクトã«ã—ã€ã™ã¹ã¦ã®ç½²åã‚’éµã‹ã‚‰é™¤åŽ»"
msgid "Secret key is available.\n"
-msgstr "秘密éµãŒä½¿ç”¨ã§ãã¾ã™ã€‚\n"
+msgstr "秘密éµãŒåˆ©ç”¨ã§ãã¾ã™ã€‚\n"
msgid "Need the secret key to do this.\n"
msgstr "ã“ã®å®Ÿè¡Œã«ã¯ç§˜å¯†éµãŒã„ã‚Šã¾ã™ã€‚\n"
@@ -3129,10 +3135,8 @@ msgstr "éµã¯ã€å¤±åŠ¹ã•ã‚Œã¦ã„ã¾ã™ã€‚"
msgid "Really sign all user IDs? (y/N) "
msgstr "本当ã«å…¨ãƒ¦ãƒ¼ã‚¶IDã«ç½²åã—ã¾ã™ã‹? (y/N) "
-#, fuzzy
-#| msgid "Really sign all user IDs? (y/N) "
msgid "Really sign all text user IDs? (y/N) "
-msgstr "本当ã«å…¨ãƒ¦ãƒ¼ã‚¶IDã«ç½²åã—ã¾ã™ã‹? (y/N) "
+msgstr "本当ã«å…¨ã¦ã®ãƒ†ã‚­ã‚¹ãƒˆãƒ¦ãƒ¼ã‚¶IDã«ç½²åã—ã¾ã™ã‹? (y/N) "
msgid "Hint: Select the user IDs to sign\n"
msgstr "ヒント: ã¾ãšç½²åã™ã‚‹ãƒ¦ãƒ¼ã‚¶IDã‚’é¸æŠžã—ã¾ã™\n"
@@ -3328,7 +3332,7 @@ msgstr ""
" ユーザIDãŒä¸»ã«ãªã‚‹ã¨ä»®å®šã™ã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚\n"
msgid "WARNING: Your encryption subkey expires soon.\n"
-msgstr "*警告*: ã‚ãªãŸã®æš—å·ã‚µãƒ–éµã¯ã‚‚ã†ã™ã期é™åˆ‡ã‚Œã¨ãªã‚Šã¾ã™ã€‚\n"
+msgstr "*警告*: ã‚ãªãŸã®æš—å·å‰¯éµã¯ã‚‚ã†ã™ã期é™åˆ‡ã‚Œã¨ãªã‚Šã¾ã™ã€‚\n"
msgid "You may want to change its expiration date too.\n"
msgstr "ãã®æœ‰åŠ¹æœŸé™ã‚‚変更ã—ãŸã„ã§ã—ょã†\n"
@@ -3363,13 +3367,11 @@ msgstr "ã“ã®ä¸æ˜Žã®ç½²åを削除ã—ã¾ã™ã‹? (y/N/q)"
msgid "Really delete this self-signature? (y/N)"
msgstr "ã“ã®è‡ªå·±ç½²åを本当ã«å‰Šé™¤ã—ã¾ã™ã‹? (y/N)"
-#, c-format
+#, fuzzy, c-format
+#| msgid "Deleted %d signature.\n"
msgid "Deleted %d signature.\n"
-msgstr "%d個ã®ç½²åを削除ã—ã¾ã—ãŸã€‚\n"
-
-#, c-format
-msgid "Deleted %d signatures.\n"
-msgstr "%d個ã®ç½²åを削除ã—ã¾ã—ãŸã€‚\n"
+msgid_plural "Deleted %d signatures.\n"
+msgstr[0] "%d個ã®ç½²åを削除ã—ã¾ã—ãŸã€‚\n"
msgid "Nothing deleted.\n"
msgstr "何も削除ã—ã¦ã„ã¾ã›ã‚“。\n"
@@ -3381,13 +3383,11 @@ msgstr "無効"
msgid "User ID \"%s\" compacted: %s\n"
msgstr "ユーザID \"%s\" ã¯ã€ã‚³ãƒ³ãƒ‘クトã«ãªã‚Šã¾ã—ãŸ: %s\n"
-#, c-format
+#, fuzzy, c-format
+#| msgid "User ID \"%s\": %d signature removed\n"
msgid "User ID \"%s\": %d signature removed\n"
-msgstr "ユーザID \"%s\": %d ã®ç½²åãŒé™¤åŽ»ã•ã‚Œã¾ã—ãŸ\n"
-
-#, c-format
-msgid "User ID \"%s\": %d signatures removed\n"
-msgstr "ユーザID \"%s\": %d ã®ç½²åãŒé™¤åŽ»ã•ã‚Œã¾ã—ãŸ\n"
+msgid_plural "User ID \"%s\": %d signatures removed\n"
+msgstr[0] "ユーザID \"%s\": %d ã®ç½²åãŒé™¤åŽ»ã•ã‚Œã¾ã—ãŸ\n"
#, c-format
msgid "User ID \"%s\": already minimized\n"
@@ -3428,13 +3428,10 @@ msgid ""
"Are you sure you want to appoint this key as a designated revoker? (y/N) "
msgstr "本当ã«ã“ã®éµã‚’指å失効者ã«ä»»å‘½ã—ã¾ã™ã‹? (y/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 "本当ã«ã“ã®éµã‚’指å失効者ã«ä»»å‘½ã—ã¾ã™ã‹? (y/N) "
+msgstr "本当ã«è¤‡æ•°ã®å‰¯éµã®å¤±åŠ¹æœŸé™ã‚’変更ã—ã¾ã™ã‹? (y/N) "
msgid "Changing expiration time for a subkey.\n"
msgstr "副éµã®æœ‰åŠ¹æœŸé™ã‚’変更ã—ã¾ã™ã€‚\n"
@@ -3483,10 +3480,9 @@ msgstr "%d番ã®ãƒ¦ãƒ¼ã‚¶IDã¯ã‚ã‚Šã¾ã›ã‚“\n"
msgid "No user ID with hash %s\n"
msgstr "ãƒãƒƒã‚·ãƒ¥%sã®ãƒ¦ãƒ¼ã‚¶IDã¯ã‚ã‚Šã¾ã›ã‚“\n"
-#, fuzzy, c-format
-#| msgid "No subkey with index %d\n"
+#, c-format
msgid "No subkey with key ID '%s'.\n"
-msgstr "%d番ã®å‰¯éµã¯ã‚ã‚Šã¾ã›ã‚“\n"
+msgstr "éµID'%s'ã®å‰¯éµã¯ã‚ã‚Šã¾ã›ã‚“\n"
#, c-format
msgid "No subkey with index %d\n"
@@ -3831,7 +3827,7 @@ msgstr "åå‰ã«ç„¡åŠ¹ãªæ–‡å­—ãŒã‚ã‚Šã¾ã™\n"
#, c-format
msgid "The characters '%s' and '%s' may not appear in name\n"
-msgstr ""
+msgstr "キャラクタ'%s'ã¨'%s'ã¯åå‰ã«ä½¿ãˆã¾ã›ã‚“\n"
msgid "Name may not start with a digit\n"
msgstr "åå‰ã‚’æ•°å­—ã§å§‹ã‚ã¦ã¯ã„ã‘ã¾ã›ã‚“\n"
@@ -3898,38 +3894,6 @@ msgid "Please correct the error first\n"
msgstr "ã¾ãšã‚¨ãƒ©ãƒ¼ã‚’修正ã—ã¦ãã ã•ã„\n"
msgid ""
-"You need a Passphrase to protect your secret key.\n"
-"\n"
-msgstr ""
-"秘密éµã‚’ä¿è­·ã™ã‚‹ãŸã‚ã«ãƒ‘スフレーズãŒã„ã‚Šã¾ã™ã€‚\n"
-"\n"
-
-msgid ""
-"Please enter a passphrase to protect the off-card backup of the new "
-"encryption key."
-msgstr ""
-"パスフレーズを入力ã—ã¦ãã ã•ã„。ã“ã‚Œã¯æ–°ã—ã作られる暗å·åŒ–éµã®ã‚«ãƒ¼ãƒ‰å¤–ã®ãƒãƒƒ"
-"クアップをä¿è­·ã™ã‚‹ã‚‚ã®ã§ã™ã€‚"
-
-msgid "passphrase not correctly repeated; try again"
-msgstr "パスフレーズをã¡ã‚ƒã‚“ã¨ç¹°ã‚Šè¿”ã—ã¦ã„ã¾ã›ã‚“。å†å…¥åŠ›ã—ã¦ãã ã•ã„"
-
-#, c-format
-msgid "%s.\n"
-msgstr "%s.\n"
-
-msgid ""
-"You don't want a passphrase - this is probably a *bad* idea!\n"
-"I will do it anyway. You can change your passphrase at any time,\n"
-"using this program with the option \"--edit-key\".\n"
-"\n"
-msgstr ""
-"パスフレーズを必è¦ã¨ã—ãªã„よã†ã§ã™ãŒã€ãŠãらããã‚Œã¯è‰¯ããªã„考ãˆã§ã™!\n"
-"続ã‘ã¾ã™ãŒã€ãƒ‘スフレーズを設定ã™ã‚‹ã“ã¨ã‚’検討ãã ã•ã„。パスフレーズã¯ã€\n"
-"ã“ã®ãƒ—ログラムã®\"--edit-key\"オプションã§ã„ã¤ã§ã‚‚変更ã§ãã¾ã™ã€‚\n"
-"\n"
-
-msgid ""
"We need to generate a lot of random bytes. It is a good idea to perform\n"
"some other action (type on the keyboard, move the mouse, utilize the\n"
"disks) during the prime generation; this gives the random number\n"
@@ -3974,6 +3938,14 @@ msgid "Key generation canceled.\n"
msgstr "éµã®ç”ŸæˆãŒå–り消ã•ã‚Œã¾ã—ãŸã€‚\n"
#, c-format
+msgid "can't create backup file '%s': %s\n"
+msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—・ファイル'%s'ãŒä½œæˆã§ãã¾ã›ã‚“: %s\n"
+
+#, c-format
+msgid "Note: backup of card key saved to '%s'\n"
+msgstr "*注æ„*: カードéµã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ãŒ'%s'ã¸ä¿å­˜ã•ã‚Œã¾ã™\n"
+
+#, c-format
msgid "writing public key to '%s'\n"
msgstr "'%s'ã¸å…¬é–‹éµã‚’書ãè¾¼ã¿ã¾ã™\n"
@@ -4017,18 +3989,6 @@ msgstr "主éµã®ç§˜å¯†éƒ¨åˆ†ã¯ã‚«ãƒ¼ãƒ‰ä¸Šã«ä¿å­˜ã•ã‚Œã¦ã„ã¾ã™ã€‚\n"
msgid "Really create? (y/N) "
msgstr "本当ã«ä½œæˆã—ã¾ã™ã‹? (y/N) "
-#, c-format
-msgid "storing key onto card failed: %s\n"
-msgstr "カードã¸ã®éµã®ä¿ç®¡ã«å¤±æ•—ã—ã¾ã—ãŸ: %s\n"
-
-#, c-format
-msgid "can't create backup file '%s': %s\n"
-msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—・ファイル'%s'ãŒä½œæˆã§ãã¾ã›ã‚“: %s\n"
-
-#, c-format
-msgid "Note: backup of card key saved to '%s'\n"
-msgstr "*注æ„*: カードéµã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ãŒ'%s'ã¸ä¿å­˜ã•ã‚Œã¾ã™\n"
-
msgid "never "
msgstr "ç„¡æœŸé™ "
@@ -4047,16 +4007,17 @@ msgstr "クリティカルãªç½²å注釈: "
msgid "Signature notation: "
msgstr "ç½²å注釈: "
-msgid "1 good signature\n"
-msgstr "æ­£ã—ã„ç½²å1個\n"
-
-#, c-format
-msgid "%d good signatures\n"
-msgstr "æ­£ã—ã„ç½²å%d個\n"
+#, fuzzy, c-format
+#| msgid "%d good signatures\n"
+msgid "%d good signature\n"
+msgid_plural "%d good signatures\n"
+msgstr[0] "æ­£ã—ã„ç½²å%d個\n"
-#, c-format
-msgid "Warning: %lu key(s) skipped due to their large size\n"
-msgstr "*警告*: %lu éµãŒãã®å¤§ãã•ã®ãŸã‚スキップã•ã‚Œã¾ã—ãŸ\n"
+#, fuzzy, c-format
+#| msgid "Warning: %lu key(s) skipped due to their large size\n"
+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] "*警告*: %lu éµãŒãã®å¤§ãã•ã®ãŸã‚スキップã•ã‚Œã¾ã—ãŸ\n"
msgid "Keyring"
msgstr "éµãƒªãƒ³ã‚°"
@@ -4086,20 +4047,26 @@ msgid " Card serial no. ="
msgstr " ã‚«ãƒ¼ãƒ‰ã‚·ãƒªã‚¢ãƒ«ç•ªå· ="
#, c-format
-msgid "renaming '%s' to '%s' failed: %s\n"
-msgstr "'%s'ã‹ã‚‰'%s'ã¸åå‰å¤‰æ›´ã«å¤±æ•—: %s\n"
-
-#, c-format
msgid "caching keyring '%s'\n"
msgstr "éµãƒªãƒ³ã‚°'%s'をキャッシュã—ã¾ã™\n"
-#, c-format
-msgid "%lu keys cached so far (%lu signatures)\n"
-msgstr "%lu個ã®éµã¾ã§ã‚­ãƒ£ãƒƒã‚·ãƒ¥æ¸ˆ (%lu個ã®ç½²å)\n"
+#, fuzzy, c-format
+#| msgid "%lu keys cached so far (%lu signatures)\n"
+msgid "%lu keys cached so far (%lu signature)\n"
+msgid_plural "%lu keys cached so far (%lu signatures)\n"
+msgstr[0] "%lu個ã®éµã¾ã§ã‚­ãƒ£ãƒƒã‚·ãƒ¥æ¸ˆ (%lu個ã®ç½²å)\n"
-#, c-format
-msgid "%lu keys cached (%lu signatures)\n"
-msgstr "%lu個ã®éµã‚’キャッシュ済 (%lu個ã®ç½²å)\n"
+#, fuzzy, c-format
+#| msgid "flush the cache"
+msgid "%lu key cached"
+msgid_plural "%lu keys cached"
+msgstr[0] "キャッシュをフラッシュã—ã¾ã™"
+
+#, fuzzy, c-format
+#| msgid "1 bad signature\n"
+msgid " (%lu signature)\n"
+msgid_plural " (%lu signatures)\n"
+msgstr[0] "ä¸æ­£ãªç½²å1個\n"
#, c-format
msgid "%s: keyring created\n"
@@ -4140,19 +4107,17 @@ msgstr "無効ãªéµã‚µãƒ¼ãƒãƒ»ãƒ—ロトコルã§ã™ (us %d!=handler %d)\n"
msgid "\"%s\" not a key ID: skipping\n"
msgstr "\"%s\"éµIDã§ã¯ã‚ã‚Šã¾ã›ã‚“: スキップã—ã¾ã™\n"
-#, c-format
-msgid "refreshing 1 key from %s\n"
-msgstr "1本ã®éµã‚’%sã‹ã‚‰æ›´æ–°\n"
+#, fuzzy, c-format
+#| msgid "refreshing %d keys from %s\n"
+msgid "refreshing %d key from %s\n"
+msgid_plural "refreshing %d keys from %s\n"
+msgstr[0] "%d本ã®éµã‚’%sã‹ã‚‰æ›´æ–°\n"
#, c-format
msgid "WARNING: unable to refresh key %s via %s: %s\n"
msgstr "*警告*: éµ%sã‚’%s経由ã§æ›´æ–°ã§ãã¾ã›ã‚“: %s\n"
#, c-format
-msgid "refreshing %d keys from %s\n"
-msgstr "%d本ã®éµã‚’%sã‹ã‚‰æ›´æ–°\n"
-
-#, c-format
msgid "key \"%s\" not found on keyserver\n"
msgstr "éµ\"%s\"ãŒéµã‚µãƒ¼ãƒã«è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“\n"
@@ -4170,9 +4135,10 @@ msgstr "éµ%sã‚’%sã‹ã‚‰ã‚µãƒ¼ãƒ%sã«è¦æ±‚\n"
msgid "requesting key %s from %s\n"
msgstr "éµ%sã‚’%sã«è¦æ±‚\n"
-#, c-format
-msgid "sending key %s to %s server %s\n"
-msgstr "éµ%sã‚’%sサーãƒ%sã¸é€ä¿¡\n"
+#, fuzzy
+#| msgid "invalid keyserver options\n"
+msgid "no keyserver known\n"
+msgstr "無効ãªéµã‚µãƒ¼ãƒãƒ»ã‚ªãƒ—ションã§ã™\n"
#, c-format
msgid "sending key %s to %s\n"
@@ -4383,6 +4349,19 @@ msgstr "*警告*: ダイジェスト・アルゴリズム %s ã¯å»ƒæ­¢ã•ã‚Œã¦ã
msgid "Note: signatures using the %s algorithm are rejected\n"
msgstr "注æ„: アルゴリズム %s を用ã„ãŸç½²åã¯æ‹’å¦ã•ã‚Œã¾ã—ãŸ\n"
+#, fuzzy, c-format
+#| msgid "%s:%u: read error: %s\n"
+msgid "(reported error: %s)\n"
+msgstr "%s:%u: 読ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼: %s\n"
+
+#, fuzzy, c-format
+#| msgid "read error in '%s': %s\n"
+msgid "(reported error: %s <%s>)\n"
+msgstr "'%s'ã§èª­ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼: %s\n"
+
+msgid "(further info: "
+msgstr ""
+
#, c-format
msgid "%s:%d: deprecated option \"%s\"\n"
msgstr "%s:%d: 廃止ã•ã‚ŒãŸã‚ªãƒ—ション\"%s\"\n"
@@ -4434,10 +4413,9 @@ msgstr "ä¸æ˜Žã®ã‚ªãƒ—ション'%s'\n"
msgid "ECDSA public key is expected to be in SEC encoding multiple of 8 bits\n"
msgstr "ECDSAã®å…¬é–‹éµã¯8ビットã®å€æ•°ã®SECエンコーディングを期待ã—ã¾ã™\n"
-#, fuzzy, c-format
-#| msgid "Unknown signature type '%s'\n"
+#, c-format
msgid "unknown weak digest '%s'\n"
-msgstr "ä¸æ˜Žã®ç½²åタイプ'%s'\n"
+msgstr "ä¸æ˜Žã®å¼±ã„ダイジェスト'%s'\n"
#, c-format
msgid "File '%s' exists. "
@@ -4531,13 +4509,13 @@ msgstr "OpenPGPã®ç§˜å¯†éµã‚’インãƒãƒ¼ãƒˆã™ã‚‹ãŸã‚ã«ãƒ‘スフレーズã‚
msgid "Please enter the passphrase to export the OpenPGP secret subkey:"
msgstr ""
-"OpenPGPã®ç§˜å¯†ã‚µãƒ–éµã‚’エクスãƒãƒ¼ãƒˆã™ã‚‹ãŸã‚ã«ãƒ‘スフレーズを入力ã—ã¦ãã ã•ã„:"
+"OpenPGPã®ç§˜å¯†å‰¯éµã‚’エクスãƒãƒ¼ãƒˆã™ã‚‹ãŸã‚ã«ãƒ‘スフレーズを入力ã—ã¦ãã ã•ã„:"
msgid "Please enter the passphrase to export the OpenPGP secret key:"
msgstr "OpenPGPã®ç§˜å¯†éµã‚’エクスãƒãƒ¼ãƒˆã™ã‚‹ãŸã‚ã«ãƒ‘スフレーズを入力ã—ã¦ãã ã•ã„:"
msgid "Do you really want to permanently delete the OpenPGP secret subkey key:"
-msgstr "é¸æŠžã—ãŸOpenPGPサブéµã‚’本当ã«æ°¸ä¹…ã«å‰Šé™¤ã—ã¾ã™ã‹? (y/N) "
+msgstr "é¸æŠžã—ãŸOpenPGP副éµã‚’本当ã«æ°¸ä¹…ã«å‰Šé™¤ã—ã¾ã™ã‹? (y/N) "
msgid "Do you really want to permanently delete the OpenPGP secret key:"
msgstr "é¸æŠžã—ãŸOpenPGP秘密éµã‚’本当ã«æ°¸ä¹…ã«å‰Šé™¤ã—ã¾ã™ã‹? (y/N) "
@@ -4771,6 +4749,20 @@ msgstr "%s: スキップ: 公開éµã¯ä½¿ç”¨ç¦æ­¢ã§ã™\n"
msgid "%s: skipped: public key already present\n"
msgstr "%s: スキップ: 公開éµã¯ã‚‚ã†ã‚ã‚Šã¾ã™\n"
+#, fuzzy, c-format
+#| msgid "can't connect to '%s': %s\n"
+msgid "can't encrypt to '%s'\n"
+msgstr "'%s'ã¸æŽ¥ç¶šã§ãã¾ã›ã‚“: %s\n"
+
+#, c-format
+msgid "option '%s' given, but no valid default keys given\n"
+msgstr ""
+"オプション'%s'ãŒä¸Žãˆã‚‰ã‚Œã¾ã—ãŸãŒã€æœ‰åŠ¹ãªãƒ‡ãƒ•ã‚©ãƒ«ãƒˆéµãŒä¸Žãˆã‚‰ã‚Œã¦ã„ã¾ã›ã‚“\n"
+
+#, c-format
+msgid "option '%s' given, but option '%s' not given\n"
+msgstr "オプション'%s'ãŒä¸Žãˆã‚‰ã‚Œã¾ã—ãŸãŒã€ã‚ªãƒ—ション'%s'ã¯ä¸Žãˆã‚‰ã‚Œã¦ã„ã¾ã›ã‚“\n"
+
msgid "You did not specify a user ID. (you may use \"-r\")\n"
msgstr "ユーザIDを指定ã—ã¦ã„ã¾ã›ã‚“ (\"-r\"を使ã„ã¾ã—ょã†) 。\n"
@@ -4815,10 +4807,6 @@ msgid "data not saved; use option \"--output\" to save it\n"
msgstr ""
"データã¯ä¿å­˜ã•ã‚Œã¦ã„ã¾ã›ã‚“。ä¿å­˜ã«ã¯\"--output\"オプションを使ã£ã¦ãã ã•ã„\n"
-#, c-format
-msgid "error creating '%s': %s\n"
-msgstr "'%s'ã®ä½œæˆã‚¨ãƒ©ãƒ¼: %s\n"
-
msgid "Detached signature.\n"
msgstr "分é£ç½²å。\n"
@@ -4878,10 +4866,8 @@ msgstr "失効者:\n"
msgid "(This is a sensitive revocation key)\n"
msgstr "(ã“ã‚Œã¯ã€æ©Ÿå¯†æŒ‡å®šã®å¤±åŠ¹éµã§ã™)\n"
-#, fuzzy
-#| msgid "Secret key is available.\n"
msgid "Secret key is not available.\n"
-msgstr "秘密éµãŒä½¿ç”¨ã§ãã¾ã™ã€‚\n"
+msgstr "秘密éµãŒåˆ©ç”¨ã§ãã¾ã›ã‚“。\n"
msgid "Create a designated revocation certificate for this key? (y/N) "
msgstr "ã“ã®éµã«å¯¾ã™ã‚‹æŒ‡å失効証明書を作æˆã—ã¾ã™ã‹? (y/N) "
@@ -4904,35 +4890,61 @@ msgid "This is a revocation certificate for the OpenPGP key:"
msgstr "ã“ã‚Œã¯å¤±åŠ¹è¨¼æ˜Žæ›¸ã§ã“ã¡ã‚‰ã®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 ""
+
+#, fuzzy
+#| msgid ""
+#| "Use it to revoke this key in case of a compromise or loss of\n"
+#| "the secret key. However, if the secret key is still accessible,\n"
+#| "it is better to generate a new revocation certificate and give\n"
+#| "a reason for the revocation."
+msgid ""
"Use it to revoke this key in case of a compromise or loss of\n"
"the secret key. However, if the secret key is still accessible,\n"
"it is better to generate a new revocation certificate and give\n"
-"a reason for the revocation."
+"a reason for the revocation. For details see the description of\n"
+"of the gpg command \"--gen-revoke\" in the GnuPG manual."
msgstr ""
"秘密éµã®ã‚³ãƒ³ãƒ—ロマイズや紛失ã®å ´åˆã€ã“れを使ã£ã¦ã“ã®éµã‚’失効ã•ã›ã¾ã™ã€‚\n"
"ã—ã‹ã—ã€ç§˜å¯†éµãŒã¾ã ã‚¢ã‚¯ã‚»ã‚¹å¯èƒ½ã§ã‚ã‚‹å ´åˆã€æ–°ã—ã„失効証明書を生æˆã—ã€\n"
"失効ã®ç†ç”±ã‚’ã¤ã‘ã‚‹æ–¹ãŒã‚ˆã„ã§ã—ょã†ã€‚"
+#, fuzzy
+#| 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 making use of this revocation certificate."
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 making use of this revocation certificate."
+"before importing and publishing this revocation certificate."
msgstr ""
"ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’誤ã£ã¦ä½¿ã†ã®ã‚’é¿ã‘ã‚‹ãŸã‚ã€ä»¥ä¸‹ã§ã¯ã‚³ãƒ­ãƒ³ãŒ5ã¤ã®ãƒ€ãƒƒã‚·ãƒ¥ã®å‰ã«æŒ¿"
"å…¥ã•ã‚Œã¾ã™ã€‚\n"
"ã“ã®å¤±åŠ¹è¨¼æ˜Žæ›¸ã‚’使ã†å‰ã«ã¯ãƒ†ã‚¯ã‚¹ãƒˆãƒ»ã‚¨ãƒ‡ã‚£ã‚¿ã§ã“ã®ã‚³ãƒ­ãƒ³ã‚’削除ã—ã¦ãã ã•ã„。"
#, fuzzy, c-format
-#| msgid "secret key \"%s\" not found: %s\n"
+#| msgid "Revocation certificate created.\n"
+msgid "revocation certificate stored as '%s.rev'\n"
+msgstr "失効証明書を作æˆã€‚\n"
+
+#, c-format
msgid "secret key \"%s\" not found\n"
-msgstr "秘密éµ\"%s\"ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“: %s\n"
+msgstr "秘密éµ\"%s\"ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“\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'ã¯ä»¥ä¸‹ã®è¤‡æ•°ã®ç§˜å¯†éµã«ãƒžãƒƒãƒã—ã¾ã™:\n"
+
+#, c-format
+msgid "error searching the keyring: %s\n"
+msgstr "éµãƒªãƒ³ã‚°æŽ¢ç´¢ã‚¨ãƒ©ãƒ¼: %s\n"
msgid "Create a revocation certificate for this key? (y/N) "
msgstr "ã“ã®éµã«å¯¾ã™ã‚‹å¤±åŠ¹è¨¼æ˜Žæ›¸ã‚’作æˆã—ã¾ã™ã‹? (y/N) "
@@ -5011,23 +5023,34 @@ msgstr "詳細ã¯%sã‚’ã”覧ãã ã•ã„\n"
msgid "WARNING: signing subkey %s has an invalid cross-certification\n"
msgstr "*警告*: 無効ãªç›¸äº’証明ãŒã€ç½²å副éµ%sã«ã‚ã‚Šã¾ã™\n"
-#, c-format
+#, fuzzy, c-format
+#| msgid "public key %s is %lu second newer than the signature\n"
msgid "public key %s is %lu second newer than the signature\n"
-msgstr "公開éµ%sã¯ã€ç½²åよりも%lu秒新ã—ã„ã‚‚ã®ã§ã™\n"
+msgid_plural "public key %s is %lu seconds newer than the signature\n"
+msgstr[0] "公開éµ%sã¯ã€ç½²åよりも%lu秒新ã—ã„ã‚‚ã®ã§ã™\n"
-#, c-format
-msgid "public key %s is %lu seconds newer than the signature\n"
-msgstr "公開éµ%sã¯ã€ç½²åよりも%lu秒新ã—ã„ã‚‚ã®ã§ã™\n"
+#, fuzzy, c-format
+#| msgid "public key %s is %lu second newer than the signature\n"
+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] "公開éµ%sã¯ã€ç½²åよりも%lu秒新ã—ã„ã‚‚ã®ã§ã™\n"
-#, c-format
+#, fuzzy, c-format
+#| msgid ""
+#| "key %s was created %lu second in the future (time warp or clock problem)\n"
msgid ""
"key %s was created %lu second in the future (time warp or clock problem)\n"
-msgstr "éµ%sã¯%lu秒未æ¥ã«ã§ãã¾ã—㟠(時間歪曲ã‹æ™‚計ã®éšœå®³ã§ã—ょã†)\n"
-
-#, c-format
-msgid ""
+msgid_plural ""
"key %s was created %lu seconds in the future (time warp or clock problem)\n"
-msgstr "éµ%sã¯%lu秒未æ¥ã«ã§ãã¾ã—㟠(時間歪曲ã‹æ™‚計ã®éšœå®³ã§ã—ょã†)\n"
+msgstr[0] "éµ%sã¯%lu秒未æ¥ã«ã§ãã¾ã—㟠(時間歪曲ã‹æ™‚計ã®éšœå®³ã§ã—ょã†)\n"
+
+#, fuzzy, c-format
+#| msgid ""
+#| "key %s was created %lu second in the future (time warp or clock problem)\n"
+msgid "key %s was created %lu day in the future (time warp or clock problem)\n"
+msgid_plural ""
+"key %s was created %lu days in the future (time warp or clock problem)\n"
+msgstr[0] "éµ%sã¯%lu秒未æ¥ã«ã§ãã¾ã—㟠(時間歪曲ã‹æ™‚計ã®éšœå®³ã§ã—ょã†)\n"
#, c-format
msgid "Note: signature key %s expired %s\n"
@@ -5246,6 +5269,232 @@ msgstr "%d文字以上ã®é•·ã•ã®ãƒ†ã‚­ã‚¹ãƒˆè¡Œã¯ã€å–り扱ãˆã¾ã›ã‚“\n"
msgid "input line longer than %d characters\n"
msgstr "入力行ã®é•·ã•ãŒ%d文字を超ãˆã¦ã„ã¾ã™\n"
+#, fuzzy, c-format
+#| msgid "error sending standard options: %s\n"
+msgid "error beginning transaction on TOFU database: %s\n"
+msgstr "標準オプションをé€ä¿¡ã‚¨ãƒ©ãƒ¼: %s\n"
+
+#, c-format
+msgid "error committing transaction on TOFU database: %s\n"
+msgstr ""
+
+#, c-format
+msgid "error rolling back transaction on TOFU database: %s\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "unsupported algorithm: %s"
+msgid "unsupported TOFU database version: %s\n"
+msgstr "サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„アルゴリズム: %s"
+
+#, fuzzy, c-format
+#| msgid "error sending data: %s\n"
+msgid "error reading TOFU database: %s\n"
+msgstr "データé€ä¿¡ã‚¨ãƒ©ãƒ¼: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error writing base64 encoding: %s\n"
+msgid "error determining TOFU database's version: %s\n"
+msgstr "base64エンコーディングã®æ›¸ãè¾¼ã¿ã‚¨ãƒ©ãƒ¼: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error initializing reader object: %s\n"
+msgid "error initializing TOFU database: %s\n"
+msgstr "リーダ・オブジェクトã®åˆæœŸåŒ–エラー: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error opening '%s': %s\n"
+msgid "error opening TOFU database '%s': %s\n"
+msgstr "'%s'ã‚’é–‹ãéš›ã€ã‚¨ãƒ©ãƒ¼: %s\n"
+
+msgid "Warning: Home directory contains both tofu.db and tofu.d.\n"
+msgstr ""
+
+msgid "Using split format for TOFU database\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "error sending data: %s\n"
+msgid "error updating TOFU database: %s\n"
+msgstr "データé€ä¿¡ã‚¨ãƒ©ãƒ¼: %s\n"
+
+#, c-format
+msgid "public key %s not found: %s\n"
+msgstr "公開éµ%sãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error setting OCSP target: %s\n"
+msgid "error setting TOFU binding's trust level to %s\n"
+msgstr "OCSPターゲットã®è¨­å®šã‚¨ãƒ©ãƒ¼: %s\n"
+
+#, c-format
+msgid "The binding %s is NOT known."
+msgstr ""
+
+#, c-format
+msgid ""
+"The key %s raised a conflict with this binding (%s). Since this binding's "
+"policy was 'auto', it was changed to 'ask'."
+msgstr ""
+
+#, c-format
+msgid ""
+"Please indicate whether you believe the binding %s%sis legitimate (the key "
+"belongs to the stated owner) or a forgery (bad)."
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "error getting responder ID: %s\n"
+msgid "error gathering other user IDs: %s\n"
+msgstr "応答IDã®å–得エラー: %s\n"
+
+msgid "Known user IDs associated with this key:\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "validity: %s"
+msgid "policy: %s"
+msgstr "有効性: %s"
+
+#, fuzzy, c-format
+#| msgid "error getting stored flags: %s\n"
+msgid "error gathering signature stats: %s\n"
+msgstr "ä¿å­˜ã•ã‚ŒãŸãƒ•ãƒ©ã‚°ã®å–得エラー: %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] ""
+
+#, c-format
+msgid "Statistics for keys with the email address \"%s\":\n"
+msgstr ""
+
+#, fuzzy
+#| msgid "list keys"
+msgid "this key"
+msgstr "éµã®ä¸€è¦§"
+
+#, c-format
+msgid "%ld message signed in the future."
+msgid_plural "%ld messages signed in the future."
+msgstr[0] ""
+
+#, fuzzy, c-format
+#| msgid "print message digests"
+msgid "%ld message signed"
+msgid_plural "%ld messages signed"
+msgstr[0] "メッセージ・ダイジェストを表示"
+
+#, c-format
+msgid " over the past %ld day."
+msgid_plural " over the past %ld days."
+msgstr[0] ""
+
+#, c-format
+msgid " over the past %ld week."
+msgid_plural " over the past %ld weeks."
+msgstr[0] ""
+
+#, c-format
+msgid " over the past %ld month."
+msgid_plural " over the past %ld months."
+msgstr[0] ""
+
+#. 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 ""
+
+#. 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 ""
+
+msgid "(G)ood, (A)ccept once, (U)nknown, (R)eject once, (B)ad? "
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "error creating a pipe: %s\n"
+msgid "error changing TOFU policy: %s\n"
+msgstr "パイプã®ä½œæˆã‚¨ãƒ©ãƒ¼: %s\n"
+
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+
+#, c-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] ""
+
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+
+#, c-format
+msgid "Have never verified a message signed by key %s!\n"
+msgstr ""
+
+#, c-format
+msgid "Failed to collect signature statistics for \"%s\" (key %s)\n"
+msgstr ""
+
+#, c-format
+msgid "Verified 0 messages signed by \"%s\" (key: %s, policy: %s)."
+msgstr ""
+
+#. TRANSLATORS: The final %s is replaced by a string like
+#. "7 months, 1 day, 5 minutes, 0 seconds".
+#, c-format
+msgid ""
+"Verified %ld message signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgid_plural ""
+"Verified %ld messages signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgstr[0] ""
+
+#, c-format
+msgid "The most recent message was verified %s ago."
+msgstr ""
+
+msgid "Warning: we've have yet to see a message signed by this key!\n"
+msgstr ""
+
+msgid "Warning: we've only seen a single message signed by this key!\n"
+msgstr ""
+
+#. TRANSLATORS: translate the below text. We don't
+#. directly internationalize that text so that we can
+#. tweak it without breaking translations.
+#, c-format
+msgid "TOFU: few signatures %d message %s"
+msgid_plural "TOFU: few signatures %d messages %s"
+msgstr[0] ""
+
+#, fuzzy, c-format
+#| msgid "error sending data: %s\n"
+msgid "error opening TOFU database: %s\n"
+msgstr "データé€ä¿¡ã‚¨ãƒ©ãƒ¼: %s\n"
+
#, c-format
msgid "'%s' is not a valid long keyID\n"
msgstr "'%s'ã¯ã€æœ‰åŠ¹ãªå¤§åž‹éµIDã§ã‚ã‚Šã¾ã›ã‚“\n"
@@ -5303,19 +5552,23 @@ msgstr "信用モデル'%s'ã§ä¿¡ç”¨ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®æ¤œæŸ»ã¯ã€ä¸è¦ã§ã
msgid "no need for a trustdb update with '%s' trust model\n"
msgstr "信用モデル'%s'ã§ä¿¡ç”¨ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®æ›´æ–°ã¯ã€ä¸è¦ã§ã™\n"
-#, c-format
-msgid "public key %s not found: %s\n"
-msgstr "公開éµ%sãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“: %s\n"
-
msgid "please do a --check-trustdb\n"
msgstr "--check-trustdbを実行ã—ã¦ãã ã•ã„\n"
msgid "checking the trustdb\n"
msgstr "信用データベースã®æ¤œæŸ»\n"
-#, c-format
-msgid "%d keys processed (%d validity counts cleared)\n"
-msgstr "%d本ã®éµã‚’å‡¦ç† (ã†ã¡%d本ã®æœ‰åŠ¹æ€§æ•°ã‚’クリア)\n"
+#, fuzzy, c-format
+#| msgid "%lu keys processed so far\n"
+msgid "%d key processed"
+msgid_plural "%d keys processed"
+msgstr[0] "ã“ã‚Œã¾ã§%lu個ã®éµã‚’処ç†\n"
+
+#, fuzzy, c-format
+#| msgid "%d keys processed (%d validity counts cleared)\n"
+msgid " (%d validity count cleared)\n"
+msgid_plural " (%d validity counts cleared)\n"
+msgstr[0] "%d本ã®éµã‚’å‡¦ç† (ã†ã¡%d本ã®æœ‰åŠ¹æ€§æ•°ã‚’クリア)\n"
msgid "no ultimately trusted keys found\n"
msgstr "究極的ã«ä¿¡ç”¨ã™ã‚‹éµãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“\n"
@@ -5325,10 +5578,6 @@ msgid "public key of ultimately trusted key %s not found\n"
msgstr "究極的ã«ä¿¡ç”¨ã™ã‚‹éµ%sã®å…¬é–‹éµãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“\n"
#, c-format
-msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
-msgstr "'ã¾ãã¾ãã®ä¿¡ç”¨'%dã€'å…¨é¢çš„信用'%dã€%s信用モデル\n"
-
-#, c-format
msgid ""
"depth: %d valid: %3d signed: %3d trust: %d-, %dq, %dn, %dm, %df, %du\n"
msgstr "æ·±ã•: %d 有効性: %3d ç½²å: %3d 信用: %d-, %dq, %dn, %dm, %df, %du\n"
@@ -5523,9 +5772,12 @@ msgstr "カードã‹ã‚‰CHVステイタスã®å–å¾—ã§ã‚¨ãƒ©ãƒ¼\n"
msgid "card is permanently locked!\n"
msgstr "カードãŒæ°¸ä¹…ã«ãƒ­ãƒƒã‚¯ã•ã‚Œã¦ã¾ã™!\n"
-#, c-format
-msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
-msgstr "カードã®æ°¸ä¹…ロックå‰ã«%d回ã®ç®¡ç†è€…PINã®è©¦è¡ŒãŒæ®‹ã£ã¦ã„ã¾ã™\n"
+#, fuzzy, c-format
+#| msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
+msgid "%d Admin PIN attempt remaining before card is permanently locked\n"
+msgid_plural ""
+"%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr[0] "カードã®æ°¸ä¹…ロックå‰ã«%d回ã®ç®¡ç†è€…PINã®è©¦è¡ŒãŒæ®‹ã£ã¦ã„ã¾ã™\n"
#. TRANSLATORS: Do not translate the "|A|" prefix but keep it at
#. the start of the string. Use %%0A to force a linefeed.
@@ -5602,9 +5854,11 @@ msgstr "éµç”Ÿæˆã®é–“ã€ãŠå¾…ã¡ãã ã•ã„ ...\n"
msgid "generating key failed\n"
msgstr "éµã®ç”Ÿæˆã«å¤±æ•—ã—ã¾ã—ãŸ\n"
-#, c-format
-msgid "key generation completed (%d seconds)\n"
-msgstr "éµã®ç”ŸæˆãŒå®Œäº†ã—ã¾ã—㟠(%d秒)\n"
+#, fuzzy, c-format
+#| msgid "key generation completed (%d seconds)\n"
+msgid "key generation completed (%d second)\n"
+msgid_plural "key generation completed (%d seconds)\n"
+msgstr[0] "éµã®ç”ŸæˆãŒå®Œäº†ã—ã¾ã—㟠(%d秒)\n"
msgid "invalid structure of OpenPGP card (DO 0x93)\n"
msgstr "OpenPGPカードã«ç„¡åŠ¹ãªæ§‹é€  (データ・オブジェクト 0x93)\n"
@@ -6899,10 +7153,8 @@ msgstr "'%s'ã‚’å–å¾—ã™ã‚‹éš›ã®ã‚¨ãƒ©ãƒ¼: %s\n"
msgid "error retrieving '%s': http status %u\n"
msgstr "'%s'ã®å–得エラー: httpステイタス %u\n"
-#, fuzzy
-#| msgid "CRL access not possible due to TOR mode\n"
msgid "CRL access not possible due to Tor mode\n"
-msgstr "CRLアクセスã¯TORモードã®ãŸã‚ä¸å¯èƒ½ã§ã™\n"
+msgstr "CRLアクセスã¯Torモードã®ãŸã‚ä¸å¯èƒ½ã§ã™\n"
#, c-format
msgid "certificate search not possible due to disabled %s\n"
@@ -7090,10 +7342,8 @@ msgstr "|N|一ã¤ã®ã‚¯ã‚¨ãƒªã§Nを越ãˆã‚‹ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’è¿”ã•ãªã„"
msgid "|FILE|use the CA certificates in FILE for HKP over TLS"
msgstr "|FILE|FILEã«ã‚ã‚‹CA証明書をTLSã§ã®HKPã«ä½¿ã†"
-#, fuzzy
-#| msgid "route all network traffic via TOR"
msgid "route all network traffic via Tor"
-msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ»ãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯ã‚’ã™ã¹ã¦TOR経由ã«ã™ã‚‹"
+msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ»ãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯ã‚’ã™ã¹ã¦Tor経由ã«ã™ã‚‹"
msgid ""
"@\n"
@@ -7385,10 +7635,8 @@ msgstr "応答ã‹ã‚‰ã®èª­ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼: %s\n"
msgid "response from server too large; limit is %d bytes\n"
msgstr "サーãƒã‹ã‚‰ã®å¿œç­”ãŒãŒé•·ã™ãŽã¾ã™ (上é™%dãƒã‚¤ãƒˆ)。\n"
-#, fuzzy
-#| msgid "OCSP request not possible due to TOR mode\n"
msgid "OCSP request not possible due to Tor mode\n"
-msgstr "TORモードã®ãŸã‚OCSPリクエストãŒä¸å¯èƒ½ã§ã™\n"
+msgstr "Torモードã®ãŸã‚OCSPリクエストãŒä¸å¯èƒ½ã§ã™\n"
msgid "OCSP request not possible due to disabled HTTP\n"
msgstr "HTTPãŒåœæ­¢ã•ã‚Œã¦ã„ã‚‹ãŸã‚OCSPリクエストãŒä¸å¯èƒ½ã§ã™\n"
@@ -7415,7 +7663,7 @@ msgstr "'%s'ã¸ã‚¢ã‚¯ã‚»ã‚¹ã®ã‚¨ãƒ©ãƒ¼: httpステイタス %u\n"
#, c-format
msgid "error parsing OCSP response for '%s': %s\n"
-msgstr "'%s'ã«å¯¾ã™ã‚‹OCSP応答解æžã‚¨ãƒ©ãƒ¼: %s\n"
+msgstr "'%s'ã«å¯¾ã™ã‚‹OCSP応答構文解æžã‚¨ãƒ©ãƒ¼: %s\n"
#, c-format
msgid "OCSP responder at '%s' status: %s\n"
@@ -7704,6 +7952,11 @@ msgstr "|N|N日後ã«ãƒ‘スフレーズを期é™åˆ‡ã‚Œã¨ã™ã‚‹"
msgid "do not allow the reuse of old passphrases"
msgstr "å¤ã„パスフレーズをå†ä½¿ç”¨ã™ã‚‹ã“ã¨ã‚’èªã‚ãªã„"
+#, fuzzy
+#| msgid "|N|set LDAP timeout to N seconds"
+msgid "|N|set the Pinentry timeout to N seconds"
+msgstr "|N|LDAPã®ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã‚’N秒ã¨ã™ã‚‹"
+
msgid "|NAME|use NAME as default secret key"
msgstr "|NAME|デフォルトã®ç§˜å¯†éµã¨ã—ã¦NAMEを用ã„ã‚‹"
@@ -7740,10 +7993,8 @@ msgstr "出力フォーマットを制御ã™ã‚‹ã‚ªãƒ—ション"
msgid "Options controlling the interactivity and enforcement"
msgstr "インタラクティビティã¨å¼·åˆ¶ã‚’制御ã™ã‚‹ã‚ªãƒ—ション"
-#, fuzzy
-#| msgid "Options controlling the use of TOR"
msgid "Options controlling the use of Tor"
-msgstr "TORã®ä½¿ç”¨ã‚’制御ã™ã‚‹ã‚ªãƒ—ション"
+msgstr "Torã®ä½¿ç”¨ã‚’制御ã™ã‚‹ã‚ªãƒ—ション"
msgid "Configuration for HTTP servers"
msgstr "HTTPサーãƒã®ã‚³ãƒ³ãƒ•ã‚£ã‚°ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³"
@@ -7993,28 +8244,89 @@ msgstr ""
"å½¢å¼: gpg-check-pattern [オプション] パターンファイル\n"
"パターンファイルã«å¯¾ã—ã¦æ¨™æº–入力ã®ãƒ‘スフレーズを確èªã™ã‚‹\n"
-#~ msgid "cleared passphrase cached with ID: %s\n"
-#~ msgstr "ä¿æŒã—ãŸãƒ‘スフレーズをクリアã—ã¾ã—㟠ID: %s\n"
+#~ msgid "key specification '%s' is ambiguous\n"
+#~ msgstr "éµã®æŒ‡å®š'%s'ã¯ã‚ã„ã¾ã„ã§ã™\n"
-#, fuzzy
-#~| msgid "failed to store the key: %s\n"
-#~ msgid "Failed to open the keyring DB.\n"
-#~ msgstr "éµã®ä¿ç®¡ã«å¤±æ•—ã—ã¾ã—ãŸ: %s\n"
+#~ msgid "'%s' matches at least:\n"
+#~ msgstr "'%s'ã¯æœ€ä½Žã€ä»¥ä¸‹ã«ãƒžãƒƒãƒã—ã¾ã™:\n"
-#, fuzzy
-#~| msgid "failed to open '%s': %s\n"
-#~ msgid "Failed to parse '%s'.\n"
-#~ msgstr "'%s'ãŒé–‹ã‘ã¾ã›ã‚“: %s\n"
+#~ msgid "%d signatures not checked due to missing keys\n"
+#~ msgstr "éµãŒãªã„ãŸã‚%d個ã®ç½²åを検査ã—ã¾ã›ã‚“\n"
-#, fuzzy
-#~| msgid "invalid value\n"
-#~ msgid "invalid value '%s'\n"
-#~ msgstr "無効ãªå€¤\n"
+#~ msgid "%d signatures not checked due to errors\n"
+#~ msgstr "エラーã®ãŸã‚%d個ã®ç½²åを検査ã—ã¾ã›ã‚“\n"
-#, fuzzy
-#~| msgid "error locking keybox: %s\n"
-#~ msgid "error looking up secret key \"%s\": %s\n"
-#~ msgstr "keyboxã®ãƒ­ãƒƒã‚¯ã®ã‚¨ãƒ©ãƒ¼: %s\n"
+#~ msgid "1 user ID without valid self-signature detected\n"
+#~ msgstr "有効ãªè‡ªå·±ç½²åã®ãªã„ユーザIDã‚’1個検出\n"
+
+#~ msgid "Deleted %d signatures.\n"
+#~ msgstr "%d個ã®ç½²åを削除ã—ã¾ã—ãŸã€‚\n"
+
+#~ msgid "User ID \"%s\": %d signatures removed\n"
+#~ msgstr "ユーザID \"%s\": %d ã®ç½²åãŒé™¤åŽ»ã•ã‚Œã¾ã—ãŸ\n"
+
+#~ msgid ""
+#~ "You need a Passphrase to protect your secret key.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "秘密éµã‚’ä¿è­·ã™ã‚‹ãŸã‚ã«ãƒ‘スフレーズãŒã„ã‚Šã¾ã™ã€‚\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Please enter a passphrase to protect the off-card backup of the new "
+#~ "encryption key."
+#~ msgstr ""
+#~ "パスフレーズを入力ã—ã¦ãã ã•ã„。ã“ã‚Œã¯æ–°ã—ã作られる暗å·åŒ–éµã®ã‚«ãƒ¼ãƒ‰å¤–ã®"
+#~ "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã‚’ä¿è­·ã™ã‚‹ã‚‚ã®ã§ã™ã€‚"
+
+#~ msgid "passphrase not correctly repeated; try again"
+#~ msgstr "パスフレーズをã¡ã‚ƒã‚“ã¨ç¹°ã‚Šè¿”ã—ã¦ã„ã¾ã›ã‚“。å†å…¥åŠ›ã—ã¦ãã ã•ã„"
+
+#~ msgid "%s.\n"
+#~ msgstr "%s.\n"
+
+#~ msgid ""
+#~ "You don't want a passphrase - this is probably a *bad* idea!\n"
+#~ "I will do it anyway. You can change your passphrase at any time,\n"
+#~ "using this program with the option \"--edit-key\".\n"
+#~ "\n"
+#~ msgstr ""
+#~ "パスフレーズを必è¦ã¨ã—ãªã„よã†ã§ã™ãŒã€ãŠãらããã‚Œã¯è‰¯ããªã„考ãˆã§ã™!\n"
+#~ "続ã‘ã¾ã™ãŒã€ãƒ‘スフレーズを設定ã™ã‚‹ã“ã¨ã‚’検討ãã ã•ã„。パスフレーズã¯ã€\n"
+#~ "ã“ã®ãƒ—ログラムã®\"--edit-key\"オプションã§ã„ã¤ã§ã‚‚変更ã§ãã¾ã™ã€‚\n"
+#~ "\n"
+
+#~ msgid "storing key onto card failed: %s\n"
+#~ msgstr "カードã¸ã®éµã®ä¿ç®¡ã«å¤±æ•—ã—ã¾ã—ãŸ: %s\n"
+
+#~ msgid "1 good signature\n"
+#~ msgstr "æ­£ã—ã„ç½²å1個\n"
+
+#~ msgid "renaming '%s' to '%s' failed: %s\n"
+#~ msgstr "'%s'ã‹ã‚‰'%s'ã¸åå‰å¤‰æ›´ã«å¤±æ•—: %s\n"
+
+#~ msgid "%lu keys cached (%lu signatures)\n"
+#~ msgstr "%lu個ã®éµã‚’キャッシュ済 (%lu個ã®ç½²å)\n"
+
+#~ msgid "refreshing 1 key from %s\n"
+#~ msgstr "1本ã®éµã‚’%sã‹ã‚‰æ›´æ–°\n"
+
+#~ msgid "sending key %s to %s server %s\n"
+#~ msgstr "éµ%sã‚’%sサーãƒ%sã¸é€ä¿¡\n"
+
+#~ msgid "public key %s is %lu seconds newer than the signature\n"
+#~ msgstr "公開éµ%sã¯ã€ç½²åよりも%lu秒新ã—ã„ã‚‚ã®ã§ã™\n"
+
+#~ msgid ""
+#~ "key %s was created %lu seconds in the future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr "éµ%sã¯%lu秒未æ¥ã«ã§ãã¾ã—㟠(時間歪曲ã‹æ™‚計ã®éšœå®³ã§ã—ょã†)\n"
+
+#~ msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
+#~ msgstr "'ã¾ãã¾ãã®ä¿¡ç”¨'%dã€'å…¨é¢çš„信用'%dã€%s信用モデル\n"
+
+#~ msgid "cleared passphrase cached with ID: %s\n"
+#~ msgstr "ä¿æŒã—ãŸãƒ‘スフレーズをクリアã—ã¾ã—㟠ID: %s\n"
#~ msgid "Please select at most one subkey.\n"
#~ msgstr "高々1個ã®å‰¯éµã‚’é¸æŠžã—ã¦ãã ã•ã„。\n"
diff --git a/po/nb.po b/po/nb.po
index 09f792b..d48d38a 100644
--- a/po/nb.po
+++ b/po/nb.po
@@ -1231,6 +1231,20 @@ msgstr ""
msgid "Enter passphrase: "
msgstr "Tast inn passfrase: "
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "error getting version from '%s': %s\n"
+msgstr "feil ved opprettelse av nøkkelknippet «%s»: %s\n"
+
+#, c-format
+msgid "server '%s' is older than us (%s < %s)"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "WARNING: %s overrides %s\n"
+msgid "WARNING: %s\n"
+msgstr "ADVARSEL: %s overstyrere %s\n"
+
#, c-format
msgid "OpenPGP card not available: %s\n"
msgstr "OpenPGP-kort er ikke tilgjengelig: %s\n"
@@ -1715,6 +1729,11 @@ msgstr ""
msgid "remove as much as possible from key during export"
msgstr ""
+#, fuzzy
+#| msgid "%s: skipped: %s\n"
+msgid " - skipped"
+msgstr "%s: hoppet over: %s\n"
+
msgid "exporting secret keys not allowed\n"
msgstr "eksportering av hemmelige nøkler er ikke tillatt\n"
@@ -1726,18 +1745,35 @@ msgstr "nøkkel %s: PGP 2.x-aktig nøkkel - hoppet over\n"
msgid "key %s: key material on-card - skipped\n"
msgstr "nøkkel %s: nøkkelmateriell på kort - hoppet over\n"
-#, fuzzy
-#| msgid "%s: skipped: %s\n"
-msgid " - skipped"
-msgstr "%s: hoppet over: %s\n"
-
msgid "WARNING: nothing exported\n"
msgstr "ADVARSEL: ingenting eksportert\n"
+#, fuzzy, c-format
+#| msgid "error reading `%s': %s\n"
+msgid "error creating '%s': %s\n"
+msgstr "feil ved lesing av «%s»: %s\n"
+
msgid "[User ID not found]"
msgstr "[Brukerid ikke funnet]"
#, fuzzy, c-format
+msgid "(check argument of option '%s')\n"
+msgstr "ugyldige listevalg\n"
+
+#, c-format
+msgid "Warning: '%s' should be a long key ID or a fingerprint\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error looking up: %s\n"
+msgstr "feil med «%s»: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "Warning: %s appears in the keyring %d times\n"
+msgstr "feil ved opprettelse av nøkkelknippet «%s»: %s\n"
+
+#, fuzzy, c-format
msgid "automatically retrieved '%s' via %s\n"
msgstr "feil ved lesing av «%s»: %s\n"
@@ -1754,15 +1790,20 @@ msgid "secret key \"%s\" not found: %s\n"
msgstr "hemmelig nøkkel «%s» ble ikke funnet: %s\n"
#, fuzzy, c-format
-msgid "(check argument of option '%s')\n"
-msgstr "ugyldige listevalg\n"
+#| msgid "unusable secret key"
+msgid "Warning: not using '%s' as default key: %s\n"
+msgstr "ubrukelig hemmelig nøkkel"
#, fuzzy, c-format
#| msgid "unusable secret key"
-msgid "using \"%s\" as default secret key\n"
+msgid "using \"%s\" as default secret key for signing\n"
msgstr "ubrukelig hemmelig nøkkel"
#, c-format
+msgid "all values passed to '%s' ignored\n"
+msgstr ""
+
+#, c-format
msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
msgstr "Ugyldig nøkkel %s gjort gyldig av --allow-non-selfsigned-uid\n"
@@ -2143,28 +2184,6 @@ msgid "Note: old default options file '%s' ignored\n"
msgstr "MERK: den gamle valgfila «%s» ble ignorert\n"
#, c-format
-msgid ""
-"Warning: value '%s' for option '%s' should be a long key ID or a "
-"fingerprint\n"
-msgstr ""
-
-#, c-format
-msgid "key specification '%s' is ambiguous\n"
-msgstr ""
-
-#. TRANSLATORS: The %s prints a key specification which
-#. for example has been given at the command line. Two
-#. lines with fingerprints are printed after this message.
-#, c-format
-msgid "'%s' matches at least:\n"
-msgstr ""
-
-#, fuzzy, c-format
-#| msgid "error creating keyring `%s': %s\n"
-msgid "error searching the keyring: %s\n"
-msgstr "feil ved opprettelse av nøkkelknippet «%s»: %s\n"
-
-#, c-format
msgid "libgcrypt is too old (need %s, have %s)\n"
msgstr ""
@@ -2366,14 +2385,6 @@ msgid "WARNING: recipients (-r) given without using public key encryption\n"
msgstr ""
"ADVARSEL: mottakere (-r) angitt uten å bruke offentlig nøkkelkryptering\n"
-#, fuzzy, c-format
-msgid "option '%s' given, but no valid default keys given\n"
-msgstr "ugyldig hashalgoritme «%s»\n"
-
-#, fuzzy, c-format
-msgid "option '%s' given, but option '%s' not given\n"
-msgstr "ugyldig hashalgoritme «%s»\n"
-
msgid "--store [filename]"
msgstr "--store [filnavn]"
@@ -2448,6 +2459,11 @@ msgstr "mottak fra nøkkelserver mislyktes: %s\n"
msgid "key export failed: %s\n"
msgstr "nøkkeleksport mislyktes: %s\n"
+#, fuzzy, c-format
+#| msgid "key export failed: %s\n"
+msgid "export as ssh key failed: %s\n"
+msgstr "nøkkeleksport mislyktes: %s\n"
+
#, c-format
msgid "keyserver search failed: %s\n"
msgstr "søk på nøkkelserver mislyktes: %s\n"
@@ -2935,33 +2951,33 @@ msgstr "[oppheving]"
msgid "[self-signature]"
msgstr "[selvsignatur]"
-msgid "1 bad signature\n"
-msgstr "1 ubrukelig signatur\n"
-
-#, c-format
-msgid "%d bad signatures\n"
-msgstr "%d ubrukelige signaturer\n"
-
-msgid "1 signature not checked due to a missing key\n"
-msgstr "1 signatur ble ikke sjekket på grunn av en manglende nøkkel\n"
-
-#, c-format
-msgid "%d signatures not checked due to missing keys\n"
-msgstr "%d signaturer ble ikke sjekket på grunn av manglende nøkler\n"
-
-msgid "1 signature not checked due to an error\n"
-msgstr "1 signatur ble ikke sjekket på grunn av en feil\n"
+#, fuzzy, c-format
+#| msgid "%d bad signatures\n"
+msgid "%d bad signature\n"
+msgid_plural "%d bad signatures\n"
+msgstr[0] "%d ubrukelige signaturer\n"
+msgstr[1] "%d ubrukelige signaturer\n"
-#, c-format
-msgid "%d signatures not checked due to errors\n"
-msgstr "%d signaturer ble ikke sjekket på grunn av feil\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to a missing key\n"
+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 signatur ble ikke sjekket på grunn av en manglende nøkkel\n"
+msgstr[1] "1 signatur ble ikke sjekket på grunn av en manglende nøkkel\n"
-msgid "1 user ID without valid self-signature detected\n"
-msgstr "1 brukerid uten gyldig selvsignatur ble oppdaget\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to an error\n"
+msgid "%d signature not checked due to an error\n"
+msgid_plural "%d signatures not checked due to errors\n"
+msgstr[0] "1 signatur ble ikke sjekket på grunn av en feil\n"
+msgstr[1] "1 signatur ble ikke sjekket på grunn av en feil\n"
-#, c-format
-msgid "%d user IDs without valid self-signatures detected\n"
-msgstr "%d brukerider uten gyldige selvsignaturer ble oppdaget\n"
+#, fuzzy, c-format
+#| msgid "%d user IDs without valid self-signatures detected\n"
+msgid "%d user ID without valid self-signature detected\n"
+msgid_plural "%d user IDs without valid self-signatures detected\n"
+msgstr[0] "%d brukerider uten gyldige selvsignaturer ble oppdaget\n"
+msgstr[1] "%d brukerider uten gyldige selvsignaturer ble oppdaget\n"
msgid ""
"Please decide how far you trust this user to correctly verify other users' "
@@ -3526,13 +3542,12 @@ msgstr ""
msgid "Really delete this self-signature? (y/N)"
msgstr ""
-#, c-format
+#, fuzzy, c-format
+#| msgid "Deleted %d signature.\n"
msgid "Deleted %d signature.\n"
-msgstr "Slettet %d signatur.\n"
-
-#, c-format
-msgid "Deleted %d signatures.\n"
-msgstr "Slettet %d signaturer.\n"
+msgid_plural "Deleted %d signatures.\n"
+msgstr[0] "Slettet %d signatur.\n"
+msgstr[1] "Slettet %d signatur.\n"
msgid "Nothing deleted.\n"
msgstr "Ingen ble slettet.\n"
@@ -3546,11 +3561,9 @@ msgstr "brukerid «%s»: allerede renset\n"
#, fuzzy, c-format
msgid "User ID \"%s\": %d signature removed\n"
-msgstr "nøkkel: %s: «%s» %d nye signaturer\n"
-
-#, fuzzy, c-format
-msgid "User ID \"%s\": %d signatures removed\n"
-msgstr "nøkkel: %s: «%s» %d nye signaturer\n"
+msgid_plural "User ID \"%s\": %d signatures removed\n"
+msgstr[0] "nøkkel: %s: «%s» %d nye signaturer\n"
+msgstr[1] "nøkkel: %s: «%s» %d nye signaturer\n"
#, fuzzy, c-format
msgid "User ID \"%s\": already minimized\n"
@@ -4075,39 +4088,6 @@ msgid "Please correct the error first\n"
msgstr "Vennligst korriger feilen først\n"
msgid ""
-"You need a Passphrase to protect your secret key.\n"
-"\n"
-msgstr ""
-"Du trenger en passfrase for å beskytte din hemmelige nøkkel.\n"
-"\n"
-
-#, fuzzy
-msgid ""
-"Please enter a passphrase to protect the off-card backup of the new "
-"encryption key."
-msgstr ""
-"Du trenger en passfrase for å beskytte din hemmelige nøkkel.\n"
-"\n"
-
-msgid "passphrase not correctly repeated; try again"
-msgstr "passfrasen ble ikke gjentatt korrekt; prøv igjen"
-
-#, c-format
-msgid "%s.\n"
-msgstr "%s.\n"
-
-msgid ""
-"You don't want a passphrase - this is probably a *bad* idea!\n"
-"I will do it anyway. You can change your passphrase at any time,\n"
-"using this program with the option \"--edit-key\".\n"
-"\n"
-msgstr ""
-"Du vil ikke ha en passfrase - dette er sannsynligvis en *dum* idé!\n"
-"Jeg fortsetter likevel. Du kan endre passfrasen din når som helst ved\n"
-"hjelp av dette programmet og valget «--edit-key».\n"
-"\n"
-
-msgid ""
"We need to generate a lot of random bytes. It is a good idea to perform\n"
"some other action (type on the keyboard, move the mouse, utilize the\n"
"disks) during the prime generation; this gives the random number\n"
@@ -4155,6 +4135,15 @@ msgid "Key generation canceled.\n"
msgstr "Nøkkelgenereringen ble avbrutt.\n"
#, fuzzy, c-format
+#| msgid "can't create backup file `%s': %s\n"
+msgid "can't create backup file '%s': %s\n"
+msgstr "kan ikke opprette sikkerhetskopifil «%s»: %s\n"
+
+#, c-format
+msgid "Note: backup of card key saved to '%s'\n"
+msgstr ""
+
+#, fuzzy, c-format
#| msgid "writing public key to `%s'\n"
msgid "writing public key to '%s'\n"
msgstr "skriver offentlig nøkkel til «%s»\n"
@@ -4211,19 +4200,6 @@ msgstr "Hemmelige deler av primærnøkkelen er lagret på kort.\n"
msgid "Really create? (y/N) "
msgstr "Virkelig opprette? (j/N)"
-#, c-format
-msgid "storing key onto card failed: %s\n"
-msgstr "lagring av nøkkel på kort mislyktes: %s\n"
-
-#, fuzzy, c-format
-#| msgid "can't create backup file `%s': %s\n"
-msgid "can't create backup file '%s': %s\n"
-msgstr "kan ikke opprette sikkerhetskopifil «%s»: %s\n"
-
-#, c-format
-msgid "Note: backup of card key saved to '%s'\n"
-msgstr ""
-
msgid "never "
msgstr ""
@@ -4242,19 +4218,18 @@ msgstr ""
msgid "Signature notation: "
msgstr ""
-#, fuzzy
-#| msgid "1 bad signature\n"
-msgid "1 good signature\n"
-msgstr "1 ubrukelig signatur\n"
-
#, fuzzy, c-format
#| msgid "%d bad signatures\n"
-msgid "%d good signatures\n"
-msgstr "%d ubrukelige signaturer\n"
+msgid "%d good signature\n"
+msgid_plural "%d good signatures\n"
+msgstr[0] "%d ubrukelige signaturer\n"
+msgstr[1] "%d ubrukelige signaturer\n"
#, c-format
-msgid "Warning: %lu key(s) skipped due to their large size\n"
-msgstr ""
+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] ""
msgid "Keyring"
msgstr "Nøkkelknippe"
@@ -4284,22 +4259,29 @@ msgid " Card serial no. ="
msgstr " Serienummer for kort ="
#, fuzzy, c-format
-#| msgid "renaming `%s' to `%s' failed: %s\n"
-msgid "renaming '%s' to '%s' failed: %s\n"
-msgstr "omdøping fra «%s» til «%s» mislyktes: %s\n"
-
-#, fuzzy, c-format
#| msgid "caching keyring `%s'\n"
msgid "caching keyring '%s'\n"
msgstr "cacher nøkkelknippet «%s»\n"
-#, c-format
-msgid "%lu keys cached so far (%lu signatures)\n"
-msgstr "%lu nøkler cachet så langt (%lu signaturer)\n"
+#, fuzzy, c-format
+#| msgid "%lu keys cached so far (%lu signatures)\n"
+msgid "%lu keys cached so far (%lu signature)\n"
+msgid_plural "%lu keys cached so far (%lu signatures)\n"
+msgstr[0] "%lu nøkler cachet så langt (%lu signaturer)\n"
+msgstr[1] "%lu nøkler cachet så langt (%lu signaturer)\n"
#, c-format
-msgid "%lu keys cached (%lu signatures)\n"
-msgstr "%lu nøkler cachet (%lu signaturer)\n"
+msgid "%lu key cached"
+msgid_plural "%lu keys cached"
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+#| msgid "1 bad signature\n"
+msgid " (%lu signature)\n"
+msgid_plural " (%lu signatures)\n"
+msgstr[0] "1 ubrukelig signatur\n"
+msgstr[1] "1 ubrukelig signatur\n"
#, c-format
msgid "%s: keyring created\n"
@@ -4340,19 +4322,18 @@ msgstr ""
msgid "\"%s\" not a key ID: skipping\n"
msgstr ""
-#, c-format
-msgid "refreshing 1 key from %s\n"
-msgstr "oppfrisker 1 nøkkel fra %s\n"
+#, fuzzy, c-format
+#| msgid "refreshing %d keys from %s\n"
+msgid "refreshing %d key from %s\n"
+msgid_plural "refreshing %d keys from %s\n"
+msgstr[0] "oppfrisker %d nøkler fra %s\n"
+msgstr[1] "oppfrisker %d nøkler fra %s\n"
#, c-format
msgid "WARNING: unable to refresh key %s via %s: %s\n"
msgstr "ADVARSEL: klarte ikke å oppfriske nøkkel %s via %s: %s\n"
#, c-format
-msgid "refreshing %d keys from %s\n"
-msgstr "oppfrisker %d nøkler fra %s\n"
-
-#, c-format
msgid "key \"%s\" not found on keyserver\n"
msgstr "nøkkelen «%s» ble ikke funnet på nøkkelserveren\n"
@@ -4370,9 +4351,10 @@ msgstr "ber om nøkkelen %s fra %s server %s\n"
msgid "requesting key %s from %s\n"
msgstr "ber om nøkkel %s fra %s\n"
-#, c-format
-msgid "sending key %s to %s server %s\n"
-msgstr ""
+#, fuzzy
+#| msgid "no keyserver action!\n"
+msgid "no keyserver known\n"
+msgstr "ingen handling for nøkkelserver!\n"
#, c-format
msgid "sending key %s to %s\n"
@@ -4591,6 +4573,19 @@ msgstr "ADVARSEL: digestalgoritmen «%s» er avlegs\n"
msgid "Note: signatures using the %s algorithm are rejected\n"
msgstr "%s signatur, digestalgoritme %s\n"
+#, fuzzy, c-format
+#| msgid "read error in `%s': %s\n"
+msgid "(reported error: %s)\n"
+msgstr "lesefeil ved «%s»: %s\n"
+
+#, fuzzy, c-format
+#| msgid "read error in `%s': %s\n"
+msgid "(reported error: %s <%s>)\n"
+msgstr "lesefeil ved «%s»: %s\n"
+
+msgid "(further info: "
+msgstr ""
+
#, c-format
msgid "%s:%d: deprecated option \"%s\"\n"
msgstr ""
@@ -4997,6 +4992,19 @@ msgstr "%s: hoppet over: offentlig nøkkel er utkoblet\n"
msgid "%s: skipped: public key already present\n"
msgstr "%s: hoppet over: offentlig nøkkel er allerede tilstede\n"
+#, fuzzy, c-format
+#| msgid "can't close `%s': %s\n"
+msgid "can't encrypt to '%s'\n"
+msgstr "kan ikke lukke «%s»: %s\n"
+
+#, fuzzy, c-format
+msgid "option '%s' given, but no valid default keys given\n"
+msgstr "ugyldig hashalgoritme «%s»\n"
+
+#, fuzzy, c-format
+msgid "option '%s' given, but option '%s' not given\n"
+msgstr "ugyldig hashalgoritme «%s»\n"
+
msgid "You did not specify a user ID. (you may use \"-r\")\n"
msgstr "Du oppga ikke en brukerid. (Du kan bruke «-r»)\n"
@@ -5040,11 +5048,6 @@ msgstr "nøkkel %s: ingen brukerid\n"
msgid "data not saved; use option \"--output\" to save it\n"
msgstr ""
-#, fuzzy, c-format
-#| msgid "error reading `%s': %s\n"
-msgid "error creating '%s': %s\n"
-msgstr "feil ved lesing av «%s»: %s\n"
-
msgid "Detached signature.\n"
msgstr ""
@@ -5135,19 +5138,31 @@ msgid "This is a revocation certificate for the OpenPGP key:"
msgstr "Lage et opphevingssertifikat for denne nøkkelen? (j/N) "
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 ""
+
+msgid ""
"Use it to revoke this key in case of a compromise or loss of\n"
"the secret key. However, if the secret key is still accessible,\n"
"it is better to generate a new revocation certificate and give\n"
-"a reason for the revocation."
+"a reason for the revocation. For details see the description of\n"
+"of the gpg command \"--gen-revoke\" in the GnuPG manual."
msgstr ""
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 making use of this revocation certificate."
+"before importing and publishing this revocation certificate."
msgstr ""
#, fuzzy, c-format
+#| msgid "key %s: \"%s\" revocation certificate imported\n"
+msgid "revocation certificate stored as '%s.rev'\n"
+msgstr "nøkkel %s: «%s» opphevingssertifikat importert\n"
+
+#, fuzzy, c-format
#| msgid "secret key \"%s\" not found: %s\n"
msgid "secret key \"%s\" not found\n"
msgstr "hemmelig nøkkel «%s» ble ikke funnet: %s\n"
@@ -5159,6 +5174,11 @@ msgstr "hemmelig nøkkel «%s» ble ikke funnet: %s\n"
msgid "'%s' matches multiple secret keys:\n"
msgstr ""
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "error searching the keyring: %s\n"
+msgstr "feil ved opprettelse av nøkkelknippet «%s»: %s\n"
+
msgid "Create a revocation certificate for this key? (y/N) "
msgstr "Lage et opphevingssertifikat for denne nøkkelen? (j/N) "
@@ -5229,26 +5249,44 @@ msgstr ""
#, c-format
msgid "public key %s is %lu second newer than the signature\n"
-msgstr ""
+msgid_plural "public key %s is %lu seconds newer than the signature\n"
+msgstr[0] ""
+msgstr[1] ""
-#, c-format
-msgid "public key %s is %lu seconds newer than the signature\n"
-msgstr ""
+#, fuzzy, c-format
+#| msgid "key %s: \"%s\" %d new signatures\n"
+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] "nøkkel: %s: «%s» %d nye signaturer\n"
+msgstr[1] "nøkkel: %s: «%s» %d nye signaturer\n"
# Er dette entallsformen av denne strengen?
-#, c-format
+#, fuzzy, c-format
+#| msgid ""
+#| "key %s was created %lu second in the future (time warp or clock problem)\n"
msgid ""
"key %s was created %lu second in the future (time warp or clock problem)\n"
-msgstr ""
+msgid_plural ""
+"key %s was created %lu seconds in the future (time warp or clock problem)\n"
+msgstr[0] ""
+"nøkkel %s ble opprettet %lu sekund i fremtiden (time warp eller "
+"klokkeproblem)\n"
+msgstr[1] ""
"nøkkel %s ble opprettet %lu sekund i fremtiden (time warp eller "
"klokkeproblem)\n"
-# Er dette flertallsformen av denne og den forrige strengen?
-#, c-format
-msgid ""
-"key %s was created %lu seconds in the future (time warp or clock problem)\n"
-msgstr ""
-"nøkkel %s ble opprettet %lu sekunder i fremtiden (time warp eller "
+# Er dette entallsformen av denne strengen?
+#, fuzzy, c-format
+#| msgid ""
+#| "key %s was created %lu second in the future (time warp or clock problem)\n"
+msgid "key %s was created %lu day in the future (time warp or clock problem)\n"
+msgid_plural ""
+"key %s was created %lu days in the future (time warp or clock problem)\n"
+msgstr[0] ""
+"nøkkel %s ble opprettet %lu sekund i fremtiden (time warp eller "
+"klokkeproblem)\n"
+msgstr[1] ""
+"nøkkel %s ble opprettet %lu sekund i fremtiden (time warp eller "
"klokkeproblem)\n"
#, fuzzy, c-format
@@ -5473,6 +5511,237 @@ msgid "input line longer than %d characters\n"
msgstr ""
#, fuzzy, c-format
+msgid "error beginning transaction on TOFU database: %s\n"
+msgstr "feil ved søking etter tillitspost i «%s»: %s\n"
+
+#, c-format
+msgid "error committing transaction on TOFU database: %s\n"
+msgstr ""
+
+#, c-format
+msgid "error rolling back transaction on TOFU database: %s\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "unsupported TOFU database version: %s\n"
+msgstr ""
+"\n"
+"Støttede algoritmer:\n"
+
+#, fuzzy, c-format
+msgid "error reading TOFU database: %s\n"
+msgstr "feil ved lesing av «%s»: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error writing secret keyring `%s': %s\n"
+msgid "error determining TOFU database's version: %s\n"
+msgstr "feil ved skriving av hemmelig nøkkelknippe «%s»: %s\n"
+
+#, fuzzy, c-format
+msgid "error initializing TOFU database: %s\n"
+msgstr "feil ved søking etter tillitspost i «%s»: %s\n"
+
+#, fuzzy, c-format
+msgid "error opening TOFU database '%s': %s\n"
+msgstr "feil med «%s»: %s\n"
+
+msgid "Warning: Home directory contains both tofu.db and tofu.d.\n"
+msgstr ""
+
+msgid "Using split format for TOFU database\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error updating TOFU database: %s\n"
+msgstr "feil ved lesing av «%s»: %s\n"
+
+#, c-format
+msgid "public key %s not found: %s\n"
+msgstr "fant ikke offentlig nøkkel %s: %s\n"
+
+#, fuzzy, c-format
+msgid "error setting TOFU binding's trust level to %s\n"
+msgstr "feil ved lesing av «%s»: %s\n"
+
+#, c-format
+msgid "The binding %s is NOT known."
+msgstr ""
+
+#, c-format
+msgid ""
+"The key %s raised a conflict with this binding (%s). Since this binding's "
+"policy was 'auto', it was changed to 'ask'."
+msgstr ""
+
+#, c-format
+msgid ""
+"Please indicate whether you believe the binding %s%sis legitimate (the key "
+"belongs to the stated owner) or a forgery (bad)."
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "error getting new PIN: %s\n"
+msgid "error gathering other user IDs: %s\n"
+msgstr "feil ved henting av ny PIN: %s\n"
+
+msgid "Known user IDs associated with this key:\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "validity: %s"
+msgid "policy: %s"
+msgstr "gyldighet: %s"
+
+#, fuzzy, c-format
+msgid "error gathering signature stats: %s\n"
+msgstr "feil ved henting av ny PIN: %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] ""
+msgstr[1] ""
+
+#, c-format
+msgid "Statistics for keys with the email address \"%s\":\n"
+msgstr ""
+
+#, fuzzy
+#| msgid "list keys"
+msgid "this key"
+msgstr "liste nøkler"
+
+#, c-format
+msgid "%ld message signed in the future."
+msgid_plural "%ld messages signed in the future."
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+msgid "%ld message signed"
+msgid_plural "%ld messages signed"
+msgstr[0] "|algo [filer]|skrive meldingsdigester"
+msgstr[1] "|algo [filer]|skrive meldingsdigester"
+
+#, c-format
+msgid " over the past %ld day."
+msgid_plural " over the past %ld days."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid " over the past %ld week."
+msgid_plural " over the past %ld weeks."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid " over the past %ld month."
+msgid_plural " over the past %ld months."
+msgstr[0] ""
+msgstr[1] ""
+
+#. 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 ""
+
+#. 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 ""
+
+msgid "(G)ood, (A)ccept once, (U)nknown, (R)eject once, (B)ad? "
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error changing TOFU policy: %s\n"
+msgstr "feil ved opprettelse av passfrase: %s\n"
+
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "Have never verified a message signed by key %s!\n"
+msgstr ""
+
+#, c-format
+msgid "Failed to collect signature statistics for \"%s\" (key %s)\n"
+msgstr ""
+
+#, c-format
+msgid "Verified 0 messages signed by \"%s\" (key: %s, policy: %s)."
+msgstr ""
+
+#. TRANSLATORS: The final %s is replaced by a string like
+#. "7 months, 1 day, 5 minutes, 0 seconds".
+#, c-format
+msgid ""
+"Verified %ld message signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgid_plural ""
+"Verified %ld messages signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "The most recent message was verified %s ago."
+msgstr ""
+
+msgid "Warning: we've have yet to see a message signed by this key!\n"
+msgstr ""
+
+msgid "Warning: we've only seen a single message signed by this key!\n"
+msgstr ""
+
+#. TRANSLATORS: translate the below text. We don't
+#. directly internationalize that text so that we can
+#. tweak it without breaking translations.
+#, c-format
+msgid "TOFU: few signatures %d message %s"
+msgid_plural "TOFU: few signatures %d messages %s"
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+msgid "error opening TOFU database: %s\n"
+msgstr "feil ved lesing av «%s»: %s\n"
+
+#, fuzzy, c-format
#| msgid "`%s' is not a valid character set\n"
msgid "'%s' is not a valid long keyID\n"
msgstr "«%s» er ikke et gyldig tegnsett\n"
@@ -5530,19 +5799,24 @@ msgstr ""
msgid "no need for a trustdb update with '%s' trust model\n"
msgstr ""
-#, c-format
-msgid "public key %s not found: %s\n"
-msgstr "fant ikke offentlig nøkkel %s: %s\n"
-
msgid "please do a --check-trustdb\n"
msgstr ""
msgid "checking the trustdb\n"
msgstr ""
+#, fuzzy, c-format
+#| msgid "%lu keys processed so far\n"
+msgid "%d key processed"
+msgid_plural "%d keys processed"
+msgstr[0] "%lu nøkler behandlet hittil\n"
+msgstr[1] "%lu nøkler behandlet hittil\n"
+
#, c-format
-msgid "%d keys processed (%d validity counts cleared)\n"
-msgstr ""
+msgid " (%d validity count cleared)\n"
+msgid_plural " (%d validity counts cleared)\n"
+msgstr[0] ""
+msgstr[1] ""
msgid "no ultimately trusted keys found\n"
msgstr ""
@@ -5552,10 +5826,6 @@ msgid "public key of ultimately trusted key %s not found\n"
msgstr ""
#, c-format
-msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
-msgstr ""
-
-#, c-format
msgid ""
"depth: %d valid: %3d signed: %3d trust: %d-, %dq, %dn, %dm, %df, %du\n"
msgstr ""
@@ -5748,9 +6018,13 @@ msgstr "feil ved henting av CHV-status fra kort\n"
msgid "card is permanently locked!\n"
msgstr "kort er permanent låst!\n"
-#, c-format
-msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
-msgstr "%d Admin PIN-forsøk før kortet blir låst permanent\n"
+#, fuzzy, c-format
+#| msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
+msgid "%d Admin PIN attempt remaining before card is permanently locked\n"
+msgid_plural ""
+"%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr[0] "%d Admin PIN-forsøk før kortet blir låst permanent\n"
+msgstr[1] "%d Admin PIN-forsøk før kortet blir låst permanent\n"
#. TRANSLATORS: Do not translate the "|A|" prefix but keep it at
#. the start of the string. Use %%0A to force a linefeed.
@@ -5834,9 +6108,12 @@ msgstr "vennligst vent mens nøkkel blir generert ...\n"
msgid "generating key failed\n"
msgstr "nøkkelgenerering mislyktes\n"
-#, c-format
-msgid "key generation completed (%d seconds)\n"
-msgstr "nøkkelgenerering fullført (%d sekunder)\n"
+#, fuzzy, c-format
+#| msgid "key generation completed (%d seconds)\n"
+msgid "key generation completed (%d second)\n"
+msgid_plural "key generation completed (%d seconds)\n"
+msgstr[0] "nøkkelgenerering fullført (%d sekunder)\n"
+msgstr[1] "nøkkelgenerering fullført (%d sekunder)\n"
msgid "invalid structure of OpenPGP card (DO 0x93)\n"
msgstr "ugyldig struktur i OpenPGP-kort (DO 0x93)\n"
@@ -8041,6 +8318,9 @@ msgstr ""
msgid "do not allow the reuse of old passphrases"
msgstr "feil ved opprettelse av passfrase: %s\n"
+msgid "|N|set the Pinentry timeout to N seconds"
+msgstr ""
+
msgid "|NAME|use NAME as default secret key"
msgstr ""
@@ -8336,6 +8616,81 @@ msgid ""
"Check a passphrase given on stdin against the patternfile\n"
msgstr ""
+#~ msgid "%d signatures not checked due to missing keys\n"
+#~ msgstr "%d signaturer ble ikke sjekket på grunn av manglende nøkler\n"
+
+#~ msgid "%d signatures not checked due to errors\n"
+#~ msgstr "%d signaturer ble ikke sjekket på grunn av feil\n"
+
+#~ msgid "1 user ID without valid self-signature detected\n"
+#~ msgstr "1 brukerid uten gyldig selvsignatur ble oppdaget\n"
+
+#~ msgid "Deleted %d signatures.\n"
+#~ msgstr "Slettet %d signaturer.\n"
+
+#, fuzzy
+#~ msgid "User ID \"%s\": %d signatures removed\n"
+#~ msgstr "nøkkel: %s: «%s» %d nye signaturer\n"
+
+#~ msgid ""
+#~ "You need a Passphrase to protect your secret key.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Du trenger en passfrase for å beskytte din hemmelige nøkkel.\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "Please enter a passphrase to protect the off-card backup of the new "
+#~ "encryption key."
+#~ msgstr ""
+#~ "Du trenger en passfrase for å beskytte din hemmelige nøkkel.\n"
+#~ "\n"
+
+#~ msgid "passphrase not correctly repeated; try again"
+#~ msgstr "passfrasen ble ikke gjentatt korrekt; prøv igjen"
+
+#~ msgid "%s.\n"
+#~ msgstr "%s.\n"
+
+#~ msgid ""
+#~ "You don't want a passphrase - this is probably a *bad* idea!\n"
+#~ "I will do it anyway. You can change your passphrase at any time,\n"
+#~ "using this program with the option \"--edit-key\".\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Du vil ikke ha en passfrase - dette er sannsynligvis en *dum* idé!\n"
+#~ "Jeg fortsetter likevel. Du kan endre passfrasen din når som helst ved\n"
+#~ "hjelp av dette programmet og valget «--edit-key».\n"
+#~ "\n"
+
+#~ msgid "storing key onto card failed: %s\n"
+#~ msgstr "lagring av nøkkel på kort mislyktes: %s\n"
+
+#, fuzzy
+#~| msgid "1 bad signature\n"
+#~ msgid "1 good signature\n"
+#~ msgstr "1 ubrukelig signatur\n"
+
+#, fuzzy
+#~| msgid "renaming `%s' to `%s' failed: %s\n"
+#~ msgid "renaming '%s' to '%s' failed: %s\n"
+#~ msgstr "omdøping fra «%s» til «%s» mislyktes: %s\n"
+
+#~ msgid "%lu keys cached (%lu signatures)\n"
+#~ msgstr "%lu nøkler cachet (%lu signaturer)\n"
+
+#~ msgid "refreshing 1 key from %s\n"
+#~ msgstr "oppfrisker 1 nøkkel fra %s\n"
+
+# Er dette flertallsformen av denne og den forrige strengen?
+#~ msgid ""
+#~ "key %s was created %lu seconds in the future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "nøkkel %s ble opprettet %lu sekunder i fremtiden (time warp eller "
+#~ "klokkeproblem)\n"
+
#, fuzzy
#~| msgid "failed to store the key: %s\n"
#~ msgid "Failed to open the keyring DB.\n"
@@ -8513,9 +8868,6 @@ msgstr ""
#~ msgid "searching for \"%s\" from %s\n"
#~ msgstr "søker etter «%s» fra %s\n"
-#~ msgid "no keyserver action!\n"
-#~ msgstr "ingen handling for nøkkelserver!\n"
-
#~ msgid "keyserver did not send VERSION\n"
#~ msgstr "nøkkelserver sendte ikke VERSION\n"
diff --git a/po/pl.po b/po/pl.po
index 5fd2922..9936e87 100644
--- a/po/pl.po
+++ b/po/pl.po
@@ -1264,6 +1264,20 @@ msgstr "nie uda³o siê przekazaæ zapytania %s do klienta\n"
msgid "Enter passphrase: "
msgstr "Has³o\n"
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "error getting version from '%s': %s\n"
+msgstr "b³±d tworzenia zbioru kluczy `%s': %s\n"
+
+#, c-format
+msgid "server '%s' is older than us (%s < %s)"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "WARNING: %s overrides %s\n"
+msgid "WARNING: %s\n"
+msgstr "OSTRZE¯ENIE: %s powoduje obej¶cie %s\n"
+
#, c-format
msgid "OpenPGP card not available: %s\n"
msgstr "Karta OpenPGP niedostêpna: %s\n"
@@ -1757,6 +1771,11 @@ msgstr "usuniêcie bezu¿ytecznych czê¶ci z klucza przy eksporcie"
msgid "remove as much as possible from key during export"
msgstr "usuniêcie jak najwiêkszej czê¶ci klucza przy eksporcie"
+#, fuzzy
+#| msgid "%s: skipped: %s\n"
+msgid " - skipped"
+msgstr "%s: pominiêty: %s\n"
+
msgid "exporting secret keys not allowed\n"
msgstr "eksport kluczy tajnych nie jest dozwolony\n"
@@ -1768,18 +1787,37 @@ msgstr "klucz %s: klucz PGP 2.x - pominiêty\n"
msgid "key %s: key material on-card - skipped\n"
msgstr "klucz %s: zawarto¶æ klucza na karcie - pominiêto\n"
-#, fuzzy
-#| msgid "%s: skipped: %s\n"
-msgid " - skipped"
-msgstr "%s: pominiêty: %s\n"
-
msgid "WARNING: nothing exported\n"
msgstr "OSTRZE¯ENIE: nic nie zosta³o wyeksportowane!\n"
+#, fuzzy, c-format
+#| msgid "error creating `%s': %s\n"
+msgid "error creating '%s': %s\n"
+msgstr "b³±d tworzenia ,,%s'': %s\n"
+
msgid "[User ID not found]"
msgstr "[brak identyfikatora u¿ytkownika]"
#, fuzzy, c-format
+#| msgid "missing argument for option \"%.50s\"\n"
+msgid "(check argument of option '%s')\n"
+msgstr "brak argumentu dla opcji ,,%.50s''\n"
+
+#, c-format
+msgid "Warning: '%s' should be a long key ID or a fingerprint\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "error closing %s: %s\n"
+msgid "error looking up: %s\n"
+msgstr "b³±d zamykania %s: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "Warning: %s appears in the keyring %d times\n"
+msgstr "b³±d tworzenia zbioru kluczy `%s': %s\n"
+
+#, fuzzy, c-format
#| msgid "automatically retrieved `%s' via %s\n"
msgid "automatically retrieved '%s' via %s\n"
msgstr "automatycznie pobrano `%s' poprzez %s\n"
@@ -1797,16 +1835,20 @@ msgid "secret key \"%s\" not found: %s\n"
msgstr "klucz prywatny ,,%s'' nie zosta³ odnaleziony: %s\n"
#, fuzzy, c-format
-#| msgid "missing argument for option \"%.50s\"\n"
-msgid "(check argument of option '%s')\n"
-msgstr "brak argumentu dla opcji ,,%.50s''\n"
+#| msgid "|NAME|use NAME as default secret key"
+msgid "Warning: not using '%s' as default key: %s\n"
+msgstr "|NAZWA|u¿ycie NAZWY jako domy¶lnego klucza tajnego"
#, fuzzy, c-format
#| msgid "|NAME|use NAME as default secret key"
-msgid "using \"%s\" as default secret key\n"
+msgid "using \"%s\" as default secret key for signing\n"
msgstr "|NAZWA|u¿ycie NAZWY jako domy¶lnego klucza tajnego"
#, c-format
+msgid "all values passed to '%s' ignored\n"
+msgstr ""
+
+#, c-format
msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
msgstr ""
"Opcja --allow-non-selfsigned-uid wymusi³a uznanie za poprawny klucza %s.\n"
@@ -2194,29 +2236,6 @@ msgid "Note: old default options file '%s' ignored\n"
msgstr "UWAGA: stary domy¶lny plik opcji ,,%s'' zosta³ zignorowany\n"
#, c-format
-msgid ""
-"Warning: value '%s' for option '%s' should be a long key ID or a "
-"fingerprint\n"
-msgstr ""
-
-#, fuzzy, c-format
-#| msgid "option \"%.50s\" is ambiguous\n"
-msgid "key specification '%s' is ambiguous\n"
-msgstr "opcja ,,%.50s'' jest niejednoznaczna\n"
-
-#. TRANSLATORS: The %s prints a key specification which
-#. for example has been given at the command line. Two
-#. lines with fingerprints are printed after this message.
-#, c-format
-msgid "'%s' matches at least:\n"
-msgstr ""
-
-#, fuzzy, c-format
-#| msgid "error creating keyring `%s': %s\n"
-msgid "error searching the keyring: %s\n"
-msgstr "b³±d tworzenia zbioru kluczy `%s': %s\n"
-
-#, c-format
msgid "libgcrypt is too old (need %s, have %s)\n"
msgstr ""
"biblioteka libgcrypt jest zbyt stara (potrzebna %s, zainstalowana %s)\n"
@@ -2423,16 +2442,6 @@ msgstr "inicjowanie Bazy Zaufania nie powiod³o siê: %s\n"
msgid "WARNING: recipients (-r) given without using public key encryption\n"
msgstr "OSTRZE¯ENIE: podano adresatów (-r) w dzia³aniu które ich nie dotyczy\n"
-#, fuzzy, c-format
-#| msgid "line %d: invalid algorithm\n"
-msgid "option '%s' given, but no valid default keys given\n"
-msgstr "linia %d: niew³a¶ciwy algorytm\n"
-
-#, fuzzy, c-format
-#| msgid "line %d: invalid algorithm\n"
-msgid "option '%s' given, but option '%s' not given\n"
-msgstr "linia %d: niew³a¶ciwy algorytm\n"
-
msgid "--store [filename]"
msgstr "--store [plik]"
@@ -2506,6 +2515,11 @@ msgstr "odbiór z serwera kluczy nie powiód³ siê: %s\n"
msgid "key export failed: %s\n"
msgstr "eksport kluczy nie powiód³ siê: %s\n"
+#, fuzzy, c-format
+#| msgid "key export failed: %s\n"
+msgid "export as ssh key failed: %s\n"
+msgstr "eksport kluczy nie powiód³ siê: %s\n"
+
#, c-format
msgid "keyserver search failed: %s\n"
msgstr "szukanie w serwerze kluczy nie powiod³o siê: %s\n"
@@ -3006,33 +3020,39 @@ msgstr "[uniewa¿nienie]"
msgid "[self-signature]"
msgstr "[podpis klucza nim samym]"
-msgid "1 bad signature\n"
-msgstr "1 niepoprawny podpis\n"
-
-#, c-format
-msgid "%d bad signatures\n"
-msgstr "%d niepoprawnych podpisów\n"
-
-msgid "1 signature not checked due to a missing key\n"
-msgstr "1 podpis nie zosta³ sprawdzony z powodu braku klucza\n"
-
-#, c-format
-msgid "%d signatures not checked due to missing keys\n"
-msgstr "%d podpisów nie zosta³o sprawdzonych z powodu braku kluczy\n"
-
-msgid "1 signature not checked due to an error\n"
-msgstr "1 podpis nie zosta³ sprawdzony z powodu b³êdu\n"
+#, fuzzy, c-format
+#| msgid "%d bad signatures\n"
+msgid "%d bad signature\n"
+msgid_plural "%d bad signatures\n"
+msgstr[0] "%d niepoprawnych podpisów\n"
+msgstr[1] "%d niepoprawnych podpisów\n"
+msgstr[2] "%d niepoprawnych podpisów\n"
-#, c-format
-msgid "%d signatures not checked due to errors\n"
-msgstr "%d podpisów nie sprawdzonych z powodu b³êdów\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to a missing key\n"
+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 podpis nie zosta³ sprawdzony z powodu braku klucza\n"
+msgstr[1] "1 podpis nie zosta³ sprawdzony z powodu braku klucza\n"
+msgstr[2] "1 podpis nie zosta³ sprawdzony z powodu braku klucza\n"
-msgid "1 user ID without valid self-signature detected\n"
-msgstr "wykryto 1 identyfikator u¿ytkownika niepodpisany tym samym kluczem\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to an error\n"
+msgid "%d signature not checked due to an error\n"
+msgid_plural "%d signatures not checked due to errors\n"
+msgstr[0] "1 podpis nie zosta³ sprawdzony z powodu b³êdu\n"
+msgstr[1] "1 podpis nie zosta³ sprawdzony z powodu b³êdu\n"
+msgstr[2] "1 podpis nie zosta³ sprawdzony z powodu b³êdu\n"
-#, c-format
-msgid "%d user IDs without valid self-signatures detected\n"
-msgstr ""
+#, fuzzy, c-format
+#| msgid "%d user IDs without valid self-signatures detected\n"
+msgid "%d user ID without valid self-signature detected\n"
+msgid_plural "%d user IDs without valid self-signatures detected\n"
+msgstr[0] ""
+"wykryto %d identyfikatorów u¿ytkownika niepodpisanych tym samym kluczem\n"
+msgstr[1] ""
+"wykryto %d identyfikatorów u¿ytkownika niepodpisanych tym samym kluczem\n"
+msgstr[2] ""
"wykryto %d identyfikatorów u¿ytkownika niepodpisanych tym samym kluczem\n"
msgid ""
@@ -3646,13 +3666,13 @@ msgstr "Usun±æ ten nieznany podpis? (t/N/w) "
msgid "Really delete this self-signature? (y/N)"
msgstr "Na pewno usun±æ ten podpis klucza nim samym? (t/N) "
-#, c-format
+#, fuzzy, c-format
+#| msgid "Deleted %d signature.\n"
msgid "Deleted %d signature.\n"
-msgstr "%d podpis usuniêty.\n"
-
-#, c-format
-msgid "Deleted %d signatures.\n"
-msgstr "%d podpisów usuniêtych.\n"
+msgid_plural "Deleted %d signatures.\n"
+msgstr[0] "%d podpis usuniêty.\n"
+msgstr[1] "%d podpis usuniêty.\n"
+msgstr[2] "%d podpis usuniêty.\n"
msgid "Nothing deleted.\n"
msgstr "Nic nie zosta³o usuniête.\n"
@@ -3664,13 +3684,13 @@ msgstr "niepoprawny"
msgid "User ID \"%s\" compacted: %s\n"
msgstr "Identyfikator u¿ytkownika ,,%s'' upakowany: %s\n"
-#, c-format
+#, fuzzy, c-format
+#| msgid "User ID \"%s\": %d signature removed\n"
msgid "User ID \"%s\": %d signature removed\n"
-msgstr "Identyfikator u¿ytkownika ,,%s'': %d podpis wyczyszczony\n"
-
-#, c-format
-msgid "User ID \"%s\": %d signatures removed\n"
-msgstr "Identyfikator u¿ytkownika ,,%s'': %d podpisów wyczyszczonych\n"
+msgid_plural "User ID \"%s\": %d signatures removed\n"
+msgstr[0] "Identyfikator u¿ytkownika ,,%s'': %d podpis wyczyszczony\n"
+msgstr[1] "Identyfikator u¿ytkownika ,,%s'': %d podpis wyczyszczony\n"
+msgstr[2] "Identyfikator u¿ytkownika ,,%s'': %d podpis wyczyszczony\n"
#, c-format
msgid "User ID \"%s\": already minimized\n"
@@ -4208,38 +4228,6 @@ msgid "Please correct the error first\n"
msgstr "Najpierw trzeba poprawiæ ten b³±d\n"
msgid ""
-"You need a Passphrase to protect your secret key.\n"
-"\n"
-msgstr ""
-"Musisz podaæ d³ugie, skomplikowane has³o aby ochroniæ swój klucz tajny.\n"
-"\n"
-
-msgid ""
-"Please enter a passphrase to protect the off-card backup of the new "
-"encryption key."
-msgstr ""
-"Proszê wprowadziæ has³o do zabezpieczenia kopii zapasowej poza kart± nowego "
-"klucza szyfruj±cego."
-
-msgid "passphrase not correctly repeated; try again"
-msgstr "has³o nie zosta³o poprawnie powtórzone; jeszcze jedna próba"
-
-#, c-format
-msgid "%s.\n"
-msgstr "%s.\n"
-
-msgid ""
-"You don't want a passphrase - this is probably a *bad* idea!\n"
-"I will do it anyway. You can change your passphrase at any time,\n"
-"using this program with the option \"--edit-key\".\n"
-"\n"
-msgstr ""
-"Nie chcesz podaæ has³a - to *z³y* pomys³!\n"
-"W ka¿dej chwili mo¿esz ustawiæ has³o u¿ywaj±c tego programu i opcji\n"
-"\"--edit-key\".\n"
-"\n"
-
-msgid ""
"We need to generate a lot of random bytes. It is a good idea to perform\n"
"some other action (type on the keyboard, move the mouse, utilize the\n"
"disks) during the prime generation; this gives the random number\n"
@@ -4291,6 +4279,16 @@ msgid "Key generation canceled.\n"
msgstr "Procedura generacji klucza zosta³a anulowana.\n"
#, fuzzy, c-format
+#| msgid "can't create backup file `%s': %s\n"
+msgid "can't create backup file '%s': %s\n"
+msgstr "nie mo¿na utworzyæ pliku kopii zapasowej ,,%s'': %s\n"
+
+#, fuzzy, c-format
+#| msgid "NOTE: backup of card key saved to `%s'\n"
+msgid "Note: backup of card key saved to '%s'\n"
+msgstr "UWAGA: kopia zapasowa klucza karty zapisana do ,,%s''\n"
+
+#, fuzzy, c-format
#| msgid "writing public key to `%s'\n"
msgid "writing public key to '%s'\n"
msgstr "zapisujê klucz publiczny w ,,%s''\n"
@@ -4343,20 +4341,6 @@ msgstr "Czê¶æ tajna g³ównego klucza jest zapisana na karcie.\n"
msgid "Really create? (y/N) "
msgstr "Czy na pewno utworzyæ? (t/N) "
-#, c-format
-msgid "storing key onto card failed: %s\n"
-msgstr "zapis klucza na karcie nie powiód³ siê: %s\n"
-
-#, fuzzy, c-format
-#| msgid "can't create backup file `%s': %s\n"
-msgid "can't create backup file '%s': %s\n"
-msgstr "nie mo¿na utworzyæ pliku kopii zapasowej ,,%s'': %s\n"
-
-#, fuzzy, c-format
-#| msgid "NOTE: backup of card key saved to `%s'\n"
-msgid "Note: backup of card key saved to '%s'\n"
-msgstr "UWAGA: kopia zapasowa klucza karty zapisana do ,,%s''\n"
-
msgid "never "
msgstr "nigdy "
@@ -4375,19 +4359,20 @@ msgstr "Krytyczne adnotacje podpisu: "
msgid "Signature notation: "
msgstr "Adnotacje podpisu: "
-#, fuzzy
-#| msgid "1 bad signature\n"
-msgid "1 good signature\n"
-msgstr "1 niepoprawny podpis\n"
-
#, fuzzy, c-format
#| msgid "%d bad signatures\n"
-msgid "%d good signatures\n"
-msgstr "%d niepoprawnych podpisów\n"
+msgid "%d good signature\n"
+msgid_plural "%d good signatures\n"
+msgstr[0] "%d niepoprawnych podpisów\n"
+msgstr[1] "%d niepoprawnych podpisów\n"
+msgstr[2] "%d niepoprawnych podpisów\n"
#, c-format
-msgid "Warning: %lu key(s) skipped due to their large size\n"
-msgstr ""
+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[2] ""
msgid "Keyring"
msgstr "Zbiór kluczy"
@@ -4417,22 +4402,32 @@ msgid " Card serial no. ="
msgstr " Nr seryjny karty ="
#, fuzzy, c-format
-#| msgid "renaming `%s' to `%s' failed: %s\n"
-msgid "renaming '%s' to '%s' failed: %s\n"
-msgstr "zmiana nazwy ,,%s'' na ,,%s'' nie powiod³a siê: %s\n"
-
-#, fuzzy, c-format
#| msgid "caching keyring `%s'\n"
msgid "caching keyring '%s'\n"
msgstr "buforowanie zbioru kluczy ,,%s''\n"
-#, c-format
-msgid "%lu keys cached so far (%lu signatures)\n"
-msgstr "%lu kluczy zbuforowano do tej pory (%lu podpisów)\n"
+#, fuzzy, c-format
+#| msgid "%lu keys cached so far (%lu signatures)\n"
+msgid "%lu keys cached so far (%lu signature)\n"
+msgid_plural "%lu keys cached so far (%lu signatures)\n"
+msgstr[0] "%lu kluczy zbuforowano do tej pory (%lu podpisów)\n"
+msgstr[1] "%lu kluczy zbuforowano do tej pory (%lu podpisów)\n"
+msgstr[2] "%lu kluczy zbuforowano do tej pory (%lu podpisów)\n"
#, c-format
-msgid "%lu keys cached (%lu signatures)\n"
-msgstr "%lu kluczy zbuforowano (%lu podpisów)\n"
+msgid "%lu key cached"
+msgid_plural "%lu keys cached"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, fuzzy, c-format
+#| msgid "1 bad signature\n"
+msgid " (%lu signature)\n"
+msgid_plural " (%lu signatures)\n"
+msgstr[0] "1 niepoprawny podpis\n"
+msgstr[1] "1 niepoprawny podpis\n"
+msgstr[2] "1 niepoprawny podpis\n"
#, c-format
msgid "%s: keyring created\n"
@@ -4473,19 +4468,19 @@ msgstr "niepoprawny protokó³ serwera kluczy (nasz %d != modu³ obs³ugi %d)\n"
msgid "\"%s\" not a key ID: skipping\n"
msgstr ",,%s'' nie jest identyfikatorem klucza - pominiêto\n"
-#, c-format
-msgid "refreshing 1 key from %s\n"
-msgstr "od¶wie¿anie 1 klucza z %s\n"
+#, fuzzy, c-format
+#| msgid "refreshing %d keys from %s\n"
+msgid "refreshing %d key from %s\n"
+msgid_plural "refreshing %d keys from %s\n"
+msgstr[0] "od¶wie¿anie %d kluczy z %s\n"
+msgstr[1] "od¶wie¿anie %d kluczy z %s\n"
+msgstr[2] "od¶wie¿anie %d kluczy z %s\n"
#, c-format
msgid "WARNING: unable to refresh key %s via %s: %s\n"
msgstr "OSTRZE¯ENIE: nie mo¿na od¶wie¿yæ klucza %s przez %s: %s\n"
#, c-format
-msgid "refreshing %d keys from %s\n"
-msgstr "od¶wie¿anie %d kluczy z %s\n"
-
-#, c-format
msgid "key \"%s\" not found on keyserver\n"
msgstr "klucz ,,%s'' nie zosta³ odnaleziony na serwerze kluczy\n"
@@ -4503,9 +4498,10 @@ msgstr "zapytanie o klucz %s z serwera %s %s\n"
msgid "requesting key %s from %s\n"
msgstr "zapytanie o klucz %s z %s\n"
-#, c-format
-msgid "sending key %s to %s server %s\n"
-msgstr "wysy³anie klucza %s na serwer %s %s\n"
+#, fuzzy
+#| msgid "no keyserver action!\n"
+msgid "no keyserver known\n"
+msgstr "brak akcji serwera kluczy!\n"
#, c-format
msgid "sending key %s to %s\n"
@@ -4728,6 +4724,19 @@ msgstr "OSTRZE¯ENIE: algorytm skrótu %s jest odradzany\n"
msgid "Note: signatures using the %s algorithm are rejected\n"
msgstr "podpis %s, skrót %s\n"
+#, fuzzy, c-format
+#| msgid "read error in `%s': %s\n"
+msgid "(reported error: %s)\n"
+msgstr "b³±d odczytu w ,,%s'': %s\n"
+
+#, fuzzy, c-format
+#| msgid "read error in `%s': %s\n"
+msgid "(reported error: %s <%s>)\n"
+msgstr "b³±d odczytu w ,,%s'': %s\n"
+
+msgid "(further info: "
+msgstr ""
+
#, c-format
msgid "%s:%d: deprecated option \"%s\"\n"
msgstr "%s:%d jest przestarza³± opcj± ,,%s''\n"
@@ -5144,6 +5153,21 @@ msgstr "%s: pominiêty: klucz publiczny wy³±czony z u¿ytku\n"
msgid "%s: skipped: public key already present\n"
msgstr "%s: pominiêty: zosta³ ju¿ wybrany w innej opcji\n"
+#, fuzzy, c-format
+#| msgid "can't connect to `%s': %s\n"
+msgid "can't encrypt to '%s'\n"
+msgstr "nie mo¿na siê po³±czyæ z ,,%s'': %s\n"
+
+#, fuzzy, c-format
+#| msgid "line %d: invalid algorithm\n"
+msgid "option '%s' given, but no valid default keys given\n"
+msgstr "linia %d: niew³a¶ciwy algorytm\n"
+
+#, fuzzy, c-format
+#| msgid "line %d: invalid algorithm\n"
+msgid "option '%s' given, but option '%s' not given\n"
+msgstr "linia %d: niew³a¶ciwy algorytm\n"
+
msgid "You did not specify a user ID. (you may use \"-r\")\n"
msgstr "Nie zosta³ podany identyfikator u¿ytkownika (np. za pomoc± ,,-r'')\n"
@@ -5188,11 +5212,6 @@ msgid "data not saved; use option \"--output\" to save it\n"
msgstr ""
"dane nie zosta³y zapisane; aby to zrobiæ, nale¿y u¿yæ opcji \"--output\"\n"
-#, fuzzy, c-format
-#| msgid "error creating `%s': %s\n"
-msgid "error creating '%s': %s\n"
-msgstr "b³±d tworzenia ,,%s'': %s\n"
-
msgid "Detached signature.\n"
msgstr "Podpis oddzielony od danych.\n"
@@ -5284,19 +5303,31 @@ msgid "This is a revocation certificate for the OpenPGP key:"
msgstr "Stworzyæ certyfikat uniewa¿nienia tego klucza? (t/N) "
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 ""
+
+msgid ""
"Use it to revoke this key in case of a compromise or loss of\n"
"the secret key. However, if the secret key is still accessible,\n"
"it is better to generate a new revocation certificate and give\n"
-"a reason for the revocation."
+"a reason for the revocation. For details see the description of\n"
+"of the gpg command \"--gen-revoke\" in the GnuPG manual."
msgstr ""
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 making use of this revocation certificate."
+"before importing and publishing this revocation certificate."
msgstr ""
#, fuzzy, c-format
+#| msgid "Revocation certificate created.\n"
+msgid "revocation certificate stored as '%s.rev'\n"
+msgstr "Certyfikat uniewa¿nienia zosta³ utworzony.\n"
+
+#, fuzzy, c-format
#| msgid "secret key \"%s\" not found: %s\n"
msgid "secret key \"%s\" not found\n"
msgstr "klucz prywatny ,,%s'' nie zosta³ odnaleziony: %s\n"
@@ -5308,6 +5339,11 @@ msgstr "klucz prywatny ,,%s'' nie zosta³ odnaleziony: %s\n"
msgid "'%s' matches multiple secret keys:\n"
msgstr ""
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "error searching the keyring: %s\n"
+msgstr "b³±d tworzenia zbioru kluczy `%s': %s\n"
+
msgid "Create a revocation certificate for this key? (y/N) "
msgstr "Stworzyæ certyfikat uniewa¿nienia tego klucza? (t/N) "
@@ -5392,26 +5428,53 @@ msgid "WARNING: signing subkey %s has an invalid cross-certification\n"
msgstr ""
"OSTRZE¯ENIE: podklucz podpisuj±cy %s jest niepoprawnie skro¶nie podpisany\n"
-#, c-format
+#, fuzzy, c-format
+#| msgid "public key %s is %lu second newer than the signature\n"
msgid "public key %s is %lu second newer than the signature\n"
-msgstr "klucz publiczny %s jest o %lu sekundê m³odszy od podpisu\n"
+msgid_plural "public key %s is %lu seconds newer than the signature\n"
+msgstr[0] "klucz publiczny %s jest o %lu sekundê m³odszy od podpisu\n"
+msgstr[1] "klucz publiczny %s jest o %lu sekundê m³odszy od podpisu\n"
+msgstr[2] "klucz publiczny %s jest o %lu sekundê m³odszy od podpisu\n"
-#, c-format
-msgid "public key %s is %lu seconds newer than the signature\n"
-msgstr "klucz publiczny %s jest o %lu sekund(y) m³odszy od podpisu\n"
+#, fuzzy, c-format
+#| msgid "public key %s is %lu second newer than the signature\n"
+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] "klucz publiczny %s jest o %lu sekundê m³odszy od podpisu\n"
+msgstr[1] "klucz publiczny %s jest o %lu sekundê m³odszy od podpisu\n"
+msgstr[2] "klucz publiczny %s jest o %lu sekundê m³odszy od podpisu\n"
-#, c-format
+#, fuzzy, c-format
+#| msgid ""
+#| "key %s was created %lu second in the future (time warp or clock problem)\n"
msgid ""
"key %s was created %lu second in the future (time warp or clock problem)\n"
-msgstr ""
+msgid_plural ""
+"key %s was created %lu seconds in the future (time warp or clock problem)\n"
+msgstr[0] ""
+"klucz %s zosta³ stworzony %lu sekundê w przysz³o¶ci (zaburzenia\n"
+"czasoprzestrzeni lub ¼le ustawiony zegar systemowy)\n"
+msgstr[1] ""
+"klucz %s zosta³ stworzony %lu sekundê w przysz³o¶ci (zaburzenia\n"
+"czasoprzestrzeni lub ¼le ustawiony zegar systemowy)\n"
+msgstr[2] ""
"klucz %s zosta³ stworzony %lu sekundê w przysz³o¶ci (zaburzenia\n"
"czasoprzestrzeni lub ¼le ustawiony zegar systemowy)\n"
-#, c-format
-msgid ""
-"key %s was created %lu seconds in the future (time warp or clock problem)\n"
-msgstr ""
-"klucz %s zosta³ stworzony %lu sekund w przysz³o¶ci (zaburzenia\n"
+#, fuzzy, c-format
+#| msgid ""
+#| "key %s was created %lu second in the future (time warp or clock problem)\n"
+msgid "key %s was created %lu day in the future (time warp or clock problem)\n"
+msgid_plural ""
+"key %s was created %lu days in the future (time warp or clock problem)\n"
+msgstr[0] ""
+"klucz %s zosta³ stworzony %lu sekundê w przysz³o¶ci (zaburzenia\n"
+"czasoprzestrzeni lub ¼le ustawiony zegar systemowy)\n"
+msgstr[1] ""
+"klucz %s zosta³ stworzony %lu sekundê w przysz³o¶ci (zaburzenia\n"
+"czasoprzestrzeni lub ¼le ustawiony zegar systemowy)\n"
+msgstr[2] ""
+"klucz %s zosta³ stworzony %lu sekundê w przysz³o¶ci (zaburzenia\n"
"czasoprzestrzeni lub ¼le ustawiony zegar systemowy)\n"
#, fuzzy, c-format
@@ -5652,6 +5715,260 @@ msgid "input line longer than %d characters\n"
msgstr "linia d³u¿sza ni¿ %d znaków\n"
#, fuzzy, c-format
+#| msgid "error sending standard options: %s\n"
+msgid "error beginning transaction on TOFU database: %s\n"
+msgstr "b³±d wysy³ania standardowych opcji: %s\n"
+
+#, c-format
+msgid "error committing transaction on TOFU database: %s\n"
+msgstr ""
+
+#, c-format
+msgid "error rolling back transaction on TOFU database: %s\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "unsupported algorithm: %s"
+msgid "unsupported TOFU database version: %s\n"
+msgstr "nieobs³ugiwany algorytm: %s"
+
+#, fuzzy, c-format
+#| msgid "error sending %s command: %s\n"
+msgid "error reading TOFU database: %s\n"
+msgstr "b³±d wysy³ania polecenia %s: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error writing secret keyring `%s': %s\n"
+msgid "error determining TOFU database's version: %s\n"
+msgstr "b³±d podczas zapisu zbioru kluczy tajnych ,,%s'': %s\n"
+
+#, fuzzy, c-format
+#| msgid "%s: error writing dir record: %s\n"
+msgid "error initializing TOFU database: %s\n"
+msgstr "%s: b³±d zapisu wpisu katalogowego: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error opening `%s': %s\n"
+msgid "error opening TOFU database '%s': %s\n"
+msgstr "b³±d podczas otwierania ,,%s'': %s\n"
+
+msgid "Warning: Home directory contains both tofu.db and tofu.d.\n"
+msgstr ""
+
+msgid "Using split format for TOFU database\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "error sending %s command: %s\n"
+msgid "error updating TOFU database: %s\n"
+msgstr "b³±d wysy³ania polecenia %s: %s\n"
+
+#, c-format
+msgid "public key %s not found: %s\n"
+msgstr "klucz publiczny %s nie odnaleziony: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error storing flags: %s\n"
+msgid "error setting TOFU binding's trust level to %s\n"
+msgstr "b³±d zapisywania flag: %s\n"
+
+#, c-format
+msgid "The binding %s is NOT known."
+msgstr ""
+
+#, c-format
+msgid ""
+"The key %s raised a conflict with this binding (%s). Since this binding's "
+"policy was 'auto', it was changed to 'ask'."
+msgstr ""
+
+#, c-format
+msgid ""
+"Please indicate whether you believe the binding %s%sis legitimate (the key "
+"belongs to the stated owner) or a forgery (bad)."
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "error getting new PIN: %s\n"
+msgid "error gathering other user IDs: %s\n"
+msgstr "b³±d podczas odczytu nowego PIN-u: %s\n"
+
+msgid "Known user IDs associated with this key:\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "validity: %s"
+msgid "policy: %s"
+msgstr "poprawno¶æ: %s"
+
+#, fuzzy, c-format
+#| msgid "error getting stored flags: %s\n"
+msgid "error gathering signature stats: %s\n"
+msgstr "b³±d pobierania zapisanych flag: %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] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, c-format
+msgid "Statistics for keys with the email address \"%s\":\n"
+msgstr ""
+
+#, fuzzy
+#| msgid "list keys"
+msgid "this key"
+msgstr "lista kluczy"
+
+#, c-format
+msgid "%ld message signed in the future."
+msgid_plural "%ld messages signed in the future."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, fuzzy, c-format
+#| msgid "print message digests"
+msgid "%ld message signed"
+msgid_plural "%ld messages signed"
+msgstr[0] "wypisanie skrótów wiadomo¶ci"
+msgstr[1] "wypisanie skrótów wiadomo¶ci"
+msgstr[2] "wypisanie skrótów wiadomo¶ci"
+
+#, c-format
+msgid " over the past %ld day."
+msgid_plural " over the past %ld days."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, c-format
+msgid " over the past %ld week."
+msgid_plural " over the past %ld weeks."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, c-format
+msgid " over the past %ld month."
+msgid_plural " over the past %ld months."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#. 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 ""
+
+#. 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 ""
+
+msgid "(G)ood, (A)ccept once, (U)nknown, (R)eject once, (B)ad? "
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "error creating a pipe: %s\n"
+msgid "error changing TOFU policy: %s\n"
+msgstr "b³±d tworzenia potoku: %s\n"
+
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, c-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, c-format
+msgid "Have never verified a message signed by key %s!\n"
+msgstr ""
+
+#, c-format
+msgid "Failed to collect signature statistics for \"%s\" (key %s)\n"
+msgstr ""
+
+#, c-format
+msgid "Verified 0 messages signed by \"%s\" (key: %s, policy: %s)."
+msgstr ""
+
+#. TRANSLATORS: The final %s is replaced by a string like
+#. "7 months, 1 day, 5 minutes, 0 seconds".
+#, c-format
+msgid ""
+"Verified %ld message signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgid_plural ""
+"Verified %ld messages signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, c-format
+msgid "The most recent message was verified %s ago."
+msgstr ""
+
+msgid "Warning: we've have yet to see a message signed by this key!\n"
+msgstr ""
+
+msgid "Warning: we've only seen a single message signed by this key!\n"
+msgstr ""
+
+#. TRANSLATORS: translate the below text. We don't
+#. directly internationalize that text so that we can
+#. tweak it without breaking translations.
+#, c-format
+msgid "TOFU: few signatures %d message %s"
+msgid_plural "TOFU: few signatures %d messages %s"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, fuzzy, c-format
+#| msgid "error sending %s command: %s\n"
+msgid "error opening TOFU database: %s\n"
+msgstr "b³±d wysy³ania polecenia %s: %s\n"
+
+#, fuzzy, c-format
#| msgid "`%s' is not a valid long keyID\n"
msgid "'%s' is not a valid long keyID\n"
msgstr ",,%s'' nie jest poprawnym d³ugim numerem klucza\n"
@@ -5712,19 +6029,27 @@ msgstr "sprawdzanie bazy jest niepotrzebne przy modelu zaufania ,,%s''\n"
msgid "no need for a trustdb update with '%s' trust model\n"
msgstr "aktualizacja bazy jest niepotrzebna przy modelu zaufania ,,%s''\n"
-#, c-format
-msgid "public key %s not found: %s\n"
-msgstr "klucz publiczny %s nie odnaleziony: %s\n"
-
msgid "please do a --check-trustdb\n"
msgstr "nale¿y uruchomiæ gpg z opcj± ,,--check-trustdb''\n"
msgid "checking the trustdb\n"
msgstr "sprawdzanie bazy zaufania\n"
-#, c-format
-msgid "%d keys processed (%d validity counts cleared)\n"
-msgstr "przetworzono %d kluczy (rozwi±zano %d przeliczeñ zaufania)\n"
+#, fuzzy, c-format
+#| msgid "%lu keys processed so far\n"
+msgid "%d key processed"
+msgid_plural "%d keys processed"
+msgstr[0] "%lu kluczy przetworzonych do tej chwili\n"
+msgstr[1] "%lu kluczy przetworzonych do tej chwili\n"
+msgstr[2] "%lu kluczy przetworzonych do tej chwili\n"
+
+#, fuzzy, c-format
+#| msgid "%d keys processed (%d validity counts cleared)\n"
+msgid " (%d validity count cleared)\n"
+msgid_plural " (%d validity counts cleared)\n"
+msgstr[0] "przetworzono %d kluczy (rozwi±zano %d przeliczeñ zaufania)\n"
+msgstr[1] "przetworzono %d kluczy (rozwi±zano %d przeliczeñ zaufania)\n"
+msgstr[2] "przetworzono %d kluczy (rozwi±zano %d przeliczeñ zaufania)\n"
msgid "no ultimately trusted keys found\n"
msgstr "brak absolutnie zaufanych kluczy\n"
@@ -5734,10 +6059,6 @@ msgid "public key of ultimately trusted key %s not found\n"
msgstr "klucz publiczny absolutnie zaufanego klucza %s nie odnaleziony\n"
#, c-format
-msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
-msgstr "potrzeba %d marginalnych, %d pe³nych, model zaufania %s\n"
-
-#, c-format
msgid ""
"depth: %d valid: %3d signed: %3d trust: %d-, %dq, %dn, %dm, %df, %du\n"
msgstr ""
@@ -5944,9 +6265,16 @@ msgstr "b³±d podczas odczytu stanu CHV z karty\n"
msgid "card is permanently locked!\n"
msgstr "karta zosta³a trwale zablokowana!\n"
-#, c-format
-msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
-msgstr ""
+#, fuzzy, c-format
+#| msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
+msgid "%d Admin PIN attempt remaining before card is permanently locked\n"
+msgid_plural ""
+"%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr[0] ""
+"Zosta³o %d prób PIN-u administracyjnego do trwa³ego zablokowania karty\n"
+msgstr[1] ""
+"Zosta³o %d prób PIN-u administracyjnego do trwa³ego zablokowania karty\n"
+msgstr[2] ""
"Zosta³o %d prób PIN-u administracyjnego do trwa³ego zablokowania karty\n"
#. TRANSLATORS: Do not translate the "|A|" prefix but keep it at
@@ -6026,9 +6354,13 @@ msgstr "proszê czekaæ na wygenerowanie klucza...\n"
msgid "generating key failed\n"
msgstr "generowanie klucza nie powiod³o siê\n"
-#, c-format
-msgid "key generation completed (%d seconds)\n"
-msgstr "generowanie klucza zakoñczone (%d sekund)\n"
+#, fuzzy, c-format
+#| msgid "key generation completed (%d seconds)\n"
+msgid "key generation completed (%d second)\n"
+msgid_plural "key generation completed (%d seconds)\n"
+msgstr[0] "generowanie klucza zakoñczone (%d sekund)\n"
+msgstr[1] "generowanie klucza zakoñczone (%d sekund)\n"
+msgstr[2] "generowanie klucza zakoñczone (%d sekund)\n"
msgid "invalid structure of OpenPGP card (DO 0x93)\n"
msgstr "niepoprawna struktura karty OpenPGP (DO 0x93)\n"
@@ -8415,6 +8747,12 @@ msgstr "|N|przedawnianie hase³ po N dniach"
msgid "do not allow the reuse of old passphrases"
msgstr "nie zezwalanie na ponowne u¿ycie starych hase³"
+#, fuzzy
+#| msgid "|N|set maximum PIN cache lifetime to N seconds"
+msgid "|N|set the Pinentry timeout to N seconds"
+msgstr ""
+"|N|ustawienie maksymalnego czasu ¿ycia pamiêci podrêcznej PIN-ów na N sekund"
+
msgid "|NAME|use NAME as default secret key"
msgstr "|NAZWA|u¿ycie NAZWY jako domy¶lnego klucza tajnego"
@@ -8725,6 +9063,93 @@ msgstr ""
"Sk³adnia: gpg-check-pattern [opcje] plik-wzorców\n"
"Sprawdzanie has³a ze standardowego wej¶cia wzglêdem pliku wzorców\n"
+#, fuzzy
+#~| msgid "option \"%.50s\" is ambiguous\n"
+#~ msgid "key specification '%s' is ambiguous\n"
+#~ msgstr "opcja ,,%.50s'' jest niejednoznaczna\n"
+
+#~ msgid "%d signatures not checked due to missing keys\n"
+#~ msgstr "%d podpisów nie zosta³o sprawdzonych z powodu braku kluczy\n"
+
+#~ msgid "%d signatures not checked due to errors\n"
+#~ msgstr "%d podpisów nie sprawdzonych z powodu b³êdów\n"
+
+#~ msgid "1 user ID without valid self-signature detected\n"
+#~ msgstr ""
+#~ "wykryto 1 identyfikator u¿ytkownika niepodpisany tym samym kluczem\n"
+
+#~ msgid "Deleted %d signatures.\n"
+#~ msgstr "%d podpisów usuniêtych.\n"
+
+#~ msgid "User ID \"%s\": %d signatures removed\n"
+#~ msgstr "Identyfikator u¿ytkownika ,,%s'': %d podpisów wyczyszczonych\n"
+
+#~ msgid ""
+#~ "You need a Passphrase to protect your secret key.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Musisz podaæ d³ugie, skomplikowane has³o aby ochroniæ swój klucz tajny.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Please enter a passphrase to protect the off-card backup of the new "
+#~ "encryption key."
+#~ msgstr ""
+#~ "Proszê wprowadziæ has³o do zabezpieczenia kopii zapasowej poza kart± "
+#~ "nowego klucza szyfruj±cego."
+
+#~ msgid "passphrase not correctly repeated; try again"
+#~ msgstr "has³o nie zosta³o poprawnie powtórzone; jeszcze jedna próba"
+
+#~ msgid "%s.\n"
+#~ msgstr "%s.\n"
+
+#~ msgid ""
+#~ "You don't want a passphrase - this is probably a *bad* idea!\n"
+#~ "I will do it anyway. You can change your passphrase at any time,\n"
+#~ "using this program with the option \"--edit-key\".\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Nie chcesz podaæ has³a - to *z³y* pomys³!\n"
+#~ "W ka¿dej chwili mo¿esz ustawiæ has³o u¿ywaj±c tego programu i opcji\n"
+#~ "\"--edit-key\".\n"
+#~ "\n"
+
+#~ msgid "storing key onto card failed: %s\n"
+#~ msgstr "zapis klucza na karcie nie powiód³ siê: %s\n"
+
+#, fuzzy
+#~| msgid "1 bad signature\n"
+#~ msgid "1 good signature\n"
+#~ msgstr "1 niepoprawny podpis\n"
+
+#, fuzzy
+#~| msgid "renaming `%s' to `%s' failed: %s\n"
+#~ msgid "renaming '%s' to '%s' failed: %s\n"
+#~ msgstr "zmiana nazwy ,,%s'' na ,,%s'' nie powiod³a siê: %s\n"
+
+#~ msgid "%lu keys cached (%lu signatures)\n"
+#~ msgstr "%lu kluczy zbuforowano (%lu podpisów)\n"
+
+#~ msgid "refreshing 1 key from %s\n"
+#~ msgstr "od¶wie¿anie 1 klucza z %s\n"
+
+#~ msgid "sending key %s to %s server %s\n"
+#~ msgstr "wysy³anie klucza %s na serwer %s %s\n"
+
+#~ msgid "public key %s is %lu seconds newer than the signature\n"
+#~ msgstr "klucz publiczny %s jest o %lu sekund(y) m³odszy od podpisu\n"
+
+#~ msgid ""
+#~ "key %s was created %lu seconds in the future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "klucz %s zosta³ stworzony %lu sekund w przysz³o¶ci (zaburzenia\n"
+#~ "czasoprzestrzeni lub ¼le ustawiony zegar systemowy)\n"
+
+#~ msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
+#~ msgstr "potrzeba %d marginalnych, %d pe³nych, model zaufania %s\n"
+
#~ msgid "cleared passphrase cached with ID: %s\n"
#~ msgstr "wyczyszczono has³o zapamiêtane z ID: %s\n"
@@ -8984,9 +9409,6 @@ msgstr ""
#~ msgid "searching for \"%s\" from %s\n"
#~ msgstr "poszukiwanie ,,%s'' z %s\n"
-#~ msgid "no keyserver action!\n"
-#~ msgstr "brak akcji serwera kluczy!\n"
-
#~ msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n"
#~ msgstr ""
#~ "OSTRZE¯ENIE: modu³ obs³ugi serwera kluczy z innej wersji GnuPG (%s)\n"
diff --git a/po/pt.po b/po/pt.po
index ad96dc8..bfdfdf1 100644
--- a/po/pt.po
+++ b/po/pt.po
@@ -1244,6 +1244,20 @@ msgid "Enter passphrase: "
msgstr "Digite a frase secreta: "
#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "error getting version from '%s': %s\n"
+msgstr "erro ao criar porta-chaves `%s': %s\n"
+
+#, c-format
+msgid "server '%s' is older than us (%s < %s)"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "WARNING: %s overrides %s\n"
+msgid "WARNING: %s\n"
+msgstr "AVISO: %s sobrepõe %s\n"
+
+#, fuzzy, c-format
msgid "OpenPGP card not available: %s\n"
msgstr "chave secreta não disponível"
@@ -1744,6 +1758,11 @@ msgid "remove as much as possible from key during export"
msgstr ""
#, fuzzy
+#| msgid "%s: skipped: %s\n"
+msgid " - skipped"
+msgstr "%s: ignorado: %s\n"
+
+#, fuzzy
msgid "exporting secret keys not allowed\n"
msgstr "a escrever chave privada para `%s'\n"
@@ -1755,19 +1774,36 @@ msgstr "chave %08lX: tipo PGP 2.x - ignorada\n"
msgid "key %s: key material on-card - skipped\n"
msgstr "chave %08lX: assintura da subchave no local errado - ignorado\n"
-#, fuzzy
-#| msgid "%s: skipped: %s\n"
-msgid " - skipped"
-msgstr "%s: ignorado: %s\n"
-
msgid "WARNING: nothing exported\n"
msgstr "AVISO: nada exportado\n"
+#, fuzzy, c-format
+#| msgid "error creating `%s': %s\n"
+msgid "error creating '%s': %s\n"
+msgstr "erro ao criar `%s': %s\n"
+
#, fuzzy
msgid "[User ID not found]"
msgstr "[Utilizador não encontrado]"
#, fuzzy, c-format
+msgid "(check argument of option '%s')\n"
+msgstr "opções de importação inválidas\n"
+
+#, c-format
+msgid "Warning: '%s' should be a long key ID or a fingerprint\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error looking up: %s\n"
+msgstr "erro na leitura de `%s': %s\n"
+
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "Warning: %s appears in the keyring %d times\n"
+msgstr "erro ao criar porta-chaves `%s': %s\n"
+
+#, fuzzy, c-format
msgid "automatically retrieved '%s' via %s\n"
msgstr "erro ao criar `%s': %s\n"
@@ -1784,14 +1820,19 @@ msgid "secret key \"%s\" not found: %s\n"
msgstr "chave `%s' não encontrada: %s\n"
#, fuzzy, c-format
-msgid "(check argument of option '%s')\n"
-msgstr "opções de importação inválidas\n"
+#| msgid "|NAME|use NAME as default secret key"
+msgid "Warning: not using '%s' as default key: %s\n"
+msgstr "|NOME|usar NOME como chave secreta por omissão"
#, fuzzy, c-format
#| msgid "|NAME|use NAME as default secret key"
-msgid "using \"%s\" as default secret key\n"
+msgid "using \"%s\" as default secret key for signing\n"
msgstr "|NOME|usar NOME como chave secreta por omissão"
+#, c-format
+msgid "all values passed to '%s' ignored\n"
+msgstr ""
+
#, fuzzy, c-format
msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
msgstr "Chave inválida %08lX tornada válida por --allow-non-selfsigned-uid\n"
@@ -2153,28 +2194,6 @@ msgid "Note: old default options file '%s' ignored\n"
msgstr "NOTA: o ficheiro antigo de opções por omissão `%s' foi ignorado\n"
#, c-format
-msgid ""
-"Warning: value '%s' for option '%s' should be a long key ID or a "
-"fingerprint\n"
-msgstr ""
-
-#, c-format
-msgid "key specification '%s' is ambiguous\n"
-msgstr ""
-
-#. TRANSLATORS: The %s prints a key specification which
-#. for example has been given at the command line. Two
-#. lines with fingerprints are printed after this message.
-#, c-format
-msgid "'%s' matches at least:\n"
-msgstr ""
-
-#, fuzzy, c-format
-#| msgid "error creating keyring `%s': %s\n"
-msgid "error searching the keyring: %s\n"
-msgstr "erro ao criar porta-chaves `%s': %s\n"
-
-#, c-format
msgid "libgcrypt is too old (need %s, have %s)\n"
msgstr ""
@@ -2382,14 +2401,6 @@ msgid "WARNING: recipients (-r) given without using public key encryption\n"
msgstr ""
"AVISO: destinatários (-r) dados sem utilizar uma cifra de chave pública\n"
-#, fuzzy, c-format
-msgid "option '%s' given, but no valid default keys given\n"
-msgstr "algoritmo de dispersão inválido `%s'\n"
-
-#, fuzzy, c-format
-msgid "option '%s' given, but option '%s' not given\n"
-msgstr "algoritmo de dispersão inválido `%s'\n"
-
msgid "--store [filename]"
msgstr "--store [nome_do_ficheiro]"
@@ -2466,6 +2477,10 @@ msgid "key export failed: %s\n"
msgstr "A geração de chaves falhou: %s\n"
#, fuzzy, c-format
+msgid "export as ssh key failed: %s\n"
+msgstr "A geração de chaves falhou: %s\n"
+
+#, fuzzy, c-format
msgid "keyserver search failed: %s\n"
msgstr "A geração de chaves falhou: %s\n"
@@ -2959,33 +2974,33 @@ msgstr "[revogação]"
msgid "[self-signature]"
msgstr "[auto-assinatura]"
-msgid "1 bad signature\n"
-msgstr "1 assinatura incorrecta\n"
-
-#, c-format
-msgid "%d bad signatures\n"
-msgstr "%d assinaturas incorrectas\n"
-
-msgid "1 signature not checked due to a missing key\n"
-msgstr "1 assinatura não verificada por falta de chave\n"
-
-#, c-format
-msgid "%d signatures not checked due to missing keys\n"
-msgstr "%d assinaturas não verificadas por falta de chaves\n"
-
-msgid "1 signature not checked due to an error\n"
-msgstr "1 assinatura não verificada devido a um erro\n"
+#, fuzzy, c-format
+#| msgid "%d bad signatures\n"
+msgid "%d bad signature\n"
+msgid_plural "%d bad signatures\n"
+msgstr[0] "%d assinaturas incorrectas\n"
+msgstr[1] "%d assinaturas incorrectas\n"
-#, c-format
-msgid "%d signatures not checked due to errors\n"
-msgstr "%d assinaturas não verificadas devido a erros\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to a missing key\n"
+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 assinatura não verificada por falta de chave\n"
+msgstr[1] "1 assinatura não verificada por falta de chave\n"
-msgid "1 user ID without valid self-signature detected\n"
-msgstr "1 ID de utilizador sem auto-assinatura válida detectado\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to an error\n"
+msgid "%d signature not checked due to an error\n"
+msgid_plural "%d signatures not checked due to errors\n"
+msgstr[0] "1 assinatura não verificada devido a um erro\n"
+msgstr[1] "1 assinatura não verificada devido a um erro\n"
-#, c-format
-msgid "%d user IDs without valid self-signatures detected\n"
-msgstr "%d IDs de utilizadores sem auto-assinaturas válidas detectados\n"
+#, fuzzy, c-format
+#| msgid "%d user IDs without valid self-signatures detected\n"
+msgid "%d user ID without valid self-signature detected\n"
+msgid_plural "%d user IDs without valid self-signatures detected\n"
+msgstr[0] "%d IDs de utilizadores sem auto-assinaturas válidas detectados\n"
+msgstr[1] "%d IDs de utilizadores sem auto-assinaturas válidas detectados\n"
#, fuzzy
msgid ""
@@ -3624,13 +3639,12 @@ msgstr "Apagar esta assinatura desconhecida? (s/N/q)"
msgid "Really delete this self-signature? (y/N)"
msgstr "Realmente remover esta auto-assinatura? (s/N)"
-#, c-format
+#, fuzzy, c-format
+#| msgid "Deleted %d signature.\n"
msgid "Deleted %d signature.\n"
-msgstr "%d assinatura removida.\n"
-
-#, c-format
-msgid "Deleted %d signatures.\n"
-msgstr "%d assinaturas removidas.\n"
+msgid_plural "Deleted %d signatures.\n"
+msgstr[0] "%d assinatura removida.\n"
+msgstr[1] "%d assinatura removida.\n"
msgid "Nothing deleted.\n"
msgstr "Nada removido.\n"
@@ -3645,11 +3659,9 @@ msgstr "Utilizador \"%s\" está revocado."
#, fuzzy, c-format
msgid "User ID \"%s\": %d signature removed\n"
-msgstr "Utilizador \"%s\" está revocado."
-
-#, fuzzy, c-format
-msgid "User ID \"%s\": %d signatures removed\n"
-msgstr "Utilizador \"%s\" está revocado."
+msgid_plural "User ID \"%s\": %d signatures removed\n"
+msgstr[0] "Utilizador \"%s\" está revocado."
+msgstr[1] "Utilizador \"%s\" está revocado."
#, fuzzy, c-format
msgid "User ID \"%s\": already minimized\n"
@@ -4187,37 +4199,6 @@ msgid "Please correct the error first\n"
msgstr "Por favor corrija primeiro o erro\n"
msgid ""
-"You need a Passphrase to protect your secret key.\n"
-"\n"
-msgstr ""
-"Você precisa de uma frase secreta para proteger a sua chave.\n"
-"\n"
-
-#, fuzzy
-msgid ""
-"Please enter a passphrase to protect the off-card backup of the new "
-"encryption key."
-msgstr "Por favor digite a frase secreta \n"
-
-msgid "passphrase not correctly repeated; try again"
-msgstr "a frase secreta não foi repetida corretamente; tente outra vez"
-
-#, c-format
-msgid "%s.\n"
-msgstr "%s.\n"
-
-msgid ""
-"You don't want a passphrase - this is probably a *bad* idea!\n"
-"I will do it anyway. You can change your passphrase at any time,\n"
-"using this program with the option \"--edit-key\".\n"
-"\n"
-msgstr ""
-"Você não quer uma frase secreta - provavelmente isto é uma *má* idéia!\n"
-"Vou continuar assim mesmo. Você pode mudar sua frase secreta a\n"
-"qualquer hora, usando este programa com a opção \"--edit-key\".\n"
-"\n"
-
-msgid ""
"We need to generate a lot of random bytes. It is a good idea to perform\n"
"some other action (type on the keyboard, move the mouse, utilize the\n"
"disks) during the prime generation; this gives the random number\n"
@@ -4264,6 +4245,14 @@ msgid "Key generation canceled.\n"
msgstr "Geração de chave cancelada.\n"
#, fuzzy, c-format
+msgid "can't create backup file '%s': %s\n"
+msgstr "impossível criar `%s': %s\n"
+
+#, fuzzy, c-format
+msgid "Note: backup of card key saved to '%s'\n"
+msgstr "NOTA: chave secreta %08lX expirou em %s\n"
+
+#, fuzzy, c-format
#| msgid "writing public key to `%s'\n"
msgid "writing public key to '%s'\n"
msgstr "a escrever chave pública para `%s'\n"
@@ -4318,18 +4307,6 @@ msgstr "Componentes secretas da chave primária não disponíveis.\n"
msgid "Really create? (y/N) "
msgstr "Realmente criar? "
-#, fuzzy, c-format
-msgid "storing key onto card failed: %s\n"
-msgstr "remoção do bloco de chave falhou: %s\n"
-
-#, fuzzy, c-format
-msgid "can't create backup file '%s': %s\n"
-msgstr "impossível criar `%s': %s\n"
-
-#, fuzzy, c-format
-msgid "Note: backup of card key saved to '%s'\n"
-msgstr "NOTA: chave secreta %08lX expirou em %s\n"
-
msgid "never "
msgstr ""
@@ -4348,19 +4325,18 @@ msgstr "Notação de assinatura crítica: "
msgid "Signature notation: "
msgstr "Notação de assinatura: "
-#, fuzzy
-#| msgid "1 bad signature\n"
-msgid "1 good signature\n"
-msgstr "1 assinatura incorrecta\n"
-
#, fuzzy, c-format
#| msgid "%d bad signatures\n"
-msgid "%d good signatures\n"
-msgstr "%d assinaturas incorrectas\n"
+msgid "%d good signature\n"
+msgid_plural "%d good signatures\n"
+msgstr[0] "%d assinaturas incorrectas\n"
+msgstr[1] "%d assinaturas incorrectas\n"
#, c-format
-msgid "Warning: %lu key(s) skipped due to their large size\n"
-msgstr ""
+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] ""
msgid "Keyring"
msgstr "Porta-chaves"
@@ -4391,20 +4367,27 @@ msgid " Card serial no. ="
msgstr ""
#, fuzzy, c-format
-msgid "renaming '%s' to '%s' failed: %s\n"
-msgstr "criação de armadura falhou: %s\n"
-
-#, fuzzy, c-format
msgid "caching keyring '%s'\n"
msgstr "a verificar o porta chaves `%s'\n"
#, fuzzy, c-format
-msgid "%lu keys cached so far (%lu signatures)\n"
-msgstr "%lu chave verificadas (%lu assinaturas)\n"
+msgid "%lu keys cached so far (%lu signature)\n"
+msgid_plural "%lu keys cached so far (%lu signatures)\n"
+msgstr[0] "%lu chave verificadas (%lu assinaturas)\n"
+msgstr[1] "%lu chave verificadas (%lu assinaturas)\n"
+
+#, c-format
+msgid "%lu key cached"
+msgid_plural "%lu keys cached"
+msgstr[0] ""
+msgstr[1] ""
#, fuzzy, c-format
-msgid "%lu keys cached (%lu signatures)\n"
-msgstr "%lu chave verificadas (%lu assinaturas)\n"
+#| msgid "1 bad signature\n"
+msgid " (%lu signature)\n"
+msgid_plural " (%lu signatures)\n"
+msgstr[0] "1 assinatura incorrecta\n"
+msgstr[1] "1 assinatura incorrecta\n"
#, c-format
msgid "%s: keyring created\n"
@@ -4448,18 +4431,16 @@ msgid "\"%s\" not a key ID: skipping\n"
msgstr ""
#, fuzzy, c-format
-msgid "refreshing 1 key from %s\n"
-msgstr "a pedir a chave %08lX de %s\n"
+msgid "refreshing %d key from %s\n"
+msgid_plural "refreshing %d keys from %s\n"
+msgstr[0] "a pedir a chave %08lX de %s\n"
+msgstr[1] "a pedir a chave %08lX de %s\n"
#, fuzzy, c-format
msgid "WARNING: unable to refresh key %s via %s: %s\n"
msgstr "AVISO: dono pouco seguro em %s \"%s\"\n"
#, fuzzy, c-format
-msgid "refreshing %d keys from %s\n"
-msgstr "a pedir a chave %08lX de %s\n"
-
-#, fuzzy, c-format
msgid "key \"%s\" not found on keyserver\n"
msgstr "chave `%s' não encontrada: %s\n"
@@ -4478,9 +4459,9 @@ msgstr "a pedir a chave %08lX de %s\n"
msgid "requesting key %s from %s\n"
msgstr "a pedir a chave %08lX de %s\n"
-#, fuzzy, c-format
-msgid "sending key %s to %s server %s\n"
-msgstr "a procurar por \"%s\" no servidor HKP %s\n"
+#, fuzzy
+msgid "no keyserver known\n"
+msgstr "opções de exportação inválidas\n"
#, fuzzy, c-format
msgid "sending key %s to %s\n"
@@ -4708,6 +4689,17 @@ msgstr ""
msgid "Note: signatures using the %s algorithm are rejected\n"
msgstr "assinatura %s de: \"%s\"\n"
+#, fuzzy, c-format
+msgid "(reported error: %s)\n"
+msgstr "armadura: %s\n"
+
+#, fuzzy, c-format
+msgid "(reported error: %s <%s>)\n"
+msgstr "armadura: %s\n"
+
+msgid "(further info: "
+msgstr ""
+
#, c-format
msgid "%s:%d: deprecated option \"%s\"\n"
msgstr "%s:%d: opção depreciada \"%s\"\n"
@@ -5117,6 +5109,19 @@ msgstr "%s: ignorado: a chave pública está desactivada\n"
msgid "%s: skipped: public key already present\n"
msgstr "%s: ignorado: a chave pública já está presente\n"
+#, fuzzy, c-format
+#| msgid "can't connect to `%s': %s\n"
+msgid "can't encrypt to '%s'\n"
+msgstr "impossível ligar a `%s': %s\n"
+
+#, fuzzy, c-format
+msgid "option '%s' given, but no valid default keys given\n"
+msgstr "algoritmo de dispersão inválido `%s'\n"
+
+#, fuzzy, c-format
+msgid "option '%s' given, but option '%s' not given\n"
+msgstr "algoritmo de dispersão inválido `%s'\n"
+
msgid "You did not specify a user ID. (you may use \"-r\")\n"
msgstr "Não especificou um identificador de utilizador. (pode usar \"-r\")\n"
@@ -5160,11 +5165,6 @@ msgstr "chave %08lX: sem ID de utilizador\n"
msgid "data not saved; use option \"--output\" to save it\n"
msgstr "dados não gravados; use a opção \"--output\" para gravá-los\n"
-#, fuzzy, c-format
-#| msgid "error creating `%s': %s\n"
-msgid "error creating '%s': %s\n"
-msgstr "erro ao criar `%s': %s\n"
-
msgid "Detached signature.\n"
msgstr "Assinatura separada.\n"
@@ -5256,19 +5256,30 @@ msgid "This is a revocation certificate for the OpenPGP key:"
msgstr "Gerar um certificado de revogação para esta assinatura? (s/N)"
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 ""
+
+msgid ""
"Use it to revoke this key in case of a compromise or loss of\n"
"the secret key. However, if the secret key is still accessible,\n"
"it is better to generate a new revocation certificate and give\n"
-"a reason for the revocation."
+"a reason for the revocation. For details see the description of\n"
+"of the gpg command \"--gen-revoke\" in the GnuPG manual."
msgstr ""
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 making use of this revocation certificate."
+"before importing and publishing this revocation certificate."
msgstr ""
#, fuzzy, c-format
+msgid "revocation certificate stored as '%s.rev'\n"
+msgstr "chave %08lX: certificado de revogação \"%s\" adicionado\n"
+
+#, fuzzy, c-format
msgid "secret key \"%s\" not found\n"
msgstr "chave `%s' não encontrada: %s\n"
@@ -5279,6 +5290,11 @@ msgstr "chave `%s' não encontrada: %s\n"
msgid "'%s' matches multiple secret keys:\n"
msgstr ""
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "error searching the keyring: %s\n"
+msgstr "erro ao criar porta-chaves `%s': %s\n"
+
#, fuzzy
msgid "Create a revocation certificate for this key? (y/N) "
msgstr "Gerar um certificado de revogação para esta assinatura? (s/N)"
@@ -5355,24 +5371,37 @@ msgstr "não pode escolher uma chave como revogadora de si mesmo\n"
#, fuzzy, c-format
msgid "public key %s is %lu second newer than the signature\n"
-msgstr "a chave pública %08lX é %lu segundo mais nova que a assinatura\n"
+msgid_plural "public key %s is %lu seconds newer than the signature\n"
+msgstr[0] "a chave pública %08lX é %lu segundo mais nova que a assinatura\n"
+msgstr[1] "a chave pública %08lX é %lu segundo mais nova que a assinatura\n"
#, fuzzy, c-format
-msgid "public key %s is %lu seconds newer than the signature\n"
-msgstr "a chave pública %08lX é %lu segundos mais nova que a assinatura\n"
+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] "a chave pública %08lX é %lu segundo mais nova que a assinatura\n"
+msgstr[1] "a chave pública %08lX é %lu segundo mais nova que a assinatura\n"
#, fuzzy, c-format
msgid ""
"key %s was created %lu second in the future (time warp or clock problem)\n"
-msgstr ""
+msgid_plural ""
+"key %s was created %lu seconds in the future (time warp or clock problem)\n"
+msgstr[0] ""
+"a chave foi criada %lu segundo no futuro\n"
+"(viagem no tempo ou problema no relógio)\n"
+msgstr[1] ""
"a chave foi criada %lu segundo no futuro\n"
"(viagem no tempo ou problema no relógio)\n"
#, fuzzy, c-format
-msgid ""
-"key %s was created %lu seconds in the future (time warp or clock problem)\n"
-msgstr ""
-"a chave foi criada %lu segundos no futuro\n"
+msgid "key %s was created %lu day in the future (time warp or clock problem)\n"
+msgid_plural ""
+"key %s was created %lu days in the future (time warp or clock problem)\n"
+msgstr[0] ""
+"a chave foi criada %lu segundo no futuro\n"
+"(viagem no tempo ou problema no relógio)\n"
+msgstr[1] ""
+"a chave foi criada %lu segundo no futuro\n"
"(viagem no tempo ou problema no relógio)\n"
#, fuzzy, c-format
@@ -5607,6 +5636,237 @@ msgid "input line longer than %d characters\n"
msgstr "linha de entrada maior que %d caracteres\n"
#, fuzzy, c-format
+msgid "error beginning transaction on TOFU database: %s\n"
+msgstr "erro ao enviar para `%s': %s\n"
+
+#, c-format
+msgid "error committing transaction on TOFU database: %s\n"
+msgstr ""
+
+#, c-format
+msgid "error rolling back transaction on TOFU database: %s\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "unsupported TOFU database version: %s\n"
+msgstr ""
+"\n"
+"Algoritmos suportados:\n"
+
+#, fuzzy, c-format
+msgid "error reading TOFU database: %s\n"
+msgstr "erro ao enviar para `%s': %s\n"
+
+#, fuzzy, c-format
+#| msgid "error writing secret keyring `%s': %s\n"
+msgid "error determining TOFU database's version: %s\n"
+msgstr "erro ao escrever no porta-chaves secreto `%s': %s\n"
+
+#, fuzzy, c-format
+#| msgid "%s: error writing dir record: %s\n"
+msgid "error initializing TOFU database: %s\n"
+msgstr "%s: erro ao escrever registo de diretório: %s\n"
+
+#, fuzzy, c-format
+msgid "error opening TOFU database '%s': %s\n"
+msgstr "erro na leitura de `%s': %s\n"
+
+msgid "Warning: Home directory contains both tofu.db and tofu.d.\n"
+msgstr ""
+
+msgid "Using split format for TOFU database\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error updating TOFU database: %s\n"
+msgstr "erro ao enviar para `%s': %s\n"
+
+#, fuzzy, c-format
+msgid "public key %s not found: %s\n"
+msgstr "chave pública %08lX não encontrada: %s\n"
+
+#, fuzzy, c-format
+msgid "error setting TOFU binding's trust level to %s\n"
+msgstr "erro na leitura de `%s': %s\n"
+
+#, c-format
+msgid "The binding %s is NOT known."
+msgstr ""
+
+#, c-format
+msgid ""
+"The key %s raised a conflict with this binding (%s). Since this binding's "
+"policy was 'auto', it was changed to 'ask'."
+msgstr ""
+
+#, c-format
+msgid ""
+"Please indicate whether you believe the binding %s%sis legitimate (the key "
+"belongs to the stated owner) or a forgery (bad)."
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error gathering other user IDs: %s\n"
+msgstr "erro na criação da frase secreta: %s\n"
+
+msgid "Known user IDs associated with this key:\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "Policy: "
+msgid "policy: %s"
+msgstr "Política: "
+
+#, fuzzy, c-format
+msgid "error gathering signature stats: %s\n"
+msgstr "erro na criação da frase secreta: %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] ""
+msgstr[1] ""
+
+#, c-format
+msgid "Statistics for keys with the email address \"%s\":\n"
+msgstr ""
+
+#, fuzzy
+#| msgid "list keys"
+msgid "this key"
+msgstr "listar as chaves"
+
+#, c-format
+msgid "%ld message signed in the future."
+msgid_plural "%ld messages signed in the future."
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+msgid "%ld message signed"
+msgid_plural "%ld messages signed"
+msgstr[0] "|algo [ficheiros]|imprimir \"digests\" de mensagens"
+msgstr[1] "|algo [ficheiros]|imprimir \"digests\" de mensagens"
+
+#, c-format
+msgid " over the past %ld day."
+msgid_plural " over the past %ld days."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid " over the past %ld week."
+msgid_plural " over the past %ld weeks."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid " over the past %ld month."
+msgid_plural " over the past %ld months."
+msgstr[0] ""
+msgstr[1] ""
+
+#. 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 ""
+
+#. 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 ""
+
+msgid "(G)ood, (A)ccept once, (U)nknown, (R)eject once, (B)ad? "
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error changing TOFU policy: %s\n"
+msgstr "erro na criação da frase secreta: %s\n"
+
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "Have never verified a message signed by key %s!\n"
+msgstr ""
+
+#, c-format
+msgid "Failed to collect signature statistics for \"%s\" (key %s)\n"
+msgstr ""
+
+#, c-format
+msgid "Verified 0 messages signed by \"%s\" (key: %s, policy: %s)."
+msgstr ""
+
+#. TRANSLATORS: The final %s is replaced by a string like
+#. "7 months, 1 day, 5 minutes, 0 seconds".
+#, c-format
+msgid ""
+"Verified %ld message signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgid_plural ""
+"Verified %ld messages signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "The most recent message was verified %s ago."
+msgstr ""
+
+msgid "Warning: we've have yet to see a message signed by this key!\n"
+msgstr ""
+
+msgid "Warning: we've only seen a single message signed by this key!\n"
+msgstr ""
+
+#. TRANSLATORS: translate the below text. We don't
+#. directly internationalize that text so that we can
+#. tweak it without breaking translations.
+#, c-format
+msgid "TOFU: few signatures %d message %s"
+msgid_plural "TOFU: few signatures %d messages %s"
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+msgid "error opening TOFU database: %s\n"
+msgstr "erro ao enviar para `%s': %s\n"
+
+#, fuzzy, c-format
#| msgid "`%s' is not a valid long keyID\n"
msgid "'%s' is not a valid long keyID\n"
msgstr "`%s' não é um identificador longo de chave válido\n"
@@ -5666,19 +5926,23 @@ msgstr "não é necessária uma verificação da base de dados de confiança\n"
msgid "no need for a trustdb update with '%s' trust model\n"
msgstr "não é necessária uma verificação da base de dados de confiança\n"
-#, fuzzy, c-format
-msgid "public key %s not found: %s\n"
-msgstr "chave pública %08lX não encontrada: %s\n"
-
msgid "please do a --check-trustdb\n"
msgstr ""
msgid "checking the trustdb\n"
msgstr "a verificar a base de dados de confiança\n"
+#, fuzzy, c-format
+msgid "%d key processed"
+msgid_plural "%d keys processed"
+msgstr[0] "%lu chaves processadas até agora\n"
+msgstr[1] "%lu chaves processadas até agora\n"
+
#, c-format
-msgid "%d keys processed (%d validity counts cleared)\n"
-msgstr ""
+msgid " (%d validity count cleared)\n"
+msgid_plural " (%d validity counts cleared)\n"
+msgstr[0] ""
+msgstr[1] ""
#, fuzzy
msgid "no ultimately trusted keys found\n"
@@ -5691,10 +5955,6 @@ msgstr ""
"chave pública da chave absolutamente de confiança %08lX não encontrada\n"
#, c-format
-msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
-msgstr ""
-
-#, c-format
msgid ""
"depth: %d valid: %3d signed: %3d trust: %d-, %dq, %dn, %dm, %df, %du\n"
msgstr ""
@@ -5892,8 +6152,11 @@ msgid "card is permanently locked!\n"
msgstr ""
#, c-format
-msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
-msgstr ""
+msgid "%d Admin PIN attempt remaining before card is permanently locked\n"
+msgid_plural ""
+"%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr[0] ""
+msgstr[1] ""
#. TRANSLATORS: Do not translate the "|A|" prefix but keep it at
#. the start of the string. Use %%0A to force a linefeed.
@@ -5983,8 +6246,10 @@ msgid "generating key failed\n"
msgstr "remoção do bloco de chave falhou: %s\n"
#, fuzzy, c-format
-msgid "key generation completed (%d seconds)\n"
-msgstr "A geração de chaves falhou: %s\n"
+msgid "key generation completed (%d second)\n"
+msgid_plural "key generation completed (%d seconds)\n"
+msgstr[0] "A geração de chaves falhou: %s\n"
+msgstr[1] "A geração de chaves falhou: %s\n"
msgid "invalid structure of OpenPGP card (DO 0x93)\n"
msgstr ""
@@ -8184,6 +8449,9 @@ msgstr "|N|usar mode de frase secreta N"
msgid "do not allow the reuse of old passphrases"
msgstr "erro na criação da frase secreta: %s\n"
+msgid "|N|set the Pinentry timeout to N seconds"
+msgstr ""
+
msgid "|NAME|use NAME as default secret key"
msgstr "|NOME|usar NOME como chave secreta por omissão"
@@ -8481,6 +8749,89 @@ msgid ""
"Check a passphrase given on stdin against the patternfile\n"
msgstr ""
+#~ msgid "%d signatures not checked due to missing keys\n"
+#~ msgstr "%d assinaturas não verificadas por falta de chaves\n"
+
+#~ msgid "%d signatures not checked due to errors\n"
+#~ msgstr "%d assinaturas não verificadas devido a erros\n"
+
+#~ msgid "1 user ID without valid self-signature detected\n"
+#~ msgstr "1 ID de utilizador sem auto-assinatura válida detectado\n"
+
+#~ msgid "Deleted %d signatures.\n"
+#~ msgstr "%d assinaturas removidas.\n"
+
+#, fuzzy
+#~ msgid "User ID \"%s\": %d signatures removed\n"
+#~ msgstr "Utilizador \"%s\" está revocado."
+
+#~ msgid ""
+#~ "You need a Passphrase to protect your secret key.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Você precisa de uma frase secreta para proteger a sua chave.\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "Please enter a passphrase to protect the off-card backup of the new "
+#~ "encryption key."
+#~ msgstr "Por favor digite a frase secreta \n"
+
+#~ msgid "passphrase not correctly repeated; try again"
+#~ msgstr "a frase secreta não foi repetida corretamente; tente outra vez"
+
+#~ msgid "%s.\n"
+#~ msgstr "%s.\n"
+
+#~ msgid ""
+#~ "You don't want a passphrase - this is probably a *bad* idea!\n"
+#~ "I will do it anyway. You can change your passphrase at any time,\n"
+#~ "using this program with the option \"--edit-key\".\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Você não quer uma frase secreta - provavelmente isto é uma *má* idéia!\n"
+#~ "Vou continuar assim mesmo. Você pode mudar sua frase secreta a\n"
+#~ "qualquer hora, usando este programa com a opção \"--edit-key\".\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid "storing key onto card failed: %s\n"
+#~ msgstr "remoção do bloco de chave falhou: %s\n"
+
+#, fuzzy
+#~| msgid "1 bad signature\n"
+#~ msgid "1 good signature\n"
+#~ msgstr "1 assinatura incorrecta\n"
+
+#, fuzzy
+#~ msgid "renaming '%s' to '%s' failed: %s\n"
+#~ msgstr "criação de armadura falhou: %s\n"
+
+#, fuzzy
+#~ msgid "%lu keys cached (%lu signatures)\n"
+#~ msgstr "%lu chave verificadas (%lu assinaturas)\n"
+
+#, fuzzy
+#~ msgid "refreshing 1 key from %s\n"
+#~ msgstr "a pedir a chave %08lX de %s\n"
+
+#, fuzzy
+#~ msgid "sending key %s to %s server %s\n"
+#~ msgstr "a procurar por \"%s\" no servidor HKP %s\n"
+
+#, fuzzy
+#~ msgid "public key %s is %lu seconds newer than the signature\n"
+#~ msgstr "a chave pública %08lX é %lu segundos mais nova que a assinatura\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "key %s was created %lu seconds in the future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "a chave foi criada %lu segundos no futuro\n"
+#~ "(viagem no tempo ou problema no relógio)\n"
+
#, fuzzy
#~| msgid "can't open the keyring"
#~ msgid "Failed to open the keyring DB.\n"
@@ -8724,10 +9075,6 @@ msgstr ""
#~ msgstr "a procurar por \"%s\" no servidor HKP %s\n"
#, fuzzy
-#~ msgid "no keyserver action!\n"
-#~ msgstr "opções de exportação inválidas\n"
-
-#, fuzzy
#~ msgid "keyserver timed out\n"
#~ msgstr "erro do servidor de chaves"
@@ -9891,9 +10238,6 @@ msgstr ""
#~ msgid "%s%c %4u%c/%08lX created: %s expires: %s"
#~ msgstr "%s%c %4u%c/%08lX criada: %s expira: %s"
-#~ msgid "Policy: "
-#~ msgstr "Política: "
-
#~ msgid "can't get key from keyserver: %s\n"
#~ msgstr "não consigo obter chave do servidor: %s\n"
diff --git a/po/ro.po b/po/ro.po
index 92cd9b6..a8b2be4 100644
--- a/po/ro.po
+++ b/po/ro.po
@@ -1258,6 +1258,20 @@ msgstr ""
msgid "Enter passphrase: "
msgstr "Introduceþi fraza-parolã: "
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "error getting version from '%s': %s\n"
+msgstr "eroare la crearea inelului de chei `%s': %s\n"
+
+#, c-format
+msgid "server '%s' is older than us (%s < %s)"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "WARNING: "
+msgid "WARNING: %s\n"
+msgstr "AVERTISMENT: "
+
#, c-format
msgid "OpenPGP card not available: %s\n"
msgstr "cardul OpenPGP nu e disponibil: %s\n"
@@ -1745,6 +1759,11 @@ msgstr "cheie secretã de nefolosit"
msgid "remove as much as possible from key during export"
msgstr ""
+#, fuzzy
+#| msgid "%s: skipped: %s\n"
+msgid " - skipped"
+msgstr "%s: sãritã: %s\n"
+
msgid "exporting secret keys not allowed\n"
msgstr "exportul cheilor secrete nu este permis\n"
@@ -1756,18 +1775,35 @@ msgstr "cheia %s: cheie stil PGP 2.x - sãritã\n"
msgid "key %s: key material on-card - skipped\n"
msgstr "cheia %s: semnãturã subcheie într-un loc greºit - sãritã\n"
-#, fuzzy
-#| msgid "%s: skipped: %s\n"
-msgid " - skipped"
-msgstr "%s: sãritã: %s\n"
-
msgid "WARNING: nothing exported\n"
msgstr "AVERTISMENT: nimic exportat\n"
+#, fuzzy, c-format
+#| msgid "error creating `%s': %s\n"
+msgid "error creating '%s': %s\n"
+msgstr "eroare la creearea `%s': %s\n"
+
msgid "[User ID not found]"
msgstr "[ID utilizator nu a fost gãsit]"
#, fuzzy, c-format
+msgid "(check argument of option '%s')\n"
+msgstr "opþiuni enumerare invalide\n"
+
+#, c-format
+msgid "Warning: '%s' should be a long key ID or a fingerprint\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error looking up: %s\n"
+msgstr "eroare în `%s': %s\n"
+
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "Warning: %s appears in the keyring %d times\n"
+msgstr "eroare la crearea inelului de chei `%s': %s\n"
+
+#, fuzzy, c-format
msgid "automatically retrieved '%s' via %s\n"
msgstr "eroare la creearea `%s': %s\n"
@@ -1784,15 +1820,20 @@ msgid "secret key \"%s\" not found: %s\n"
msgstr "cheia secretã \"%s\" nu a fost gãsitã: %s\n"
#, fuzzy, c-format
-msgid "(check argument of option '%s')\n"
-msgstr "opþiuni enumerare invalide\n"
+#| msgid "|NAME|use NAME as default secret key"
+msgid "Warning: not using '%s' as default key: %s\n"
+msgstr "|NUME|foloseºte NUME ca cheie secretã implicitã"
#, fuzzy, c-format
#| msgid "|NAME|use NAME as default secret key"
-msgid "using \"%s\" as default secret key\n"
+msgid "using \"%s\" as default secret key for signing\n"
msgstr "|NUME|foloseºte NUME ca cheie secretã implicitã"
#, c-format
+msgid "all values passed to '%s' ignored\n"
+msgstr ""
+
+#, c-format
msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
msgstr "Cheia invalidã %s fãcutã validã de --allow-non-selfsigned-uid\n"
@@ -2182,28 +2223,6 @@ msgid "Note: old default options file '%s' ignored\n"
msgstr "NOTÃ: fisier opþiuni implicite vechi `%s' ignorat\n"
#, c-format
-msgid ""
-"Warning: value '%s' for option '%s' should be a long key ID or a "
-"fingerprint\n"
-msgstr ""
-
-#, c-format
-msgid "key specification '%s' is ambiguous\n"
-msgstr ""
-
-#. TRANSLATORS: The %s prints a key specification which
-#. for example has been given at the command line. Two
-#. lines with fingerprints are printed after this message.
-#, c-format
-msgid "'%s' matches at least:\n"
-msgstr ""
-
-#, fuzzy, c-format
-#| msgid "error creating keyring `%s': %s\n"
-msgid "error searching the keyring: %s\n"
-msgstr "eroare la crearea inelului de chei `%s': %s\n"
-
-#, c-format
msgid "libgcrypt is too old (need %s, have %s)\n"
msgstr ""
@@ -2410,14 +2429,6 @@ msgstr ""
"AVERTISMENT: destinatari (-r) furnizaþi fãrã a folosi cifrare cu cheie "
"publicã\n"
-#, fuzzy, c-format
-msgid "option '%s' given, but no valid default keys given\n"
-msgstr "algoritm hash invalid `%s'\n"
-
-#, fuzzy, c-format
-msgid "option '%s' given, but option '%s' not given\n"
-msgstr "algoritm hash invalid `%s'\n"
-
msgid "--store [filename]"
msgstr "--store [nume_fiºier]"
@@ -2492,6 +2503,11 @@ msgstr "recepþie server de chei eºuatã: %s\n"
msgid "key export failed: %s\n"
msgstr "export cheie eºuat: %s\n"
+#, fuzzy, c-format
+#| msgid "key export failed: %s\n"
+msgid "export as ssh key failed: %s\n"
+msgstr "export cheie eºuat: %s\n"
+
#, c-format
msgid "keyserver search failed: %s\n"
msgstr "cãutare server de chei eºuatã: %s\n"
@@ -2987,33 +3003,33 @@ msgstr "[revocare]"
msgid "[self-signature]"
msgstr "[auto-semnãturã]"
-msgid "1 bad signature\n"
-msgstr "1 semnãturã incorectã\n"
-
-#, c-format
-msgid "%d bad signatures\n"
-msgstr "%d semnãturi incorecte\n"
-
-msgid "1 signature not checked due to a missing key\n"
-msgstr "1 semnãturã nu a fost verificatã din cauza unei chei lipsã\n"
-
-#, c-format
-msgid "%d signatures not checked due to missing keys\n"
-msgstr "%d semnãturi nu au fost verificate din cauza unor chei lipsã\n"
-
-msgid "1 signature not checked due to an error\n"
-msgstr "1 semnãturã nu a fost verificatã din cauza unei erori\n"
+#, fuzzy, c-format
+#| msgid "%d bad signatures\n"
+msgid "%d bad signature\n"
+msgid_plural "%d bad signatures\n"
+msgstr[0] "%d semnãturi incorecte\n"
+msgstr[1] "%d semnãturi incorecte\n"
-#, c-format
-msgid "%d signatures not checked due to errors\n"
-msgstr "%d semnãturi nu au fost verificate din cauza unor erori\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to a missing key\n"
+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 semnãturã nu a fost verificatã din cauza unei chei lipsã\n"
+msgstr[1] "1 semnãturã nu a fost verificatã din cauza unei chei lipsã\n"
-msgid "1 user ID without valid self-signature detected\n"
-msgstr "am gãsit 1 ID utilizator fãrã auto-semnãturã validã\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to an error\n"
+msgid "%d signature not checked due to an error\n"
+msgid_plural "%d signatures not checked due to errors\n"
+msgstr[0] "1 semnãturã nu a fost verificatã din cauza unei erori\n"
+msgstr[1] "1 semnãturã nu a fost verificatã din cauza unei erori\n"
-#, c-format
-msgid "%d user IDs without valid self-signatures detected\n"
-msgstr "am gãsit %d ID-uri utilizator fãrã auto-semnãturi valide\n"
+#, fuzzy, c-format
+#| msgid "%d user IDs without valid self-signatures detected\n"
+msgid "%d user ID without valid self-signature detected\n"
+msgid_plural "%d user IDs without valid self-signatures detected\n"
+msgstr[0] "am gãsit %d ID-uri utilizator fãrã auto-semnãturi valide\n"
+msgstr[1] "am gãsit %d ID-uri utilizator fãrã auto-semnãturi valide\n"
msgid ""
"Please decide how far you trust this user to correctly verify other users' "
@@ -3619,13 +3635,12 @@ msgstr "ªtergeþi aceastã semnãturã necunoscutã? (d/N/t)"
msgid "Really delete this self-signature? (y/N)"
msgstr "ªtergeþi într-adevãr aceastã auto-semnãturã? (d/N)"
-#, c-format
+#, fuzzy, c-format
+#| msgid "Deleted %d signature.\n"
msgid "Deleted %d signature.\n"
-msgstr "Am ºters %d semnãturi.\n"
-
-#, c-format
-msgid "Deleted %d signatures.\n"
-msgstr "Am ºters %d semnãturi.\n"
+msgid_plural "Deleted %d signatures.\n"
+msgstr[0] "Am ºters %d semnãturi.\n"
+msgstr[1] "Am ºters %d semnãturi.\n"
msgid "Nothing deleted.\n"
msgstr "Nu am ºters nimic.\n"
@@ -3639,11 +3654,9 @@ msgstr "ID utilizator \"%s\" a fost revocat."
#, fuzzy, c-format
msgid "User ID \"%s\": %d signature removed\n"
-msgstr "ID utilizator \"%s\" a fost revocat."
-
-#, fuzzy, c-format
-msgid "User ID \"%s\": %d signatures removed\n"
-msgstr "ID utilizator \"%s\" a fost revocat."
+msgid_plural "User ID \"%s\": %d signatures removed\n"
+msgstr[0] "ID utilizator \"%s\" a fost revocat."
+msgstr[1] "ID utilizator \"%s\" a fost revocat."
#, fuzzy, c-format
msgid "User ID \"%s\": already minimized\n"
@@ -4176,37 +4189,6 @@ msgid "Please correct the error first\n"
msgstr "Vã rugãm corectaþi mai întâi eroarea\n"
msgid ""
-"You need a Passphrase to protect your secret key.\n"
-"\n"
-msgstr ""
-"Aveþi nevoie de o frazã-parolã pentru a vã proteja cheia secretã.\n"
-"\n"
-
-#, fuzzy
-msgid ""
-"Please enter a passphrase to protect the off-card backup of the new "
-"encryption key."
-msgstr ""
-"Vã rugãm introduceþi fraza-parolã; aceasta este o propoziþie secretã \n"
-
-msgid "passphrase not correctly repeated; try again"
-msgstr "fraza-parolã nu a fost repetatã corect; mai încercaþi o datã"
-
-#, c-format
-msgid "%s.\n"
-msgstr "%s.\n"
-
-msgid ""
-"You don't want a passphrase - this is probably a *bad* idea!\n"
-"I will do it anyway. You can change your passphrase at any time,\n"
-"using this program with the option \"--edit-key\".\n"
-"\n"
-msgstr ""
-"Nu aveþi nevoie de o frazã-parolã - aceasta este probabil o idee *proastã*!\n"
-"O sã o fac oricum. Puteþi schimba fraza-parolã oricând, folosind acest\n"
-"program cu opþiunea \"--edit-key\".\n"
-
-msgid ""
"We need to generate a lot of random bytes. It is a good idea to perform\n"
"some other action (type on the keyboard, move the mouse, utilize the\n"
"disks) during the prime generation; this gives the random number\n"
@@ -4254,6 +4236,16 @@ msgid "Key generation canceled.\n"
msgstr "Generarea cheii a fost anulatã.\n"
#, fuzzy, c-format
+#| msgid "can't create backup file `%s': %s\n"
+msgid "can't create backup file '%s': %s\n"
+msgstr "nu pot crea fiºier de rezervã `%s': %s\n"
+
+#, fuzzy, c-format
+#| msgid "NOTE: backup of card key saved to `%s'\n"
+msgid "Note: backup of card key saved to '%s'\n"
+msgstr "NOTÃ: copia de siguranþa a cheii cardului salvatã la `%s'\n"
+
+#, fuzzy, c-format
#| msgid "writing public key to `%s'\n"
msgid "writing public key to '%s'\n"
msgstr "scriu cheia publicã în `%s'\n"
@@ -4307,20 +4299,6 @@ msgstr "Pãrþi secrete ale cheii primare sunt stacate pe card.\n"
msgid "Really create? (y/N) "
msgstr "Creaþi într-adevãr? (d/N) "
-#, c-format
-msgid "storing key onto card failed: %s\n"
-msgstr "stocarea cheii pe card a eºuat: %s\n"
-
-#, fuzzy, c-format
-#| msgid "can't create backup file `%s': %s\n"
-msgid "can't create backup file '%s': %s\n"
-msgstr "nu pot crea fiºier de rezervã `%s': %s\n"
-
-#, fuzzy, c-format
-#| msgid "NOTE: backup of card key saved to `%s'\n"
-msgid "Note: backup of card key saved to '%s'\n"
-msgstr "NOTÃ: copia de siguranþa a cheii cardului salvatã la `%s'\n"
-
msgid "never "
msgstr "niciodatã "
@@ -4339,19 +4317,18 @@ msgstr "Notare semnãturã criticã: "
msgid "Signature notation: "
msgstr "Notare semnãturã: "
-#, fuzzy
-#| msgid "1 bad signature\n"
-msgid "1 good signature\n"
-msgstr "1 semnãturã incorectã\n"
-
#, fuzzy, c-format
#| msgid "%d bad signatures\n"
-msgid "%d good signatures\n"
-msgstr "%d semnãturi incorecte\n"
+msgid "%d good signature\n"
+msgid_plural "%d good signatures\n"
+msgstr[0] "%d semnãturi incorecte\n"
+msgstr[1] "%d semnãturi incorecte\n"
#, c-format
-msgid "Warning: %lu key(s) skipped due to their large size\n"
-msgstr ""
+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] ""
msgid "Keyring"
msgstr "Inel de chei"
@@ -4381,22 +4358,29 @@ msgid " Card serial no. ="
msgstr " Card nr. serie ="
#, fuzzy, c-format
-#| msgid "renaming `%s' to `%s' failed: %s\n"
-msgid "renaming '%s' to '%s' failed: %s\n"
-msgstr "redenumirea `%s' ca `%s' a eºuat: %s\n"
-
-#, fuzzy, c-format
#| msgid "caching keyring `%s'\n"
msgid "caching keyring '%s'\n"
msgstr "pun în cache inelul de chei `%s'\n"
-#, c-format
-msgid "%lu keys cached so far (%lu signatures)\n"
-msgstr "%lu chei puse în cache pânã acum (%lu semnãturi)\n"
+#, fuzzy, c-format
+#| msgid "%lu keys cached so far (%lu signatures)\n"
+msgid "%lu keys cached so far (%lu signature)\n"
+msgid_plural "%lu keys cached so far (%lu signatures)\n"
+msgstr[0] "%lu chei puse în cache pânã acum (%lu semnãturi)\n"
+msgstr[1] "%lu chei puse în cache pânã acum (%lu semnãturi)\n"
#, c-format
-msgid "%lu keys cached (%lu signatures)\n"
-msgstr "%lu chei puse în cache (%lu semnãturi)\n"
+msgid "%lu key cached"
+msgid_plural "%lu keys cached"
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+#| msgid "1 bad signature\n"
+msgid " (%lu signature)\n"
+msgid_plural " (%lu signatures)\n"
+msgstr[0] "1 semnãturã incorectã\n"
+msgstr[1] "1 semnãturã incorectã\n"
#, c-format
msgid "%s: keyring created\n"
@@ -4438,19 +4422,18 @@ msgstr "protocol server de chei invalid (us %d!=handler %d)\n"
msgid "\"%s\" not a key ID: skipping\n"
msgstr "\"%s\" nu este un ID de cheie: sãrit\n"
-#, c-format
-msgid "refreshing 1 key from %s\n"
-msgstr "reactualizez 1 cheie de la %s\n"
+#, fuzzy, c-format
+#| msgid "refreshing %d keys from %s\n"
+msgid "refreshing %d key from %s\n"
+msgid_plural "refreshing %d keys from %s\n"
+msgstr[0] "reactualizez %d chei de la %s\n"
+msgstr[1] "reactualizez %d chei de la %s\n"
#, c-format
msgid "WARNING: unable to refresh key %s via %s: %s\n"
msgstr "AVERTISMENT: nu pot reactualiza cheia %s via %s: %s\n"
#, c-format
-msgid "refreshing %d keys from %s\n"
-msgstr "reactualizez %d chei de la %s\n"
-
-#, c-format
msgid "key \"%s\" not found on keyserver\n"
msgstr "cheia \"%s\" nu a fost gãsitã pe serverul de chei\n"
@@ -4468,9 +4451,10 @@ msgstr "cer cheia %s de la serverul %s %s\n"
msgid "requesting key %s from %s\n"
msgstr "cer cheia %s de la %s\n"
-#, c-format
-msgid "sending key %s to %s server %s\n"
-msgstr "trimit cheia %s serverului %s %s\n"
+#, fuzzy
+#| msgid "no keyserver action!\n"
+msgid "no keyserver known\n"
+msgstr "nici o acþiune pentru serverul de chei!\n"
#, c-format
msgid "sending key %s to %s\n"
@@ -4692,6 +4676,19 @@ msgstr "AVERTISMENT: algoritmul rezumat %s este prea vechi (deprecated)\n"
msgid "Note: signatures using the %s algorithm are rejected\n"
msgstr "semnãturã %s, algoritm rezumat %s\n"
+#, fuzzy, c-format
+#| msgid "read error in `%s': %s\n"
+msgid "(reported error: %s)\n"
+msgstr "eroare citire în `%s': %s\n"
+
+#, fuzzy, c-format
+#| msgid "read error in `%s': %s\n"
+msgid "(reported error: %s <%s>)\n"
+msgstr "eroare citire în `%s': %s\n"
+
+msgid "(further info: "
+msgstr ""
+
#, c-format
msgid "%s:%d: deprecated option \"%s\"\n"
msgstr "%s:%d: opþiune învechitã \"%s\"\n"
@@ -5110,6 +5107,19 @@ msgstr "%s: sãritã: cheia publicã este deactivatã\n"
msgid "%s: skipped: public key already present\n"
msgstr "%s: sãritã: cheia publicã este deja prezentã\n"
+#, fuzzy, c-format
+#| msgid "can't connect to `%s': %s\n"
+msgid "can't encrypt to '%s'\n"
+msgstr "nu mã pot conecta la `%s': %s\n"
+
+#, fuzzy, c-format
+msgid "option '%s' given, but no valid default keys given\n"
+msgstr "algoritm hash invalid `%s'\n"
+
+#, fuzzy, c-format
+msgid "option '%s' given, but option '%s' not given\n"
+msgstr "algoritm hash invalid `%s'\n"
+
msgid "You did not specify a user ID. (you may use \"-r\")\n"
msgstr "Nu aþi specificat un ID utilizator. (puteþi folosi \"-r\")\n"
@@ -5154,11 +5164,6 @@ msgid "data not saved; use option \"--output\" to save it\n"
msgstr ""
"datele nu au fost salvate: folosiþi opþiunea \"--output\" pentru a le salva\n"
-#, fuzzy, c-format
-#| msgid "error creating `%s': %s\n"
-msgid "error creating '%s': %s\n"
-msgstr "eroare la creearea `%s': %s\n"
-
msgid "Detached signature.\n"
msgstr "Semnãturã detaºatã.\n"
@@ -5252,19 +5257,31 @@ msgid "This is a revocation certificate for the OpenPGP key:"
msgstr "Creaþi un certificat de revocare pentru aceastã cheie? (d/N) "
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 ""
+
+msgid ""
"Use it to revoke this key in case of a compromise or loss of\n"
"the secret key. However, if the secret key is still accessible,\n"
"it is better to generate a new revocation certificate and give\n"
-"a reason for the revocation."
+"a reason for the revocation. For details see the description of\n"
+"of the gpg command \"--gen-revoke\" in the GnuPG manual."
msgstr ""
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 making use of this revocation certificate."
+"before importing and publishing this revocation certificate."
msgstr ""
#, fuzzy, c-format
+#| msgid "Revocation certificate created.\n"
+msgid "revocation certificate stored as '%s.rev'\n"
+msgstr "Certificat de revocare creat.\n"
+
+#, fuzzy, c-format
#| msgid "secret key \"%s\" not found: %s\n"
msgid "secret key \"%s\" not found\n"
msgstr "cheia secretã \"%s\" nu a fost gãsitã: %s\n"
@@ -5276,6 +5293,11 @@ msgstr "cheia secretã \"%s\" nu a fost gãsitã: %s\n"
msgid "'%s' matches multiple secret keys:\n"
msgstr ""
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "error searching the keyring: %s\n"
+msgstr "eroare la crearea inelului de chei `%s': %s\n"
+
msgid "Create a revocation certificate for this key? (y/N) "
msgstr "Creaþi un certificat de revocare pentru aceastã cheie? (d/N) "
@@ -5353,26 +5375,45 @@ msgstr ""
"AVERTISMENT: subcheia de semnare %s are o certificare-reciprocã invalidã "
"(invalid cross-certification)\n"
-#, c-format
+#, fuzzy, c-format
+#| msgid "public key %s is %lu second newer than the signature\n"
msgid "public key %s is %lu second newer than the signature\n"
-msgstr "cheie publicã %s este mai nouã cu %lu secundã decât semnãtura\n"
+msgid_plural "public key %s is %lu seconds newer than the signature\n"
+msgstr[0] "cheie publicã %s este mai nouã cu %lu secundã decât semnãtura\n"
+msgstr[1] "cheie publicã %s este mai nouã cu %lu secundã decât semnãtura\n"
-#, c-format
-msgid "public key %s is %lu seconds newer than the signature\n"
-msgstr "cheie publicã %s este mai nouã cu %lu secunde decât semnãtura\n"
+#, fuzzy, c-format
+#| msgid "public key %s is %lu second newer than the signature\n"
+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] "cheie publicã %s este mai nouã cu %lu secundã decât semnãtura\n"
+msgstr[1] "cheie publicã %s este mai nouã cu %lu secundã decât semnãtura\n"
-#, c-format
+#, fuzzy, c-format
+#| msgid ""
+#| "key %s was created %lu second in the future (time warp or clock problem)\n"
msgid ""
"key %s was created %lu second in the future (time warp or clock problem)\n"
-msgstr ""
+msgid_plural ""
+"key %s was created %lu seconds in the future (time warp or clock problem)\n"
+msgstr[0] ""
+"cheia %s a fost creatã %lu secundã în viitor (warp în timp sau probleme cu "
+"ceasul)\n"
+msgstr[1] ""
"cheia %s a fost creatã %lu secundã în viitor (warp în timp sau probleme cu "
"ceasul)\n"
-#, c-format
-msgid ""
-"key %s was created %lu seconds in the future (time warp or clock problem)\n"
-msgstr ""
-"cheia %s a fost creatã %lu secunde în viitor (warp în timp sau probleme cu "
+#, fuzzy, c-format
+#| msgid ""
+#| "key %s was created %lu second in the future (time warp or clock problem)\n"
+msgid "key %s was created %lu day in the future (time warp or clock problem)\n"
+msgid_plural ""
+"key %s was created %lu days in the future (time warp or clock problem)\n"
+msgstr[0] ""
+"cheia %s a fost creatã %lu secundã în viitor (warp în timp sau probleme cu "
+"ceasul)\n"
+msgstr[1] ""
+"cheia %s a fost creatã %lu secundã în viitor (warp în timp sau probleme cu "
"ceasul)\n"
#, fuzzy, c-format
@@ -5610,6 +5651,238 @@ msgid "input line longer than %d characters\n"
msgstr "linii de intrare mai lungi de %d caractere\n"
#, fuzzy, c-format
+msgid "error beginning transaction on TOFU database: %s\n"
+msgstr "eroare trimitere la `%s': %s\n"
+
+#, c-format
+msgid "error committing transaction on TOFU database: %s\n"
+msgstr ""
+
+#, c-format
+msgid "error rolling back transaction on TOFU database: %s\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "unsupported TOFU database version: %s\n"
+msgstr ""
+"\n"
+"Algoritmuri suportate:\n"
+
+#, fuzzy, c-format
+msgid "error reading TOFU database: %s\n"
+msgstr "eroare trimitere la `%s': %s\n"
+
+#, fuzzy, c-format
+#| msgid "error writing secret keyring `%s': %s\n"
+msgid "error determining TOFU database's version: %s\n"
+msgstr "eroare la scrierea inelului de chei secret `%s': %s\n"
+
+#, fuzzy, c-format
+#| msgid "%s: error writing dir record: %s\n"
+msgid "error initializing TOFU database: %s\n"
+msgstr "%s: eroare scriere înregistrare dir: %s\n"
+
+#, fuzzy, c-format
+msgid "error opening TOFU database '%s': %s\n"
+msgstr "eroare în `%s': %s\n"
+
+msgid "Warning: Home directory contains both tofu.db and tofu.d.\n"
+msgstr ""
+
+msgid "Using split format for TOFU database\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error updating TOFU database: %s\n"
+msgstr "eroare trimitere la `%s': %s\n"
+
+#, c-format
+msgid "public key %s not found: %s\n"
+msgstr "cheia publicã %s nu a fost gãsitã: %s\n"
+
+#, fuzzy, c-format
+msgid "error setting TOFU binding's trust level to %s\n"
+msgstr "eroare la citire `%s': %s\n"
+
+#, c-format
+msgid "The binding %s is NOT known."
+msgstr ""
+
+#, c-format
+msgid ""
+"The key %s raised a conflict with this binding (%s). Since this binding's "
+"policy was 'auto', it was changed to 'ask'."
+msgstr ""
+
+#, c-format
+msgid ""
+"Please indicate whether you believe the binding %s%sis legitimate (the key "
+"belongs to the stated owner) or a forgery (bad)."
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "error getting new PIN: %s\n"
+msgid "error gathering other user IDs: %s\n"
+msgstr "eroare la obþinere noului PIN: %s\n"
+
+msgid "Known user IDs associated with this key:\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "Policy: "
+msgid "policy: %s"
+msgstr "Politica: "
+
+#, fuzzy, c-format
+msgid "error gathering signature stats: %s\n"
+msgstr "eroare la obþinere noului PIN: %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] ""
+msgstr[1] ""
+
+#, c-format
+msgid "Statistics for keys with the email address \"%s\":\n"
+msgstr ""
+
+#, fuzzy
+#| msgid "list keys"
+msgid "this key"
+msgstr "enumerã chei"
+
+#, c-format
+msgid "%ld message signed in the future."
+msgid_plural "%ld messages signed in the future."
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+msgid "%ld message signed"
+msgid_plural "%ld messages signed"
+msgstr[0] "|algo [fiºiere]|afiºeazã rezumate mesaje"
+msgstr[1] "|algo [fiºiere]|afiºeazã rezumate mesaje"
+
+#, c-format
+msgid " over the past %ld day."
+msgid_plural " over the past %ld days."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid " over the past %ld week."
+msgid_plural " over the past %ld weeks."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid " over the past %ld month."
+msgid_plural " over the past %ld months."
+msgstr[0] ""
+msgstr[1] ""
+
+#. 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 ""
+
+#. 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 ""
+
+msgid "(G)ood, (A)ccept once, (U)nknown, (R)eject once, (B)ad? "
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error changing TOFU policy: %s\n"
+msgstr "eroare la crearea frazei-parolã: %s\n"
+
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "Have never verified a message signed by key %s!\n"
+msgstr ""
+
+#, c-format
+msgid "Failed to collect signature statistics for \"%s\" (key %s)\n"
+msgstr ""
+
+#, c-format
+msgid "Verified 0 messages signed by \"%s\" (key: %s, policy: %s)."
+msgstr ""
+
+#. TRANSLATORS: The final %s is replaced by a string like
+#. "7 months, 1 day, 5 minutes, 0 seconds".
+#, c-format
+msgid ""
+"Verified %ld message signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgid_plural ""
+"Verified %ld messages signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "The most recent message was verified %s ago."
+msgstr ""
+
+msgid "Warning: we've have yet to see a message signed by this key!\n"
+msgstr ""
+
+msgid "Warning: we've only seen a single message signed by this key!\n"
+msgstr ""
+
+#. TRANSLATORS: translate the below text. We don't
+#. directly internationalize that text so that we can
+#. tweak it without breaking translations.
+#, c-format
+msgid "TOFU: few signatures %d message %s"
+msgid_plural "TOFU: few signatures %d messages %s"
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+msgid "error opening TOFU database: %s\n"
+msgstr "eroare trimitere la `%s': %s\n"
+
+#, fuzzy, c-format
#| msgid "`%s' is not a valid long keyID\n"
msgid "'%s' is not a valid long keyID\n"
msgstr "`%s' nu este un ID-cheie de lungime validã\n"
@@ -5670,19 +5943,25 @@ msgstr "nu e nevoie de o verificare trustdb cu modelul de încredere `%s'\n"
msgid "no need for a trustdb update with '%s' trust model\n"
msgstr "nu e nevoie de o actualizare trustdb cu modelul de încredere `%s'\n"
-#, c-format
-msgid "public key %s not found: %s\n"
-msgstr "cheia publicã %s nu a fost gãsitã: %s\n"
-
msgid "please do a --check-trustdb\n"
msgstr "vã rugãm faceþi un --check-trustdb\n"
msgid "checking the trustdb\n"
msgstr "verific trustdb\n"
-#, c-format
-msgid "%d keys processed (%d validity counts cleared)\n"
-msgstr "%d chei procesate (%d numãrãtori valide anulate)\n"
+#, fuzzy, c-format
+#| msgid "%lu keys processed so far\n"
+msgid "%d key processed"
+msgid_plural "%d keys processed"
+msgstr[0] "%lu chei procesate pânã acum\n"
+msgstr[1] "%lu chei procesate pânã acum\n"
+
+#, fuzzy, c-format
+#| msgid "%d keys processed (%d validity counts cleared)\n"
+msgid " (%d validity count cleared)\n"
+msgid_plural " (%d validity counts cleared)\n"
+msgstr[0] "%d chei procesate (%d numãrãtori valide anulate)\n"
+msgstr[1] "%d chei procesate (%d numãrãtori valide anulate)\n"
msgid "no ultimately trusted keys found\n"
msgstr "nu am gãsit nici o cheie cu încredere supremã\n"
@@ -5692,11 +5971,6 @@ msgid "public key of ultimately trusted key %s not found\n"
msgstr "cheia publicã a cheii cu încredere supremã %s nu a fost gãsitã\n"
#, c-format
-msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
-msgstr ""
-"%d marginal(e) necesare, %d complet(e) necesare, model de încredere %s\n"
-
-#, c-format
msgid ""
"depth: %d valid: %3d signed: %3d trust: %d-, %dq, %dn, %dm, %df, %du\n"
msgstr ""
@@ -5896,9 +6170,15 @@ msgstr "eroare la recuperarea stãrii CHV de pe card\n"
msgid "card is permanently locked!\n"
msgstr "cardul este încuiat permanent!\n"
-#, c-format
-msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
-msgstr "%d încercãri PIN Admin rãmase înainte de a încuia cardul permanent\n"
+#, fuzzy, c-format
+#| msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
+msgid "%d Admin PIN attempt remaining before card is permanently locked\n"
+msgid_plural ""
+"%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr[0] ""
+"%d încercãri PIN Admin rãmase înainte de a încuia cardul permanent\n"
+msgstr[1] ""
+"%d încercãri PIN Admin rãmase înainte de a încuia cardul permanent\n"
#. TRANSLATORS: Do not translate the "|A|" prefix but keep it at
#. the start of the string. Use %%0A to force a linefeed.
@@ -5982,9 +6262,12 @@ msgstr "vã rugãm aºteptaþi câtã vreme este creatã noua cheie ...\n"
msgid "generating key failed\n"
msgstr "generarea cheii a eºuat\n"
-#, c-format
-msgid "key generation completed (%d seconds)\n"
-msgstr "generarea cheii este completã (%d secunde)\n"
+#, fuzzy, c-format
+#| msgid "key generation completed (%d seconds)\n"
+msgid "key generation completed (%d second)\n"
+msgid_plural "key generation completed (%d seconds)\n"
+msgstr[0] "generarea cheii este completã (%d secunde)\n"
+msgstr[1] "generarea cheii este completã (%d secunde)\n"
msgid "invalid structure of OpenPGP card (DO 0x93)\n"
msgstr "structurã invalidã a cardului OpenPGP (DO 0x93)\n"
@@ -8219,6 +8502,9 @@ msgstr "|N|foloseºte modul frazã-parolã N"
msgid "do not allow the reuse of old passphrases"
msgstr "eroare la crearea frazei-parolã: %s\n"
+msgid "|N|set the Pinentry timeout to N seconds"
+msgstr ""
+
msgid "|NAME|use NAME as default secret key"
msgstr "|NUME|foloseºte NUME ca cheie secretã implicitã"
@@ -8516,6 +8802,89 @@ msgid ""
"Check a passphrase given on stdin against the patternfile\n"
msgstr ""
+#~ msgid "%d signatures not checked due to missing keys\n"
+#~ msgstr "%d semnãturi nu au fost verificate din cauza unor chei lipsã\n"
+
+#~ msgid "%d signatures not checked due to errors\n"
+#~ msgstr "%d semnãturi nu au fost verificate din cauza unor erori\n"
+
+#~ msgid "1 user ID without valid self-signature detected\n"
+#~ msgstr "am gãsit 1 ID utilizator fãrã auto-semnãturã validã\n"
+
+#~ msgid "Deleted %d signatures.\n"
+#~ msgstr "Am ºters %d semnãturi.\n"
+
+#, fuzzy
+#~ msgid "User ID \"%s\": %d signatures removed\n"
+#~ msgstr "ID utilizator \"%s\" a fost revocat."
+
+#~ msgid ""
+#~ "You need a Passphrase to protect your secret key.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Aveþi nevoie de o frazã-parolã pentru a vã proteja cheia secretã.\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "Please enter a passphrase to protect the off-card backup of the new "
+#~ "encryption key."
+#~ msgstr ""
+#~ "Vã rugãm introduceþi fraza-parolã; aceasta este o propoziþie secretã \n"
+
+#~ msgid "passphrase not correctly repeated; try again"
+#~ msgstr "fraza-parolã nu a fost repetatã corect; mai încercaþi o datã"
+
+#~ msgid "%s.\n"
+#~ msgstr "%s.\n"
+
+#~ msgid ""
+#~ "You don't want a passphrase - this is probably a *bad* idea!\n"
+#~ "I will do it anyway. You can change your passphrase at any time,\n"
+#~ "using this program with the option \"--edit-key\".\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Nu aveþi nevoie de o frazã-parolã - aceasta este probabil o idee "
+#~ "*proastã*!\n"
+#~ "O sã o fac oricum. Puteþi schimba fraza-parolã oricând, folosind acest\n"
+#~ "program cu opþiunea \"--edit-key\".\n"
+
+#~ msgid "storing key onto card failed: %s\n"
+#~ msgstr "stocarea cheii pe card a eºuat: %s\n"
+
+#, fuzzy
+#~| msgid "1 bad signature\n"
+#~ msgid "1 good signature\n"
+#~ msgstr "1 semnãturã incorectã\n"
+
+#, fuzzy
+#~| msgid "renaming `%s' to `%s' failed: %s\n"
+#~ msgid "renaming '%s' to '%s' failed: %s\n"
+#~ msgstr "redenumirea `%s' ca `%s' a eºuat: %s\n"
+
+#~ msgid "%lu keys cached (%lu signatures)\n"
+#~ msgstr "%lu chei puse în cache (%lu semnãturi)\n"
+
+#~ msgid "refreshing 1 key from %s\n"
+#~ msgstr "reactualizez 1 cheie de la %s\n"
+
+#~ msgid "sending key %s to %s server %s\n"
+#~ msgstr "trimit cheia %s serverului %s %s\n"
+
+#~ msgid "public key %s is %lu seconds newer than the signature\n"
+#~ msgstr "cheie publicã %s este mai nouã cu %lu secunde decât semnãtura\n"
+
+#~ msgid ""
+#~ "key %s was created %lu seconds in the future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "cheia %s a fost creatã %lu secunde în viitor (warp în timp sau probleme "
+#~ "cu ceasul)\n"
+
+#~ msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
+#~ msgstr ""
+#~ "%d marginal(e) necesare, %d complet(e) necesare, model de încredere %s\n"
+
#, fuzzy
#~| msgid "can't open the keyring"
#~ msgid "Failed to open the keyring DB.\n"
@@ -8759,9 +9128,6 @@ msgstr ""
#~ msgid "searching for \"%s\" from %s\n"
#~ msgstr "caut \"%s\" de pe %s\n"
-#~ msgid "no keyserver action!\n"
-#~ msgstr "nici o acþiune pentru serverul de chei!\n"
-
#~ msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n"
#~ msgstr ""
#~ "AVERTISMENT: manipulator server de chei dintr-o versiune diferitã de "
@@ -9503,9 +9869,6 @@ msgstr ""
#~ msgid "ERROR: "
#~ msgstr "EROARE: "
-#~ msgid "WARNING: "
-#~ msgstr "AVERTISMENT: "
-
#~ msgid "... this is a bug (%s:%d:%s)\n"
#~ msgstr "... acesta este un bug (%s:%d:%s)\n"
@@ -9893,9 +10256,6 @@ msgstr ""
#~ msgid " signed by %08lX at %s%s\n"
#~ msgstr " semnatã de %08lX pe %s%s\n"
-#~ msgid "Policy: "
-#~ msgstr "Politica: "
-
#~ msgid "Experimental algorithms should not be used!\n"
#~ msgstr "Algoritme experimentale nu ar trebui folosite!\n"
diff --git a/po/ru.po b/po/ru.po
index 1744217..5c79639 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -1175,6 +1175,20 @@ msgstr "Ñбой при транÑлÑции запроÑа %s клиенту\n"
msgid "Enter passphrase: "
msgstr "Введите фразу-пароль:"
+#, fuzzy, c-format
+#| msgid "error creating keyring '%s': %s\n"
+msgid "error getting version from '%s': %s\n"
+msgstr "ошибка ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ ключей '%s': %s\n"
+
+#, c-format
+msgid "server '%s' is older than us (%s < %s)"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "WARNING: %s overrides %s\n"
+msgid "WARNING: %s\n"
+msgstr "Внимание: %s отменÑет %s\n"
+
#, c-format
msgid "OpenPGP card not available: %s\n"
msgstr "Карта OpenPGP недоÑтупна: %s\n"
@@ -1472,10 +1486,9 @@ msgstr "ключ \"%s\" не найден: %s\n"
msgid "error reading keyblock: %s\n"
msgstr "ошибка Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð±Ð»Ð¾ÐºÐ° ключей: %s\n"
-#, fuzzy, c-format
-#| msgid "key \"%s\" not found: %s\n"
+#, c-format
msgid "key \"%s\" not found\n"
-msgstr "ключ \"%s\" не найден: %s\n"
+msgstr "ключ \"%s\" не найден\n"
msgid "(unless you specify the key by fingerprint)\n"
msgstr "(еÑли только Ð’Ñ‹ не задали ключ отпечатком)\n"
@@ -1637,6 +1650,9 @@ msgstr "удалить при ÑкÑпорте непригодные чаÑти
msgid "remove as much as possible from key during export"
msgstr "при ÑкÑпорте удалить из ключа как можно больше"
+msgid " - skipped"
+msgstr " - пропущено"
+
msgid "exporting secret keys not allowed\n"
msgstr "ÑкÑпорт Ñекретных ключей не разрешен\n"
@@ -1648,16 +1664,40 @@ msgstr "ключ %s: ключ типа PGP 2.x - пропущен\n"
msgid "key %s: key material on-card - skipped\n"
msgstr "ключ %s: материал ключа на карте - пропущен\n"
-msgid " - skipped"
-msgstr " - пропущено"
-
msgid "WARNING: nothing exported\n"
msgstr "Внимание: нечего ÑкÑпортировать\n"
+#, c-format
+msgid "error creating '%s': %s\n"
+msgstr "ошибка ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ '%s': %s\n"
+
msgid "[User ID not found]"
msgstr "[ID Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½Ðµ найден]"
#, c-format
+msgid "(check argument of option '%s')\n"
+msgstr "(проверьте аргумент параметра '%s')\n"
+
+#, fuzzy, c-format
+#| msgid ""
+#| "Warning: value '%s' for option '%s' should be a long key ID or a "
+#| "fingerprint\n"
+msgid "Warning: '%s' should be a long key ID or a fingerprint\n"
+msgstr ""
+"Внимание: значение '%s' параметра '%s' должно быть длинным идентификатором "
+"или отпечатком ключа\n"
+
+#, fuzzy, c-format
+#| msgid "error closing %s: %s\n"
+msgid "error looking up: %s\n"
+msgstr "ошибка Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð¸Ñ %s: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error searching the keyring: %s\n"
+msgid "Warning: %s appears in the keyring %d times\n"
+msgstr "ошибка поиÑка в таблице ключей %s\n"
+
+#, c-format
msgid "automatically retrieved '%s' via %s\n"
msgstr "автоматичеÑки получили '%s' через %s\n"
@@ -1670,17 +1710,21 @@ msgstr "Ðет отпечатка"
#, c-format
msgid "secret key \"%s\" not found: %s\n"
-msgstr "закрытый ключ \"%s\" не найден: %s\n"
+msgstr "Ñекретный ключ \"%s\" не найден: %s\n"
#, fuzzy, c-format
-#| msgid "missing argument for option \"%.50s\"\n"
-msgid "(check argument of option '%s')\n"
-msgstr "не хватает аргумента Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° \"%.50s\"\n"
+#| msgid "using \"%s\" as default secret key\n"
+msgid "Warning: not using '%s' as default key: %s\n"
+msgstr "\"%s\" иÑпользуетÑÑ Ð² качеÑтве оÑновного Ñекретного ключа\n"
#, fuzzy, c-format
-#| msgid "|NAME|use NAME as default secret key"
-msgid "using \"%s\" as default secret key\n"
-msgstr "|NAME|иÑпользовать NAME как оÑновной закрытый ключ"
+#| msgid "using \"%s\" as default secret key\n"
+msgid "using \"%s\" as default secret key for signing\n"
+msgstr "\"%s\" иÑпользуетÑÑ Ð² качеÑтве оÑновного Ñекретного ключа\n"
+
+#, c-format
+msgid "all values passed to '%s' ignored\n"
+msgstr ""
#, c-format
msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
@@ -1805,6 +1849,8 @@ msgstr "запуÑк в режиме Ñервера"
msgid "|VALUE|set the TOFU policy for a key (good, unknown, bad, ask, auto)"
msgstr ""
+"|VALUE|уÑтановить правила TOFU Ð´Ð»Ñ ÐºÐ»ÑŽÑ‡Ð° (good - хороший, unknown - "
+"неизвеÑтно, bad - плохой, ask - Ñпрашивать, auto - автоматичеÑки)"
msgid "create ascii armored output"
msgstr "вывод в текÑтовом формате"
@@ -2001,52 +2047,25 @@ msgstr "показать в ÑпиÑке ключей название таблÐ
msgid "show expiration dates during signature listings"
msgstr "показать в ÑпиÑке подпиÑей Ñроки дейÑтвиÑ"
-#, fuzzy
-#| msgid "Available keys:\n"
msgid "available TOFU policies:\n"
-msgstr "ДоÑтупные ключи:\n"
+msgstr "ДоÑтупные правила TOFU:\n"
-#, fuzzy, c-format
-#| msgid "unknown option '%s'\n"
+#, c-format
msgid "unknown TOFU policy '%s'\n"
-msgstr "неизвеÑтный параметр '%s'\n"
+msgstr "неизвеÑтные правила TOFU '%s'\n"
msgid "(use \"help\" to list choices)\n"
-msgstr ""
+msgstr "(\"help\" выведет ÑпиÑок вариантов)\n"
-#, fuzzy, c-format
-#| msgid "unknown command '%s'\n"
+#, c-format
msgid "unknown TOFU DB format '%s'\n"
-msgstr "неизвеÑÑ‚Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° '%s'\n"
+msgstr "неизвеÑтный формат базы данных TOFU '%s'\n"
#, c-format
msgid "Note: old default options file '%s' ignored\n"
msgstr "Замечание: Ñтарый оÑновной файл параметров '%s' проигнорирован\n"
#, c-format
-msgid ""
-"Warning: value '%s' for option '%s' should be a long key ID or a "
-"fingerprint\n"
-msgstr ""
-
-#, fuzzy, c-format
-#| msgid "option \"%.50s\" is ambiguous\n"
-msgid "key specification '%s' is ambiguous\n"
-msgstr "параметр \"%.50s\" неоднозначен\n"
-
-#. TRANSLATORS: The %s prints a key specification which
-#. for example has been given at the command line. Two
-#. lines with fingerprints are printed after this message.
-#, c-format
-msgid "'%s' matches at least:\n"
-msgstr ""
-
-#, fuzzy, c-format
-#| msgid "error creating keyring '%s': %s\n"
-msgid "error searching the keyring: %s\n"
-msgstr "ошибка ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ ключей '%s': %s\n"
-
-#, c-format
msgid "libgcrypt is too old (need %s, have %s)\n"
msgstr "Ñлишком ÑÑ‚Ð°Ñ€Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ libcrypt (нужно %s, еÑÑ‚ÑŒ %s)\n"
@@ -2241,16 +2260,6 @@ msgstr ""
"Ð’ÐИМÐÐИЕ: получатели (-r) заданы без иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ñ‹Ð¼ "
"ключом\n"
-#, fuzzy, c-format
-#| msgid "line %d: invalid date given\n"
-msgid "option '%s' given, but no valid default keys given\n"
-msgstr "Ñтрока %d: задана недопуÑÑ‚Ð¸Ð¼Ð°Ñ Ð´Ð°Ñ‚Ð°\n"
-
-#, fuzzy, c-format
-#| msgid "line %d: invalid date given\n"
-msgid "option '%s' given, but option '%s' not given\n"
-msgstr "Ñтрока %d: задана недопуÑÑ‚Ð¸Ð¼Ð°Ñ Ð´Ð°Ñ‚Ð°\n"
-
msgid "--store [filename]"
msgstr "--store [файл]"
@@ -2324,6 +2333,11 @@ msgstr "Ñбой при получении Ñ Ñервера ключей: %s\n"
msgid "key export failed: %s\n"
msgstr "Ñбой при ÑкÑпорте ключа: %s\n"
+#, fuzzy, c-format
+#| msgid "key export failed: %s\n"
+msgid "export as ssh key failed: %s\n"
+msgstr "Ñбой при ÑкÑпорте ключа: %s\n"
+
#, c-format
msgid "keyserver search failed: %s\n"
msgstr "Ñбой при поиÑке на Ñервере ключей: %s\n"
@@ -2344,14 +2358,13 @@ msgstr "ошибка Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² текÑтовый форм
msgid "invalid hash algorithm '%s'\n"
msgstr "недопуÑÑ‚Ð¸Ð¼Ð°Ñ Ñ…Ñш-Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ '%s'\n"
-#, fuzzy, c-format
-#| msgid "error loading certificate '%s': %s\n"
+#, c-format
msgid "error parsing key specification '%s': %s\n"
-msgstr "ошибка загрузки Ñертификата '%s': %s\n"
+msgstr "ошибка ÑинтакÑичеÑкого анализа Ñпецификации ключа '%s': %s\n"
#, c-format
msgid "'%s' does not appear to be a valid key ID, fingerprint or keygrip\n"
-msgstr ""
+msgstr "'%s' не ÑвлÑетÑÑ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ‚Ð¾Ñ€Ð¾Ð¼, отпечатком или кодом ключа\n"
msgid "[filename]"
msgstr "[файл]"
@@ -2660,7 +2673,7 @@ msgstr "ключ %s: Ñекретный ключ Ñ Ð½ÐµÐ´Ð¾Ð¿ÑƒÑтимым шÐ
#. created again.
#, c-format
msgid "To migrate '%s', with each smartcard, run: %s\n"
-msgstr ""
+msgstr "Ð”Ð»Ñ Ð¿ÐµÑ€ÐµÐ½Ð¾Ñа '%s' выполните на каждой криптографичеÑкой карте: %s\n"
#, c-format
msgid "key %s: no public key - can't apply revocation certificate\n"
@@ -2788,10 +2801,9 @@ msgstr "Ñоздана таблица ключей '%s'\n"
msgid "keyblock resource '%s': %s\n"
msgstr "иÑточник блока ключей '%s': %s\n"
-#, fuzzy, c-format
-#| msgid "error opening '%s': %s\n"
+#, c-format
msgid "error opening key DB: %s\n"
-msgstr "ошибка Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ '%s': %s\n"
+msgstr "ошибка Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð±Ð°Ð·Ñ‹ данных ключей: %s\n"
#, c-format
msgid "failed to rebuild keyring cache: %s\n"
@@ -2803,33 +2815,37 @@ msgstr "[отзыв]"
msgid "[self-signature]"
msgstr "[ÑамоподпиÑÑŒ]"
-msgid "1 bad signature\n"
-msgstr "1 Ð¿Ð»Ð¾Ñ…Ð°Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑŒ\n"
-
-#, c-format
-msgid "%d bad signatures\n"
-msgstr "%d плохих подпиÑей\n"
-
-msgid "1 signature not checked due to a missing key\n"
-msgstr "1 подпиÑÑŒ не проверена за отÑутÑтвием ключа\n"
-
-#, c-format
-msgid "%d signatures not checked due to missing keys\n"
-msgstr "%d подпиÑей не проверено за отÑутÑтвием ключей\n"
-
-msgid "1 signature not checked due to an error\n"
-msgstr "1 подпиÑÑŒ не проверена из-за ошибки\n"
+#, fuzzy, c-format
+#| msgid "%d bad signatures\n"
+msgid "%d bad signature\n"
+msgid_plural "%d bad signatures\n"
+msgstr[0] "%d плохих подпиÑей\n"
+msgstr[1] "%d плохих подпиÑей\n"
+msgstr[2] "%d плохих подпиÑей\n"
-#, c-format
-msgid "%d signatures not checked due to errors\n"
-msgstr "%d подпиÑей не проверено из-за ошибок\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to a missing key\n"
+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 подпиÑÑŒ не проверена за отÑутÑтвием ключа\n"
+msgstr[1] "1 подпиÑÑŒ не проверена за отÑутÑтвием ключа\n"
+msgstr[2] "1 подпиÑÑŒ не проверена за отÑутÑтвием ключа\n"
-msgid "1 user ID without valid self-signature detected\n"
-msgstr "обнаружен 1 ID Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð±ÐµÐ· дейÑтвительной ÑамоподпиÑи\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to an error\n"
+msgid "%d signature not checked due to an error\n"
+msgid_plural "%d signatures not checked due to errors\n"
+msgstr[0] "1 подпиÑÑŒ не проверена из-за ошибки\n"
+msgstr[1] "1 подпиÑÑŒ не проверена из-за ошибки\n"
+msgstr[2] "1 подпиÑÑŒ не проверена из-за ошибки\n"
-#, c-format
-msgid "%d user IDs without valid self-signatures detected\n"
-msgstr "обнаружено %d ID Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð±ÐµÐ· дейÑтвительной ÑамоподпиÑи\n"
+#, fuzzy, c-format
+#| msgid "%d user IDs without valid self-signatures detected\n"
+msgid "%d user ID without valid self-signature detected\n"
+msgid_plural "%d user IDs without valid self-signatures detected\n"
+msgstr[0] "обнаружено %d ID Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð±ÐµÐ· дейÑтвительной ÑамоподпиÑи\n"
+msgstr[1] "обнаружено %d ID Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð±ÐµÐ· дейÑтвительной ÑамоподпиÑи\n"
+msgstr[2] "обнаружено %d ID Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð±ÐµÐ· дейÑтвительной ÑамоподпиÑи\n"
msgid ""
"Please decide how far you trust this user to correctly verify other users' "
@@ -2865,7 +2881,7 @@ msgstr ""
#, c-format
msgid "Skipping user ID \"%s\", which is not a text ID.\n"
-msgstr ""
+msgstr "ID Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ \"%s\" пропущен: Ñто не текÑтовый ID.\n"
#, c-format
msgid "User ID \"%s\" is revoked."
@@ -3167,10 +3183,8 @@ msgstr "Ключ отозван."
msgid "Really sign all user IDs? (y/N) "
msgstr "ДейÑтвительно подпиÑать вÑе ID пользователÑ? (y/N) "
-#, fuzzy
-#| msgid "Really sign all user IDs? (y/N) "
msgid "Really sign all text user IDs? (y/N) "
-msgstr "ДейÑтвительно подпиÑать вÑе ID пользователÑ? (y/N) "
+msgstr "ДейÑтвительно подпиÑать вÑе текÑтовые ID пользователÑ? (y/N) "
msgid "Hint: Select the user IDs to sign\n"
msgstr "ПодÑказка: Выберите ID пользователей, которые нужно подпиÑать\n"
@@ -3407,13 +3421,13 @@ msgstr "Удалить данную неизвеÑтную подпиÑÑŒ? (y/N/
msgid "Really delete this self-signature? (y/N)"
msgstr "ДейÑтвительно удалить данную ÑамоподпиÑÑŒ? (y/N)"
-#, c-format
+#, fuzzy, c-format
+#| msgid "Deleted %d signature.\n"
msgid "Deleted %d signature.\n"
-msgstr "Удалена %d подпиÑÑŒ.\n"
-
-#, c-format
-msgid "Deleted %d signatures.\n"
-msgstr "Удалено %d подпиÑей.\n"
+msgid_plural "Deleted %d signatures.\n"
+msgstr[0] "Удалена %d подпиÑÑŒ.\n"
+msgstr[1] "Удалена %d подпиÑÑŒ.\n"
+msgstr[2] "Удалена %d подпиÑÑŒ.\n"
msgid "Nothing deleted.\n"
msgstr "Ðичего не удалено.\n"
@@ -3425,13 +3439,13 @@ msgstr "недопуÑтимый"
msgid "User ID \"%s\" compacted: %s\n"
msgstr "ID Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ \"%s\" Ñжат: %s\n"
-#, c-format
+#, fuzzy, c-format
+#| msgid "User ID \"%s\": %d signature removed\n"
msgid "User ID \"%s\": %d signature removed\n"
-msgstr "ID Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ \"%s\": %d подпиÑÑŒ удалена\n"
-
-#, c-format
-msgid "User ID \"%s\": %d signatures removed\n"
-msgstr "ID Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ \"%s\": %d подпиÑей удалено\n"
+msgid_plural "User ID \"%s\": %d signatures removed\n"
+msgstr[0] "ID Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ \"%s\": %d подпиÑÑŒ удалена\n"
+msgstr[1] "ID Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ \"%s\": %d подпиÑÑŒ удалена\n"
+msgstr[2] "ID Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ \"%s\": %d подпиÑÑŒ удалена\n"
#, c-format
msgid "User ID \"%s\": already minimized\n"
@@ -3471,13 +3485,12 @@ msgid ""
"Are you sure you want to appoint this key as a designated revoker? (y/N) "
msgstr "Вы уверены, что хотите назначить данный ключ отзывающим? (y/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 "Вы уверены, что хотите назначить данный ключ отзывающим? (y/N) "
+msgstr ""
+"Ð’Ñ‹ уверены, что хотите изменить Ñрок дейÑÑ‚Ð²Ð¸Ñ Ñразу неÑкольких подключей? (y/"
+"N) "
msgid "Changing expiration time for a subkey.\n"
msgstr "Смена Ñрока дейÑÑ‚Ð²Ð¸Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡Ð°.\n"
@@ -3526,10 +3539,9 @@ msgstr "Ðет ID Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ñ Ð¸Ð½Ð´ÐµÐºÑом %d\n"
msgid "No user ID with hash %s\n"
msgstr "Ðет ID Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ñ Ñ…Ñшем %s\n"
-#, fuzzy, c-format
-#| msgid "No subkey with index %d\n"
+#, c-format
msgid "No subkey with key ID '%s'.\n"
-msgstr "Ðет подключа Ñ Ð¸Ð½Ð´ÐµÐºÑом %d\n"
+msgstr "Ðет подключа Ñ ID ключа '%s'.\n"
#, c-format
msgid "No subkey with index %d\n"
@@ -3874,7 +3886,7 @@ msgstr "ÐедопуÑтимый Ñимвол в имени\n"
#, c-format
msgid "The characters '%s' and '%s' may not appear in name\n"
-msgstr ""
+msgstr "Символы '%s' и '%s' в имени поÑвлÑÑ‚ÑŒÑÑ Ð½Ðµ могут\n"
msgid "Name may not start with a digit\n"
msgstr "Ð˜Ð¼Ñ Ð½Ðµ должно начинатьÑÑ Ñ Ñ†Ð¸Ñ„Ñ€Ñ‹\n"
@@ -3942,37 +3954,6 @@ msgid "Please correct the error first\n"
msgstr "Сначала иÑправьте ошибку\n"
msgid ""
-"You need a Passphrase to protect your secret key.\n"
-"\n"
-msgstr ""
-"Ð”Ð»Ñ Ð·Ð°Ñ‰Ð¸Ñ‚Ñ‹ Ñекретного ключа необходима фраза-пароль.\n"
-"\n"
-
-msgid ""
-"Please enter a passphrase to protect the off-card backup of the new "
-"encryption key."
-msgstr ""
-"Введите фразу-пароль Ð´Ð»Ñ Ð·Ð°Ñ‰Ð¸Ñ‚Ñ‹ архивной копии нового ключа Ð´Ð»Ñ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ."
-
-msgid "passphrase not correctly repeated; try again"
-msgstr "фраза-пароль повторена неверно; попробуйте еще раз"
-
-#, c-format
-msgid "%s.\n"
-msgstr "%s.\n"
-
-msgid ""
-"You don't want a passphrase - this is probably a *bad* idea!\n"
-"I will do it anyway. You can change your passphrase at any time,\n"
-"using this program with the option \"--edit-key\".\n"
-"\n"
-msgstr ""
-"Хотите обойтиÑÑŒ без фразы-паролÑ? Скорее вÑего, Ñто ПЛОХÐЯ мыÑль!\n"
-"Работа будет продолжена. Ð’Ñ‹ можете Ñменить фразу-пароль в любое времÑ,\n"
-"запуÑтив данную программу Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ \"--edit-key\".\n"
-"\n"
-
-msgid ""
"We need to generate a lot of random bytes. It is a good idea to perform\n"
"some other action (type on the keyboard, move the mouse, utilize the\n"
"disks) during the prime generation; this gives the random number\n"
@@ -4020,6 +4001,14 @@ msgid "Key generation canceled.\n"
msgstr "Создание ключа прервано.\n"
#, c-format
+msgid "can't create backup file '%s': %s\n"
+msgstr "не могу Ñоздать архивную копию, файл '%s': %s\n"
+
+#, c-format
+msgid "Note: backup of card key saved to '%s'\n"
+msgstr "Замечание: Ð°Ñ€Ñ…Ð¸Ð²Ð½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ ÐºÐ»ÑŽÑ‡Ð° Ñ ÐºÐ°Ñ€Ñ‚Ñ‹ Ñохранена в '%s'\n"
+
+#, c-format
msgid "writing public key to '%s'\n"
msgstr "Ñохранение открытого ключа в '%s'\n"
@@ -4067,18 +4056,6 @@ msgstr "Секретные чаÑти первичного ключа хранÑ
msgid "Really create? (y/N) "
msgstr "ДейÑтвительно Ñоздать? (y/N) "
-#, c-format
-msgid "storing key onto card failed: %s\n"
-msgstr "Ñбой ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ ÐºÐ»ÑŽÑ‡Ð° на карте: %s\n"
-
-#, c-format
-msgid "can't create backup file '%s': %s\n"
-msgstr "не могу Ñоздать архивную копию, файл '%s': %s\n"
-
-#, c-format
-msgid "Note: backup of card key saved to '%s'\n"
-msgstr "Замечание: Ð°Ñ€Ñ…Ð¸Ð²Ð½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ ÐºÐ»ÑŽÑ‡Ð° Ñ ÐºÐ°Ñ€Ñ‚Ñ‹ Ñохранена в '%s'\n"
-
msgid "never "
msgstr "никогда "
@@ -4097,16 +4074,21 @@ msgstr "КритичеÑкое примечание к подпиÑи: "
msgid "Signature notation: "
msgstr "Примечание к подпиÑи: "
-msgid "1 good signature\n"
-msgstr "1 Ñ…Ð¾Ñ€Ð¾ÑˆÐ°Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑŒ\n"
-
-#, c-format
-msgid "%d good signatures\n"
-msgstr "%d хороших подпиÑей\n"
+#, fuzzy, c-format
+#| msgid "%d good signatures\n"
+msgid "%d good signature\n"
+msgid_plural "%d good signatures\n"
+msgstr[0] "%d хороших подпиÑей\n"
+msgstr[1] "%d хороших подпиÑей\n"
+msgstr[2] "%d хороших подпиÑей\n"
-#, c-format
-msgid "Warning: %lu key(s) skipped due to their large size\n"
-msgstr "Внимание: %lu ключей пропущено из-за большого размера\n"
+#, fuzzy, c-format
+#| msgid "Warning: %lu key(s) skipped due to their large size\n"
+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] "Внимание: %lu ключей пропущено из-за большого размера\n"
+msgstr[1] "Внимание: %lu ключей пропущено из-за большого размера\n"
+msgstr[2] "Внимание: %lu ключей пропущено из-за большого размера\n"
msgid "Keyring"
msgstr "Таблица ключей"
@@ -4136,20 +4118,32 @@ msgid " Card serial no. ="
msgstr " Ñерийный номер карты ="
#, c-format
-msgid "renaming '%s' to '%s' failed: %s\n"
-msgstr "Ñбой при переименовании '%s' в '%s': %s\n"
-
-#, c-format
msgid "caching keyring '%s'\n"
msgstr "занеÑение таблицы ключей '%s' в буфер\n"
-#, c-format
-msgid "%lu keys cached so far (%lu signatures)\n"
-msgstr "пока в буфер помещено %lu ключей (%lu подпиÑей)\n"
+#, fuzzy, c-format
+#| msgid "%lu keys cached so far (%lu signatures)\n"
+msgid "%lu keys cached so far (%lu signature)\n"
+msgid_plural "%lu keys cached so far (%lu signatures)\n"
+msgstr[0] "пока в буфер помещено %lu ключей (%lu подпиÑей)\n"
+msgstr[1] "пока в буфер помещено %lu ключей (%lu подпиÑей)\n"
+msgstr[2] "пока в буфер помещено %lu ключей (%lu подпиÑей)\n"
-#, c-format
-msgid "%lu keys cached (%lu signatures)\n"
-msgstr "%lu ключей помещено в буфер (%lu подпиÑей)\n"
+#, fuzzy, c-format
+#| msgid "flush the cache"
+msgid "%lu key cached"
+msgid_plural "%lu keys cached"
+msgstr[0] "запиÑать буфер на диÑк"
+msgstr[1] "запиÑать буфер на диÑк"
+msgstr[2] "запиÑать буфер на диÑк"
+
+#, fuzzy, c-format
+#| msgid "1 bad signature\n"
+msgid " (%lu signature)\n"
+msgid_plural " (%lu signatures)\n"
+msgstr[0] "1 Ð¿Ð»Ð¾Ñ…Ð°Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑŒ\n"
+msgstr[1] "1 Ð¿Ð»Ð¾Ñ…Ð°Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑŒ\n"
+msgstr[2] "1 Ð¿Ð»Ð¾Ñ…Ð°Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑŒ\n"
#, c-format
msgid "%s: keyring created\n"
@@ -4188,21 +4182,21 @@ msgstr "недопуÑтимый протокол Ñервера ключей (Ð
#, c-format
msgid "\"%s\" not a key ID: skipping\n"
-msgstr "\"%s\" не идентификатор ключа: пропущен\n"
+msgstr "\"%s\" - не ID ключа: пропущен\n"
-#, c-format
-msgid "refreshing 1 key from %s\n"
-msgstr "обновление 1 ключа из %s\n"
+#, fuzzy, c-format
+#| msgid "refreshing %d keys from %s\n"
+msgid "refreshing %d key from %s\n"
+msgid_plural "refreshing %d keys from %s\n"
+msgstr[0] "обновление %d ключей из %s\n"
+msgstr[1] "обновление %d ключей из %s\n"
+msgstr[2] "обновление %d ключей из %s\n"
#, c-format
msgid "WARNING: unable to refresh key %s via %s: %s\n"
msgstr "Внимание: невозможно обновить ключ %s Ñ %s: %s\n"
#, c-format
-msgid "refreshing %d keys from %s\n"
-msgstr "обновление %d ключей из %s\n"
-
-#, c-format
msgid "key \"%s\" not found on keyserver\n"
msgstr "ключ \"%s\" не найден на Ñервере ключей\n"
@@ -4220,9 +4214,10 @@ msgstr "запрашиваю ключ %s Ñ Ñервера %s %s\n"
msgid "requesting key %s from %s\n"
msgstr "получение ключа %s Ñ %s\n"
-#, c-format
-msgid "sending key %s to %s server %s\n"
-msgstr "отправка ключа %s на Ñервер %s %s\n"
+#, fuzzy
+#| msgid "invalid keyserver options\n"
+msgid "no keyserver known\n"
+msgstr "недопуÑтимые параметры Ñервера ключей\n"
#, c-format
msgid "sending key %s to %s\n"
@@ -4437,6 +4432,19 @@ msgstr "Внимание: Ñ…Ñш-Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ %s не рекомендуетÑ
msgid "Note: signatures using the %s algorithm are rejected\n"
msgstr "Замечание: подпиÑи Ñ Ñ…Ñш-функцией %s игнорируютÑÑ\n"
+#, fuzzy, c-format
+#| msgid "%s:%u: read error: %s\n"
+msgid "(reported error: %s)\n"
+msgstr "%s:%u: ошибка чтениÑ: %s\n"
+
+#, fuzzy, c-format
+#| msgid "read error in '%s': %s\n"
+msgid "(reported error: %s <%s>)\n"
+msgstr "ошибка Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð² '%s': %s\n"
+
+msgid "(further info: "
+msgstr ""
+
#, c-format
msgid "%s:%d: deprecated option \"%s\"\n"
msgstr "%s:%d: параметр \"%s\" не рекомендуетÑÑ\n"
@@ -4485,10 +4493,9 @@ msgstr "неизвеÑтный параметр '%s'\n"
msgid "ECDSA public key is expected to be in SEC encoding multiple of 8 bits\n"
msgstr "Открытый ключ ECDSA бывает в кодировке SEC, кратной 8 битам\n"
-#, fuzzy, c-format
-#| msgid "Unknown signature type '%s'\n"
+#, c-format
msgid "unknown weak digest '%s'\n"
-msgstr "ÐеизвеÑтный тип подпиÑи '%s'\n"
+msgstr "неизвеÑтный Ñлабый Ñ…Ñш '%s'\n"
#, c-format
msgid "File '%s' exists. "
@@ -4828,6 +4835,19 @@ msgstr "%s: пропущено: открытый ключ отключен\n"
msgid "%s: skipped: public key already present\n"
msgstr "%s: пропущено: открытый ключ уже ÑущеÑтвует\n"
+#, fuzzy, c-format
+#| msgid "can't connect to '%s': %s\n"
+msgid "can't encrypt to '%s'\n"
+msgstr "не могу подключитьÑÑ Ðº '%s': %s\n"
+
+#, c-format
+msgid "option '%s' given, but no valid default keys given\n"
+msgstr "задан параметр '%s', но не заданы ключи по умолчанию\n"
+
+#, c-format
+msgid "option '%s' given, but option '%s' not given\n"
+msgstr "задан параметр '%s', но параметр '%s' не задан\n"
+
msgid "You did not specify a user ID. (you may use \"-r\")\n"
msgstr "Ðе задан ID Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ (можно иÑпользовать \"-r\").\n"
@@ -4871,10 +4891,6 @@ msgstr "Замечание: у ключа %s нет Ð¿Ñ€ÐµÐ´Ð¿Ð¾Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð´Ð
msgid "data not saved; use option \"--output\" to save it\n"
msgstr "данные не Ñохранены; иÑпользуйте \"--output\" Ð´Ð»Ñ ÑохранениÑ\n"
-#, c-format
-msgid "error creating '%s': %s\n"
-msgstr "ошибка ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ '%s': %s\n"
-
msgid "Detached signature.\n"
msgstr "ÐžÑ‚Ð´ÐµÐ»ÐµÐ½Ð½Ð°Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑŒ.\n"
@@ -4935,10 +4951,8 @@ msgstr "Будет отозван:\n"
msgid "(This is a sensitive revocation key)\n"
msgstr "(Это оÑобо важный ключ отзыва)\n"
-#, fuzzy
-#| msgid "Secret key is available.\n"
msgid "Secret key is not available.\n"
-msgstr "Закрытый ключ доÑтупен.\n"
+msgstr "Секретный ключ недоÑтупен.\n"
msgid "Create a designated revocation certificate for this key? (y/N) "
msgstr "Создать Ñертификат отзыва данного ключа? (y/N) "
@@ -4961,35 +4975,61 @@ msgid "This is a revocation certificate for the OpenPGP key:"
msgstr "Это Ñертификат отзыва ключа 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 ""
+
+#, fuzzy
+#| msgid ""
+#| "Use it to revoke this key in case of a compromise or loss of\n"
+#| "the secret key. However, if the secret key is still accessible,\n"
+#| "it is better to generate a new revocation certificate and give\n"
+#| "a reason for the revocation."
+msgid ""
"Use it to revoke this key in case of a compromise or loss of\n"
"the secret key. However, if the secret key is still accessible,\n"
"it is better to generate a new revocation certificate and give\n"
-"a reason for the revocation."
+"a reason for the revocation. For details see the description of\n"
+"of the gpg command \"--gen-revoke\" in the GnuPG manual."
msgstr ""
"ПользуйтеÑÑŒ им Ð´Ð»Ñ Ð¾Ñ‚Ð·Ñ‹Ð²Ð° Ñтого ключа в Ñлучае раÑÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð¸Ð»Ð¸ потери\n"
"Ñекретного ключа. Однако, еÑли Ñекретный ключ доÑтупен, лучше Ñоздать\n"
"новый Ñертификат Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸ÐµÐ¼ причины отзыва."
+#, fuzzy
+#| 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 making use of this revocation certificate."
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 making use of this revocation certificate."
+"before importing and publishing this revocation certificate."
msgstr ""
"Чтобы избежать Ñлучайного Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñтого файла, перед 5 дефиÑами\n"
"вÑтавлено двоеточие. Удалите Ñто двоеточие в текÑтовом редакторе\n"
"перед иÑпользованием Ñтого Ñертификата отзыва."
#, fuzzy, c-format
-#| msgid "secret key \"%s\" not found: %s\n"
+#| msgid "Revocation certificate created.\n"
+msgid "revocation certificate stored as '%s.rev'\n"
+msgstr "Сертификат отзыва Ñоздан.\n"
+
+#, c-format
msgid "secret key \"%s\" not found\n"
-msgstr "закрытый ключ \"%s\" не найден: %s\n"
+msgstr "Ñекретный ключ \"%s\" не найден\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' ÑоответÑтвует неÑкольким Ñекретным ключам:\n"
+
+#, c-format
+msgid "error searching the keyring: %s\n"
+msgstr "ошибка поиÑка в таблице ключей %s\n"
msgid "Create a revocation certificate for this key? (y/N) "
msgstr "Создать Ñертификат отзыва данного ключа? (y/N) "
@@ -5066,26 +5106,53 @@ msgstr "за подробноÑÑ‚Ñми обращайтеÑÑŒ к %s\n"
msgid "WARNING: signing subkey %s has an invalid cross-certification\n"
msgstr "Внимание: подпиÑывающий подключ %s неправильно перекреÑтно заверен\n"
-#, c-format
+#, fuzzy, c-format
+#| msgid "public key %s is %lu second newer than the signature\n"
msgid "public key %s is %lu second newer than the signature\n"
-msgstr "открытый ключ %s на %lu Ñекунду новее подпиÑи\n"
+msgid_plural "public key %s is %lu seconds newer than the signature\n"
+msgstr[0] "открытый ключ %s на %lu Ñекунду новее подпиÑи\n"
+msgstr[1] "открытый ключ %s на %lu Ñекунду новее подпиÑи\n"
+msgstr[2] "открытый ключ %s на %lu Ñекунду новее подпиÑи\n"
-#, c-format
-msgid "public key %s is %lu seconds newer than the signature\n"
-msgstr "открытый ключ %s на %lu Ñекунд новее подпиÑи\n"
+#, fuzzy, c-format
+#| msgid "public key %s is %lu second newer than the signature\n"
+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] "открытый ключ %s на %lu Ñекунду новее подпиÑи\n"
+msgstr[1] "открытый ключ %s на %lu Ñекунду новее подпиÑи\n"
+msgstr[2] "открытый ключ %s на %lu Ñекунду новее подпиÑи\n"
-#, c-format
+#, fuzzy, c-format
+#| msgid ""
+#| "key %s was created %lu second in the future (time warp or clock problem)\n"
msgid ""
"key %s was created %lu second in the future (time warp or clock problem)\n"
-msgstr ""
+msgid_plural ""
+"key %s was created %lu seconds in the future (time warp or clock problem)\n"
+msgstr[0] ""
+"ключ %s Ñоздан на %lu Ñекунду в будущем (Ð¿ÐµÑ‚Ð»Ñ Ð²Ð¾ времени или проблемы Ñ "
+"чаÑами)\n"
+msgstr[1] ""
+"ключ %s Ñоздан на %lu Ñекунду в будущем (Ð¿ÐµÑ‚Ð»Ñ Ð²Ð¾ времени или проблемы Ñ "
+"чаÑами)\n"
+msgstr[2] ""
"ключ %s Ñоздан на %lu Ñекунду в будущем (Ð¿ÐµÑ‚Ð»Ñ Ð²Ð¾ времени или проблемы Ñ "
"чаÑами)\n"
-#, c-format
-msgid ""
-"key %s was created %lu seconds in the future (time warp or clock problem)\n"
-msgstr ""
-"ключ %s Ñоздан на %lu Ñекунд в будущем (Ð¿ÐµÑ‚Ð»Ñ Ð²Ð¾ времени или проблемы Ñ "
+#, fuzzy, c-format
+#| msgid ""
+#| "key %s was created %lu second in the future (time warp or clock problem)\n"
+msgid "key %s was created %lu day in the future (time warp or clock problem)\n"
+msgid_plural ""
+"key %s was created %lu days in the future (time warp or clock problem)\n"
+msgstr[0] ""
+"ключ %s Ñоздан на %lu Ñекунду в будущем (Ð¿ÐµÑ‚Ð»Ñ Ð²Ð¾ времени или проблемы Ñ "
+"чаÑами)\n"
+msgstr[1] ""
+"ключ %s Ñоздан на %lu Ñекунду в будущем (Ð¿ÐµÑ‚Ð»Ñ Ð²Ð¾ времени или проблемы Ñ "
+"чаÑами)\n"
+msgstr[2] ""
+"ключ %s Ñоздан на %lu Ñекунду в будущем (Ð¿ÐµÑ‚Ð»Ñ Ð²Ð¾ времени или проблемы Ñ "
"чаÑами)\n"
#, c-format
@@ -5313,6 +5380,260 @@ msgstr "не могу обработать Ñтроки текÑта длиннÐ
msgid "input line longer than %d characters\n"
msgstr "Ñтрока ввода длиннее %d Ñимволов\n"
+#, fuzzy, c-format
+#| msgid "error sending standard options: %s\n"
+msgid "error beginning transaction on TOFU database: %s\n"
+msgstr "ошибка отправки Ñтандартных параметров: %s\n"
+
+#, c-format
+msgid "error committing transaction on TOFU database: %s\n"
+msgstr ""
+
+#, c-format
+msgid "error rolling back transaction on TOFU database: %s\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "unsupported algorithm: %s"
+msgid "unsupported TOFU database version: %s\n"
+msgstr "алгоритм (не поддерживаетÑÑ): %s"
+
+#, fuzzy, c-format
+#| msgid "error sending data: %s\n"
+msgid "error reading TOFU database: %s\n"
+msgstr "ошибка отправки данных: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error writing base64 encoding: %s\n"
+msgid "error determining TOFU database's version: %s\n"
+msgstr "ошибка запиÑи в кодировке base64: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error initializing reader object: %s\n"
+msgid "error initializing TOFU database: %s\n"
+msgstr "ошибка инициализации объекта уÑтройÑтва чтениÑ: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error opening '%s': %s\n"
+msgid "error opening TOFU database '%s': %s\n"
+msgstr "ошибка Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ '%s': %s\n"
+
+msgid "Warning: Home directory contains both tofu.db and tofu.d.\n"
+msgstr ""
+
+msgid "Using split format for TOFU database\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "error sending data: %s\n"
+msgid "error updating TOFU database: %s\n"
+msgstr "ошибка отправки данных: %s\n"
+
+#, c-format
+msgid "public key %s not found: %s\n"
+msgstr "открытый ключ %s не найден: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error setting OCSP target: %s\n"
+msgid "error setting TOFU binding's trust level to %s\n"
+msgstr "ошибка уÑтановки цели OCSP: %s\n"
+
+#, c-format
+msgid "The binding %s is NOT known."
+msgstr ""
+
+#, c-format
+msgid ""
+"The key %s raised a conflict with this binding (%s). Since this binding's "
+"policy was 'auto', it was changed to 'ask'."
+msgstr ""
+
+#, c-format
+msgid ""
+"Please indicate whether you believe the binding %s%sis legitimate (the key "
+"belongs to the stated owner) or a forgery (bad)."
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "error getting responder ID: %s\n"
+msgid "error gathering other user IDs: %s\n"
+msgstr "ошибка при получении ID ответчика: %s\n"
+
+msgid "Known user IDs associated with this key:\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "validity: %s"
+msgid "policy: %s"
+msgstr "доÑтоверноÑÑ‚ÑŒ: %s"
+
+#, fuzzy, c-format
+#| msgid "error getting stored flags: %s\n"
+msgid "error gathering signature stats: %s\n"
+msgstr "ошибка Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñохраненных признаков: %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] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, c-format
+msgid "Statistics for keys with the email address \"%s\":\n"
+msgstr ""
+
+#, fuzzy
+#| msgid "list keys"
+msgid "this key"
+msgstr "вывеÑти ÑпиÑок ключей"
+
+#, c-format
+msgid "%ld message signed in the future."
+msgid_plural "%ld messages signed in the future."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, fuzzy, c-format
+#| msgid "print message digests"
+msgid "%ld message signed"
+msgid_plural "%ld messages signed"
+msgstr[0] "вывеÑти Ñ…Ñши Ñообщений"
+msgstr[1] "вывеÑти Ñ…Ñши Ñообщений"
+msgstr[2] "вывеÑти Ñ…Ñши Ñообщений"
+
+#, c-format
+msgid " over the past %ld day."
+msgid_plural " over the past %ld days."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, c-format
+msgid " over the past %ld week."
+msgid_plural " over the past %ld weeks."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, c-format
+msgid " over the past %ld month."
+msgid_plural " over the past %ld months."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#. 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 ""
+
+#. 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 ""
+
+msgid "(G)ood, (A)ccept once, (U)nknown, (R)eject once, (B)ad? "
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "error creating a pipe: %s\n"
+msgid "error changing TOFU policy: %s\n"
+msgstr "ошибка при Ñоздании канала конвейера: %s\n"
+
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, c-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, c-format
+msgid "Have never verified a message signed by key %s!\n"
+msgstr ""
+
+#, c-format
+msgid "Failed to collect signature statistics for \"%s\" (key %s)\n"
+msgstr ""
+
+#, c-format
+msgid "Verified 0 messages signed by \"%s\" (key: %s, policy: %s)."
+msgstr ""
+
+#. TRANSLATORS: The final %s is replaced by a string like
+#. "7 months, 1 day, 5 minutes, 0 seconds".
+#, c-format
+msgid ""
+"Verified %ld message signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgid_plural ""
+"Verified %ld messages signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, c-format
+msgid "The most recent message was verified %s ago."
+msgstr ""
+
+msgid "Warning: we've have yet to see a message signed by this key!\n"
+msgstr ""
+
+msgid "Warning: we've only seen a single message signed by this key!\n"
+msgstr ""
+
+#. TRANSLATORS: translate the below text. We don't
+#. directly internationalize that text so that we can
+#. tweak it without breaking translations.
+#, c-format
+msgid "TOFU: few signatures %d message %s"
+msgid_plural "TOFU: few signatures %d messages %s"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, fuzzy, c-format
+#| msgid "error sending data: %s\n"
+msgid "error opening TOFU database: %s\n"
+msgstr "ошибка отправки данных: %s\n"
+
#, c-format
msgid "'%s' is not a valid long keyID\n"
msgstr "'%s' не ÑвлÑетÑÑ Ð´Ð¾Ð¿ÑƒÑтимым длинным ID ключа\n"
@@ -5371,19 +5692,27 @@ msgstr "проверÑÑ‚ÑŒ таблицу Ð´Ð¾Ð²ÐµÑ€Ð¸Ñ Ð¿Ñ€Ð¸ модели дÐ
msgid "no need for a trustdb update with '%s' trust model\n"
msgstr "обновлÑÑ‚ÑŒ таблицу Ð´Ð¾Ð²ÐµÑ€Ð¸Ñ Ð¿Ñ€Ð¸ модели Ð´Ð¾Ð²ÐµÑ€Ð¸Ñ '%s' не нужно\n"
-#, c-format
-msgid "public key %s not found: %s\n"
-msgstr "открытый ключ %s не найден: %s\n"
-
msgid "please do a --check-trustdb\n"
msgstr "выполните --check-trustdb, пожалуйÑта\n"
msgid "checking the trustdb\n"
msgstr "проверка таблицы довериÑ\n"
-#, c-format
-msgid "%d keys processed (%d validity counts cleared)\n"
-msgstr "обработано %d ключей (Ñброшено %d Ñчетчиков доÑтоверноÑти)\n"
+#, fuzzy, c-format
+#| msgid "%lu keys processed so far\n"
+msgid "%d key processed"
+msgid_plural "%d keys processed"
+msgstr[0] "обработано %lu ключей\n"
+msgstr[1] "обработано %lu ключей\n"
+msgstr[2] "обработано %lu ключей\n"
+
+#, fuzzy, c-format
+#| msgid "%d keys processed (%d validity counts cleared)\n"
+msgid " (%d validity count cleared)\n"
+msgid_plural " (%d validity counts cleared)\n"
+msgstr[0] "обработано %d ключей (Ñброшено %d Ñчетчиков доÑтоверноÑти)\n"
+msgstr[1] "обработано %d ключей (Ñброшено %d Ñчетчиков доÑтоверноÑти)\n"
+msgstr[2] "обработано %d ключей (Ñброшено %d Ñчетчиков доÑтоверноÑти)\n"
msgid "no ultimately trusted keys found\n"
msgstr "абÑолютно доверенных ключей не найдено\n"
@@ -5393,10 +5722,6 @@ msgid "public key of ultimately trusted key %s not found\n"
msgstr "открытый ключ Ð´Ð»Ñ Ð°Ð±Ñолютно доверенного ключа %s не найден\n"
#, c-format
-msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
-msgstr "требуетÑÑ %d Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð½Ñ‹Ð¼ доверием, %d Ñ Ð¿Ð¾Ð»Ð½Ñ‹Ð¼, модель Ð´Ð¾Ð²ÐµÑ€Ð¸Ñ %s\n"
-
-#, c-format
msgid ""
"depth: %d valid: %3d signed: %3d trust: %d-, %dq, %dn, %dm, %df, %du\n"
msgstr ""
@@ -5594,9 +5919,16 @@ msgstr "ошибка Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ ÑтатуÑа CHV Ñ ÐºÐ°Ñ€Ñ‚Ñ‹\n"
msgid "card is permanently locked!\n"
msgstr "карта окончательно заблокирована!\n"
-#, c-format
-msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
-msgstr ""
+#, fuzzy, c-format
+#| msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
+msgid "%d Admin PIN attempt remaining before card is permanently locked\n"
+msgid_plural ""
+"%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr[0] ""
+"оÑталоÑÑŒ %d попыток ввода админиÑтративного PIN перед блокировкой карты\n"
+msgstr[1] ""
+"оÑталоÑÑŒ %d попыток ввода админиÑтративного PIN перед блокировкой карты\n"
+msgstr[2] ""
"оÑталоÑÑŒ %d попыток ввода админиÑтративного PIN перед блокировкой карты\n"
#. TRANSLATORS: Do not translate the "|A|" prefix but keep it at
@@ -5674,9 +6006,13 @@ msgstr "пожалуйÑта, подождите, пока будет генер
msgid "generating key failed\n"
msgstr "Ñбой при генерации ключа\n"
-#, c-format
-msgid "key generation completed (%d seconds)\n"
-msgstr "Ñоздание ключа завершено (%d Ñекунд)\n"
+#, fuzzy, c-format
+#| msgid "key generation completed (%d seconds)\n"
+msgid "key generation completed (%d second)\n"
+msgid_plural "key generation completed (%d seconds)\n"
+msgstr[0] "Ñоздание ключа завершено (%d Ñекунд)\n"
+msgstr[1] "Ñоздание ключа завершено (%d Ñекунд)\n"
+msgstr[2] "Ñоздание ключа завершено (%d Ñекунд)\n"
msgid "invalid structure of OpenPGP card (DO 0x93)\n"
msgstr "недопуÑÑ‚Ð¸Ð¼Ð°Ñ Ñтруктура карты OpenPGP (DO 0x93)\n"
@@ -6998,12 +7334,10 @@ msgstr "ошибка Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ '%s': %s\n"
msgid "error retrieving '%s': http status %u\n"
msgstr "ошибка Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ '%s': ÑÑ‚Ð°Ñ‚ÑƒÑ HTTP %u\n"
-#, fuzzy
-#| msgid "CRL access not possible due to disabled %s\n"
msgid "CRL access not possible due to Tor mode\n"
msgstr ""
"ДоÑтуп к ÑпиÑку отозванных Ñертификатов невозможен\n"
-"из-за того, что не задейÑтвуетÑÑ %s\n"
+"из-за режима Tor\n"
#, c-format
msgid "certificate search not possible due to disabled %s\n"
@@ -7199,7 +7533,7 @@ msgstr ""
"по TLS"
msgid "route all network traffic via Tor"
-msgstr ""
+msgstr "проводить веÑÑŒ Ñетевой обмен через Tor"
msgid ""
"@\n"
@@ -7491,10 +7825,8 @@ msgstr "ошибка Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¸Ð· ответчика: %s\n"
msgid "response from server too large; limit is %d bytes\n"
msgstr "Ñлишком длинный ответ Ñервера; предел - %d байт\n"
-#, fuzzy
-#| msgid "OCSP request not possible due to disabled HTTP\n"
msgid "OCSP request not possible due to Tor mode\n"
-msgstr "Ð·Ð°Ð¿Ñ€Ð¾Ñ OCSP невозможен из-за Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ HTTP\n"
+msgstr "Ð·Ð°Ð¿Ñ€Ð¾Ñ OCSP невозможен из-за режима Tor\n"
msgid "OCSP request not possible due to disabled HTTP\n"
msgstr "Ð·Ð°Ð¿Ñ€Ð¾Ñ OCSP невозможен из-за Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ HTTP\n"
@@ -7812,6 +8144,11 @@ msgstr "|N|Ñчитать фразу-пароль уÑтаревшей череÐ
msgid "do not allow the reuse of old passphrases"
msgstr "не разрешать повторное иÑпользование Ñтарых фраз-паролей"
+#, fuzzy
+#| msgid "|N|set LDAP timeout to N seconds"
+msgid "|N|set the Pinentry timeout to N seconds"
+msgstr "|N|уÑтановить Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ LDAP N Ñекунд"
+
msgid "|NAME|use NAME as default secret key"
msgstr "|NAME|иÑпользовать NAME как оÑновной Ñекретный ключ"
@@ -7850,10 +8187,8 @@ msgstr "Параметры, управлÑющие форматом вывода
msgid "Options controlling the interactivity and enforcement"
msgstr "Параметры, управлÑющие интерактивноÑтью и принудительными дейÑтвиÑми"
-#, fuzzy
-#| msgid "Options controlling the security"
msgid "Options controlling the use of Tor"
-msgstr "Параметры, управлÑющие безопаÑноÑтью"
+msgstr "Параметры, управлÑющие применением Tor"
msgid "Configuration for HTTP servers"
msgstr "ÐаÑтройки Ñерверов HTTP"
@@ -8104,6 +8439,90 @@ msgstr ""
"СинтакÑиÑ: gpg-check-pattern [параметры] файл_образцов\n"
"Проверить фразу-пароль, поÑтупающую из stdin, по файлу образцов\n"
+#~ msgid "key specification '%s' is ambiguous\n"
+#~ msgstr "ÑÐ¿ÐµÑ†Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ ÐºÐ»ÑŽÑ‡Ð° '%s' неоднозначна\n"
+
+#~ msgid "'%s' matches at least:\n"
+#~ msgstr "'%s' ÑоответÑтвует по меньшей мере:\n"
+
+#~ msgid "%d signatures not checked due to missing keys\n"
+#~ msgstr "%d подпиÑей не проверено за отÑутÑтвием ключей\n"
+
+#~ msgid "%d signatures not checked due to errors\n"
+#~ msgstr "%d подпиÑей не проверено из-за ошибок\n"
+
+#~ msgid "1 user ID without valid self-signature detected\n"
+#~ msgstr "обнаружен 1 ID Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð±ÐµÐ· дейÑтвительной ÑамоподпиÑи\n"
+
+#~ msgid "Deleted %d signatures.\n"
+#~ msgstr "Удалено %d подпиÑей.\n"
+
+#~ msgid "User ID \"%s\": %d signatures removed\n"
+#~ msgstr "ID Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ \"%s\": %d подпиÑей удалено\n"
+
+#~ msgid ""
+#~ "You need a Passphrase to protect your secret key.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Ð”Ð»Ñ Ð·Ð°Ñ‰Ð¸Ñ‚Ñ‹ Ñекретного ключа необходима фраза-пароль.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Please enter a passphrase to protect the off-card backup of the new "
+#~ "encryption key."
+#~ msgstr ""
+#~ "Введите фразу-пароль Ð´Ð»Ñ Ð·Ð°Ñ‰Ð¸Ñ‚Ñ‹ архивной копии нового ключа Ð´Ð»Ñ "
+#~ "шифрованиÑ."
+
+#~ msgid "passphrase not correctly repeated; try again"
+#~ msgstr "фраза-пароль повторена неверно; попробуйте еще раз"
+
+#~ msgid "%s.\n"
+#~ msgstr "%s.\n"
+
+#~ msgid ""
+#~ "You don't want a passphrase - this is probably a *bad* idea!\n"
+#~ "I will do it anyway. You can change your passphrase at any time,\n"
+#~ "using this program with the option \"--edit-key\".\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Хотите обойтиÑÑŒ без фразы-паролÑ? Скорее вÑего, Ñто ПЛОХÐЯ мыÑль!\n"
+#~ "Работа будет продолжена. Ð’Ñ‹ можете Ñменить фразу-пароль в любое времÑ,\n"
+#~ "запуÑтив данную программу Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ \"--edit-key\".\n"
+#~ "\n"
+
+#~ msgid "storing key onto card failed: %s\n"
+#~ msgstr "Ñбой ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ ÐºÐ»ÑŽÑ‡Ð° на карте: %s\n"
+
+#~ msgid "1 good signature\n"
+#~ msgstr "1 Ñ…Ð¾Ñ€Ð¾ÑˆÐ°Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑŒ\n"
+
+#~ msgid "renaming '%s' to '%s' failed: %s\n"
+#~ msgstr "Ñбой при переименовании '%s' в '%s': %s\n"
+
+#~ msgid "%lu keys cached (%lu signatures)\n"
+#~ msgstr "%lu ключей помещено в буфер (%lu подпиÑей)\n"
+
+#~ msgid "refreshing 1 key from %s\n"
+#~ msgstr "обновление 1 ключа из %s\n"
+
+#~ msgid "sending key %s to %s server %s\n"
+#~ msgstr "отправка ключа %s на Ñервер %s %s\n"
+
+#~ msgid "public key %s is %lu seconds newer than the signature\n"
+#~ msgstr "открытый ключ %s на %lu Ñекунд новее подпиÑи\n"
+
+#~ msgid ""
+#~ "key %s was created %lu seconds in the future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "ключ %s Ñоздан на %lu Ñекунд в будущем (Ð¿ÐµÑ‚Ð»Ñ Ð²Ð¾ времени или проблемы Ñ "
+#~ "чаÑами)\n"
+
+#~ msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
+#~ msgstr ""
+#~ "требуетÑÑ %d Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð½Ñ‹Ð¼ доверием, %d Ñ Ð¿Ð¾Ð»Ð½Ñ‹Ð¼, модель Ð´Ð¾Ð²ÐµÑ€Ð¸Ñ %s\n"
+
#~ msgid "cleared passphrase cached with ID: %s\n"
#~ msgstr "в буфере Ñброшена фраза-пароль Ñ Ð¸Ð½Ð´ÐµÐºÑом %s\n"
diff --git a/po/sk.po b/po/sk.po
index f23304b..65742d5 100644
--- a/po/sk.po
+++ b/po/sk.po
@@ -1244,6 +1244,20 @@ msgid "Enter passphrase: "
msgstr "Vlo¾te heslo: "
#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "error getting version from '%s': %s\n"
+msgstr "chyba pri vytváraní súboru kµúèov (keyring)`%s': %s\n"
+
+#, c-format
+msgid "server '%s' is older than us (%s < %s)"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "WARNING: %s overrides %s\n"
+msgid "WARNING: %s\n"
+msgstr "VAROVANIE: %s prepí¹e %s\n"
+
+#, fuzzy, c-format
msgid "OpenPGP card not available: %s\n"
msgstr "tajný kµúè nie je dostupný"
@@ -1748,6 +1762,11 @@ msgid "remove as much as possible from key during export"
msgstr ""
#, fuzzy
+#| msgid "%s: skipped: %s\n"
+msgid " - skipped"
+msgstr "%s: preskoèené: %s\n"
+
+#, fuzzy
msgid "exporting secret keys not allowed\n"
msgstr "zapisujem tajný kµúè do `%s'\n"
@@ -1759,19 +1778,36 @@ msgstr "kµúè %08lX: PGP 2.x kµúè - preskoèené\n"
msgid "key %s: key material on-card - skipped\n"
msgstr "kµúè %08lX: podpis subkµúèa na zlom mieste - preskoèené \n"
-#, fuzzy
-#| msgid "%s: skipped: %s\n"
-msgid " - skipped"
-msgstr "%s: preskoèené: %s\n"
-
msgid "WARNING: nothing exported\n"
msgstr "VAROVANIE: niè nebolo vyexportované\n"
+#, fuzzy, c-format
+#| msgid "error creating `%s': %s\n"
+msgid "error creating '%s': %s\n"
+msgstr "chyba pri vytváraní `%s': %s\n"
+
#, fuzzy
msgid "[User ID not found]"
msgstr "[User id not found]"
#, fuzzy, c-format
+msgid "(check argument of option '%s')\n"
+msgstr "neplatný parameter pre import\n"
+
+#, c-format
+msgid "Warning: '%s' should be a long key ID or a fingerprint\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error looking up: %s\n"
+msgstr "chyba pri èítaní `%s': %s\n"
+
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "Warning: %s appears in the keyring %d times\n"
+msgstr "chyba pri vytváraní súboru kµúèov (keyring)`%s': %s\n"
+
+#, fuzzy, c-format
msgid "automatically retrieved '%s' via %s\n"
msgstr "chyba pri vytváraní `%s': %s\n"
@@ -1788,14 +1824,19 @@ msgid "secret key \"%s\" not found: %s\n"
msgstr "tajný kµúè `%s' nebol nájdený: %s\n"
#, fuzzy, c-format
-msgid "(check argument of option '%s')\n"
-msgstr "neplatný parameter pre import\n"
+#| msgid "|NAME|use NAME as default secret key"
+msgid "Warning: not using '%s' as default key: %s\n"
+msgstr "|MENO|pou¾i MENO ako implicitný tajný kµúè"
#, fuzzy, c-format
#| msgid "|NAME|use NAME as default secret key"
-msgid "using \"%s\" as default secret key\n"
+msgid "using \"%s\" as default secret key for signing\n"
msgstr "|MENO|pou¾i MENO ako implicitný tajný kµúè"
+#, c-format
+msgid "all values passed to '%s' ignored\n"
+msgstr ""
+
# c-format
#, fuzzy, c-format
msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
@@ -2163,28 +2204,6 @@ msgid "Note: old default options file '%s' ignored\n"
msgstr "POZNÁMKA: starý implicitný súbor s mo¾nos»ami `%s ignorovaný'\n"
#, c-format
-msgid ""
-"Warning: value '%s' for option '%s' should be a long key ID or a "
-"fingerprint\n"
-msgstr ""
-
-#, c-format
-msgid "key specification '%s' is ambiguous\n"
-msgstr ""
-
-#. TRANSLATORS: The %s prints a key specification which
-#. for example has been given at the command line. Two
-#. lines with fingerprints are printed after this message.
-#, c-format
-msgid "'%s' matches at least:\n"
-msgstr ""
-
-#, fuzzy, c-format
-#| msgid "error creating keyring `%s': %s\n"
-msgid "error searching the keyring: %s\n"
-msgstr "chyba pri vytváraní súboru kµúèov (keyring)`%s': %s\n"
-
-#, c-format
msgid "libgcrypt is too old (need %s, have %s)\n"
msgstr ""
@@ -2390,14 +2409,6 @@ msgid "WARNING: recipients (-r) given without using public key encryption\n"
msgstr ""
"VAROVANIE: daný adresát (-r) bez pou¾itia ¹ifrovania s verejným kµúèom\n"
-#, fuzzy, c-format
-msgid "option '%s' given, but no valid default keys given\n"
-msgstr "neplatný hashovací algoritmus `%s'\n"
-
-#, fuzzy, c-format
-msgid "option '%s' given, but option '%s' not given\n"
-msgstr "neplatný hashovací algoritmus `%s'\n"
-
msgid "--store [filename]"
msgstr "--store [meno súboru]"
@@ -2477,6 +2488,11 @@ msgstr "nepodarilo sa prija» kµúè zo servera: %s\n"
msgid "key export failed: %s\n"
msgstr "nepodaril sa export kµúèa: %s\n"
+#, fuzzy, c-format
+#| msgid "key export failed: %s\n"
+msgid "export as ssh key failed: %s\n"
+msgstr "nepodaril sa export kµúèa: %s\n"
+
#, c-format
msgid "keyserver search failed: %s\n"
msgstr "nepodarilo sa nájs» server: %s\n"
@@ -2972,33 +2988,34 @@ msgstr "[revokácia]"
msgid "[self-signature]"
msgstr "[podpis kµúèa ním samým]"
-msgid "1 bad signature\n"
-msgstr "1 zlý podpis\n"
-
-#, c-format
-msgid "%d bad signatures\n"
-msgstr "%d zlých podpisov\n"
-
-msgid "1 signature not checked due to a missing key\n"
-msgstr "1 podpis neoverený, preto¾e chýba kµúè\n"
-
-#, c-format
-msgid "%d signatures not checked due to missing keys\n"
-msgstr "%d podpisov neoverených, preto¾e chýba kµúè\n"
-
-msgid "1 signature not checked due to an error\n"
-msgstr "1 podpis neoverený, preto¾e vznikla chyba\n"
+#, fuzzy, c-format
+#| msgid "%d bad signatures\n"
+msgid "%d bad signature\n"
+msgid_plural "%d bad signatures\n"
+msgstr[0] "%d zlých podpisov\n"
+msgstr[1] "%d zlých podpisov\n"
-#, c-format
-msgid "%d signatures not checked due to errors\n"
-msgstr "%d podpisov neoverených, preto¾e vznikli chyby\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to a missing key\n"
+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 podpis neoverený, preto¾e chýba kµúè\n"
+msgstr[1] "1 podpis neoverený, preto¾e chýba kµúè\n"
-msgid "1 user ID without valid self-signature detected\n"
-msgstr "zistený 1 identifikátor u¾ívateµa bez platného podpisu ním samým\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to an error\n"
+msgid "%d signature not checked due to an error\n"
+msgid_plural "%d signatures not checked due to errors\n"
+msgstr[0] "1 podpis neoverený, preto¾e vznikla chyba\n"
+msgstr[1] "1 podpis neoverený, preto¾e vznikla chyba\n"
-#, c-format
-msgid "%d user IDs without valid self-signatures detected\n"
-msgstr ""
+#, fuzzy, c-format
+#| msgid "%d user IDs without valid self-signatures detected\n"
+msgid "%d user ID without valid self-signature detected\n"
+msgid_plural "%d user IDs without valid self-signatures detected\n"
+msgstr[0] ""
+"zistených %d identifikátorov u¾ívateµa bez platného podpisu ním samým\n"
+msgstr[1] ""
"zistených %d identifikátorov u¾ívateµa bez platného podpisu ním samým\n"
#, fuzzy
@@ -3636,13 +3653,12 @@ msgstr "Zmaza» tento neznámy podpis? (a/N/u)"
msgid "Really delete this self-signature? (y/N)"
msgstr "Skutoène zmaza» tento podpis podpísaný sebou samým? (a/N)"
-#, c-format
+#, fuzzy, c-format
+#| msgid "Deleted %d signature.\n"
msgid "Deleted %d signature.\n"
-msgstr "Zmazaný %d podpis.\n"
-
-#, c-format
-msgid "Deleted %d signatures.\n"
-msgstr "Zmazaných %d podpisov.\n"
+msgid_plural "Deleted %d signatures.\n"
+msgstr[0] "Zmazaný %d podpis.\n"
+msgstr[1] "Zmazaný %d podpis.\n"
msgid "Nothing deleted.\n"
msgstr "Niè nebolo zmaznané.\n"
@@ -3657,11 +3673,9 @@ msgstr "U¾ívateµské ID \"%s\" je revokované."
#, fuzzy, c-format
msgid "User ID \"%s\": %d signature removed\n"
-msgstr "U¾ívateµské ID \"%s\" je revokované."
-
-#, fuzzy, c-format
-msgid "User ID \"%s\": %d signatures removed\n"
-msgstr "U¾ívateµské ID \"%s\" je revokované."
+msgid_plural "User ID \"%s\": %d signatures removed\n"
+msgstr[0] "U¾ívateµské ID \"%s\" je revokované."
+msgstr[1] "U¾ívateµské ID \"%s\" je revokované."
#, fuzzy, c-format
msgid "User ID \"%s\": already minimized\n"
@@ -4194,37 +4208,6 @@ msgid "Please correct the error first\n"
msgstr "Najskôr, prosím, opravte chybu\n"
msgid ""
-"You need a Passphrase to protect your secret key.\n"
-"\n"
-msgstr ""
-"Na ochranu Vá¹ho tajného kµúèa musíte zada» heslo.\n"
-"\n"
-
-#, fuzzy
-msgid ""
-"Please enter a passphrase to protect the off-card backup of the new "
-"encryption key."
-msgstr "Prosím, vlo¾te heslo; toto je tajná veta \n"
-
-msgid "passphrase not correctly repeated; try again"
-msgstr "heslo nie je zopakované správne; skúste to znovu"
-
-#, c-format
-msgid "%s.\n"
-msgstr "%s.\n"
-
-msgid ""
-"You don't want a passphrase - this is probably a *bad* idea!\n"
-"I will do it anyway. You can change your passphrase at any time,\n"
-"using this program with the option \"--edit-key\".\n"
-"\n"
-msgstr ""
-"Nechcete heslo - to *nie je* dobrý nápad!\n"
-"Dobre, budem pokraèova» bez hesla. Kedykoµvek mô¾ete heslo zmeni» pou¾itím\n"
-"tohto programu s parametrom \"--edit-key\".\n"
-"\n"
-
-msgid ""
"We need to generate a lot of random bytes. It is a good idea to perform\n"
"some other action (type on the keyboard, move the mouse, utilize the\n"
"disks) during the prime generation; this gives the random number\n"
@@ -4269,6 +4252,14 @@ msgid "Key generation canceled.\n"
msgstr "Vytváranie kµúèa bolo zru¹ené.\n"
#, fuzzy, c-format
+msgid "can't create backup file '%s': %s\n"
+msgstr "nemô¾em vytvori» `%s': %s\n"
+
+#, fuzzy, c-format
+msgid "Note: backup of card key saved to '%s'\n"
+msgstr "POZNÁMKA: platnos» tajného kµúèa %08lX skonèila %s\n"
+
+#, fuzzy, c-format
#| msgid "writing public key to `%s'\n"
msgid "writing public key to '%s'\n"
msgstr "zapisujem verejný kµúè do `%s'\n"
@@ -4323,18 +4314,6 @@ msgstr "Tajné èasti primárneho kµúèa nie sú dostupné.\n"
msgid "Really create? (y/N) "
msgstr "Skutoène vytvori»? "
-#, fuzzy, c-format
-msgid "storing key onto card failed: %s\n"
-msgstr "zmazanie bloku kµúèa sa nepodarilo: %s\n"
-
-#, fuzzy, c-format
-msgid "can't create backup file '%s': %s\n"
-msgstr "nemô¾em vytvori» `%s': %s\n"
-
-#, fuzzy, c-format
-msgid "Note: backup of card key saved to '%s'\n"
-msgstr "POZNÁMKA: platnos» tajného kµúèa %08lX skonèila %s\n"
-
msgid "never "
msgstr "nikdy "
@@ -4353,19 +4332,18 @@ msgstr "Kritická podpisová notácia: "
msgid "Signature notation: "
msgstr "Podpisová notácia: "
-#, fuzzy
-#| msgid "1 bad signature\n"
-msgid "1 good signature\n"
-msgstr "1 zlý podpis\n"
-
#, fuzzy, c-format
#| msgid "%d bad signatures\n"
-msgid "%d good signatures\n"
-msgstr "%d zlých podpisov\n"
+msgid "%d good signature\n"
+msgid_plural "%d good signatures\n"
+msgstr[0] "%d zlých podpisov\n"
+msgstr[1] "%d zlých podpisov\n"
#, c-format
-msgid "Warning: %lu key(s) skipped due to their large size\n"
-msgstr ""
+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] ""
msgid "Keyring"
msgstr "súbor kµúèov (keyring)"
@@ -4396,20 +4374,27 @@ msgid " Card serial no. ="
msgstr ""
#, fuzzy, c-format
-msgid "renaming '%s' to '%s' failed: %s\n"
-msgstr "kódovanie do ASCII formátu zlyhalo: %s\n"
-
-#, fuzzy, c-format
msgid "caching keyring '%s'\n"
msgstr "kontrolujem súbor kµúèov (keyring) `%s'\n"
#, fuzzy, c-format
-msgid "%lu keys cached so far (%lu signatures)\n"
-msgstr "%lu kµúèov skontrolovaných (%lu podpisov)\n"
+msgid "%lu keys cached so far (%lu signature)\n"
+msgid_plural "%lu keys cached so far (%lu signatures)\n"
+msgstr[0] "%lu kµúèov skontrolovaných (%lu podpisov)\n"
+msgstr[1] "%lu kµúèov skontrolovaných (%lu podpisov)\n"
+
+#, c-format
+msgid "%lu key cached"
+msgid_plural "%lu keys cached"
+msgstr[0] ""
+msgstr[1] ""
#, fuzzy, c-format
-msgid "%lu keys cached (%lu signatures)\n"
-msgstr "%lu kµúèov skontrolovaných (%lu podpisov)\n"
+#| msgid "1 bad signature\n"
+msgid " (%lu signature)\n"
+msgid_plural " (%lu signatures)\n"
+msgstr[0] "1 zlý podpis\n"
+msgstr[1] "1 zlý podpis\n"
#, c-format
msgid "%s: keyring created\n"
@@ -4453,18 +4438,16 @@ msgid "\"%s\" not a key ID: skipping\n"
msgstr ""
#, fuzzy, c-format
-msgid "refreshing 1 key from %s\n"
-msgstr "po¾adujem kµúè %08lX z %s\n"
+msgid "refreshing %d key from %s\n"
+msgid_plural "refreshing %d keys from %s\n"
+msgstr[0] "po¾adujem kµúè %08lX z %s\n"
+msgstr[1] "po¾adujem kµúè %08lX z %s\n"
#, fuzzy, c-format
msgid "WARNING: unable to refresh key %s via %s: %s\n"
msgstr "VAROVANIE: nemô¾em vymaza» doèasný súbor (%s) `%s': %s\n"
#, fuzzy, c-format
-msgid "refreshing %d keys from %s\n"
-msgstr "po¾adujem kµúè %08lX z %s\n"
-
-#, fuzzy, c-format
msgid "key \"%s\" not found on keyserver\n"
msgstr "kµúè `%s' nebol nájdený: %s\n"
@@ -4483,9 +4466,9 @@ msgstr "po¾adujem kµúè %08lX z %s\n"
msgid "requesting key %s from %s\n"
msgstr "po¾adujem kµúè %08lX z %s\n"
-#, fuzzy, c-format
-msgid "sending key %s to %s server %s\n"
-msgstr "vyhµadávam \"%s\" na HKP serveri %s\n"
+#, fuzzy
+msgid "no keyserver known\n"
+msgstr "neplatný parameter pre export\n"
#, fuzzy, c-format
msgid "sending key %s to %s\n"
@@ -4715,6 +4698,17 @@ msgstr ""
msgid "Note: signatures using the %s algorithm are rejected\n"
msgstr "%s podpis, hashovací algoritmus %s\n"
+#, fuzzy, c-format
+msgid "(reported error: %s)\n"
+msgstr "chyba pri èítaní: %s\n"
+
+#, fuzzy, c-format
+msgid "(reported error: %s <%s>)\n"
+msgstr "chyba pri èítaní: %s\n"
+
+msgid "(further info: "
+msgstr ""
+
#, c-format
msgid "%s:%d: deprecated option \"%s\"\n"
msgstr "%s:%d: pou¾itie parametra \"%s\" sa neodporúèa\n"
@@ -5123,6 +5117,19 @@ msgstr "%s: preskoèené: verejný kµúè je neplatný (disabled)\n"
msgid "%s: skipped: public key already present\n"
msgstr "%s: preskoèené: verejný kµúè je u¾ obsiahnutý v databáze\n"
+#, fuzzy, c-format
+#| msgid "can't connect to `%s': %s\n"
+msgid "can't encrypt to '%s'\n"
+msgstr "nemô¾em sa pripoji» k `%s': %s\n"
+
+#, fuzzy, c-format
+msgid "option '%s' given, but no valid default keys given\n"
+msgstr "neplatný hashovací algoritmus `%s'\n"
+
+#, fuzzy, c-format
+msgid "option '%s' given, but option '%s' not given\n"
+msgstr "neplatný hashovací algoritmus `%s'\n"
+
msgid "You did not specify a user ID. (you may use \"-r\")\n"
msgstr ""
"Ne¹pecifikovali ste identifikátor u¾ívateµa (user ID). Mô¾ete pou¾i» \"-r\"\n"
@@ -5167,11 +5174,6 @@ msgstr "kµúè %08lX: chyba identifikátor u¾ívateµa\n"
msgid "data not saved; use option \"--output\" to save it\n"
msgstr "dáta neboli ulo¾ené; na ich ulo¾enie pou¾ite prepínaè \"--output\"\n"
-#, fuzzy, c-format
-#| msgid "error creating `%s': %s\n"
-msgid "error creating '%s': %s\n"
-msgstr "chyba pri vytváraní `%s': %s\n"
-
msgid "Detached signature.\n"
msgstr "Podpis oddelený od dokumentu.\n"
@@ -5262,19 +5264,31 @@ msgid "This is a revocation certificate for the OpenPGP key:"
msgstr "Vytvori» pre tento podpis revokaèný certifikát? "
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 ""
+
+msgid ""
"Use it to revoke this key in case of a compromise or loss of\n"
"the secret key. However, if the secret key is still accessible,\n"
"it is better to generate a new revocation certificate and give\n"
-"a reason for the revocation."
+"a reason for the revocation. For details see the description of\n"
+"of the gpg command \"--gen-revoke\" in the GnuPG manual."
msgstr ""
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 making use of this revocation certificate."
+"before importing and publishing this revocation certificate."
msgstr ""
#, fuzzy, c-format
+#| msgid "Revocation certificate created.\n"
+msgid "revocation certificate stored as '%s.rev'\n"
+msgstr "Revokaèný certifikát bol vytvorený.\n"
+
+#, fuzzy, c-format
msgid "secret key \"%s\" not found\n"
msgstr "tajný kµúè `%s' nebol nájdený: %s\n"
@@ -5285,6 +5299,11 @@ msgstr "tajný kµúè `%s' nebol nájdený: %s\n"
msgid "'%s' matches multiple secret keys:\n"
msgstr ""
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "error searching the keyring: %s\n"
+msgstr "chyba pri vytváraní súboru kµúèov (keyring)`%s': %s\n"
+
#, fuzzy
msgid "Create a revocation certificate for this key? (y/N) "
msgstr "Vytvori» pre tento podpis revokaèný certifikát? "
@@ -5365,23 +5384,36 @@ msgstr ""
#, fuzzy, c-format
msgid "public key %s is %lu second newer than the signature\n"
-msgstr "verejný kµúè %08lX je o %lu sekund nov¹í ne¾ podpis\n"
+msgid_plural "public key %s is %lu seconds newer than the signature\n"
+msgstr[0] "verejný kµúè %08lX je o %lu sekund nov¹í ne¾ podpis\n"
+msgstr[1] "verejný kµúè %08lX je o %lu sekund nov¹í ne¾ podpis\n"
#, fuzzy, c-format
-msgid "public key %s is %lu seconds newer than the signature\n"
-msgstr "verejný kµúè %08lX je o %lu sekund nov¹í ne¾ podpis\n"
+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] "verejný kµúè %08lX je o %lu sekund nov¹í ne¾ podpis\n"
+msgstr[1] "verejný kµúè %08lX je o %lu sekund nov¹í ne¾ podpis\n"
#, fuzzy, c-format
msgid ""
"key %s was created %lu second in the future (time warp or clock problem)\n"
-msgstr ""
+msgid_plural ""
+"key %s was created %lu seconds in the future (time warp or clock problem)\n"
+msgstr[0] ""
+"kµúè bol vytvorený %lu sekund v budúcnosti (do¹lo k zmene èasu alebo\n"
+"je problém so systémovým èasom)\n"
+msgstr[1] ""
"kµúè bol vytvorený %lu sekund v budúcnosti (do¹lo k zmene èasu alebo\n"
"je problém so systémovým èasom)\n"
#, fuzzy, c-format
-msgid ""
-"key %s was created %lu seconds in the future (time warp or clock problem)\n"
-msgstr ""
+msgid "key %s was created %lu day in the future (time warp or clock problem)\n"
+msgid_plural ""
+"key %s was created %lu days in the future (time warp or clock problem)\n"
+msgstr[0] ""
+"kµúè bol vytvorený %lu sekund v budúcnosti (do¹lo k zmene èasu alebo\n"
+"je problém so systémovým èasom)\n"
+msgstr[1] ""
"kµúè bol vytvorený %lu sekund v budúcnosti (do¹lo k zmene èasu alebo\n"
"je problém so systémovým èasom)\n"
@@ -5621,6 +5653,237 @@ msgid "input line longer than %d characters\n"
msgstr "vstupný riadok je dlh¹í ako %d znakov\n"
#, fuzzy, c-format
+msgid "error beginning transaction on TOFU database: %s\n"
+msgstr "chyba pri posielaní na `%s': %s\n"
+
+#, c-format
+msgid "error committing transaction on TOFU database: %s\n"
+msgstr ""
+
+#, c-format
+msgid "error rolling back transaction on TOFU database: %s\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "unsupported TOFU database version: %s\n"
+msgstr ""
+"\n"
+"Podporované algoritmy:\n"
+
+#, fuzzy, c-format
+msgid "error reading TOFU database: %s\n"
+msgstr "chyba pri posielaní na `%s': %s\n"
+
+#, fuzzy, c-format
+#| msgid "error writing secret keyring `%s': %s\n"
+msgid "error determining TOFU database's version: %s\n"
+msgstr "chyba pri zápise do súboru tajných kµúèov `%s': %s\n"
+
+#, fuzzy, c-format
+#| msgid "%s: error writing dir record: %s\n"
+msgid "error initializing TOFU database: %s\n"
+msgstr "%s: chyba pri zápise adresárového záznamu: %s\n"
+
+#, fuzzy, c-format
+msgid "error opening TOFU database '%s': %s\n"
+msgstr "chyba pri èítaní `%s': %s\n"
+
+msgid "Warning: Home directory contains both tofu.db and tofu.d.\n"
+msgstr ""
+
+msgid "Using split format for TOFU database\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error updating TOFU database: %s\n"
+msgstr "chyba pri posielaní na `%s': %s\n"
+
+#, fuzzy, c-format
+msgid "public key %s not found: %s\n"
+msgstr "verejný kµúè %08lX nebol nájdený: %s\n"
+
+#, fuzzy, c-format
+msgid "error setting TOFU binding's trust level to %s\n"
+msgstr "chyba pri èítaní `%s': %s\n"
+
+#, c-format
+msgid "The binding %s is NOT known."
+msgstr ""
+
+#, c-format
+msgid ""
+"The key %s raised a conflict with this binding (%s). Since this binding's "
+"policy was 'auto', it was changed to 'ask'."
+msgstr ""
+
+#, c-format
+msgid ""
+"Please indicate whether you believe the binding %s%sis legitimate (the key "
+"belongs to the stated owner) or a forgery (bad)."
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error gathering other user IDs: %s\n"
+msgstr "chyba pri vytváraní hesla: %s\n"
+
+msgid "Known user IDs associated with this key:\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "Policy: "
+msgid "policy: %s"
+msgstr "Politika: "
+
+#, fuzzy, c-format
+msgid "error gathering signature stats: %s\n"
+msgstr "chyba pri vytváraní hesla: %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] ""
+msgstr[1] ""
+
+#, c-format
+msgid "Statistics for keys with the email address \"%s\":\n"
+msgstr ""
+
+#, fuzzy
+#| msgid "list keys"
+msgid "this key"
+msgstr "vypísa» zoznam kµúèov"
+
+#, c-format
+msgid "%ld message signed in the future."
+msgid_plural "%ld messages signed in the future."
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+msgid "%ld message signed"
+msgid_plural "%ld messages signed"
+msgstr[0] "|algo [súbory]|vypí¹ hash"
+msgstr[1] "|algo [súbory]|vypí¹ hash"
+
+#, c-format
+msgid " over the past %ld day."
+msgid_plural " over the past %ld days."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid " over the past %ld week."
+msgid_plural " over the past %ld weeks."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid " over the past %ld month."
+msgid_plural " over the past %ld months."
+msgstr[0] ""
+msgstr[1] ""
+
+#. 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 ""
+
+#. 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 ""
+
+msgid "(G)ood, (A)ccept once, (U)nknown, (R)eject once, (B)ad? "
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error changing TOFU policy: %s\n"
+msgstr "chyba pri vytváraní hesla: %s\n"
+
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "Have never verified a message signed by key %s!\n"
+msgstr ""
+
+#, c-format
+msgid "Failed to collect signature statistics for \"%s\" (key %s)\n"
+msgstr ""
+
+#, c-format
+msgid "Verified 0 messages signed by \"%s\" (key: %s, policy: %s)."
+msgstr ""
+
+#. TRANSLATORS: The final %s is replaced by a string like
+#. "7 months, 1 day, 5 minutes, 0 seconds".
+#, c-format
+msgid ""
+"Verified %ld message signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgid_plural ""
+"Verified %ld messages signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "The most recent message was verified %s ago."
+msgstr ""
+
+msgid "Warning: we've have yet to see a message signed by this key!\n"
+msgstr ""
+
+msgid "Warning: we've only seen a single message signed by this key!\n"
+msgstr ""
+
+#. TRANSLATORS: translate the below text. We don't
+#. directly internationalize that text so that we can
+#. tweak it without breaking translations.
+#, c-format
+msgid "TOFU: few signatures %d message %s"
+msgid_plural "TOFU: few signatures %d messages %s"
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+msgid "error opening TOFU database: %s\n"
+msgstr "chyba pri posielaní na `%s': %s\n"
+
+#, fuzzy, c-format
#| msgid "`%s' is not a valid long keyID\n"
msgid "'%s' is not a valid long keyID\n"
msgstr "`%s' nie je platné dlhé keyID\n"
@@ -5679,19 +5942,24 @@ msgstr "nie je nutné kontrolova» databázu dôvery\n"
msgid "no need for a trustdb update with '%s' trust model\n"
msgstr "nie je nutné kontrolova» databázu dôvery\n"
-#, fuzzy, c-format
-msgid "public key %s not found: %s\n"
-msgstr "verejný kµúè %08lX nebol nájdený: %s\n"
-
msgid "please do a --check-trustdb\n"
msgstr "prosím vykonajte --check-trustdb\n"
msgid "checking the trustdb\n"
msgstr "kontrolujem databázu dôvery\n"
-#, c-format
-msgid "%d keys processed (%d validity counts cleared)\n"
-msgstr "%d kµúèov spracovaných (%d poètov platnosti vymazaných)\n"
+#, fuzzy, c-format
+msgid "%d key processed"
+msgid_plural "%d keys processed"
+msgstr[0] "%lu kµúèe boli doteraz spracované\n"
+msgstr[1] "%lu kµúèe boli doteraz spracované\n"
+
+#, fuzzy, c-format
+#| msgid "%d keys processed (%d validity counts cleared)\n"
+msgid " (%d validity count cleared)\n"
+msgid_plural " (%d validity counts cleared)\n"
+msgstr[0] "%d kµúèov spracovaných (%d poètov platnosti vymazaných)\n"
+msgstr[1] "%d kµúèov spracovaných (%d poètov platnosti vymazaných)\n"
msgid "no ultimately trusted keys found\n"
msgstr "neboli nájdené ¾iadne absolútne dôveryhodné kµúèe\n"
@@ -5701,10 +5969,6 @@ msgid "public key of ultimately trusted key %s not found\n"
msgstr "verejný kµúè k absolútne dôveryhodnému kµúèu %08lX nebol nájdený\n"
#, c-format
-msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
-msgstr ""
-
-#, c-format
msgid ""
"depth: %d valid: %3d signed: %3d trust: %d-, %dq, %dn, %dm, %df, %du\n"
msgstr ""
@@ -5903,8 +6167,11 @@ msgid "card is permanently locked!\n"
msgstr ""
#, c-format
-msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
-msgstr ""
+msgid "%d Admin PIN attempt remaining before card is permanently locked\n"
+msgid_plural ""
+"%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr[0] ""
+msgstr[1] ""
#. TRANSLATORS: Do not translate the "|A|" prefix but keep it at
#. the start of the string. Use %%0A to force a linefeed.
@@ -5994,8 +6261,10 @@ msgid "generating key failed\n"
msgstr "zmazanie bloku kµúèa sa nepodarilo: %s\n"
#, fuzzy, c-format
-msgid "key generation completed (%d seconds)\n"
-msgstr "Vytvorenie kµúèa sa nepodarilo: %s\n"
+msgid "key generation completed (%d second)\n"
+msgid_plural "key generation completed (%d seconds)\n"
+msgstr[0] "Vytvorenie kµúèa sa nepodarilo: %s\n"
+msgstr[1] "Vytvorenie kµúèa sa nepodarilo: %s\n"
msgid "invalid structure of OpenPGP card (DO 0x93)\n"
msgstr ""
@@ -8198,6 +8467,9 @@ msgstr "|N|pou¾i» mód hesla N"
msgid "do not allow the reuse of old passphrases"
msgstr "chyba pri vytváraní hesla: %s\n"
+msgid "|N|set the Pinentry timeout to N seconds"
+msgstr ""
+
msgid "|NAME|use NAME as default secret key"
msgstr "|MENO|pou¾i MENO ako implicitný tajný kµúè"
@@ -8494,6 +8766,90 @@ msgid ""
"Check a passphrase given on stdin against the patternfile\n"
msgstr ""
+#~ msgid "%d signatures not checked due to missing keys\n"
+#~ msgstr "%d podpisov neoverených, preto¾e chýba kµúè\n"
+
+#~ msgid "%d signatures not checked due to errors\n"
+#~ msgstr "%d podpisov neoverených, preto¾e vznikli chyby\n"
+
+#~ msgid "1 user ID without valid self-signature detected\n"
+#~ msgstr "zistený 1 identifikátor u¾ívateµa bez platného podpisu ním samým\n"
+
+#~ msgid "Deleted %d signatures.\n"
+#~ msgstr "Zmazaných %d podpisov.\n"
+
+#, fuzzy
+#~ msgid "User ID \"%s\": %d signatures removed\n"
+#~ msgstr "U¾ívateµské ID \"%s\" je revokované."
+
+#~ msgid ""
+#~ "You need a Passphrase to protect your secret key.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Na ochranu Vá¹ho tajného kµúèa musíte zada» heslo.\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "Please enter a passphrase to protect the off-card backup of the new "
+#~ "encryption key."
+#~ msgstr "Prosím, vlo¾te heslo; toto je tajná veta \n"
+
+#~ msgid "passphrase not correctly repeated; try again"
+#~ msgstr "heslo nie je zopakované správne; skúste to znovu"
+
+#~ msgid "%s.\n"
+#~ msgstr "%s.\n"
+
+#~ msgid ""
+#~ "You don't want a passphrase - this is probably a *bad* idea!\n"
+#~ "I will do it anyway. You can change your passphrase at any time,\n"
+#~ "using this program with the option \"--edit-key\".\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Nechcete heslo - to *nie je* dobrý nápad!\n"
+#~ "Dobre, budem pokraèova» bez hesla. Kedykoµvek mô¾ete heslo zmeni» "
+#~ "pou¾itím\n"
+#~ "tohto programu s parametrom \"--edit-key\".\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid "storing key onto card failed: %s\n"
+#~ msgstr "zmazanie bloku kµúèa sa nepodarilo: %s\n"
+
+#, fuzzy
+#~| msgid "1 bad signature\n"
+#~ msgid "1 good signature\n"
+#~ msgstr "1 zlý podpis\n"
+
+#, fuzzy
+#~ msgid "renaming '%s' to '%s' failed: %s\n"
+#~ msgstr "kódovanie do ASCII formátu zlyhalo: %s\n"
+
+#, fuzzy
+#~ msgid "%lu keys cached (%lu signatures)\n"
+#~ msgstr "%lu kµúèov skontrolovaných (%lu podpisov)\n"
+
+#, fuzzy
+#~ msgid "refreshing 1 key from %s\n"
+#~ msgstr "po¾adujem kµúè %08lX z %s\n"
+
+#, fuzzy
+#~ msgid "sending key %s to %s server %s\n"
+#~ msgstr "vyhµadávam \"%s\" na HKP serveri %s\n"
+
+#, fuzzy
+#~ msgid "public key %s is %lu seconds newer than the signature\n"
+#~ msgstr "verejný kµúè %08lX je o %lu sekund nov¹í ne¾ podpis\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "key %s was created %lu seconds in the future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "kµúè bol vytvorený %lu sekund v budúcnosti (do¹lo k zmene èasu alebo\n"
+#~ "je problém so systémovým èasom)\n"
+
#, fuzzy
#~| msgid "can't open the keyring"
#~ msgid "Failed to open the keyring DB.\n"
@@ -8746,10 +9102,6 @@ msgstr ""
#~ msgstr "vyhµadávam \"%s\" na HKP serveri %s\n"
#, fuzzy
-#~ msgid "no keyserver action!\n"
-#~ msgstr "neplatný parameter pre export\n"
-
-#, fuzzy
#~ msgid "keyserver timed out\n"
#~ msgstr "chyba servera kµúèov"
@@ -9949,9 +10301,6 @@ msgstr ""
#~ msgid "%s%c %4u%c/%08lX created: %s expires: %s"
#~ msgstr "%s%c %4u%c/%08lX vytvorený: %s platnos» do: %s"
-#~ msgid "Policy: "
-#~ msgstr "Politika: "
-
#~ msgid "can't get key from keyserver: %s\n"
#~ msgstr "nemô¾em dosta» kµúè zo servera kµúèov: %s\n"
diff --git a/po/sv.po b/po/sv.po
index a589184..93aad23 100644
--- a/po/sv.po
+++ b/po/sv.po
@@ -1303,6 +1303,20 @@ msgstr "misslyckades med att förmedla %s-begäran till klient\n"
msgid "Enter passphrase: "
msgstr "Ange lösenfrasen\n"
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "error getting version from '%s': %s\n"
+msgstr "fel när nyckelringen \"%s\" skapades: %s\n"
+
+#, c-format
+msgid "server '%s' is older than us (%s < %s)"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "WARNING: %s overrides %s\n"
+msgid "WARNING: %s\n"
+msgstr "VARNING: %s gäller istället för %s\n"
+
#, c-format
msgid "OpenPGP card not available: %s\n"
msgstr "OpenPGP-kort är inte tillgängligt: %s\n"
@@ -1804,6 +1818,11 @@ msgstr "ta bort oanvändbara delar från nyckeln under exportering"
msgid "remove as much as possible from key during export"
msgstr "ta bort så mycket som möjligt från nyckeln under exportering"
+#, fuzzy
+#| msgid "%s: skipped: %s\n"
+msgid " - skipped"
+msgstr "%s: hoppade över: %s\n"
+
msgid "exporting secret keys not allowed\n"
msgstr "export av hemliga nycklar tillåts inte\n"
@@ -1815,18 +1834,37 @@ msgstr "nyckeln %s: nyckel av PGP 2.x-typ - hoppade över\n"
msgid "key %s: key material on-card - skipped\n"
msgstr "nyckeln %s: nyckelmaterial på kortet - hoppade över\n"
-#, fuzzy
-#| msgid "%s: skipped: %s\n"
-msgid " - skipped"
-msgstr "%s: hoppade över: %s\n"
-
msgid "WARNING: nothing exported\n"
msgstr "VARNING: ingenting exporterat\n"
+#, fuzzy, c-format
+#| msgid "error creating `%s': %s\n"
+msgid "error creating '%s': %s\n"
+msgstr "Fel när \"%s\" skapades: %s\n"
+
msgid "[User ID not found]"
msgstr "[Användaridentiteten hittades inte]"
#, fuzzy, c-format
+#| msgid "missing argument for option \"%.50s\"\n"
+msgid "(check argument of option '%s')\n"
+msgstr "argument för flaggan \"%.50s\" saknas\n"
+
+#, c-format
+msgid "Warning: '%s' should be a long key ID or a fingerprint\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "error closing %s: %s\n"
+msgid "error looking up: %s\n"
+msgstr "fel vid stängning av %s: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "Warning: %s appears in the keyring %d times\n"
+msgstr "fel när nyckelringen \"%s\" skapades: %s\n"
+
+#, fuzzy, c-format
#| msgid "automatically retrieved `%s' via %s\n"
msgid "automatically retrieved '%s' via %s\n"
msgstr "hämtade \"%s\" automatiskt via %s\n"
@@ -1844,16 +1882,20 @@ msgid "secret key \"%s\" not found: %s\n"
msgstr "hemliga nyckeln \"%s\" hittades inte: %s\n"
#, fuzzy, c-format
-#| msgid "missing argument for option \"%.50s\"\n"
-msgid "(check argument of option '%s')\n"
-msgstr "argument för flaggan \"%.50s\" saknas\n"
+#| msgid "|NAME|use NAME as default secret key"
+msgid "Warning: not using '%s' as default key: %s\n"
+msgstr "|NAMN|använd NAMN som förvald hemlig nyckel"
#, fuzzy, c-format
#| msgid "|NAME|use NAME as default secret key"
-msgid "using \"%s\" as default secret key\n"
+msgid "using \"%s\" as default secret key for signing\n"
msgstr "|NAMN|använd NAMN som förvald hemlig nyckel"
#, c-format
+msgid "all values passed to '%s' ignored\n"
+msgstr ""
+
+#, c-format
msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
msgstr ""
"Ogiltiga nyckeln %s tvingades till giltig med --allow-non-selfsigned-uid\n"
@@ -2234,29 +2276,6 @@ msgid "Note: old default options file '%s' ignored\n"
msgstr "OBS: den gamla inställningsfilen \"%s\" används inte\n"
#, c-format
-msgid ""
-"Warning: value '%s' for option '%s' should be a long key ID or a "
-"fingerprint\n"
-msgstr ""
-
-#, fuzzy, c-format
-#| msgid "option \"%.50s\" is ambiguous\n"
-msgid "key specification '%s' is ambiguous\n"
-msgstr "flagga \"%.50s\" är tvetydig\n"
-
-#. TRANSLATORS: The %s prints a key specification which
-#. for example has been given at the command line. Two
-#. lines with fingerprints are printed after this message.
-#, c-format
-msgid "'%s' matches at least:\n"
-msgstr ""
-
-#, fuzzy, c-format
-#| msgid "error creating keyring `%s': %s\n"
-msgid "error searching the keyring: %s\n"
-msgstr "fel när nyckelringen \"%s\" skapades: %s\n"
-
-#, c-format
msgid "libgcrypt is too old (need %s, have %s)\n"
msgstr "libgcrypt är för gammalt (behöver %s, har %s)\n"
@@ -2469,16 +2488,6 @@ msgid "WARNING: recipients (-r) given without using public key encryption\n"
msgstr ""
"VARNING: mottagare (-r) angivna utan att använda publik nyckel-kryptering\n"
-#, fuzzy, c-format
-#| msgid "line %d: invalid algorithm\n"
-msgid "option '%s' given, but no valid default keys given\n"
-msgstr "rad %d: ogiltig algoritm\n"
-
-#, fuzzy, c-format
-#| msgid "line %d: invalid algorithm\n"
-msgid "option '%s' given, but option '%s' not given\n"
-msgstr "rad %d: ogiltig algoritm\n"
-
msgid "--store [filename]"
msgstr "--store [filnamn]"
@@ -2553,6 +2562,11 @@ msgstr "hämtning från nyckelservern misslyckades: %s\n"
msgid "key export failed: %s\n"
msgstr "export av nyckeln misslyckades: %s\n"
+#, fuzzy, c-format
+#| msgid "key export failed: %s\n"
+msgid "export as ssh key failed: %s\n"
+msgstr "export av nyckeln misslyckades: %s\n"
+
#, c-format
msgid "keyserver search failed: %s\n"
msgstr "sökning på nyckelservern misslyckades: %s\n"
@@ -3059,33 +3073,33 @@ msgstr "[spärr]"
msgid "[self-signature]"
msgstr "[självsignatur]"
-msgid "1 bad signature\n"
-msgstr "1 felaktig signatur\n"
-
-#, c-format
-msgid "%d bad signatures\n"
-msgstr "%d felaktiga signaturer\n"
-
-msgid "1 signature not checked due to a missing key\n"
-msgstr "1 signatur validerades inte eftersom nyckeln saknades\n"
-
-#, c-format
-msgid "%d signatures not checked due to missing keys\n"
-msgstr "%d signaturer validerades inte eftersom nycklar saknades\n"
-
-msgid "1 signature not checked due to an error\n"
-msgstr "1 signatur validerades inte eftersom ett fel uppstod\n"
+#, fuzzy, c-format
+#| msgid "%d bad signatures\n"
+msgid "%d bad signature\n"
+msgid_plural "%d bad signatures\n"
+msgstr[0] "%d felaktiga signaturer\n"
+msgstr[1] "%d felaktiga signaturer\n"
-#, c-format
-msgid "%d signatures not checked due to errors\n"
-msgstr "%d signaturer validerades inte eftersom fel uppstod\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to a missing key\n"
+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 signatur validerades inte eftersom nyckeln saknades\n"
+msgstr[1] "1 signatur validerades inte eftersom nyckeln saknades\n"
-msgid "1 user ID without valid self-signature detected\n"
-msgstr "1 användaridentitet utan giltig självsignatur hittades\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to an error\n"
+msgid "%d signature not checked due to an error\n"
+msgid_plural "%d signatures not checked due to errors\n"
+msgstr[0] "1 signatur validerades inte eftersom ett fel uppstod\n"
+msgstr[1] "1 signatur validerades inte eftersom ett fel uppstod\n"
-#, c-format
-msgid "%d user IDs without valid self-signatures detected\n"
-msgstr "%d användaridentiteter utan giltiga självsignaturer hittades\n"
+#, fuzzy, c-format
+#| msgid "%d user IDs without valid self-signatures detected\n"
+msgid "%d user ID without valid self-signature detected\n"
+msgid_plural "%d user IDs without valid self-signatures detected\n"
+msgstr[0] "%d användaridentiteter utan giltiga självsignaturer hittades\n"
+msgstr[1] "%d användaridentiteter utan giltiga självsignaturer hittades\n"
msgid ""
"Please decide how far you trust this user to correctly verify other users' "
@@ -3694,13 +3708,12 @@ msgid "Really delete this self-signature? (y/N)"
msgstr "Verkligen ta bort denna självsignatur? (j/N)"
# skulle lika gärna kunna heta 1 signatur va?
-#, c-format
+#, fuzzy, c-format
+#| msgid "Deleted %d signature.\n"
msgid "Deleted %d signature.\n"
-msgstr "Raderade %d signatur.\n"
-
-#, c-format
-msgid "Deleted %d signatures.\n"
-msgstr "Raderade %d signaturer.\n"
+msgid_plural "Deleted %d signatures.\n"
+msgstr[0] "Raderade %d signatur.\n"
+msgstr[1] "Raderade %d signatur.\n"
msgid "Nothing deleted.\n"
msgstr "Ingenting raderat.\n"
@@ -3712,13 +3725,12 @@ msgstr "ogiltigt"
msgid "User ID \"%s\" compacted: %s\n"
msgstr "Användaridentiteten \"%s\" komprimerad: %s\n"
-#, c-format
+#, fuzzy, c-format
+#| msgid "User ID \"%s\": %d signature removed\n"
msgid "User ID \"%s\": %d signature removed\n"
-msgstr "Användaridentitet \"%s\": %d signaturer borttagna\n"
-
-#, c-format
-msgid "User ID \"%s\": %d signatures removed\n"
-msgstr "Användaridentitet \"%s\": %d signaturer borttagna\n"
+msgid_plural "User ID \"%s\": %d signatures removed\n"
+msgstr[0] "Användaridentitet \"%s\": %d signaturer borttagna\n"
+msgstr[1] "Användaridentitet \"%s\": %d signaturer borttagna\n"
#, c-format
msgid "User ID \"%s\": already minimized\n"
@@ -4263,39 +4275,6 @@ msgstr "Ändra (N)amn, (K)ommentar, (E)post eller (O)k/(A)vsluta? "
msgid "Please correct the error first\n"
msgstr "Rätta först felet\n"
-# fel kapitalisering i originalet?
-msgid ""
-"You need a Passphrase to protect your secret key.\n"
-"\n"
-msgstr ""
-"Du behöver en lösenfras för att skydda din hemliga nyckel\n"
-"\n"
-
-msgid ""
-"Please enter a passphrase to protect the off-card backup of the new "
-"encryption key."
-msgstr ""
-"Ange en lösenfras för att skydda säkerhetskopian av den nya "
-"krypteringsnyckeln."
-
-msgid "passphrase not correctly repeated; try again"
-msgstr "lösenfrasen repeterades inte korrekt; försök igen."
-
-#, c-format
-msgid "%s.\n"
-msgstr "%s.\n"
-
-msgid ""
-"You don't want a passphrase - this is probably a *bad* idea!\n"
-"I will do it anyway. You can change your passphrase at any time,\n"
-"using this program with the option \"--edit-key\".\n"
-"\n"
-msgstr ""
-"Du vill inte ha någon lösenfras - det är möjligen en *dålig* idé!\n"
-"Jag kommer att göra det ändå. Du kan ändra din lösenfras när som helst\n"
-"om du använder detta program med flaggan \"--edit-key\".\n"
-"\n"
-
msgid ""
"We need to generate a lot of random bytes. It is a good idea to perform\n"
"some other action (type on the keyboard, move the mouse, utilize the\n"
@@ -4344,6 +4323,16 @@ msgid "Key generation canceled.\n"
msgstr "Skapandet av nycklar avbröts.\n"
#, fuzzy, c-format
+#| msgid "can't create backup file `%s': %s\n"
+msgid "can't create backup file '%s': %s\n"
+msgstr "kan inte skapa säkerhetskopian \"%s\": %s\n"
+
+#, fuzzy, c-format
+#| msgid "NOTE: backup of card key saved to `%s'\n"
+msgid "Note: backup of card key saved to '%s'\n"
+msgstr "OBSERVERA: säkerhetskopia av kortnyckeln sparades i \"%s\"\n"
+
+#, fuzzy, c-format
#| msgid "writing public key to `%s'\n"
msgid "writing public key to '%s'\n"
msgstr "skriver den publika nyckeln till \"%s\"\n"
@@ -4398,20 +4387,6 @@ msgstr "Hemliga delar av den primära nyckeln är lagrade på kortet.\n"
msgid "Really create? (y/N) "
msgstr "Verkligen skapa? (j/N) "
-#, c-format
-msgid "storing key onto card failed: %s\n"
-msgstr "misslyckades med att lagra nyckeln på kortet: %s\n"
-
-#, fuzzy, c-format
-#| msgid "can't create backup file `%s': %s\n"
-msgid "can't create backup file '%s': %s\n"
-msgstr "kan inte skapa säkerhetskopian \"%s\": %s\n"
-
-#, fuzzy, c-format
-#| msgid "NOTE: backup of card key saved to `%s'\n"
-msgid "Note: backup of card key saved to '%s'\n"
-msgstr "OBSERVERA: säkerhetskopia av kortnyckeln sparades i \"%s\"\n"
-
msgid "never "
msgstr "aldrig"
@@ -4430,19 +4405,18 @@ msgstr "Kritisk signaturnotation: "
msgid "Signature notation: "
msgstr "Signaturnotation: "
-#, fuzzy
-#| msgid "1 bad signature\n"
-msgid "1 good signature\n"
-msgstr "1 felaktig signatur\n"
-
#, fuzzy, c-format
#| msgid "%d bad signatures\n"
-msgid "%d good signatures\n"
-msgstr "%d felaktiga signaturer\n"
+msgid "%d good signature\n"
+msgid_plural "%d good signatures\n"
+msgstr[0] "%d felaktiga signaturer\n"
+msgstr[1] "%d felaktiga signaturer\n"
#, c-format
-msgid "Warning: %lu key(s) skipped due to their large size\n"
-msgstr ""
+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] ""
msgid "Keyring"
msgstr "Nyckelring"
@@ -4472,22 +4446,29 @@ msgid " Card serial no. ="
msgstr " Kortets serienr ="
#, fuzzy, c-format
-#| msgid "renaming `%s' to `%s' failed: %s\n"
-msgid "renaming '%s' to '%s' failed: %s\n"
-msgstr "namnbyte från \"%s\" till \"%s\" misslyckades: %s\n"
-
-#, fuzzy, c-format
#| msgid "caching keyring `%s'\n"
msgid "caching keyring '%s'\n"
msgstr "mellanlagrar nyckelringen \"%s\"\n"
-#, c-format
-msgid "%lu keys cached so far (%lu signatures)\n"
-msgstr "%lu nycklar mellanlagrade än så länge (%lu signaturer)\n"
+#, fuzzy, c-format
+#| msgid "%lu keys cached so far (%lu signatures)\n"
+msgid "%lu keys cached so far (%lu signature)\n"
+msgid_plural "%lu keys cached so far (%lu signatures)\n"
+msgstr[0] "%lu nycklar mellanlagrade än så länge (%lu signaturer)\n"
+msgstr[1] "%lu nycklar mellanlagrade än så länge (%lu signaturer)\n"
#, c-format
-msgid "%lu keys cached (%lu signatures)\n"
-msgstr "%lu nycklar mellanlagrade (%lu signaturer)\n"
+msgid "%lu key cached"
+msgid_plural "%lu keys cached"
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+#| msgid "1 bad signature\n"
+msgid " (%lu signature)\n"
+msgid_plural " (%lu signatures)\n"
+msgstr[0] "1 felaktig signatur\n"
+msgstr[1] "1 felaktig signatur\n"
#, c-format
msgid "%s: keyring created\n"
@@ -4528,19 +4509,18 @@ msgstr "ogiltigt nyckelserverprotokoll (vi %d!=hanterare %d)\n"
msgid "\"%s\" not a key ID: skipping\n"
msgstr "\"%s\" inte ett nyckel-id: hoppar över\n"
-#, c-format
-msgid "refreshing 1 key from %s\n"
-msgstr "uppdaterar 1 nyckel från %s\n"
+#, fuzzy, c-format
+#| msgid "refreshing %d keys from %s\n"
+msgid "refreshing %d key from %s\n"
+msgid_plural "refreshing %d keys from %s\n"
+msgstr[0] "uppdaterar %d nycklar från %s\n"
+msgstr[1] "uppdaterar %d nycklar från %s\n"
#, c-format
msgid "WARNING: unable to refresh key %s via %s: %s\n"
msgstr "VARNING: kunde inte uppdatera nyckeln %s via %s: %s\n"
#, c-format
-msgid "refreshing %d keys from %s\n"
-msgstr "uppdaterar %d nycklar från %s\n"
-
-#, c-format
msgid "key \"%s\" not found on keyserver\n"
msgstr "nyckeln \"%s\" hittades inte på nyckelservern\n"
@@ -4558,9 +4538,10 @@ msgstr "begär nyckeln %s från %s-servern %s\n"
msgid "requesting key %s from %s\n"
msgstr "begär nyckeln %s från %s\n"
-#, c-format
-msgid "sending key %s to %s server %s\n"
-msgstr "skickar nyckeln %s till %s-servern %s\n"
+#, fuzzy
+#| msgid "no keyserver action!\n"
+msgid "no keyserver known\n"
+msgstr "ingen nyckelserveråtgärd!\n"
#, c-format
msgid "sending key %s to %s\n"
@@ -4790,6 +4771,19 @@ msgstr "VARNING: sammandragsalgoritmen %s är föråldrad\n"
msgid "Note: signatures using the %s algorithm are rejected\n"
msgstr "%s signatur, sammandragsalgoritm %s\n"
+#, fuzzy, c-format
+#| msgid "read error in `%s': %s\n"
+msgid "(reported error: %s)\n"
+msgstr "läsfel i \"%s\": %s\n"
+
+#, fuzzy, c-format
+#| msgid "read error in `%s': %s\n"
+msgid "(reported error: %s <%s>)\n"
+msgstr "läsfel i \"%s\": %s\n"
+
+msgid "(further info: "
+msgstr ""
+
#, c-format
msgid "%s:%d: deprecated option \"%s\"\n"
msgstr "%s:%d: flaggan är föråldrad \"%s\"\n"
@@ -5209,6 +5203,21 @@ msgstr "%s: hoppades över: den publika nyckeln är inaktiverad\n"
msgid "%s: skipped: public key already present\n"
msgstr "%s: hoppades över: publik nyckel finns redan\n"
+#, fuzzy, c-format
+#| msgid "can't connect to `%s': %s\n"
+msgid "can't encrypt to '%s'\n"
+msgstr "kan inte ansluta till \"%s\": %s\n"
+
+#, fuzzy, c-format
+#| msgid "line %d: invalid algorithm\n"
+msgid "option '%s' given, but no valid default keys given\n"
+msgstr "rad %d: ogiltig algoritm\n"
+
+#, fuzzy, c-format
+#| msgid "line %d: invalid algorithm\n"
+msgid "option '%s' given, but option '%s' not given\n"
+msgstr "rad %d: ogiltig algoritm\n"
+
msgid "You did not specify a user ID. (you may use \"-r\")\n"
msgstr "Du angav ingen användaridentitet. (du kan använda \"-r\")\n"
@@ -5256,11 +5265,6 @@ msgstr "Observera: nyckeln %s har ingen inställning för %s\n"
msgid "data not saved; use option \"--output\" to save it\n"
msgstr "data sparades inte, använd flaggan \"--output\" för att spara det\n"
-#, fuzzy, c-format
-#| msgid "error creating `%s': %s\n"
-msgid "error creating '%s': %s\n"
-msgstr "Fel när \"%s\" skapades: %s\n"
-
msgid "Detached signature.\n"
msgstr "Signatur i en separat fil.\n"
@@ -5362,19 +5366,31 @@ msgid "This is a revocation certificate for the OpenPGP key:"
msgstr "Skapa ett spärrcertifikat för denna nyckel? (j/N) "
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 ""
+
+msgid ""
"Use it to revoke this key in case of a compromise or loss of\n"
"the secret key. However, if the secret key is still accessible,\n"
"it is better to generate a new revocation certificate and give\n"
-"a reason for the revocation."
+"a reason for the revocation. For details see the description of\n"
+"of the gpg command \"--gen-revoke\" in the GnuPG manual."
msgstr ""
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 making use of this revocation certificate."
+"before importing and publishing this revocation certificate."
msgstr ""
#, fuzzy, c-format
+#| msgid "Revocation certificate created.\n"
+msgid "revocation certificate stored as '%s.rev'\n"
+msgstr "Spärrcertifikat skapat.\n"
+
+#, fuzzy, c-format
#| msgid "secret key \"%s\" not found: %s\n"
msgid "secret key \"%s\" not found\n"
msgstr "hemliga nyckeln \"%s\" hittades inte: %s\n"
@@ -5386,6 +5402,11 @@ msgstr "hemliga nyckeln \"%s\" hittades inte: %s\n"
msgid "'%s' matches multiple secret keys:\n"
msgstr ""
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "error searching the keyring: %s\n"
+msgstr "fel när nyckelringen \"%s\" skapades: %s\n"
+
msgid "Create a revocation certificate for this key? (y/N) "
msgstr "Skapa ett spärrcertifikat för denna nyckel? (j/N) "
@@ -5466,28 +5487,49 @@ msgid "WARNING: signing subkey %s has an invalid cross-certification\n"
msgstr "VARNING signeringsundernyckel %s har en ogiltig korscertifiering\n"
# behövs verkligen c-format här?
-#, c-format
+#, fuzzy, c-format
+#| msgid "public key %s is %lu second newer than the signature\n"
msgid "public key %s is %lu second newer than the signature\n"
-msgstr "den publika nyckeln %s är %lu sekund nyare än signaturen\n"
+msgid_plural "public key %s is %lu seconds newer than the signature\n"
+msgstr[0] "den publika nyckeln %s är %lu sekund nyare än signaturen\n"
+msgstr[1] "den publika nyckeln %s är %lu sekund nyare än signaturen\n"
-#, c-format
-msgid "public key %s is %lu seconds newer than the signature\n"
-msgstr "den publika nyckeln %s är %lu sekunder nyare än signaturen\n"
+# behövs verkligen c-format här?
+#, fuzzy, c-format
+#| msgid "public key %s is %lu second newer than the signature\n"
+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] "den publika nyckeln %s är %lu sekund nyare än signaturen\n"
+msgstr[1] "den publika nyckeln %s är %lu sekund nyare än signaturen\n"
# c-format behövs inte i singularis
-#, c-format
+#, fuzzy, c-format
+#| msgid ""
+#| "key %s was created %lu second in the future (time warp or clock problem)\n"
msgid ""
"key %s was created %lu second in the future (time warp or clock problem)\n"
-msgstr ""
+msgid_plural ""
+"key %s was created %lu seconds in the future (time warp or clock problem)\n"
+msgstr[0] ""
+"nyckeln %s skapades %lu sekund in i framtiden (tidsresande eller felinställd "
+"klocka)\n"
+msgstr[1] ""
"nyckeln %s skapades %lu sekund in i framtiden (tidsresande eller felinställd "
"klocka)\n"
-#, c-format
-msgid ""
-"key %s was created %lu seconds in the future (time warp or clock problem)\n"
-msgstr ""
-"nyckeln %s skapades %lu sekunder in i framtiden (tidsresande eller "
-"felinställd klocka)\n"
+# c-format behövs inte i singularis
+#, fuzzy, c-format
+#| msgid ""
+#| "key %s was created %lu second in the future (time warp or clock problem)\n"
+msgid "key %s was created %lu day in the future (time warp or clock problem)\n"
+msgid_plural ""
+"key %s was created %lu days in the future (time warp or clock problem)\n"
+msgstr[0] ""
+"nyckeln %s skapades %lu sekund in i framtiden (tidsresande eller felinställd "
+"klocka)\n"
+msgstr[1] ""
+"nyckeln %s skapades %lu sekund in i framtiden (tidsresande eller felinställd "
+"klocka)\n"
#, fuzzy, c-format
#| msgid "NOTE: signature key %s expired %s\n"
@@ -5727,6 +5769,246 @@ msgid "input line longer than %d characters\n"
msgstr "indataraden är längre än %d tecken\n"
#, fuzzy, c-format
+#| msgid "error sending standard options: %s\n"
+msgid "error beginning transaction on TOFU database: %s\n"
+msgstr "fel vid sändning av standardflaggor: %s\n"
+
+#, c-format
+msgid "error committing transaction on TOFU database: %s\n"
+msgstr ""
+
+#, c-format
+msgid "error rolling back transaction on TOFU database: %s\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "unsupported algorithm: %s"
+msgid "unsupported TOFU database version: %s\n"
+msgstr "algoritmen stöds inte: %s"
+
+#, fuzzy, c-format
+#| msgid "error sending %s command: %s\n"
+msgid "error reading TOFU database: %s\n"
+msgstr "fel vid sändning av %s-kommando: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error writing secret keyring `%s': %s\n"
+msgid "error determining TOFU database's version: %s\n"
+msgstr "fel vid skrivning av hemliga nyckelringen \"%s\": %s\n"
+
+#, fuzzy, c-format
+#| msgid "%s: error writing dir record: %s\n"
+msgid "error initializing TOFU database: %s\n"
+msgstr "%s: fel vid läsning av katalogpost: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error opening `%s': %s\n"
+msgid "error opening TOFU database '%s': %s\n"
+msgstr "fel vid öppnandet av \"%s\": %s\n"
+
+msgid "Warning: Home directory contains both tofu.db and tofu.d.\n"
+msgstr ""
+
+msgid "Using split format for TOFU database\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "error sending %s command: %s\n"
+msgid "error updating TOFU database: %s\n"
+msgstr "fel vid sändning av %s-kommando: %s\n"
+
+#, c-format
+msgid "public key %s not found: %s\n"
+msgstr "publika nyckeln %s hittades inte: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error storing flags: %s\n"
+msgid "error setting TOFU binding's trust level to %s\n"
+msgstr "fel vid lagring av flaggor: %s\n"
+
+#, c-format
+msgid "The binding %s is NOT known."
+msgstr ""
+
+#, c-format
+msgid ""
+"The key %s raised a conflict with this binding (%s). Since this binding's "
+"policy was 'auto', it was changed to 'ask'."
+msgstr ""
+
+#, c-format
+msgid ""
+"Please indicate whether you believe the binding %s%sis legitimate (the key "
+"belongs to the stated owner) or a forgery (bad)."
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "error getting new PIN: %s\n"
+msgid "error gathering other user IDs: %s\n"
+msgstr "fel vid hämtning av ny PIN-kod: %s\n"
+
+msgid "Known user IDs associated with this key:\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "validity: %s"
+msgid "policy: %s"
+msgstr "giltighet: %s"
+
+#, fuzzy, c-format
+#| msgid "error getting stored flags: %s\n"
+msgid "error gathering signature stats: %s\n"
+msgstr "fel vid hämtning av lagrade flaggor: %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] ""
+msgstr[1] ""
+
+#, c-format
+msgid "Statistics for keys with the email address \"%s\":\n"
+msgstr ""
+
+#, fuzzy
+#| msgid "list keys"
+msgid "this key"
+msgstr "lista nycklar"
+
+#, c-format
+msgid "%ld message signed in the future."
+msgid_plural "%ld messages signed in the future."
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+#| msgid "print message digests"
+msgid "%ld message signed"
+msgid_plural "%ld messages signed"
+msgstr[0] "skriv ut kontrollsummor"
+msgstr[1] "skriv ut kontrollsummor"
+
+#, c-format
+msgid " over the past %ld day."
+msgid_plural " over the past %ld days."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid " over the past %ld week."
+msgid_plural " over the past %ld weeks."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid " over the past %ld month."
+msgid_plural " over the past %ld months."
+msgstr[0] ""
+msgstr[1] ""
+
+#. 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 ""
+
+#. 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 ""
+
+msgid "(G)ood, (A)ccept once, (U)nknown, (R)eject once, (B)ad? "
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "error creating a pipe: %s\n"
+msgid "error changing TOFU policy: %s\n"
+msgstr "fel när ett rör skapades: %s\n"
+
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "Have never verified a message signed by key %s!\n"
+msgstr ""
+
+#, c-format
+msgid "Failed to collect signature statistics for \"%s\" (key %s)\n"
+msgstr ""
+
+#, c-format
+msgid "Verified 0 messages signed by \"%s\" (key: %s, policy: %s)."
+msgstr ""
+
+#. TRANSLATORS: The final %s is replaced by a string like
+#. "7 months, 1 day, 5 minutes, 0 seconds".
+#, c-format
+msgid ""
+"Verified %ld message signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgid_plural ""
+"Verified %ld messages signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "The most recent message was verified %s ago."
+msgstr ""
+
+msgid "Warning: we've have yet to see a message signed by this key!\n"
+msgstr ""
+
+msgid "Warning: we've only seen a single message signed by this key!\n"
+msgstr ""
+
+#. TRANSLATORS: translate the below text. We don't
+#. directly internationalize that text so that we can
+#. tweak it without breaking translations.
+#, c-format
+msgid "TOFU: few signatures %d message %s"
+msgid_plural "TOFU: few signatures %d messages %s"
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+#| msgid "error sending %s command: %s\n"
+msgid "error opening TOFU database: %s\n"
+msgstr "fel vid sändning av %s-kommando: %s\n"
+
+#, fuzzy, c-format
#| msgid "`%s' is not a valid long keyID\n"
msgid "'%s' is not a valid long keyID\n"
msgstr "\"%s\" är inget giltigt långt nyckel-id\n"
@@ -5793,10 +6075,6 @@ msgid "no need for a trustdb update with '%s' trust model\n"
msgstr ""
"det behövs ingen uppdatering av tillitsdatabasen med tillitsmodellen \"%s\"\n"
-#, c-format
-msgid "public key %s not found: %s\n"
-msgstr "publika nyckeln %s hittades inte: %s\n"
-
msgid "please do a --check-trustdb\n"
msgstr "gör en kontroll av tillitsdatabasen --check-trustdb\n"
@@ -5804,10 +6082,20 @@ msgstr "gör en kontroll av tillitsdatabasen --check-trustdb\n"
msgid "checking the trustdb\n"
msgstr "kontrollerar tillitsdatabasen\n"
+#, fuzzy, c-format
+#| msgid "%lu keys processed so far\n"
+msgid "%d key processed"
+msgid_plural "%d keys processed"
+msgstr[0] "%lu nycklar behandlade än så länge\n"
+msgstr[1] "%lu nycklar behandlade än så länge\n"
+
# Vad är detta!?
-#, c-format
-msgid "%d keys processed (%d validity counts cleared)\n"
-msgstr "%d nycklar behandlade (%d validity counts rensade)\n"
+#, fuzzy, c-format
+#| msgid "%d keys processed (%d validity counts cleared)\n"
+msgid " (%d validity count cleared)\n"
+msgid_plural " (%d validity counts cleared)\n"
+msgstr[0] "%d nycklar behandlade (%d validity counts rensade)\n"
+msgstr[1] "%d nycklar behandlade (%d validity counts rensade)\n"
msgid "no ultimately trusted keys found\n"
msgstr "hittade inga nycklar med förbehållslöst förtroende\n"
@@ -5817,10 +6105,6 @@ msgid "public key of ultimately trusted key %s not found\n"
msgstr "publik nyckel för förbehållslöst betrodda nyckeln %s hittades inte\n"
#, c-format
-msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
-msgstr "%d marginal(er) behövs, %d fullständig(a) behövs, tillitsmodell %s\n"
-
-#, c-format
msgid ""
"depth: %d valid: %3d signed: %3d trust: %d-, %dq, %dn, %dm, %df, %du\n"
msgstr ""
@@ -6036,9 +6320,15 @@ msgstr "fel vid hämtning av CHV-status från kort\n"
msgid "card is permanently locked!\n"
msgstr "kortet är låst permanent!\n"
-#, c-format
-msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
-msgstr "%d försök för Admin PIN-koden återstår innan kortet låses permanent\n"
+#, fuzzy, c-format
+#| msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
+msgid "%d Admin PIN attempt remaining before card is permanently locked\n"
+msgid_plural ""
+"%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr[0] ""
+"%d försök för Admin PIN-koden återstår innan kortet låses permanent\n"
+msgstr[1] ""
+"%d försök för Admin PIN-koden återstår innan kortet låses permanent\n"
#. TRANSLATORS: Do not translate the "|A|" prefix but keep it at
#. the start of the string. Use %%0A to force a linefeed.
@@ -6121,9 +6411,12 @@ msgstr "var god vänta under tiden nyckeln genereras ...\n"
msgid "generating key failed\n"
msgstr "nyckelgenereringen misslyckades\n"
-#, c-format
-msgid "key generation completed (%d seconds)\n"
-msgstr "nyckelgenereringen är färdig (%d sekunder)\n"
+#, fuzzy, c-format
+#| msgid "key generation completed (%d seconds)\n"
+msgid "key generation completed (%d second)\n"
+msgid_plural "key generation completed (%d seconds)\n"
+msgstr[0] "nyckelgenereringen är färdig (%d sekunder)\n"
+msgstr[1] "nyckelgenereringen är färdig (%d sekunder)\n"
msgid "invalid structure of OpenPGP card (DO 0x93)\n"
msgstr "ogiltig struktur för OpenPGP-kort (DO 0x93)\n"
@@ -8531,6 +8824,11 @@ msgstr "|N|låt mellanlagrad lösenfras gå ut efter N dagar"
msgid "do not allow the reuse of old passphrases"
msgstr "tillåt inte återanvändning av gamla lösenfraser"
+#, fuzzy
+#| msgid "|N|set maximum PIN cache lifetime to N seconds"
+msgid "|N|set the Pinentry timeout to N seconds"
+msgstr "|N|ställ in maximal livstid för PIN-cache till N sekunder"
+
msgid "|NAME|use NAME as default secret key"
msgstr "|NAMN|använd NAMN som förvald hemlig nyckel"
@@ -8841,6 +9139,94 @@ msgstr ""
"Syntax: gpg-check-pattern [flaggor] mönsterfil\n"
"Kontrollera en lösenfras angiven på standard in mot mönsterfilen\n"
+#, fuzzy
+#~| msgid "option \"%.50s\" is ambiguous\n"
+#~ msgid "key specification '%s' is ambiguous\n"
+#~ msgstr "flagga \"%.50s\" är tvetydig\n"
+
+#~ msgid "%d signatures not checked due to missing keys\n"
+#~ msgstr "%d signaturer validerades inte eftersom nycklar saknades\n"
+
+#~ msgid "%d signatures not checked due to errors\n"
+#~ msgstr "%d signaturer validerades inte eftersom fel uppstod\n"
+
+#~ msgid "1 user ID without valid self-signature detected\n"
+#~ msgstr "1 användaridentitet utan giltig självsignatur hittades\n"
+
+#~ msgid "Deleted %d signatures.\n"
+#~ msgstr "Raderade %d signaturer.\n"
+
+#~ msgid "User ID \"%s\": %d signatures removed\n"
+#~ msgstr "Användaridentitet \"%s\": %d signaturer borttagna\n"
+
+# fel kapitalisering i originalet?
+#~ msgid ""
+#~ "You need a Passphrase to protect your secret key.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Du behöver en lösenfras för att skydda din hemliga nyckel\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Please enter a passphrase to protect the off-card backup of the new "
+#~ "encryption key."
+#~ msgstr ""
+#~ "Ange en lösenfras för att skydda säkerhetskopian av den nya "
+#~ "krypteringsnyckeln."
+
+#~ msgid "passphrase not correctly repeated; try again"
+#~ msgstr "lösenfrasen repeterades inte korrekt; försök igen."
+
+#~ msgid "%s.\n"
+#~ msgstr "%s.\n"
+
+#~ msgid ""
+#~ "You don't want a passphrase - this is probably a *bad* idea!\n"
+#~ "I will do it anyway. You can change your passphrase at any time,\n"
+#~ "using this program with the option \"--edit-key\".\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Du vill inte ha någon lösenfras - det är möjligen en *dålig* idé!\n"
+#~ "Jag kommer att göra det ändå. Du kan ändra din lösenfras när som helst\n"
+#~ "om du använder detta program med flaggan \"--edit-key\".\n"
+#~ "\n"
+
+#~ msgid "storing key onto card failed: %s\n"
+#~ msgstr "misslyckades med att lagra nyckeln på kortet: %s\n"
+
+#, fuzzy
+#~| msgid "1 bad signature\n"
+#~ msgid "1 good signature\n"
+#~ msgstr "1 felaktig signatur\n"
+
+#, fuzzy
+#~| msgid "renaming `%s' to `%s' failed: %s\n"
+#~ msgid "renaming '%s' to '%s' failed: %s\n"
+#~ msgstr "namnbyte från \"%s\" till \"%s\" misslyckades: %s\n"
+
+#~ msgid "%lu keys cached (%lu signatures)\n"
+#~ msgstr "%lu nycklar mellanlagrade (%lu signaturer)\n"
+
+#~ msgid "refreshing 1 key from %s\n"
+#~ msgstr "uppdaterar 1 nyckel från %s\n"
+
+#~ msgid "sending key %s to %s server %s\n"
+#~ msgstr "skickar nyckeln %s till %s-servern %s\n"
+
+#~ msgid "public key %s is %lu seconds newer than the signature\n"
+#~ msgstr "den publika nyckeln %s är %lu sekunder nyare än signaturen\n"
+
+#~ msgid ""
+#~ "key %s was created %lu seconds in the future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "nyckeln %s skapades %lu sekunder in i framtiden (tidsresande eller "
+#~ "felinställd klocka)\n"
+
+#~ msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
+#~ msgstr ""
+#~ "%d marginal(er) behövs, %d fullständig(a) behövs, tillitsmodell %s\n"
+
#~ msgid "cleared passphrase cached with ID: %s\n"
#~ msgstr "tömde mellanlagrad lösenfras med ID: %s\n"
@@ -9105,9 +9491,6 @@ msgstr ""
#~ msgid "searching for \"%s\" from %s\n"
#~ msgstr "söker efter \"%s\" från %s\n"
-#~ msgid "no keyserver action!\n"
-#~ msgstr "ingen nyckelserveråtgärd!\n"
-
#~ msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n"
#~ msgstr ""
#~ "VARNING: nyckelserverhanteraren från en annan version av GnuPG (%s)\n"
diff --git a/po/tr.po b/po/tr.po
index 7246154..d41d2b2 100644
--- a/po/tr.po
+++ b/po/tr.po
@@ -1269,6 +1269,20 @@ msgstr ""
msgid "Enter passphrase: "
msgstr "Anahtar parolasını giriniz\n"
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "error getting version from '%s': %s\n"
+msgstr "`%s' anahtarlığı oluşturulurken hata: %s\n"
+
+#, c-format
+msgid "server '%s' is older than us (%s < %s)"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "WARNING: %s overrides %s\n"
+msgid "WARNING: %s\n"
+msgstr "UYARI: %s %s'i aşıyor\n"
+
#, c-format
msgid "OpenPGP card not available: %s\n"
msgstr "OpenPGP anahtarı kullanılabilir değil: %s\n"
@@ -1751,6 +1765,11 @@ msgstr "ihraç sırasında anahtardan kullanışsız parçalar kaldırılır"
msgid "remove as much as possible from key during export"
msgstr "ihraç sırasında anahtardan mümkün olduğunca çok şey kaldırılır"
+#, fuzzy
+#| msgid "%s: skipped: %s\n"
+msgid " - skipped"
+msgstr "%s: atlandı: %s\n"
+
msgid "exporting secret keys not allowed\n"
msgstr "gizli anahtarların ihracına izin verilmez\n"
@@ -1762,18 +1781,37 @@ msgstr "anahtar %s: PGP 2.x tarzı bir anahtar - atlandı\n"
msgid "key %s: key material on-card - skipped\n"
msgstr "anahtar %s: anahtar malzemesi kartta - atlandı\n"
-#, fuzzy
-#| msgid "%s: skipped: %s\n"
-msgid " - skipped"
-msgstr "%s: atlandı: %s\n"
-
msgid "WARNING: nothing exported\n"
msgstr "UYARI: hiçbir şey dışarı aktarılmadı\n"
+#, fuzzy, c-format
+#| msgid "error creating `%s': %s\n"
+msgid "error creating '%s': %s\n"
+msgstr "`%s' oluÅŸturulurken hata: %s\n"
+
msgid "[User ID not found]"
msgstr "[Kullanıcı kimliği yok]"
#, fuzzy, c-format
+#| msgid "missing argument for option \"%.50s\"\n"
+msgid "(check argument of option '%s')\n"
+msgstr "\"%.50s\" seçeneği için değiştirge eksik\n"
+
+#, c-format
+msgid "Warning: '%s' should be a long key ID or a fingerprint\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "error closing %s: %s\n"
+msgid "error looking up: %s\n"
+msgstr "%s kapanırken hata: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "Warning: %s appears in the keyring %d times\n"
+msgstr "`%s' anahtarlığı oluşturulurken hata: %s\n"
+
+#, fuzzy, c-format
#| msgid "automatically retrieved `%s' via %s\n"
msgid "automatically retrieved '%s' via %s\n"
msgstr "`%s' %s üzerinden özdevinimli olarak alındı\n"
@@ -1791,16 +1829,20 @@ msgid "secret key \"%s\" not found: %s\n"
msgstr "gizli anahtar \"%s\" yok: %s\n"
#, fuzzy, c-format
-#| msgid "missing argument for option \"%.50s\"\n"
-msgid "(check argument of option '%s')\n"
-msgstr "\"%.50s\" seçeneği için değiştirge eksik\n"
+#| msgid "|NAME|use NAME as default secret key"
+msgid "Warning: not using '%s' as default key: %s\n"
+msgstr "|İSİM|öntanımlı gizli anahtar olarak İSİM kullanılır"
#, fuzzy, c-format
#| msgid "|NAME|use NAME as default secret key"
-msgid "using \"%s\" as default secret key\n"
+msgid "using \"%s\" as default secret key for signing\n"
msgstr "|İSİM|öntanımlı gizli anahtar olarak İSİM kullanılır"
#, c-format
+msgid "all values passed to '%s' ignored\n"
+msgstr ""
+
+#, c-format
msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
msgstr ""
"Geçersiz %s anahtarı --allow-non-selfsigned-uid kullanılarak geçerli oldu\n"
@@ -2173,29 +2215,6 @@ msgid "Note: old default options file '%s' ignored\n"
msgstr "BİLGİ: eski öntanımlı seçenekler dosyası `%s' yoksayıldı\n"
#, c-format
-msgid ""
-"Warning: value '%s' for option '%s' should be a long key ID or a "
-"fingerprint\n"
-msgstr ""
-
-#, fuzzy, c-format
-#| msgid "option \"%.50s\" is ambiguous\n"
-msgid "key specification '%s' is ambiguous\n"
-msgstr "\"%.50s\" seçeneği belirsiz\n"
-
-#. TRANSLATORS: The %s prints a key specification which
-#. for example has been given at the command line. Two
-#. lines with fingerprints are printed after this message.
-#, c-format
-msgid "'%s' matches at least:\n"
-msgstr ""
-
-#, fuzzy, c-format
-#| msgid "error creating keyring `%s': %s\n"
-msgid "error searching the keyring: %s\n"
-msgstr "`%s' anahtarlığı oluşturulurken hata: %s\n"
-
-#, c-format
msgid "libgcrypt is too old (need %s, have %s)\n"
msgstr "libgcrypt çok eski (%s lazım, sizinki %s)\n"
@@ -2401,16 +2420,6 @@ msgid "WARNING: recipients (-r) given without using public key encryption\n"
msgstr ""
"UYARI: alıcılar (-r) genel anahtar şifrelemesi kullanılmadan belirtilmiş\n"
-#, fuzzy, c-format
-#| msgid "line %d: invalid algorithm\n"
-msgid "option '%s' given, but no valid default keys given\n"
-msgstr "`%d. satır: algoritma geçersiz\n"
-
-#, fuzzy, c-format
-#| msgid "line %d: invalid algorithm\n"
-msgid "option '%s' given, but option '%s' not given\n"
-msgstr "`%d. satır: algoritma geçersiz\n"
-
msgid "--store [filename]"
msgstr "--store [dosyaismi]"
@@ -2485,6 +2494,11 @@ msgstr "anahtar sunucusundan alım başarısızlığa uğradı: %s\n"
msgid "key export failed: %s\n"
msgstr "anahtar ihracı başarısızlığa uğradı: %s\n"
+#, fuzzy, c-format
+#| msgid "key export failed: %s\n"
+msgid "export as ssh key failed: %s\n"
+msgstr "anahtar ihracı başarısızlığa uğradı: %s\n"
+
#, c-format
msgid "keyserver search failed: %s\n"
msgstr "anahtar sunucusunda arama başarısız: %s\n"
@@ -2992,33 +3006,33 @@ msgstr "[yürürlükten kaldırma]"
msgid "[self-signature]"
msgstr "[öz-imza]"
-msgid "1 bad signature\n"
-msgstr "1 kötü imza\n"
-
-#, c-format
-msgid "%d bad signatures\n"
-msgstr "%d kötü imza\n"
-
-msgid "1 signature not checked due to a missing key\n"
-msgstr "1 imza kayıp bir anahtar yüzünden kontrol edilmedi\n"
-
-#, c-format
-msgid "%d signatures not checked due to missing keys\n"
-msgstr "%d imza kayıp bir anahtar yüzünden kontrol edilmedi\n"
-
-msgid "1 signature not checked due to an error\n"
-msgstr "1 imza bir hata yüzünden kontrol edilmedi\n"
+#, fuzzy, c-format
+#| msgid "%d bad signatures\n"
+msgid "%d bad signature\n"
+msgid_plural "%d bad signatures\n"
+msgstr[0] "%d kötü imza\n"
+msgstr[1] "%d kötü imza\n"
-#, c-format
-msgid "%d signatures not checked due to errors\n"
-msgstr "%d imza hatalardan dolayı kontrol edilmedi\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to a missing key\n"
+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 imza kayıp bir anahtar yüzünden kontrol edilmedi\n"
+msgstr[1] "1 imza kayıp bir anahtar yüzünden kontrol edilmedi\n"
-msgid "1 user ID without valid self-signature detected\n"
-msgstr "1 öz-imzası geçersiz kullanıcı kimliği saptandı\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to an error\n"
+msgid "%d signature not checked due to an error\n"
+msgid_plural "%d signatures not checked due to errors\n"
+msgstr[0] "1 imza bir hata yüzünden kontrol edilmedi\n"
+msgstr[1] "1 imza bir hata yüzünden kontrol edilmedi\n"
-#, c-format
-msgid "%d user IDs without valid self-signatures detected\n"
-msgstr "%d öz-imzası geçersiz kullanıcı kimliği saptandı\n"
+#, fuzzy, c-format
+#| msgid "%d user IDs without valid self-signatures detected\n"
+msgid "%d user ID without valid self-signature detected\n"
+msgid_plural "%d user IDs without valid self-signatures detected\n"
+msgstr[0] "%d öz-imzası geçersiz kullanıcı kimliği saptandı\n"
+msgstr[1] "%d öz-imzası geçersiz kullanıcı kimliği saptandı\n"
msgid ""
"Please decide how far you trust this user to correctly verify other users' "
@@ -3641,13 +3655,12 @@ msgstr "Bu bilinmeyen imza silinsin mi? (e/H/k veya y/N/k)"
msgid "Really delete this self-signature? (y/N)"
msgstr "Bu öz-imza gerçekten silinecek mi? (e/H veya y/N)"
-#, c-format
+#, fuzzy, c-format
+#| msgid "Deleted %d signature.\n"
msgid "Deleted %d signature.\n"
-msgstr "%d imza silindi.\n"
-
-#, c-format
-msgid "Deleted %d signatures.\n"
-msgstr "%d imza silindi.\n"
+msgid_plural "Deleted %d signatures.\n"
+msgstr[0] "%d imza silindi.\n"
+msgstr[1] "%d imza silindi.\n"
msgid "Nothing deleted.\n"
msgstr "Hiçbir şey silinmedi.\n"
@@ -3659,13 +3672,12 @@ msgstr "geçersiz"
msgid "User ID \"%s\" compacted: %s\n"
msgstr "kullanıcı kimliği \"%s\" yoğun: %s\n"
-#, c-format
+#, fuzzy, c-format
+#| msgid "User ID \"%s\": %d signature removed\n"
msgid "User ID \"%s\": %d signature removed\n"
-msgstr "Kullanıcı kimliği \"%s\": %d imza temizlendi\n"
-
-#, c-format
-msgid "User ID \"%s\": %d signatures removed\n"
-msgstr "Kullanıcı kimliği \"%s\": %d imza temizlendi\n"
+msgid_plural "User ID \"%s\": %d signatures removed\n"
+msgstr[0] "Kullanıcı kimliği \"%s\": %d imza temizlendi\n"
+msgstr[1] "Kullanıcı kimliği \"%s\": %d imza temizlendi\n"
#, c-format
msgid "User ID \"%s\": already minimized\n"
@@ -4217,41 +4229,6 @@ msgid "Please correct the error first\n"
msgstr "Lütfen önce hatayı düzeltin\n"
msgid ""
-"You need a Passphrase to protect your secret key.\n"
-"\n"
-msgstr ""
-"Gizli anahtarınızı korumak için bir Anahtar Parolanız olmalı.\n"
-"\n"
-
-#, fuzzy
-msgid ""
-"Please enter a passphrase to protect the off-card backup of the new "
-"encryption key."
-msgstr ""
-"Lütfen GnuPG sistemine ithal edilen nesneyi koruyacak anahtar parolasını "
-"giriniz."
-
-msgid "passphrase not correctly repeated; try again"
-msgstr ""
-"ikinci kez yazdığınız anahtar parolası ilkiyle aynı değil; işlem "
-"tekrarlanacak"
-
-#, c-format
-msgid "%s.\n"
-msgstr "%s.\n"
-
-msgid ""
-"You don't want a passphrase - this is probably a *bad* idea!\n"
-"I will do it anyway. You can change your passphrase at any time,\n"
-"using this program with the option \"--edit-key\".\n"
-"\n"
-msgstr ""
-"Bir anahtar parolası istemediniz - bu *kötü* bir fikir!\n"
-"Nasıl isterseniz. Anahtar parolanızı bu programı \"--edit-key\"\n"
-"seçeneği ile kullanarak her zaman değiştirebilirsiniz.\n"
-"\n"
-
-msgid ""
"We need to generate a lot of random bytes. It is a good idea to perform\n"
"some other action (type on the keyboard, move the mouse, utilize the\n"
"disks) during the prime generation; this gives the random number\n"
@@ -4300,6 +4277,16 @@ msgid "Key generation canceled.\n"
msgstr "Anahtar üretimi durduruldu.\n"
#, fuzzy, c-format
+#| msgid "can't create backup file `%s': %s\n"
+msgid "can't create backup file '%s': %s\n"
+msgstr "'%s' yedek dosyası oluşturulamıyor: %s\n"
+
+#, fuzzy, c-format
+#| msgid "NOTE: backup of card key saved to `%s'\n"
+msgid "Note: backup of card key saved to '%s'\n"
+msgstr "BİLGİ: kart anahtarının yedeklemesi '%s' e kaydedildi\n"
+
+#, fuzzy, c-format
#| msgid "writing public key to `%s'\n"
msgid "writing public key to '%s'\n"
msgstr "genel anahtarı `%s'e yazıyor\n"
@@ -4351,20 +4338,6 @@ msgstr "Asıl anahtarın gizli parçaları kart üzerinde saklı.\n"
msgid "Really create? (y/N) "
msgstr "Gerçekten oluşturulsun mu? (e/H ya da y/N) "
-#, c-format
-msgid "storing key onto card failed: %s\n"
-msgstr "anahtarın kart üzerinde saklanması başarısız: %s\n"
-
-#, fuzzy, c-format
-#| msgid "can't create backup file `%s': %s\n"
-msgid "can't create backup file '%s': %s\n"
-msgstr "'%s' yedek dosyası oluşturulamıyor: %s\n"
-
-#, fuzzy, c-format
-#| msgid "NOTE: backup of card key saved to `%s'\n"
-msgid "Note: backup of card key saved to '%s'\n"
-msgstr "BİLGİ: kart anahtarının yedeklemesi '%s' e kaydedildi\n"
-
msgid "never "
msgstr "asla "
@@ -4383,19 +4356,18 @@ msgstr "Kritik imza simgelemi: "
msgid "Signature notation: "
msgstr "imza simgelemi: "
-#, fuzzy
-#| msgid "1 bad signature\n"
-msgid "1 good signature\n"
-msgstr "1 kötü imza\n"
-
#, fuzzy, c-format
#| msgid "%d bad signatures\n"
-msgid "%d good signatures\n"
-msgstr "%d kötü imza\n"
+msgid "%d good signature\n"
+msgid_plural "%d good signatures\n"
+msgstr[0] "%d kötü imza\n"
+msgstr[1] "%d kötü imza\n"
#, c-format
-msgid "Warning: %lu key(s) skipped due to their large size\n"
-msgstr ""
+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] ""
msgid "Keyring"
msgstr "Anahtar zinciri"
@@ -4425,22 +4397,29 @@ msgid " Card serial no. ="
msgstr " Kart seri no. ="
#, fuzzy, c-format
-#| msgid "renaming `%s' to `%s' failed: %s\n"
-msgid "renaming '%s' to '%s' failed: %s\n"
-msgstr "`%s' > `%s' isim değişikliği başarısız: %s\n"
-
-#, fuzzy, c-format
#| msgid "caching keyring `%s'\n"
msgid "caching keyring '%s'\n"
msgstr "`%s' anahtar zinciri önbellekleniyor\n"
-#, c-format
-msgid "%lu keys cached so far (%lu signatures)\n"
-msgstr "ÅŸimdiye kadar %lu anahtar arabelleklendi (%lu imza)\n"
+#, fuzzy, c-format
+#| msgid "%lu keys cached so far (%lu signatures)\n"
+msgid "%lu keys cached so far (%lu signature)\n"
+msgid_plural "%lu keys cached so far (%lu signatures)\n"
+msgstr[0] "ÅŸimdiye kadar %lu anahtar arabelleklendi (%lu imza)\n"
+msgstr[1] "ÅŸimdiye kadar %lu anahtar arabelleklendi (%lu imza)\n"
#, c-format
-msgid "%lu keys cached (%lu signatures)\n"
-msgstr "%lu anahtar arabelleklendi (%lu imza)\n"
+msgid "%lu key cached"
+msgid_plural "%lu keys cached"
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+#| msgid "1 bad signature\n"
+msgid " (%lu signature)\n"
+msgid_plural " (%lu signatures)\n"
+msgstr[0] "1 kötü imza\n"
+msgstr[1] "1 kötü imza\n"
#, c-format
msgid "%s: keyring created\n"
@@ -4482,19 +4461,18 @@ msgstr "anahtar sunucu protokolü geçersiz (bizimki %d!=eylemci %d)\n"
msgid "\"%s\" not a key ID: skipping\n"
msgstr "\"%s\" bir anahtar kimliği değil: atlanıyor\n"
-#, c-format
-msgid "refreshing 1 key from %s\n"
-msgstr "1 anahtar %s adresinden tazeleniyor\n"
+#, fuzzy, c-format
+#| msgid "refreshing %d keys from %s\n"
+msgid "refreshing %d key from %s\n"
+msgid_plural "refreshing %d keys from %s\n"
+msgstr[0] "%d anahtar %s adresinden tazeleniyor\n"
+msgstr[1] "%d anahtar %s adresinden tazeleniyor\n"
#, c-format
msgid "WARNING: unable to refresh key %s via %s: %s\n"
msgstr "UYARI: %s anahtarı %s üzerinden tazelenemiyor: %s\n"
#, c-format
-msgid "refreshing %d keys from %s\n"
-msgstr "%d anahtar %s adresinden tazeleniyor\n"
-
-#, c-format
msgid "key \"%s\" not found on keyserver\n"
msgstr "anahtar \"%s\" anahtar sunucusunda yok\n"
@@ -4512,9 +4490,10 @@ msgstr "%1$s anahtarı %3$s sunucusunun %2$s adresinden isteniyor\n"
msgid "requesting key %s from %s\n"
msgstr "%s anahtarı %s adresinden isteniyor\n"
-#, c-format
-msgid "sending key %s to %s server %s\n"
-msgstr "anahtar %1$s, %3$s sunucusunun %2$s adresine gönderiliyor\n"
+#, fuzzy
+#| msgid "no keyserver action!\n"
+msgid "no keyserver known\n"
+msgstr "bir anahtar sunucusu eylemi yok!\n"
#, c-format
msgid "sending key %s to %s\n"
@@ -4736,6 +4715,19 @@ msgstr "UYARI: %s özet algoritması artık önerilmiyor.\n"
msgid "Note: signatures using the %s algorithm are rejected\n"
msgstr "%s imzası, %s özet algoritması\n"
+#, fuzzy, c-format
+#| msgid "read error in `%s': %s\n"
+msgid "(reported error: %s)\n"
+msgstr "`%s' için okuma hatası: %s\n"
+
+#, fuzzy, c-format
+#| msgid "read error in `%s': %s\n"
+msgid "(reported error: %s <%s>)\n"
+msgstr "`%s' için okuma hatası: %s\n"
+
+msgid "(further info: "
+msgstr ""
+
#, c-format
msgid "%s:%d: deprecated option \"%s\"\n"
msgstr "%s:%d: \"%s\" seçeneği kullanımdan kaldırılmak üzere.\n"
@@ -5155,6 +5147,21 @@ msgstr "%s: atlandı: genel anahtar iptal edildi\n"
msgid "%s: skipped: public key already present\n"
msgstr "%s: atlandı: genel anahtar zaten var\n"
+#, fuzzy, c-format
+#| msgid "can't connect to `%s': %s\n"
+msgid "can't encrypt to '%s'\n"
+msgstr "\"%s\" sunucusuna bağlanılamadı: %s\n"
+
+#, fuzzy, c-format
+#| msgid "line %d: invalid algorithm\n"
+msgid "option '%s' given, but no valid default keys given\n"
+msgstr "`%d. satır: algoritma geçersiz\n"
+
+#, fuzzy, c-format
+#| msgid "line %d: invalid algorithm\n"
+msgid "option '%s' given, but option '%s' not given\n"
+msgstr "`%d. satır: algoritma geçersiz\n"
+
msgid "You did not specify a user ID. (you may use \"-r\")\n"
msgstr "Bir kullanıcı kimliği belirtmediniz. (\"-r\" kullanabilirsiniz)\n"
@@ -5198,11 +5205,6 @@ msgstr "Bilginize: anahtar %s %s için bir tercihe sahip değil\n"
msgid "data not saved; use option \"--output\" to save it\n"
msgstr "veri kaydedilmedi; kaydetmek için \"--output\" seçeneğini kullanın\n"
-#, fuzzy, c-format
-#| msgid "error creating `%s': %s\n"
-msgid "error creating '%s': %s\n"
-msgstr "`%s' oluÅŸturulurken hata: %s\n"
-
msgid "Detached signature.\n"
msgstr "Bağımsız imza.\n"
@@ -5298,19 +5300,31 @@ msgstr ""
"ya da y/N) "
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 ""
+
+msgid ""
"Use it to revoke this key in case of a compromise or loss of\n"
"the secret key. However, if the secret key is still accessible,\n"
"it is better to generate a new revocation certificate and give\n"
-"a reason for the revocation."
+"a reason for the revocation. For details see the description of\n"
+"of the gpg command \"--gen-revoke\" in the GnuPG manual."
msgstr ""
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 making use of this revocation certificate."
+"before importing and publishing this revocation certificate."
msgstr ""
#, fuzzy, c-format
+#| msgid "Revocation certificate created.\n"
+msgid "revocation certificate stored as '%s.rev'\n"
+msgstr "Yürürlükten kaldırma sertifikası üretildi.\n"
+
+#, fuzzy, c-format
#| msgid "secret key \"%s\" not found: %s\n"
msgid "secret key \"%s\" not found\n"
msgstr "gizli anahtar \"%s\" yok: %s\n"
@@ -5322,6 +5336,11 @@ msgstr "gizli anahtar \"%s\" yok: %s\n"
msgid "'%s' matches multiple secret keys:\n"
msgstr ""
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "error searching the keyring: %s\n"
+msgstr "`%s' anahtarlığı oluşturulurken hata: %s\n"
+
msgid "Create a revocation certificate for this key? (y/N) "
msgstr ""
"Bu anahtar için bir yürürlükten kaldırma sertifikası oluşturulsun mu? (e/H "
@@ -5403,26 +5422,42 @@ msgid "WARNING: signing subkey %s has an invalid cross-certification\n"
msgstr ""
"UYARI: yardımcı imzalama anahtarı %s geçersiz çapraz sertifikalamaya sahip\n"
-#, c-format
+#, fuzzy, c-format
+#| msgid "public key %s is %lu second newer than the signature\n"
msgid "public key %s is %lu second newer than the signature\n"
-msgstr "genel anahtar %s imzadan %lu saniye daha yeni\n"
+msgid_plural "public key %s is %lu seconds newer than the signature\n"
+msgstr[0] "genel anahtar %s imzadan %lu saniye daha yeni\n"
+msgstr[1] "genel anahtar %s imzadan %lu saniye daha yeni\n"
-#, c-format
-msgid "public key %s is %lu seconds newer than the signature\n"
-msgstr "genel anahtar %s imzadan %lu saniye daha yeni.\n"
+#, fuzzy, c-format
+#| msgid "public key %s is %lu second newer than the signature\n"
+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] "genel anahtar %s imzadan %lu saniye daha yeni\n"
+msgstr[1] "genel anahtar %s imzadan %lu saniye daha yeni\n"
-#, c-format
+#, fuzzy, c-format
+#| msgid ""
+#| "key %s was created %lu second in the future (time warp or clock problem)\n"
msgid ""
"key %s was created %lu second in the future (time warp or clock problem)\n"
-msgstr ""
+msgid_plural ""
+"key %s was created %lu seconds in the future (time warp or clock problem)\n"
+msgstr[0] ""
+"anahtar %s %lu saniye sonra üretilmiş (zaman sapması veya saat problemi)\n"
+msgstr[1] ""
"anahtar %s %lu saniye sonra üretilmiş (zaman sapması veya saat problemi)\n"
-#, c-format
-msgid ""
-"key %s was created %lu seconds in the future (time warp or clock problem)\n"
-msgstr ""
-"anahtar %s bundan %lu saniye sonra üretilmiş (zaman sapması veya saat "
-"problemi)\n"
+#, fuzzy, c-format
+#| msgid ""
+#| "key %s was created %lu second in the future (time warp or clock problem)\n"
+msgid "key %s was created %lu day in the future (time warp or clock problem)\n"
+msgid_plural ""
+"key %s was created %lu days in the future (time warp or clock problem)\n"
+msgstr[0] ""
+"anahtar %s %lu saniye sonra üretilmiş (zaman sapması veya saat problemi)\n"
+msgstr[1] ""
+"anahtar %s %lu saniye sonra üretilmiş (zaman sapması veya saat problemi)\n"
#, fuzzy, c-format
#| msgid "NOTE: signature key %s expired %s\n"
@@ -5661,6 +5696,246 @@ msgid "input line longer than %d characters\n"
msgstr "girdi satırı %d karakterden daha uzun\n"
#, fuzzy, c-format
+#| msgid "error sending standard options: %s\n"
+msgid "error beginning transaction on TOFU database: %s\n"
+msgstr "standart seçenekler gönderilirken hata: %s\n"
+
+#, c-format
+msgid "error committing transaction on TOFU database: %s\n"
+msgstr ""
+
+#, c-format
+msgid "error rolling back transaction on TOFU database: %s\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "unsupported algorithm: %s"
+msgid "unsupported TOFU database version: %s\n"
+msgstr "desteklenmeyen algoritma: %s"
+
+#, fuzzy, c-format
+#| msgid "error sending %s command: %s\n"
+msgid "error reading TOFU database: %s\n"
+msgstr "%s komutu gönderilirken hata: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error writing secret keyring `%s': %s\n"
+msgid "error determining TOFU database's version: %s\n"
+msgstr "`%s' gizli anahtarlığa yazılırken hata oluştu: %s\n"
+
+#, fuzzy, c-format
+#| msgid "%s: error writing dir record: %s\n"
+msgid "error initializing TOFU database: %s\n"
+msgstr "%s: dizin kaydını yazma hatası: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error opening `%s': %s\n"
+msgid "error opening TOFU database '%s': %s\n"
+msgstr "'%s' açılırken hata: %s\n"
+
+msgid "Warning: Home directory contains both tofu.db and tofu.d.\n"
+msgstr ""
+
+msgid "Using split format for TOFU database\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "error sending %s command: %s\n"
+msgid "error updating TOFU database: %s\n"
+msgstr "%s komutu gönderilirken hata: %s\n"
+
+#, c-format
+msgid "public key %s not found: %s\n"
+msgstr "genel anahtar %s yok: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error storing flags: %s\n"
+msgid "error setting TOFU binding's trust level to %s\n"
+msgstr "bayraklar saklanırken hata: %s\n"
+
+#, c-format
+msgid "The binding %s is NOT known."
+msgstr ""
+
+#, c-format
+msgid ""
+"The key %s raised a conflict with this binding (%s). Since this binding's "
+"policy was 'auto', it was changed to 'ask'."
+msgstr ""
+
+#, c-format
+msgid ""
+"Please indicate whether you believe the binding %s%sis legitimate (the key "
+"belongs to the stated owner) or a forgery (bad)."
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "error getting new PIN: %s\n"
+msgid "error gathering other user IDs: %s\n"
+msgstr "yeni PIN alınırken hata: %s\n"
+
+msgid "Known user IDs associated with this key:\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "validity: %s"
+msgid "policy: %s"
+msgstr "geçerliliği: %s"
+
+#, fuzzy, c-format
+#| msgid "error getting stored flags: %s\n"
+msgid "error gathering signature stats: %s\n"
+msgstr "saklanmış bayraklar alınırken hata: %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] ""
+msgstr[1] ""
+
+#, c-format
+msgid "Statistics for keys with the email address \"%s\":\n"
+msgstr ""
+
+#, fuzzy
+#| msgid "list keys"
+msgid "this key"
+msgstr "anahtarları listeler"
+
+#, c-format
+msgid "%ld message signed in the future."
+msgid_plural "%ld messages signed in the future."
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+#| msgid "print message digests"
+msgid "%ld message signed"
+msgid_plural "%ld messages signed"
+msgstr[0] "ileti özetlerini gösterir"
+msgstr[1] "ileti özetlerini gösterir"
+
+#, c-format
+msgid " over the past %ld day."
+msgid_plural " over the past %ld days."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid " over the past %ld week."
+msgid_plural " over the past %ld weeks."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid " over the past %ld month."
+msgid_plural " over the past %ld months."
+msgstr[0] ""
+msgstr[1] ""
+
+#. 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 ""
+
+#. 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 ""
+
+msgid "(G)ood, (A)ccept once, (U)nknown, (R)eject once, (B)ad? "
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "error creating a pipe: %s\n"
+msgid "error changing TOFU policy: %s\n"
+msgstr "boru oluÅŸturulurken hata: %s\n"
+
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "Have never verified a message signed by key %s!\n"
+msgstr ""
+
+#, c-format
+msgid "Failed to collect signature statistics for \"%s\" (key %s)\n"
+msgstr ""
+
+#, c-format
+msgid "Verified 0 messages signed by \"%s\" (key: %s, policy: %s)."
+msgstr ""
+
+#. TRANSLATORS: The final %s is replaced by a string like
+#. "7 months, 1 day, 5 minutes, 0 seconds".
+#, c-format
+msgid ""
+"Verified %ld message signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgid_plural ""
+"Verified %ld messages signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "The most recent message was verified %s ago."
+msgstr ""
+
+msgid "Warning: we've have yet to see a message signed by this key!\n"
+msgstr ""
+
+msgid "Warning: we've only seen a single message signed by this key!\n"
+msgstr ""
+
+#. TRANSLATORS: translate the below text. We don't
+#. directly internationalize that text so that we can
+#. tweak it without breaking translations.
+#, c-format
+msgid "TOFU: few signatures %d message %s"
+msgid_plural "TOFU: few signatures %d messages %s"
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+#| msgid "error sending %s command: %s\n"
+msgid "error opening TOFU database: %s\n"
+msgstr "%s komutu gönderilirken hata: %s\n"
+
+#, fuzzy, c-format
#| msgid "`%s' is not a valid long keyID\n"
msgid "'%s' is not a valid long keyID\n"
msgstr "`%s' geçerli bir anahtar kimliği değil\n"
@@ -5722,19 +5997,25 @@ msgstr "`%s' güvence modelli güvence veritabanı sınaması için gereksiz\n"
msgid "no need for a trustdb update with '%s' trust model\n"
msgstr "`%s' güvence modelli güvence veritabanı güncellemesi için gereksiz\n"
-#, c-format
-msgid "public key %s not found: %s\n"
-msgstr "genel anahtar %s yok: %s\n"
-
msgid "please do a --check-trustdb\n"
msgstr "lütfen bir --check-trustdb yapın\n"
msgid "checking the trustdb\n"
msgstr "güvence veritabanı denetleniyor\n"
-#, c-format
-msgid "%d keys processed (%d validity counts cleared)\n"
-msgstr "%d anahtar iÅŸlendi (%d doÄŸrulama temizlendi)\n"
+#, fuzzy, c-format
+#| msgid "%lu keys processed so far\n"
+msgid "%d key processed"
+msgid_plural "%d keys processed"
+msgstr[0] "ÅŸu ana kadar %lu anahtar iÅŸlendi\n"
+msgstr[1] "ÅŸu ana kadar %lu anahtar iÅŸlendi\n"
+
+#, fuzzy, c-format
+#| msgid "%d keys processed (%d validity counts cleared)\n"
+msgid " (%d validity count cleared)\n"
+msgid_plural " (%d validity counts cleared)\n"
+msgstr[0] "%d anahtar iÅŸlendi (%d doÄŸrulama temizlendi)\n"
+msgstr[1] "%d anahtar iÅŸlendi (%d doÄŸrulama temizlendi)\n"
msgid "no ultimately trusted keys found\n"
msgstr "son derece güvenli bir anahtar yok\n"
@@ -5744,10 +6025,6 @@ msgid "public key of ultimately trusted key %s not found\n"
msgstr "son derece güvenli %s için genel anahtar yok\n"
#, c-format
-msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
-msgstr "%d şöyle böyle gerekli, %d tamamen gerekli, %s güvence modeli\n"
-
-#, c-format
msgid ""
"depth: %d valid: %3d signed: %3d trust: %d-, %dq, %dn, %dm, %df, %du\n"
msgstr ""
@@ -5953,9 +6230,14 @@ msgstr "karttan CHV durumu alınırken hata\n"
msgid "card is permanently locked!\n"
msgstr "kart kalıcı olarak kilitli!\n"
-#, c-format
-msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
-msgstr ""
+#, fuzzy, c-format
+#| msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
+msgid "%d Admin PIN attempt remaining before card is permanently locked\n"
+msgid_plural ""
+"%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr[0] ""
+"kart kalıcı olarak kilitlenmeden önce %d Yönetici PIN kalmasına çalışılıyor\n"
+msgstr[1] ""
"kart kalıcı olarak kilitlenmeden önce %d Yönetici PIN kalmasına çalışılıyor\n"
#. TRANSLATORS: Do not translate the "|A|" prefix but keep it at
@@ -6042,9 +6324,12 @@ msgstr "anahtar üretilene kadar lütfen bekleyiniz ....\n"
msgid "generating key failed\n"
msgstr "anahtar üretimi başarısızlığa uğradı\n"
-#, c-format
-msgid "key generation completed (%d seconds)\n"
-msgstr "anahtar üretimi tamamlandı (%d saniye)\n"
+#, fuzzy, c-format
+#| msgid "key generation completed (%d seconds)\n"
+msgid "key generation completed (%d second)\n"
+msgid_plural "key generation completed (%d seconds)\n"
+msgstr[0] "anahtar üretimi tamamlandı (%d saniye)\n"
+msgstr[1] "anahtar üretimi tamamlandı (%d saniye)\n"
msgid "invalid structure of OpenPGP card (DO 0x93)\n"
msgstr "OpenPGP kartının yapısı geçersiz (DO 0x93)\n"
@@ -8443,6 +8728,11 @@ msgstr "|N|anahtar parolası N gün sonra zaman aşımına uğrar"
msgid "do not allow the reuse of old passphrases"
msgstr "eski anahtar parolalarının yeniden kullanılmasına izin vermez"
+#, fuzzy
+#| msgid "|N|set maximum PIN cache lifetime to N seconds"
+msgid "|N|set the Pinentry timeout to N seconds"
+msgstr "|N|azami PIN önbelleği ömrü N saniyeye ayarlanır"
+
msgid "|NAME|use NAME as default secret key"
msgstr "|İSİM|öntanımlı gizli anahtar olarak İSİM kullanılır"
@@ -8756,6 +9046,95 @@ msgstr ""
"karşılaştırır\n"
#, fuzzy
+#~| msgid "option \"%.50s\" is ambiguous\n"
+#~ msgid "key specification '%s' is ambiguous\n"
+#~ msgstr "\"%.50s\" seçeneği belirsiz\n"
+
+#~ msgid "%d signatures not checked due to missing keys\n"
+#~ msgstr "%d imza kayıp bir anahtar yüzünden kontrol edilmedi\n"
+
+#~ msgid "%d signatures not checked due to errors\n"
+#~ msgstr "%d imza hatalardan dolayı kontrol edilmedi\n"
+
+#~ msgid "1 user ID without valid self-signature detected\n"
+#~ msgstr "1 öz-imzası geçersiz kullanıcı kimliği saptandı\n"
+
+#~ msgid "Deleted %d signatures.\n"
+#~ msgstr "%d imza silindi.\n"
+
+#~ msgid "User ID \"%s\": %d signatures removed\n"
+#~ msgstr "Kullanıcı kimliği \"%s\": %d imza temizlendi\n"
+
+#~ msgid ""
+#~ "You need a Passphrase to protect your secret key.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Gizli anahtarınızı korumak için bir Anahtar Parolanız olmalı.\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "Please enter a passphrase to protect the off-card backup of the new "
+#~ "encryption key."
+#~ msgstr ""
+#~ "Lütfen GnuPG sistemine ithal edilen nesneyi koruyacak anahtar parolasını "
+#~ "giriniz."
+
+#~ msgid "passphrase not correctly repeated; try again"
+#~ msgstr ""
+#~ "ikinci kez yazdığınız anahtar parolası ilkiyle aynı değil; işlem "
+#~ "tekrarlanacak"
+
+#~ msgid "%s.\n"
+#~ msgstr "%s.\n"
+
+#~ msgid ""
+#~ "You don't want a passphrase - this is probably a *bad* idea!\n"
+#~ "I will do it anyway. You can change your passphrase at any time,\n"
+#~ "using this program with the option \"--edit-key\".\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Bir anahtar parolası istemediniz - bu *kötü* bir fikir!\n"
+#~ "Nasıl isterseniz. Anahtar parolanızı bu programı \"--edit-key\"\n"
+#~ "seçeneği ile kullanarak her zaman değiştirebilirsiniz.\n"
+#~ "\n"
+
+#~ msgid "storing key onto card failed: %s\n"
+#~ msgstr "anahtarın kart üzerinde saklanması başarısız: %s\n"
+
+#, fuzzy
+#~| msgid "1 bad signature\n"
+#~ msgid "1 good signature\n"
+#~ msgstr "1 kötü imza\n"
+
+#, fuzzy
+#~| msgid "renaming `%s' to `%s' failed: %s\n"
+#~ msgid "renaming '%s' to '%s' failed: %s\n"
+#~ msgstr "`%s' > `%s' isim değişikliği başarısız: %s\n"
+
+#~ msgid "%lu keys cached (%lu signatures)\n"
+#~ msgstr "%lu anahtar arabelleklendi (%lu imza)\n"
+
+#~ msgid "refreshing 1 key from %s\n"
+#~ msgstr "1 anahtar %s adresinden tazeleniyor\n"
+
+#~ msgid "sending key %s to %s server %s\n"
+#~ msgstr "anahtar %1$s, %3$s sunucusunun %2$s adresine gönderiliyor\n"
+
+#~ msgid "public key %s is %lu seconds newer than the signature\n"
+#~ msgstr "genel anahtar %s imzadan %lu saniye daha yeni.\n"
+
+#~ msgid ""
+#~ "key %s was created %lu seconds in the future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "anahtar %s bundan %lu saniye sonra üretilmiş (zaman sapması veya saat "
+#~ "problemi)\n"
+
+#~ msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
+#~ msgstr "%d şöyle böyle gerekli, %d tamamen gerekli, %s güvence modeli\n"
+
+#, fuzzy
#~| msgid "failed to store the key: %s\n"
#~ msgid "Failed to open the keyring DB.\n"
#~ msgstr "anahtarın saklanması başarısız: %s\n"
@@ -9011,9 +9390,6 @@ msgstr ""
#~ msgid "searching for \"%s\" from %s\n"
#~ msgstr "%2$s adresinde \"%1$s\" aranıyor\n"
-#~ msgid "no keyserver action!\n"
-#~ msgstr "bir anahtar sunucusu eylemi yok!\n"
-
#~ msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n"
#~ msgstr ""
#~ "UYARI: GnuPG'nin başka bir sürümünün anahtar sunucusu eylemcisi (%s)\n"
diff --git a/po/uk.po b/po/uk.po
index af6f7b5..269de99 100644
--- a/po/uk.po
+++ b/po/uk.po
@@ -1178,6 +1178,20 @@ msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð¿ÑƒÑтити через прокÑÑ– запÐ
msgid "Enter passphrase: "
msgstr "Введіть пароль: "
+#, fuzzy, c-format
+#| msgid "error creating keyring '%s': %s\n"
+msgid "error getting version from '%s': %s\n"
+msgstr "помилка під Ñ‡Ð°Ñ Ñпроби ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñховища ключів «%s»: %s\n"
+
+#, c-format
+msgid "server '%s' is older than us (%s < %s)"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "WARNING: %s overrides %s\n"
+msgid "WARNING: %s\n"
+msgstr "УВÐГÐ: %s перевизначає %s\n"
+
#, c-format
msgid "OpenPGP card not available: %s\n"
msgstr "Ðе вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ доÑтуп до картки OpenPGP: %s\n"
@@ -1654,6 +1668,9 @@ msgstr "вилучити невикориÑтовувані чаÑтини клÑ
msgid "remove as much as possible from key during export"
msgstr "вилучити макÑимум чаÑтин з ключа під Ñ‡Ð°Ñ ÐµÐºÑпортуваннÑ"
+msgid " - skipped"
+msgstr " - пропущено"
+
msgid "exporting secret keys not allowed\n"
msgstr "екÑÐ¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸Ñ… ключів заборонено\n"
@@ -1665,15 +1682,35 @@ msgstr "ключ %s: ключ у Ñтилі PGP 2.x — пропущено\n"
msgid "key %s: key material on-card - skipped\n"
msgstr "ключ %s: матеріал ключа на карті — пропущено\n"
-msgid " - skipped"
-msgstr " - пропущено"
-
msgid "WARNING: nothing exported\n"
msgstr "УВÐГÐ: нічого не екÑпортовано\n"
+#, c-format
+msgid "error creating '%s': %s\n"
+msgstr "помилка ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Â«%s»: %s.\n"
+
msgid "[User ID not found]"
msgstr "[Ідентифікатор не знайдено]"
+#, fuzzy, c-format
+#| msgid "missing argument for option \"%.50s\"\n"
+msgid "(check argument of option '%s')\n"
+msgstr "не вказано аргументу до параметра «%.50s»\n"
+
+#, c-format
+msgid "Warning: '%s' should be a long key ID or a fingerprint\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "error closing %s: %s\n"
+msgid "error looking up: %s\n"
+msgstr "помилка під Ñ‡Ð°Ñ Ñпроби закрити %s: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error creating keyring '%s': %s\n"
+msgid "Warning: %s appears in the keyring %d times\n"
+msgstr "помилка під Ñ‡Ð°Ñ Ñпроби ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñховища ключів «%s»: %s\n"
+
#, c-format
msgid "automatically retrieved '%s' via %s\n"
msgstr "автоматично отримано «%s» за допомогою %s\n"
@@ -1690,16 +1727,20 @@ msgid "secret key \"%s\" not found: %s\n"
msgstr "закритий ключ «%s» не знайдено: %s\n"
#, fuzzy, c-format
-#| msgid "missing argument for option \"%.50s\"\n"
-msgid "(check argument of option '%s')\n"
-msgstr "не вказано аргументу до параметра «%.50s»\n"
+#| msgid "|NAME|use NAME as default secret key"
+msgid "Warning: not using '%s' as default key: %s\n"
+msgstr "|NAME|викориÑтовувати вказаний типовий закритий ключ"
#, fuzzy, c-format
#| msgid "|NAME|use NAME as default secret key"
-msgid "using \"%s\" as default secret key\n"
+msgid "using \"%s\" as default secret key for signing\n"
msgstr "|NAME|викориÑтовувати вказаний типовий закритий ключ"
#, c-format
+msgid "all values passed to '%s' ignored\n"
+msgstr ""
+
+#, c-format
msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
msgstr ""
"Ðекоректний ключ %s визнано чинним через параметр --allow-non-selfsigned-"
@@ -2049,29 +2090,6 @@ msgid "Note: old default options file '%s' ignored\n"
msgstr "ЗÐУВÐЖЕÐÐЯ: заÑтарілий файл типових параметрів «%s» проігноровано\n"
#, c-format
-msgid ""
-"Warning: value '%s' for option '%s' should be a long key ID or a "
-"fingerprint\n"
-msgstr ""
-
-#, fuzzy, c-format
-#| msgid "option \"%.50s\" is ambiguous\n"
-msgid "key specification '%s' is ambiguous\n"
-msgstr "параметр «%.50s» є неоднозначним\n"
-
-#. TRANSLATORS: The %s prints a key specification which
-#. for example has been given at the command line. Two
-#. lines with fingerprints are printed after this message.
-#, c-format
-msgid "'%s' matches at least:\n"
-msgstr ""
-
-#, fuzzy, c-format
-#| msgid "error creating keyring '%s': %s\n"
-msgid "error searching the keyring: %s\n"
-msgstr "помилка під Ñ‡Ð°Ñ Ñпроби ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñховища ключів «%s»: %s\n"
-
-#, c-format
msgid "libgcrypt is too old (need %s, have %s)\n"
msgstr "libgcrypt занадто Ñтара (потрібна — %s, маємо %s)\n"
@@ -2275,16 +2293,6 @@ msgstr ""
"УВÐГÐ: отримувачів (-r) вказано без викориÑÑ‚Ð°Ð½Ð½Ñ ÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸Ð¼ "
"ключем\n"
-#, fuzzy, c-format
-#| msgid "line %d: invalid date given\n"
-msgid "option '%s' given, but no valid default keys given\n"
-msgstr "Ñ€Ñдок %d: вказано некоректну дату\n"
-
-#, fuzzy, c-format
-#| msgid "line %d: invalid date given\n"
-msgid "option '%s' given, but option '%s' not given\n"
-msgstr "Ñ€Ñдок %d: вказано некоректну дату\n"
-
msgid "--store [filename]"
msgstr "--store [назва файла]"
@@ -2364,6 +2372,11 @@ msgstr "помилка під Ñ‡Ð°Ñ Ñпроби Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…
msgid "key export failed: %s\n"
msgstr "помилка під Ñ‡Ð°Ñ Ñпроби екÑÐ¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ»ÑŽÑ‡Ð°: %s\n"
+#, fuzzy, c-format
+#| msgid "key export failed: %s\n"
+msgid "export as ssh key failed: %s\n"
+msgstr "помилка під Ñ‡Ð°Ñ Ñпроби екÑÐ¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ»ÑŽÑ‡Ð°: %s\n"
+
#, c-format
msgid "keyserver search failed: %s\n"
msgstr "помилка пошуку на Ñервері ключів: %s\n"
@@ -2848,33 +2861,40 @@ msgstr "[відкликаннÑ]"
msgid "[self-signature]"
msgstr "[ÑамопідпиÑ]"
-msgid "1 bad signature\n"
-msgstr "1 помилковий підпиÑ\n"
-
-#, c-format
-msgid "%d bad signatures\n"
-msgstr "%d помилкових підпиÑів\n"
-
-msgid "1 signature not checked due to a missing key\n"
-msgstr "1 Ð¿Ñ–Ð´Ð¿Ð¸Ñ Ð½Ðµ перевірено через те, що немає ключа\n"
-
-#, c-format
-msgid "%d signatures not checked due to missing keys\n"
-msgstr "%d підпиÑів не перевірено через те, що немає ключів\n"
-
-msgid "1 signature not checked due to an error\n"
-msgstr "1 Ð¿Ñ–Ð´Ð¿Ð¸Ñ Ð½Ðµ перевірено через помилку\n"
+#, fuzzy, c-format
+#| msgid "%d bad signatures\n"
+msgid "%d bad signature\n"
+msgid_plural "%d bad signatures\n"
+msgstr[0] "%d помилкових підпиÑів\n"
+msgstr[1] "%d помилкових підпиÑів\n"
+msgstr[2] "%d помилкових підпиÑів\n"
-#, c-format
-msgid "%d signatures not checked due to errors\n"
-msgstr "%d підпиÑів не перевірено через помилки\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to a missing key\n"
+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 Ð¿Ñ–Ð´Ð¿Ð¸Ñ Ð½Ðµ перевірено через те, що немає ключа\n"
+msgstr[1] "1 Ð¿Ñ–Ð´Ð¿Ð¸Ñ Ð½Ðµ перевірено через те, що немає ключа\n"
+msgstr[2] "1 Ð¿Ñ–Ð´Ð¿Ð¸Ñ Ð½Ðµ перевірено через те, що немає ключа\n"
-msgid "1 user ID without valid self-signature detected\n"
-msgstr "виÑвлено 1 ідентифікатор кориÑтувача без коректного ÑамопідпиÑу\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to an error\n"
+msgid "%d signature not checked due to an error\n"
+msgid_plural "%d signatures not checked due to errors\n"
+msgstr[0] "1 Ð¿Ñ–Ð´Ð¿Ð¸Ñ Ð½Ðµ перевірено через помилку\n"
+msgstr[1] "1 Ð¿Ñ–Ð´Ð¿Ð¸Ñ Ð½Ðµ перевірено через помилку\n"
+msgstr[2] "1 Ð¿Ñ–Ð´Ð¿Ð¸Ñ Ð½Ðµ перевірено через помилку\n"
-#, c-format
-msgid "%d user IDs without valid self-signatures detected\n"
-msgstr "виÑвлено %d ідентифікаторів кориÑтувачів без коректних ÑамопідпиÑів\n"
+#, fuzzy, c-format
+#| msgid "%d user IDs without valid self-signatures detected\n"
+msgid "%d user ID without valid self-signature detected\n"
+msgid_plural "%d user IDs without valid self-signatures detected\n"
+msgstr[0] ""
+"виÑвлено %d ідентифікаторів кориÑтувачів без коректних ÑамопідпиÑів\n"
+msgstr[1] ""
+"виÑвлено %d ідентифікаторів кориÑтувачів без коректних ÑамопідпиÑів\n"
+msgstr[2] ""
+"виÑвлено %d ідентифікаторів кориÑтувачів без коректних ÑамопідпиÑів\n"
msgid ""
"Please decide how far you trust this user to correctly verify other users' "
@@ -3461,13 +3481,13 @@ msgstr "Вилучити цей невідомий підпиÑ? (y/N/q або Ñ
msgid "Really delete this self-signature? (y/N)"
msgstr "Вилучити цей ÑамопідпиÑ? (y/N або Ñ‚/Ð)"
-#, c-format
+#, fuzzy, c-format
+#| msgid "Deleted %d signature.\n"
msgid "Deleted %d signature.\n"
-msgstr "Вилучено %d підпиÑ.\n"
-
-#, c-format
-msgid "Deleted %d signatures.\n"
-msgstr "Вилучено %d підпиÑів.\n"
+msgid_plural "Deleted %d signatures.\n"
+msgstr[0] "Вилучено %d підпиÑ.\n"
+msgstr[1] "Вилучено %d підпиÑ.\n"
+msgstr[2] "Вилучено %d підпиÑ.\n"
msgid "Nothing deleted.\n"
msgstr "Ðічого не вилучено.\n"
@@ -3479,13 +3499,13 @@ msgstr "некоректний"
msgid "User ID \"%s\" compacted: %s\n"
msgstr "Ідентифікатор кориÑтувача «%s» ущільнено: %s\n"
-#, c-format
+#, fuzzy, c-format
+#| msgid "User ID \"%s\": %d signature removed\n"
msgid "User ID \"%s\": %d signature removed\n"
-msgstr "Ідентифікатор кориÑтувача «%s»: вилучено %d підпиÑ\n"
-
-#, c-format
-msgid "User ID \"%s\": %d signatures removed\n"
-msgstr "Ідентифікатор кориÑтувача «%s»: вилучено %d підпиÑів\n"
+msgid_plural "User ID \"%s\": %d signatures removed\n"
+msgstr[0] "Ідентифікатор кориÑтувача «%s»: вилучено %d підпиÑ\n"
+msgstr[1] "Ідентифікатор кориÑтувача «%s»: вилучено %d підпиÑ\n"
+msgstr[2] "Ідентифікатор кориÑтувача «%s»: вилучено %d підпиÑ\n"
#, c-format
msgid "User ID \"%s\": already minimized\n"
@@ -4011,38 +4031,6 @@ msgid "Please correct the error first\n"
msgstr "Спочатку виправте помилку\n"
msgid ""
-"You need a Passphrase to protect your secret key.\n"
-"\n"
-msgstr ""
-"Вам потрібен пароль Ð´Ð»Ñ Ð·Ð°Ñ…Ð¸Ñту вашого закритого ключа.\n"
-"\n"
-
-msgid ""
-"Please enter a passphrase to protect the off-card backup of the new "
-"encryption key."
-msgstr ""
-"Будь лаÑка, вкажіть пароль Ð´Ð»Ñ Ð·Ð°Ñ…Ð¸Ñту позакарткової резервної копії нового "
-"ключа шифруваннÑ."
-
-msgid "passphrase not correctly repeated; try again"
-msgstr "помилка під Ñ‡Ð°Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾Ð³Ð¾ Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ, повторіть Ñпробу"
-
-#, c-format
-msgid "%s.\n"
-msgstr "%s.\n"
-
-msgid ""
-"You don't want a passphrase - this is probably a *bad* idea!\n"
-"I will do it anyway. You can change your passphrase at any time,\n"
-"using this program with the option \"--edit-key\".\n"
-"\n"
-msgstr ""
-"Ви не викориÑтовуєте Ð¿Ð°Ñ€Ð¾Ð»Ñ â€” дуже погана робота!\n"
-"Вашу забаганку буде виконано. Пізніше ви зможете змінити пароль,\n"
-"за допомогою цієї програми з параметром «--edit-key».\n"
-"\n"
-
-msgid ""
"We need to generate a lot of random bytes. It is a good idea to perform\n"
"some other action (type on the keyboard, move the mouse, utilize the\n"
"disks) during the prime generation; this gives the random number\n"
@@ -4090,6 +4078,14 @@ msgid "Key generation canceled.\n"
msgstr "Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ»ÑŽÑ‡Ð° ÑкаÑовано.\n"
#, c-format
+msgid "can't create backup file '%s': %s\n"
+msgstr "не вдалоÑÑ Ñтворити файл резервної копії «%s»: %s\n"
+
+#, c-format
+msgid "Note: backup of card key saved to '%s'\n"
+msgstr "ЗÐУВÐЖЕÐÐЯ: резервну копію ключа на картці збережено до «%s»\n"
+
+#, c-format
msgid "writing public key to '%s'\n"
msgstr "запиÑуємо відкритий ключ до «%s»\n"
@@ -4137,18 +4133,6 @@ msgstr "Закриті чаÑтини оÑновного ключа зберіг
msgid "Really create? (y/N) "
msgstr "Створити? (y/N або Ñ‚/Ð) "
-#, c-format
-msgid "storing key onto card failed: %s\n"
-msgstr "Ñпроба Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ ÐºÐ»ÑŽÑ‡Ð° на картці зазнала невдачі: %s\n"
-
-#, c-format
-msgid "can't create backup file '%s': %s\n"
-msgstr "не вдалоÑÑ Ñтворити файл резервної копії «%s»: %s\n"
-
-#, c-format
-msgid "Note: backup of card key saved to '%s'\n"
-msgstr "ЗÐУВÐЖЕÐÐЯ: резервну копію ключа на картці збережено до «%s»\n"
-
msgid "never "
msgstr "ніколи "
@@ -4167,16 +4151,24 @@ msgstr "Критична примітка підпиÑу: "
msgid "Signature notation: "
msgstr "Примітка підпиÑу: "
-msgid "1 good signature\n"
-msgstr "1 добрий підпиÑ\n"
-
-#, c-format
-msgid "%d good signatures\n"
-msgstr "%d добрих підпиÑів\n"
+#, fuzzy, c-format
+#| msgid "%d good signatures\n"
+msgid "%d good signature\n"
+msgid_plural "%d good signatures\n"
+msgstr[0] "%d добрих підпиÑів\n"
+msgstr[1] "%d добрих підпиÑів\n"
+msgstr[2] "%d добрих підпиÑів\n"
-#, c-format
-msgid "Warning: %lu key(s) skipped due to their large size\n"
-msgstr "ПопередженнÑ: %lu ключів пропущено через їхній надто великий розмір\n"
+#, fuzzy, c-format
+#| msgid "Warning: %lu key(s) skipped due to their large size\n"
+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] ""
+"ПопередженнÑ: %lu ключів пропущено через їхній надто великий розмір\n"
+msgstr[1] ""
+"ПопередженнÑ: %lu ключів пропущено через їхній надто великий розмір\n"
+msgstr[2] ""
+"ПопередженнÑ: %lu ключів пропущено через їхній надто великий розмір\n"
msgid "Keyring"
msgstr "Сховище ключів"
@@ -4206,20 +4198,32 @@ msgid " Card serial no. ="
msgstr "Серійний номер картки ="
#, c-format
-msgid "renaming '%s' to '%s' failed: %s\n"
-msgstr "Ñпроба Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ð½Ð½Ñ Â«%s» на «%s» зазнала невдачі: %s\n"
-
-#, c-format
msgid "caching keyring '%s'\n"
msgstr "ÐºÐµÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ñховища ключів «%s»\n"
-#, c-format
-msgid "%lu keys cached so far (%lu signatures)\n"
-msgstr "зараз кешовано %lu ключів (%lu підпиÑів)\n"
+#, fuzzy, c-format
+#| msgid "%lu keys cached so far (%lu signatures)\n"
+msgid "%lu keys cached so far (%lu signature)\n"
+msgid_plural "%lu keys cached so far (%lu signatures)\n"
+msgstr[0] "зараз кешовано %lu ключів (%lu підпиÑів)\n"
+msgstr[1] "зараз кешовано %lu ключів (%lu підпиÑів)\n"
+msgstr[2] "зараз кешовано %lu ключів (%lu підпиÑів)\n"
-#, c-format
-msgid "%lu keys cached (%lu signatures)\n"
-msgstr "кешовано %lu ключів (%lu підпиÑів)\n"
+#, fuzzy, c-format
+#| msgid "flush the cache"
+msgid "%lu key cached"
+msgid_plural "%lu keys cached"
+msgstr[0] "Ñпорожнити кеш"
+msgstr[1] "Ñпорожнити кеш"
+msgstr[2] "Ñпорожнити кеш"
+
+#, fuzzy, c-format
+#| msgid "1 bad signature\n"
+msgid " (%lu signature)\n"
+msgid_plural " (%lu signatures)\n"
+msgstr[0] "1 помилковий підпиÑ\n"
+msgstr[1] "1 помилковий підпиÑ\n"
+msgstr[2] "1 помилковий підпиÑ\n"
#, c-format
msgid "%s: keyring created\n"
@@ -4261,19 +4265,19 @@ msgstr "некоректний протокол Ñервера ключів (нÐ
msgid "\"%s\" not a key ID: skipping\n"
msgstr "«%s» не Ñ” ідентифікатором ключа: пропуÑкаємо\n"
-#, c-format
-msgid "refreshing 1 key from %s\n"
-msgstr "оновлюємо 1 ключ з %s\n"
+#, fuzzy, c-format
+#| msgid "refreshing %d keys from %s\n"
+msgid "refreshing %d key from %s\n"
+msgid_plural "refreshing %d keys from %s\n"
+msgstr[0] "оновлюємо %d ключів з %s\n"
+msgstr[1] "оновлюємо %d ключів з %s\n"
+msgstr[2] "оновлюємо %d ключів з %s\n"
#, c-format
msgid "WARNING: unable to refresh key %s via %s: %s\n"
msgstr "УВÐГÐ: не вдалоÑÑ Ð¾Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ ключ %s за допомогою %s: %s\n"
#, c-format
-msgid "refreshing %d keys from %s\n"
-msgstr "оновлюємо %d ключів з %s\n"
-
-#, c-format
msgid "key \"%s\" not found on keyserver\n"
msgstr "ключ «%s» не знайдено на Ñервері ключів\n"
@@ -4292,9 +4296,10 @@ msgstr "надÑилаємо запит щодо ключа %s до %s ÑервÐ
msgid "requesting key %s from %s\n"
msgstr "надÑилаємо запит щодо ключа %s з %s\n"
-#, c-format
-msgid "sending key %s to %s server %s\n"
-msgstr "надÑилаємо ключ %s до %s Ñервера %s\n"
+#, fuzzy
+#| msgid "invalid keyserver options\n"
+msgid "no keyserver known\n"
+msgstr "некоректні параметри Ñервера ключів\n"
#, c-format
msgid "sending key %s to %s\n"
@@ -4514,6 +4519,19 @@ msgstr "УВÐГÐ: алгоритм обчиÑÐ»ÐµÐ½Ð½Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¸Ñ…
msgid "Note: signatures using the %s algorithm are rejected\n"
msgstr "ЗауваженнÑ: підпиÑи за допомогою алгоритму %s відкинуто\n"
+#, fuzzy, c-format
+#| msgid "%s:%u: read error: %s\n"
+msgid "(reported error: %s)\n"
+msgstr "%s:%u: помилка під Ñ‡Ð°Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ: %s\n"
+
+#, fuzzy, c-format
+#| msgid "read error in '%s': %s\n"
+msgid "(reported error: %s <%s>)\n"
+msgstr "помилка Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñƒ «%s»: %s\n"
+
+msgid "(further info: "
+msgstr ""
+
#, c-format
msgid "%s:%d: deprecated option \"%s\"\n"
msgstr "%s:%d: заÑтарілий параметр «%s»\n"
@@ -4910,6 +4928,21 @@ msgstr "%s: пропущено: відкритий ключ вимкнено\n"
msgid "%s: skipped: public key already present\n"
msgstr "%s: пропущено: відкритий ключ вже Ñ–Ñнує\n"
+#, fuzzy, c-format
+#| msgid "can't connect to '%s': %s\n"
+msgid "can't encrypt to '%s'\n"
+msgstr "не вдалоÑÑ Ð²Ñтановити Ð·â€™Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· «%s»: %s\n"
+
+#, fuzzy, c-format
+#| msgid "line %d: invalid date given\n"
+msgid "option '%s' given, but no valid default keys given\n"
+msgstr "Ñ€Ñдок %d: вказано некоректну дату\n"
+
+#, fuzzy, c-format
+#| msgid "line %d: invalid date given\n"
+msgid "option '%s' given, but option '%s' not given\n"
+msgstr "Ñ€Ñдок %d: вказано некоректну дату\n"
+
msgid "You did not specify a user ID. (you may use \"-r\")\n"
msgstr ""
"Вами не вказано ідентифікатора кориÑтувача. (можете ÑкориÑтатиÑÑ Â«-r»)\n"
@@ -4956,10 +4989,6 @@ msgstr ""
"дані не збережено; ÑкориÑтайтеÑÑ Ð´Ð»Ñ Ñ—Ñ…Ð½ÑŒÐ¾Ð³Ð¾ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ «--"
"output»\n"
-#, c-format
-msgid "error creating '%s': %s\n"
-msgstr "помилка ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Â«%s»: %s.\n"
-
msgid "Detached signature.\n"
msgstr "Від’єднаний підпиÑ.\n"
@@ -5044,26 +5073,49 @@ msgid "This is a revocation certificate for the OpenPGP key:"
msgstr "Це Ñертифікат Ð²Ñ–Ð´ÐºÐ»Ð¸ÐºÐ°Ð½Ð½Ñ Ð´Ð»Ñ ÐºÐ»ÑŽÑ‡Ð° 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 ""
+
+#, fuzzy
+#| msgid ""
+#| "Use it to revoke this key in case of a compromise or loss of\n"
+#| "the secret key. However, if the secret key is still accessible,\n"
+#| "it is better to generate a new revocation certificate and give\n"
+#| "a reason for the revocation."
+msgid ""
"Use it to revoke this key in case of a compromise or loss of\n"
"the secret key. However, if the secret key is still accessible,\n"
"it is better to generate a new revocation certificate and give\n"
-"a reason for the revocation."
+"a reason for the revocation. For details see the description of\n"
+"of the gpg command \"--gen-revoke\" in the GnuPG manual."
msgstr ""
"СкориÑтайтеÑÑ Ñ†Ð¸Ð¼ Ð´Ð»Ñ Ð²Ñ–Ð´ÐºÐ»Ð¸ÐºÐ°Ð½Ð½Ñ Ñ†ÑŒÐ¾Ð³Ð¾ ключа у випадку його\n"
"компрометації або втрати закритої чаÑтини. Втім, Ñкщо доÑтуп до\n"
"закритого ключа не втрачено, краще Ñтворити новий Ñертифікат\n"
"Ð²Ñ–Ð´ÐºÐ»Ð¸ÐºÐ°Ð½Ð½Ñ Ñ– вказати причину відкликаннÑ."
+#, fuzzy
+#| 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 making use of this revocation certificate."
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 making use of this revocation certificate."
+"before importing and publishing this revocation certificate."
msgstr ""
"Щоб уникнути випадкового викориÑÑ‚Ð°Ð½Ð½Ñ Ñ†ÑŒÐ¾Ð³Ð¾ файла, перед п’Ñтьма\n"
"дефіÑами нижче додано двокрапку. Вилучіть цю двокрапку у текÑтовому\n"
"редакторі, перш ніж ÑкориÑтатиÑÑ Ñ†Ð¸Ð¼ Ñертифікатом відкликаннÑ."
#, fuzzy, c-format
+#| msgid "Revocation certificate created.\n"
+msgid "revocation certificate stored as '%s.rev'\n"
+msgstr "Створено Ñертифікат відкликаннÑ.\n"
+
+#, fuzzy, c-format
#| msgid "secret key \"%s\" not found: %s\n"
msgid "secret key \"%s\" not found\n"
msgstr "закритий ключ «%s» не знайдено: %s\n"
@@ -5075,6 +5127,11 @@ msgstr "закритий ключ «%s» не знайдено: %s\n"
msgid "'%s' matches multiple secret keys:\n"
msgstr ""
+#, fuzzy, c-format
+#| msgid "error creating keyring '%s': %s\n"
+msgid "error searching the keyring: %s\n"
+msgstr "помилка під Ñ‡Ð°Ñ Ñпроби ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñховища ключів «%s»: %s\n"
+
msgid "Create a revocation certificate for this key? (y/N) "
msgstr "Створити Ñертифікат Ð²Ñ–Ð´ÐºÐ»Ð¸ÐºÐ°Ð½Ð½Ñ Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ ключа? (y/N або Ñ‚/Ð) "
@@ -5155,26 +5212,53 @@ msgid "WARNING: signing subkey %s has an invalid cross-certification\n"
msgstr ""
"УВÐГÐ: підпиÑÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡Ð° %s міÑтить некоректну перехреÑну Ñертифікацію\n"
-#, c-format
+#, fuzzy, c-format
+#| msgid "public key %s is %lu second newer than the signature\n"
msgid "public key %s is %lu second newer than the signature\n"
-msgstr "відкритий ключ %s Ñ” на %lu Ñекунду новішим за підпиÑ\n"
+msgid_plural "public key %s is %lu seconds newer than the signature\n"
+msgstr[0] "відкритий ключ %s Ñ” на %lu Ñекунду новішим за підпиÑ\n"
+msgstr[1] "відкритий ключ %s Ñ” на %lu Ñекунду новішим за підпиÑ\n"
+msgstr[2] "відкритий ключ %s Ñ” на %lu Ñекунду новішим за підпиÑ\n"
-#, c-format
-msgid "public key %s is %lu seconds newer than the signature\n"
-msgstr "відкритий ключ %s Ñ” на %lu Ñекунд новішим за підпиÑ\n"
+#, fuzzy, c-format
+#| msgid "public key %s is %lu second newer than the signature\n"
+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] "відкритий ключ %s Ñ” на %lu Ñекунду новішим за підпиÑ\n"
+msgstr[1] "відкритий ключ %s Ñ” на %lu Ñекунду новішим за підпиÑ\n"
+msgstr[2] "відкритий ключ %s Ñ” на %lu Ñекунду новішим за підпиÑ\n"
-#, c-format
+#, fuzzy, c-format
+#| msgid ""
+#| "key %s was created %lu second in the future (time warp or clock problem)\n"
msgid ""
"key %s was created %lu second in the future (time warp or clock problem)\n"
-msgstr ""
+msgid_plural ""
+"key %s was created %lu seconds in the future (time warp or clock problem)\n"
+msgstr[0] ""
+"ключ %s було Ñтворено з позначкою на %lu Ñекунду у майбутньому (чаÑова Ð¿ÐµÑ‚Ð»Ñ "
+"або проблема з годинником)\n"
+msgstr[1] ""
+"ключ %s було Ñтворено з позначкою на %lu Ñекунду у майбутньому (чаÑова Ð¿ÐµÑ‚Ð»Ñ "
+"або проблема з годинником)\n"
+msgstr[2] ""
"ключ %s було Ñтворено з позначкою на %lu Ñекунду у майбутньому (чаÑова Ð¿ÐµÑ‚Ð»Ñ "
"або проблема з годинником)\n"
-#, c-format
-msgid ""
-"key %s was created %lu seconds in the future (time warp or clock problem)\n"
-msgstr ""
-"ключ %s було Ñтворено з позначкою на %lu Ñекунд у майбутньому (чаÑова Ð¿ÐµÑ‚Ð»Ñ "
+#, fuzzy, c-format
+#| msgid ""
+#| "key %s was created %lu second in the future (time warp or clock problem)\n"
+msgid "key %s was created %lu day in the future (time warp or clock problem)\n"
+msgid_plural ""
+"key %s was created %lu days in the future (time warp or clock problem)\n"
+msgstr[0] ""
+"ключ %s було Ñтворено з позначкою на %lu Ñекунду у майбутньому (чаÑова Ð¿ÐµÑ‚Ð»Ñ "
+"або проблема з годинником)\n"
+msgstr[1] ""
+"ключ %s було Ñтворено з позначкою на %lu Ñекунду у майбутньому (чаÑова Ð¿ÐµÑ‚Ð»Ñ "
+"або проблема з годинником)\n"
+msgstr[2] ""
+"ключ %s було Ñтворено з позначкою на %lu Ñекунду у майбутньому (чаÑова Ð¿ÐµÑ‚Ð»Ñ "
"або проблема з годинником)\n"
#, c-format
@@ -5404,6 +5488,260 @@ msgstr ""
msgid "input line longer than %d characters\n"
msgstr "Ñ€Ñдок вхідних даних довший за %d Ñимволів\n"
+#, fuzzy, c-format
+#| msgid "error sending standard options: %s\n"
+msgid "error beginning transaction on TOFU database: %s\n"
+msgstr "помилка під Ñ‡Ð°Ñ Ñпроби надÑÐ¸Ð»Ð°Ð½Ð½Ñ Ñтандартних параметрів: %s\n"
+
+#, c-format
+msgid "error committing transaction on TOFU database: %s\n"
+msgstr ""
+
+#, c-format
+msgid "error rolling back transaction on TOFU database: %s\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "unsupported algorithm: %s"
+msgid "unsupported TOFU database version: %s\n"
+msgstr "непідтримуваний алгоритм: %s"
+
+#, fuzzy, c-format
+#| msgid "error sending data: %s\n"
+msgid "error reading TOFU database: %s\n"
+msgstr "помилка під Ñ‡Ð°Ñ Ñпроби надÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error writing base64 encoding: %s\n"
+msgid "error determining TOFU database's version: %s\n"
+msgstr "помилка під Ñ‡Ð°Ñ Ñпроби запиÑу у кодуванні base64: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error initializing reader object: %s\n"
+msgid "error initializing TOFU database: %s\n"
+msgstr "помилка під Ñ‡Ð°Ñ Ñпроби ініціалізації об’єкта читаннÑ: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error opening '%s': %s\n"
+msgid "error opening TOFU database '%s': %s\n"
+msgstr "помилка під Ñ‡Ð°Ñ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Â«%s»: %s\n"
+
+msgid "Warning: Home directory contains both tofu.db and tofu.d.\n"
+msgstr ""
+
+msgid "Using split format for TOFU database\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "error sending data: %s\n"
+msgid "error updating TOFU database: %s\n"
+msgstr "помилка під Ñ‡Ð°Ñ Ñпроби надÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…: %s\n"
+
+#, c-format
+msgid "public key %s not found: %s\n"
+msgstr "відкритий ключ %s не знайдено: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error setting OCSP target: %s\n"
+msgid "error setting TOFU binding's trust level to %s\n"
+msgstr "помилка під Ñ‡Ð°Ñ Ð²ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð° OCSP: %s\n"
+
+#, c-format
+msgid "The binding %s is NOT known."
+msgstr ""
+
+#, c-format
+msgid ""
+"The key %s raised a conflict with this binding (%s). Since this binding's "
+"policy was 'auto', it was changed to 'ask'."
+msgstr ""
+
+#, c-format
+msgid ""
+"Please indicate whether you believe the binding %s%sis legitimate (the key "
+"belongs to the stated owner) or a forgery (bad)."
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "error getting responder ID: %s\n"
+msgid "error gathering other user IDs: %s\n"
+msgstr "помилка під Ñ‡Ð°Ñ Ñпроби Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ñ–Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ‚Ð¾Ñ€Ð° відповідача: %s\n"
+
+msgid "Known user IDs associated with this key:\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "validity: %s"
+msgid "policy: %s"
+msgstr "чинніÑÑ‚ÑŒ: %s"
+
+#, fuzzy, c-format
+#| msgid "error getting stored flags: %s\n"
+msgid "error gathering signature stats: %s\n"
+msgstr "помилка під Ñ‡Ð°Ñ Ñпроби Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð¸Ñ… прапорців: %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] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, c-format
+msgid "Statistics for keys with the email address \"%s\":\n"
+msgstr ""
+
+#, fuzzy
+#| msgid "list keys"
+msgid "this key"
+msgstr "показати ÑпиÑок ключів"
+
+#, c-format
+msgid "%ld message signed in the future."
+msgid_plural "%ld messages signed in the future."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, fuzzy, c-format
+#| msgid "print message digests"
+msgid "%ld message signed"
+msgid_plural "%ld messages signed"
+msgstr[0] "показати контрольні Ñуми повідомлень"
+msgstr[1] "показати контрольні Ñуми повідомлень"
+msgstr[2] "показати контрольні Ñуми повідомлень"
+
+#, c-format
+msgid " over the past %ld day."
+msgid_plural " over the past %ld days."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, c-format
+msgid " over the past %ld week."
+msgid_plural " over the past %ld weeks."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, c-format
+msgid " over the past %ld month."
+msgid_plural " over the past %ld months."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#. 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 ""
+
+#. 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 ""
+
+msgid "(G)ood, (A)ccept once, (U)nknown, (R)eject once, (B)ad? "
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "error creating a pipe: %s\n"
+msgid "error changing TOFU policy: %s\n"
+msgstr "помилка під Ñ‡Ð°Ñ Ñпроби ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ°Ð½Ð°Ð»Ñƒ: %s\n"
+
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, c-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, c-format
+msgid "Have never verified a message signed by key %s!\n"
+msgstr ""
+
+#, c-format
+msgid "Failed to collect signature statistics for \"%s\" (key %s)\n"
+msgstr ""
+
+#, c-format
+msgid "Verified 0 messages signed by \"%s\" (key: %s, policy: %s)."
+msgstr ""
+
+#. TRANSLATORS: The final %s is replaced by a string like
+#. "7 months, 1 day, 5 minutes, 0 seconds".
+#, c-format
+msgid ""
+"Verified %ld message signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgid_plural ""
+"Verified %ld messages signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, c-format
+msgid "The most recent message was verified %s ago."
+msgstr ""
+
+msgid "Warning: we've have yet to see a message signed by this key!\n"
+msgstr ""
+
+msgid "Warning: we've only seen a single message signed by this key!\n"
+msgstr ""
+
+#. TRANSLATORS: translate the below text. We don't
+#. directly internationalize that text so that we can
+#. tweak it without breaking translations.
+#, c-format
+msgid "TOFU: few signatures %d message %s"
+msgid_plural "TOFU: few signatures %d messages %s"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, fuzzy, c-format
+#| msgid "error sending data: %s\n"
+msgid "error opening TOFU database: %s\n"
+msgstr "помилка під Ñ‡Ð°Ñ Ñпроби надÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…: %s\n"
+
#, c-format
msgid "'%s' is not a valid long keyID\n"
msgstr "«%s» не є коректним довгим ідентифікатором ключа\n"
@@ -5464,19 +5802,27 @@ msgstr "потреби у перевірці trustdb на оÑнові модеÐ
msgid "no need for a trustdb update with '%s' trust model\n"
msgstr "потреби у оновленні trustdb на оÑнові моделі довіри «%s» немає\n"
-#, c-format
-msgid "public key %s not found: %s\n"
-msgstr "відкритий ключ %s не знайдено: %s\n"
-
msgid "please do a --check-trustdb\n"
msgstr "будь лаÑка, ÑкориÑтайтеÑÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ --check-trustdb\n"
msgid "checking the trustdb\n"
msgstr "перевірка trustdb\n"
-#, c-format
-msgid "%d keys processed (%d validity counts cleared)\n"
-msgstr "Оброблено %d ключів (очищено %d значень чинноÑÑ‚Ñ–)\n"
+#, fuzzy, c-format
+#| msgid "%lu keys processed so far\n"
+msgid "%d key processed"
+msgid_plural "%d keys processed"
+msgstr[0] "оброблено %lu ключів\n"
+msgstr[1] "оброблено %lu ключів\n"
+msgstr[2] "оброблено %lu ключів\n"
+
+#, fuzzy, c-format
+#| msgid "%d keys processed (%d validity counts cleared)\n"
+msgid " (%d validity count cleared)\n"
+msgid_plural " (%d validity counts cleared)\n"
+msgstr[0] "Оброблено %d ключів (очищено %d значень чинноÑÑ‚Ñ–)\n"
+msgstr[1] "Оброблено %d ключів (очищено %d значень чинноÑÑ‚Ñ–)\n"
+msgstr[2] "Оброблено %d ключів (очищено %d значень чинноÑÑ‚Ñ–)\n"
msgid "no ultimately trusted keys found\n"
msgstr "не знайдено ключів з необмеженою довірою\n"
@@ -5486,10 +5832,6 @@ msgid "public key of ultimately trusted key %s not found\n"
msgstr "не знайдено відкритий ключ ключа з необмеженою довірою %s\n"
#, c-format
-msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
-msgstr "потрібно %d обмежених, потрібно %d повних, модель довіри %s\n"
-
-#, c-format
msgid ""
"depth: %d valid: %3d signed: %3d trust: %d-, %dq, %dn, %dm, %df, %du\n"
msgstr ""
@@ -5698,9 +6040,18 @@ msgstr "помилка Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ñтану CHV з картки\n"
msgid "card is permanently locked!\n"
msgstr "картку заблоковано!\n"
-#, c-format
-msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
-msgstr ""
+#, fuzzy, c-format
+#| msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
+msgid "%d Admin PIN attempt remaining before card is permanently locked\n"
+msgid_plural ""
+"%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr[0] ""
+"залишилоÑÑ %d Ñпроб Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð°Ð´Ð¼Ñ–Ð½Ñ–Ñтративного пінкоду перед тим, Ñк "
+"картку буде оÑтаточно заблоковано\n"
+msgstr[1] ""
+"залишилоÑÑ %d Ñпроб Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð°Ð´Ð¼Ñ–Ð½Ñ–Ñтративного пінкоду перед тим, Ñк "
+"картку буде оÑтаточно заблоковано\n"
+msgstr[2] ""
"залишилоÑÑ %d Ñпроб Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð°Ð´Ð¼Ñ–Ð½Ñ–Ñтративного пінкоду перед тим, Ñк "
"картку буде оÑтаточно заблоковано\n"
@@ -5781,9 +6132,13 @@ msgstr "зачекайте на Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ»ÑŽÑ‡
msgid "generating key failed\n"
msgstr "помилка під Ñ‡Ð°Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ»ÑŽÑ‡Ð°\n"
-#, c-format
-msgid "key generation completed (%d seconds)\n"
-msgstr "ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ»ÑŽÑ‡Ð° завершено (за %d Ñекунд)\n"
+#, fuzzy, c-format
+#| msgid "key generation completed (%d seconds)\n"
+msgid "key generation completed (%d second)\n"
+msgid_plural "key generation completed (%d seconds)\n"
+msgstr[0] "ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ»ÑŽÑ‡Ð° завершено (за %d Ñекунд)\n"
+msgstr[1] "ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ»ÑŽÑ‡Ð° завершено (за %d Ñекунд)\n"
+msgstr[2] "ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ»ÑŽÑ‡Ð° завершено (за %d Ñекунд)\n"
msgid "invalid structure of OpenPGP card (DO 0x93)\n"
msgstr "некоректна Ñтруктура картки OpenPGP (DO 0x93)\n"
@@ -7906,6 +8261,11 @@ msgstr "|N|завершувати Ñтрок дії паролів за вказ
msgid "do not allow the reuse of old passphrases"
msgstr "не дозволÑти повторне викориÑÑ‚Ð°Ð½Ð½Ñ Ñтарих паролів"
+#, fuzzy
+#| msgid "|N|set LDAP timeout to N seconds"
+msgid "|N|set the Pinentry timeout to N seconds"
+msgstr "|N|вÑтановити вказаний Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… від LDAP"
+
msgid "|NAME|use NAME as default secret key"
msgstr "|NAME|викориÑтовувати вказаний типовий закритий ключ"
@@ -8195,6 +8555,88 @@ msgstr ""
"СинтакÑиÑ: gpg-check-pattern [параметри] файл_шаблонів\n"
"Перевірити пароль, вказаний у stdin, за допомогою файла_шаблонів\n"
+#, fuzzy
+#~| msgid "option \"%.50s\" is ambiguous\n"
+#~ msgid "key specification '%s' is ambiguous\n"
+#~ msgstr "параметр «%.50s» є неоднозначним\n"
+
+#~ msgid "%d signatures not checked due to missing keys\n"
+#~ msgstr "%d підпиÑів не перевірено через те, що немає ключів\n"
+
+#~ msgid "%d signatures not checked due to errors\n"
+#~ msgstr "%d підпиÑів не перевірено через помилки\n"
+
+#~ msgid "1 user ID without valid self-signature detected\n"
+#~ msgstr "виÑвлено 1 ідентифікатор кориÑтувача без коректного ÑамопідпиÑу\n"
+
+#~ msgid "Deleted %d signatures.\n"
+#~ msgstr "Вилучено %d підпиÑів.\n"
+
+#~ msgid "User ID \"%s\": %d signatures removed\n"
+#~ msgstr "Ідентифікатор кориÑтувача «%s»: вилучено %d підпиÑів\n"
+
+#~ msgid ""
+#~ "You need a Passphrase to protect your secret key.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Вам потрібен пароль Ð´Ð»Ñ Ð·Ð°Ñ…Ð¸Ñту вашого закритого ключа.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Please enter a passphrase to protect the off-card backup of the new "
+#~ "encryption key."
+#~ msgstr ""
+#~ "Будь лаÑка, вкажіть пароль Ð´Ð»Ñ Ð·Ð°Ñ…Ð¸Ñту позакарткової резервної копії "
+#~ "нового ключа шифруваннÑ."
+
+#~ msgid "passphrase not correctly repeated; try again"
+#~ msgstr "помилка під Ñ‡Ð°Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾Ð³Ð¾ Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ, повторіть Ñпробу"
+
+#~ msgid "%s.\n"
+#~ msgstr "%s.\n"
+
+#~ msgid ""
+#~ "You don't want a passphrase - this is probably a *bad* idea!\n"
+#~ "I will do it anyway. You can change your passphrase at any time,\n"
+#~ "using this program with the option \"--edit-key\".\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Ви не викориÑтовуєте Ð¿Ð°Ñ€Ð¾Ð»Ñ â€” дуже погана робота!\n"
+#~ "Вашу забаганку буде виконано. Пізніше ви зможете змінити пароль,\n"
+#~ "за допомогою цієї програми з параметром «--edit-key».\n"
+#~ "\n"
+
+#~ msgid "storing key onto card failed: %s\n"
+#~ msgstr "Ñпроба Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ ÐºÐ»ÑŽÑ‡Ð° на картці зазнала невдачі: %s\n"
+
+#~ msgid "1 good signature\n"
+#~ msgstr "1 добрий підпиÑ\n"
+
+#~ msgid "renaming '%s' to '%s' failed: %s\n"
+#~ msgstr "Ñпроба Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ð½Ð½Ñ Â«%s» на «%s» зазнала невдачі: %s\n"
+
+#~ msgid "%lu keys cached (%lu signatures)\n"
+#~ msgstr "кешовано %lu ключів (%lu підпиÑів)\n"
+
+#~ msgid "refreshing 1 key from %s\n"
+#~ msgstr "оновлюємо 1 ключ з %s\n"
+
+#~ msgid "sending key %s to %s server %s\n"
+#~ msgstr "надÑилаємо ключ %s до %s Ñервера %s\n"
+
+#~ msgid "public key %s is %lu seconds newer than the signature\n"
+#~ msgstr "відкритий ключ %s Ñ” на %lu Ñекунд новішим за підпиÑ\n"
+
+#~ msgid ""
+#~ "key %s was created %lu seconds in the future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "ключ %s було Ñтворено з позначкою на %lu Ñекунд у майбутньому (чаÑова "
+#~ "Ð¿ÐµÑ‚Ð»Ñ Ð°Ð±Ð¾ проблема з годинником)\n"
+
+#~ msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
+#~ msgstr "потрібно %d обмежених, потрібно %d повних, модель довіри %s\n"
+
#~ msgid "Failed to open the keyring DB.\n"
#~ msgstr "Ðе вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ базу даних Ñховища ключів.\n"
diff --git a/po/zh_CN.po b/po/zh_CN.po
index f2793db..c33a05d 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -1248,6 +1248,20 @@ msgstr ""
msgid "Enter passphrase: "
msgstr "请输入密ç ï¼š"
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "error getting version from '%s': %s\n"
+msgstr "建立钥匙环‘%s’时å‘生错误:%s\n"
+
+#, c-format
+msgid "server '%s' is older than us (%s < %s)"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "WARNING: "
+msgid "WARNING: %s\n"
+msgstr "警告:"
+
#, c-format
msgid "OpenPGP card not available: %s\n"
msgstr "OpenPGP å¡ä¸å¯ç”¨ï¼š%s\n"
@@ -1723,6 +1737,11 @@ msgstr "导出时清除密钥中的ä¸å¯ç”¨éƒ¨åˆ†"
msgid "remove as much as possible from key during export"
msgstr "导出时尽å¯èƒ½æ¸…除密钥中的å¯é€‰éƒ¨åˆ†"
+#, fuzzy
+#| msgid "%s: skipped: %s\n"
+msgid " - skipped"
+msgstr "%s:已跳过:%s\n"
+
msgid "exporting secret keys not allowed\n"
msgstr "ä¸å…许导出ç§é’¥\n"
@@ -1734,18 +1753,35 @@ msgstr "密钥 %s:PGP 2.x æ ·å¼çš„密钥――已跳过\n"
msgid "key %s: key material on-card - skipped\n"
msgstr "密钥 %s:密钥在å¡ä¸Šâ€”—已跳过\n"
-#, fuzzy
-#| msgid "%s: skipped: %s\n"
-msgid " - skipped"
-msgstr "%s:已跳过:%s\n"
-
msgid "WARNING: nothing exported\n"
msgstr "警告:没有导出任何东西\n"
+#, fuzzy, c-format
+#| msgid "error creating `%s': %s\n"
+msgid "error creating '%s': %s\n"
+msgstr "建立‘%s’时å‘生错误:%s\n"
+
msgid "[User ID not found]"
msgstr "[找ä¸åˆ°ç”¨æˆ·æ ‡è¯†]"
#, fuzzy, c-format
+msgid "(check argument of option '%s')\n"
+msgstr "无效的列表选项\n"
+
+#, c-format
+msgid "Warning: '%s' should be a long key ID or a fingerprint\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error looking up: %s\n"
+msgstr "‘%s’中出错:%s\n"
+
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "Warning: %s appears in the keyring %d times\n"
+msgstr "建立钥匙环‘%s’时å‘生错误:%s\n"
+
+#, fuzzy, c-format
#| msgid "automatically retrieved `%s' via %s\n"
msgid "automatically retrieved '%s' via %s\n"
msgstr "自动获å–‘%s’,通过 %s\n"
@@ -1763,15 +1799,20 @@ msgid "secret key \"%s\" not found: %s\n"
msgstr "找ä¸åˆ°ç§é’¥â€œ%sâ€ï¼š%s\n"
#, fuzzy, c-format
-msgid "(check argument of option '%s')\n"
-msgstr "无效的列表选项\n"
+#| msgid "unusable secret key"
+msgid "Warning: not using '%s' as default key: %s\n"
+msgstr "ä¸å¯ç”¨çš„ç§é’¥"
#, fuzzy, c-format
#| msgid "unusable secret key"
-msgid "using \"%s\" as default secret key\n"
+msgid "using \"%s\" as default secret key for signing\n"
msgstr "ä¸å¯ç”¨çš„ç§é’¥"
#, c-format
+msgid "all values passed to '%s' ignored\n"
+msgstr ""
+
+#, c-format
msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
msgstr "--allow-non-selfsigned-uid 使无效密钥 %s 生效\n"
@@ -2142,28 +2183,6 @@ msgid "Note: old default options file '%s' ignored\n"
msgstr "注æ„:旧å¼çš„默认é…置文件‘%s’已被忽略\n"
#, c-format
-msgid ""
-"Warning: value '%s' for option '%s' should be a long key ID or a "
-"fingerprint\n"
-msgstr ""
-
-#, c-format
-msgid "key specification '%s' is ambiguous\n"
-msgstr ""
-
-#. TRANSLATORS: The %s prints a key specification which
-#. for example has been given at the command line. Two
-#. lines with fingerprints are printed after this message.
-#, c-format
-msgid "'%s' matches at least:\n"
-msgstr ""
-
-#, fuzzy, c-format
-#| msgid "error creating keyring `%s': %s\n"
-msgid "error searching the keyring: %s\n"
-msgstr "建立钥匙环‘%s’时å‘生错误:%s\n"
-
-#, c-format
msgid "libgcrypt is too old (need %s, have %s)\n"
msgstr ""
@@ -2364,14 +2383,6 @@ msgstr "åˆå§‹åŒ–信任度数æ®åº“失败:%s\n"
msgid "WARNING: recipients (-r) given without using public key encryption\n"
msgstr "警告:给定了收件人(-r)但并未使用公钥加密\n"
-#, fuzzy, c-format
-msgid "option '%s' given, but no valid default keys given\n"
-msgstr "无效的‘%s’散列算法\n"
-
-#, fuzzy, c-format
-msgid "option '%s' given, but option '%s' not given\n"
-msgstr "无效的‘%s’散列算法\n"
-
msgid "--store [filename]"
msgstr "--store [文件å]"
@@ -2446,6 +2457,11 @@ msgstr "从公钥æœåŠ¡å™¨æŽ¥æ”¶å¤±è´¥ï¼š%s\n"
msgid "key export failed: %s\n"
msgstr "导出密钥失败:%s\n"
+#, fuzzy, c-format
+#| msgid "key export failed: %s\n"
+msgid "export as ssh key failed: %s\n"
+msgstr "导出密钥失败:%s\n"
+
#, c-format
msgid "keyserver search failed: %s\n"
msgstr "æœå¯»å…¬é’¥æœåŠ¡å™¨å¤±è´¥ï¼š%s\n"
@@ -2936,33 +2952,33 @@ msgstr "[åŠé”€]"
msgid "[self-signature]"
msgstr "[自身签å]"
-msgid "1 bad signature\n"
-msgstr "1 个æŸåçš„ç­¾å\n"
-
-#, c-format
-msgid "%d bad signatures\n"
-msgstr "%d 个æŸåçš„ç­¾å\n"
-
-msgid "1 signature not checked due to a missing key\n"
-msgstr "有 1 份签å因为é—失密钥而未被检查\n"
-
-#, c-format
-msgid "%d signatures not checked due to missing keys\n"
-msgstr "有 %d 份签å因为é—失密钥而未被检查\n"
-
-msgid "1 signature not checked due to an error\n"
-msgstr "有 1 份签å因为æŸä¸ªé”™è¯¯è€Œæœªè¢«æ£€æŸ¥\n"
+#, fuzzy, c-format
+#| msgid "%d bad signatures\n"
+msgid "%d bad signature\n"
+msgid_plural "%d bad signatures\n"
+msgstr[0] "%d 个æŸåçš„ç­¾å\n"
+msgstr[1] "%d 个æŸåçš„ç­¾å\n"
-#, c-format
-msgid "%d signatures not checked due to errors\n"
-msgstr "有 %d 份签å因为æŸäº›é”™è¯¯è€Œæœªè¢«æ£€æŸ¥\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to a missing key\n"
+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 份签å因为é—失密钥而未被检查\n"
+msgstr[1] "有 1 份签å因为é—失密钥而未被检查\n"
-msgid "1 user ID without valid self-signature detected\n"
-msgstr "检测到 1 个没有有效自身签å的用户标识\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to an error\n"
+msgid "%d signature not checked due to an error\n"
+msgid_plural "%d signatures not checked due to errors\n"
+msgstr[0] "有 1 份签å因为æŸä¸ªé”™è¯¯è€Œæœªè¢«æ£€æŸ¥\n"
+msgstr[1] "有 1 份签å因为æŸä¸ªé”™è¯¯è€Œæœªè¢«æ£€æŸ¥\n"
-#, c-format
-msgid "%d user IDs without valid self-signatures detected\n"
-msgstr "检测到 %d 个没有有效自身签å的用户标识\n"
+#, fuzzy, c-format
+#| msgid "%d user IDs without valid self-signatures detected\n"
+msgid "%d user ID without valid self-signature detected\n"
+msgid_plural "%d user IDs without valid self-signatures detected\n"
+msgstr[0] "检测到 %d 个没有有效自身签å的用户标识\n"
+msgstr[1] "检测到 %d 个没有有效自身签å的用户标识\n"
msgid ""
"Please decide how far you trust this user to correctly verify other users' "
@@ -3539,13 +3555,12 @@ msgstr "删除这个未知的签åå—?(y/N/q)"
msgid "Really delete this self-signature? (y/N)"
msgstr "真的è¦åˆ é™¤è¿™ä¸ªè‡ªèº«ç­¾åå—?(y/N)"
-#, c-format
+#, fuzzy, c-format
+#| msgid "Deleted %d signature.\n"
msgid "Deleted %d signature.\n"
-msgstr "å·²ç»åˆ é™¤äº† %d 个签å。\n"
-
-#, c-format
-msgid "Deleted %d signatures.\n"
-msgstr "å·²ç»åˆ é™¤äº† %d 个签å。\n"
+msgid_plural "Deleted %d signatures.\n"
+msgstr[0] "å·²ç»åˆ é™¤äº† %d 个签å。\n"
+msgstr[1] "å·²ç»åˆ é™¤äº† %d 个签å。\n"
msgid "Nothing deleted.\n"
msgstr "没有东西被删除。\n"
@@ -3559,11 +3574,9 @@ msgstr "用户标识“%sâ€ï¼šæ— ç”¨éƒ¨åˆ†å·²æ¸…除\n"
#, fuzzy, c-format
msgid "User ID \"%s\": %d signature removed\n"
-msgstr "密钥 %s:“%sâ€%d 个签å被清除\n"
-
-#, fuzzy, c-format
-msgid "User ID \"%s\": %d signatures removed\n"
-msgstr "密钥 %s:“%sâ€%d 个签å被清除\n"
+msgid_plural "User ID \"%s\": %d signatures removed\n"
+msgstr[0] "密钥 %s:“%sâ€%d 个签å被清除\n"
+msgstr[1] "密钥 %s:“%sâ€%d 个签å被清除\n"
#, fuzzy, c-format
msgid "User ID \"%s\": already minimized\n"
@@ -4089,37 +4102,6 @@ msgid "Please correct the error first\n"
msgstr "请先改正错误\n"
msgid ""
-"You need a Passphrase to protect your secret key.\n"
-"\n"
-msgstr ""
-"您需è¦ä¸€ä¸ªå¯†ç æ¥ä¿æŠ¤æ‚¨çš„ç§é’¥ã€‚\n"
-"\n"
-
-#, fuzzy
-msgid ""
-"Please enter a passphrase to protect the off-card backup of the new "
-"encryption key."
-msgstr "请输入密ç ï¼šè¿™æ˜¯ä¸€ä¸ªç§˜å¯†çš„å¥å­ \n"
-
-msgid "passphrase not correctly repeated; try again"
-msgstr "密ç å†æ¬¡è¾“入时与首次输入ä¸ç¬¦ï¼›è¯·å†è¯•ä¸€æ¬¡"
-
-#, c-format
-msgid "%s.\n"
-msgstr "%s.\n"
-
-msgid ""
-"You don't want a passphrase - this is probably a *bad* idea!\n"
-"I will do it anyway. You can change your passphrase at any time,\n"
-"using this program with the option \"--edit-key\".\n"
-"\n"
-msgstr ""
-"您ä¸æƒ³è¦æœ‰å¯†ç â€•â€•è¿™ä¸ªæƒ³æ³•å®žåœ¨æ˜¯é­é€äº†ï¼\n"
-"ä¸è¿‡ï¼Œæˆ‘ä»ç„¶ä¼šç…§æ‚¨æƒ³çš„去åšã€‚您任何时候都å¯ä»¥å˜æ›´æ‚¨çš„密ç ï¼Œä»…需è¦\n"
-"å†æ¬¡æ‰§è¡Œè¿™ä¸ªç¨‹åºï¼Œå¹¶ä¸”使用“--edit-keyâ€é€‰é¡¹å³å¯ã€‚\n"
-"\n"
-
-msgid ""
"We need to generate a lot of random bytes. It is a good idea to perform\n"
"some other action (type on the keyboard, move the mouse, utilize the\n"
"disks) during the prime generation; this gives the random number\n"
@@ -4165,6 +4147,16 @@ msgid "Key generation canceled.\n"
msgstr "密钥生æˆå·²å–消。\n"
#, fuzzy, c-format
+#| msgid "can't create backup file `%s': %s\n"
+msgid "can't create backup file '%s': %s\n"
+msgstr "ä¸èƒ½åˆ›å»ºå¤‡ä»½æ–‡ä»¶â€˜%s’:%s\n"
+
+#, fuzzy, c-format
+#| msgid "NOTE: backup of card key saved to `%s'\n"
+msgid "Note: backup of card key saved to '%s'\n"
+msgstr "注æ„:å¡å¯†é’¥çš„备份已ä¿å­˜åˆ°â€˜%s’\n"
+
+#, fuzzy, c-format
#| msgid "writing public key to `%s'\n"
msgid "writing public key to '%s'\n"
msgstr "正在将公钥写至`%s'\n"
@@ -4212,20 +4204,6 @@ msgstr "主钥的ç§é’¥éƒ¨åˆ†å­˜å‚¨åœ¨å¡ä¸Šã€‚\n"
msgid "Really create? (y/N) "
msgstr "真的è¦å»ºç«‹å—?(y/N)"
-#, c-format
-msgid "storing key onto card failed: %s\n"
-msgstr "å‘å¡ä¸Šå­˜å‚¨å¯†é’¥æ—¶å¤±è´¥ï¼š%s\n"
-
-#, fuzzy, c-format
-#| msgid "can't create backup file `%s': %s\n"
-msgid "can't create backup file '%s': %s\n"
-msgstr "ä¸èƒ½åˆ›å»ºå¤‡ä»½æ–‡ä»¶â€˜%s’:%s\n"
-
-#, fuzzy, c-format
-#| msgid "NOTE: backup of card key saved to `%s'\n"
-msgid "Note: backup of card key saved to '%s'\n"
-msgstr "注æ„:å¡å¯†é’¥çš„备份已ä¿å­˜åˆ°â€˜%s’\n"
-
msgid "never "
msgstr "æ°¸ä¸è¿‡æœŸ"
@@ -4244,19 +4222,18 @@ msgstr "关键签å注记:"
msgid "Signature notation: "
msgstr "ç­¾å注记:"
-#, fuzzy
-#| msgid "1 bad signature\n"
-msgid "1 good signature\n"
-msgstr "1 个æŸåçš„ç­¾å\n"
-
#, fuzzy, c-format
#| msgid "%d bad signatures\n"
-msgid "%d good signatures\n"
-msgstr "%d 个æŸåçš„ç­¾å\n"
+msgid "%d good signature\n"
+msgid_plural "%d good signatures\n"
+msgstr[0] "%d 个æŸåçš„ç­¾å\n"
+msgstr[1] "%d 个æŸåçš„ç­¾å\n"
#, c-format
-msgid "Warning: %lu key(s) skipped due to their large size\n"
-msgstr ""
+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] ""
msgid "Keyring"
msgstr "钥匙环"
@@ -4287,22 +4264,29 @@ msgid " Card serial no. ="
msgstr "å¡åºåˆ—å· ="
#, fuzzy, c-format
-#| msgid "renaming `%s' to `%s' failed: %s\n"
-msgid "renaming '%s' to '%s' failed: %s\n"
-msgstr "将‘%s’é‡å‘½å为‘%s’时失败:%s\n"
-
-#, fuzzy, c-format
#| msgid "caching keyring `%s'\n"
msgid "caching keyring '%s'\n"
msgstr "缓存钥匙环‘%s’\n"
-#, c-format
-msgid "%lu keys cached so far (%lu signatures)\n"
-msgstr "ç›®å‰å·²ç¼“å­˜ %lu 把密钥(%lu 份签å)\n"
+#, fuzzy, c-format
+#| msgid "%lu keys cached so far (%lu signatures)\n"
+msgid "%lu keys cached so far (%lu signature)\n"
+msgid_plural "%lu keys cached so far (%lu signatures)\n"
+msgstr[0] "ç›®å‰å·²ç¼“å­˜ %lu 把密钥(%lu 份签å)\n"
+msgstr[1] "ç›®å‰å·²ç¼“å­˜ %lu 把密钥(%lu 份签å)\n"
#, c-format
-msgid "%lu keys cached (%lu signatures)\n"
-msgstr "缓存了 %lu 把密钥(%lu 份签å)\n"
+msgid "%lu key cached"
+msgid_plural "%lu keys cached"
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+#| msgid "1 bad signature\n"
+msgid " (%lu signature)\n"
+msgid_plural " (%lu signatures)\n"
+msgstr[0] "1 个æŸåçš„ç­¾å\n"
+msgstr[1] "1 个æŸåçš„ç­¾å\n"
#, c-format
msgid "%s: keyring created\n"
@@ -4343,19 +4327,18 @@ msgstr "无效的公钥æœåŠ¡å™¨åè®®(us %d!=handler %d)\n"
msgid "\"%s\" not a key ID: skipping\n"
msgstr "“%sâ€ä¸æ˜¯ä¸€ä¸ªç”¨æˆ·æ ‡è¯†ï¼šè·³è¿‡\n"
-#, c-format
-msgid "refreshing 1 key from %s\n"
-msgstr "1 个密钥正从 %s 得到更新\n"
+#, fuzzy, c-format
+#| msgid "refreshing %d keys from %s\n"
+msgid "refreshing %d key from %s\n"
+msgid_plural "refreshing %d keys from %s\n"
+msgstr[0] "%d 个密钥正从 %s 得到更新\n"
+msgstr[1] "%d 个密钥正从 %s 得到更新\n"
#, c-format
msgid "WARNING: unable to refresh key %s via %s: %s\n"
msgstr "警告:无法更新密钥 %s,通过 %s:%s\n"
#, c-format
-msgid "refreshing %d keys from %s\n"
-msgstr "%d 个密钥正从 %s 得到更新\n"
-
-#, c-format
msgid "key \"%s\" not found on keyserver\n"
msgstr "在公钥æœåŠ¡å™¨ä¸Šæ‰¾ä¸åˆ°å¯†é’¥â€œ%sâ€\n"
@@ -4373,9 +4356,10 @@ msgstr "下载密钥‘%s’,从 %s æœåŠ¡å™¨ %s\n"
msgid "requesting key %s from %s\n"
msgstr "下载密钥 %s,从 %s\n"
-#, c-format
-msgid "sending key %s to %s server %s\n"
-msgstr "将密钥‘%s’上传到 %s æœåŠ¡å™¨ %s\n"
+#, fuzzy
+#| msgid "no keyserver action!\n"
+msgid "no keyserver known\n"
+msgstr "公钥æœåŠ¡å™¨æ— åŠ¨ä½œï¼\n"
#, c-format
msgid "sending key %s to %s\n"
@@ -4594,6 +4578,19 @@ msgstr "警告:ä¸å»ºè®®ä½¿ç”¨æ•£åˆ—算法 %s\n"
msgid "Note: signatures using the %s algorithm are rejected\n"
msgstr "%s ç­¾å,散列算法 %s\n"
+#, fuzzy, c-format
+#| msgid "read error in `%s': %s\n"
+msgid "(reported error: %s)\n"
+msgstr "读å–‘%s’错误:%s\n"
+
+#, fuzzy, c-format
+#| msgid "read error in `%s': %s\n"
+msgid "(reported error: %s <%s>)\n"
+msgstr "读å–‘%s’错误:%s\n"
+
+msgid "(further info: "
+msgstr ""
+
#, c-format
msgid "%s:%d: deprecated option \"%s\"\n"
msgstr "%s:%d:ä¸å»ºè®®ä½¿ç”¨è¯¥é€‰é¡¹â€œ%sâ€\n"
@@ -4989,6 +4986,19 @@ msgstr "%s:已跳过:公钥已被ç¦ç”¨\n"
msgid "%s: skipped: public key already present\n"
msgstr "%s: 已跳过:公钥已存在\n"
+#, fuzzy, c-format
+#| msgid "can't connect to `%s': %s\n"
+msgid "can't encrypt to '%s'\n"
+msgstr "无法连接至‘%s’:%s\n"
+
+#, fuzzy, c-format
+msgid "option '%s' given, but no valid default keys given\n"
+msgstr "无效的‘%s’散列算法\n"
+
+#, fuzzy, c-format
+msgid "option '%s' given, but option '%s' not given\n"
+msgstr "无效的‘%s’散列算法\n"
+
msgid "You did not specify a user ID. (you may use \"-r\")\n"
msgstr "您没有指定用户标识。(您å¯ä»¥åœ¨å‘½ä»¤è¡Œä¸­ç”¨â€œ-râ€æŒ‡å®š)\n"
@@ -5032,11 +5042,6 @@ msgstr "密钥 %s:没有有效的用户标识\n"
msgid "data not saved; use option \"--output\" to save it\n"
msgstr "æ•°æ®æœªè¢«ä¿å­˜ï¼›è¯·ç”¨â€œ--outputâ€é€‰é¡¹æ¥ä¿å­˜å®ƒä»¬\n"
-#, fuzzy, c-format
-#| msgid "error creating `%s': %s\n"
-msgid "error creating '%s': %s\n"
-msgstr "建立‘%s’时å‘生错误:%s\n"
-
msgid "Detached signature.\n"
msgstr "分离的签å。\n"
@@ -5128,19 +5133,31 @@ msgid "This is a revocation certificate for the OpenPGP key:"
msgstr "è¦ä¸ºè¿™æŠŠå¯†é’¥å»ºç«‹ä¸€ä»½åŠé”€è¯ä¹¦å—?(y/N)"
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 ""
+
+msgid ""
"Use it to revoke this key in case of a compromise or loss of\n"
"the secret key. However, if the secret key is still accessible,\n"
"it is better to generate a new revocation certificate and give\n"
-"a reason for the revocation."
+"a reason for the revocation. For details see the description of\n"
+"of the gpg command \"--gen-revoke\" in the GnuPG manual."
msgstr ""
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 making use of this revocation certificate."
+"before importing and publishing this revocation certificate."
msgstr ""
#, fuzzy, c-format
+#| msgid "Revocation certificate created.\n"
+msgid "revocation certificate stored as '%s.rev'\n"
+msgstr "已建立åŠé”€è¯ä¹¦ã€‚\n"
+
+#, fuzzy, c-format
#| msgid "secret key \"%s\" not found: %s\n"
msgid "secret key \"%s\" not found\n"
msgstr "找ä¸åˆ°ç§é’¥â€œ%sâ€ï¼š%s\n"
@@ -5152,6 +5169,11 @@ msgstr "找ä¸åˆ°ç§é’¥â€œ%sâ€ï¼š%s\n"
msgid "'%s' matches multiple secret keys:\n"
msgstr ""
+#, fuzzy, c-format
+#| msgid "error creating keyring `%s': %s\n"
+msgid "error searching the keyring: %s\n"
+msgstr "建立钥匙环‘%s’时å‘生错误:%s\n"
+
msgid "Create a revocation certificate for this key? (y/N) "
msgstr "è¦ä¸ºè¿™æŠŠå¯†é’¥å»ºç«‹ä¸€ä»½åŠé”€è¯ä¹¦å—?(y/N)"
@@ -5226,23 +5248,38 @@ msgstr "请å‚è§ %s 以得到更多信æ¯ã€‚\n"
msgid "WARNING: signing subkey %s has an invalid cross-certification\n"
msgstr "警告:签åçš„å­é’¥ %s 交å‰éªŒè¯æ— æ•ˆ\n"
-#, c-format
+#, fuzzy, c-format
+#| msgid "public key %s is %lu second newer than the signature\n"
msgid "public key %s is %lu second newer than the signature\n"
-msgstr "公钥 %s 在其签ååŽ %lu 秒生æˆ\n"
+msgid_plural "public key %s is %lu seconds newer than the signature\n"
+msgstr[0] "公钥 %s 在其签ååŽ %lu 秒生æˆ\n"
+msgstr[1] "公钥 %s 在其签ååŽ %lu 秒生æˆ\n"
-#, c-format
-msgid "public key %s is %lu seconds newer than the signature\n"
-msgstr "公钥 %s 在其签ååŽ %lu 秒生æˆ\n"
+#, fuzzy, c-format
+#| msgid "public key %s is %lu second newer than the signature\n"
+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] "公钥 %s 在其签ååŽ %lu 秒生æˆ\n"
+msgstr[1] "公钥 %s 在其签ååŽ %lu 秒生æˆ\n"
-#, c-format
+#, fuzzy, c-format
+#| msgid ""
+#| "key %s was created %lu second in the future (time warp or clock problem)\n"
msgid ""
"key %s was created %lu second in the future (time warp or clock problem)\n"
-msgstr "密钥 %s 是在 %lu 秒åŽçš„未æ¥ç”Ÿæˆçš„(å¯èƒ½æ˜¯å› ä¸ºæ—¶ç©ºæ‰­æ›²æˆ–时钟的问题)\n"
-
-#, c-format
-msgid ""
+msgid_plural ""
"key %s was created %lu seconds in the future (time warp or clock problem)\n"
-msgstr "密钥 %s 是在 %lu 秒åŽçš„未æ¥ç”Ÿæˆçš„(å¯èƒ½æ˜¯å› ä¸ºæ—¶ç©ºæ‰­æ›²æˆ–时钟的问题)\n"
+msgstr[0] "密钥 %s 是在 %lu 秒åŽçš„未æ¥ç”Ÿæˆçš„(å¯èƒ½æ˜¯å› ä¸ºæ—¶ç©ºæ‰­æ›²æˆ–时钟的问题)\n"
+msgstr[1] "密钥 %s 是在 %lu 秒åŽçš„未æ¥ç”Ÿæˆçš„(å¯èƒ½æ˜¯å› ä¸ºæ—¶ç©ºæ‰­æ›²æˆ–时钟的问题)\n"
+
+#, fuzzy, c-format
+#| msgid ""
+#| "key %s was created %lu second in the future (time warp or clock problem)\n"
+msgid "key %s was created %lu day in the future (time warp or clock problem)\n"
+msgid_plural ""
+"key %s was created %lu days in the future (time warp or clock problem)\n"
+msgstr[0] "密钥 %s 是在 %lu 秒åŽçš„未æ¥ç”Ÿæˆçš„(å¯èƒ½æ˜¯å› ä¸ºæ—¶ç©ºæ‰­æ›²æˆ–时钟的问题)\n"
+msgstr[1] "密钥 %s 是在 %lu 秒åŽçš„未æ¥ç”Ÿæˆçš„(å¯èƒ½æ˜¯å› ä¸ºæ—¶ç©ºæ‰­æ›²æˆ–时钟的问题)\n"
#, fuzzy, c-format
#| msgid "NOTE: signature key %s expired %s\n"
@@ -5468,6 +5505,238 @@ msgid "input line longer than %d characters\n"
msgstr "输入行长度超过 %d 字符\n"
#, fuzzy, c-format
+msgid "error beginning transaction on TOFU database: %s\n"
+msgstr "在‘%s’中寻找信任度记录时出错:%s\n"
+
+#, c-format
+msgid "error committing transaction on TOFU database: %s\n"
+msgstr ""
+
+#, c-format
+msgid "error rolling back transaction on TOFU database: %s\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "unsupported TOFU database version: %s\n"
+msgstr ""
+"\n"
+"支æŒçš„算法:\n"
+
+#, fuzzy, c-format
+msgid "error reading TOFU database: %s\n"
+msgstr "读å–‘%s’时出错:%s\n"
+
+#, fuzzy, c-format
+#| msgid "error writing secret keyring `%s': %s\n"
+msgid "error determining TOFU database's version: %s\n"
+msgstr "写入ç§é’¥é’¥åŒ™çŽ¯â€˜%s’时å‘生错误: %s\n"
+
+#, fuzzy, c-format
+#| msgid "%s: error writing dir record: %s\n"
+msgid "error initializing TOFU database: %s\n"
+msgstr "%s:写入目录记录时出错:%s\n"
+
+#, fuzzy, c-format
+msgid "error opening TOFU database '%s': %s\n"
+msgstr "‘%s’中出错:%s\n"
+
+msgid "Warning: Home directory contains both tofu.db and tofu.d.\n"
+msgstr ""
+
+msgid "Using split format for TOFU database\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error updating TOFU database: %s\n"
+msgstr "读å–‘%s’时出错:%s\n"
+
+#, c-format
+msgid "public key %s not found: %s\n"
+msgstr "找ä¸åˆ°å…¬é’¥ %s:%s\n"
+
+#, fuzzy, c-format
+msgid "error setting TOFU binding's trust level to %s\n"
+msgstr "读å–‘%s’时出错:%s\n"
+
+#, c-format
+msgid "The binding %s is NOT known."
+msgstr ""
+
+#, c-format
+msgid ""
+"The key %s raised a conflict with this binding (%s). Since this binding's "
+"policy was 'auto', it was changed to 'ask'."
+msgstr ""
+
+#, c-format
+msgid ""
+"Please indicate whether you believe the binding %s%sis legitimate (the key "
+"belongs to the stated owner) or a forgery (bad)."
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "error getting new PIN: %s\n"
+msgid "error gathering other user IDs: %s\n"
+msgstr "获å–æ–° PIN 时出错:%s\n"
+
+msgid "Known user IDs associated with this key:\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "validity: %s"
+msgid "policy: %s"
+msgstr "有效性:%s"
+
+#, fuzzy, c-format
+msgid "error gathering signature stats: %s\n"
+msgstr "获å–æ–° PIN 时出错:%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] ""
+msgstr[1] ""
+
+#, c-format
+msgid "Statistics for keys with the email address \"%s\":\n"
+msgstr ""
+
+#, fuzzy
+#| msgid "list keys"
+msgid "this key"
+msgstr "列出密钥"
+
+#, c-format
+msgid "%ld message signed in the future."
+msgid_plural "%ld messages signed in the future."
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+msgid "%ld message signed"
+msgid_plural "%ld messages signed"
+msgstr[0] "|算法 [文件]|使用指定的散列算法打å°æŠ¥æ–‡æ•£åˆ—值"
+msgstr[1] "|算法 [文件]|使用指定的散列算法打å°æŠ¥æ–‡æ•£åˆ—值"
+
+#, c-format
+msgid " over the past %ld day."
+msgid_plural " over the past %ld days."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid " over the past %ld week."
+msgid_plural " over the past %ld weeks."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid " over the past %ld month."
+msgid_plural " over the past %ld months."
+msgstr[0] ""
+msgstr[1] ""
+
+#. 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 ""
+
+#. 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 ""
+
+msgid "(G)ood, (A)ccept once, (U)nknown, (R)eject once, (B)ad? "
+msgstr ""
+
+#, fuzzy, c-format
+msgid "error changing TOFU policy: %s\n"
+msgstr "生æˆå¯†ç çš„时候å‘生错误:%s\n"
+
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "Have never verified a message signed by key %s!\n"
+msgstr ""
+
+#, c-format
+msgid "Failed to collect signature statistics for \"%s\" (key %s)\n"
+msgstr ""
+
+#, c-format
+msgid "Verified 0 messages signed by \"%s\" (key: %s, policy: %s)."
+msgstr ""
+
+#. TRANSLATORS: The final %s is replaced by a string like
+#. "7 months, 1 day, 5 minutes, 0 seconds".
+#, c-format
+msgid ""
+"Verified %ld message signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgid_plural ""
+"Verified %ld messages signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "The most recent message was verified %s ago."
+msgstr ""
+
+msgid "Warning: we've have yet to see a message signed by this key!\n"
+msgstr ""
+
+msgid "Warning: we've only seen a single message signed by this key!\n"
+msgstr ""
+
+#. TRANSLATORS: translate the below text. We don't
+#. directly internationalize that text so that we can
+#. tweak it without breaking translations.
+#, c-format
+msgid "TOFU: few signatures %d message %s"
+msgid_plural "TOFU: few signatures %d messages %s"
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+msgid "error opening TOFU database: %s\n"
+msgstr "读å–‘%s’时出错:%s\n"
+
+#, fuzzy, c-format
#| msgid "`%s' is not a valid long keyID\n"
msgid "'%s' is not a valid long keyID\n"
msgstr "‘%s’ä¸æ˜¯ä¸€ä¸ªæœ‰æ•ˆçš„é•¿å¼é’¥åŒ™å·\n"
@@ -5527,19 +5796,25 @@ msgstr "使用‘%s’信任模型时ä¸éœ€è¦æ£€æŸ¥ä¿¡ä»»åº¦æ•°æ®åº“\n"
msgid "no need for a trustdb update with '%s' trust model\n"
msgstr "使用‘%s’信任模型时ä¸éœ€è¦æ›´æ–°ä¿¡ä»»åº¦æ•°æ®åº“\n"
-#, c-format
-msgid "public key %s not found: %s\n"
-msgstr "找ä¸åˆ°å…¬é’¥ %s:%s\n"
-
msgid "please do a --check-trustdb\n"
msgstr "请执行一次 --check-trustdb\n"
msgid "checking the trustdb\n"
msgstr "正在检查信任度数æ®åº“\n"
-#, c-format
-msgid "%d keys processed (%d validity counts cleared)\n"
-msgstr "å·²ç»å¤„ç†äº† %d 把密钥(共计已解决了 %d 份的有效性)\n"
+#, fuzzy, c-format
+#| msgid "%lu keys processed so far\n"
+msgid "%d key processed"
+msgid_plural "%d keys processed"
+msgstr[0] "ç›®å‰å·²å¤„ç† %lu 把密钥\n"
+msgstr[1] "ç›®å‰å·²å¤„ç† %lu 把密钥\n"
+
+#, fuzzy, c-format
+#| msgid "%d keys processed (%d validity counts cleared)\n"
+msgid " (%d validity count cleared)\n"
+msgid_plural " (%d validity counts cleared)\n"
+msgstr[0] "å·²ç»å¤„ç†äº† %d 把密钥(共计已解决了 %d 份的有效性)\n"
+msgstr[1] "å·²ç»å¤„ç†äº† %d 把密钥(共计已解决了 %d 份的有效性)\n"
msgid "no ultimately trusted keys found\n"
msgstr "没有找到任何ç»å¯¹ä¿¡ä»»çš„密钥\n"
@@ -5549,10 +5824,6 @@ msgid "public key of ultimately trusted key %s not found\n"
msgstr "ç»å¯¹ä¿¡ä»»çš„密钥 %s 的公钥未被找到\n"
#, c-format
-msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
-msgstr "éœ€è¦ %d 份勉强信任和 %d 份完全信任,%s 信任模型\n"
-
-#, c-format
msgid ""
"depth: %d valid: %3d signed: %3d trust: %d-, %dq, %dn, %dm, %df, %du\n"
msgstr ""
@@ -5751,9 +6022,13 @@ msgstr "从å¡ä¸­èŽ·å– CHV 状æ€æ—¶å‡ºé”™\n"
msgid "card is permanently locked!\n"
msgstr "å¡è¢«æ°¸ä¹…é”定ï¼\n"
-#, c-format
-msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
-msgstr "å°è¯•ç®¡ç†å‘˜ PIN %d 次åŽï¼Œå¡å°†è¢«æ°¸ä¹…é”定ï¼\n"
+#, fuzzy, c-format
+#| msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
+msgid "%d Admin PIN attempt remaining before card is permanently locked\n"
+msgid_plural ""
+"%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr[0] "å°è¯•ç®¡ç†å‘˜ PIN %d 次åŽï¼Œå¡å°†è¢«æ°¸ä¹…é”定ï¼\n"
+msgstr[1] "å°è¯•ç®¡ç†å‘˜ PIN %d 次åŽï¼Œå¡å°†è¢«æ°¸ä¹…é”定ï¼\n"
#. TRANSLATORS: Do not translate the "|A|" prefix but keep it at
#. the start of the string. Use %%0A to force a linefeed.
@@ -5837,9 +6112,12 @@ msgstr "请ç¨å€™ï¼Œæ­£åœ¨ç”Ÿæˆå¯†é’¥â€¦â€¦\n"
msgid "generating key failed\n"
msgstr "生æˆå¯†é’¥å¤±è´¥\n"
-#, c-format
-msgid "key generation completed (%d seconds)\n"
-msgstr "密钥已生æˆ(耗时 %d 秒)\n"
+#, fuzzy, c-format
+#| msgid "key generation completed (%d seconds)\n"
+msgid "key generation completed (%d second)\n"
+msgid_plural "key generation completed (%d seconds)\n"
+msgstr[0] "密钥已生æˆ(耗时 %d 秒)\n"
+msgstr[1] "密钥已生æˆ(耗时 %d 秒)\n"
msgid "invalid structure of OpenPGP card (DO 0x93)\n"
msgstr "无效的 OpenPGP å¡ç»“æž„(D0 0x93)\n"
@@ -8058,6 +8336,9 @@ msgstr "从导出的å­é’¥ä¸­åˆ é™¤æ‰€æœ‰å¯†ç "
msgid "do not allow the reuse of old passphrases"
msgstr "生æˆå¯†ç çš„时候å‘生错误:%s\n"
+msgid "|N|set the Pinentry timeout to N seconds"
+msgstr ""
+
msgid "|NAME|use NAME as default secret key"
msgstr ""
@@ -8353,6 +8634,85 @@ msgid ""
"Check a passphrase given on stdin against the patternfile\n"
msgstr ""
+#~ msgid "%d signatures not checked due to missing keys\n"
+#~ msgstr "有 %d 份签å因为é—失密钥而未被检查\n"
+
+#~ msgid "%d signatures not checked due to errors\n"
+#~ msgstr "有 %d 份签å因为æŸäº›é”™è¯¯è€Œæœªè¢«æ£€æŸ¥\n"
+
+#~ msgid "1 user ID without valid self-signature detected\n"
+#~ msgstr "检测到 1 个没有有效自身签å的用户标识\n"
+
+#~ msgid "Deleted %d signatures.\n"
+#~ msgstr "å·²ç»åˆ é™¤äº† %d 个签å。\n"
+
+#, fuzzy
+#~ msgid "User ID \"%s\": %d signatures removed\n"
+#~ msgstr "密钥 %s:“%sâ€%d 个签å被清除\n"
+
+#~ msgid ""
+#~ "You need a Passphrase to protect your secret key.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "您需è¦ä¸€ä¸ªå¯†ç æ¥ä¿æŠ¤æ‚¨çš„ç§é’¥ã€‚\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "Please enter a passphrase to protect the off-card backup of the new "
+#~ "encryption key."
+#~ msgstr "请输入密ç ï¼šè¿™æ˜¯ä¸€ä¸ªç§˜å¯†çš„å¥å­ \n"
+
+#~ msgid "passphrase not correctly repeated; try again"
+#~ msgstr "密ç å†æ¬¡è¾“入时与首次输入ä¸ç¬¦ï¼›è¯·å†è¯•ä¸€æ¬¡"
+
+#~ msgid "%s.\n"
+#~ msgstr "%s.\n"
+
+#~ msgid ""
+#~ "You don't want a passphrase - this is probably a *bad* idea!\n"
+#~ "I will do it anyway. You can change your passphrase at any time,\n"
+#~ "using this program with the option \"--edit-key\".\n"
+#~ "\n"
+#~ msgstr ""
+#~ "您ä¸æƒ³è¦æœ‰å¯†ç â€•â€•è¿™ä¸ªæƒ³æ³•å®žåœ¨æ˜¯é­é€äº†ï¼\n"
+#~ "ä¸è¿‡ï¼Œæˆ‘ä»ç„¶ä¼šç…§æ‚¨æƒ³çš„去åšã€‚您任何时候都å¯ä»¥å˜æ›´æ‚¨çš„密ç ï¼Œä»…需è¦\n"
+#~ "å†æ¬¡æ‰§è¡Œè¿™ä¸ªç¨‹åºï¼Œå¹¶ä¸”使用“--edit-keyâ€é€‰é¡¹å³å¯ã€‚\n"
+#~ "\n"
+
+#~ msgid "storing key onto card failed: %s\n"
+#~ msgstr "å‘å¡ä¸Šå­˜å‚¨å¯†é’¥æ—¶å¤±è´¥ï¼š%s\n"
+
+#, fuzzy
+#~| msgid "1 bad signature\n"
+#~ msgid "1 good signature\n"
+#~ msgstr "1 个æŸåçš„ç­¾å\n"
+
+#, fuzzy
+#~| msgid "renaming `%s' to `%s' failed: %s\n"
+#~ msgid "renaming '%s' to '%s' failed: %s\n"
+#~ msgstr "将‘%s’é‡å‘½å为‘%s’时失败:%s\n"
+
+#~ msgid "%lu keys cached (%lu signatures)\n"
+#~ msgstr "缓存了 %lu 把密钥(%lu 份签å)\n"
+
+#~ msgid "refreshing 1 key from %s\n"
+#~ msgstr "1 个密钥正从 %s 得到更新\n"
+
+#~ msgid "sending key %s to %s server %s\n"
+#~ msgstr "将密钥‘%s’上传到 %s æœåŠ¡å™¨ %s\n"
+
+#~ msgid "public key %s is %lu seconds newer than the signature\n"
+#~ msgstr "公钥 %s 在其签ååŽ %lu 秒生æˆ\n"
+
+#~ msgid ""
+#~ "key %s was created %lu seconds in the future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr "密钥 %s 是在 %lu 秒åŽçš„未æ¥ç”Ÿæˆçš„(å¯èƒ½æ˜¯å› ä¸ºæ—¶ç©ºæ‰­æ›²æˆ–时钟的问题)\n"
+
+#~ msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
+#~ msgstr "éœ€è¦ %d 份勉强信任和 %d 份完全信任,%s 信任模型\n"
+
#, fuzzy
#~| msgid "can't open the keyring"
#~ msgid "Failed to open the keyring DB.\n"
@@ -8587,9 +8947,6 @@ msgstr ""
#~ msgid "searching for \"%s\" from %s\n"
#~ msgstr "æœç´¢â€œ%sâ€ï¼Œåœ¨ %s 上\n"
-#~ msgid "no keyserver action!\n"
-#~ msgstr "公钥æœåŠ¡å™¨æ— åŠ¨ä½œï¼\n"
-
#~ msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n"
#~ msgstr "警告:处ç†å…¬é’¥æœåŠ¡å™¨çš„程åºæ¥è‡ªä¸åŒç‰ˆæœ¬çš„ GnuPG (%s)\n"
@@ -9264,9 +9621,6 @@ msgstr ""
#~ msgid "ERROR: "
#~ msgstr "错误:"
-#~ msgid "WARNING: "
-#~ msgstr "警告:"
-
#~ msgid "... this is a bug (%s:%d:%s)\n"
#~ msgstr "……这是个程åºç¼ºé™·(%s:%d:%s)\n"
diff --git a/po/zh_TW.po b/po/zh_TW.po
index 2170e0b..a0879c1 100644
--- a/po/zh_TW.po
+++ b/po/zh_TW.po
@@ -1165,6 +1165,20 @@ msgstr "以 %s 代ç†ä¼ºæœå™¨æŸ¥è©¢ç”¨æˆ¶ç«¯æ™‚失敗\n"
msgid "Enter passphrase: "
msgstr "請輸入密語: "
+#, fuzzy, c-format
+#| msgid "error creating keyring '%s': %s\n"
+msgid "error getting version from '%s': %s\n"
+msgstr "建立鑰匙圈 '%s' 時出錯: %s\n"
+
+#, c-format
+msgid "server '%s' is older than us (%s < %s)"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "WARNING: %s overrides %s\n"
+msgid "WARNING: %s\n"
+msgstr "警告: %s 會推翻 %s\n"
+
#, c-format
msgid "OpenPGP card not available: %s\n"
msgstr "沒有å¯ç”¨çš„ OpenPGP å¡ç‰‡: %s\n"
@@ -1624,6 +1638,9 @@ msgstr "匯出時從金鑰中移除無法使用的部分"
msgid "remove as much as possible from key during export"
msgstr "匯出時盡å¯èƒ½åœ°å¾žé‡‘鑰中移除"
+msgid " - skipped"
+msgstr " - 已跳éŽ"
+
msgid "exporting secret keys not allowed\n"
msgstr "ä¸å…許匯出ç§é‘°\n"
@@ -1635,15 +1652,35 @@ msgstr "金鑰 %s: PGP 2.x 型態的金鑰 - 已跳éŽ\n"
msgid "key %s: key material on-card - skipped\n"
msgstr "金鑰 %s: 金鑰資料在å¡ç‰‡ä¸Š - 已跳éŽ\n"
-msgid " - skipped"
-msgstr " - 已跳éŽ"
-
msgid "WARNING: nothing exported\n"
msgstr "警告: 沒有匯出任何æ±è¥¿\n"
+#, c-format
+msgid "error creating '%s': %s\n"
+msgstr "建立 '%s' 時出錯: %s\n"
+
msgid "[User ID not found]"
msgstr "[找ä¸åˆ°ä½¿ç”¨è€… ID]"
+#, fuzzy, c-format
+#| msgid "missing argument for option \"%.50s\"\n"
+msgid "(check argument of option '%s')\n"
+msgstr "\"%.50s\" é¸é …éºå¤±äº†å¼•æ•¸\n"
+
+#, c-format
+msgid "Warning: '%s' should be a long key ID or a fingerprint\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "error closing %s: %s\n"
+msgid "error looking up: %s\n"
+msgstr "關閉 %s 時出錯: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error creating keyring '%s': %s\n"
+msgid "Warning: %s appears in the keyring %d times\n"
+msgstr "建立鑰匙圈 '%s' 時出錯: %s\n"
+
#, c-format
msgid "automatically retrieved '%s' via %s\n"
msgstr "已自動å–回 '%s' (經由 %s )\n"
@@ -1660,16 +1697,20 @@ msgid "secret key \"%s\" not found: %s\n"
msgstr "找ä¸åˆ°ç§é‘° \"%s\": %s\n"
#, fuzzy, c-format
-#| msgid "missing argument for option \"%.50s\"\n"
-msgid "(check argument of option '%s')\n"
-msgstr "\"%.50s\" é¸é …éºå¤±äº†å¼•æ•¸\n"
+#| msgid "|NAME|use NAME as default secret key"
+msgid "Warning: not using '%s' as default key: %s\n"
+msgstr "|åå­—|使用指定åå­—åšç‚ºé è¨­ç§é‘°"
#, fuzzy, c-format
#| msgid "|NAME|use NAME as default secret key"
-msgid "using \"%s\" as default secret key\n"
+msgid "using \"%s\" as default secret key for signing\n"
msgstr "|åå­—|使用指定åå­—åšç‚ºé è¨­ç§é‘°"
#, c-format
+msgid "all values passed to '%s' ignored\n"
+msgstr ""
+
+#, c-format
msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
msgstr "無效的金鑰 %s å¯ä»¥è—‰ç”± --allow-non-selfsigned-uid 而生效\n"
@@ -2001,29 +2042,6 @@ msgid "Note: old default options file '%s' ignored\n"
msgstr "請注æ„: 已忽略舊有的é è¨­é¸é …檔 '%s'\n"
#, c-format
-msgid ""
-"Warning: value '%s' for option '%s' should be a long key ID or a "
-"fingerprint\n"
-msgstr ""
-
-#, fuzzy, c-format
-#| msgid "option \"%.50s\" is ambiguous\n"
-msgid "key specification '%s' is ambiguous\n"
-msgstr "\"%.50s\" é¸é …ä¸æ˜Žç¢º\n"
-
-#. TRANSLATORS: The %s prints a key specification which
-#. for example has been given at the command line. Two
-#. lines with fingerprints are printed after this message.
-#, c-format
-msgid "'%s' matches at least:\n"
-msgstr ""
-
-#, fuzzy, c-format
-#| msgid "error creating keyring '%s': %s\n"
-msgid "error searching the keyring: %s\n"
-msgstr "建立鑰匙圈 '%s' 時出錯: %s\n"
-
-#, c-format
msgid "libgcrypt is too old (need %s, have %s)\n"
msgstr "libgcrypt 太舊了 (éœ€è¦ %s, 但是祇有 %s)\n"
@@ -2215,16 +2233,6 @@ msgstr "信任資料庫啟始失敗: %s\n"
msgid "WARNING: recipients (-r) given without using public key encryption\n"
msgstr "警告: 給定的收件者 (-r) 未使用公鑰加密\n"
-#, fuzzy, c-format
-#| msgid "line %d: invalid date given\n"
-msgid "option '%s' given, but no valid default keys given\n"
-msgstr "第 %d 列: 無效的給定日期\n"
-
-#, fuzzy, c-format
-#| msgid "line %d: invalid date given\n"
-msgid "option '%s' given, but option '%s' not given\n"
-msgstr "第 %d 列: 無效的給定日期\n"
-
msgid "--store [filename]"
msgstr "--store [檔å]"
@@ -2297,6 +2305,11 @@ msgstr "從金鑰伺æœå™¨æŽ¥æ”¶å¤±æ•—: %s\n"
msgid "key export failed: %s\n"
msgstr "金鑰匯出失敗: %s\n"
+#, fuzzy, c-format
+#| msgid "key export failed: %s\n"
+msgid "export as ssh key failed: %s\n"
+msgstr "金鑰匯出失敗: %s\n"
+
#, c-format
msgid "keyserver search failed: %s\n"
msgstr "用金鑰伺æœå™¨æœå°‹å¤±æ•—: %s\n"
@@ -2777,33 +2790,29 @@ msgstr "[撤銷]"
msgid "[self-signature]"
msgstr "[自我簽章]"
-msgid "1 bad signature\n"
-msgstr "1 份æ壞的簽章\n"
-
-#, c-format
-msgid "%d bad signatures\n"
-msgstr "%d 份æ壞的簽章\n"
-
-msgid "1 signature not checked due to a missing key\n"
-msgstr "有 1 份簽章因為éºå¤±é‡‘鑰而未被檢查\n"
-
-#, c-format
-msgid "%d signatures not checked due to missing keys\n"
-msgstr "有 %d 份簽章因為éºå¤±é‡‘鑰而未被檢查\n"
-
-msgid "1 signature not checked due to an error\n"
-msgstr "有 1 份簽章因錯誤而未被檢查\n"
+#, fuzzy, c-format
+#| msgid "%d bad signatures\n"
+msgid "%d bad signature\n"
+msgid_plural "%d bad signatures\n"
+msgstr[0] "%d 份æ壞的簽章\n"
-#, c-format
-msgid "%d signatures not checked due to errors\n"
-msgstr "有 %d 份簽章因錯誤而未被檢查\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to a missing key\n"
+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 份簽章因為éºå¤±é‡‘鑰而未被檢查\n"
-msgid "1 user ID without valid self-signature detected\n"
-msgstr "åµæ¸¬åˆ° 1 個沒有有效自我簽章的使用者 ID\n"
+#, fuzzy, c-format
+#| msgid "1 signature not checked due to an error\n"
+msgid "%d signature not checked due to an error\n"
+msgid_plural "%d signatures not checked due to errors\n"
+msgstr[0] "有 1 份簽章因錯誤而未被檢查\n"
-#, c-format
-msgid "%d user IDs without valid self-signatures detected\n"
-msgstr "åµæ¸¬åˆ° %d 個沒有有效自我簽章的使用者 ID\n"
+#, fuzzy, c-format
+#| msgid "%d user IDs without valid self-signatures detected\n"
+msgid "%d user ID without valid self-signature detected\n"
+msgid_plural "%d user IDs without valid self-signatures detected\n"
+msgstr[0] "åµæ¸¬åˆ° %d 個沒有有效自我簽章的使用者 ID\n"
msgid ""
"Please decide how far you trust this user to correctly verify other users' "
@@ -3369,13 +3378,11 @@ msgstr "刪除這份未知的簽章嗎? (y/N/q)"
msgid "Really delete this self-signature? (y/N)"
msgstr "真的è¦åˆªé™¤é€™ä»½è‡ªæˆ‘簽章嗎? (y/N)"
-#, c-format
+#, fuzzy, c-format
+#| msgid "Deleted %d signature.\n"
msgid "Deleted %d signature.\n"
-msgstr "已經刪除了 %d 份簽章.\n"
-
-#, c-format
-msgid "Deleted %d signatures.\n"
-msgstr "已經刪除了 %d 份簽章.\n"
+msgid_plural "Deleted %d signatures.\n"
+msgstr[0] "已經刪除了 %d 份簽章.\n"
msgid "Nothing deleted.\n"
msgstr "沒有刪除任何æ±è¥¿.\n"
@@ -3387,13 +3394,11 @@ msgstr "無效"
msgid "User ID \"%s\" compacted: %s\n"
msgstr "使用者 ID \"%s\" 已精簡: %s\n"
-#, c-format
+#, fuzzy, c-format
+#| msgid "User ID \"%s\": %d signature removed\n"
msgid "User ID \"%s\": %d signature removed\n"
-msgstr "使用者 ID \"%s\": 已移除 %d 份簽章\n"
-
-#, c-format
-msgid "User ID \"%s\": %d signatures removed\n"
-msgstr "使用者 ID \"%s\": 已移除 %d 份簽章\n"
+msgid_plural "User ID \"%s\": %d signatures removed\n"
+msgstr[0] "使用者 ID \"%s\": 已移除 %d 份簽章\n"
#, c-format
msgid "User ID \"%s\": already minimized\n"
@@ -3903,36 +3908,6 @@ msgid "Please correct the error first\n"
msgstr "請先訂正錯誤\n"
msgid ""
-"You need a Passphrase to protect your secret key.\n"
-"\n"
-msgstr ""
-"你需è¦ä¸€å€‹å¯†èªžä¾†ä¿è­·ä½ çš„ç§é‘°.\n"
-"\n"
-
-msgid ""
-"Please enter a passphrase to protect the off-card backup of the new "
-"encryption key."
-msgstr "請輸入密語以ä¿è­·æ–°åŠ å¯†é‡‘é‘°çš„å¡ç‰‡å¤–備份."
-
-msgid "passphrase not correctly repeated; try again"
-msgstr "å‰å¾Œå…©æ¬¡è¼¸å…¥çš„密語ä¸ä¸€è‡´; è«‹å†è©¦ä¸€æ¬¡"
-
-#, c-format
-msgid "%s.\n"
-msgstr "%s.\n"
-
-msgid ""
-"You don't want a passphrase - this is probably a *bad* idea!\n"
-"I will do it anyway. You can change your passphrase at any time,\n"
-"using this program with the option \"--edit-key\".\n"
-"\n"
-msgstr ""
-"ä½ ä¸æƒ³è¦æœ‰å¯†èªž - 這個想法實在是 **é­é€äº†**!\n"
-"我ä»ç„¶æœƒç…§ä½ æƒ³çš„去åš. 你任何時候都å¯ä»¥è®Šæ›´ä½ çš„密語,\n"
-"僅需è¦å†æ¬¡åŸ·è¡Œé€™å€‹ç¨‹å¼, 並且使用 \"--edit-key\" é¸é …å³å¯.\n"
-"\n"
-
-msgid ""
"We need to generate a lot of random bytes. It is a good idea to perform\n"
"some other action (type on the keyboard, move the mouse, utilize the\n"
"disks) during the prime generation; this gives the random number\n"
@@ -3977,6 +3952,14 @@ msgid "Key generation canceled.\n"
msgstr "金鑰產生已å–消.\n"
#, c-format
+msgid "can't create backup file '%s': %s\n"
+msgstr "無法建立備份檔案 '%s': %s\n"
+
+#, c-format
+msgid "Note: backup of card key saved to '%s'\n"
+msgstr "請注æ„: å¡ç‰‡é‡‘鑰的備份已儲存至 '%s'\n"
+
+#, c-format
msgid "writing public key to '%s'\n"
msgstr "正在寫入公鑰至 '%s'\n"
@@ -4020,18 +4003,6 @@ msgstr "主鑰的ç§é‘°éƒ¨åˆ†å­˜æ”¾æ–¼å¡ä¸Š.\n"
msgid "Really create? (y/N) "
msgstr "真的è¦å»ºç«‹å—Ž? (y/N) "
-#, c-format
-msgid "storing key onto card failed: %s\n"
-msgstr "儲存金鑰到å¡ç‰‡ä¸Šæ™‚失敗: %s\n"
-
-#, c-format
-msgid "can't create backup file '%s': %s\n"
-msgstr "無法建立備份檔案 '%s': %s\n"
-
-#, c-format
-msgid "Note: backup of card key saved to '%s'\n"
-msgstr "請注æ„: å¡ç‰‡é‡‘鑰的備份已儲存至 '%s'\n"
-
msgid "never "
msgstr "æ°¸é ä¸éŽæœŸ"
@@ -4050,19 +4021,17 @@ msgstr "é—œéµç°½ç« è¨»è¨˜: "
msgid "Signature notation: "
msgstr "簽章註記: "
-#, fuzzy
-#| msgid "1 bad signature\n"
-msgid "1 good signature\n"
-msgstr "1 份æ壞的簽章\n"
-
#, fuzzy, c-format
#| msgid "%d bad signatures\n"
-msgid "%d good signatures\n"
-msgstr "%d 份æ壞的簽章\n"
+msgid "%d good signature\n"
+msgid_plural "%d good signatures\n"
+msgstr[0] "%d 份æ壞的簽章\n"
-#, c-format
-msgid "Warning: %lu key(s) skipped due to their large size\n"
-msgstr "警告: %lu 把金鑰因尺寸太大已跳éŽ\n"
+#, fuzzy, c-format
+#| msgid "Warning: %lu key(s) skipped due to their large size\n"
+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] "警告: %lu 把金鑰因尺寸太大已跳éŽ\n"
msgid "Keyring"
msgstr "鑰匙圈"
@@ -4093,20 +4062,26 @@ msgid " Card serial no. ="
msgstr " å¡ç‰‡åºè™Ÿ ="
#, c-format
-msgid "renaming '%s' to '%s' failed: %s\n"
-msgstr "把 '%s' é‡æ–°æ–°å‘½æˆ '%s' 時失敗: %s\n"
-
-#, c-format
msgid "caching keyring '%s'\n"
msgstr "å¿«å–鑰匙圈 '%s' 中\n"
-#, c-format
-msgid "%lu keys cached so far (%lu signatures)\n"
-msgstr "ç›®å‰å·²æª¢æŸ¥ %lu 把金鑰 (å…± %lu 份簽章)\n"
+#, fuzzy, c-format
+#| msgid "%lu keys cached so far (%lu signatures)\n"
+msgid "%lu keys cached so far (%lu signature)\n"
+msgid_plural "%lu keys cached so far (%lu signatures)\n"
+msgstr[0] "ç›®å‰å·²æª¢æŸ¥ %lu 把金鑰 (å…± %lu 份簽章)\n"
-#, c-format
-msgid "%lu keys cached (%lu signatures)\n"
-msgstr "已檢查 %lu 把金鑰 (共 %lu 份簽章)\n"
+#, fuzzy, c-format
+#| msgid "flush the cache"
+msgid "%lu key cached"
+msgid_plural "%lu keys cached"
+msgstr[0] "清除快å–"
+
+#, fuzzy, c-format
+#| msgid "1 bad signature\n"
+msgid " (%lu signature)\n"
+msgid_plural " (%lu signatures)\n"
+msgstr[0] "1 份æ壞的簽章\n"
#, c-format
msgid "%s: keyring created\n"
@@ -4147,19 +4122,17 @@ msgstr "無效的金鑰伺æœå™¨å”定 (我們用 %d!=ç¶“æ‰‹ç¨‹å¼ %d)\n"
msgid "\"%s\" not a key ID: skipping\n"
msgstr "\"%s\" 並éžé‡‘é‘° ID: è·³éŽä¸­\n"
-#, c-format
-msgid "refreshing 1 key from %s\n"
-msgstr "更新 1 份金鑰中 (從 %s )\n"
+#, fuzzy, c-format
+#| msgid "refreshing %d keys from %s\n"
+msgid "refreshing %d key from %s\n"
+msgid_plural "refreshing %d keys from %s\n"
+msgstr[0] "更新 %d 份金鑰中 (從 %s )\n"
#, c-format
msgid "WARNING: unable to refresh key %s via %s: %s\n"
msgstr "警告: 無法更新金鑰 %s 於 %s: %s\n"
#, c-format
-msgid "refreshing %d keys from %s\n"
-msgstr "更新 %d 份金鑰中 (從 %s )\n"
-
-#, c-format
msgid "key \"%s\" not found on keyserver\n"
msgstr "在金鑰伺æœå™¨ä¸Šæ‰¾ä¸åˆ°é‡‘é‘° \"%s\"\n"
@@ -4177,9 +4150,10 @@ msgstr "正在請求金鑰 %s 自 %s 伺æœå™¨ %s\n"
msgid "requesting key %s from %s\n"
msgstr "正在請求金鑰 %s 自 %s\n"
-#, c-format
-msgid "sending key %s to %s server %s\n"
-msgstr "éžé€é‡‘é‘° %s 至 %s 伺æœå™¨ %s\n"
+#, fuzzy
+#| msgid "invalid keyserver options\n"
+msgid "no keyserver known\n"
+msgstr "無效的金鑰伺æœå™¨é¸é …\n"
#, c-format
msgid "sending key %s to %s\n"
@@ -4389,6 +4363,19 @@ msgstr "警告: å·²ä¸å»ºè­°ä½¿ç”¨ %s 摘è¦æ¼”算法\n"
msgid "Note: signatures using the %s algorithm are rejected\n"
msgstr "請注æ„: 採用 %s 演算法的簽章已é­é§å›ž\n"
+#, fuzzy, c-format
+#| msgid "%s:%u: read error: %s\n"
+msgid "(reported error: %s)\n"
+msgstr "%s:%u: 讀å–錯誤: %s\n"
+
+#, fuzzy, c-format
+#| msgid "read error in '%s': %s\n"
+msgid "(reported error: %s <%s>)\n"
+msgstr "'%s' 讀å–錯誤: %s\n"
+
+msgid "(further info: "
+msgstr ""
+
#, c-format
msgid "%s:%d: deprecated option \"%s\"\n"
msgstr "%s:%d: ä¸å»ºè­°ä½¿ç”¨çš„é¸é … \"%s\"\n"
@@ -4773,6 +4760,21 @@ msgstr "%s: 已跳éŽ: 公鑰已åœç”¨\n"
msgid "%s: skipped: public key already present\n"
msgstr "%s: 已跳éŽ: 公鑰已存在\n"
+#, fuzzy, c-format
+#| msgid "can't connect to '%s': %s\n"
+msgid "can't encrypt to '%s'\n"
+msgstr "無法連接至 '%s': %s\n"
+
+#, fuzzy, c-format
+#| msgid "line %d: invalid date given\n"
+msgid "option '%s' given, but no valid default keys given\n"
+msgstr "第 %d 列: 無效的給定日期\n"
+
+#, fuzzy, c-format
+#| msgid "line %d: invalid date given\n"
+msgid "option '%s' given, but option '%s' not given\n"
+msgstr "第 %d 列: 無效的給定日期\n"
+
msgid "You did not specify a user ID. (you may use \"-r\")\n"
msgstr "你沒有指定使用者 ID. (ä½ å¯èƒ½å¾—用 \"-r\")\n"
@@ -4816,10 +4818,6 @@ msgstr "警告: 金鑰 %s 沒有 %s çš„å好設定\n"
msgid "data not saved; use option \"--output\" to save it\n"
msgstr "資料未被儲存; 請用 \"--output\" é¸é …來儲存\n"
-#, c-format
-msgid "error creating '%s': %s\n"
-msgstr "建立 '%s' 時出錯: %s\n"
-
msgid "Detached signature.\n"
msgstr "分離的簽章.\n"
@@ -4905,26 +4903,49 @@ msgid "This is a revocation certificate for the OpenPGP key:"
msgstr "這把 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 ""
+
+#, fuzzy
+#| msgid ""
+#| "Use it to revoke this key in case of a compromise or loss of\n"
+#| "the secret key. However, if the secret key is still accessible,\n"
+#| "it is better to generate a new revocation certificate and give\n"
+#| "a reason for the revocation."
+msgid ""
"Use it to revoke this key in case of a compromise or loss of\n"
"the secret key. However, if the secret key is still accessible,\n"
"it is better to generate a new revocation certificate and give\n"
-"a reason for the revocation."
+"a reason for the revocation. For details see the description of\n"
+"of the gpg command \"--gen-revoke\" in the GnuPG manual."
msgstr ""
"è¬ä¸€ç§é‘°å¤–æµæˆ–éºå¤±æ™‚, å¯ä»¥ç”¨ä¾†æ’¤éŠ·é‡‘é‘°.\n"
"然而, 如果其實還å¯ä»¥å­˜å–ç§é‘°, 建議更好的\n"
"辦法是產生一份新的撤銷憑證, 並且指明撤銷\n"
"çš„ç†ç”±."
+#, fuzzy
+#| 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 making use of this revocation certificate."
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 making use of this revocation certificate."
+"before importing and publishing this revocation certificate."
msgstr ""
"為了é¿å…æ„外誤用此檔案, 底下五個破折號å‰é¢å¤šæ’了一個冒號.\n"
"真的è¦ä½¿ç”¨é€™ä»½æ’¤éŠ·æ†‘è­‰å‰, 請先用文字編輯器把那個冒號移除,\n"
"撤銷憑證æ‰èƒ½ä½¿ç”¨."
#, fuzzy, c-format
+#| msgid "Revocation certificate created.\n"
+msgid "revocation certificate stored as '%s.rev'\n"
+msgstr "已建立撤銷憑證.\n"
+
+#, fuzzy, c-format
#| msgid "secret key \"%s\" not found: %s\n"
msgid "secret key \"%s\" not found\n"
msgstr "找ä¸åˆ°ç§é‘° \"%s\": %s\n"
@@ -4936,6 +4957,11 @@ msgstr "找ä¸åˆ°ç§é‘° \"%s\": %s\n"
msgid "'%s' matches multiple secret keys:\n"
msgstr ""
+#, fuzzy, c-format
+#| msgid "error creating keyring '%s': %s\n"
+msgid "error searching the keyring: %s\n"
+msgstr "建立鑰匙圈 '%s' 時出錯: %s\n"
+
msgid "Create a revocation certificate for this key? (y/N) "
msgstr "è¦ç‚ºé€™æŠŠé‡‘鑰建立一份撤銷憑證嗎? (y/N) "
@@ -5010,23 +5036,36 @@ msgstr "è«‹åƒè€ƒ %s 上進一步的資訊\n"
msgid "WARNING: signing subkey %s has an invalid cross-certification\n"
msgstr "警告: 簽署å­é‘° %s 有無效的交å‰æ†‘è­‰\n"
-#, c-format
+#, fuzzy, c-format
+#| msgid "public key %s is %lu second newer than the signature\n"
msgid "public key %s is %lu second newer than the signature\n"
-msgstr "公鑰 %s 比簽章還è¦æ–°äº† %lu 秒\n"
+msgid_plural "public key %s is %lu seconds newer than the signature\n"
+msgstr[0] "公鑰 %s 比簽章還è¦æ–°äº† %lu 秒\n"
-#, c-format
-msgid "public key %s is %lu seconds newer than the signature\n"
-msgstr "公鑰 %s 比簽章還è¦æ–°äº† %lu 秒\n"
+#, fuzzy, c-format
+#| msgid "public key %s is %lu second newer than the signature\n"
+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] "公鑰 %s 比簽章還è¦æ–°äº† %lu 秒\n"
-#, c-format
+#, fuzzy, c-format
+#| msgid ""
+#| "key %s was created %lu second in the future (time warp or clock problem)\n"
msgid ""
"key %s was created %lu second in the future (time warp or clock problem)\n"
-msgstr "金鑰 %s 已經在 %lu 秒後的未來製妥 (å¯èƒ½æ˜¯å› ç‚ºæ™‚光旅行或時é˜çš„å•é¡Œ)\n"
-
-#, c-format
-msgid ""
+msgid_plural ""
"key %s was created %lu seconds in the future (time warp or clock problem)\n"
-msgstr "金鑰 %s 已經在 %lu 秒後的未來製妥 (å¯èƒ½æ˜¯å› ç‚ºæ™‚光旅行或時é˜çš„å•é¡Œ)\n"
+msgstr[0] ""
+"金鑰 %s 已經在 %lu 秒後的未來製妥 (å¯èƒ½æ˜¯å› ç‚ºæ™‚光旅行或時é˜çš„å•é¡Œ)\n"
+
+#, fuzzy, c-format
+#| msgid ""
+#| "key %s was created %lu second in the future (time warp or clock problem)\n"
+msgid "key %s was created %lu day in the future (time warp or clock problem)\n"
+msgid_plural ""
+"key %s was created %lu days in the future (time warp or clock problem)\n"
+msgstr[0] ""
+"金鑰 %s 已經在 %lu 秒後的未來製妥 (å¯èƒ½æ˜¯å› ç‚ºæ™‚光旅行或時é˜çš„å•é¡Œ)\n"
#, c-format
msgid "Note: signature key %s expired %s\n"
@@ -5241,6 +5280,232 @@ msgstr "無法處ç†é•·æ–¼ %d 字符的文字列\n"
msgid "input line longer than %d characters\n"
msgstr "輸入列比 %d 字符還長\n"
+#, fuzzy, c-format
+#| msgid "error sending standard options: %s\n"
+msgid "error beginning transaction on TOFU database: %s\n"
+msgstr "é€å‡ºæ¨™æº–é¸é …時出錯: %s\n"
+
+#, c-format
+msgid "error committing transaction on TOFU database: %s\n"
+msgstr ""
+
+#, c-format
+msgid "error rolling back transaction on TOFU database: %s\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "unsupported algorithm: %s"
+msgid "unsupported TOFU database version: %s\n"
+msgstr "未支æ´çš„演算法: %s"
+
+#, fuzzy, c-format
+#| msgid "error sending data: %s\n"
+msgid "error reading TOFU database: %s\n"
+msgstr "é€å‡ºè³‡æ–™æ™‚出錯: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error writing base64 encoding: %s\n"
+msgid "error determining TOFU database's version: %s\n"
+msgstr "寫入 base64 編碼時出錯: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error initializing reader object: %s\n"
+msgid "error initializing TOFU database: %s\n"
+msgstr "啟始讀å–程å¼ç‰©ä»¶æ™‚出錯: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error opening '%s': %s\n"
+msgid "error opening TOFU database '%s': %s\n"
+msgstr "開啟 '%s' 時出錯: %s\n"
+
+msgid "Warning: Home directory contains both tofu.db and tofu.d.\n"
+msgstr ""
+
+msgid "Using split format for TOFU database\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "error sending data: %s\n"
+msgid "error updating TOFU database: %s\n"
+msgstr "é€å‡ºè³‡æ–™æ™‚出錯: %s\n"
+
+#, c-format
+msgid "public key %s not found: %s\n"
+msgstr "找ä¸åˆ°å…¬é‘° %s: %s\n"
+
+#, fuzzy, c-format
+#| msgid "error setting OCSP target: %s\n"
+msgid "error setting TOFU binding's trust level to %s\n"
+msgstr "設定 OCSP 目標時出錯: %s\n"
+
+#, c-format
+msgid "The binding %s is NOT known."
+msgstr ""
+
+#, c-format
+msgid ""
+"The key %s raised a conflict with this binding (%s). Since this binding's "
+"policy was 'auto', it was changed to 'ask'."
+msgstr ""
+
+#, c-format
+msgid ""
+"Please indicate whether you believe the binding %s%sis legitimate (the key "
+"belongs to the stated owner) or a forgery (bad)."
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "error getting responder ID: %s\n"
+msgid "error gathering other user IDs: %s\n"
+msgstr "å–å¾—å›žæ‡‰ç¨‹å¼ ID 時出錯: %s\n"
+
+msgid "Known user IDs associated with this key:\n"
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "validity: %s"
+msgid "policy: %s"
+msgstr "有效性: %s"
+
+#, fuzzy, c-format
+#| msgid "error getting stored flags: %s\n"
+msgid "error gathering signature stats: %s\n"
+msgstr "å–得已存放的旗標時出錯: %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] ""
+
+#, c-format
+msgid "Statistics for keys with the email address \"%s\":\n"
+msgstr ""
+
+#, fuzzy
+#| msgid "list keys"
+msgid "this key"
+msgstr "列出金鑰"
+
+#, c-format
+msgid "%ld message signed in the future."
+msgid_plural "%ld messages signed in the future."
+msgstr[0] ""
+
+#, fuzzy, c-format
+#| msgid "print message digests"
+msgid "%ld message signed"
+msgid_plural "%ld messages signed"
+msgstr[0] "å°å‡ºè¨Šæ¯æ‘˜è¦"
+
+#, c-format
+msgid " over the past %ld day."
+msgid_plural " over the past %ld days."
+msgstr[0] ""
+
+#, c-format
+msgid " over the past %ld week."
+msgid_plural " over the past %ld weeks."
+msgstr[0] ""
+
+#, c-format
+msgid " over the past %ld month."
+msgid_plural " over the past %ld months."
+msgstr[0] ""
+
+#. 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 ""
+
+#. 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 ""
+
+msgid "(G)ood, (A)ccept once, (U)nknown, (R)eject once, (B)ad? "
+msgstr ""
+
+#, fuzzy, c-format
+#| msgid "error creating a pipe: %s\n"
+msgid "error changing TOFU policy: %s\n"
+msgstr "建立管é“時出錯: %s\n"
+
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+
+#, c-format
+msgid "%d month"
+msgid_plural "%d months"
+msgstr[0] ""
+
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+
+#, c-format
+msgid "Have never verified a message signed by key %s!\n"
+msgstr ""
+
+#, c-format
+msgid "Failed to collect signature statistics for \"%s\" (key %s)\n"
+msgstr ""
+
+#, c-format
+msgid "Verified 0 messages signed by \"%s\" (key: %s, policy: %s)."
+msgstr ""
+
+#. TRANSLATORS: The final %s is replaced by a string like
+#. "7 months, 1 day, 5 minutes, 0 seconds".
+#, c-format
+msgid ""
+"Verified %ld message signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgid_plural ""
+"Verified %ld messages signed by \"%s\" (key: %s, policy: %s) in the past %s."
+msgstr[0] ""
+
+#, c-format
+msgid "The most recent message was verified %s ago."
+msgstr ""
+
+msgid "Warning: we've have yet to see a message signed by this key!\n"
+msgstr ""
+
+msgid "Warning: we've only seen a single message signed by this key!\n"
+msgstr ""
+
+#. TRANSLATORS: translate the below text. We don't
+#. directly internationalize that text so that we can
+#. tweak it without breaking translations.
+#, c-format
+msgid "TOFU: few signatures %d message %s"
+msgid_plural "TOFU: few signatures %d messages %s"
+msgstr[0] ""
+
+#, fuzzy, c-format
+#| msgid "error sending data: %s\n"
+msgid "error opening TOFU database: %s\n"
+msgstr "é€å‡ºè³‡æ–™æ™‚出錯: %s\n"
+
#, c-format
msgid "'%s' is not a valid long keyID\n"
msgstr "'%s' ä¸æ˜¯æœ‰æ•ˆçš„é•·å¼é‡‘é‘° ID\n"
@@ -5298,19 +5563,23 @@ msgstr "在 '%s' 信任模型中並ä¸éœ€è¦æª¢æŸ¥ä¿¡ä»»è³‡æ–™åº«\n"
msgid "no need for a trustdb update with '%s' trust model\n"
msgstr "在 '%s' 信任模型中並ä¸éœ€è¦æ›´æ–°ä¿¡ä»»è³‡æ–™åº«\n"
-#, c-format
-msgid "public key %s not found: %s\n"
-msgstr "找ä¸åˆ°å…¬é‘° %s: %s\n"
-
msgid "please do a --check-trustdb\n"
msgstr "è«‹åšä¸€æ¬¡ --check-trustdb\n"
msgid "checking the trustdb\n"
msgstr "正在檢查信任資料庫\n"
-#, c-format
-msgid "%d keys processed (%d validity counts cleared)\n"
-msgstr "已經處ç†äº† %d 把金鑰 (共計已解決了 %d 份有效性)\n"
+#, fuzzy, c-format
+#| msgid "%lu keys processed so far\n"
+msgid "%d key processed"
+msgid_plural "%d keys processed"
+msgstr[0] "ç›®å‰å·²è™•ç† %lu 把金鑰\n"
+
+#, fuzzy, c-format
+#| msgid "%d keys processed (%d validity counts cleared)\n"
+msgid " (%d validity count cleared)\n"
+msgid_plural " (%d validity counts cleared)\n"
+msgstr[0] "已經處ç†äº† %d 把金鑰 (共計已解決了 %d 份有效性)\n"
msgid "no ultimately trusted keys found\n"
msgstr "沒有找到任何徹底信任的金鑰\n"
@@ -5320,10 +5589,6 @@ msgid "public key of ultimately trusted key %s not found\n"
msgstr "找ä¸åˆ°å¾¹åº•ä¿¡ä»»é‡‘é‘° %s 的公鑰\n"
#, c-format
-msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
-msgstr "%d å€‹å‹‰å¼·ä¿¡ä»»ä»¥åŠ %d 個完全信任是 %s 信任模型的最å°éœ€æ±‚\n"
-
-#, c-format
msgid ""
"depth: %d valid: %3d signed: %3d trust: %d-, %dq, %dn, %dm, %df, %du\n"
msgstr "深度: %d 有效: %3d 已簽署: %3d 信任: %d-, %dq, %dn, %dm, %df, %du\n"
@@ -5520,9 +5785,12 @@ msgstr "從å¡ç‰‡å–回 CHV 狀態時出錯\n"
msgid "card is permanently locked!\n"
msgstr "å¡ç‰‡æ°¸ä¹…鎖定了!!\n"
-#, c-format
-msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
-msgstr "%d 管ç†è€…個人識別碼 (PIN) 試圖在å¡ç‰‡æ°¸ä¹…鎖定å‰éºç•™ä¸‹ä¾†\n"
+#, fuzzy, c-format
+#| msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
+msgid "%d Admin PIN attempt remaining before card is permanently locked\n"
+msgid_plural ""
+"%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr[0] "%d 管ç†è€…個人識別碼 (PIN) 試圖在å¡ç‰‡æ°¸ä¹…鎖定å‰éºç•™ä¸‹ä¾†\n"
#. TRANSLATORS: Do not translate the "|A|" prefix but keep it at
#. the start of the string. Use %%0A to force a linefeed.
@@ -5601,9 +5869,11 @@ msgstr "正在產生金鑰中, è«‹ç¨å€™ ...\n"
msgid "generating key failed\n"
msgstr "產生金鑰時失敗\n"
-#, c-format
-msgid "key generation completed (%d seconds)\n"
-msgstr "金鑰產生完畢 (%d 秒)\n"
+#, fuzzy, c-format
+#| msgid "key generation completed (%d seconds)\n"
+msgid "key generation completed (%d second)\n"
+msgid_plural "key generation completed (%d seconds)\n"
+msgstr[0] "金鑰產生完畢 (%d 秒)\n"
msgid "invalid structure of OpenPGP card (DO 0x93)\n"
msgstr "無效的 OpenPGP å¡ç‰‡çµæ§‹ (DO 0x93)\n"
@@ -7680,6 +7950,11 @@ msgstr "|N|在 N 天之後讓密語éŽæœŸ"
msgid "do not allow the reuse of old passphrases"
msgstr "ä¸å…許é‡è¤‡ä½¿ç”¨èˆŠå¯†èªž"
+#, fuzzy
+#| msgid "|N|set LDAP timeout to N seconds"
+msgid "|N|set the Pinentry timeout to N seconds"
+msgstr "|N|把 LDAP é€¾æ™‚è¨­æˆ N 秒"
+
msgid "|NAME|use NAME as default secret key"
msgstr "|åå­—|使用指定åå­—åšç‚ºé è¨­ç§é‘°"
@@ -7969,6 +8244,87 @@ msgstr ""
"語法: gpg-check-pattern [é¸é …] 樣å¼æª”案\n"
"用樣å¼æª”案來檢查由標準輸入給定的密語\n"
+#, fuzzy
+#~| msgid "option \"%.50s\" is ambiguous\n"
+#~ msgid "key specification '%s' is ambiguous\n"
+#~ msgstr "\"%.50s\" é¸é …ä¸æ˜Žç¢º\n"
+
+#~ msgid "%d signatures not checked due to missing keys\n"
+#~ msgstr "有 %d 份簽章因為éºå¤±é‡‘鑰而未被檢查\n"
+
+#~ msgid "%d signatures not checked due to errors\n"
+#~ msgstr "有 %d 份簽章因錯誤而未被檢查\n"
+
+#~ msgid "1 user ID without valid self-signature detected\n"
+#~ msgstr "åµæ¸¬åˆ° 1 個沒有有效自我簽章的使用者 ID\n"
+
+#~ msgid "Deleted %d signatures.\n"
+#~ msgstr "已經刪除了 %d 份簽章.\n"
+
+#~ msgid "User ID \"%s\": %d signatures removed\n"
+#~ msgstr "使用者 ID \"%s\": 已移除 %d 份簽章\n"
+
+#~ msgid ""
+#~ "You need a Passphrase to protect your secret key.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "你需è¦ä¸€å€‹å¯†èªžä¾†ä¿è­·ä½ çš„ç§é‘°.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Please enter a passphrase to protect the off-card backup of the new "
+#~ "encryption key."
+#~ msgstr "請輸入密語以ä¿è­·æ–°åŠ å¯†é‡‘é‘°çš„å¡ç‰‡å¤–備份."
+
+#~ msgid "passphrase not correctly repeated; try again"
+#~ msgstr "å‰å¾Œå…©æ¬¡è¼¸å…¥çš„密語ä¸ä¸€è‡´; è«‹å†è©¦ä¸€æ¬¡"
+
+#~ msgid "%s.\n"
+#~ msgstr "%s.\n"
+
+#~ msgid ""
+#~ "You don't want a passphrase - this is probably a *bad* idea!\n"
+#~ "I will do it anyway. You can change your passphrase at any time,\n"
+#~ "using this program with the option \"--edit-key\".\n"
+#~ "\n"
+#~ msgstr ""
+#~ "ä½ ä¸æƒ³è¦æœ‰å¯†èªž - 這個想法實在是 **é­é€äº†**!\n"
+#~ "我ä»ç„¶æœƒç…§ä½ æƒ³çš„去åš. 你任何時候都å¯ä»¥è®Šæ›´ä½ çš„密語,\n"
+#~ "僅需è¦å†æ¬¡åŸ·è¡Œé€™å€‹ç¨‹å¼, 並且使用 \"--edit-key\" é¸é …å³å¯.\n"
+#~ "\n"
+
+#~ msgid "storing key onto card failed: %s\n"
+#~ msgstr "儲存金鑰到å¡ç‰‡ä¸Šæ™‚失敗: %s\n"
+
+#, fuzzy
+#~| msgid "1 bad signature\n"
+#~ msgid "1 good signature\n"
+#~ msgstr "1 份æ壞的簽章\n"
+
+#~ msgid "renaming '%s' to '%s' failed: %s\n"
+#~ msgstr "把 '%s' é‡æ–°æ–°å‘½æˆ '%s' 時失敗: %s\n"
+
+#~ msgid "%lu keys cached (%lu signatures)\n"
+#~ msgstr "已檢查 %lu 把金鑰 (共 %lu 份簽章)\n"
+
+#~ msgid "refreshing 1 key from %s\n"
+#~ msgstr "更新 1 份金鑰中 (從 %s )\n"
+
+#~ msgid "sending key %s to %s server %s\n"
+#~ msgstr "éžé€é‡‘é‘° %s 至 %s 伺æœå™¨ %s\n"
+
+#~ msgid "public key %s is %lu seconds newer than the signature\n"
+#~ msgstr "公鑰 %s 比簽章還è¦æ–°äº† %lu 秒\n"
+
+#~ msgid ""
+#~ "key %s was created %lu seconds in the future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "金鑰 %s 已經在 %lu 秒後的未來製妥 (å¯èƒ½æ˜¯å› ç‚ºæ™‚光旅行或時é˜çš„å•é¡Œ)\n"
+
+#~ msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
+#~ msgstr "%d å€‹å‹‰å¼·ä¿¡ä»»ä»¥åŠ %d 個完全信任是 %s 信任模型的最å°éœ€æ±‚\n"
+
#~ msgid "cleared passphrase cached with ID: %s\n"
#~ msgstr "清除此 ID 被快å–ä½çš„密語: %s\n"
diff --git a/scd/apdu.c b/scd/apdu.c
index 95a2561..268a2c6 100644
--- a/scd/apdu.c
+++ b/scd/apdu.c
@@ -244,6 +244,7 @@ static char (* DLSTDCALL CT_close) (unsigned short ctn);
#define PCSC_E_NOT_TRANSACTED 0x80100016
#define PCSC_E_READER_UNAVAILABLE 0x80100017
#define PCSC_E_NO_SERVICE 0x8010001D
+#define PCSC_E_SERVICE_STOPPED 0x8010001E
#define PCSC_W_REMOVED_CARD 0x80100069
/* Fix pcsc-lite ABI incompatibilty. */
@@ -907,6 +908,8 @@ pcsc_error_to_sw (long ec)
case PCSC_E_CANCELLED: rc = SW_HOST_ABORTED; break;
case PCSC_E_NO_MEMORY: rc = SW_HOST_OUT_OF_CORE; break;
case PCSC_E_TIMEOUT: rc = SW_HOST_CARD_IO_ERROR; break;
+ case PCSC_E_NO_SERVICE:
+ case PCSC_E_SERVICE_STOPPED:
case PCSC_E_UNKNOWN_READER: rc = SW_HOST_NO_READER; break;
case PCSC_E_SHARING_VIOLATION: rc = SW_HOST_LOCKING_FAILED; break;
case PCSC_E_NO_SMARTCARD: rc = SW_HOST_NO_CARD; break;
diff --git a/scd/app-openpgp.c b/scd/app-openpgp.c
index 581c5dd..7dd1566 100644
--- a/scd/app-openpgp.c
+++ b/scd/app-openpgp.c
@@ -1874,8 +1874,11 @@ build_enter_admin_pin_prompt (app_t app, char **r_prompt)
remaining = value[6];
xfree (relptr);
- log_info(_("%d Admin PIN attempts remaining before card"
- " is permanently locked\n"), remaining);
+ log_info (ngettext("%d Admin PIN attempt remaining before card"
+ " is permanently locked\n",
+ "%d Admin PIN attempts remaining before card"
+ " is permanently locked\n",
+ remaining), remaining);
if (remaining < 3)
{
@@ -3587,8 +3590,13 @@ do_genkey (app_t app, ctrl_t ctrl, const char *keynostr, unsigned int flags,
log_error (_("generating key failed\n"));
goto leave;
}
- log_info (_("key generation completed (%d seconds)\n"),
- (int)(time (NULL) - start_at));
+
+ {
+ int nsecs = (int)(time (NULL) - start_at);
+ log_info (ngettext("key generation completed (%d second)\n",
+ "key generation completed (%d seconds)\n",
+ nsecs), nsecs);
+ }
keydata = find_tlv (buffer, buflen, 0x7F49, &keydatalen);
if (!keydata)
@@ -3623,6 +3631,11 @@ do_genkey (app_t app, ctrl_t ctrl, const char *keynostr, unsigned int flags,
send_status_info (ctrl, "KEY-CREATED-AT",
numbuf, (size_t)strlen(numbuf), NULL, 0);
+ for (; mlen && !*m; mlen--, m++) /* strip leading zeroes */
+ ;
+ for (; elen && !*e; elen--, e++) /* strip leading zeroes */
+ ;
+
rc = store_fpr (app, keyno, (u32)created_at, fprbuf, PUBKEY_ALGO_RSA,
m, mlen, e, elen);
if (rc)
diff --git a/sm/call-agent.c b/sm/call-agent.c
index c1457b6..c7d4c5a 100644
--- a/sm/call-agent.c
+++ b/sm/call-agent.c
@@ -76,6 +76,41 @@ struct import_key_parm_s
+/* Print a warning if the server's version number is less than our
+ version number. Returns an error code on a connection problem. */
+static gpg_error_t
+warn_version_mismatch (ctrl_t ctrl, assuan_context_t ctx,
+ const char *servername, int mode)
+{
+ gpg_error_t err;
+ char *serverversion;
+ const char *myversion = strusage (13);
+
+ err = get_assuan_server_version (ctx, mode, &serverversion);
+ if (err)
+ log_error (_("error getting version from '%s': %s\n"),
+ servername, gpg_strerror (err));
+ else if (!compare_version_strings (serverversion, myversion))
+ {
+ char *warn;
+
+ warn = xtryasprintf (_("server '%s' is older than us (%s < %s)"),
+ servername, serverversion, myversion);
+ if (!warn)
+ err = gpg_error_from_syserror ();
+ else
+ {
+ log_info (_("WARNING: %s\n"), warn);
+ gpgsm_status2 (ctrl, STATUS_WARNING, "server_version_mismatch 0",
+ warn, NULL);
+ xfree (warn);
+ }
+ }
+ xfree (serverversion);
+ return err;
+}
+
+
/* Try to connect to the agent via socket or fork it off and work by
pipes. Handle the server's initial greeting */
static int
@@ -108,7 +143,8 @@ start_agent (ctrl_t ctrl)
log_info (_("no gpg-agent running in this session\n"));
}
}
- else if (!rc)
+ else if (!rc && !(rc = warn_version_mismatch (ctrl, agent_ctx,
+ GPG_AGENT_NAME, 0)))
{
/* Tell the agent that we support Pinentry notifications. No
error checking so that it will work also with older
@@ -128,18 +164,6 @@ start_agent (ctrl_t ctrl)
}
-
-static gpg_error_t
-membuf_data_cb (void *opaque, const void *buffer, size_t length)
-{
- membuf_t *data = opaque;
-
- if (buffer)
- put_membuf (data, buffer, length);
- return 0;
-}
-
-
/* This is the default inquiry callback. It mainly handles the
Pinentry notifications. */
static gpg_error_t
@@ -215,7 +239,7 @@ gpgsm_agent_pksign (ctrl_t ctrl, const char *keygrip, const char *desc,
init_membuf (&data, 1024);
rc = assuan_transact (agent_ctx, "PKSIGN",
- membuf_data_cb, &data, default_inq_cb, ctrl,
+ put_membuf_cb, &data, default_inq_cb, ctrl,
NULL, NULL);
if (rc)
{
@@ -282,7 +306,7 @@ gpgsm_scd_pksign (ctrl_t ctrl, const char *keyid, const char *desc,
snprintf (line, DIM(line)-1, "SCD PKSIGN %s %s", hashopt, keyid);
line[DIM(line)-1] = 0;
rc = assuan_transact (agent_ctx, line,
- membuf_data_cb, &data, default_inq_cb, ctrl,
+ put_membuf_cb, &data, default_inq_cb, ctrl,
NULL, NULL);
if (rc)
{
@@ -392,7 +416,7 @@ gpgsm_agent_pkdecrypt (ctrl_t ctrl, const char *keygrip, const char *desc,
cipher_parm.ciphertext = ciphertext;
cipher_parm.ciphertextlen = ciphertextlen;
rc = assuan_transact (agent_ctx, "PKDECRYPT",
- membuf_data_cb, &data,
+ put_membuf_cb, &data,
inq_ciphertext_cb, &cipher_parm, NULL, NULL);
if (rc)
{
@@ -487,7 +511,7 @@ gpgsm_agent_genkey (ctrl_t ctrl,
if (!gk_parm.sexplen)
return gpg_error (GPG_ERR_INV_VALUE);
rc = assuan_transact (agent_ctx, "GENKEY",
- membuf_data_cb, &data,
+ put_membuf_cb, &data,
inq_genkey_parms, &gk_parm, NULL, NULL);
if (rc)
{
@@ -536,7 +560,7 @@ gpgsm_agent_readkey (ctrl_t ctrl, int fromcard, const char *hexkeygrip,
init_membuf (&data, 1024);
rc = assuan_transact (agent_ctx, line,
- membuf_data_cb, &data,
+ put_membuf_cb, &data,
default_inq_cb, ctrl, NULL, NULL);
if (rc)
{
@@ -931,6 +955,10 @@ gpgsm_agent_learn (ctrl_t ctrl)
if (rc)
return rc;
+ rc = warn_version_mismatch (ctrl, agent_ctx, SCDAEMON_NAME, 2);
+ if (rc)
+ return rc;
+
init_membuf (&data, 4096);
learn_parm.error = 0;
learn_parm.ctrl = ctrl;
@@ -1117,7 +1145,7 @@ gpgsm_agent_ask_passphrase (ctrl_t ctrl, const char *desc_msg, int repeat,
init_membuf_secure (&data, 64);
err = assuan_transact (agent_ctx, line,
- membuf_data_cb, &data,
+ put_membuf_cb, &data,
default_inq_cb, NULL, NULL, NULL);
if (err)
@@ -1157,7 +1185,7 @@ gpgsm_agent_keywrap_key (ctrl_t ctrl, int forexport,
init_membuf_secure (&data, 64);
err = assuan_transact (agent_ctx, line,
- membuf_data_cb, &data,
+ put_membuf_cb, &data,
default_inq_cb, ctrl, NULL, NULL);
if (err)
{
@@ -1251,7 +1279,7 @@ gpgsm_agent_export_key (ctrl_t ctrl, const char *keygrip, const char *desc,
init_membuf_secure (&data, 1024);
err = assuan_transact (agent_ctx, line,
- membuf_data_cb, &data,
+ put_membuf_cb, &data,
default_inq_cb, ctrl, NULL, NULL);
if (err)
{
diff --git a/sm/call-dirmngr.c b/sm/call-dirmngr.c
index b06397f..881c484 100644
--- a/sm/call-dirmngr.c
+++ b/sm/call-dirmngr.c
@@ -149,6 +149,41 @@ get_membuf (struct membuf *mb, size_t *len)
}
+/* Print a warning if the server's version number is less than our
+ version number. Returns an error code on a connection problem. */
+static gpg_error_t
+warn_version_mismatch (ctrl_t ctrl, assuan_context_t ctx,
+ const char *servername, int mode)
+{
+ gpg_error_t err;
+ char *serverversion;
+ const char *myversion = strusage (13);
+
+ err = get_assuan_server_version (ctx, mode, &serverversion);
+ if (err)
+ log_error (_("error getting version from '%s': %s\n"),
+ servername, gpg_strerror (err));
+ else if (!compare_version_strings (serverversion, myversion))
+ {
+ char *warn;
+
+ warn = xtryasprintf (_("server '%s' is older than us (%s < %s)"),
+ servername, serverversion, myversion);
+ if (!warn)
+ err = gpg_error_from_syserror ();
+ else
+ {
+ log_info (_("WARNING: %s\n"), warn);
+ gpgsm_status2 (ctrl, STATUS_WARNING, "server_version_mismatch 0",
+ warn, NULL);
+ xfree (warn);
+ }
+ }
+ xfree (serverversion);
+ return err;
+}
+
+
/* This function prepares the dirmngr for a new session. The
audit-events option is used so that other dirmngr clients won't get
disturbed by such events. */
@@ -158,6 +193,9 @@ prepare_dirmngr (ctrl_t ctrl, assuan_context_t ctx, gpg_error_t err)
struct keyserver_spec *server;
if (!err)
+ err = warn_version_mismatch (ctrl, ctx, DIRMNGR_NAME, 0);
+
+ if (!err)
{
err = assuan_transact (ctx, "OPTION audit-events=1",
NULL, NULL, NULL, NULL, NULL, NULL);
@@ -181,9 +219,11 @@ prepare_dirmngr (ctrl_t ctrl, assuan_context_t ctx, gpg_error_t err)
server->host, server->port, user, pass, base);
line[DIM (line) - 1] = 0;
- err = assuan_transact (ctx, line, NULL, NULL, NULL, NULL, NULL, NULL);
- if (gpg_err_code (err) == GPG_ERR_ASS_UNKNOWN_CMD)
- err = 0; /* Allow the use of old dirmngr versions. */
+ assuan_transact (ctx, line, NULL, NULL, NULL, NULL, NULL, NULL);
+ /* The code below is not required becuase we don't return an error. */
+ /* err = [above call] */
+ /* if (gpg_err_code (err) == GPG_ERR_ASS_UNKNOWN_CMD) */
+ /* err = 0; /\* Allow the use of old dirmngr versions. *\/ */
server = server->next;
}
@@ -402,7 +442,6 @@ unhexify_fpr (const char *hexstr, unsigned char *fpr)
;
if (*s || (n != 40))
return 0; /* no fingerprint (invalid or wrong length). */
- n /= 2;
for (s=hexstr, n=0; *s; s += 2, n++)
fpr[n] = xtoi_2 (s);
return 1; /* okay */
diff --git a/sm/certchain.c b/sm/certchain.c
index d43147e..b884d3d 100644
--- a/sm/certchain.c
+++ b/sm/certchain.c
@@ -405,7 +405,9 @@ check_cert_policy (ksba_cert_t cert, int listmode, estream_t fplist)
}
while (!*p || *p == '\n' || *p == '#');
- /* parse line */
+ /* Parse line. Note that the line has always a LF and spacep
+ does not consider a LF a space. Thus strpbrk will always
+ succeed. */
for (allowed=line; spacep (allowed); allowed++)
;
p = strpbrk (allowed, " :\n");
@@ -1389,10 +1391,7 @@ do_validate_chain (ctrl_t ctrl, ksba_cert_t cert, ksba_isotime_t checktime_arg,
exptime, listmode, listfp,
(depth && is_root)? -1: depth);
if (gpg_err_code (rc) == GPG_ERR_CERT_EXPIRED)
- {
- any_expired = 1;
- rc = 0;
- }
+ any_expired = 1;
else if (rc)
goto leave;
@@ -1409,7 +1408,7 @@ do_validate_chain (ctrl_t ctrl, ksba_cert_t cert, ksba_isotime_t checktime_arg,
if (gpg_err_code (rc) == GPG_ERR_NO_POLICY_MATCH)
{
any_no_policy_match = 1;
- rc = 1;
+ rc = 1; /* Be on the safe side and set RC. */
}
else if (rc)
goto leave;
@@ -1612,7 +1611,8 @@ do_validate_chain (ctrl_t ctrl, ksba_cert_t cert, ksba_isotime_t checktime_arg,
/* The find next did not work or returned an
identical certificate. We better stop here
to avoid infinite checks. */
- rc = gpg_error (GPG_ERR_BAD_SIGNATURE);
+ /* No need to set RC because it is not used:
+ rc = gpg_error (GPG_ERR_BAD_SIGNATURE); */
ksba_cert_release (tmp_cert);
}
else
diff --git a/sm/encrypt.c b/sm/encrypt.c
index 54a8bd1..c677a42 100644
--- a/sm/encrypt.c
+++ b/sm/encrypt.c
@@ -212,8 +212,11 @@ encrypt_dek (const DEK dek, ksba_cert_t cert, unsigned char **encval)
gcry_sexp_release (s_pkey);
/* Reformat it. */
- rc = make_canon_sexp (s_ciph, encval, NULL);
- gcry_sexp_release (s_ciph);
+ if (!rc)
+ {
+ rc = make_canon_sexp (s_ciph, encval, NULL);
+ gcry_sexp_release (s_ciph);
+ }
return rc;
}
diff --git a/sm/export.c b/sm/export.c
index 1dce106..d3dc9b9 100644
--- a/sm/export.c
+++ b/sm/export.c
@@ -103,7 +103,7 @@ insert_duptable (duptable_t *table, unsigned char *fpr, int *exists)
#error cannot handle a table larger than 16 bits or smaller than 8 bits
#elif DUPTABLE_BITS > 8
idx <<= (DUPTABLE_BITS - 8);
- idx |= (fpr[1] & ~(~0 << 4));
+ idx |= (fpr[1] & ~(~0U << 4));
#endif
for (t = table[idx]; t; t = t->next)
diff --git a/sm/fingerprint.c b/sm/fingerprint.c
index a82945e..8d2b800 100644
--- a/sm/fingerprint.c
+++ b/sm/fingerprint.c
@@ -192,7 +192,6 @@ gpgsm_get_keygrip (ksba_cert_t cert, unsigned char *array)
gcry_sexp_release (s_pkey);
if (!array)
{
- rc = gpg_error (GPG_ERR_GENERAL);
log_error ("can't calculate keygrip\n");
return NULL;
}
diff --git a/sm/gpgsm.c b/sm/gpgsm.c
index 262781c..a0b7038 100644
--- a/sm/gpgsm.c
+++ b/sm/gpgsm.c
@@ -630,7 +630,7 @@ build_list (const char *text, const char * (*mapf)(int), int (*chkf)(int))
}
}
if (p)
- p = stpcpy(p, "\n" );
+ strcpy (p, "\n" );
return list;
}
diff --git a/sm/keydb.c b/sm/keydb.c
index 02b353a..f5705cb 100644
--- a/sm/keydb.c
+++ b/sm/keydb.c
@@ -107,7 +107,7 @@ try_make_homedir (const char *fname)
locked. This lock check does not work if the directory itself is
not yet available. If R_CREATED is not NULL it will be set to true
if the function created a new keybox. */
-static int
+static gpg_error_t
maybe_create_keybox (char *filename, int force, int *r_created)
{
dotlock_t lockhd = NULL;
@@ -237,13 +237,13 @@ maybe_create_keybox (char *filename, int force, int *r_created)
* does not exist. If AUTO_CREATED is not NULL it will be set to true
* if the function has created a new keybox.
*/
-int
+gpg_error_t
keydb_add_resource (const char *url, int force, int secret, int *auto_created)
{
static int any_secret, any_public;
const char *resname = url;
char *filename = NULL;
- int rc = 0;
+ gpg_error_t err = 0;
KeydbResourceType rt = KEYDB_RESOURCE_TYPE_NONE;
if (auto_created)
@@ -264,7 +264,7 @@ keydb_add_resource (const char *url, int force, int secret, int *auto_created)
else if (strchr (resname, ':'))
{
log_error ("invalid key resource URL '%s'\n", url );
- rc = gpg_error (GPG_ERR_GENERAL);
+ err = gpg_error (GPG_ERR_GENERAL);
goto leave;
}
#endif /* !HAVE_DRIVE_LETTERS && !__riscos__ */
@@ -312,20 +312,24 @@ keydb_add_resource (const char *url, int force, int secret, int *auto_created)
{
case KEYDB_RESOURCE_TYPE_NONE:
log_error ("unknown type of key resource '%s'\n", url );
- rc = gpg_error (GPG_ERR_GENERAL);
+ err = gpg_error (GPG_ERR_GENERAL);
goto leave;
case KEYDB_RESOURCE_TYPE_KEYBOX:
- rc = maybe_create_keybox (filename, force, auto_created);
- if (rc)
+ err = maybe_create_keybox (filename, force, auto_created);
+ if (err)
goto leave;
/* Now register the file */
{
- void *token = keybox_register_file (filename, secret);
- if (!token)
- ; /* already registered - ignore it */
+ void *token;
+
+ err = keybox_register_file (filename, secret, &token);
+ if (gpg_err_code (err) == GPG_ERR_EEXIST)
+ ; /* Already registered - ignore. */
+ else if (err)
+ ; /* Other error. */
else if (used_resources >= MAX_KEYDB_RESOURCES)
- rc = gpg_error (GPG_ERR_RESOURCE_LIMIT);
+ err = gpg_error (GPG_ERR_RESOURCE_LIMIT);
else
{
all_resources[used_resources].type = rt;
@@ -358,21 +362,21 @@ keydb_add_resource (const char *url, int force, int secret, int *auto_created)
default:
log_error ("resource type of '%s' not supported\n", url);
- rc = gpg_error (GPG_ERR_NOT_SUPPORTED);
+ err = gpg_error (GPG_ERR_NOT_SUPPORTED);
goto leave;
}
/* fixme: check directory permissions and print a warning */
leave:
- if (rc)
- log_error ("keyblock resource '%s': %s\n", filename, gpg_strerror(rc));
+ if (err)
+ log_error ("keyblock resource '%s': %s\n", filename, gpg_strerror (err));
else if (secret)
any_secret = 1;
else
any_public = 1;
xfree (filename);
- return rc;
+ return err;
}
@@ -924,10 +928,11 @@ keydb_rebuild_caches (void)
/*
* Start the next search on this handle right at the beginning
*/
-int
+gpg_error_t
keydb_search_reset (KEYDB_HANDLE hd)
{
- int i, rc = 0;
+ int i;
+ gpg_error_t rc = 0;
if (!hd)
return gpg_error (GPG_ERR_INV_VALUE);
@@ -946,8 +951,7 @@ keydb_search_reset (KEYDB_HANDLE hd)
break;
}
}
- return rc; /* fixme: we need to map error codes or share them with
- all modules*/
+ return rc;
}
/*
@@ -976,8 +980,10 @@ keydb_search (KEYDB_HANDLE hd, KEYDB_SEARCH_DESC *desc, size_t ndesc)
NULL, &skipped);
break;
}
- if (rc == -1) /* EOF -> switch to next resource */
- hd->current++;
+ if (rc == -1 || gpg_err_code (rc) == GPG_ERR_EOF)
+ { /* EOF -> switch to next resource */
+ hd->current++;
+ }
else if (!rc)
hd->found = hd->current;
}
@@ -1291,11 +1297,7 @@ keydb_clear_some_cert_flags (ctrl_t ctrl, strlist_t names)
{
rc = classify_user_id (sl->d, desc+ndesc, 0);
if (rc)
- {
- log_error ("key '%s' not found: %s\n",
- sl->d, gpg_strerror (rc));
- rc = 0;
- }
+ log_error ("key '%s' not found: %s\n", sl->d, gpg_strerror (rc));
else
ndesc++;
}
diff --git a/sm/keydb.h b/sm/keydb.h
index aec31c3..3c0f2d6 100644
--- a/sm/keydb.h
+++ b/sm/keydb.h
@@ -31,8 +31,8 @@ typedef struct keydb_handle *KEYDB_HANDLE;
/*-- keydb.c --*/
-int keydb_add_resource (const char *url, int force, int secret,
- int *auto_created);
+gpg_error_t keydb_add_resource (const char *url, int force, int secret,
+ int *auto_created);
KEYDB_HANDLE keydb_new (int secret);
void keydb_release (KEYDB_HANDLE hd);
int keydb_set_ephemeral (KEYDB_HANDLE hd, int yes);
@@ -54,7 +54,7 @@ int keydb_delete (KEYDB_HANDLE hd, int unlock);
int keydb_locate_writable (KEYDB_HANDLE hd, const char *reserved);
void keydb_rebuild_caches (void);
-int keydb_search_reset (KEYDB_HANDLE hd);
+gpg_error_t keydb_search_reset (KEYDB_HANDLE hd);
int keydb_search (KEYDB_HANDLE hd, KEYDB_SEARCH_DESC *desc, size_t ndesc);
int keydb_search_first (KEYDB_HANDLE hd);
int keydb_search_next (KEYDB_HANDLE hd);
diff --git a/sm/server.c b/sm/server.c
index f0512ef..e21c6a4 100644
--- a/sm/server.c
+++ b/sm/server.c
@@ -1083,7 +1083,7 @@ cmd_getauditlog (assuan_context_t ctx, char *line)
opt_data = has_option (line, "--data");
opt_html = has_option (line, "--html");
- line = skip_options (line);
+ /* Not needed: line = skip_options (line); */
if (!ctrl->audit)
return gpg_error (GPG_ERR_NO_DATA);
diff --git a/tests/openpgp/4gb-packet.test b/tests/openpgp/4gb-packet.test
index 57b8fc7..548ebfe 100755
--- a/tests/openpgp/4gb-packet.test
+++ b/tests/openpgp/4gb-packet.test
@@ -8,9 +8,7 @@ i=$srcdir/4gb-packet.asc
if ! $GPG --list-packets $i >/dev/null
then
- echo Failed to parse 4GB packet.
- exit 1
+ error Failed to parse 4GB packet.
else
- echo Can parse 4GB packets.
- exit 0
+ info Can parse 4GB packets.
fi
diff --git a/tests/openpgp/Makefile.am b/tests/openpgp/Makefile.am
index 914de8c..a04b62c 100644
--- a/tests/openpgp/Makefile.am
+++ b/tests/openpgp/Makefile.am
@@ -46,7 +46,7 @@ TESTS = version.test mds.test \
multisig.test verify.test armor.test \
import.test ecc.test 4gb-packet.test \
$(sqlite3_dependent_tests) \
- gpgtar.test use-exact-key.test \
+ gpgtar.test use-exact-key.test default-key.test \
finish.test
diff --git a/tests/openpgp/default-key.test b/tests/openpgp/default-key.test
new file mode 100755
index 0000000..bfb84ac
--- /dev/null
+++ b/tests/openpgp/default-key.test
@@ -0,0 +1,73 @@
+#!/bin/sh
+
+. $srcdir/defs.inc || exit 3
+
+#set -x
+
+# Make sure $srcdir is set.
+if test "x$srcdir" = x
+then
+ echo srcdir environment variable not set!
+ exit 1
+fi
+
+# Import the sample key
+#
+# pub 1024R/8BC90111 2015-12-02
+# Key fingerprint = E657 FB60 7BB4 F21C 90BB 6651 BC06 7AF2 8BC9 0111
+# uid [ultimate] Barrett Brown <barrett@example.org>
+# sub 1024R/3E880CFF 2015-12-02 (encryption)
+# sub 1024R/F5F77B83 2015-12-02 (signing)
+# sub 1024R/45117079 2015-12-02 (encryption)
+# sub 1024R/1EA97479 2015-12-02 (signing)
+info "Importing public key."
+if $GPG --import $srcdir/samplekeys/E657FB607BB4F21C90BB6651BC067AF28BC90111.asc
+then
+ :
+else
+ error "$k: import failed"
+fi
+
+# By default, the most recent, valid signing subkey (1EA97479).
+for x in 8BC90111 3E880CFF F5F77B83 45117079 1EA97479
+do
+ info
+ info "Trying --default-key $x"
+
+ if ! echo | $GPG --default-key "$x" -s | $GPG --verify --status-fd=1 \
+ | grep -q 'VALIDSIG 5FBA84ACE02DCB17DA3DFF6BBCA43C441EA97479'
+ then
+ echo | $GPG --default-key "$x" -s | $GPG --verify --status-fd=2
+ error "Unexpected key used for signing (not the signing subkey, specified \"$x\")."
+ exit 1
+ fi
+done
+
+# By default, the most recent, valid encryption subkey (45117079).
+for x in 8BC90111 3E880CFF F5F77B83 45117079 1EA97479
+do
+ info
+ info "Trying --default-key $x --encrypt-to-default-key"
+
+ # We need another recipient, because --encrypt-to-default-key is
+ # not considered a recipient and gpg doesn't encrypt without any
+ # recipients.
+ #
+ # Note: it doesn't matter whether we specify the primary key or
+ # a subkey: the newest encryption subkey will be used.
+ if ! echo | $GPG --trust-model=always \
+ --default-key "$x" --encrypt-to-default-key \
+ -r 439F02CA -e \
+ | $GPG --list-packets \
+ | grep -q "keyid[ ][A-F0-9]*45117079"
+ then
+ echo | $GPG --trust-model=always \
+ --default-key "$x" --encrypt-to-default-key \
+ -r 439F02CA -e \
+ | $GPG --list-packets 1>&2
+ error "Unexpected key used for signing (specified \"$x\")."
+ exit 1
+ fi
+done
+
+exit 0
diff --git a/tests/openpgp/gpgtar.test b/tests/openpgp/gpgtar.test
index acfaf3f..e6290b0 100755
--- a/tests/openpgp/gpgtar.test
+++ b/tests/openpgp/gpgtar.test
@@ -24,36 +24,95 @@ TESTFILES="$plain_files $data_files"
TESTDIR=gpgtar.d
FILELIST="${TESTDIR}/filelist"
+PPFILE="${TESTDIR}/passphrase"
+PPFLAGS="--gpg-args --passphrase-file=$PPFILE"
+
GPG=../../g10/gpg2
-GPGARGS="--trust-model=always"
+GPGARGS="$opt_always --no-permission-warning"
GPGTAR="../../tools/gpgtar"
GPGZIP="sh ../../tools/gpg-zip"
-for TOOL in "$GPGTAR" "$GPGZIP"
-do
+# Create, inspect, and extract an archive with the given options.
+#
+# $1 the tool to test
+# $2 options used to create the archive
+# $3 options used to inspect the archive
+# $4 options used to extract the archive
+do_test()
+{
+ (
+ TOOL="$1"
+ CREATE_FLAGS="$2"
+ INSPECT_FLAGS="$3"
+ EXTRACT_FLAGS="$4"
+
rm -rf -- "${TESTDIR}"
mkdir "${TESTDIR}"
+ echo frob >"$PPFILE"
- $TOOL --gpg "$GPG" --gpg-args "$GPGARGS" \
- --encrypt --recipient "$usrname2" \
+ $TOOL --gpg "$GPG" --gpg-args "$GPGARGS" $CREATE_FLAGS \
--output "${TESTDIR}/test.tar.pgp" $TESTFILES
- $TOOL --gpg "$GPG" --gpg-args "$GPGARGS" \
- --list-archive "${TESTDIR}/test.tar.pgp" \
+ $TOOL --gpg "$GPG" --gpg-args "$GPGARGS" $INSPECT_FLAGS \
+ "${TESTDIR}/test.tar.pgp" \
>"$FILELIST"
for F in $TESTFILES
do
grep -qe "\\b${F}\\b" "$FILELIST"
done
- $TOOL --gpg "$GPG" --gpg-args "$GPGARGS" \
+ $TOOL --gpg "$GPG" --gpg-args "$GPGARGS" $EXTRACT_FLAGS \
--tar-args --directory="${TESTDIR}" \
- --decrypt "${TESTDIR}/test.tar.pgp"
+ "${TESTDIR}/test.tar.pgp"
for F in $TESTFILES
do
diff -q "$F" "${TESTDIR}/$F"
done
+ )
+}
+
+for TOOL in "$GPGTAR" "$GPGZIP"
+#for TOOL in "$GPGZIP"
+do
+ # Asymmetric encryption.
+ do_test "$TOOL" \
+ "--encrypt --recipient $usrname2" \
+ "--list-archive" \
+ "--decrypt"
+
+ # Asymmetric encryption and signing.
+ do_test "$TOOL" \
+ "--encrypt --recipient $usrname2 --sign --local-user $usrname3" \
+ "--list-archive" \
+ "--decrypt"
+
+ # Signing only.
+ do_test "$TOOL" \
+ "--sign --local-user $usrname3" \
+ "--list-archive" \
+ "--decrypt"
+
+ # Symmetric encryption.
+ do_test "$TOOL" \
+ "${PPFLAGS} --symmetric" \
+ "${PPFLAGS} --list-archive" \
+ "${PPFLAGS} --decrypt"
+
+ # Symmetric encryption, explicitly choose cipher.
+ for a in `all_cipher_algos`; do
+ do_test "$TOOL" \
+ "${PPFLAGS} --gpg-args --cipher=$a --symmetric" \
+ "${PPFLAGS} --list-archive" \
+ "${PPFLAGS} --decrypt"
+ break
+ done
+
+ # Asymmetric and symmetric encryption, and signing.
+ do_test "$TOOL" \
+ "${PPFLAGS} --encrypt --symmetric --recipient $usrname2 --sign --local-user $usrname3" \
+ "${PPFLAGS} --list-archive" \
+ "${PPFLAGS} --decrypt"
done
# Success!
diff --git a/tools/Makefile.am b/tools/Makefile.am
index a793cca..39c0f9c 100644
--- a/tools/Makefile.am
+++ b/tools/Makefile.am
@@ -51,13 +51,12 @@ else
gpgtar =
endif
-# Fixme: We should remove the gpgkey2ssh tool.
bin_PROGRAMS = gpgconf gpg-connect-agent ${symcryptrun}
if !HAVE_W32_SYSTEM
bin_PROGRAMS += watchgnupg gpgparsemail
endif
if !HAVE_W32CE_SYSTEM
-bin_PROGRAMS += gpgkey2ssh ${gpgtar}
+bin_PROGRAMS += ${gpgtar}
endif
if !DISABLE_REGEX
@@ -119,15 +118,6 @@ gpg_connect_agent_LDADD = ../common/libgpgrl.a $(common_libs) \
$(LIBREADLINE) $(LIBINTL) $(NETLIBS) $(LIBICONV) \
$(resource_objs)
-if !HAVE_W32CE_SYSTEM
-gpgkey2ssh_SOURCES = gpgkey2ssh.c
-gpgkey2ssh_CFLAGS = $(LIBGCRYPT_CFLAGS) $(GPG_ERROR_CFLAGS)
-# common via use of BUG() in an inline function, which
-# some compilers do not eliminate.
-gpgkey2ssh_LDADD = $(common_libs) \
- $(LIBGCRYPT_LIBS) $(GPG_ERROR_LIBS) $(LIBINTL) $(LIBICONV) \
- $(NETLIBS)
-endif
if !DISABLE_REGEX
gpg_check_pattern_SOURCES = gpg-check-pattern.c
@@ -142,9 +132,8 @@ gpgtar_SOURCES = \
gpgtar-extract.c \
gpgtar-list.c \
no-libgcrypt.c
-gpgtar_CFLAGS = $(GPG_ERROR_CFLAGS) $(NPTH_CFLAGS) $(LIBASSUAN_CFLAGS)
-gpgtar_LDADD = $(libcommonpth) $(GPG_ERROR_LIBS) \
- $(NPTH_LIBS) $(LIBASSUAN_LIBS) \
+gpgtar_CFLAGS = $(GPG_ERROR_CFLAGS)
+gpgtar_LDADD = $(libcommon) $(GPG_ERROR_LIBS) \
$(LIBINTL) $(NETLIBS) $(LIBICONV) $(W32SOCKLIBS)
diff --git a/tools/gpgconf-comp.c b/tools/gpgconf-comp.c
index 5e4bd58..45e5c90 100644
--- a/tools/gpgconf-comp.c
+++ b/tools/gpgconf-comp.c
@@ -582,6 +582,10 @@ static gc_option_t gc_options_gpg_agent[] =
GC_LEVEL_EXPERT, "gnupg",
N_("do not allow the reuse of old passphrases"),
GC_ARG_TYPE_NONE, GC_BACKEND_GPG_AGENT },
+ { "pinentry-timeout", GC_OPT_FLAG_RUNTIME,
+ GC_LEVEL_ADVANCED, "gnupg",
+ N_("|N|set the Pinentry timeout to N seconds"),
+ GC_ARG_TYPE_UINT32, GC_BACKEND_GPG_AGENT },
GC_OPTION_NULL
};
diff --git a/tools/gpgkey2ssh.c b/tools/gpgkey2ssh.c
deleted file mode 100644
index f12c5f4..0000000
--- a/tools/gpgkey2ssh.c
+++ /dev/null
@@ -1,337 +0,0 @@
-/* gpgkey2ssh.c - Converter (Debug helper)
- * Copyright (C) 2005 Free Software Foundation, Inc.
- *
- * This file is part of GnuPG.
- *
- * GnuPG is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * GnuPG is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
- * License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, see <http://www.gnu.org/licenses/>.
- */
-
-/*
- FIXME: This tool needs some cleanup:
-
- - Do not use assert() for error output.
- - Add proper option parsing and standard options.
- - retrieve_key_material needs to take the ordinal at field 1 in account.
- 0 Write a man page.
-*/
-
-#include <config.h>
-
-#include <gcrypt.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <assert.h>
-#include <stdio.h>
-#include <errno.h>
-
-#include "util.h"
-#include "sysutils.h"
-
-
-
-typedef struct pkdbuf
-{
- unsigned char *buffer;
- size_t buffer_n;
-} pkdbuf_t;
-
-
-
-/* Retrieve the public key material for the RSA key, whose fingerprint
- is FPR, from gpg output, which can be read through the stream FP.
- The RSA modulus will be stored at the address of M and MLEN, the
- public exponent at E and ELEN. Returns zero on success, an error
- code on failure. Caller must release the allocated buffers at M
- and E if the function returns success. */
-static gpg_error_t
-retrieve_key_material (FILE *fp, const char *hexkeyid, int *algorithm_id,
- pkdbuf_t **pkdbuf, size_t *pkdbuf_n)
-{
- pkdbuf_t *pkdbuf_new;
- pkdbuf_t *pkdbuf_tmp;
- size_t pkdbuf_new_n;
- gcry_error_t err = 0;
- char *line = NULL; /* read_line() buffer. */
- size_t line_size = 0; /* Helper for for read_line. */
- int found_key = 0; /* Helper to find a matching key. */
- int id;
- unsigned char *buffer;
- size_t buffer_n;
- int i;
-
- pkdbuf_new = NULL;
- pkdbuf_new_n = 0;
- id = 0;
-
- /* Loop over all records until we have found the subkey
- corresponding to the fingerprint. In general the first record
- should be the pub record, but we don't rely on that. Given that
- we only need to look at one key, it is sufficient to compare the
- keyid so that we don't need to look at "fpr" records. */
- for (;;)
- {
- char *p;
- char *fields[6];
- int nfields;
- size_t max_length;
- gcry_mpi_t mpi;
-
- max_length = 4096;
- i = read_line (fp, &line, &line_size, &max_length);
- if (!i)
- break; /* EOF. */
- if (i < 0)
- {
- err = gpg_error_from_syserror ();
- goto leave; /* Error. */
- }
- if (!max_length)
- {
- err = gpg_error (GPG_ERR_TRUNCATED);
- goto leave; /* Line truncated - we better stop processing. */
- }
-
- /* Parse the line into fields. */
- for (nfields=0, p=line; p && nfields < DIM (fields); nfields++)
- {
- fields[nfields] = p;
- p = strchr (p, ':');
- if (p)
- *(p++) = 0;
- }
- if (!nfields)
- continue; /* No fields at all - skip line. */
-
- if (!found_key)
- {
- if ( (!strcmp (fields[0], "sub") || !strcmp (fields[0], "pub") )
- && nfields > 4 &&
- (((strlen (hexkeyid) == 8)
- && (strlen (fields[4]) == 16)
- && (! strcmp (fields[4] + 8, hexkeyid)))
- || ((strlen (hexkeyid) == 16)
- && (! strcmp (fields[4], hexkeyid)))))
- {
- found_key = 1;
- /* Save algorithm ID. */
- id = atoi (fields[3]);
- }
- continue;
- }
-
- if ( !strcmp (fields[0], "sub") || !strcmp (fields[0], "pub") )
- break; /* Next key - stop. */
-
- if ( strcmp (fields[0], "pkd") )
- continue; /* Not a key data record. */
-
- /* FIXME, necessary? */
-
- i = atoi (fields[1]);
- if ((nfields < 4) || (i < 0))
- {
- err = gpg_error (GPG_ERR_GENERAL);
- goto leave;
- }
-
- err = gcry_mpi_scan (&mpi, GCRYMPI_FMT_HEX, fields[3], 0, NULL);
- if (err)
- mpi = NULL;
-
- err = gcry_mpi_aprint (GCRYMPI_FMT_STD, &buffer, &buffer_n, mpi);
- gcry_mpi_release (mpi);
- if (err)
- goto leave;
-
- pkdbuf_tmp = xrealloc (pkdbuf_new, sizeof (*pkdbuf_new) * (pkdbuf_new_n + 1));
- if (pkdbuf_new != pkdbuf_tmp)
- pkdbuf_new = pkdbuf_tmp;
- pkdbuf_new[pkdbuf_new_n].buffer = buffer;
- pkdbuf_new[pkdbuf_new_n].buffer_n = buffer_n;
- pkdbuf_new_n++;
- }
-
- *algorithm_id = id;
- *pkdbuf = pkdbuf_new;
- *pkdbuf_n = pkdbuf_new_n;
-
- leave:
-
- if (err)
- if (pkdbuf_new)
- {
- for (i = 0; i < pkdbuf_new_n; i++)
- xfree (pkdbuf_new[i].buffer);
- xfree (pkdbuf_new);
- }
- xfree (line);
-
- return err;
-}
-
-
-
-int
-key_to_blob (unsigned char **blob, size_t *blob_n, const char *identifier, ...)
-{
- unsigned char *blob_new;
- size_t blob_new_n;
- unsigned char uint32_buffer[4];
- u32 identifier_n;
- FILE *stream;
- va_list ap;
- int ret;
- pkdbuf_t *pkd;
-
- stream = gnupg_tmpfile ();
- assert (stream);
-
- identifier_n = strlen (identifier);
- uint32_buffer[0] = identifier_n >> 24;
- uint32_buffer[1] = identifier_n >> 16;
- uint32_buffer[2] = identifier_n >> 8;
- uint32_buffer[3] = identifier_n >> 0;
- ret = fwrite (uint32_buffer, sizeof (uint32_buffer), 1, stream);
- assert (ret == 1);
- ret = fwrite (identifier, identifier_n, 1, stream);
- assert (ret == 1);
-
- va_start (ap, identifier);
- while (1)
- {
- pkd = va_arg (ap, pkdbuf_t *);
- if (! pkd)
- break;
-
- uint32_buffer[0] = pkd->buffer_n >> 24;
- uint32_buffer[1] = pkd->buffer_n >> 16;
- uint32_buffer[2] = pkd->buffer_n >> 8;
- uint32_buffer[3] = pkd->buffer_n >> 0;
- ret = fwrite (uint32_buffer, sizeof (uint32_buffer), 1, stream);
- assert (ret == 1);
- ret = fwrite (pkd->buffer, pkd->buffer_n, 1, stream);
- assert (ret == 1);
- }
-
- va_end (ap);
-
- blob_new_n = ftell (stream);
- rewind (stream);
-
- blob_new = xmalloc (blob_new_n);
- ret = fread (blob_new, blob_new_n, 1, stream);
- assert (ret == 1);
-
- *blob = blob_new;
- *blob_n = blob_new_n;
-
- fclose (stream);
-
- return 0;
-}
-
-int
-main (int argc, char **argv)
-{
- const char *keyid;
- int algorithm_id;
- pkdbuf_t *pkdbuf;
- size_t pkdbuf_n;
- char *command = NULL;
- FILE *fp;
- int ret;
- gcry_error_t err;
- unsigned char *blob;
- size_t blob_n;
- struct b64state b64_state;
- const char *identifier;
-
- pkdbuf = NULL;
- pkdbuf_n = 0;
-
- algorithm_id = 0; /* (avoid cc warning) */
- identifier = NULL; /* (avoid cc warning) */
-
- if (argc != 2)
- {
- fprintf (stderr, "Usage: %s KEYID\n", argv[0]);
- exit (1);
- }
- if (strcmp (argv[1], "--help") == 0)
- {
- fprintf (stderr, "Usage: %s KEYID\n", argv[0]);
- fprintf (stderr, "\n");
- fprintf (stderr,
- "Convert a gpg key to a format appropriate for inclusion in an\n"
- "ssh authorized_keys file.\n");
- exit (0);
- }
-
- keyid = argv[1];
-
- asprintf (&command,
- "gpg2 --list-keys --with-colons --with-key-data '%s'",
- keyid);
- if (! command)
- {
- fprintf (stderr, "Out of memory.\n");
- exit (1);
- }
-
- fp = popen (command, "r");
- if (! fp)
- {
- fprintf (stderr, "Failed to running: '%s'\n", command);
- exit (1);
- }
-
- err = retrieve_key_material (fp, keyid, &algorithm_id, &pkdbuf, &pkdbuf_n);
- if (err)
- {
- fprintf (stderr, "Error looking up key: %s\n", gpg_strerror (err));
- exit (1);
- }
- if (! ((algorithm_id == 1) || (algorithm_id == 17)))
- {
- fprintf (stderr, "Unsupported algorithm: %d\n", algorithm_id);
- exit (1);
- }
-
- if (algorithm_id == 1)
- {
- identifier = "ssh-rsa";
- ret = key_to_blob (&blob, &blob_n, identifier,
- &pkdbuf[1], &pkdbuf[0], NULL);
- }
- else if (algorithm_id == 17)
- {
- identifier = "ssh-dss";
- ret = key_to_blob (&blob, &blob_n, identifier,
- &pkdbuf[0], &pkdbuf[1], &pkdbuf[2], &pkdbuf[3], NULL);
- }
- assert (! ret);
-
- printf ("%s ", identifier);
-
- err = b64enc_start (&b64_state, stdout, "");
- assert (! err);
- err = b64enc_write (&b64_state, blob, blob_n);
- assert (! err);
- err = b64enc_finish (&b64_state);
- assert (! err);
-
- printf (" COMMENT\n");
-
- return 0;
-}
diff --git a/tools/gpgtar-create.c b/tools/gpgtar-create.c
index cc82889..968dca6 100644
--- a/tools/gpgtar-create.c
+++ b/tools/gpgtar-create.c
@@ -36,7 +36,7 @@
#include <assert.h>
#include "i18n.h"
-#include "../common/call-gpg.h"
+#include "../common/exectool.h"
#include "../common/sysutils.h"
#include "gpgtar.h"
@@ -72,13 +72,13 @@ fillup_entry_w32 (tar_header_t hdr)
for (p=hdr->name; *p; p++)
if (*p == '/')
*p = '\\';
- wfname = utf8_to_wchar (hdr->name);
+ wfname = native_to_wchar (hdr->name);
for (p=hdr->name; *p; p++)
if (*p == '\\')
*p = '/';
if (!wfname)
{
- log_error ("error utf8-ing '%s': %s\n", hdr->name, w32_strerror (-1));
+ log_error ("error converting '%s': %s\n", hdr->name, w32_strerror (-1));
return gpg_error_from_syserror ();
}
if (!GetFileAttributesExW (wfname, GetFileExInfoStandard, &fad))
@@ -299,7 +299,7 @@ scan_directory (const char *dname, scanctrl_t scanctrl)
for (p=fname; *p; p++)
if (*p == '/')
*p = '\\';
- wfname = utf8_to_wchar (fname);
+ wfname = native_to_wchar (fname);
xfree (fname);
if (!wfname)
{
@@ -322,11 +322,11 @@ scan_directory (const char *dname, scanctrl_t scanctrl)
do
{
- char *fname = wchar_to_utf8 (fi.cFileName);
+ char *fname = wchar_to_native (fi.cFileName);
if (!fname)
{
err = gpg_error_from_syserror ();
- log_error ("error utf8-ing filename: %s\n", w32_strerror (-1));
+ log_error ("error converting filename: %s\n", w32_strerror (-1));
break;
}
for (p=fname; *p; p++)
@@ -741,7 +741,7 @@ write_eof_mark (estream_t stream)
INPATTERN is NULL take the pattern as null terminated strings from
stdin. */
gpg_error_t
-gpgtar_create (char **inpattern, int encrypt)
+gpgtar_create (char **inpattern, int encrypt, int sign)
{
gpg_error_t err = 0;
struct scanctrl_s scanctrl_buffer;
@@ -865,7 +865,7 @@ gpgtar_create (char **inpattern, int encrypt)
if (outstream == es_stdout)
es_set_binary (es_stdout);
- if (encrypt)
+ if (encrypt || sign)
{
cipher_stream = outstream;
outstream = es_fopenmem (0, "rwb");
@@ -886,18 +886,60 @@ gpgtar_create (char **inpattern, int encrypt)
if (err)
goto leave;
- if (encrypt)
+ if (encrypt || sign)
{
+ int i;
+ strlist_t arg;
+ const char **argv;
+
err = es_fseek (outstream, 0, SEEK_SET);
if (err)
goto leave;
- err = gpg_encrypt_stream (NULL,
- opt.gpg_program,
- opt.gpg_arguments,
- outstream,
- opt.recipients,
- cipher_stream);
+ /* '--encrypt' may be combined with '--symmetric', but 'encrypt'
+ is set either way. Clear it if no recipients are specified.
+ XXX: Fix command handling. */
+ if (opt.symmetric && opt.recipients == NULL)
+ encrypt = 0;
+
+ argv = xtrycalloc (strlist_length (opt.gpg_arguments)
+ + 2 * strlist_length (opt.recipients)
+ + 1 + !!encrypt + !!sign + 2 * !!opt.user
+ + !!opt.symmetric,
+ sizeof *argv);
+ if (argv == NULL)
+ {
+ err = gpg_error_from_syserror ();
+ goto leave;
+ }
+ i = 0;
+ if (encrypt)
+ argv[i++] = "--encrypt";
+ if (sign)
+ argv[i++] = "--sign";
+ if (opt.user)
+ {
+ argv[i++] = "--local-user";
+ argv[i++] = opt.user;
+ }
+ if (opt.symmetric)
+ argv[i++] = "--symmetric";
+ for (arg = opt.recipients; arg; arg = arg->next)
+ {
+ argv[i++] = "--recipient";
+ argv[i++] = arg->d;
+ }
+ for (arg = opt.gpg_arguments; arg; arg = arg->next)
+ argv[i++] = arg->d;
+ argv[i++] = NULL;
+ assert (i == strlist_length (opt.gpg_arguments)
+ + 2 * strlist_length (opt.recipients)
+ + 1 + !!encrypt + !!sign + 2 * !!opt.user
+ + !!opt.symmetric);
+
+ err = gnupg_exec_tool_stream (opt.gpg_program, argv,
+ outstream, cipher_stream);
+ xfree (argv);
if (err)
goto leave;
}
diff --git a/tools/gpgtar-extract.c b/tools/gpgtar-extract.c
index 728737d..95f2b56 100644
--- a/tools/gpgtar-extract.c
+++ b/tools/gpgtar-extract.c
@@ -28,7 +28,7 @@
#include <assert.h>
#include "i18n.h"
-#include "../common/call-gpg.h"
+#include "../common/exectool.h"
#include "../common/sysutils.h"
#include "gpgtar.h"
@@ -299,6 +299,10 @@ gpgtar_extract (const char *filename, int decrypt)
if (decrypt)
{
+ int i;
+ strlist_t arg;
+ const char **argv;
+
cipher_stream = stream;
stream = es_fopenmem (0, "rwb");
if (! stream)
@@ -306,8 +310,24 @@ gpgtar_extract (const char *filename, int decrypt)
err = gpg_error_from_syserror ();
goto leave;
}
- err = gpg_decrypt_stream (NULL, opt.gpg_program, opt.gpg_arguments,
- cipher_stream, stream);
+
+ argv = xtrycalloc (strlist_length (opt.gpg_arguments) + 2,
+ sizeof *argv);
+ if (argv == NULL)
+ {
+ err = gpg_error_from_syserror ();
+ goto leave;
+ }
+ i = 0;
+ argv[i++] = "--decrypt";
+ for (arg = opt.gpg_arguments; arg; arg = arg->next)
+ argv[i++] = arg->d;
+ argv[i++] = NULL;
+ assert (i == strlist_length (opt.gpg_arguments) + 2);
+
+ err = gnupg_exec_tool_stream (opt.gpg_program, argv,
+ cipher_stream, stream);
+ xfree (argv);
if (err)
goto leave;
diff --git a/tools/gpgtar-list.c b/tools/gpgtar-list.c
index cb2ca5d..25c70d2 100644
--- a/tools/gpgtar-list.c
+++ b/tools/gpgtar-list.c
@@ -26,7 +26,7 @@
#include "i18n.h"
#include "gpgtar.h"
-#include "../common/call-gpg.h"
+#include "../common/exectool.h"
@@ -64,7 +64,7 @@ parse_xoctal (const void *data, size_t length, const char *filename)
}
else
{
- log_error ("%s: invalid octal number encountered - assuming 0\n",
+ log_error ("%s: invalid octal number encountered - assuming 0\n",
filename);
value = 0;
break;
@@ -83,7 +83,7 @@ parse_header (const void *record, const char *filename)
tar_header_t header;
int use_prefix;
- use_prefix = (!memcmp (raw->magic, "ustar", 5)
+ use_prefix = (!memcmp (raw->magic, "ustar", 5)
&& (raw->magic[5] == ' ' || !raw->magic[5]));
@@ -135,7 +135,7 @@ parse_header (const void *record, const char *filename)
n = 0;
memcpy (header->name+n, raw->name, namelen);
header->name[n+namelen] = 0;
-
+
header->mode = parse_xoctal (raw->mode, sizeof raw->mode, filename);
header->uid = parse_xoctal (raw->uid, sizeof raw->uid, filename);
header->gid = parse_xoctal (raw->gid, sizeof raw->gid, filename);
@@ -161,7 +161,7 @@ parse_header (const void *record, const char *filename)
header->nrecords = (header->size + RECORDSIZE-1)/RECORDSIZE;
else
header->nrecords = 0;
-
+
return header;
}
@@ -299,6 +299,10 @@ gpgtar_list (const char *filename, int decrypt)
if (decrypt)
{
+ int i;
+ strlist_t arg;
+ const char **argv;
+
cipher_stream = stream;
stream = es_fopenmem (0, "rwb");
if (! stream)
@@ -306,8 +310,24 @@ gpgtar_list (const char *filename, int decrypt)
err = gpg_error_from_syserror ();
goto leave;
}
- err = gpg_decrypt_stream (NULL, opt.gpg_program, opt.gpg_arguments,
- cipher_stream, stream);
+
+ argv = xtrycalloc (strlist_length (opt.gpg_arguments) + 2,
+ sizeof *argv);
+ if (argv == NULL)
+ {
+ err = gpg_error_from_syserror ();
+ goto leave;
+ }
+ i = 0;
+ argv[i++] = "--decrypt";
+ for (arg = opt.gpg_arguments; arg; arg = arg->next)
+ argv[i++] = arg->d;
+ argv[i++] = NULL;
+ assert (i == strlist_length (opt.gpg_arguments) + 2);
+
+ err = gnupg_exec_tool_stream (opt.gpg_program, argv,
+ cipher_stream, stream);
+ xfree (argv);
if (err)
goto leave;
diff --git a/tools/gpgtar.c b/tools/gpgtar.c
index a09d2f0..46d06bd 100644
--- a/tools/gpgtar.c
+++ b/tools/gpgtar.c
@@ -27,7 +27,6 @@
gpg. So here we go. */
#include <config.h>
-#include <assuan.h>
#include <ctype.h>
#include <errno.h>
#include <npth.h>
@@ -39,7 +38,6 @@
#include "util.h"
#include "i18n.h"
#include "sysutils.h"
-#include "../common/asshelp.h"
#include "../common/openpgpdefs.h"
#include "../common/init.h"
#include "../common/strlist.h"
@@ -282,11 +280,6 @@ shell_parse_argv (const char *s, int *r_argc, char ***r_argv)
return 0;
}
-/* Define Assuan hooks for NPTH. */
-
-ASSUAN_SYSTEM_NPTH_IMPL;
-
-
/* Global flags. */
enum cmd_and_opt_values cmd = 0;
int skip_crypto = 0;
@@ -325,12 +318,10 @@ parse_arguments (ARGPARSE_ARGS *pargs, ARGPARSE_OPTS *popts)
break;
case oUser:
- log_info ("note: ignoring option --user\n");
opt.user = pargs->r.ret_str;
break;
case oSymmetric:
- log_info ("note: ignoring option --symmetric\n");
set_cmd (&cmd, aEncrypt);
opt.symmetric = 1;
break;
@@ -412,11 +403,6 @@ main (int argc, char **argv)
/* Make sure that our subsystems are ready. */
i18n_init();
init_common_subsystems (&argc, &argv);
- npth_init ();
- assuan_set_assuan_log_prefix (log_get_prefix (NULL));
- assuan_set_gpg_err_source (GPG_ERR_SOURCE_DEFAULT);
- assuan_set_system_hooks (ASSUAN_SYSTEM_NPTH);
- assuan_sock_init ();
/* Parse the command line. */
pargs.argc = &argc;
@@ -442,9 +428,11 @@ main (int argc, char **argv)
log_info (_("NOTE: '%s' is not considered an option\n"), argv[i]);
}
+ if (! opt.gpg_program)
+ opt.gpg_program = gnupg_module_name (GNUPG_MODULE_NAME_GPG);
+
if (opt.verbose > 1)
opt.debug_level = 1024;
- setup_libassuan_logging (&opt.debug_level);
switch (cmd)
{
@@ -462,12 +450,17 @@ main (int argc, char **argv)
break;
case aEncrypt:
+ case aSign:
+ case aSignEncrypt:
if ((!argc && !null_names)
|| (argc && null_names))
usage (1);
if (opt.filename)
log_info ("note: ignoring option --set-filename\n");
- err = gpgtar_create (null_names? NULL :argv, !skip_crypto);
+ err = gpgtar_create (null_names? NULL :argv,
+ !skip_crypto
+ && (cmd == aEncrypt || cmd == aSignEncrypt),
+ cmd == aSign || cmd == aSignEncrypt);
if (err && log_get_errorcount (0) == 0)
log_error ("creating archive failed: %s\n", gpg_strerror (err));
break;
diff --git a/tools/gpgtar.h b/tools/gpgtar.h
index eadbcac..3f21ea1 100644
--- a/tools/gpgtar.h
+++ b/tools/gpgtar.h
@@ -119,7 +119,7 @@ gpg_error_t read_record (estream_t stream, void *record);
gpg_error_t write_record (estream_t stream, const void *record);
/*-- gpgtar-create.c --*/
-gpg_error_t gpgtar_create (char **inpattern, int encrypt);
+gpg_error_t gpgtar_create (char **inpattern, int encrypt, int sign);
/*-- gpgtar-extract.c --*/
gpg_error_t gpgtar_extract (const char *filename, int decrypt);